From 6b19346b2064615aeb289c6c3c08114a94b511e3 Mon Sep 17 00:00:00 2001 From: Daniel Winzen Date: Sat, 2 Nov 2019 19:41:05 +0100 Subject: [PATCH] Various optimizations --- var/www/common.php | 59 +++++++++++++++++++++++++++----------- var/www/cron.php | 12 +++----- var/www/find_old.php | 6 +--- var/www/html/admin.php | 60 ++++++++++++++++++++------------------- var/www/html/delete.php | 6 +--- var/www/html/faq.php | 1 + var/www/html/files.php | 18 +++++------- var/www/html/home.php | 31 +++++++++----------- var/www/html/index.php | 1 + var/www/html/list.php | 38 +++++++++++++------------ var/www/html/log.php | 5 ---- var/www/html/login.php | 6 +--- var/www/html/password.php | 6 +--- var/www/html/register.php | 14 ++++----- var/www/setup.php | 7 +++-- 15 files changed, 134 insertions(+), 136 deletions(-) diff --git a/var/www/common.php b/var/www/common.php index 8a64de0..72bc793 100644 --- a/var/www/common.php +++ b/var/www/common.php @@ -166,7 +166,6 @@ function base32_encode(string $input) : string { } function send_captcha() { - global $db; if(!CAPTCHA || !extension_loaded('gd')){ return; } @@ -178,6 +177,7 @@ function send_captcha() { } $randid = mt_rand(); $time = time(); + $db = get_db_instance(); $stmt = $db->prepare('INSERT INTO captcha (id, time, code) VALUES (?, ?, ?);'); $stmt->execute([$randid, $time, $code]); echo "Copy: "; @@ -264,7 +264,6 @@ function send_captcha() { } function check_login(){ - global $db; if(empty($_SESSION['csrf_token'])){ $_SESSION['csrf_token']=sha1(uniqid()); } @@ -273,6 +272,7 @@ function check_login(){ session_destroy(); exit; } + $db = get_db_instance(); $stmt=$db->prepare('SELECT * FROM users WHERE username=?;'); $stmt->execute([$_SESSION['hosting_username']]); if(!$user=$stmt->fetch(PDO::FETCH_ASSOC)){ @@ -293,11 +293,11 @@ function get_system_hash($pass) { } function check_captcha_error() { - global $db; if(CAPTCHA){ if(!isset($_REQUEST['challenge'])){ return 'Error: Wrong Captcha'; }else{ + $db = get_db_instance(); $stmt=$db->prepare('SELECT code FROM captcha WHERE id=?;'); $stmt->execute([$_REQUEST['challenge']]); $stmt->bindColumn(1, $code); @@ -318,7 +318,8 @@ function check_captcha_error() { return false; } -function rewrite_torrc(PDO $db, string $instance){ +function rewrite_torrc(string $instance){ + $db = get_db_instance(); $update_onion=$db->prepare('UPDATE onions SET private_key=? WHERE onion=?;'); $torrc='ClientUseIPv6 1 ClientUseIPv4 1 @@ -466,7 +467,8 @@ function ed25519_seckey_expand(string $seed) : string { return $sk; } -function rewrite_nginx_config(PDO $db){ +function rewrite_nginx_config(){ + $db = get_db_instance(); $nginx=''; $rewrites = []; // rewrite rules @@ -567,7 +569,8 @@ function rewrite_nginx_config(PDO $db){ exec('systemctl reload nginx'); } -function rewrite_php_config(PDO $db, string $key){ +function rewrite_php_config(string $key){ + $db = get_db_instance(); $stmt=$db->prepare("SELECT system_account FROM users WHERE instance = ? AND php=? AND todelete!=1 AND id NOT IN (SELECT user_id FROM new_account);"); foreach(array_replace(PHP_VERSIONS, DISABLED_PHP_VERSIONS) as $php_key => $version){ $stmt->execute([$key, $php_key]); @@ -604,7 +607,8 @@ php_admin_value[session.save_path] = /tmp } } -function add_mysql_user(PDO $db, string $password) : string { +function add_mysql_user(string $password) : string { + $db = get_db_instance(); $mysql_user = ''; $stmt = $db->prepare('SELECT null FROM users WHERE mysql_user = ?;'); do { @@ -616,7 +620,8 @@ function add_mysql_user(PDO $db, string $password) : string { return $mysql_user; } -function add_user_db(PDO $db, int $user_id) : ?string { +function add_user_db(int $user_id) : ?string { + $db = get_db_instance(); $mysql_db = ''; $stmt = $db->prepare('SELECT COUNT(*) FROM mysql_databases WHERE user_id = ?;'); $stmt->execute([$user_id]); @@ -641,7 +646,8 @@ function add_user_db(PDO $db, int $user_id) : ?string { return $mysql_db; } -function del_user_db(PDO $db, int $user_id, string $mysql_db) { +function del_user_db(int $user_id, string $mysql_db) { + $db = get_db_instance(); $stmt = $db->prepare('SELECT mysql_user FROM users WHERE id = ?;'); $stmt->execute([$user_id]); $user = $stmt->fetch(PDO::FETCH_ASSOC); @@ -656,17 +662,20 @@ function del_user_db(PDO $db, int $user_id, string $mysql_db) { } } -function get_new_tor_instance(PDO $db){ +function get_new_tor_instance(){ + $db = get_db_instance(); $stmt = $db->query('SELECT s.ID FROM service_instances AS s LEFT JOIN onions AS o ON (s.ID = o.instance) GROUP BY s.ID ORDER BY count(s.ID) LIMIT 1;'); return $stmt->fetch(PDO::FETCH_NUM)[0]; } -function add_user_onion(PDO $db, int $user_id, string $onion, string $priv_key, int $onion_version) { - $stmt=$db->prepare('INSERT INTO onions (user_id, onion, private_key, version, enabled, enable_smtp, instance) VALUES (?, ?, ?, ?, 1, 0, ?);'); - $stmt->execute([$user_id, $onion, $priv_key, $onion_version, get_new_tor_instance($db)]); +function add_user_onion(int $user_id, string $onion, string $priv_key, int $onion_version) { + $db = get_db_instance(); + $stmt=$db->prepare('INSERT INTO onions (user_id, onion, private_key, version, enabled, enable_smtp, instance) VALUES (?, ?, ?, ?, 1, 0, ?);'); + $stmt->execute([$user_id, $onion, $priv_key, $onion_version, get_new_tor_instance()]); } -function del_user_onion(PDO $db, int $user_id, string $onion) { +function del_user_onion(int $user_id, string $onion) { + $db = get_db_instance(); $stmt = $db->prepare('SELECT null FROM onions WHERE user_id = ? AND onion = ? AND enabled IN (0, 1);'); $stmt->execute([$user_id, $onion]); if($stmt->fetch()){ @@ -675,7 +684,7 @@ function del_user_onion(PDO $db, int $user_id, string $onion) { } } -function add_user_domain(PDO $db, int $user_id, string $domain) : string { +function add_user_domain(int $user_id, string $domain) : string { $domain = strtolower($domain); if(strlen($domain) > 255){ return "Domain can't be longer than 255 characters."; @@ -692,6 +701,7 @@ function add_user_domain(PDO $db, int $user_id, string $domain) : string { return 'Invalid domain'; } } + $db = get_db_instance(); $stmt = $db->prepare('SELECT null FROM domains WHERE domain = ?;'); $stmt->execute([$domain]); if($stmt->fetch()){ @@ -702,7 +712,8 @@ function add_user_domain(PDO $db, int $user_id, string $domain) : string { return ''; } -function del_user_domain(PDO $db, int $user_id, string $domain) { +function del_user_domain(int $user_id, string $domain) { + $db = get_db_instance(); $stmt = $db->prepare('SELECT null FROM domains WHERE user_id = ? AND domain = ? AND enabled IN (0, 1);'); $stmt->execute([$user_id, $domain]); if($stmt->fetch()){ @@ -718,7 +729,8 @@ function check_csrf_error(){ return false; } -function enqueue_instance_reload($db, $instance = null){ +function enqueue_instance_reload($instance = null){ + $db = get_db_instance(); if($instance === null){ $stmt=$db->prepare('UPDATE service_instances SET reload = 1 LIMIT 1;'); }else{ @@ -726,3 +738,16 @@ function enqueue_instance_reload($db, $instance = null){ $stmt->execute([$instance]); } } + +function get_db_instance(){ + static $db = null; + if($db !== null){ + return $db; + } + try{ + $db=new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME, DBUSER, DBPASS, [PDO::ATTR_ERRMODE=>PDO::ERRMODE_WARNING, PDO::ATTR_PERSISTENT=>PERSISTENT]); + }catch(PDOException $e){ + die('No Connection to MySQL database!'); + } + return $db; +} diff --git a/var/www/cron.php b/var/www/cron.php index 75925d1..4de6ea4 100644 --- a/var/www/cron.php +++ b/var/www/cron.php @@ -1,10 +1,6 @@ PDO::ERRMODE_WARNING, PDO::ATTR_PERSISTENT=>PERSISTENT]); -}catch(PDOException $e){ - die('No Connection to MySQL database!'); -} +$db = get_db_instance(); //instances to reload $reload=[]; @@ -77,11 +73,11 @@ foreach($onions as $onion){ //reload services if(!empty($reload)){ - rewrite_nginx_config($db); + rewrite_nginx_config(); } foreach($reload as $key => $val){ - rewrite_php_config($db, $key); - rewrite_torrc($db, $key); + rewrite_php_config($key); + rewrite_torrc($key); } //continue deleting old accounts diff --git a/var/www/find_old.php b/var/www/find_old.php index 0f2c6dd..4b0ab35 100644 --- a/var/www/find_old.php +++ b/var/www/find_old.php @@ -1,10 +1,6 @@ PDO::ERRMODE_WARNING, PDO::ATTR_PERSISTENT=>PERSISTENT]); -}catch(PDOException $e){ - die('No Connection to MySQL database!'); -} +$db = get_db_instance(); //delete tmp files older than 24 hours $stmt=$db->query('SELECT system_account FROM users;'); diff --git a/var/www/html/admin.php b/var/www/html/admin.php index 99fcaea..00a10b3 100644 --- a/var/www/html/admin.php +++ b/var/www/html/admin.php @@ -1,23 +1,23 @@ PDO::ERRMODE_WARNING, PDO::ATTR_PERSISTENT=>PERSISTENT]); -}catch(PDOException $e){ - die('No Connection to MySQL database!'); -} +$db = get_db_instance(); header('Content-Type: text/html; charset=UTF-8'); session_start(['name'=>'hosting_admin']); if($_SERVER['REQUEST_METHOD']==='HEAD'){ exit; // headers sent, no further processing needed } -echo ''; -echo 'Daniel\'s Hosting - Admin panel'; -echo ''; -echo ''; -echo ''; -echo ''; -echo ''; -echo '

Hosting - Admin panel

'; +?> + +Daniel's Hosting - Admin panel + + + + + + + +

Hosting - Admin panel

+'; + echo '
'; echo ""; send_captcha(); echo ""; @@ -42,9 +42,9 @@ if(empty($_SESSION['logged_in'])){ if(REQUIRE_APPROVAL){ $stmt=$db->query('SELECT COUNT(*) FROM new_account WHERE approved=0;'); $cnt=$stmt->fetch(PDO::FETCH_NUM)[0]; - echo 'Approve pending sites ($cnt) | "; + echo 'Approve pending sites ($cnt) | "; } - echo 'List of accounts | Delete accounts | Suspend hidden services | Edit hidden services | Logout

'; + echo 'List of accounts | Delete accounts | Suspend hidden services | Edit hidden services | Logout

'; if(empty($_REQUEST['action']) || $_REQUEST['action']==='login'){ echo '

Welcome to the admin panel!

'; }elseif($_REQUEST['action'] === 'logout'){ @@ -52,7 +52,8 @@ if(empty($_SESSION['logged_in'])){ header('Location: ' . $_SERVER['SCRIPT_NAME']); exit; }elseif($_REQUEST['action'] === 'list'){ - echo '"; + echo ''; + echo ''; echo '
Password
'; echo ''; $stmt=$db->query('SELECT users.username, onions.onion, onions.enabled FROM users INNER JOIN onions ON (onions.user_id=users.id) ORDER BY users.username;'); @@ -70,7 +71,7 @@ if(empty($_SESSION['logged_in'])){ echo '
'; } if($onion[1]=='1'){ - echo "$onion[0].onion"; + echo "$onion[0].onion"; }else{ echo "$onion[0].onion"; } @@ -89,12 +90,13 @@ if(empty($_SESSION['logged_in'])){ echo '

Successfully approved

'; } } - echo '"; + echo ''; + echo ''; echo '
UsernameOnion linkAction
'; echo ''; $stmt=$db->query('SELECT users.username, onions.onion FROM users INNER JOIN new_account ON (users.id=new_account.user_id) INNER JOIN onions ON (onions.user_id=users.id) WHERE new_account.approved=0 ORDER BY users.username;'); while($tmp=$stmt->fetch(PDO::FETCH_NUM)){ - echo ""; + echo ""; } echo '
UsernameOnion addressAction
$tmp[0]$tmp[1].onion
$tmp[0]$tmp[1].onion
'; }elseif(substr($_REQUEST['action'], 0, 6) === 'delete'){ @@ -105,7 +107,7 @@ if(empty($_SESSION['logged_in'])){ $onion = substr($_REQUEST['action'], 7); } echo '

Delete accouts:

'; - echo '
'; + echo ''; echo ''; echo '

Onion address: '; - echo ''; + echo ''; + echo ''; echo '

Onion address:

'; @@ -152,7 +154,7 @@ if(empty($_SESSION['logged_in'])){ $stmt=$db->prepare('UPDATE onions SET enabled=-2 WHERE onion=?;'); $stmt->execute([$match[1]]); echo "

Successfully queued for suspension!

"; - enqueue_instance_reload($db, $instance[0]); + enqueue_instance_reload($instance[0]); }else{ echo "

Onion address not hosted by us!

"; } @@ -168,8 +170,8 @@ if(empty($_SESSION['logged_in'])){ $onion = substr($_REQUEST['action'], 5); } echo '

Edit hidden service:

'; - echo ''; - echo ''; + echo ''; + echo ''; echo '

Onion address:

'; @@ -200,15 +202,15 @@ if(empty($_SESSION['logged_in'])){ $max_streams = 65535; } $stmt->execute([$enabled, $enable_smtp, $num_intros, $max_streams, $match[1]]); - enqueue_instance_reload($db, $onion[1]); + enqueue_instance_reload($onion[1]); echo "

Changes successfully saved!

"; } } $stmt=$db->prepare('SELECT onion, enabled, enable_smtp, num_intros, max_streams, version FROM onions WHERE onion=?;'); $stmt->execute([$match[1]]); if($onion=$stmt->fetch(PDO::FETCH_NUM)){ - echo ''; - echo ''; + echo ''; + echo ''; echo ''; echo ''; echo '"; + echo ''; + echo ''; echo ''; } echo '
OnionEnabledSMTP enabledNr. of introsMax streams per rend circuitSave
$mysql[mysql_database]localhost$user[mysql_user]
'.htmlspecialchars($mysql['mysql_database']).'localhost'.htmlspecialchars($user['mysql_user']).'
'; @@ -304,7 +301,7 @@ if($count_dbs

'; } echo '

Change MySQL password

'; -echo '

You can use PHPMyAdmin and Adminer for web based database administration.

'; +echo '

You can use PHPMyAdmin and Adminer for web based database administration.

'; echo '

System Account

'; echo ''; echo ''; diff --git a/var/www/html/index.php b/var/www/html/index.php index a652ee9..ce3110f 100644 --- a/var/www/html/index.php +++ b/var/www/html/index.php @@ -1,6 +1,7 @@ Daniel's Hosting diff --git a/var/www/html/list.php b/var/www/html/list.php index fcb7f25..85e9298 100644 --- a/var/www/html/list.php +++ b/var/www/html/list.php @@ -1,20 +1,21 @@ PDO::ERRMODE_WARNING, PDO::ATTR_PERSISTENT=>PERSISTENT]); -}catch(PDOException $e){ - die('No Connection to MySQL database!'); -} -echo ''; -echo 'Daniel\'s Hosting - List of hosted sites'; -echo ''; -echo ''; -echo ''; -echo ''; -echo ''; -echo '

Hosting - List of hosted sites

'; -echo '

Info | Register | Login | List of hosted sites | FAQ

'; +header('Content-Type: text/html; charset=UTF-8'); +header('X-Accel-Expires: 60'); +$db = get_db_instance(); +?> + +Daniel's Hosting - List of hosted sites + + + + + + + +

Hosting - List of hosted sites

+

Info | Register | Login | List of hosted sites | FAQ

+query('SELECT COUNT(*) FROM users WHERE public=1;'); $count=$stmt->fetch(PDO::FETCH_NUM); $stmt=$db->query('SELECT COUNT(*) FROM users WHERE public=0;'); @@ -24,7 +25,8 @@ echo '
UsernameHostFTP PortSFTP PortPOP3 PortIMAP PortSMTP port
'; echo ''; $stmt=$db->query('SELECT onions.onion FROM users INNER JOIN onions ON (onions.user_id=users.id) WHERE users.public=1 ORDER BY onions.onion;'); while($tmp=$stmt->fetch(PDO::FETCH_NUM)){ - echo ""; + echo ""; } -echo '
Onion link
$tmp[0].onion
$tmp[0].onion
'; -echo ''; +?> + + diff --git a/var/www/html/log.php b/var/www/html/log.php index 001ad63..97e31d3 100644 --- a/var/www/html/log.php +++ b/var/www/html/log.php @@ -1,10 +1,5 @@ PDO::ERRMODE_WARNING, PDO::ATTR_PERSISTENT=>PERSISTENT]); -}catch(PDOException $e){ - die('No Connection to MySQL database!'); -} session_start(); $user=check_login(); if(!isset($_REQUEST['old']) || $_REQUEST['old']==0){ diff --git a/var/www/html/login.php b/var/www/html/login.php index ccd24c0..b3ac3c2 100644 --- a/var/www/html/login.php +++ b/var/www/html/login.php @@ -1,10 +1,6 @@ PDO::ERRMODE_WARNING, PDO::ATTR_PERSISTENT=>PERSISTENT]); -}catch(PDOException $e){ - die('No Connection to MySQL database!'); -} +$db = get_db_instance(); header('Content-Type: text/html; charset=UTF-8'); session_start(); if(!empty($_SESSION['hosting_username'])){ diff --git a/var/www/html/password.php b/var/www/html/password.php index 3de7e4d..1ad12da 100644 --- a/var/www/html/password.php +++ b/var/www/html/password.php @@ -1,10 +1,6 @@ PDO::ERRMODE_WARNING, PDO::ATTR_PERSISTENT=>PERSISTENT]); -}catch(PDOException $e){ - die('No Connection to MySQL database!'); -} +$db = get_db_instance(); session_start(); $user=check_login(); if(!isset($_REQUEST['type'])){ diff --git a/var/www/html/register.php b/var/www/html/register.php index e3713be..0b2c10b 100644 --- a/var/www/html/register.php +++ b/var/www/html/register.php @@ -1,10 +1,6 @@ PDO::ERRMODE_WARNING, PDO::ATTR_PERSISTENT=>PERSISTENT]); -}catch(PDOException $e){ - die('No Connection to MySQL database!'); -} +$db = get_db_instance(); header('Content-Type: text/html; charset=UTF-8'); session_start(); if(!empty($_SESSION['hosting_username'])){ @@ -106,14 +102,14 @@ if($_SERVER['REQUEST_METHOD']==='POST'){ 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){ - $mysql_user = add_mysql_user($db, $_POST['pass']); + $mysql_user = add_mysql_user($_POST['pass']); $stmt=$db->prepare('INSERT INTO users (username, system_account, password, dateadded, public, php, autoindex, mysql_user, instance) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);'); - $stmt->execute([$_POST['username'], substr("$onion.onion", 0, 32), $hash, time(), $public_list, $php, $autoindex, $mysql_user, get_new_tor_instance($db)]); + $stmt->execute([$_POST['username'], substr("$onion.onion", 0, 32), $hash, time(), $public_list, $php, $autoindex, $mysql_user, get_new_tor_instance()]); $user_id = $db->lastInsertId(); $stmt = $db->prepare('INSERT INTO disk_quota (user_id, quota_size, quota_files) VALUES (?, ?, ?);'); $stmt->execute([$user_id, DEFAULT_QUOTA_SIZE, DEFAULT_QUOTA_FILES]); - add_user_onion($db, $user_id, $onion, $priv_key, $onion_version); - add_user_db($db, $user_id); + add_user_onion($user_id, $onion, $priv_key, $onion_version); + add_user_db($user_id); $stmt=$db->prepare('INSERT INTO new_account (user_id, password) VALUES (?, ?);'); $stmt->execute([$user_id, get_system_hash($_POST['pass'])]); if(EMAIL_TO!==''){ diff --git a/var/www/setup.php b/var/www/setup.php index b8bf96c..dc5a44e 100644 --- a/var/www/setup.php +++ b/var/www/setup.php @@ -272,6 +272,9 @@ if(!SKIP_USER_CHROOT_UPDATE){ exec('grep ' . escapeshellarg($tmp['system_account']) . ' /etc/passwd >> ' . escapeshellarg("/home/$tmp[system_account]/etc/passwd")); } } +if(!file_exists("/etc/nginx/sites-enabled/")){ + mkdir("/etc/nginx/sites-enabled/", 0755, true); +} file_put_contents('/etc/nginx/sites-enabled/default', NGINX_DEFAULT); if(!file_exists("/etc/nginx/streams-enabled/")){ mkdir("/etc/nginx/streams-enabled/", 0755, true); @@ -290,11 +293,11 @@ foreach(SERVICE_INSTANCES as $instance){ exec('useradd -d '.escapeshellarg("/var/lib/tor-instances/$instance").' -r -s /bin/false -M -U '.escapeshellarg("_tor-$instance")); exec('install -Z -d -m 02700 -o '.escapeshellarg("_tor-$instance").' -g '.escapeshellarg("_tor-$instance").' '.escapeshellarg("/var/lib/tor-instances/$instance")); exec('install -d '.escapeshellarg("/etc/tor/instances/$instance")); - rewrite_torrc($db, $instance); + rewrite_torrc($instance); exec("systemctl enable ".escapeshellarg("tor@$instance")); exec("systemctl start ".escapeshellarg("tor@$instance")); foreach(PHP_VERSIONS as $version){ - rewrite_php_config($db, $instance); + rewrite_php_config($instance); exec("systemctl enable ".escapeshellarg("php$version-fpm@$instance")); exec("systemctl start ".escapeshellarg("php$version-fpm@$instance")); }