diff --git a/epp/epp.php b/epp/epp.php index e63081d..9e5f753 100644 --- a/epp/epp.php +++ b/epp/epp.php @@ -16,7 +16,19 @@ $db = new PDO('mysql:host=localhost;dbname=epp', 'username', 'password'); $server = new Server('0.0.0.0', 700); $server->handle(function (Connection $conn) use ($table, $db) { - $data = $conn->recv(); + $lengthData = $conn->recv(4); + if ($lengthData === false || strlen($lengthData) !== 4) { + sendEppError($conn, 2100, 'Framing error'); + return; + } + + $length = unpack('N', $lengthData)[1]; + $data = $conn->recv($length - 4); + + if ($data === false || strlen($data) !== $length - 4) { + sendEppError($conn, 2100, 'Framing error'); + return; + } $xml = simplexml_load_string($data); if ($xml === false) { @@ -52,6 +64,12 @@ $server->handle(function (Connection $conn) use ($table, $db) { sendEppError($conn, 2202, 'Authorization error'); return; } + + // Parsing a contact:create command + if ($xml->getName() == 'epp' && isset($xml->command->{'create'}->{'contact:create'})) { + processContactCreate($conn, $db, $xml); + return; + } // Parsing a domain:check command if ($xml->getName() == 'epp' && isset($xml->command->{'check'}->{'domain:check'})) { @@ -64,6 +82,63 @@ $server->handle(function (Connection $conn) use ($table, $db) { $server->start(); +function processContactCreate($conn, $db, $xml) { + if (!isset($xml->command->create->{'contact:create'})) { + sendEppError($conn, 2005, 'Syntax error'); + return; + } + + $contactCreate = $xml->command->create->{'contact:create'}; + $contactID = (string) $contactCreate->{'contact:id'}; + $postalInfo = $contactCreate->{'contact:postalInfo'}; + $email = (string) $contactCreate->{'contact:email'}; + $voice = (string) $contactCreate->{'contact:voice'}; + $fax = (string) $contactCreate->{'contact:fax'}; + $password = (string) $contactCreate->{'contact:authInfo'}->{'contact:pw'}; + + $name = (string) $postalInfo->{'contact:name'}; + $org = (string) $postalInfo->{'contact:org'}; + $addr = $postalInfo->{'contact:addr'}; + $street = (string) $addr->{'contact:street'}; + $city = (string) $addr->{'contact:city'}; + $sp = (string) $addr->{'contact:sp'}; + $pc = (string) $addr->{'contact:pc'}; + $cc = (string) $addr->{'contact:cc'}; + + try { + $stmt = $db->prepare("INSERT INTO contacts (id, name, org, street, city, state_province, postal_code, country_code, email, voice, fax, password) VALUES (:id, :name, :org, :street, :city, :sp, :pc, :cc, :email, :voice, :fax, :password)"); + $stmt->execute([ + 'id' => $contactID, + 'name' => $name, + 'org' => $org, + 'street' => $street, + 'city' => $city, + 'sp' => $sp, + 'pc' => $pc, + 'cc' => $cc, + 'email' => $email, + 'voice' => $voice, + 'fax' => $fax, + 'password' => password_hash($password, PASSWORD_DEFAULT) + ]); + + $response = << + + + + Contact created successfully + + + +XML; + + $conn->send($response); + } catch (PDOException $e) { + sendEppError($conn, 2400, 'Database error'); + } +} + function processDomainCheck($conn, $db, $xml) { $domains = $xml->command->{'check'}->{'domain:check'}->children('domain', true); $response = 'Command completed successfully'; @@ -76,7 +151,10 @@ function processDomainCheck($conn, $db, $xml) { } $response .= ''; - $conn->send($response); + $length = strlen($response) + 4; // Total length including the 4-byte header + $lengthData = pack('N', $length); // Pack the length into 4 bytes + + $conn->send($lengthData . $response); } function checkLogin($db, $clID, $pw) {