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