And one more epp update

This commit is contained in:
Pinga 2023-08-09 12:32:43 +03:00
parent 8719aad491
commit 0719adc3dc
2 changed files with 123 additions and 47 deletions

View file

@ -7,13 +7,6 @@ use XMLWriter;
class EppWriter { class EppWriter {
// Properties // Properties
private $EPP_VERSIONS = ['1.0'];
private $EPP_LANGUAGES = ['en-US', 'ua'];
private $EPP_OBJECTS = [
'contact' => 'urn:ietf:params:xml:ns:contact-1.0',
'domain' => 'urn:ietf:params:xml:ns:domain-1.0',
'host' => 'urn:ietf:params:xml:ns:host-1.0',
];
private $command_handler_map = [ private $command_handler_map = [
'greeting' => '_greeting', 'greeting' => '_greeting',
'login' => '_common', 'login' => '_common',
@ -257,23 +250,93 @@ class EppWriter {
private function _greeting($writer, $resp) { private function _greeting($writer, $resp) {
$writer->startElement('greeting'); $writer->startElement('greeting');
// Server ID and Server Date
$writer->writeElement('svID', $resp['svID']); $writer->writeElement('svID', $resp['svID']);
$writer->writeElement('svDate', date('c')); // Using PHP's date function with 'c' format as a placeholder for EPP date $writer->writeElement('svDate', $resp['svDate']);
// Services
$writer->startElement('svcMenu'); $writer->startElement('svcMenu');
$writer->writeElement('version', $resp['version']);
foreach ($this->EPP_VERSIONS as $ver) { // Check if 'lang' is an array and handle accordingly
$writer->writeElement('version', $ver); if (is_array($resp['lang'])) {
foreach ($resp['lang'] as $language) {
$writer->writeElement('lang', $language);
}
} else {
$writer->writeElement('lang', $resp['lang']);
} }
foreach ($this->EPP_LANGUAGES as $lang) { foreach ($resp['services'] as $service) {
$writer->writeElement('lang', $lang); $writer->writeElement('objURI', $service);
} }
foreach ($this->EPP_OBJECTS as $obj => $uri) { // Optional extensions
$writer->writeElement('objURI', $uri); if (isset($resp['extensions'])) {
$writer->startElement('svcExtension');
foreach ($resp['extensions'] as $extension) {
$writer->writeElement('extURI', $extension);
}
$writer->endElement(); // End of 'svcExtension'
} }
$writer->endElement(); // End of 'svcMenu' $writer->endElement(); // End of 'svcMenu'
// Optional Data Collection Policy (dcp)
if (isset($resp['dcp'])) {
$writer->startElement('dcp');
// Handle the access element
if (isset($resp['dcp']['access'])) {
$writer->startElement('access');
foreach ($resp['dcp']['access'] as $accessType) {
$writer->startElement($accessType);
$writer->endElement();
}
$writer->endElement(); // End of 'access'
}
// Handle the statement element
if (isset($resp['dcp']['statement'])) {
$writer->startElement('statement');
// Handle purpose
if (isset($resp['dcp']['statement']['purpose'])) {
$writer->startElement('purpose');
foreach ($resp['dcp']['statement']['purpose'] as $purposeType) {
$writer->startElement($purposeType);
$writer->endElement();
}
$writer->endElement(); // End of 'purpose'
}
// Handle recipient
if (isset($resp['dcp']['statement']['recipient'])) {
$writer->startElement('recipient');
foreach ($resp['dcp']['statement']['recipient'] as $recipientType) {
$writer->startElement($recipientType);
$writer->endElement();
}
$writer->endElement(); // End of 'recipient'
}
// Handle retention
if (isset($resp['dcp']['statement']['retention'])) {
$writer->startElement('retention');
foreach ($resp['dcp']['statement']['retention'] as $retentionType) {
$writer->startElement($retentionType);
$writer->endElement();
}
$writer->endElement(); // End of 'retention'
}
$writer->endElement(); // End of 'statement'
}
$writer->endElement(); // End of 'dcp'
}
$writer->endElement(); // End of 'greeting' $writer->endElement(); // End of 'greeting'
} }

View file

@ -111,6 +111,12 @@ $server->handle(function (Connection $conn) use ($table, $db) {
break; break;
} }
case isset($xml->hello):
{
sendGreeting($conn);
break;
}
case isset($xml->command->check) && isset($xml->command->check->children('urn:ietf:params:xml:ns:contact-1.0')->check): case isset($xml->command->check) && isset($xml->command->check->children('urn:ietf:params:xml:ns:contact-1.0')->check):
{ {
$data = $table->get($connId); $data = $table->get($connId);
@ -464,34 +470,41 @@ function checkLogin($db, $clID, $pw) {
function sendGreeting($conn) { function sendGreeting($conn) {
global $c; global $c;
$currentDate = gmdate('Y-m-d\TH:i:s\Z'); $currentDate = gmdate('Y-m-d\TH:i:s\Z');
$greetingXml = <<<XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?> $response = [
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0"> 'command' => 'greeting',
<greeting> 'svID' => $c['epp_greeting'],
<svID>{$c['epp_greeting']}</svID> 'svDate' => $currentDate,
<svDate>$currentDate</svDate> 'version' => '1.0',
<svcMenu> 'lang' => 'en',
<version>1.0</version> 'services' => [
<lang>en</lang> 'urn:ietf:params:xml:ns:domain-1.0',
<objURI>urn:ietf:params:xml:ns:domain-1.0</objURI> 'urn:ietf:params:xml:ns:contact-1.0',
<objURI>urn:ietf:params:xml:ns:contact-1.0</objURI> 'urn:ietf:params:xml:ns:host-1.0'
<!-- Add other namespaces as supported --> ],
</svcMenu> 'extensions' => [
<!-- Optional: extensions you support --> 'http://www.namingo.org/epp/nBalance-1.0',
<dcp> 'http://www.namingo.org/epp/nIdent-1.0',
<access><all/></access> 'urn:ietf:params:xml:ns:secDNS-1.1',
<statement> 'urn:ietf:params:xml:ns:rgp-1.0',
<purpose><admin/><prov/></purpose> 'urn:ietf:params:xml:ns:launch-1.0',
<recipient><ours/><public/><same/></recipient> 'urn:ietf:params:xml:ns:idn-1.0',
<retention><stated/></retention> 'urn:ietf:params:xml:ns:epp:fee-1.0',
</statement> 'urn:ar:params:xml:ns:price-1.1'
</dcp> ],
</greeting> 'dcp' => [ // Data Collection Policy (optional)
</epp> 'access' => ['all'],
XML; 'statement' => [
$length = strlen($greetingXml) + 4; // Total length including the 4-byte header 'purpose' => ['admin', 'prov'],
$lengthData = pack('N', $length); // Pack the length into 4 bytes 'recipient' => ['ours'],
$conn->send($lengthData . $greetingXml); 'retention' => ['stated']
]
]
];
$epp = new EPP\EppWriter();
$xml = $epp->epp_writer($response);
sendEppResponse($conn, $xml);
} }
function sendEppError($conn, $code, $msg) { function sendEppError($conn, $code, $msg) {