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.
176 lines
9.0 KiB
176 lines
9.0 KiB
<?php |
|
|
|
require_once __DIR__ . '/../vendor/autoload.php'; |
|
require_once __DIR__ . '/../config.php'; |
|
|
|
/* Initialize Twig engine */ |
|
$loader = new \Twig\Loader\FilesystemLoader(__DIR__ . '/../templates'); |
|
$twig = new \Twig\Environment($loader, [ |
|
'cache' => __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->isValidAddress($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']; |
|
} |
|
|
|
/* Check if such domain name already registered */ |
|
$STH = $pdo->query("SELECT COUNT(*) FROM `hosts` WHERE `host` = '" . $domain . "' LIMIT 1"); |
|
|
|
if($STH->fetchColumn() == 1) { |
|
$result["error"] = "Error while validating: That domain is already registered."; |
|
|
|
} else { |
|
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"])) { |
|
switch ($parsed["commands"]["action"]) { |
|
case 'addsubdomain': |
|
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["host"] = $domain; |
|
$result["base64"] = $parsed["b64"]; |
|
$result["base32"] = $base32; |
|
} |
|
} |
|
} |
|
break; |
|
case 'adddest': |
|
case 'changedest': |
|
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["host"] = $domain; |
|
$result["base64"] = $parsed["b64"]; |
|
$result["base32"] = $base32; |
|
} |
|
} |
|
} |
|
break; |
|
case 'addname': |
|
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["host"] = $domain; |
|
$result["base64"] = $parsed["b64"]; |
|
$result["base32"] = $base32; |
|
} |
|
} |
|
} |
|
break; |
|
default: |
|
$result["error"] = "Error while validating: extended record fields are NOT supported for now."; |
|
break; |
|
} |
|
|
|
} 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["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]);
|
|
|