Domain-Registrar-Module erstellen
Sie können an sourceDESK eigene Domain-Registrare anbinden, um Domains über diese zu registrieren und zu verwalten.
Inhaltsverzeichnis
- 1 Dateistruktur
- 2 Attribute
- 3 Einstellungen
- 4 Domain-Verfügbarkeit
- 5 Domain registrieren / transferieren
- 6 Nameserver ändern
- 7 Kontakte ändern
- 8 Sonderfall: Trade
- 9 Authcode abrufen
- 10 Transfersperre / Verlängerung / WHOIS-Privacy
- 11 Domain löschen / in den Transit geben
- 12 Domain-Synchronisation
- 13 Beispiel-Code
Dateistruktur
Ein Registrar-Modul bekommt ein eigenes Verzeichnis unter modules/domain. In diesem Verzeichnis muss sich eine PHP-Datei mit dem gleichen Namen wie das Verzeichnis und der Endung .php befinden. In dieser PHP-Datei wird eine Klasse definiert, die von der Klasse DomainRegistrar erbt.
Attribute
Es werden mehrere Attribute innerhalb der erstellten Klasse benötigt, die höchstens protected sein dürfen:
- $name gibt einen Anzeigenamen für das Modul an
- $short gibt den Kurznamen des Moduls an, das entspricht dem Verzeichnis- bzw. Dateinamen
- $version gibt die Versionsnummer des Moduls an
Einstellungen
Sie können über die Methode getSettings() definieren, welche Einstellungen der Administrator für das Modul durchführen können soll. Ein Beispiel:
public function getSettings() { return Array( "api_url" => Array("type" => "text", "name" => "API-URL", "default" => "https://gateway.autodns.com"), "api_user" => Array("type" => "text", "name" => "API-Benutzer"), "api_password" => Array("type" => "password", "name" => "API-Passwort"), ); }
Auf die definierten Einstellungen können Sie innerhalb der Modul-Klasse bspw. mit dem Aufruf $this->options->api_url zugreifen.
Domain-Verfügbarkeit
Über die Methode availibilityStatus($domain)
wird die Verfügbarkeit der Domain $domain
geprüft. Folgende Rückgabewerte sind möglich:
-
true
, wenn die Domain verfügbar ist -
false
, wenn die Domain bereits registriert ist -
null
, falls die Domain nicht geprüft werden konnte / nicht registriert werden kann
Domain registrieren / transferieren
Die Registrierung erfolgt über die Methode registerDomain($domain, $owner, $admin, $tech, $zone, $ns, $privacy = false)
. Die Signatur der Methode zum Transfer lautet transferDomain($domain, $owner, $admin, $tech, $zone, $authCode, $ns, $privacy = false)
. Die Belegung der Variablen:
-
$domain
- der Domain-Name -
$owner, $admin, $tech, $zone
- Handle-Daten als Array- Vorname
- Nachname
- Firma
- Straße
- Land
- Postleitzahl
- Stadt
- Telefon
- Telefax
- Notizen
-
$authCode
- Auth-Code (nur bei Transfer) -
$ns
- Array mit Nameservern -
$privacy
- Boolean, der angibt, ob WHOIS-Privacy aktiviert ist
Als Rückgabe wird im Erfolgsfall true
erwartet, im Fehlerfall eine Fehlermeldung als String.
Nameserver ändern
Über die Methode changeNameserver($domain, $ns)
können die Nameserver der Domain $domain
geändert werden. Hierbei wird ein Array mit Nameserver-Hostnamen als $ns
übergeben.
Kontakte ändern
Die Methode changeContact($domain, $owner, $admin, $tech, $zone)
ändert die Kontakte der Domain $domain
.
Sonderfall: Trade
Der kostenpflichtige Kontaktwechsel (Trade) wird über die Methode trade($domain, $owner, $admin, $tech, $zone)
initiiert.
Authcode abrufen
Der automatische Abruf des Authcodes erfolgt über die Methode getAuthCode($domain)
. Als Rückgabewert ist im Fehlerfall false
zulässig, im Erfolgsfall ist der Authcode zurückgegeben, wobei vor diesen AUTH:
geschrieben werden muss.
Transfersperre / Verlängerung / WHOIS-Privacy
Das Setzen der Transfersperre, von Verlängerungsoptionen und WHOIS-Privacy erfolgt über die Methode changeValues($domain, $status = false, $renew = true, $privacy = false)
. Dabei stellen die drei Booleans folgende Werte dar:
-
$status
aktiviert die Transfersperre -
$renew
aktiviert die automatische Verlängerung -
$privacy
aktiviert WHOIS-Privacy
Domain löschen / in den Transit geben
Um eine Domain zu löschen oder in den Transit zu geben, nutzen Sie die Methode deleteDomain($domain, $transit = 0)
. Hierbei ist die Belegung von $transit
wie folgt möglich:
-
0
- Domain löschen -
1
- Konnektierter Transit -
2
- Dekonnektierter Transit
Domain-Synchronisation
Domains werden periodisch synchronisiert, dazu wird die Methode syncDomain($domain, $kkSync = false)
aufgerufen. Ist $kkSync
auf true
gesetzt, befindet sich die Domain noch im Transfer-Status. Sofern die Domain noch nicht transferiert wurde, ist Array("status" => "waiting_kk")
zurückzugegeben.
Die erwartete Rückgabe für eine registrierte Domain ist ein Array mit den folgenden Schlüsseln:
-
auto_renew
- Boolean, der den Status der automatischen Verlängerung zurückgibt -
expiration
- Datum des Domainablaufs im Format YYYY-MM-DD -
status
- Boolean, der den Status der Domain (aktiv/nicht aktiv) zurückgibt -
transfer_lock
- Boolean, der angibt, ob die Transfer-Sperre aktiviert ist -
privacy
- Boolean, der den Status der WHOIS-Privacy angibt
Beispiel-Code
<?php class InterNetWorX extends DomainRegistrar { protected $short = "inwx"; protected $name = "InterNetWorX"; protected $version = "1.0"; public function getSettings() { return Array( "api_user" => Array("type" => "text", "name" => "Benutzername"), "api_password" => Array("type" => "password", "name" => "Passwort"), ); } public function availibilityStatus($domain) { if (!function_exists('xmlrpc_encode_request')) { return null; } require_once __DIR__ . "/domrobot.class.php"; $addr = "https://api.domrobot.com/xmlrpc/"; $domrobot = new domrobot($addr); $domrobot->setDebug(false); $domrobot->setLanguage('en'); $res = $domrobot->login($this->options->api_user, $this->options->api_password); if ($res['code'] == "1000") { $res = $domrobot->call("domain", "check", Array("domain" => $domain), $this); } if (!isset($res['resData']['domain'][0]['avail']) || $res['resData']['domain'][0]['avail'] === null) { return null; } $domrobot->logout(); return (bool) $res['resData']['domain'][0]['avail']; } public function registerDomain($domain, $owner, $admin, $tech, $zone, $ns, $privacy = false) { require_once __DIR__ . "/domrobot.class.php"; $addr = "https://api.domrobot.com/xmlrpc/"; $domrobot = new domrobot($addr); $domrobot->setDebug(false); $domrobot->setLanguage('en'); $res = $domrobot->login($this->options->api_user, $this->options->api_password); if ($res['code'] != "1000") { return $res; } $arr = Array("owner", "admin", "tech", "zone"); foreach ($arr as $t) { $i = $$t; $i[7] = str_replace(Array(" ", "-", "/"), "", $i[7]); $i[8] = str_replace(Array(" ", "-", "/"), "", $i[8]); $res = $domrobot->call("contact", "create", Array( "type" => empty($i[2]) ? "PERSON" : "ORG", "name" => $i[0] . " " . $i[1], "org" => $i[2], "street" => str_replace(Array("ä", "ö", "ü", "ß", "Ä", "Ö", "Ü"), Array("ae", "oe", "ue", "ss", "Ae", "Oe", "Ue"), $i[3]), "city" => $i[6], "pc" => $i[5], "cc" => $i[4], "voice" => $i[7], "fax" => $i[8], "email" => $i[9], ), $this, $domain); if ($res['code'] != "1000") { return $res; } $$t = $res['resData']['id']; } $res = $domrobot->call("domain", "create", Array( "domain" => $domain, "registrant" => $owner, "admin" => $admin, "tech" => $tech, "billing" => $zone, "ns" => $ns, "renewalMode" => "AUTOEXPIRE", ), $this); if ($res['code'] != "1000" && $res['code'] != "1001") { return $res; } $domrobot->logout(); return true; } public function transferDomain($domain, $owner, $admin, $tech, $zone, $authCode, $ns, $privacy = false) { require_once __DIR__ . "/domrobot.class.php"; $addr = "https://api.domrobot.com/xmlrpc/"; $domrobot = new domrobot($addr); $domrobot->setDebug(false); $domrobot->setLanguage('en'); $res = $domrobot->login($this->options->api_user, $this->options->api_password); if ($res['code'] != "1000") { return $res; } $arr = Array("owner", "admin", "tech", "zone"); foreach ($arr as $t) { $i = $$t; $i[7] = str_replace(Array(" ", "-", "/"), "", $i[7]); $i[8] = str_replace(Array(" ", "-", "/"), "", $i[8]); $res = $domrobot->call("contact", "create", Array( "type" => empty($i[2]) ? "PERSON" : "ORG", "name" => $i[0] . " " . $i[1], "org" => $i[2], "street" => str_replace(Array("ä", "ö", "ü", "ß", "Ä", "Ö", "Ü"), Array("ae", "oe", "ue", "ss", "Ae", "Oe", "Ue"), $i[3]), "city" => $i[6], "pc" => $i[5], "cc" => $i[4], "voice" => $i[7], "fax" => $i[8], "email" => $i[9], ), $this, $domain); if ($res['code'] != "1000") { return $res; } $$t = $res['resData']['id']; } $res = $domrobot->call("domain", "transfer", Array( "domain" => $domain, "registrant" => $owner, "admin" => $admin, "tech" => $tech, "billing" => $zone, "ns" => $ns, "renewalMode" => "AUTOEXPIRE", "authCode" => $authCode, ), $this); if ($res['code'] != "1000" && $res['code'] != "1001") { return $res; } $domrobot->logout(); return true; } public function deleteDomain($domain, $transit = 0) { require_once __DIR__ . "/domrobot.class.php"; $addr = "https://api.domrobot.com/xmlrpc/"; $domrobot = new domrobot($addr); $domrobot->setDebug(false); $domrobot->setLanguage('en'); $res = $domrobot->login($this->options->api_user, $this->options->api_password); if ($res['code'] != "1000") { return false; } if ($transit == 0) { $res = $domrobot->call("domain", "delete", Array( "domain" => $domain, ), $this); } else { $res = $domrobot->call("domain", "push", Array( "domain" => $domain, ), $this); } if ($res['code'] != "1000" && $res['code'] != "1001") { return false; } return true; } public function getAuthCode($domain) { require_once __DIR__ . "/domrobot.class.php"; $addr = "https://api.domrobot.com/xmlrpc/"; $domrobot = new domrobot($addr); $domrobot->setDebug(false); $domrobot->setLanguage('en'); $res = $domrobot->login($this->options->api_user, $this->options->api_password); if ($res['code'] != "1000") { return false; } $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $count = mb_strlen($chars); for ($i = 0, $pwd = ''; $i < 12; $i++) { $index = rand(0, $count - 1); $pwd .= mb_substr($chars, $index, 1); } $res = $domrobot->call("domain", "update", Array( "domain" => $domain, "authCode" => $pwd, ), $this); if ($res['code'] != "1000" && $res['code'] != "1001") { return false; } return "AUTH:" . $pwd; } public function changeNameserver($domain, $ns) { require_once __DIR__ . "/domrobot.class.php"; $addr = "https://api.domrobot.com/xmlrpc/"; $domrobot = new domrobot($addr); $domrobot->setDebug(false); $domrobot->setLanguage('en'); $res = $domrobot->login($this->options->api_user, $this->options->api_password); if ($res['code'] != "1000") { return false; } $res = $domrobot->call("domain", "update", Array( "domain" => $domain, "ns" => $ns, ), $this); if ($res['code'] != "1000" && $res['code'] != "1001") { return false; } return true; } public function changeContact($domain, $owner, $admin, $tech, $zone) { require_once __DIR__ . "/domrobot.class.php"; $addr = "https://api.domrobot.com/xmlrpc/"; $domrobot = new domrobot($addr); $domrobot->setDebug(false); $domrobot->setLanguage('en'); $res = $domrobot->login($this->options->api_user, $this->options->api_password); if ($res['code'] != "1000") { return false; } $arr = Array("owner", "admin", "tech", "zone"); foreach ($arr as $t) { $i = $$t; $i[7] = str_replace(Array(" ", "-", "/"), "", $i[7]); $i[8] = str_replace(Array(" ", "-", "/"), "", $i[8]); $res = $domrobot->call("contact", "create", Array( "type" => empty($i[2]) ? "PERSON" : "ORG", "name" => $i[0] . " " . $i[1], "org" => $i[2], "street" => str_replace(Array("ä", "ö", "ü", "ß", "Ä", "Ö", "Ü"), Array("ae", "oe", "ue", "ss", "Ae", "Oe", "Ue"), $i[3]), "city" => $i[6], "pc" => $i[5], "cc" => $i[4], "voice" => $i[7], "fax" => $i[8], "email" => $i[9], ), $this, $domain); if ($res['code'] != "1000") { return false; } $$t = $res['resData']['id']; } $res = $domrobot->call("domain", "update", Array( "domain" => $domain, "registrant" => $owner, "admin" => $admin, "tech" => $tech, "billing" => $zone, ), $this); if ($res['code'] != "1000" && $res['code'] != "1001") { return false; } return true; } public function setRegLock($domain, $status = false, $error = false) { require_once __DIR__ . "/domrobot.class.php"; $addr = "https://api.domrobot.com/xmlrpc/"; $domrobot = new domrobot($addr); $domrobot->setDebug(false); $domrobot->setLanguage('en'); $res = $domrobot->login($this->options->api_user, $this->options->api_password); if ($res['code'] != "1000") { return $res; } $res = $domrobot->call("domain", "update", Array( "domain" => $domain, "transferLock" => $status, ), $this); if ($res['code'] != "1000" && $res['code'] != "1001") { return $res; } return true; } public function changeAll($domain, $owner, $admin, $tech, $zone, $ns, $status = false, $renew = true, $privacy = false) { require_once __DIR__ . "/domrobot.class.php"; $addr = "https://api.domrobot.com/xmlrpc/"; $domrobot = new domrobot($addr); $domrobot->setDebug(false); $domrobot->setLanguage('en'); $res = $domrobot->login($this->options->api_user, $this->options->api_password); if ($res['code'] != "1000") { return $res; } $arr = Array("owner", "admin", "tech", "zone"); foreach ($arr as $t) { $i = $$t; if (count($i) == 0) { $r = $this->syncDomain($domain); if (empty($r) || !is_array($r) || empty($r['ownerc'])) { return false; } $$t = $r['ownerc']; } else { $i[7] = str_replace(Array(" ", "-", "/"), "", $i[7]); $i[8] = str_replace(Array(" ", "-", "/"), "", $i[8]); $res = $domrobot->call("contact", "create", Array( "type" => empty($i[2]) ? "PERSON" : "ORG", "name" => $i[0] . " " . $i[1], "org" => $i[2], "street" => str_replace(Array("ä", "ö", "ü", "ß", "Ä", "Ö", "Ü"), Array("ae", "oe", "ue", "ss", "Ae", "Oe", "Ue"), $i[3]), "city" => $i[6], "pc" => $i[5], "cc" => $i[4], "voice" => $i[7], "fax" => $i[8], "email" => $i[9], ), $this, $domain); if ($res['code'] != "1000") { return $res; } $$t = $res['resData']['id']; } } $res = $domrobot->call("domain", "update", Array( "domain" => $domain, "registrant" => $owner, "admin" => $admin, "tech" => $tech, "billing" => $zone, "transferLock" => $status, "renewalMode" => $renew ? "AUTORENEW" : "AUTOEXPIRE", "ns" => $ns, ), $this); if ($res['code'] != "1000" && $res['code'] != "1001") { return $res; } return true; } public function syncDomain($domain, $kkSync = false) { require_once __DIR__ . "/domrobot.class.php"; $addr = "https://api.domrobot.com/xmlrpc/"; $domrobot = new domrobot($addr); $domrobot->setDebug(false); $domrobot->setLanguage('en'); $res = $domrobot->login($this->options->api_user, $this->options->api_password); if ($res['code'] != "1000") { return "Login failure"; } $res = $domrobot->call("domain", "info", Array( "domain" => $domain, ), $this); if ($res['code'] != "1000") { if ($kkSync) { return ["status" => "waiting_kk"]; } return false; } return Array( "auto_renew" => $res['resData']['renewalMode'] == "AUTORENEW", "expiration" => date("Y-m-d", $res['resData']['exDate']->timestamp), "status" => $res['resData']['status'] == "OK", "transfer_lock" => (bool) $res['resData']['transferLock'], "ownerc" => $res['resData']['contact']['registrant']['id'], "privacy" => false, ); } public function trade($domain, $owner, $admin, $tech, $zone) { require_once __DIR__ . "/domrobot.class.php"; $addr = "https://api.domrobot.com/xmlrpc/"; $domrobot = new domrobot($addr); $domrobot->setDebug(false); $domrobot->setLanguage('en'); $res = $domrobot->login($this->options->api_user, $this->options->api_password); if ($res['code'] != "1000") { return false; } $arr = Array("owner", "admin", "tech", "zone"); foreach ($arr as $t) { $i = $$t; $i[7] = str_replace(Array(" ", "-", "/"), "", $i[7]); $i[8] = str_replace(Array(" ", "-", "/"), "", $i[8]); $res = $domrobot->call("contact", "create", Array( "type" => empty($i[2]) ? "PERSON" : "ORG", "name" => $i[0] . " " . $i[1], "org" => $i[2], "street" => str_replace(Array("ä", "ö", "ü", "ß", "Ä", "Ö", "Ü"), Array("ae", "oe", "ue", "ss", "Ae", "Oe", "Ue"), $i[3]), "city" => $i[6], "pc" => $i[5], "cc" => $i[4], "voice" => $i[7], "fax" => $i[8], "email" => $i[9], ), $this, $domain); if ($res['code'] != "1000") { return false; } $$t = $res['resData']['id']; } $res = $domrobot->call("domain", "trade", Array( "domain" => $domain, "registrant" => $owner, "admin" => $admin, "tech" => $tech, "billing" => $zone, ), $this); if ($res['code'] != "1000" && $res['code'] != "1001") { return false; } return true; } public function changeValues($domain, $status = false, $renew = true, $privacy = false) { require_once __DIR__ . "/domrobot.class.php"; $addr = "https://api.domrobot.com/xmlrpc/"; $domrobot = new domrobot($addr); $domrobot->setDebug(false); $domrobot->setLanguage('en'); $res = $domrobot->login($this->options->api_user, $this->options->api_password); if ($res['code'] != "1000") { return $res; } $res = $domrobot->call("domain", "update", Array( "domain" => $domain, "renewalMode" => $renew ? "AUTORENEW" : "AUTOEXPIRE", "transferLock" => $status, ), $this); if ($res['code'] != "1000" && $res['code'] != "1001") { return $res; } return true; } }