Files
hosting/var/www/cron.php
Daniel Winzen fa24bb61ec Added PHP 7.2 support + minor bugfixes and performance tweaks
Note when applying this update you will have to update existing nginx vhosts to match new listening addresses (IPv6). Preferably you should update them to unix socket though and apply the changes to the tor hidden service config as well
2018-02-10 22:10:07 +01:00

174 lines
7.8 KiB
PHP

<?php
include('common.php');
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!');
}
$reload=[];
//add new accounts
$del=$db->prepare("DELETE FROM new_account WHERE onion=?;");
$update_priv=$db->prepare("UPDATE users SET private_key=? WHERE onion=?;");
$stmt=$db->query("SELECT new_account.onion, users.username, new_account.password, users.private_key, users.php, users.autoindex FROM new_account INNER JOIN users ON (users.onion=new_account.onion) LIMIT 100;");
while($id=$stmt->fetch(PDO::FETCH_NUM)){
$onion=$id[0];
$firstchar=substr($onion, 0, 1);
$reload[$firstchar]=true;
//php openssl implementation has some issues, re-export using native openssl
$pkey=openssl_pkey_get_private($id[3]);
openssl_pkey_export_to_file($pkey, 'key.tmp');
openssl_pkey_free($pkey);
$priv_key=shell_exec('openssl rsa < key.tmp');
unlink('key.tmp');
$update_priv->execute([$priv_key, $onion]);
//add and manage rights of system user
exec('useradd -l -p '. escapeshellarg($id[2]) . " -g www-data -k /var/www/skel -m -s /usr/sbin/nologin $onion.onion");
exec("chown root:www-data /home/$onion.onion");
exec("chmod 550 /home/$onion.onion");
//configuration for services
if($id[4]>0){
$php_location="
location ~ [^/]\.php(/|\$) {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/$onion;
}
";
}else{
$php_location='';
}
if($id[5]!=0){
$autoindex='on';
}else{
$autoindex='off';
}
$nginx="server {
listen [::]:80;
listen unix:/var/run/nginx.sock;
root /home/$onion.onion/www;
server_name $onion.onion *.$onion.onion;
access_log /var/log/nginx/access_$onion.onion.log custom;
access_log /home/$onion.onion/logs/access.log custom;
error_log /var/log/nginx/error_$onion.onion.log notice;
error_log /home/$onion.onion/logs/error.log notice;
disable_symlinks on from=/home/$onion.onion/www;
autoindex $autoindex;
location / {
try_files \$uri \$uri/ =404;$php_location
}
}
";
$php="[$onion]
user = $onion.onion
group = www-data
listen = /run/php/$onion
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = ondemand
pm.max_children = 10
pm.process_idle_timeout = 10s;
php_admin_value[sendmail_path] = '/usr/bin/php /var/www/sendmail_wrapper.php \"$onion.onion <$onion.onion@" . ADDRESS . ">\" | /usr/sbin/sendmail -t -i'
php_admin_value[memory_limit] = 256M
php_admin_value[disable_functions] = exec,fsockopen,link,passthru,pcntl_alarm,pcntl_async_signals,pcntl_exec,pcntl_fork,pcntl_get_last_error,pcntl_getpriority,pcntl_setpriority,pcntl_signal,pcntl_signal_dispatch,pcntl_signal_get_handler,pcntl_sigprocmask,pcntl_sigtimedwait,pcntl_sigwaitinfo,pcntl_strerror,pcntl_waitpid,pcntl_wait,pcntl_wexitstatus,pcntl_wifcontinued,pcntl_wifexited,pcntl_wifsignaled,pcntl_wifstopped,pcntl_wstopsig,pcntl_wtermsig,pfsockopen,php_uname,popen,posix_ctermid,posix_getgrgid,posix_getgrnam,posix_getpgid,posix_getpwnam,posix_getpwuid,posix_getrlimit,posix_getsid,posix_kill,posix_setegid,posix_seteuid,posix_setgid,posix_setpgid,posix_setrlimit,posix_setuid,posix_ttyname,posix_uname,proc_open,shell_exec,socket_listen,socket_create_listen,socket_bind,stream_socket_server,symlink,system
php_admin_value[open_basedir] = /home/$onion.onion
php_admin_value[upload_tmp_dir] = /home/$onion.onion/tmp
php_admin_value[soap.wsdl_cache_dir] = /home/$onion.onion/tmp
php_admin_value[session.save_path] = /home/$onion.onion/tmp
";
//save configuration files
file_put_contents("/etc/nginx/sites-enabled/$onion.onion", $nginx);
if($id[4]==1){
file_put_contents("/etc/php/7.0/fpm/pool.d/$firstchar/$onion.conf", $php);
}elseif($id[4]==2){
file_put_contents("/etc/php/7.1/fpm/pool.d/$firstchar/$onion.conf", $php);
}elseif($id[4]==3){
file_put_contents("/etc/php/7.2/fpm/pool.d/$firstchar/$onion.conf", $php);
}
//save hidden service
mkdir("/var/lib/tor-instances/$firstchar/hidden_service_$onion.onion");
file_put_contents("/var/lib/tor-instances/$firstchar/hidden_service_$onion.onion/hostname", "$onion.onion\n");
file_put_contents("/var/lib/tor-instances/$firstchar/hidden_service_$onion.onion/private_key", $priv_key);
chmod("/var/lib/tor-instances/$firstchar/hidden_service_$onion.onion/", 0700);
chmod("/var/lib/tor-instances/$firstchar/hidden_service_$onion.onion/hostname", 0600);
chmod("/var/lib/tor-instances/$firstchar/hidden_service_$onion.onion/private_key", 0600);
chown("/var/lib/tor-instances/$firstchar/hidden_service_$onion.onion/", "_tor-$firstchar");
chown("/var/lib/tor-instances/$firstchar/hidden_service_$onion.onion/hostname", "_tor-$firstchar");
chown("/var/lib/tor-instances/$firstchar/hidden_service_$onion.onion/private_key", "_tor-$firstchar");
chgrp("/var/lib/tor-instances/$firstchar/hidden_service_$onion.onion/", "_tor-$firstchar");
chgrp("/var/lib/tor-instances/$firstchar/hidden_service_$onion.onion/hostname", "_tor-$firstchar");
chgrp("/var/lib/tor-instances/$firstchar/hidden_service_$onion.onion/private_key", "_tor-$firstchar");
//add hidden service to torrc
$torrc=file_get_contents("/etc/tor/instances/$firstchar/torrc");
$torrc.="HiddenServiceDir /var/lib/tor-instances/$firstchar/hidden_service_$onion.onion/\nHiddenServicePort 80 unix:/var/run/nginx.sock\nHiddenServicePort 25 127.0.0.1:25\n";
file_put_contents("/etc/tor/instances/$firstchar/torrc", $torrc);
//remove from to-add queue
$del->execute([$onion]);
}
//delete old accounts
$del=$db->prepare("DELETE FROM users WHERE onion=?");
$stmt=$db->query("SELECT onion FROM del_account LIMIT 100;");
$onions=$stmt->fetchAll(PDO::FETCH_NUM);
foreach($onions as $onion){
$firstchar=substr($onion[0], 0, 1);
$reload[$firstchar]=true;
//delete config files
if(file_exists("/etc/php/7.0/fpm/pool.d/$firstchar/$onion[0].conf")){
unlink("/etc/php/7.0/fpm/pool.d/$firstchar/$onion[0].conf");
}
if(file_exists("/etc/php/7.1/fpm/pool.d/$firstchar/$onion[0].conf")){
unlink("/etc/php/7.1/fpm/pool.d/$firstchar/$onion[0].conf");
}
if(file_exists("/etc/php/7.2/fpm/pool.d/$firstchar/$onion[0].conf")){
unlink("/etc/php/7.2/fpm/pool.d/$firstchar/$onion[0].conf");
}
unlink("/etc/nginx/sites-enabled/$onion[0].onion");
//clean torrc from user
$torrc=file_get_contents("/etc/tor/instances/$firstchar/torrc");
$torrc=str_replace("HiddenServiceDir /var/lib/tor-instances/$firstchar/hidden_service_$onion[0].onion/\nHiddenServicePort 80 unix:/var/run/nginx.sock\nHiddenServicePort 25 127.0.0.1:25\n", '', $torrc);
file_put_contents("/etc/tor/instances/$firstchar/torrc", $torrc);
//delete hidden service from tor
unlink("/var/lib/tor-instances/$firstchar/hidden_service_$onion[0].onion/hostname");
unlink("/var/lib/tor-instances/$firstchar/hidden_service_$onion[0].onion/private_key");
rmdir("/var/lib/tor-instances/$firstchar/hidden_service_$onion[0].onion/");
}
//reload services
foreach($reload as $key => $val){
exec('service nginx reload');
exec("service php7.0-fpm@$key restart");
exec("service php7.1-fpm@$key restart");
exec("service php7.2-fpm@$key restart");
exec("service tor@$key reload");
}
//continue deleting old accounts
foreach($onions as $onion){
//kill processes of the user to allow deleting system users
exec("skill -u $onion[0].onion");
//delete user and group
exec("userdel -rf $onion[0].onion");
//delete all log files
exec("rm -f /var/log/nginx/*$onion[0].onion.log*");
//delete user from database
$db->exec("DROP USER '$onion[0].onion'@'%';");
$db->exec("DROP DATABASE IF EXISTS `$onion[0]`;");
$db->exec('FLUSH PRIVILEGES;');
//delete user from user database
$del->execute([$onion[0]]);
}
// update passwords
$stmt=$db->query("SELECT onion, password FROM pass_change LIMIT 100;");
$del=$db->prepare("DELETE FROM pass_change WHERE onion=?;");
while($onion=$stmt->fetch(PDO::FETCH_NUM)){
exec('usermod -p '. escapeshellarg($onion[1]) . " $onion[0].onion");
$del->execute([$onion[0]]);
}