diff --git a/cp/bootstrap/helper.php b/cp/bootstrap/helper.php index e433d04..62dcd6e 100644 --- a/cp/bootstrap/helper.php +++ b/cp/bootstrap/helper.php @@ -225,6 +225,9 @@ function validate_label($domain, $db) { if (strpos($domain, '.') === false) { return 'Invalid domain name format: must contain at least one dot (.)'; } + if ($domain[0] === '.' || substr($domain, -1) === '.') { + return 'Invalid domain name format: cannot start or end with a dot (.)'; + } // Split domain into labels (subdomains, SLD, TLD) $labels = explode('.', $domain); diff --git a/epp/src/EppWriter.php b/epp/src/EppWriter.php index 96debd0..ad09c13 100644 --- a/epp/src/EppWriter.php +++ b/epp/src/EppWriter.php @@ -590,7 +590,10 @@ class EppWriter { $writer->writeAttribute('flag', $resp['disclose']['flag']); // 1 = disclose, 0 = restrict foreach ($resp['disclose']['fields'] as $field) { - $writer->startElement('contact:' . $field); + $writer->startElement('contact:' . $field['name']); + if (isset($field['type'])) { + $writer->writeAttribute('type', $field['type']); + } $writer->endElement(); } @@ -910,11 +913,6 @@ class EppWriter { $crDateFormatted = $crDate->format('Y-m-d\TH:i:s.v\Z'); $writer->writeElement('domain:crDate', $crDateFormatted); } - if (isset($resp['exDate'])) { - $exDate = new \DateTime($resp['exDate']); - $exDateFormatted = $exDate->format('Y-m-d\TH:i:s.v\Z'); - $writer->writeElement('domain:exDate', $exDateFormatted); - } if (isset($resp['upID'])) { $writer->writeElement('domain:upID', $resp['upID']); } @@ -923,6 +921,11 @@ class EppWriter { $upDateFormatted = $upDate->format('Y-m-d\TH:i:s.v\Z'); $writer->writeElement('domain:upDate', $upDateFormatted); } + if (isset($resp['exDate'])) { + $exDate = new \DateTime($resp['exDate']); + $exDateFormatted = $exDate->format('Y-m-d\TH:i:s.v\Z'); + $writer->writeElement('domain:exDate', $exDateFormatted); + } if (isset($resp['trDate'])) { $trDate = new \DateTime($resp['trDate']); $trDateFormatted = $trDate->format('Y-m-d\TH:i:s.v\Z'); diff --git a/epp/src/epp-check.php b/epp/src/epp-check.php index 3ecd86e..96d0395 100644 --- a/epp/src/epp-check.php +++ b/epp/src/epp-check.php @@ -10,38 +10,33 @@ function processContactCheck($conn, $db, $xml, $trans) { return; } - $results = []; + $ids = []; + foreach ($contactIDs as $contactID) { $contactID = (string)$contactID; + $entry = [$contactID]; - $stmt = $db->prepare("SELECT 1 FROM contact WHERE identifier = :id"); - $stmt->execute(['id' => $contactID]); - - $results[$contactID] = $stmt->fetch() ? '0' : '1'; // 0 if exists, 1 if not - $stmt->closeCursor(); - } - - $ids = []; - foreach ($results as $id => $available) { $invalid_identifier = validate_identifier($contactID); - $entry = [$id]; - // Check if the contact ID is Invalid if ($invalid_identifier) { - $entry[] = 0; // Set status to unavailable + $entry[] = 0; $entry[] = $invalid_identifier; } else { + $stmt = $db->prepare("SELECT 1 FROM contact WHERE identifier = :id"); + $stmt->execute(['id' => $contactID]); + $available = $stmt->fetch() ? '0' : '1'; + $stmt->closeCursor(); + $entry[] = $available; - // Check if the contact is unavailable if (!$available) { $entry[] = "In use"; } } - + $ids[] = $entry; } - + $svTRID = generateSvTRID(); $response = [ 'command' => 'check_contact', @@ -55,9 +50,11 @@ function processContactCheck($conn, $db, $xml, $trans) { $epp = new EPP\EppWriter(); $xml = $epp->epp_writer($response); + if (is_array($ids)) { $ids = implode(',', array_column($ids, 0)); } + updateTransaction($db, 'check', 'contact', $ids, 1000, 'Command completed successfully', $svTRID, $xml, $trans); sendEppResponse($conn, $xml); } diff --git a/epp/src/epp-info.php b/epp/src/epp-info.php index d4beb1f..343287d 100644 --- a/epp/src/epp-info.php +++ b/epp/src/epp-info.php @@ -72,18 +72,35 @@ function processContactInfo($conn, $db, $xml, $clid, $trans) { $statusArray = array_map(fn($status) => [$status], $statuses); // Handle Disclose Fields (Only Show When Set to `1`) - $disclose_fields = [ - 'voice' => $contactRow['disclose_voice'], - 'fax' => $contactRow['disclose_fax'], - 'email' => $contactRow['disclose_email'], - 'name_int' => $contactRow['disclose_name_int'], - 'name_loc' => $contactRow['disclose_name_loc'], - 'org_int' => $contactRow['disclose_org_int'], - 'org_loc' => $contactRow['disclose_org_loc'], - 'addr_int' => $contactRow['disclose_addr_int'], - 'addr_loc' => $contactRow['disclose_addr_loc'] - ]; - $disclose_required = array_filter($disclose_fields, fn($value) => $value === '1'); + $disclose_fields = []; + + if ($contactRow['disclose_voice'] === '1') { + $disclose_fields[] = ['name' => 'voice']; + } + if ($contactRow['disclose_fax'] === '1') { + $disclose_fields[] = ['name' => 'fax']; + } + if ($contactRow['disclose_email'] === '1') { + $disclose_fields[] = ['name' => 'email']; + } + if ($contactRow['disclose_name_int'] === '1') { + $disclose_fields[] = ['name' => 'name', 'type' => 'int']; + } + if ($contactRow['disclose_name_loc'] === '1') { + $disclose_fields[] = ['name' => 'name', 'type' => 'loc']; + } + if ($contactRow['disclose_org_int'] === '1') { + $disclose_fields[] = ['name' => 'org', 'type' => 'int']; + } + if ($contactRow['disclose_org_loc'] === '1') { + $disclose_fields[] = ['name' => 'org', 'type' => 'loc']; + } + if ($contactRow['disclose_addr_int'] === '1') { + $disclose_fields[] = ['name' => 'addr', 'type' => 'int']; + } + if ($contactRow['disclose_addr_loc'] === '1') { + $disclose_fields[] = ['name' => 'addr', 'type' => 'loc']; + } $stmt = $db->query("SELECT value FROM settings WHERE name = 'handle'"); $roid = $stmt->fetchColumn(); @@ -113,10 +130,10 @@ function processContactInfo($conn, $db, $xml, $clid, $trans) { 'authInfo_val' => $contactRow['authinfo'] ]; - if (!empty($disclose_required)) { + if (!empty($disclose_fields)) { $response['disclose'] = [ - 'flag' => '1', // Show when disclosure is enabled - 'fields' => array_keys($disclose_required) + 'flag' => '1', + 'fields' => $disclose_fields ]; } diff --git a/epp/src/epp-update.php b/epp/src/epp-update.php index dbc6b88..42bb69e 100644 --- a/epp/src/epp-update.php +++ b/epp/src/epp-update.php @@ -7,9 +7,9 @@ function processContactUpdate($conn, $db, $xml, $clid, $database_type, $trans) { $contactRem = $xml->xpath('//contact:rem') ?? null; $contactAdd = $xml->xpath('//contact:add') ?? null; $contactChg = $xml->xpath('//contact:chg') ?? null; - $identicaUpdate = $xml->xpath('//identica:update') ?? null; + $identicaUpdate = $xml->xpath('//identica:update'); - if (!$contactRem && !$contactAdd && !$contactChg && !$identicaUpdate) { + if (!$contactRem && !$contactAdd && !$contactChg && empty($identicaUpdate)) { sendEppError($conn, $db, 2003, 'At least one contact:rem || contact:add || contact:chg', $clTRID, $trans); return; } @@ -420,7 +420,7 @@ function processContactUpdate($conn, $db, $xml, $clid, $database_type, $trans) { } - if (isset($identicaUpdate)) { + if (!empty($identicaUpdate)) { $nin = (string) ($xml->xpath('//identica:nin[1]')[0] ?? null); $nin_type = (string) ($xml->xpath('//identica:nin/@type[1]')[0] ?? null); $validation = (string) ($xml->xpath('//identica:status[1]')[0] ?? null); diff --git a/epp/src/helpers.php b/epp/src/helpers.php index 6b55884..7fd263a 100644 --- a/epp/src/helpers.php +++ b/epp/src/helpers.php @@ -230,6 +230,9 @@ function validate_label($domain, $pdo) { if (strpos($domain, '.') === false) { return 'Invalid domain name format: must contain at least one dot (.)'; } + if ($domain[0] === '.' || substr($domain, -1) === '.') { + return 'Invalid domain name format: cannot start or end with a dot (.)'; + } // Split domain into labels (subdomains, SLD, TLD) $labels = explode('.', $domain);