mirror of https://github.com/PurpleI2P/regi2p.git
Domain registry project
http://reg.i2p/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
262 lines
14 KiB
262 lines
14 KiB
<?php |
|
|
|
require_once __DIR__ . '/../lib/twig.php'; |
|
|
|
$all = false; |
|
$record = ""; |
|
$desc = ""; |
|
|
|
$error = ""; |
|
$result = []; |
|
|
|
if (isset($_POST["all"]) || isset($_GET["all"])) |
|
$all = true; |
|
|
|
if (isset($_POST["record"]) && !empty($_POST["record"])) { |
|
$record = (string) $_POST["record"]; |
|
|
|
if (isset($_POST["desc"]) && !empty($_POST["desc"])) { |
|
$desc = htmlspecialchars((string) $_POST["desc"]); |
|
} |
|
|
|
$pdo = (new App\DB($options))->pdo; |
|
$util = new App\Utils; |
|
|
|
$parsed = $util->parseHostRecord($record); |
|
|
|
if (!isset($parsed['host'])) { |
|
$result["error"] = "Error while validating: Incorrect Auth string"; |
|
|
|
} else if (strlen($desc) > $options['desclength']) { |
|
$result["error"] = "Error while validating: Too long description"; |
|
|
|
} else if (!$util->isValidDomain($parsed['host'], $error)) { |
|
$result["error"] = "Error while validating: " . $error; |
|
|
|
} else { |
|
$domain_low = mb_strtolower($parsed['host']); |
|
if ($util->isPunycodeDomain($domain_low)) { |
|
$domain = idn_to_utf8($domain_low, 0, INTL_IDNA_VARIANT_UTS46); |
|
|
|
} else { |
|
$domain = $domain_low; |
|
} |
|
|
|
if (!isset($parsed["commands"]) || !isset($parsed["commands"]["sig"])) { |
|
$result["error"] = "Error while validating: No extended record fields or signature is found."; |
|
|
|
} else if (!$util->verifyHostRecord($record, $error)) { |
|
$result["error"] = "Error while validating: " . $error[0]; |
|
|
|
} else { |
|
if (isset($parsed["commands"]["action"])) { |
|
/* Check if such domain name already registered */ |
|
$STH = $pdo->prepare('SELECT COUNT(*) FROM `hosts` WHERE `host` = ? LIMIT 1'); |
|
$STH->execute([$domain]); |
|
|
|
switch ($parsed["commands"]["action"]) { |
|
case 'addsubdomain': |
|
if ($STH->fetchColumn() == 1) { |
|
$result["error"] = "Error while validating: That subdomain is already registered."; |
|
|
|
} else if (!isset($parsed["commands"]["oldname"]) || !isset($parsed["commands"]["olddest"]) || !isset($parsed["commands"]["oldsig"])) { |
|
$result["error"] = "Error while validating: required fields not found. Re-check your registration string."; |
|
|
|
} else { |
|
/* Getting domain at higher level (2LD for registering 3LD and etc.) and validating that domain is lower than 2LD. */ |
|
$darr = explode(".", $domain); |
|
$dtop = ""; |
|
|
|
for ($i = 1; $i < sizeof ($darr); $i++) { |
|
$dtop .= $darr[$i]; |
|
if ((sizeof ($darr) - 1) != $i) $dtop .= "."; |
|
} |
|
|
|
$STH = $pdo->prepare('SELECT COUNT(*) FROM `hosts` WHERE `host` = ? AND `base64` = ? LIMIT 1'); |
|
|
|
if (sizeof($darr) < 3) { |
|
$result["error"] = "Error while validating: you can't register second level domain (example.i2p) using addsubdomain action."; |
|
|
|
} else if ($dtop != $parsed["commands"]["oldname"]) { |
|
$result["error"] = "Error while validating: oldname value is not same as your higher level domain."; |
|
|
|
} else if (!$STH->execute([$parsed["commands"]["oldname"], $parsed["commands"]["olddest"]]) || !$STH->fetchColumn()) { |
|
$result["error"] = "Error while validating: can't find higher level domain with values from oldname and olddest."; |
|
|
|
} else { |
|
$base32 = $util->b32from64($parsed["b64"]); |
|
|
|
$STH = $pdo->prepare('INSERT INTO `hosts` (`host`, `base64`, `base32`, `description`) VALUES (?, ?, ?, ?)'); |
|
if (!$STH->execute([$domain, $parsed["b64"], $base32, htmlspecialchars($desc)])) { |
|
$result["error"] = "Error happened while inserting record to database. Please try again later."; |
|
|
|
} else { |
|
$result["command"] = 'addsubdomain'; |
|
$result["host"] = $domain; |
|
$result["base64"] = $parsed["b64"]; |
|
$result["base32"] = $base32; |
|
$result["desc"] = $desc; |
|
} |
|
} |
|
} |
|
break; |
|
case 'adddest': |
|
case 'changedest': |
|
if($STH->fetchColumn() == 0) { |
|
$result["error"] = "Error while validating: That domain is not registered."; |
|
|
|
} else if (!isset($parsed["commands"]["olddest"]) || !isset($parsed["commands"]["oldsig"])) { |
|
$result["error"] = "Error while validating: required fields not found. Re-check your registration string."; |
|
|
|
} else { |
|
$STH = $pdo->prepare('SELECT COUNT(*) FROM `hosts` WHERE `host` = ? AND `base64` = ? LIMIT 1'); |
|
|
|
if (!$STH->execute([$domain, $parsed["commands"]["olddest"]]) || !$STH->fetchColumn()) { |
|
$result["error"] = "Error while validating: old base64 and value in olddest field does not match.."; |
|
|
|
} else { |
|
$base32 = $util->b32from64($parsed["b64"]); |
|
|
|
if (!empty($desc)) { |
|
$STH = $pdo->prepare('UPDATE `hosts` SET `base64` = ?, `base32` = ?, `description` = ? WHERE `host` = ?'); |
|
$args = [$parsed["b64"], $base32, $domain, $desc]; |
|
} else { |
|
$STH = $pdo->prepare('UPDATE `hosts` SET `base64` = ?, `base32` = ? WHERE `host` = ?'); |
|
$args = [$parsed["b64"], $base32, $domain]; |
|
} |
|
if (!$STH->execute($args)) { |
|
$result["error"] = "Error happened while updating record in database. Please try again later."; |
|
|
|
} else { |
|
$result["command"] = 'changedest'; |
|
$result["host"] = $domain; |
|
$result["base64"] = $parsed["b64"]; |
|
$result["base32"] = $base32; |
|
$result["desc"] = $desc; |
|
} |
|
} |
|
} |
|
break; |
|
case 'addname': |
|
if($STH->fetchColumn() == 1) { |
|
$result["error"] = "Error while validating: That domain is already registered."; |
|
|
|
/* Getting domain level (2LD, 3LD and etc.) and validating that domain at higher level is registered (2LD if registering 3LD). */ |
|
} else if (sizeof(explode(".", $domain)) > 2) { |
|
$result["error"] = "Error while validating: you can't register subdomain (sub.example.i2p) as domain alias using addname action."; |
|
|
|
} else if (!isset($parsed["commands"]["oldname"])) { |
|
$result["error"] = "Error while validating: required fields not found. Re-check your registration string."; |
|
|
|
} else { |
|
if ($util->isPunycodeDomain($parsed["commands"]["oldname"])) { |
|
$olddomain = idn_to_utf8($parsed["commands"]["oldname"], 0, INTL_IDNA_VARIANT_UTS46); |
|
|
|
} else { |
|
$olddomain = $parsed["commands"]["oldname"]; |
|
} |
|
|
|
$STH = $pdo->prepare('SELECT COUNT(*) FROM `hosts` WHERE `host` = ? AND `base64` = ? LIMIT 1'); |
|
|
|
if (!$STH->execute([$olddomain, parsed["b64"]]) || !$STH->fetchColumn()) { |
|
$result["error"] = "Error while validating: base64 does not match for domain in oldname field..."; |
|
|
|
} else { |
|
$base32 = $util->b32from64($parsed["b64"]); |
|
|
|
$STH = $pdo->prepare('INSERT INTO `hosts` (`host`, `base64`, `base32`, `description`) VALUES (?, ?, ?, ?)'); |
|
if (!$STH->execute([$domain, $parsed["b64"], $base32, $desc])) { |
|
$result["error"] = "Error happened while updating record in database. Please try again later."; |
|
|
|
} else { |
|
$result["command"] = 'addname'; |
|
$result["host"] = $domain; |
|
$result["base64"] = $parsed["b64"]; |
|
$result["base32"] = $base32; |
|
$result["desc"] = $desc; |
|
} |
|
} |
|
} |
|
break; |
|
default: |
|
$result["error"] = "Error while validating: extended record fields are NOT supported."; |
|
break; |
|
} |
|
|
|
} else { |
|
/* Check if such domain name already registered */ |
|
$STH = $pdo->prepare('SELECT `host`, `base32`, `base64`, `initial`, `disabled` FROM `hosts` WHERE `host` = ? LIMIT 1'); |
|
$STH->execute([$domain]); |
|
$row = $STH->fetch(PDO::FETCH_ASSOC); |
|
|
|
if($row && !$row['disabled']) { |
|
$result["error"] = "Error while validating: That domain is already registered."; |
|
|
|
} else if($row && $row['disabled'] && $row['initial']) { |
|
$result["error"] = "Error while validating: That domain is reserved and can't be re-registered automatically. Please contact service support team."; |
|
|
|
} else { |
|
if (isset($parsed["commands"]["oldname"]) || isset($parsed["commands"]["olddest"]) || isset($parsed["commands"]["oldsig"])) { |
|
$result["error"] = "Error while validating: unexpected fields found."; |
|
|
|
} else if (sizeof(explode(".", $domain)) > 2) { |
|
$result["error"] = "Error while validating: you can't register subdomain without specific action field."; |
|
|
|
} else { |
|
$result["reregister"] = false; |
|
if($row && $row['disabled']) { /* processing disabled domain */ |
|
$log = "[" . date("d-M-Y H:i:s e") . "] Re-registering attempt for " . $row['host'] . "! Next records will be deleted:" . PHP_EOL; |
|
|
|
/* print all records, which will be deleted*/ |
|
$STH = $pdo->prepare('SELECT `host`, `base32`, `base64` FROM `hosts` WHERE `host` = ? OR `host` LIKE ?'); |
|
$STH->execute([$domain, '%.'.$domain]); |
|
$hosts = $STH->fetchAll(PDO::FETCH_ASSOC); |
|
foreach ($hosts as $host) { |
|
$log .= "Host: " . $host['host'] . PHP_EOL . "Base32: " . $host['base32'] . PHP_EOL . "Base64: " . $host['base64'] . PHP_EOL; |
|
} |
|
|
|
file_put_contents(__DIR__ . '/../logs/reg.log', $log, FILE_APPEND); |
|
|
|
/* copy records of re-registered domain with subdomains to 'outdated' table and delete them from 'hosts' */ |
|
$STH = $pdo->prepare( |
|
'INSERT INTO `outdated` (`host`, `base64`, `base32`, `description`, `add_date`, `last_seen`) ' . |
|
' SELECT `host`, `base64`, `base32`, `description`, `add_date`, `last_seen` FROM `hosts` ' . |
|
' WHERE `host` = ? OR `host` LIKE ?; ' . |
|
'DELETE FROM `hosts` WHERE `host` = ? OR `host` LIKE ?'); |
|
$STH->execute([$domain, '%.'.$domain, $domain, '%.'.$domain]); |
|
|
|
$result["reregister"] = true; |
|
} |
|
|
|
$base32 = $util->b32from64($parsed["b64"]); |
|
|
|
/* Adding to database 2LD domain */ |
|
$STH = $pdo->prepare('INSERT INTO `hosts` (`host`, `base64`, `base32`, `description`) VALUES (?, ?, ?, ?)'); |
|
if (!$STH->execute([$domain, $parsed["b64"], $base32, $desc])) { |
|
$result["error"] = "Error happened while inserting record to database. Please try again later."; |
|
|
|
} else { |
|
$result["command"] = 'add'; |
|
$result["host"] = $domain; |
|
$result["base64"] = $parsed["b64"]; |
|
$result["base32"] = $base32; |
|
$result["desc"] = $desc; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
} else if (isset($_POST["desc"]) && !empty($_POST["desc"])) { |
|
$result["error"] = "Authentication string is required for registering record."; |
|
} |
|
|
|
if (!empty($result)) { |
|
$record = $desc = ""; // clear them if any result present |
|
} |
|
|
|
$pdo = null; |
|
|
|
$template = $twig->load('add.twig'); |
|
echo $template->render(['record' => $record, 'desc' => $desc, 'desclength' => $options['desclength'], 'result' => $result, 'all' => $all]);
|
|
|