__DIR__ . '/../cache', 'auto_reload' => true, ]); $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 = (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 (!$util->isValidDomain($parsed['host'], $error)) { $result["error"] = "Error while validating: " . $error; } else { if ($util->isPunycodeDomain($parsed['host'])) { $domain = idn_to_utf8($parsed['host'], 0, INTL_IDNA_VARIANT_UTS46); } else { $domain = $parsed['host']; } 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"]); if (!$pdo->prepare('INSERT INTO `hosts` (`host`, `base64`, `base32`) VALUES (?, ?, ?)')->execute([$domain, $parsed["b64"], $base32])) { $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; } } } 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 (!$pdo->prepare('UPDATE `hosts` SET `base64` = ?, `base32` = ? WHERE `host` = ?')->execute([$parsed["b64"], $base32, $domain])) { $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; } } } 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"]); if (!$pdo->prepare('INSERT INTO `hosts` (`host`, `base64`, `base32`) VALUES (?, ?, ?)')->execute([$domain, $parsed["b64"], $base32])) { $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; } } } 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); /* remove domain and subdomains if any found */ $pdo->prepare('DELETE FROM `hosts` WHERE `host` = ? OR `host` LIKE ?')->execute([$domain, '%'.$domain]); $result["reregister"] = true; } $base32 = $util->b32from64($parsed["b64"]); /* Adding to database 2LD domain */ if (!$pdo->prepare('INSERT INTO `hosts` (`host`, `base64`, `base32`) VALUES (?, ?, ?)')->execute([$domain, $parsed["b64"], $base32])) { $result["error"] = "Error happened while inserting record to database. Please try again later."; } else { $result["command"] = 'added'; $result["host"] = $domain; $result["base64"] = $parsed["b64"]; $result["base32"] = $base32; } } } } } } } 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, 'result' => $result, 'all' => $all]);