Added domain check page

This commit is contained in:
Pinga 2023-08-31 13:16:54 +03:00
parent 512de0552a
commit 6855dbaccd
9 changed files with 248 additions and 22 deletions

View file

@ -2,7 +2,7 @@
namespace App\Controllers; namespace App\Controllers;
use App\Models\User; use App\Models\Domain;
use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Container\ContainerInterface; use Psr\Container\ContainerInterface;
@ -11,9 +11,48 @@ class DomainsController extends Controller
{ {
public function view(Request $request, Response $response) public function view(Request $request, Response $response)
{ {
$userModel = new User($this->container->get('db')); return view($response,'admin/domains/view.twig');
$users = $userModel->getAllUsers(); }
return view($response,'admin/domains/index.twig', compact('users'));
public function check(Request $request, Response $response)
{
if ($request->getMethod() === 'POST') {
// Retrieve POST data
$data = $request->getParsedBody();
$domainName = $data['domain_name'] ?? null;
if ($domainName) {
$domainModel = new Domain($this->container->get('db'));
$availability = $domainModel->getDomainByName($domainName);
// Convert the DB result into a boolean '0' or '1'
$availability = $availability ? '0' : '1';
$invalid_label = validate_label($domainName, $this->container->get('db'));
// Check if the domain is Invalid
if ($invalid_label) {
$status = $invalid_label;
$isAvailable = 0;
} else {
$isAvailable = $availability;
$status = null;
// Check if the domain is unavailable
if ($availability === '0') {
$status = 'In use';
}
}
return view($response, 'admin/domains/check.twig', [
'isAvailable' => $isAvailable,
'domainName' => $domainName,
'status' => $status,
]);
}
}
// Default view for GET requests or if POST data is not set
return view($response,'admin/domains/check.twig');
} }
} }

View file

