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