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

<?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]);