@ -23,22 +23,17 @@ class Domain
return $this->db->select('SELECT * FROM domain WHERE id = ?', [$id])->fetch(); return $this->db->select('SELECT * FROM domain WHERE id = ?', [$id])->fetch();
} }
public function createDomain($id, $name, $tldid, $registrant, $crdate, $exdate, $update, $clid, $crid, $upid, $trdate, $trstatus, $reid, $redate, $acid, $acdate, $transfer_exdate, $idnlang, $delTime, $resTime, $rgpstatus, $rgppostData, $rgpdelTime, $rgpresTime, $rgpresReason, $rgpstatement1, $rgpstatement2, $rgpother, $addPeriod, $autoRenewPeriod, $renewPeriod, $transferPeriod, $renewedDate) public function getDomainByName($name)
{ {
$id = $this->db->quote($id), $name = $this->db->quote($name), $tldid = $this->db->quote($tldid), $registrant = $this->db->quote($registrant), $crdate = $this->db->quote($crdate), $exdate = $this->db->quote($exdate), $update = $this->db->quote($update), $clid = $this->db->quote($clid), $crid = $this->db->quote($crid), $upid = $this->db->quote($upid), $trdate = $this->db->quote($trdate), $trstatus = $this->db->quote($trstatus), $reid = $this->db->quote($reid), $redate = $this->db->quote($redate), $acid = $this->db->quote($acid), $acdate = $this->db->quote($acdate), $transfer_exdate = $this->db->quote($transfer_exdate), $idnlang = $this->db->quote($idnlang), $delTime = $this->db->quote($delTime), $resTime = $this->db->quote($resTime), $rgpstatus = $this->db->quote($rgpstatus), $rgppostData = $this->db->quote($rgppostData), $rgpdelTime = $this->db->quote($rgpdelTime), $rgpresTime = $this->db->quote($rgpresTime), $rgpresReason = $this->db->quote($rgpresReason), $rgpstatement1 = $this->db->quote($rgpstatement1), $rgpstatement2 = $this->db->quote($rgpstatement2), $rgpother = $this->db->quote($rgpother), $addPeriod = $this->db->quote($addPeriod), $autoRenewPeriod = $this->db->quote($autoRenewPeriod), $renewPeriod = $this->db->quote($renewPeriod), $transferPeriod = $this->db->quote($transferPeriod), $renewedDate = $this->db->quote($renewedDate) $result = $this->db->select('SELECT name FROM domain WHERE name = ?', [$name]);
$this->db->insert('INSERT INTO domain (id, name, tldid, registrant, crdate, exdate, update, clid, crid, upid, trdate, trstatus, reid, redate, acid, acdate, transfer_exdate, idnlang, delTime, resTime, rgpstatus, rgppostData, rgpdelTime, rgpresTime, rgpresReason, rgpstatement1, rgpstatement2, rgpother, addPeriod, autoRenewPeriod, renewPeriod, transferPeriod, renewedDate) VALUES ($id, $name, $tldid, $registrant, $crdate, $exdate, $update, $clid, $crid, $upid, $trdate, $trstatus, $reid, $redate, $acid, $acdate, $transfer_exdate, $idnlang, $delTime, $resTime, $rgpstatus, $rgppostData, $rgpdelTime, $rgpresTime, $rgpresReason, $rgpstatement1, $rgpstatement2, $rgpother, $addPeriod, $autoRenewPeriod, $renewPeriod, $transferPeriod, $renewedDate)');
return $this->db->lastInsertId(); if (is_array($result)) {
} return $result;
} else if (is_object($result) && method_exists($result, 'fetch')) {
return $result->fetch();
}
public function updateDomain($id, $id, $name, $tldid, $registrant, $crdate, $exdate, $update, $clid, $crid, $upid, $trdate, $trstatus, $reid, $redate, $acid, $acdate, $transfer_exdate, $idnlang, $delTime, $resTime, $rgpstatus, $rgppostData, $rgpdelTime, $rgpresTime, $rgpresReason, $rgpstatement1, $rgpstatement2, $rgpother, $addPeriod, $autoRenewPeriod, $renewPeriod, $transferPeriod, $renewedDate) return null;
{
$id = $this->db->quote($id), $name = $this->db->quote($name), $tldid = $this->db->quote($tldid), $registrant = $this->db->quote($registrant), $crdate = $this->db->quote($crdate), $exdate = $this->db->quote($exdate), $update = $this->db->quote($update), $clid = $this->db->quote($clid), $crid = $this->db->quote($crid), $upid = $this->db->quote($upid), $trdate = $this->db->quote($trdate), $trstatus = $this->db->quote($trstatus), $reid = $this->db->quote($reid), $redate = $this->db->quote($redate), $acid = $this->db->quote($acid), $acdate = $this->db->quote($acdate), $transfer_exdate = $this->db->quote($transfer_exdate), $idnlang = $this->db->quote($idnlang), $delTime = $this->db->quote($delTime), $resTime = $this->db->quote($resTime), $rgpstatus = $this->db->quote($rgpstatus), $rgppostData = $this->db->quote($rgppostData), $rgpdelTime = $this->db->quote($rgpdelTime), $rgpresTime = $this->db->quote($rgpresTime), $rgpresReason = $this->db->quote($rgpresReason), $rgpstatement1 = $this->db->quote($rgpstatement1), $rgpstatement2 = $this->db->quote($rgpstatement2), $rgpother = $this->db->quote($rgpother), $addPeriod = $this->db->quote($addPeriod), $autoRenewPeriod = $this->db->quote($autoRenewPeriod), $renewPeriod = $this->db->quote($renewPeriod), $transferPeriod = $this->db->quote($transferPeriod), $renewedDate = $this->db->quote($renewedDate)
$this->db->update('UPDATE domain SET id = $id, name = $name, tldid = $tldid, registrant = $registrant, crdate = $crdate, exdate = $exdate, update = $update, clid = $clid, crid = $crid, upid = $upid, trdate = $trdate, trstatus = $trstatus, reid = $reid, redate = $redate, acid = $acid, acdate = $acdate, transfer_exdate = $transfer_exdate, idnlang = $idnlang, delTime = $delTime, resTime = $resTime, rgpstatus = $rgpstatus, rgppostData = $rgppostData, rgpdelTime = $rgpdelTime, rgpresTime = $rgpresTime, rgpresReason = $rgpresReason, rgpstatement1 = $rgpstatement1, rgpstatement2 = $rgpstatement2, rgpother = $rgpother, addPeriod = $addPeriod, autoRenewPeriod = $autoRenewPeriod, renewPeriod = $renewPeriod, transferPeriod = $transferPeriod, renewedDate = $renewedDate WHERE id = ?', [$id]);
return true;
} }
public function deleteDomain($id) public function deleteDomain($id)

