Zuletzt geändert am 12. Oktober 2018 um 22:03

Domain-Registrar-Module erstellen

Sie können an sourceDESK eigene Domain-Registrare anbinden, um Domains über diese zu registrieren und zu verwalten.

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
    • E-Mail
    • 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;
	}
}