Fixed EPP poll issues

This commit is contained in:
Pinga 2024-02-23 13:24:22 +02:00
parent 9d62b8cddb
commit 8d1cd1ae39
2 changed files with 114 additions and 70 deletions

View file

@ -403,47 +403,55 @@ class EppWriter {
$writer->writeAttribute('count', $resp['count']); $writer->writeAttribute('count', $resp['count']);
$writer->writeAttribute('id', $resp['id']); $writer->writeAttribute('id', $resp['id']);
$writer->writeElement('qDate', $resp['qDate']); $writer->writeElement('qDate', $resp['qDate']);
$writer->writeElement('msg', $resp['msg'], ['lang' => $resp['lang']]); $writer->startElement('msg');
if (!empty($resp['lang'])) { // Check if lang is provided and not empty
$writer->writeAttribute('lang', $resp['lang']);
}
$writer->text($resp['msg']);
$writer->endElement(); // End of 'msg'
$writer->endElement(); // End of 'msgQ' $writer->endElement(); // End of 'msgQ'
if ($resp['poll_msg_type'] === 'lowBalance') { if ($resp['poll_msg_type'] === 'lowBalance') {
$writer->startElement('resData'); $writer->startElement('resData');
$writer->startElement('lowbalance-poll:pollData'); $writer->startElement('lowbalance-poll:pollData');
$writer->writeAttribute('xmlns:lowbalance-poll', 'http://www.verisign.com/epp/lowbalance-poll-1.0'); $writer->writeAttribute('xmlns:lowbalance-poll', 'http://www.verisign.com/epp/lowbalance-poll-1.0');
$writer->writeAttribute('xsi:schemaLocation', 'http://www.verisign.com/epp/lowbalance-poll-1.0 lowbalance-poll-1.0.xsd'); $writer->writeAttribute('xsi:schemaLocation', 'http://www.verisign.com/epp/lowbalance-poll-1.0 lowbalance-poll-1.0.xsd');
$writer->writeElement('lowbalance-poll:registrarName', $resp['registrarName']); $writer->writeElement('lowbalance-poll:registrarName', $resp['registrarName']);
$writer->writeElement('lowbalance-poll:creditLimit', $resp['creditLimit']); $writer->writeElement('lowbalance-poll:creditLimit', $resp['creditLimit']);
$writer->writeElement('lowbalance-poll:creditThreshold', $resp['creditThreshold'], ['type' => $resp['creditThresholdType']]); $writer->startElement('lowbalance-poll:creditThreshold');
$writer->writeElement('lowbalance-poll:availableCredit', $resp['availableCredit']); $writer->writeAttribute('type', $resp['creditThresholdType']);
$writer->endElement(); // End of 'lowbalance-poll:pollData' $writer->text($resp['creditThreshold']);
$writer->endElement(); // End of 'resData' $writer->endElement(); // End of 'lowbalance-poll:creditThreshold'
} elseif ($resp['poll_msg_type'] === 'domainTransfer') { $writer->writeElement('lowbalance-poll:availableCredit', $resp['availableCredit']);
$writer->startElement('resData'); $writer->endElement(); // End of 'lowbalance-poll:pollData'
$writer->startElement('domain:trnData'); $writer->endElement(); // End of 'resData'
$writer->writeAttribute('xmlns:domain', 'urn:ietf:params:xml:ns:domain-1.0'); } elseif ($resp['poll_msg_type'] === 'domainTransfer') {
$writer->writeElement('domain:name', $resp['name']); $writer->startElement('resData');
$writer->writeElement('domain:trStatus', $resp['obj_trStatus']); $writer->startElement('domain:trnData');
$writer->writeElement('domain:reID', $resp['obj_reID']); $writer->writeAttribute('xmlns:domain', 'urn:ietf:params:xml:ns:domain-1.0');
$writer->writeElement('domain:reDate', $resp['obj_reDate']); $writer->writeElement('domain:name', $resp['name']);
$writer->writeElement('domain:acID', $resp['obj_acID']); $writer->writeElement('domain:trStatus', $resp['obj_trStatus']);
$writer->writeElement('domain:acDate', $resp['obj_acDate']); $writer->writeElement('domain:reID', $resp['obj_reID']);
if (isset($resp['obj_exDate'])) { $writer->writeElement('domain:reDate', $resp['obj_reDate']);
$writer->writeElement('domain:exDate', $resp['obj_exDate']); $writer->writeElement('domain:acID', $resp['obj_acID']);
} $writer->writeElement('domain:acDate', $resp['obj_acDate']);
$writer->endElement(); // End of 'domain:trnData' if (isset($resp['obj_exDate'])) {
$writer->endElement(); // End of 'resData' $writer->writeElement('domain:exDate', $resp['obj_exDate']);
} elseif ($resp['poll_msg_type'] === 'contactTransfer') { }
$writer->startElement('resData'); $writer->endElement(); // End of 'domain:trnData'
$writer->startElement('contact:trnData'); $writer->endElement(); // End of 'resData'
$writer->writeAttribute('xmlns:contact', 'urn:ietf:params:xml:ns:contact-1.0'); } elseif ($resp['poll_msg_type'] === 'contactTransfer') {
$writer->writeElement('contact:id', $resp['identifier']); $writer->startElement('resData');
$writer->writeElement('contact:trStatus', $resp['obj_trStatus']); $writer->startElement('contact:trnData');
$writer->writeElement('contact:reID', $resp['obj_reID']); $writer->writeAttribute('xmlns:contact', 'urn:ietf:params:xml:ns:contact-1.0');
$writer->writeElement('contact:reDate', $resp['obj_reDate']); $writer->writeElement('contact:id', $resp['identifier']);
$writer->writeElement('contact:acID', $resp['obj_acID']); $writer->writeElement('contact:trStatus', $resp['obj_trStatus']);
$writer->writeElement('contact:acDate', $resp['obj_acDate']); $writer->writeElement('contact:reID', $resp['obj_reID']);
$writer->endElement(); // End of 'contact:trnData' $writer->writeElement('contact:reDate', $resp['obj_reDate']);
$writer->endElement(); // End of 'resData' $writer->writeElement('contact:acID', $resp['obj_acID']);
} $writer->writeElement('contact:acDate', $resp['obj_acDate']);
$writer->endElement(); // End of 'contact:trnData'
$writer->endElement(); // End of 'resData'
}
} }
$this->_postamble($writer, $resp); $this->_postamble($writer, $resp);

