From db374e4b60d3b983bc671b1936fe202e65b1bf95 Mon Sep 17 00:00:00 2001 From: bessone Date: Wed, 8 Oct 2025 15:45:05 +0200 Subject: [PATCH 1/6] Add itEppConnection class for EPP connection handling --- Registries/itEppConnection/eppConnection.php | 74 ++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 Registries/itEppConnection/eppConnection.php diff --git a/Registries/itEppConnection/eppConnection.php b/Registries/itEppConnection/eppConnection.php new file mode 100644 index 00000000..a82c0bb2 --- /dev/null +++ b/Registries/itEppConnection/eppConnection.php @@ -0,0 +1,74 @@ + 'domain', + 'urn:ietf:params:xml:ns:contact-1.0' => 'contact' + ) + ); + + // Add registry-specific EPP extensions + parent::useExtension('it-extcon-1.0'); + parent::useExtension('it-extdom-2.0'); + parent::useExtension('it-extepp-2.0'); + } + + public function enableDnssec() { + parent::enableDnssec(); + $this->useExtension('it-extsecdns-1.0'); + } + + public function disableDnssec() { + parent::disableDnssec(); + $this->removeExtension('it-extsecdns-1.0'); + } + + /** + * Performs an EPP login request and checks the result + * @param bool $usecdata Enclose the password field with [[CDATA]] + * @return bool + */ + public function login($usecdata = false) + { + if (!$this->connected) { + if (!$this->connect()) { + return false; + } + } + $login = new eppLoginRequest(null, $usecdata); + + if ($response = $this->request($login)) { + // Get available credit + /** @var itEppLoginResponse $response */ + $this->credit = $response->getCredit(); + + $this->writeLog("Logged in", "LOGIN"); + $this->loggedin = true; + return true; + } + return false; + } + + /** + * Get the available credit in euros + * @return float + */ + public function getCredit(): float + { + return $this->credit; + } +} From 833c7cadd13226669902abf2ab02dd9f30d0ee4f Mon Sep 17 00:00:00 2001 From: bessone Date: Wed, 8 Oct 2025 15:50:56 +0200 Subject: [PATCH 2/6] Add it-extepp-2.0 extension --- .../eppResponses/itEppLoginResponse.php | 21 +++++++++++++++++++ .../eppExtensions/it-extepp-2.0/includes.php | 6 ++++++ 2 files changed, 27 insertions(+) create mode 100644 Protocols/EPP/eppExtensions/it-extepp-2.0/eppResponses/itEppLoginResponse.php create mode 100644 Protocols/EPP/eppExtensions/it-extepp-2.0/includes.php diff --git a/Protocols/EPP/eppExtensions/it-extepp-2.0/eppResponses/itEppLoginResponse.php b/Protocols/EPP/eppExtensions/it-extepp-2.0/eppResponses/itEppLoginResponse.php new file mode 100644 index 00000000..c598b1e5 --- /dev/null +++ b/Protocols/EPP/eppExtensions/it-extepp-2.0/eppResponses/itEppLoginResponse.php @@ -0,0 +1,21 @@ +queryPath('/epp:epp/epp:response/epp:extension/extepp:creditMsgData/extepp:credit'); + } +} \ No newline at end of file diff --git a/Protocols/EPP/eppExtensions/it-extepp-2.0/includes.php b/Protocols/EPP/eppExtensions/it-extepp-2.0/includes.php new file mode 100644 index 00000000..c72f3a28 --- /dev/null +++ b/Protocols/EPP/eppExtensions/it-extepp-2.0/includes.php @@ -0,0 +1,6 @@ +addExtension('extepp-2.0', 'http://www.nic.it/ITNIC-EPP/extepp-2.0'); + +include_once(dirname(__FILE__) . '/eppResponses/itEppLoginResponse.php'); + +$this->addCommandResponse('Metaregistrar\EPP\eppLoginRequest', 'Metaregistrar\EPP\itEppLoginResponse'); From 71877517395d2d595a2734b255969fc08800387f Mon Sep 17 00:00:00 2001 From: bessone Date: Fri, 10 Oct 2025 14:49:10 +0200 Subject: [PATCH 3/6] Add it-extcon-1.0 extension --- .../it-extcon-1.0/eppData/itEppContact.php | 81 +++++++++++++++++++ .../eppRequests/itEppCreateContactRequest.php | 56 +++++++++++++ .../eppResponses/itEppInfoContactResponse.php | 51 ++++++++++++ .../eppExtensions/it-extcon-1.0/includes.php | 9 +++ 4 files changed, 197 insertions(+) create mode 100644 Protocols/EPP/eppExtensions/it-extcon-1.0/eppData/itEppContact.php create mode 100644 Protocols/EPP/eppExtensions/it-extcon-1.0/eppRequests/itEppCreateContactRequest.php create mode 100644 Protocols/EPP/eppExtensions/it-extcon-1.0/eppResponses/itEppInfoContactResponse.php create mode 100644 Protocols/EPP/eppExtensions/it-extcon-1.0/includes.php diff --git a/Protocols/EPP/eppExtensions/it-extcon-1.0/eppData/itEppContact.php b/Protocols/EPP/eppExtensions/it-extcon-1.0/eppData/itEppContact.php new file mode 100644 index 00000000..93e84973 --- /dev/null +++ b/Protocols/EPP/eppExtensions/it-extcon-1.0/eppData/itEppContact.php @@ -0,0 +1,81 @@ +setConsentForPublishing($consentForPublishing); + $this->setRegistrant($entityType, $nationalityCode, $regCode); + } + + public function setConsentForPublishing($consent = false) + { + $this->consentForPublishing = $consent ? 1 : 0; + } + + public function getConsentForPublishing() + { + return $this->consentForPublishing; + } + + public function setRegistrantEntityType($entityType) + { + if (!in_array($entityType, $this->entityTypes)) { + throw new eppException(sprintf('The entity type: \'%s\' is invalid', $entityType)); + } + $this->registrantEntityType = $entityType; + } + + public function setRegistrantNationalityCode($nationalityCode) + { + if (!empty($nationalityCode)) { + $this->registrantNationalityCode = $nationalityCode; + } + } + + public function setRegistrantRegCode($regCode) + { + if (!empty($regCode)) { + $this->registrantRegCode = $regCode; + } + } + + public function setRegistrant($entityType, $nationalityCode, $regCode) + { + $this->setRegistrantEntityType($entityType); + $this->setRegistrantNationalityCode($nationalityCode); + $this->setRegistrantRegCode($regCode); + } + + public function getRegistrant() + { + return [ + 'entityType' => $this->registrantEntityType, + 'nationalityCode' => $this->registrantNationalityCode, + 'regCode' => $this->registrantRegCode + ]; + } +} \ No newline at end of file diff --git a/Protocols/EPP/eppExtensions/it-extcon-1.0/eppRequests/itEppCreateContactRequest.php b/Protocols/EPP/eppExtensions/it-extcon-1.0/eppRequests/itEppCreateContactRequest.php new file mode 100644 index 00000000..961556d9 --- /dev/null +++ b/Protocols/EPP/eppExtensions/it-extcon-1.0/eppRequests/itEppCreateContactRequest.php @@ -0,0 +1,56 @@ + + + true + + IT + 1 + BSSRCR78D03G674P + + + +*/ + +class itEppCreateContactRequest extends eppCreateContactRequest { + + /** + * itEppCreateContactRequest constructor. + * @param eppContact|null $createInfo + * @param string $contacttype + * @param string $language + * @throws eppException + */ + function __construct(itEppContact $createInfo) { + parent::__construct($createInfo); + $this->addContactExtension($createInfo); + $this->addSessionId(); + } + + /** + * @param object eppContact + */ + public function addContactExtension(itEppContact $createInfo) { + $this->addExtension('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); + $this->addExtension('xsi:schemaLocation', 'urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd'); + + $this->contactobject->setAttribute('xmlns:contact', 'urn:ietf:params:xml:ns:contact-1.0'); + $this->contactobject->setAttribute('xsi:schemaLocation', 'urn:ietf:params:xml:ns:contact-1.0 contact-1.0.xsd'); + + $create = $this->createElement('extcon:create'); + $create->setAttribute('xmlns:extcon', 'http://www.nic.it/ITNIC-EPP/extcon-1.0'); + $create->setAttribute('xsi:schemaLocation', 'http://www.nic.it/ITNIC-EPP/extcon-1.0 extcon-1.0.xsd'); + + $create->appendChild($this->createElement('extcon:consentForPublishing', $createInfo->getConsentForPublishing())); + + $registrant = $createInfo->getRegistrant(); + $registrantElement = $this->createElement('extcon:registrant'); + $registrantElement->appendChild($this->createElement('extcon:nationalityCode', $registrant['nationalityCode'])); + $registrantElement->appendChild($this->createElement('extcon:entityType', $registrant['entityType'])); + $registrantElement->appendChild($this->createElement('extcon:regCode', $registrant['regCode'])); + $create->appendChild($registrantElement); + + $this->getExtension()->appendChild($create); + } +} diff --git a/Protocols/EPP/eppExtensions/it-extcon-1.0/eppResponses/itEppInfoContactResponse.php b/Protocols/EPP/eppExtensions/it-extcon-1.0/eppResponses/itEppInfoContactResponse.php new file mode 100644 index 00000000..7a2b2a01 --- /dev/null +++ b/Protocols/EPP/eppExtensions/it-extcon-1.0/eppResponses/itEppInfoContactResponse.php @@ -0,0 +1,51 @@ +getContactPostalInfo(); + + $contact = new itEppContact($postalinfo, $this->getContactEmail(), $this->getContactVoice(), $this->getContactFax(), null, null, $this->getConsentForPublishing(), $this->getRegistrantEntityType(), $this->getRegistrantNationalityCode(), $this->getRegistrantRegCode()); + return $contact; + } + + public function isRegistrant() + { + return $this->queryPath('/epp:epp/epp:response/epp:extension/extcon:infData/extcon:registrant') ? true : false; + } + + public function getConsentForPublishing() + { + return (bool) $this->queryPath('/epp:epp/epp:response/epp:extension/extcon:infData/extcon:consentForPublishing'); + } + + public function getRegistrantEntityType() + { + return (int) $this->queryPath('/epp:epp/epp:response/epp:extension/extcon:infData/extcon:registrant/extcon:entityType'); + } + + public function getRegistrantNationalityCode() + { + return $this->queryPath('/epp:epp/epp:response/epp:extension/extcon:infData/extcon:registrant/extcon:nationalityCode'); + } + + public function getRegistrantRegCode() + { + return $this->queryPath('/epp:epp/epp:response/epp:extension/extcon:infData/extcon:registrant/extcon:regCode'); + } + + public function getRegistrant() + { + $registrant['nationalityCode'] = $this->getRegistrantNationalityCode(); + $registrant['entityType'] = $this->getRegistrantEntityType(); + $registrant['regCode'] = $this->getRegistrantRegCode(); + + return $registrant; + } +} \ No newline at end of file diff --git a/Protocols/EPP/eppExtensions/it-extcon-1.0/includes.php b/Protocols/EPP/eppExtensions/it-extcon-1.0/includes.php new file mode 100644 index 00000000..668e0a28 --- /dev/null +++ b/Protocols/EPP/eppExtensions/it-extcon-1.0/includes.php @@ -0,0 +1,9 @@ +addExtension('extcon-1.0', 'http://www.nic.it/ITNIC-EPP/extcon-1.0'); + +include_once(dirname(__FILE__) . '/eppData/itEppContact.php'); +include_once(dirname(__FILE__) . '/eppRequests/itEppCreateContactRequest.php'); +include_once(dirname(__FILE__) . '/eppResponses/itEppInfoContactResponse.php'); + +$this->addCommandResponse('Metaregistrar\EPP\itEppCreateContactRequest', 'Metaregistrar\EPP\eppCreateContactResponse'); +$this->addCommandResponse('Metaregistrar\EPP\eppInfoContactRequest', 'Metaregistrar\EPP\itEppInfoContactResponse'); From bce6c6dbee94a8334d6838c177309c5f67b76ff1 Mon Sep 17 00:00:00 2001 From: bessone Date: Fri, 10 Oct 2025 14:52:58 +0200 Subject: [PATCH 4/6] Add it-extdom-2.0 extension, still empty only for valid login --- Protocols/EPP/eppExtensions/it-extdom-2.0/includes.php | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Protocols/EPP/eppExtensions/it-extdom-2.0/includes.php diff --git a/Protocols/EPP/eppExtensions/it-extdom-2.0/includes.php b/Protocols/EPP/eppExtensions/it-extdom-2.0/includes.php new file mode 100644 index 00000000..437f9332 --- /dev/null +++ b/Protocols/EPP/eppExtensions/it-extdom-2.0/includes.php @@ -0,0 +1,2 @@ +addExtension('extdom-2.0', 'http://www.nic.it/ITNIC-EPP/extdom-2.0'); From b1217d4606a338957143344000640371632a988a Mon Sep 17 00:00:00 2001 From: bessone Date: Fri, 10 Oct 2025 14:54:18 +0200 Subject: [PATCH 5/6] Add it-extsecdns-1.0 extension, still empty only for valid login --- Protocols/EPP/eppExtensions/it-extsecdns-1.0/includes.php | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Protocols/EPP/eppExtensions/it-extsecdns-1.0/includes.php diff --git a/Protocols/EPP/eppExtensions/it-extsecdns-1.0/includes.php b/Protocols/EPP/eppExtensions/it-extsecdns-1.0/includes.php new file mode 100644 index 00000000..49df09f7 --- /dev/null +++ b/Protocols/EPP/eppExtensions/it-extsecdns-1.0/includes.php @@ -0,0 +1,2 @@ +addExtension('extsecDNS-1.0', 'http://www.nic.it/ITNIC-EPP/extsecDNS-1.0'); From 06defad983eb20fa3036de7acb292cbf7c646dbc Mon Sep 17 00:00:00 2001 From: bessone Date: Fri, 10 Oct 2025 15:45:06 +0200 Subject: [PATCH 6/6] Add it-extdom-2.0 extension responses for domain creation and info --- .../itEppCreateDomainResponse.php | 16 +++++++++++++ .../eppResponses/itEppInfoDomainResponse.php | 24 +++++++++++++++++++ .../eppExtensions/it-extdom-2.0/includes.php | 6 +++++ 3 files changed, 46 insertions(+) create mode 100644 Protocols/EPP/eppExtensions/it-extdom-2.0/eppResponses/itEppCreateDomainResponse.php create mode 100644 Protocols/EPP/eppExtensions/it-extdom-2.0/eppResponses/itEppInfoDomainResponse.php diff --git a/Protocols/EPP/eppExtensions/it-extdom-2.0/eppResponses/itEppCreateDomainResponse.php b/Protocols/EPP/eppExtensions/it-extdom-2.0/eppResponses/itEppCreateDomainResponse.php new file mode 100644 index 00000000..e47bf84e --- /dev/null +++ b/Protocols/EPP/eppExtensions/it-extdom-2.0/eppResponses/itEppCreateDomainResponse.php @@ -0,0 +1,16 @@ +queryPath('/epp:epp/epp:response/epp:extension/extdom:remappedIdnData/extdom:idnRequested'); + } + + public function getIdnCreated() + { + return $this->queryPath('/epp:epp/epp:response/epp:extension/extdom:remappedIdnData/extdom:idnCreated'); + } +} diff --git a/Protocols/EPP/eppExtensions/it-extdom-2.0/eppResponses/itEppInfoDomainResponse.php b/Protocols/EPP/eppExtensions/it-extdom-2.0/eppResponses/itEppInfoDomainResponse.php new file mode 100644 index 00000000..38852ca8 --- /dev/null +++ b/Protocols/EPP/eppExtensions/it-extdom-2.0/eppResponses/itEppInfoDomainResponse.php @@ -0,0 +1,24 @@ +xPath(); + $result = $xpath->query('/epp:epp/epp:response/epp:extension/extdom:infData/extdom:ownStatus'); + + foreach ($result as $status) { + /** @var \DOMElement $status */ + $statuses[] = new eppStatus( + $status->getAttribute('s'), + $status->getAttribute('lang'), + $status->nodeValue + ); + } + + return $statuses; + } +} diff --git a/Protocols/EPP/eppExtensions/it-extdom-2.0/includes.php b/Protocols/EPP/eppExtensions/it-extdom-2.0/includes.php index 437f9332..95a028d2 100644 --- a/Protocols/EPP/eppExtensions/it-extdom-2.0/includes.php +++ b/Protocols/EPP/eppExtensions/it-extdom-2.0/includes.php @@ -1,2 +1,8 @@ addExtension('extdom-2.0', 'http://www.nic.it/ITNIC-EPP/extdom-2.0'); + +include_once(dirname(__FILE__) . '/eppResponses/itEppCreateDomainResponse.php'); +include_once(dirname(__FILE__) . '/eppResponses/itEppInfoDomainResponse.php'); + +$this->addCommandResponse('Metaregistrar\EPP\eppCreateDomainRequest', 'Metaregistrar\EPP\itEppCreateDomainResponse'); +$this->addCommandResponse('Metaregistrar\EPP\eppInfoDomainRequest', 'Metaregistrar\EPP\itEppInfoDomainResponse'); \ No newline at end of file