diff --git a/epp/src/EppWriter.php b/epp/src/EppWriter.php index 9f6dee1..f08ba79 100644 --- a/epp/src/EppWriter.php +++ b/epp/src/EppWriter.php @@ -403,47 +403,55 @@ class EppWriter { $writer->writeAttribute('count', $resp['count']); $writer->writeAttribute('id', $resp['id']); $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' - if ($resp['poll_msg_type'] === 'lowBalance') { - $writer->startElement('resData'); - $writer->startElement('lowbalance-poll:pollData'); - $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->writeElement('lowbalance-poll:registrarName', $resp['registrarName']); - $writer->writeElement('lowbalance-poll:creditLimit', $resp['creditLimit']); - $writer->writeElement('lowbalance-poll:creditThreshold', $resp['creditThreshold'], ['type' => $resp['creditThresholdType']]); - $writer->writeElement('lowbalance-poll:availableCredit', $resp['availableCredit']); - $writer->endElement(); // End of 'lowbalance-poll:pollData' - $writer->endElement(); // End of 'resData' - } elseif ($resp['poll_msg_type'] === 'domainTransfer') { - $writer->startElement('resData'); - $writer->startElement('domain:trnData'); - $writer->writeAttribute('xmlns:domain', 'urn:ietf:params:xml:ns:domain-1.0'); - $writer->writeElement('domain:name', $resp['name']); - $writer->writeElement('domain:trStatus', $resp['obj_trStatus']); - $writer->writeElement('domain:reID', $resp['obj_reID']); - $writer->writeElement('domain:reDate', $resp['obj_reDate']); - $writer->writeElement('domain:acID', $resp['obj_acID']); - $writer->writeElement('domain:acDate', $resp['obj_acDate']); - if (isset($resp['obj_exDate'])) { - $writer->writeElement('domain:exDate', $resp['obj_exDate']); - } - $writer->endElement(); // End of 'domain:trnData' - $writer->endElement(); // End of 'resData' - } elseif ($resp['poll_msg_type'] === 'contactTransfer') { - $writer->startElement('resData'); - $writer->startElement('contact:trnData'); - $writer->writeAttribute('xmlns:contact', 'urn:ietf:params:xml:ns:contact-1.0'); - $writer->writeElement('contact:id', $resp['identifier']); - $writer->writeElement('contact:trStatus', $resp['obj_trStatus']); - $writer->writeElement('contact:reID', $resp['obj_reID']); - $writer->writeElement('contact:reDate', $resp['obj_reDate']); - $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' - } + if ($resp['poll_msg_type'] === 'lowBalance') { + $writer->startElement('resData'); + $writer->startElement('lowbalance-poll:pollData'); + $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->writeElement('lowbalance-poll:registrarName', $resp['registrarName']); + $writer->writeElement('lowbalance-poll:creditLimit', $resp['creditLimit']); + $writer->startElement('lowbalance-poll:creditThreshold'); + $writer->writeAttribute('type', $resp['creditThresholdType']); + $writer->text($resp['creditThreshold']); + $writer->endElement(); // End of 'lowbalance-poll:creditThreshold' + $writer->writeElement('lowbalance-poll:availableCredit', $resp['availableCredit']); + $writer->endElement(); // End of 'lowbalance-poll:pollData' + $writer->endElement(); // End of 'resData' + } elseif ($resp['poll_msg_type'] === 'domainTransfer') { + $writer->startElement('resData'); + $writer->startElement('domain:trnData'); + $writer->writeAttribute('xmlns:domain', 'urn:ietf:params:xml:ns:domain-1.0'); + $writer->writeElement('domain:name', $resp['name']); + $writer->writeElement('domain:trStatus', $resp['obj_trStatus']); + $writer->writeElement('domain:reID', $resp['obj_reID']); + $writer->writeElement('domain:reDate', $resp['obj_reDate']); + $writer->writeElement('domain:acID', $resp['obj_acID']); + $writer->writeElement('domain:acDate', $resp['obj_acDate']); + if (isset($resp['obj_exDate'])) { + $writer->writeElement('domain:exDate', $resp['obj_exDate']); + } + $writer->endElement(); // End of 'domain:trnData' + $writer->endElement(); // End of 'resData' + } elseif ($resp['poll_msg_type'] === 'contactTransfer') { + $writer->startElement('resData'); + $writer->startElement('contact:trnData'); + $writer->writeAttribute('xmlns:contact', 'urn:ietf:params:xml:ns:contact-1.0'); + $writer->writeElement('contact:id', $resp['identifier']); + $writer->writeElement('contact:trStatus', $resp['obj_trStatus']); + $writer->writeElement('contact:reID', $resp['obj_reID']); + $writer->writeElement('contact:reDate', $resp['obj_reDate']); + $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); diff --git a/epp/src/epp-poll.php b/epp/src/epp-poll.php index 7abc6b5..02697a1 100644 --- a/epp/src/epp-poll.php +++ b/epp/src/epp-poll.php @@ -5,6 +5,12 @@ function processPoll($conn, $db, $xml, $clid, $trans) { $node = $xml->command->poll; $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') { $id = (string)$node['msgID']; $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 { $stmt = $db->prepare("DELETE FROM poll WHERE registrar_id = :registrar_id AND 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 { - $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]); $result = $stmt->fetch(PDO::FETCH_ASSOC); $id = $result['id'] ?? null; $response['resultCode'] = $id ? 1301 : 1300; } - + if ((int) $response['resultCode'] === 1300) { $svTRID = generateSvTRID(); $response = [ @@ -36,12 +71,12 @@ function processPoll($conn, $db, $xml, $clid, $trans) { 'resultCode' => $response['resultCode'], 'msg' => 'Command completed successfully; no messages', ]; - + $epp = new EPP\EppWriter(); $xml = $epp->epp_writer($response); updateTransaction($db, 'poll', null, null, $response['resultCode'], 'Command completed successfully', $svTRID, $xml, $trans); sendEppResponse($conn, $xml); - return; + return; } $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['id'] = $id; $response['msg'] = $result['msg'] ?? null; + $response['resultCode'] = 1301; $response['poll_msg_type'] = $result['msg_type'] ?? null; $response['lang'] = 'en-US'; - $qdate = str_replace(' ', 'T', $result['qdate'] ?? '') . '.0Z'; + $qdate = str_replace(' ', 'T', $result['qdate'] ?? '') . 'Z'; $response['qDate'] = $qdate; - if ($poll_msg_type === 'lowBalance') { - $response['registrarName'] = $registrarName; - $response['creditLimit'] = $creditLimit; - $response['creditThreshold'] = $creditThreshold; - $response['creditThresholdType'] = $creditThresholdType; - $response['availableCredit'] = $availableCredit; - } elseif ($poll_msg_type === 'domainTransfer') { - $response['name'] = $obj_name_or_id; - $response['obj_trStatus'] = $obj_trStatus; - $response['obj_reID'] = $obj_reID; - $response['obj_reDate'] = str_replace(' ', 'T', $obj_reDate) . '.0Z'; - $response['obj_acID'] = $obj_acID; - $response['obj_acDate'] = str_replace(' ', 'T', $obj_acDate) . '.0Z'; - if ($obj_exDate) { - $response['obj_exDate'] = str_replace(' ', 'T', $obj_exDate) . '.0Z'; + if ($response['poll_msg_type'] === 'lowBalance') { + $response['registrarName'] = $result['registrarName']; + $response['creditLimit'] = $result['creditLimit']; + $response['creditThreshold'] = $result['creditThreshold']; + $response['creditThresholdType'] = $result['creditThresholdType']; + $response['availableCredit'] = $result['availableCredit']; + } elseif ($response['poll_msg_type'] === 'domainTransfer') { + $response['name'] = $result['obj_name_or_id']; + $response['obj_trStatus'] = $result['obj_trStatus']; + $response['obj_reID'] = $result['obj_reID']; + $response['obj_reDate'] = str_replace(' ', 'T', $result['obj_reDate']) . 'Z'; + $response['obj_acID'] = $result['obj_acID']; + $response['obj_acDate'] = str_replace(' ', 'T', $result['obj_acDate']) . 'Z'; + if ($result['obj_exDate']) { + $response['obj_exDate'] = str_replace(' ', 'T', $result['obj_exDate']) . 'Z'; } $response['obj_type'] = 'domain'; - $response['obj_id'] = $obj_name_or_id; - } elseif ($poll_msg_type === 'contactTransfer') { - $response['identifier'] = $obj_name_or_id; - $response['obj_trStatus'] = $obj_trStatus; - $response['obj_reID'] = $obj_reID; - $response['obj_reDate'] = str_replace(' ', 'T', $obj_reDate) . '.0Z'; - $response['obj_acID'] = $obj_acID; - $response['obj_acDate'] = str_replace(' ', 'T', $obj_acDate) . '.0Z'; + $response['obj_id'] = $result['obj_name_or_id']; + } elseif ($response['poll_msg_type'] === 'contactTransfer') { + $response['identifier'] = $result['obj_name_or_id']; + $response['obj_trStatus'] = $result['obj_trStatus']; + $response['obj_reID'] = $result['obj_reID']; + $response['obj_reDate'] = str_replace(' ', 'T', $result['obj_reDate']) . 'Z'; + $response['obj_acID'] = $result['obj_acID']; + $response['obj_acDate'] = str_replace(' ', 'T', $result['obj_acDate']) . 'Z'; $response['obj_type'] = 'contact'; - $response['obj_id'] = $obj_name_or_id; + $response['obj_id'] = $result['obj_name_or_id']; } $response['clTRID'] = $clTRID;