diff --git a/cp/app/Controllers/DomainsController.php b/cp/app/Controllers/DomainsController.php index 2a50096..fb79413 100644 --- a/cp/app/Controllers/DomainsController.php +++ b/cp/app/Controllers/DomainsController.php @@ -22,6 +22,13 @@ class DomainsController extends Controller $domainName = $data['domain_name'] ?? null; if ($domainName) { + $domainParts = explode('.', $domainName); + + if (count($domainParts) > 2) { + // Remove the leftmost part (subdomain) + array_shift($domainParts); + } + $domainModel = new Domain($this->container->get('db')); $availability = $domainModel->getDomainByName($domainName); @@ -35,11 +42,19 @@ class DomainsController extends Controller $status = $invalid_label; $isAvailable = 0; } else { - $isAvailable = $availability; - $status = null; + // If the domain is not taken, check if it's reserved + if ($availability === '1') { + $domain_already_reserved = $this->container->get('db')->selectRow('SELECT id,type FROM reserved_domain_names WHERE name = ? LIMIT 1',[$domainParts[0]]); - // Check if the domain is unavailable - if ($availability === '0') { + if ($domain_already_reserved) { + $isAvailable = 0; + $status = ucfirst($domain_already_reserved['type']); + } else { + $isAvailable = $availability; + $status = $availability === '0' ? 'In use' : null; + } + } else { + $isAvailable = $availability; $status = 'In use'; } } diff --git a/das/start_das.php b/das/start_das.php index 2230d09..9042ecb 100644 --- a/das/start_das.php +++ b/das/start_das.php @@ -74,6 +74,17 @@ $server->on('receive', function ($server, $fd, $reactorId, $data) use ($c, $pdo) $server->close($fd); return; } + + // Check if domain is reserved + $stmtReserved = $pdo->prepare("SELECT id FROM reserved_domain_names WHERE name = ? LIMIT 1"); + $stmtReserved->execute([$parts[0]]); + $domain_already_reserved = $stmtReserved->fetchColumn(); + + if ($domain_already_reserved) { + $server->send($fd, "Domain name is reserved or restricted"); + $server->close($fd); + return; + } // Fetch the IDN regex for the given TLD $stmtRegex = $pdo->prepare("SELECT idn_table FROM domain_tld WHERE tld = :tld"); diff --git a/epp/src/epp-check.php b/epp/src/epp-check.php index 9fef6d2..33ba29a 100644 --- a/epp/src/epp-check.php +++ b/epp/src/epp-check.php @@ -34,7 +34,7 @@ function processContactCheck($conn, $db, $xml, $trans) { $ids[] = $entry; } - + $svTRID = generateSvTRID(); $response = [ 'command' => 'check_contact', @@ -64,10 +64,10 @@ function processHostCheck($conn, $db, $xml, $trans) { $host = (string)$host; // Validation for host name - if (!preg_match('/^([A-Z0-9]([A-Z0-9-]{0,61}[A-Z0-9]){0,1}\\.){1,125}[A-Z0-9]([A-Z0-9-]{0,61}[A-Z0-9])$/i', $host) && strlen($host) > 254) { + if (!preg_match('/^([A-Z0-9]([A-Z0-9-]{0,61}[A-Z0-9]){0,1}\\.){1,125}[A-Z0-9]([A-Z0-9-]{0,61}[A-Z0-9])$/i', $host) && strlen($host) > 254) { sendEppError($conn, $db, 2005, 'Invalid host name', $clTRID, $trans); return; - } + } $stmt = $db->prepare("SELECT 1 FROM host WHERE name = :name"); $stmt->execute(['name' => $host]); @@ -112,29 +112,41 @@ function processDomainCheck($conn, $db, $xml, $trans) { $names = []; foreach ($domains as $domain) { $domainName = (string) $domain; + + // Check if the domain is already taken $stmt = $db->prepare("SELECT name FROM domain WHERE name = :domainName"); $stmt->bindParam(':domainName', $domainName, PDO::PARAM_STR); $stmt->execute(); - $availability = $stmt->fetchColumn(); - - // Convert the DB result into a boolean '0' or '1' - $availability = $availability ? '0' : '1'; - - $invalid_label = validate_label($domainName, $db); - - // Initialize a new domain entry with the domain name and its availability + $taken = $stmt->fetchColumn(); + $availability = $taken ? '0' : '1'; + + // Initialize a new domain entry with the domain name $domainEntry = [$domainName]; - // Check if the domain is Invalid - if ($invalid_label) { - $domainEntry[] = 0; // Set status to unavailable - $domainEntry[] = $invalid_label; + if ($availability === '0') { + // Domain is taken + $domainEntry[] = 0; // Set status to unavailable + $domainEntry[] = 'In use'; } else { - $domainEntry[] = $availability; + // Check if the domain is reserved + $stmt = $db->prepare("SELECT type FROM reserved_domain_names WHERE name = :domainName LIMIT 1"); + $stmt->bindParam(':domainName', $domainName, PDO::PARAM_STR); + $stmt->execute(); + $reserved = $stmt->fetchColumn(); - // Check if the domain is unavailable - if ($availability === '0') { - $domainEntry[] = 'In use'; + if ($reserved) { + $domainEntry[] = 0; // Set status to unavailable + $domainEntry[] = ucfirst($reserved); // Capitalize the first letter + } else { + $invalid_label = validate_label($domainName, $db); + + // Check if the domain is Invalid + if ($invalid_label) { + $domainEntry[] = 0; // Set status to unavailable + $domainEntry[] = ucfirst($invalid_label); // Capitalize the first letter + } else { + $domainEntry[] = 1; // Domain is available + } } } diff --git a/rdap/start_rdap.php b/rdap/start_rdap.php index 3bd5a68..a0afad3 100644 --- a/rdap/start_rdap.php +++ b/rdap/start_rdap.php @@ -175,6 +175,18 @@ function handleDomainQuery($request, $response, $pdo, $domainName, $c) { return; } + // Check if domain is reserved + $stmtReserved = $pdo->prepare("SELECT id FROM reserved_domain_names WHERE name = ? LIMIT 1"); + $stmtReserved->execute([$parts[0]]); + $domain_already_reserved = $stmtReserved->fetchColumn(); + + if ($domain_already_reserved) { + $response->header('Content-Type', 'application/json'); + $response->status(400); // Bad Request + $response->end(json_encode(['error' => 'Domain name is reserved or restricted'])); + return; + } + // Fetch the IDN regex for the given TLD $stmtRegex = $pdo->prepare("SELECT idn_table FROM domain_tld WHERE tld = :tld"); $stmtRegex->bindParam(':tld', $tld, PDO::PARAM_STR); diff --git a/whois/port43/start_whois.php b/whois/port43/start_whois.php index 9e22ca4..7adfff8 100644 --- a/whois/port43/start_whois.php +++ b/whois/port43/start_whois.php @@ -307,6 +307,17 @@ $server->on('receive', function ($server, $fd, $reactorId, $data) use ($c, $pdo) $server->close($fd); return; } + + // Check if domain is reserved + $stmtReserved = $pdo->prepare("SELECT id FROM reserved_domain_names WHERE name = ? LIMIT 1"); + $stmtReserved->execute([$parts[0]]); + $domain_already_reserved = $stmtReserved->fetchColumn(); + + if ($domain_already_reserved) { + $server->send($fd, "Domain name is reserved or restricted"); + $server->close($fd); + return; + } // Fetch the IDN regex for the given TLD $stmtRegex = $pdo->prepare("SELECT idn_table FROM domain_tld WHERE tld = :tld");