View file

@ -167,3 +167,101 @@ function assets($location){
function toArray($data){ function toArray($data){
return json_decode(json_encode($data), true); return json_decode(json_encode($data), true);
} }
function validate_identifier($identifier) {
if (!$identifier) {
return 'Please provide a contact ID';
}
$length = strlen($identifier);
if ($length < 3) {
return 'Identifier type minLength value=3, maxLength value=16';
}
if ($length > 16) {
return 'Identifier type minLength value=3, maxLength value=16';
}
$pattern1 = '/^[A-Z]+\-[0-9]+$/';
$pattern2 = '/^[A-Za-z][A-Z0-9a-z]*$/';
if (!preg_match($pattern1, $identifier) && !preg_match($pattern2, $identifier)) {
return 'The ID of the contact must contain letters (A-Z) (ASCII), hyphen (-), and digits (0-9).';
}
}
function validate_label($label, $db) {
if (!$label) {
return 'You must enter a domain name';
}
if (strlen($label) > 63) {
return 'Total lenght of your domain must be less then 63 characters';
}
if (strlen($label) < 2) {
return 'Total lenght of your domain must be greater then 2 characters';
}
if (strpos($label, 'xn--') === false && preg_match("/(^-|^\.|-\.|\.-|--|\.\.|-$|\.$)/", $label)) {
return 'Invalid domain name format, cannot begin or end with a hyphen (-)';
}
// Extract TLD from the domain and prepend a dot
$parts = explode('.', $label);
$tld = "." . end($parts);
// Check if the TLD exists in the domain_tld table
$tldExists = $db->select('SELECT COUNT(*) FROM domain_tld WHERE tld = ?', [$tld]);
if ($tldExists[0]["COUNT(*)"] == 0) {
return 'Zone is not supported';
}
// Fetch the IDN regex for the given TLD
$idnRegex = $db->selectRow('SELECT idn_table FROM domain_tld WHERE tld = ?', [$tld]);
if (!$idnRegex) {
return 'Failed to fetch domain IDN table';
}
// Check for invalid characters using fetched regex
if (!preg_match($idnRegex['idn_table'], $label)) {
return 'Invalid domain name format, please review registry policy about accepted labels';
}
}
function normalize_v4_address($v4) {
// Remove leading zeros from the first octet
$v4 = preg_replace('/^0+(\d)/', '$1', $v4);
// Remove leading zeros from successive octets
$v4 = preg_replace('/\.0+(\d)/', '.$1', $v4);
return $v4;
}
function normalize_v6_address($v6) {
// Upper case any alphabetics
$v6 = strtoupper($v6);
// Remove leading zeros from the first word
$v6 = preg_replace('/^0+([\dA-F])/', '$1', $v6);
// Remove leading zeros from successive words
$v6 = preg_replace('/:0+([\dA-F])/', ':$1', $v6);
// Introduce a :: if there isn't one already
if (strpos($v6, '::') === false) {
$v6 = preg_replace('/:0:0:/', '::', $v6);
}
// Remove initial zero word before a ::
$v6 = preg_replace('/^0+::/', '::', $v6);
// Remove other zero words before a ::
$v6 = preg_replace('/(:0)+::/', '::', $v6);
// Remove zero words following a ::
$v6 = preg_replace('/:(:0)+/', ':', $v6);
return $v6;
}

View file

@ -22,6 +22,18 @@ msgstr "List Domains"
msgid "Check Domain" msgid "Check Domain"
msgstr "Check Domain" msgstr "Check Domain"
msgid "Enter the domain name you want to check:"
msgstr "Enter the domain name you want to check:"
msgid "Check Availability"
msgstr "Check Availability"
msgid "is available"
msgstr "is available"
msgid "is not available"
msgstr "is not available"
msgid "Create Domain" msgid "Create Domain"
msgstr "Create Domain" msgstr "Create Domain"

View file

@ -22,6 +22,18 @@ msgstr "Список доменів"
msgid "Check Domain" msgid "Check Domain"
msgstr "Перевірте домен" msgstr "Перевірте домен"
msgid "Enter the domain name you want to check:"
msgstr "Введіть доменне ім’я, яке потрібно перевірити:"
msgid "Check Availability"
msgstr "Перевірте наявність"
msgid "is available"
msgstr "доступний"
msgid "is not available"
msgstr "недоступний"
msgid "Create Domain" msgid "Create Domain"
msgstr "Створити домен" msgstr "Створити домен"

View file

@ -0,0 +1,67 @@
{% extends "layouts/app.twig" %}
{% block title %}{{ __('Check Domain') }}{% endblock %}
{% block content %}
<div class="page-wrapper">
<!-- Page header -->
<div class="page-header d-print-none">
<div class="container-xl">
<div class="row g-2 align-items-center">
<div class="col">
<!-- Page pre-title -->
<div class="page-pretitle">
Overview
</div>
<h2 class="page-title">
{{ __('Check Domain') }}
</h2>
</div>
</div>
</div>
</div>
<!-- Page body -->
<div class="page-body">
<div class="container-xl">
<div class="col-12">
<div class="card">
<div class="card-body border-bottom py-3">
<p class="mb-4">{{ __('Enter the domain name you want to check:') }}</p>
<form action="/domain/check" method="POST">
{{ csrf.field | raw }}
<div class="input-group mb-3">
<input type="text" class="form-control" placeholder="yourdomain.com" name="domain_name" required="required">
<button type="submit" class="btn btn-primary">{{ __('Check Availability') }}</button>
</div>
</form>
{% if isAvailable is defined and domainName is defined %}
{% if isAvailable %}
<div class="alert alert-success" role="alert">
{{ domainName }} {{ __('is available') }}!
</div>
{% else %}
<div class="alert alert-danger" role="alert">
{{ domainName }} {{ __('is not available') }}: {{ status }}
</div>
{% endif %}
{% endif %}
</div>
</div>
</div>
</div>
</div>
<footer class="footer footer-transparent d-print-none">
<div class="container-xl">
<div class="col-12 col-lg-auto mt-3 mt-lg-0">
<ul class="list-inline list-inline-dots mb-0">
<li class="list-inline-item">
Copyright &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div>
{% endblock %}

View file

@ -59,9 +59,9 @@
</div> </div>
</div> </div>
</div> </div>
</div> <div class="table-responsive mt-3">
<div class="table-responsive"> <div id="domainTable"></div>
<div id="domainTable"></div> </div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -179,7 +179,7 @@
<a class="dropdown-item" href="{{route('domains')}}"> <a class="dropdown-item" href="{{route('domains')}}">
{{ __('List Domains') }} {{ __('List Domains') }}
</a> </a>
<a class="dropdown-item" href="#"> <a class="dropdown-item" href="{{route('domaincheck')}}">
{{ __('Check Domain') }} {{ __('Check Domain') }}
</a> </a>
<a class="dropdown-item" href="#"> <a class="dropdown-item" href="#">

View file

@ -38,7 +38,10 @@ $app->group('', function ($route) {
$app->group('', function ($route) { $app->group('', function ($route) {
$route->get('/dashboard', HomeController::class .':dashboard')->setName('home'); $route->get('/dashboard', HomeController::class .':dashboard')->setName('home');
$route->get('/domains', DomainsController::class .':view')->setName('domains'); $route->get('/domains', DomainsController::class .':view')->setName('domains');
$route->map(['GET', 'POST'], '/domain/check', DomainsController::class . ':check')->setName('domaincheck');
$route->get('/contacts', ContactsController::class .':view')->setName('contacts'); $route->get('/contacts', ContactsController::class .':view')->setName('contacts');
$route->get('/hosts', HostsController::class .':view')->setName('hosts'); $route->get('/hosts', HostsController::class .':view')->setName('hosts');
$route->get('/registrars', RegistrarsController::class .':view')->setName('registrars'); $route->get('/registrars', RegistrarsController::class .':view')->setName('registrars');