View file

@ -5,6 +5,12 @@ function processPoll($conn, $db, $xml, $clid, $trans) {
$node = $xml->command->poll; $node = $xml->command->poll;
$op = (string) $node['op']; $op = (string) $node['op'];
$stmt = $db->prepare("SELECT id FROM registrar WHERE clid = :clid LIMIT 1");
$stmt->bindParam(':clid', $clid, PDO::PARAM_STR);
$stmt->execute();
$clid = $stmt->fetch(PDO::FETCH_ASSOC);
$clid = $clid['id'];
if ($op === 'ack') { if ($op === 'ack') {
$id = (string)$node['msgID']; $id = (string)$node['msgID'];
$stmt = $db->prepare("SELECT id FROM poll WHERE registrar_id = :registrar_id AND id = :id LIMIT 1"); $stmt = $db->prepare("SELECT id FROM poll WHERE registrar_id = :registrar_id AND id = :id LIMIT 1");
@ -16,17 +22,46 @@ function processPoll($conn, $db, $xml, $clid, $trans) {
} else { } else {
$stmt = $db->prepare("DELETE FROM poll WHERE registrar_id = :registrar_id AND id = :id"); $stmt = $db->prepare("DELETE FROM poll WHERE registrar_id = :registrar_id AND id = :id");
$stmt->execute([':registrar_id' => $clid, ':id' => $id]); $stmt->execute([':registrar_id' => $clid, ':id' => $id]);
$response['resultCode'] = 1000; $response['resultCode'] = 1300;
} }
$stmt = $db->prepare("SELECT id, qdate, msg, msg_type, obj_name_or_id, obj_trStatus, obj_reID, obj_reDate, obj_acID, obj_acDate, obj_exDate, registrarName, creditLimit, creditThreshold, creditThresholdType, availableCredit FROM poll WHERE registrar_id = :registrar_id ORDER BY id DESC LIMIT 1");
$stmt->execute([':registrar_id' => $clid]);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
$id = $result['id'] ?? null;
if (isset($id) && is_numeric($id) && $id >= 1) {
$stmt = $db->prepare("SELECT id, qdate, msg, msg_type, obj_name_or_id, obj_trStatus, obj_reID, obj_reDate, obj_acID, obj_acDate, obj_exDate, registrarName, creditLimit, creditThreshold, creditThresholdType, availableCredit FROM poll WHERE registrar_id = :registrar_id ORDER BY id DESC LIMIT 1");
$stmt->execute([':registrar_id' => $clid]);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
$id = $result['id'] ?? null;
$response['resultCode'] = $id ? 1301 : 1300;
} else {
$stmt = $db->prepare("SELECT COUNT(id) AS counter FROM poll WHERE registrar_id = :registrar_id");
$stmt->execute([':registrar_id' => $clid]);
$counter = $stmt->fetchColumn();
$response['count'] = $counter;
$response['id'] = $id;
$response['command'] = 'poll';
$response['clTRID'] = $clTRID;
$response['svTRID'] = generateSvTRID();
$epp = new EPP\EppWriter();
$xml = $epp->epp_writer($response);
updateTransaction($db, 'poll', null, null, $response['resultCode'], 'Command completed successfully', $response['svTRID'], $xml, $trans);
sendEppResponse($conn, $xml);
return;
}
} else { } else {
$stmt = $db->prepare("SELECT id, qdate, msg, msg_type, obj_name_or_id, obj_trStatus, obj_reID, obj_reDate, obj_acID, obj_acDate, obj_exDate, registrarName, creditLimit, creditThreshold, creditThresholdType, availableCredit FROM poll WHERE registrar_id = :registrar_id ORDER BY id ASC LIMIT 1"); $stmt = $db->prepare("SELECT id, qdate, msg, msg_type, obj_name_or_id, obj_trStatus, obj_reID, obj_reDate, obj_acID, obj_acDate, obj_exDate, registrarName, creditLimit, creditThreshold, creditThresholdType, availableCredit FROM poll WHERE registrar_id = :registrar_id ORDER BY id DESC LIMIT 1");
$stmt->execute([':registrar_id' => $clid]); $stmt->execute([':registrar_id' => $clid]);
$result = $stmt->fetch(PDO::FETCH_ASSOC); $result = $stmt->fetch(PDO::FETCH_ASSOC);
$id = $result['id'] ?? null; $id = $result['id'] ?? null;
$response['resultCode'] = $id ? 1301 : 1300; $response['resultCode'] = $id ? 1301 : 1300;
} }
if ((int) $response['resultCode'] === 1300) { if ((int) $response['resultCode'] === 1300) {
$svTRID = generateSvTRID(); $svTRID = generateSvTRID();
$response = [ $response = [
@ -36,12 +71,12 @@ function processPoll($conn, $db, $xml, $clid, $trans) {
'resultCode' => $response['resultCode'], 'resultCode' => $response['resultCode'],
'msg' => 'Command completed successfully; no messages', 'msg' => 'Command completed successfully; no messages',
]; ];
$epp = new EPP\EppWriter(); $epp = new EPP\EppWriter();
$xml = $epp->epp_writer($response); $xml = $epp->epp_writer($response);
updateTransaction($db, 'poll', null, null, $response['resultCode'], 'Command completed successfully', $svTRID, $xml, $trans); updateTransaction($db, 'poll', null, null, $response['resultCode'], 'Command completed successfully', $svTRID, $xml, $trans);
sendEppResponse($conn, $xml); sendEppResponse($conn, $xml);
return; return;
} }
$stmt = $db->prepare("SELECT COUNT(id) AS counter FROM poll WHERE registrar_id = :registrar_id"); $stmt = $db->prepare("SELECT COUNT(id) AS counter FROM poll WHERE registrar_id = :registrar_id");
@ -53,38 +88,39 @@ function processPoll($conn, $db, $xml, $clid, $trans) {
$response['count'] = $counter; $response['count'] = $counter;
$response['id'] = $id; $response['id'] = $id;
$response['msg'] = $result['msg'] ?? null; $response['msg'] = $result['msg'] ?? null;
$response['resultCode'] = 1301;
$response['poll_msg_type'] = $result['msg_type'] ?? null; $response['poll_msg_type'] = $result['msg_type'] ?? null;
$response['lang'] = 'en-US'; $response['lang'] = 'en-US';
$qdate = str_replace(' ', 'T', $result['qdate'] ?? '') . '.0Z'; $qdate = str_replace(' ', 'T', $result['qdate'] ?? '') . 'Z';
$response['qDate'] = $qdate; $response['qDate'] = $qdate;
if ($poll_msg_type === 'lowBalance') { if ($response['poll_msg_type'] === 'lowBalance') {
$response['registrarName'] = $registrarName; $response['registrarName'] = $result['registrarName'];
$response['creditLimit'] = $creditLimit; $response['creditLimit'] = $result['creditLimit'];
$response['creditThreshold'] = $creditThreshold; $response['creditThreshold'] = $result['creditThreshold'];
$response['creditThresholdType'] = $creditThresholdType; $response['creditThresholdType'] = $result['creditThresholdType'];
$response['availableCredit'] = $availableCredit; $response['availableCredit'] = $result['availableCredit'];
} elseif ($poll_msg_type === 'domainTransfer') { } elseif ($response['poll_msg_type'] === 'domainTransfer') {
$response['name'] = $obj_name_or_id; $response['name'] = $result['obj_name_or_id'];
$response['obj_trStatus'] = $obj_trStatus; $response['obj_trStatus'] = $result['obj_trStatus'];
$response['obj_reID'] = $obj_reID; $response['obj_reID'] = $result['obj_reID'];
$response['obj_reDate'] = str_replace(' ', 'T', $obj_reDate) . '.0Z'; $response['obj_reDate'] = str_replace(' ', 'T', $result['obj_reDate']) . 'Z';
$response['obj_acID'] = $obj_acID; $response['obj_acID'] = $result['obj_acID'];
$response['obj_acDate'] = str_replace(' ', 'T', $obj_acDate) . '.0Z'; $response['obj_acDate'] = str_replace(' ', 'T', $result['obj_acDate']) . 'Z';
if ($obj_exDate) { if ($result['obj_exDate']) {
$response['obj_exDate'] = str_replace(' ', 'T', $obj_exDate) . '.0Z'; $response['obj_exDate'] = str_replace(' ', 'T', $result['obj_exDate']) . 'Z';
} }
$response['obj_type'] = 'domain'; $response['obj_type'] = 'domain';
$response['obj_id'] = $obj_name_or_id; $response['obj_id'] = $result['obj_name_or_id'];
} elseif ($poll_msg_type === 'contactTransfer') { } elseif ($response['poll_msg_type'] === 'contactTransfer') {
$response['identifier'] = $obj_name_or_id; $response['identifier'] = $result['obj_name_or_id'];
$response['obj_trStatus'] = $obj_trStatus; $response['obj_trStatus'] = $result['obj_trStatus'];
$response['obj_reID'] = $obj_reID; $response['obj_reID'] = $result['obj_reID'];
$response['obj_reDate'] = str_replace(' ', 'T', $obj_reDate) . '.0Z'; $response['obj_reDate'] = str_replace(' ', 'T', $result['obj_reDate']) . 'Z';
$response['obj_acID'] = $obj_acID; $response['obj_acID'] = $result['obj_acID'];
$response['obj_acDate'] = str_replace(' ', 'T', $obj_acDate) . '.0Z'; $response['obj_acDate'] = str_replace(' ', 'T', $result['obj_acDate']) . 'Z';
$response['obj_type'] = 'contact'; $response['obj_type'] = 'contact';
$response['obj_id'] = $obj_name_or_id; $response['obj_id'] = $result['obj_name_or_id'];
} }
$response['clTRID'] = $clTRID; $response['clTRID'] = $clTRID;