RST related EPP server fixes

This commit is contained in:
Pinga 2025-07-09 11:41:20 +03:00
parent daf8e630bf
commit 8d3493bb7a
6 changed files with 63 additions and 40 deletions

View file

@ -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);

View file

@ -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');

View file

@ -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);
}

View file

@ -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
];
}

View file

@ -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);

View file

@ -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);