diff --git a/etc/postfix/sql/alias.cf b/etc/postfix/sql/alias.cf
index bd3efaf..fc865b4 100644
--- a/etc/postfix/sql/alias.cf
+++ b/etc/postfix/sql/alias.cf
@@ -2,4 +2,4 @@ user = hosting
password = MY_PASSWORD
hosts = localhost
dbname = hosting
-query = SELECT '%d@dhosting4okcs22v.onion' FROM users WHERE '%d' = CONCAT(onion, '.onion')
+query = SELECT '%d@dhosting4okcs22v.onion' FROM users WHERE '%d' = system_account
diff --git a/etc/tor/instances/2/torrc b/etc/tor/instances/2/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/2/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/3/torrc b/etc/tor/instances/3/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/3/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/4/torrc b/etc/tor/instances/4/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/4/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/5/torrc b/etc/tor/instances/5/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/5/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/6/torrc b/etc/tor/instances/6/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/6/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/7/torrc b/etc/tor/instances/7/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/7/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/a/torrc b/etc/tor/instances/a/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/a/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/b/torrc b/etc/tor/instances/b/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/b/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/c/torrc b/etc/tor/instances/c/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/c/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/d/torrc b/etc/tor/instances/d/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/d/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/e/torrc b/etc/tor/instances/e/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/e/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/f/torrc b/etc/tor/instances/f/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/f/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/g/torrc b/etc/tor/instances/g/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/g/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/h/torrc b/etc/tor/instances/h/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/h/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/i/torrc b/etc/tor/instances/i/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/i/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/j/torrc b/etc/tor/instances/j/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/j/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/k/torrc b/etc/tor/instances/k/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/k/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/l/torrc b/etc/tor/instances/l/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/l/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/m/torrc b/etc/tor/instances/m/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/m/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/n/torrc b/etc/tor/instances/n/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/n/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/o/torrc b/etc/tor/instances/o/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/o/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/p/torrc b/etc/tor/instances/p/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/p/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/q/torrc b/etc/tor/instances/q/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/q/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/r/torrc b/etc/tor/instances/r/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/r/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/s/torrc b/etc/tor/instances/s/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/s/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/t/torrc b/etc/tor/instances/t/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/t/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/u/torrc b/etc/tor/instances/u/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/u/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/v/torrc b/etc/tor/instances/v/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/v/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/w/torrc b/etc/tor/instances/w/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/w/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/x/torrc b/etc/tor/instances/x/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/x/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/y/torrc b/etc/tor/instances/y/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/y/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/etc/tor/instances/z/torrc b/etc/tor/instances/z/torrc
deleted file mode 100644
index 5a8bfd8..0000000
--- a/etc/tor/instances/z/torrc
+++ /dev/null
@@ -1,7 +0,0 @@
-ClientUseIPv6 1
-ClientUseIPv4 1
-SOCKSPort 0
-MaxClientCircuitsPending 1024
-NumEntryGuards 6
-NumDirectoryGuards 6
-NumPrimaryGuards 6
diff --git a/var/www/common.php b/var/www/common.php
index b1afbb2..db819de 100644
--- a/var/www/common.php
+++ b/var/www/common.php
@@ -4,12 +4,12 @@ const DBUSER='hosting'; // Database user
const DBPASS='MY_PASSWORD'; // Database password
const DBNAME='hosting'; // Database
const PERSISTENT=true; // Use persistent database conection true/false
-const DBVERSION=5; //database layout version
+const DBVERSION=6; //database layout version
const CAPTCHA=0; // Captcha difficulty (0=off, 1=simple, 2=moderate, 3=extreme)
const ADDRESS='dhosting4okcs22v.onion'; // our own address
const SERVERS=[ //servers and ports we are running on
'dhosting4okcs22v.onion'=>['sftp'=>22, 'ftp'=>21, 'pop3'=>'110', 'imap'=>'143', 'smtp'=>'25'],
-'danwin1210.me'=>['sftp'=>22, 'ftp'=>21, 'pop3'=>'', 'imap'=>'', 'smtp'=>'']
+'hosting.danwin1210.me'=>['sftp'=>222, 'ftp'=>21, 'pop3'=>'1995', 'imap'=>'1993', 'smtp'=>'1465']
];
const EMAIL_TO=''; //Send email notifications about new registrations to this address
const INDEX_MD5S=[ //MD5 sums of index.hosting.html files that should be considdered as unchanged for deletion
@@ -200,3 +200,28 @@ function check_captcha_error(){
}
return false;
}
+
+function rewrite_torrc(PDO $db, string $key){
+$torrc="ClientUseIPv6 1
+ClientUseIPv4 1
+SOCKSPort 0
+MaxClientCircuitsPending 1024
+NumEntryGuards 6
+NumDirectoryGuards 6
+NumPrimaryGuards 6
+";
+ $stmt=$db->prepare('SELECT onions.onion, users.system_account, onions.num_intros, onions.enable_smtp, onions.version FROM onions INNER JOIN users ON (users.id=onions.user_id) WHERE onions.onion LIKE ? AND enabled=1;');
+ $stmt->execute(["$key%"]);
+ while($tmp=$stmt->fetch(PDO::FETCH_NUM)){
+ $torrc.="HiddenServiceDir /var/lib/tor-instances/$key/hidden_service_$tmp[0].onion/
+HiddenServiceNumIntroductionPoints $tmp[2]
+HiddenServiceVersion $tmp[4]
+HiddenServicePort 80 unix:/var/run/nginx/$tmp[1]
+";
+ if($tmp[3]){
+ $torrc.="HiddenServicePort 25\n";
+ }
+ }
+ file_put_contents("/etc/tor/instances/$key/torrc", $torrc);
+ exec("service tor@$key reload");
+}
diff --git a/var/www/cron.php b/var/www/cron.php
index 05f786a..4e059da 100644
--- a/var/www/cron.php
+++ b/var/www/cron.php
@@ -9,12 +9,13 @@ $reload=[];
//add new accounts
$del=$db->prepare("DELETE FROM new_account WHERE user_id=?;");
-$update_priv=$db->prepare("UPDATE users SET private_key=? WHERE onion=?;");
+$update_priv=$db->prepare("UPDATE onions SET private_key=? WHERE user_id=?;");
$approval = REQUIRE_APPROVAL ? 'WHERE new_account.approved=1': '';
-$stmt=$db->query("SELECT users.onion, users.username, new_account.password, users.private_key, users.php, users.autoindex, users.id FROM new_account INNER JOIN users ON (users.id=new_account.user_id) $approval LIMIT 100;");
+$stmt=$db->query("SELECT users.system_account, users.username, new_account.password, onions.private_key, users.php, users.autoindex, users.id, onions.onion FROM new_account INNER JOIN users ON (users.id=new_account.user_id) INNER JOIN onions ON (onions.user_id=users.id) $approval LIMIT 100;");
while($id=$stmt->fetch(PDO::FETCH_NUM)){
- $onion=$id[0];
- $firstchar=substr($onion, 0, 1);
+ $onion=$id[7];
+ $system_account=$id[0];
+ $firstchar=substr($system_account, 0, 1);
$reload[$firstchar]=true;
//php openssl implementation has some issues, re-export using native openssl
$pkey=openssl_pkey_get_private($id[3]);
@@ -22,21 +23,21 @@ while($id=$stmt->fetch(PDO::FETCH_NUM)){
openssl_pkey_free($pkey);
$priv_key=shell_exec('openssl rsa < key.tmp');
unlink('key.tmp');
- $update_priv->execute([$priv_key, $onion]);
+ $update_priv->execute([$priv_key, $id[6]]);
//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");
- chown("/home/$onion.onion", 'root');
- chgrp("/home/$onion.onion", 'www-data');
- chmod("/home/$onion.onion", 0550);
+ exec('useradd -l -p ' . escapeshellarg($id[2]) . ' -g www-data -k /var/www/skel -m -s /usr/sbin/nologin ' . escapeshellarg($system_account));
+ chown("/home/$system_account", 'root');
+ chgrp("/home/$system_account", 'www-data');
+ chmod("/home/$system_account", 0550);
foreach(['.ssh', 'data', 'Maildir', 'tmp'] as $dir){
- mkdir("/home/$onion.onion/$dir", 0700);
- chown("/home/$onion.onion/$dir", "$onion.onion");
- chgrp("/home/$onion.onion/$dir", 'www-data');
+ mkdir("/home/$system_account/$dir", 0700);
+ chown("/home/$system_account/$dir", $system_account);
+ chgrp("/home/$system_account/$dir", 'www-data');
}
- foreach(['logs'] as $dir){
- mkdir("/home/$onion.onion/$dir", 0550);
- chown("/home/$onion.onion/$dir", "$onion.onion");
- chgrp("/home/$onion.onion/$dir", 'www-data');
+ foreach(['logs']){
+ mkdir("/home/$system_account/$dir", 0550);
+ chown("/home/$system_account/$dir", $system_account);
+ chgrp("/home/$system_account/$dir", 'www-data');
}
//configuration for services
@@ -45,13 +46,13 @@ if($id[4]>0){
$php_location="
location ~ [^/]\.php(/|\$) {
include snippets/fastcgi-php.conf;
- fastcgi_pass unix:/run/php/$onion;
+ fastcgi_pass unix:/run/php/$system_account;
}
";
}else{
$php_location='';
}
-if($id[5]!=0){
+if($id[5]){
$autoindex='on';
}else{
$autoindex='off';
@@ -59,14 +60,14 @@ if($id[5]!=0){
$nginx="server {
listen [::]:80;
- listen unix:/var/run/nginx/$onion;
- root /home/$onion.onion/www;
+ listen unix:/var/run/nginx/$system_account;
+ root /home/$system_account/www;
server_name $onion.onion *.$onion.onion;
- access_log /var/log/nginx/access_$onion.onion.log custom buffer=16k flush=1m;
- access_log /home/$onion.onion/logs/access.log custom buffer=16k flush=1m;
- 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;
+ access_log /var/log/nginx/access_$system_account.log custom buffer=8k flush=1m;
+ access_log /home/$system_account/logs/access.log custom buffer=8k flush=1m;
+ error_log /var/log/nginx/error_$system_account.log notice;
+ error_log /home/$system_account/logs/error.log notice;
+ disable_symlinks on from=/home/$system_account;
autoindex $autoindex;
location / {
try_files \$uri \$uri/ =404;$php_location
@@ -74,33 +75,33 @@ $nginx="server {
}
";
-$php="[$onion]
-user = $onion.onion
+$php="[$system_account]
+user = $system_account
group = www-data
-listen = /run/php/$onion
+listen = /run/php/$system_account
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = ondemand
pm.max_children = 20
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[sendmail_path] = '/usr/bin/php /var/www/sendmail_wrapper.php \"$system_account <$system_account@" . ADDRESS . ">\" | /usr/sbin/sendmail -t -i'
php_admin_value[memory_limit] = 256M
php_admin_value[disable_functions] = exec,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,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,putenv,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
+php_admin_value[open_basedir] = /home/$system_account
+php_admin_value[upload_tmp_dir] = /home/$system_account/tmp
+php_admin_value[soap.wsdl_cache_dir] = /home/$system_account/tmp
+php_admin_value[session.save_path] = /home/$system_account/tmp
";
//save configuration files
- file_put_contents("/etc/nginx/sites-enabled/$onion.onion", $nginx);
+ file_put_contents("/etc/nginx/sites-enabled/$system_account", $nginx);
if($id[4]==1){
- file_put_contents("/etc/php/7.0/fpm/pool.d/$firstchar/$onion.conf", $php);
+ file_put_contents("/etc/php/7.0/fpm/pool.d/$firstchar/$system_account.conf", $php);
}elseif($id[4]==2){
- file_put_contents("/etc/php/7.1/fpm/pool.d/$firstchar/$onion.conf", $php);
+ file_put_contents("/etc/php/7.1/fpm/pool.d/$firstchar/$system_account.conf", $php);
}elseif($id[4]==3){
- file_put_contents("/etc/php/7.2/fpm/pool.d/$firstchar/$onion.conf", $php);
+ file_put_contents("/etc/php/7.2/fpm/pool.d/$firstchar/$system_account.conf", $php);
}
//save hidden service
mkdir("/var/lib/tor-instances/$firstchar/hidden_service_$onion.onion", 0700);
@@ -114,42 +115,41 @@ php_admin_value[session.save_path] = /home/$onion.onion/tmp
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/$onion\nHiddenServicePort 25\n";
- file_put_contents("/etc/tor/instances/$firstchar/torrc", $torrc);
//remove from to-add queue
$del->execute([$id[6]]);
}
//delete old accounts
-$del=$db->prepare("DELETE FROM users WHERE onion=?");
-$stmt=$db->query("SELECT onion, id, mysql_user FROM users WHERE todelete=1 LIMIT 100;");
+$del=$db->prepare("DELETE FROM users WHERE id=?;");
+$stmt=$db->query("SELECT system_account, id, mysql_user FROM users WHERE todelete=1 LIMIT 100;");
$onions=$stmt->fetchAll(PDO::FETCH_NUM);
+$stmt=$db->prepare('SELECT onion FROM onions WHERE user_id=?;');
+$del_onions=$db->prepare('DELETE FROM onions WHERE user_id=?;');
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");
+ foreach(['7.0', '7.1', '7.2'] as $v){
+ // new naming schema
+ if(file_exists("/etc/php/$v/fpm/pool.d/$firstchar/$onion[0].conf")){
+ unlink("/etc/php/$v/fpm/pool.d/$firstchar/$onion[0].conf");
+ }
+ // old naming schema
+ if(file_exists("/etc/php/$v/fpm/pool.d/$firstchar/".substr($onion[0], 0, 16).".conf")){
+ unlink("/etc/php/$v/fpm/pool.d/$firstchar/".substr($onion[0], 0, 16).".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/$onion[0]\nHiddenServicePort 25\n", '', $torrc);
- file_put_contents("/etc/tor/instances/$firstchar/torrc", $torrc);
- //delete hidden service from tor
- if(file_exists("/var/lib/tor-instances/$firstchar/hidden_service_$onion[0].onion/")){
- 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/");
+ unlink("/etc/nginx/sites-enabled/$onion[0]");
+ $stmt->execute([$onion[1]]);
+ while($tmp=$stmt->fetch(PDO::FETCH_NUM)){
+ //delete hidden service from tor
+ if(file_exists("/var/lib/tor-instances/$firstchar/hidden_service_$tmp[0].onion/")){
+ unlink("/var/lib/tor-instances/$firstchar/hidden_service_$tmp[0].onion/hostname");
+ unlink("/var/lib/tor-instances/$firstchar/hidden_service_$tmp[0].onion/private_key");
+ rmdir("/var/lib/tor-instances/$firstchar/hidden_service_$tmp[0].onion/");
+ }
}
+ $del_onions->execute([$onion[1]]);
}
//reload services
@@ -160,18 +160,29 @@ foreach($reload as $key => $val){
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");
+ rewrite_torrc($db, $key);
}
//continue deleting old accounts
$stmt=$db->prepare('SELECT mysql_database FROM mysql_databases WHERE user_id=?;');
foreach($onions as $onion){
//kill processes of the user to allow deleting system users
- exec("skill -u $onion[0].onion");
+ exec('skill -u ' . escapeshellarg($onion[0]));
//delete user and group
- exec("userdel -rf $onion[0].onion");
+ exec('userdel -rf ' . escapeshellarg($onion[0]));
//delete all log files
- exec("rm -f /var/log/nginx/*$onion[0].onion.log*");
+ if(file_exists("/var/log/nginx/access_$onion[0].log")){
+ unlink("/var/log/nginx/access_$onion[0].log");
+ }
+ if(file_exists("/var/log/nginx/access_$onion[0].log.1")){
+ unlink("/var/log/nginx/access_$onion[0].log.1");
+ }
+ if(file_exists("/var/log/nginx/error_$onion[0].log")){
+ unlink("/var/log/nginx/error_$onion[0].log");
+ }
+ if(file_exists("/var/log/nginx/error_$onion[0].log.1")){
+ unlink("/var/log/nginx/error_$onion[0].log.1");
+ }
//delete user from database
$db->exec("DROP USER '$onion[2]'@'%';");
$stmt->execute([$onion[1]]);
@@ -180,13 +191,13 @@ foreach($onions as $onion){
}
$db->exec('FLUSH PRIVILEGES;');
//delete user from user database
- $del->execute([$onion[0]]);
+ $del->execute([$onion[1]]);
}
// update passwords
-$stmt=$db->query("SELECT users.onion, pass_change.password, users.id FROM pass_change INNER JOIN users ON (users.id=pass_change.user_id) LIMIT 100;");
+$stmt=$db->query("SELECT users.system_account, pass_change.password, users.id FROM pass_change INNER JOIN users ON (users.id=pass_change.user_id) LIMIT 100;");
$del=$db->prepare("DELETE FROM pass_change WHERE user_id=?;");
while($onion=$stmt->fetch(PDO::FETCH_NUM)){
- exec('usermod -p '. escapeshellarg($onion[1]) . " $onion[0].onion");
+ exec('usermod -p '. escapeshellarg($onion[1]) . ' ' . escapeshellarg($onion[0]));
$del->execute([$onion[2]]);
}
diff --git a/var/www/find_old.php b/var/www/find_old.php
index cea4d7d..762d978 100644
--- a/var/www/find_old.php
+++ b/var/www/find_old.php
@@ -7,30 +7,28 @@ try{
}
//delete tmp files older than 24 hours
-exec('find /home -path "/home/*.onion/tmp/*" -cmin +1440 -delete');
+exec('find /home -path "/home/*/tmp/*" -cmin +1440 -delete');
//delete unused accounts older than 30 days
-$del=$db->prepare('UPDATE users SET todelete=1 WHERE onion=?;');
-$stmt=$db->prepare('SELECT onion FROM users WHERE dateadded;');
+$del=$db->prepare('UPDATE users SET todelete=1 WHERE id=?;');
+$stmt=$db->prepare('SELECT system_account, id FROM users WHERE dateadded;');
$stmt->execute([time()-60*60*24*30]);
$all=$stmt->fetchAll(PDO::FETCH_NUM);
foreach($all as $tmp){
- $tmp=$tmp[0].'.onion';
- if(filemtime("/home/$tmp")>time()-60*60*24*30){
+ if(filemtime("/home/$tmp[0]")>time()-60*60*24*30){
continue;
}
- $count_www=count(scandir("/home/$tmp/www/"));
+ $count_www=count(scandir("/home/$tmp[0]/www/"));
//check data empty and www no more than 1 file
- if($count_www>3 || count(scandir("/home/$tmp/data/"))>2){
+ if($count_www>3 || count(scandir("/home/$tmp[0]/data/"))>2){
continue;
}
//check www empty or index unmodified
if($count_www===3){
- if(!file_exists("/home/$tmp/www/index.hosting.html") || !in_array(md5_file("/home/$tmp/www/index.hosting.html"), INDEX_MD5S)){
+ if(!file_exists("/home/$tmp[0]/www/index.hosting.html") || !in_array(md5_file("/home/$tmp[0]/www/index.hosting.html"), INDEX_MD5S)){
continue;
}
}
//no data found, safe to delete
-// $del->execute([substr($tmp, 0, 16)]);
-var_dump($tmp);
+ $del->execute([substr($tmp[1], 0, 16)]);
}
diff --git a/var/www/html/admin.php b/var/www/html/admin.php
index 3513575..e71a694 100644
--- a/var/www/html/admin.php
+++ b/var/www/html/admin.php
@@ -52,7 +52,7 @@ if(empty($_SESSION['logged_in'])){
}elseif($_REQUEST['action']==='list'){
echo '
';
echo 'Onion link ';
- $stmt=$db->query('SELECT onion FROM users WHERE public=0 ORDER BY onion;');
+ $stmt=$db->query('SELECT onions.onion FROM users INNER JOIN onions ON (onions.user_id=users.id) WHERE users.public=0 ORDER BY onions.onion;');
while($tmp=$stmt->fetch(PDO::FETCH_NUM)){
echo "$tmp[0].onion ";
}
@@ -65,7 +65,7 @@ if(empty($_SESSION['logged_in'])){
}
echo '';
echo 'Username Onion address Action ';
- $stmt=$db->query('SELECT users.username, users.onion FROM users INNER JOIN new_account ON (users.id=new_account.user_id) WHERE new_account.approved=0 ORDER BY users.username;');
+ $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 "";
}
@@ -81,11 +81,11 @@ if(empty($_SESSION['logged_in'])){
echo ' ';
if(!empty($_POST['onion'])){
if(preg_match('~^([a-z2-7]{16})(\.onion)?$~', $_POST['onion'], $match)){
- $stmt=$db->prepare('SELECT null FROM users WHERE onion=?;');
+ $stmt=$db->prepare('SELECT user_id FROM onions WHERE onion=?;');
$stmt->execute([$match[1]]);
- if($stmt->fetch(PDO::FETCH_NUM)){
- $stmt=$db->prepare('UPDATE users SET todelete=1 WHERE onion=?;');
- $stmt->execute([$match[1]]);
+ if($user_id=$stmt->fetch(PDO::FETCH_NUM)){
+ $stmt=$db->prepare('UPDATE users SET todelete=1 WHERE id=?;');
+ $stmt->execute($user_id);
echo "Successfully queued for deletion!
";
}else{
echo "Onion address not hosted by us!
";
diff --git a/var/www/html/delete.php b/var/www/html/delete.php
index 8ceecee..5e35f36 100644
--- a/var/www/html/delete.php
+++ b/var/www/html/delete.php
@@ -12,8 +12,8 @@ if($_SERVER['REQUEST_METHOD']==='POST'){
if(!isset($_POST['pass']) || !password_verify($_POST['pass'], $user['password'])){
$msg.='Wrong password.
';
}else{
- $stmt=$db->prepare('UPDATE users SET todelete=1 WHERE onion=?;');
- $stmt->execute([$user['onion']]);
+ $stmt=$db->prepare('UPDATE users SET todelete=1 WHERE id=?;');
+ $stmt->execute([$user['id']]);
session_destroy();
header('Location: login.php');
exit;
diff --git a/var/www/html/files.php b/var/www/html/files.php
index e33446d..7fc38da 100644
--- a/var/www/html/files.php
+++ b/var/www/html/files.php
@@ -15,7 +15,7 @@ if(empty($_SESSION['ftp_pass'])){
exit;
}
$ftp=ftp_connect('127.0.0.1') or die ('No Connection to FTP server!');
-if(@!ftp_login($ftp, "$user[onion].onion", $_SESSION['ftp_pass'])){
+if(@!ftp_login($ftp, $user[system_account], $_SESSION['ftp_pass'])){
send_login();
exit;
}
diff --git a/var/www/html/home.php b/var/www/html/home.php
index aa336fc..a57e86c 100644
--- a/var/www/html/home.php
+++ b/var/www/html/home.php
@@ -15,22 +15,34 @@ echo ' ';
echo ' ';
echo '';
echo "Logged in as $user[username] Logout | Change passwords | FileManager | Delete account
";
-echo "Enter system account password to check your $user[onion].onion@" . ADDRESS . " mail:
";
-echo 'Domain ';
+echo "Enter system account password to check your $user[system_account]@" . ADDRESS . " mail:
";
+echo 'Domains ';
echo '';
-echo 'Onion Private key ';
-echo "$user[onion].onion ";
-if(isset($_REQUEST['show_priv'])){
- echo "$user[private_key] ";
-}else{
- echo 'Show private key ';
+echo ' Onion Private key Enabled SMTP enabled Nr. of intros ';
+$stmt=$db->prepare('SELECT onion, private_key, enabled, enable_smtp, num_intros FROM onions WHERE user_id=?;');
+$stmt->execute([$user['id']]);
+while($onion=$stmt->fetch(PDO::FETCH_ASSOC)){
+ echo "$onion[onion].onion ";
+ if(isset($_REQUEST['show_priv'])){
+ echo "$onion[private_key] ";
+ }else{
+ echo 'Show private key ';
+ }
+ echo ' ';
+ echo $onion['enabled'] ? 'Yes' : 'No';
+ echo ' ';
+ echo $onion['enable_smtp'] ? 'Yes' : 'No';
+ echo " $onion[num_intros] ";
}
-echo '';
echo '
';
echo 'MySQL Database ';
echo '';
echo 'Database Host User ';
-echo "$user[onion] localhost $user[onion].onion ";
+$stmt=$db->prepare('SELECT mysql_database FROM mysql_databases WHERE user_id=?;');
+$stmt->execute([$user['id']]);
+while($mysql=$stmt->fetch(PDO::FETCH_ASSOC)){
+ echo "$mysql[mysql_database] localhost $user[mysql_user] ";
+}
echo '
';
echo 'Change MySQL password
';
echo 'You can use PHPMyAdmin and Adminer for web based database administration.
';
@@ -38,7 +50,7 @@ echo 'System Account ';
echo '';
echo 'Username Host FTP Port SFTP Port POP3 Port IMAP Port SMTP port ';
foreach(SERVERS as $server=>$tmp){
- echo "$user[onion].onion $server $tmp[ftp] $tmp[sftp] $tmp[pop3] $tmp[imap] $tmp[smtp] ";
+ echo "$user[system_account] $server $tmp[ftp] $tmp[sftp] $tmp[pop3] $tmp[imap] $tmp[smtp] ";
}
echo '
';
echo 'Change system account password
';
diff --git a/var/www/html/index.php b/var/www/html/index.php
index 9dd2d0b..23b6642 100644
--- a/var/www/html/index.php
+++ b/var/www/html/index.php
@@ -31,7 +31,7 @@ if(isset($_SERVER['HTTP_HOST']) && preg_match('/danwin1210\.(i2p|me)$/', $_SERVE
Web-based file management
FTP access
SFTP access
-No disk quota
+No disk quota, but please be fair about your disk usage
mail() can send e-mails from your.onion@ (your.onion@hosting.danwin1210.me for clearnet)
Webmail and IMAP, POP3 and SMTP access to your mail account
Mail sent to anything@your.onion gets automatically redirected to your inbox
@@ -53,5 +53,6 @@ if(isset($_SERVER['HTTP_HOST']) && preg_match('/danwin1210\.(i2p|me)$/', $_SERVE
No proxy scripts! (You are already using TOR and this will just burden the network)
No IP logger or similar de-anonymizer sites!
I preserve the right to delete any site for violating these rules and adding new rules at any time.
+Should you not honor these rules, I will (have to) work together with Law Enfocements!