PDO::ERRMODE_WARNING, PDO::ATTR_PERSISTENT=>PERSISTENT]); }catch(PDOException $e){ die('No Connection to MySQL database!'); } header('Content-Type: text/html; charset=UTF-8'); session_start(); if(!empty($_SESSION['hosting_username'])){ header('Location: home.php'); exit; } echo '
'; echo 'Info | Register | Login | List of hosted sites | FAQ
'; if($_SERVER['REQUEST_METHOD']==='POST'){ $ok=true; $onion=''; $public=0; $php=0; $autoindex=0; $hash=''; $priv_key=''; if(empty($_POST['pass'])){ echo 'Error, password empty.
'; $ok=false; }elseif(empty($_POST['passconfirm']) || $_POST['pass']!==$_POST['passconfirm']){ echo 'Error, password confirmation does not match.
'; $ok=false; } if(empty($_POST['username'])){ echo 'Error, username empty.
'; $ok=false; }elseif(preg_match('/[^a-z0-9\-_\.]/', $_POST['username'])){ echo 'Error, username may only contain characters that are in the rage of a-z (lower case) - . _ and 0-9.
'; $ok=false; }elseif(strlen($_POST['username'])>50){ echo 'Error, username may not be longer than 50 characters.
'; $ok=false; }else{ $stmt=$db->prepare('SELECT null FROM users WHERE username=?;'); $stmt->execute([$_POST['username']]); if($stmt->fetch(PDO::FETCH_NUM)){ echo 'Error, this username is already registered.
'; $ok=false; } } if(CAPTCHA){ if(!isset($_REQUEST['challenge'])){ echo 'Error: Wrong Captcha
'; $ok=false; }else{ $stmt=$db->prepare('SELECT code FROM captcha WHERE id=?;'); $stmt->execute([$_REQUEST['challenge']]); $stmt->bindColumn(1, $code); if(!$stmt->fetch(PDO::FETCH_BOUND)){ echo 'Error: Captcha expired
'; $ok=false; }else{ $time=time(); $stmt=$db->prepare('DELETE FROM captcha WHERE id=? OR time;'); $stmt->execute([$_REQUEST['challenge'], $time-3600]); if($_REQUEST['captcha']!==$code){ if(strrev($_REQUEST['captcha'])!==$code){ echo 'Error: Wrong captcha
'; $ok=false; } } } } } $check=$db->prepare('SELECT null FROM users WHERE onion=?;'); if(isset($_REQUEST['private_key']) && !empty(trim($_REQUEST['private_key']))){ $priv_key=trim($_REQUEST['private_key']); if(($pkey=openssl_pkey_get_private($priv_key))!==false){ $details=openssl_pkey_get_details($pkey); if($details['bits']!==1024){ echo 'Error, private key not of bitsize 1024.
'; $ok=false; }else{ $onion=get_onion($pkey); $check->execute([$onion]); if($check->fetch(PDO::FETCH_NUM)){ echo 'Error onion already exists.
'; $ok=false; } } openssl_pkey_free($pkey); }else{ echo 'Error, private key invalid.
'; $ok=false; } }else{ do{ $pkey=openssl_pkey_new(['private_key_bits'=>1024, 'private_key_type'=>OPENSSL_KEYTYPE_RSA]); openssl_pkey_export($pkey, $priv_key); $onion=get_onion($pkey); openssl_pkey_free($pkey); $check->execute([$onion]); }while($check->fetch(PDO::FETCH_NUM)); } if($ok){ if(isset($_POST['public']) && $_POST['public']==1){ $public=1; } if(isset($_POST['php']) && in_array($_POST['php'], [1, 2, 3])){ $php=$_POST['php']; } if(isset($_POST['autoindex']) && $_POST['autoindex']==1){ $autoindex=1; } $priv_key=trim(str_replace("\r", '', $priv_key)); $hash=password_hash($_POST['pass'], PASSWORD_DEFAULT); } $check=$db->prepare('SELECT null FROM users WHERE dateadded>?;'); $check->execute([time()-60]); if($check->fetch(PDO::FETCH_NUM)){ echo 'To prevent abuse a site can only be registered every 60 seconds, but one has already been registered within the last 60 seconds. Please try again.
'; $ok=false; }elseif($ok){ $stmt=$db->prepare('INSERT INTO users (username, password, onion, private_key, dateadded, public, php, autoindex) VALUES (?, ?, ?, ?, ?, ?, ?, ?);'); $stmt->execute([$_POST['username'], $hash, $onion, $priv_key, time(), $public, $php, $autoindex]); $create_user=$db->prepare("CREATE USER '$onion.onion'@'%' IDENTIFIED BY ?;"); $create_user->execute([$_POST['pass']]); $db->exec("CREATE DATABASE IF NOT EXISTS `$onion`;"); $db->exec("GRANT ALL PRIVILEGES ON `$onion`.* TO '$onion.onion'@'%';"); $db->exec('FLUSH PRIVILEGES;'); $stmt=$db->prepare('INSERT INTO new_account (onion, password) VALUES (?, ?);'); $stmt->execute([$onion, get_system_hash($_POST['pass'])]); if(EMAIL_TO!==''){ $title="A new hidden service $onion has been created"; $msg="A new hidden service http://$onion.onion has been created"; $headers="From: www-dataYour onion domain $onion.onion has successfully been created. Please wait up to one minute until the changes have been processed. You can then login here.
"; } } echo ''; echo '';