__DIR__ . '/../cache', 'auto_reload' => true, ]); $record = ""; $desc = ""; $error = ""; $result = []; 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 (!$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 { /* Check if such domain name already registered */ $STH = $pdo->query("SELECT COUNT(*) FROM `hosts` WHERE `host` = '" . $domain . "' LIMIT 1"); if (isset($parsed["commands"]["action"])) { 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 .= "."; } 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 (!$pdo->query("SELECT COUNT(*) FROM `hosts` WHERE `host` = '" . $parsed["commands"]["oldname"] . "' AND `base64` = '" . $parsed["commands"]["olddest"] . "' LIMIT 1")->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->exec("INSERT INTO `hosts` (`host`, `base64`, `base32`) VALUES ('" . $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 { if (!$pdo->query("SELECT COUNT(*) FROM `hosts` WHERE `host` = '" . $domain . "' AND `base64` = '" . $parsed["commands"]["olddest"] . "' LIMIT 1")->fetchColumn()) { $result["error"] = "Error while validating: old base64 and value in olddest field does not match.."; } else { $base32 = $util->b32from64($parsed["b64"]); if (!$pdo->exec("UPDATE `hosts` SET `base64` = '" . $parsed["b64"] . "', `base32` = '" . $base32 . "' WHERE `host` = '" . $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"]; } if (!$pdo->query("SELECT COUNT(*) FROM `hosts` WHERE `host` = '" . $olddomain . "' AND `base64` = '" . parsed["b64"] . "' LIMIT 1")->fetchColumn()) { $result["error"] = "Error while validating: base64 does not match for domain in oldname field..."; } else { $base32 = $util->b32from64($parsed["b64"]); if (!$pdo->exec("INSERT INTO `hosts` (`host`, `base64`, `base32`) VALUES ('" . $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 { if($STH->fetchColumn() == 1) { $result["error"] = "Error while validating: That domain is already registered."; } 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 { $base32 = $util->b32from64($parsed["b64"]); /* Adding to database 2LD domain */ if (!$pdo->exec("INSERT INTO `hosts` (`host`, `base64`, `base32`) VALUES ('" . $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]);