| | |
| | | |
| | | if(!is_dir($data["new"]["document_root"]."/ssl")) exec("mkdir -p ".$data["new"]["document_root"]."/ssl"); |
| | | $ssl_dir = $data["new"]["document_root"]."/ssl"; |
| | | $domain = $data["new"]["domain"]; |
| | | $domain = $data["new"]["ssl_domain"]; |
| | | $key_file = $ssl_dir.'/'.$domain.".key.org"; |
| | | $key_file2 = $ssl_dir.'/'.$domain.".key"; |
| | | $csr_file = $ssl_dir.'/'.$domain.".csr"; |
| | |
| | | $ssl_cnf = " RANDFILE = $rand_file |
| | | |
| | | [ req ] |
| | | default_bits = 1024 |
| | | default_bits = 2048 |
| | | default_keyfile = keyfile.pem |
| | | distinguished_name = req_distinguished_name |
| | | attributes = req_attributes |
| | |
| | | $crt_file = escapeshellcmd($crt_file); |
| | | |
| | | if(is_file($ssl_cnf_file)){ |
| | | exec("openssl genrsa -des3 -rand $rand_file -passout pass:$ssl_password -out $key_file 1024 && openssl req -new -passin pass:$ssl_password -passout pass:$ssl_password -key $key_file -out $csr_file -days $ssl_days -config $config_file && openssl req -x509 -passin pass:$ssl_password -passout pass:$ssl_password -key $key_file -in $csr_file -out $crt_file -days $ssl_days -config $config_file && openssl rsa -passin pass:$ssl_password -in $key_file -out $key_file2"); |
| | | exec("openssl genrsa -des3 -rand $rand_file -passout pass:$ssl_password -out $key_file 2048 && openssl req -new -passin pass:$ssl_password -passout pass:$ssl_password -key $key_file -out $csr_file -days $ssl_days -config $config_file && openssl req -x509 -passin pass:$ssl_password -passout pass:$ssl_password -key $key_file -in $csr_file -out $crt_file -days $ssl_days -config $config_file && openssl rsa -passin pass:$ssl_password -in $key_file -out $key_file2"); |
| | | $app->log("Creating SSL Cert for: $domain",LOGLEVEL_DEBUG); |
| | | } |
| | | |
| | | exec("chmod 400 $key_file2"); |
| | | @unlink($config_file); |
| | | @unlink($rand_file); |
| | | $ssl_request = file_get_contents($csr_file); |
| | | $ssl_cert = file_get_contents($crt_file); |
| | | $ssl_request = $app->db->quote(file_get_contents($csr_file)); |
| | | $ssl_cert = $app->db->quote(file_get_contents($crt_file)); |
| | | /* Update the DB of the (local) Server */ |
| | | $app->db->query("UPDATE web_domain SET ssl_request = '$ssl_request', ssl_cert = '$ssl_cert' WHERE domain = '".$data["new"]["domain"]."'"); |
| | | $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); |
| | |
| | | //* Save a SSL certificate to disk |
| | | if($data["new"]["ssl_action"] == 'save') { |
| | | $ssl_dir = $data["new"]["document_root"]."/ssl"; |
| | | $domain = $data["new"]["domain"]; |
| | | $domain = $data["new"]["ssl_domain"]; |
| | | $csr_file = $ssl_dir.'/'.$domain.".csr"; |
| | | $crt_file = $ssl_dir.'/'.$domain.".crt"; |
| | | $bundle_file = $ssl_dir.'/'.$domain.".bundle"; |
| | |
| | | //* Delete a SSL certificate |
| | | if($data["new"]["ssl_action"] == 'del') { |
| | | $ssl_dir = $data["new"]["document_root"]."/ssl"; |
| | | $domain = $data["new"]["domain"]; |
| | | $domain = $data["new"]["ssl_domain"]; |
| | | $csr_file = $ssl_dir.'/'.$domain.".csr"; |
| | | $crt_file = $ssl_dir.'/'.$domain.".crt"; |
| | | $bundle_file = $ssl_dir.'/'.$domain.".bundle"; |
| | |
| | | $app->uses("getconf"); |
| | | $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); |
| | | |
| | | //* Check if this is a chrooted setup |
| | | if($web_config['website_basedir'] != '' && @is_file($web_config['website_basedir'].'/etc/passwd')) { |
| | | $apache_chrooted = true; |
| | | $app->log("Info: Apache is chrooted.",LOGLEVEL_DEBUG); |
| | | } else { |
| | | $apache_chrooted = false; |
| | | } |
| | | |
| | | if($data["new"]["document_root"] == '') { |
| | | $app->log("document_root not set",LOGLEVEL_WARN); |
| | | return 0; |
| | |
| | | // Remove trailing slash |
| | | if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); |
| | | // create the symlinks, if not exist |
| | | if(!is_link($tmp_symlink)) { |
| | | if(is_link($tmp_symlink)) { |
| | | exec("rm -f ".escapeshellcmd($tmp_symlink)); |
| | | $app->log("Removed Symlink: rm -f ".$tmp_symlink,LOGLEVEL_DEBUG); |
| | | } |
| | |
| | | $command .= ' '.escapeshellcmd($data["new"]["system_user"]); |
| | | exec($command); |
| | | |
| | | |
| | | if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." ".$command); |
| | | |
| | | |
| | | } |
| | |
| | | $groupname = escapeshellcmd($data["new"]["system_group"]); |
| | | if($data["new"]["system_group"] != '' && !$app->system->is_group($data["new"]["system_group"])) { |
| | | exec("groupadd $groupname"); |
| | | if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." groupadd $groupname"); |
| | | $app->log("Adding the group: $groupname",LOGLEVEL_DEBUG); |
| | | } |
| | | |
| | | $username = escapeshellcmd($data["new"]["system_user"]); |
| | | if($data["new"]["system_user"] != '' && !$app->system->is_user($data["new"]["system_user"])) { |
| | | exec("useradd -d ".escapeshellcmd($data["new"]["document_root"])." -g $groupname -G sshusers $username -s /bin/false"); |
| | | if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." "."useradd -d ".escapeshellcmd($data["new"]["document_root"])." -g $groupname -G sshusers $username -s /bin/false"); |
| | | $app->log("Adding the user: $username",LOGLEVEL_DEBUG); |
| | | } |
| | | |
| | |
| | | |
| | | if($this->action == 'insert') { |
| | | // Chown and chmod the directories below the document root |
| | | exec("chown -R $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); |
| | | |
| | | // The document root itself has to be owned by root |
| | | exec("chown root:root ".escapeshellcmd($data["new"]["document_root"])); |
| | | $this->_exec("chown -R $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); |
| | | // The document root itself has to be owned by root in normal level and by the web owner in security level 20 |
| | | if($web_config['security_level'] == 20) { |
| | | $this->_exec("chown $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); |
| | | } else { |
| | | $this->_exec("chown root:root ".escapeshellcmd($data["new"]["document_root"])); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | // If the security level is set to high |
| | | //* If the security level is set to high |
| | | if($web_config['security_level'] == 20) { |
| | | |
| | | exec("chmod 711 ".escapeshellcmd($data["new"]["document_root"]."/")); |
| | | exec("chmod 711 ".escapeshellcmd($data["new"]["document_root"])."/*"); |
| | | exec("chmod 710 ".escapeshellcmd($data["new"]["document_root"]."/web")); |
| | | $this->_exec("chmod 751 ".escapeshellcmd($data["new"]["document_root"]."/")); |
| | | $this->_exec("chmod 751 ".escapeshellcmd($data["new"]["document_root"])."/*"); |
| | | $this->_exec("chmod 710 ".escapeshellcmd($data["new"]["document_root"]."/web")); |
| | | |
| | | // make temp direcory writable for the apache user and the website user |
| | | exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp")); |
| | | $this->_exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp")); |
| | | |
| | | $command = 'usermod'; |
| | | $command .= ' --groups sshusers'; |
| | | $command .= ' '.escapeshellcmd($data["new"]["system_user"]); |
| | | exec($command); |
| | | $this->_exec($command); |
| | | |
| | | //* if we have a chrooted apache enviroment |
| | | if($apache_chrooted) { |
| | | $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." ".$command); |
| | | |
| | | //* add the apache user to the client group in the chroot enviroment |
| | | $tmp_groupfile = $app->system->server_conf["group_datei"]; |
| | | $app->system->server_conf["group_datei"] = $web_config['website_basedir'].'/etc/group'; |
| | | $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user'])); |
| | | $app->system->server_conf["group_datei"] = $tmp_groupfile; |
| | | unset($tmp_groupfile); |
| | | } |
| | | |
| | | //* add the apache user to the client group |
| | | $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user'])); |
| | | |
| | | $this->_exec("chown $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); |
| | | |
| | | /* |
| | | * Workaround for jailkit: If jailkit is enabled for the site, the |
| | | * website root has to be owned by the root user and we have to chmod it to 755 then |
| | | */ |
| | | |
| | | //* Check if there is a jailkit user for this site |
| | | $tmp = $app->db->queryOneRecord("SELECT count(shell_user_id) as number FROM shell_user WHERE parent_domain_id = ".$data["new"]["domain_id"]." AND chroot = 'jailkit'"); |
| | | if($tmp['number'] > 0) { |
| | | $this->_exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/")); |
| | | $this->_exec("chown root:root ".escapeshellcmd($data["new"]["document_root"]."/")); |
| | | } |
| | | unset($tmp); |
| | | |
| | | // If the security Level is set to medium |
| | | } else { |
| | | |
| | | exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/")); |
| | | exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/*")); |
| | | $this->_exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/")); |
| | | $this->_exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/*")); |
| | | $this->_exec("chown root:root ".escapeshellcmd($data["new"]["document_root"]."/")); |
| | | |
| | | // make temp direcory writable for the apache user and the website user |
| | | exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp")); |
| | | $this->_exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp")); |
| | | } |
| | | |
| | | // Change the owner of the error log to the owner of the website |
| | | if(!@is_file($data["new"]["document_root"]."/log/error.log")) exec('touch '.escapeshellcmd($data["new"]["document_root"])."/log/error.log"); |
| | | $this->_exec("chown $username:$groupname ".escapeshellcmd($data["new"]["document_root"])."/log/error.log"); |
| | | |
| | | |
| | | // Create the vhost config file |
| | |
| | | $vhost_data["web_document_root_www"] = $web_config["website_basedir"]."/".$data["new"]["domain"]."/web"; |
| | | $vhost_data["web_basedir"] = $web_config["website_basedir"]; |
| | | $vhost_data["security_level"] = $web_config["security_level"]; |
| | | $vhost_data["allow_override"] = ($data["new"]["allow_override"] == '')?'All':$data["new"]["allow_override"]; |
| | | $vhost_data["php_open_basedir"] = ($data["new"]["php_open_basedir"] == '')?$data["new"]["document_root"]:$data["new"]["php_open_basedir"]; |
| | | $vhost_data["ssl_domain"] = $data["new"]["ssl_domain"]; |
| | | |
| | | // Check if a SSL cert exists |
| | | $ssl_dir = $data["new"]["document_root"]."/ssl"; |
| | | $domain = $data["new"]["domain"]; |
| | | $domain = $data["new"]["ssl_domain"]; |
| | | $key_file = $ssl_dir.'/'.$domain.".key"; |
| | | $crt_file = $ssl_dir.'/'.$domain.".crt"; |
| | | $bundle_file = $ssl_dir.'/'.$domain.".bundle"; |
| | |
| | | $rewrite_rules = array(); |
| | | if($data["new"]["redirect_type"] != '') { |
| | | if(substr($data["new"]["redirect_path"],-1) != '/') $data["new"]["redirect_path"] .= '/'; |
| | | if($data["new"]["redirect_type"] == 'no' && substr($data["new"]["redirect_path"],0,4) != 'http') { |
| | | $data["new"]["redirect_path"] = $data["new"]["document_root"]."/web".realpath($data["new"]["redirect_path"]).'/'; |
| | | } |
| | | |
| | | $rewrite_rules[] = array( 'rewrite_domain' => $data["new"]["domain"], |
| | | 'rewrite_type' => ($data["new"]["redirect_type"] == 'no')?'':'['.$data["new"]["redirect_type"].']', |
| | | 'rewrite_target' => $data["new"]["redirect_path"]); |
| | |
| | | // Rewriting |
| | | if($alias["redirect_type"] != '') { |
| | | if(substr($data["new"]["redirect_path"],-1) != '/') $data["new"]["redirect_path"] .= '/'; |
| | | if($data["new"]["redirect_type"] == 'no' && substr($data["new"]["redirect_path"],0,4) != 'http') { |
| | | $data["new"]["redirect_path"] = $data["new"]["document_root"]."/web".realpath($data["new"]["redirect_path"]).'/'; |
| | | } |
| | | $rewrite_rules[] = array( 'rewrite_domain' => $alias["domain"], |
| | | 'rewrite_type' => ($alias["redirect_type"] == 'no')?'':'['.$alias["redirect_type"].']', |
| | | 'rewrite_target' => $alias["redirect_path"]); |
| | |
| | | $fcgi_tpl = new tpl(); |
| | | $fcgi_tpl->newTemplate("php-fcgi-starter.master"); |
| | | |
| | | $fcgi_tpl->setVar('php_ini_path',$fastcgi_config["fastcgi_phpini_path"]); |
| | | $fcgi_tpl->setVar('document_root',$data["new"]["document_root"]); |
| | | $fcgi_tpl->setVar('php_fcgi_children',$fastcgi_config["fastcgi_children"]); |
| | | $fcgi_tpl->setVar('php_fcgi_max_requests',$fastcgi_config["fastcgi_max_requests"]); |
| | | $fcgi_tpl->setVar('php_fcgi_bin',$fastcgi_config["fastcgi_bin"]); |
| | | $fcgi_tpl->setVar('security_level',$web_config["security_level"]); |
| | | $fcgi_tpl->setVar('php_ini_path',escapeshellcmd($fastcgi_config["fastcgi_phpini_path"])); |
| | | $fcgi_tpl->setVar('document_root',escapeshellcmd($data["new"]["document_root"])); |
| | | $fcgi_tpl->setVar('php_fcgi_children',escapeshellcmd($fastcgi_config["fastcgi_children"])); |
| | | $fcgi_tpl->setVar('php_fcgi_max_requests',escapeshellcmd($fastcgi_config["fastcgi_max_requests"])); |
| | | $fcgi_tpl->setVar('php_fcgi_bin',escapeshellcmd($fastcgi_config["fastcgi_bin"])); |
| | | $fcgi_tpl->setVar('security_level',intval($web_config["security_level"])); |
| | | |
| | | $php_open_basedir = ($data["new"]["php_open_basedir"] == '')?$data["new"]["document_root"]:$data["new"]["php_open_basedir"]; |
| | | $fcgi_tpl->setVar('open_basedir', escapeshellcmd($php_open_basedir)); |
| | | |
| | | $fcgi_starter_script = escapeshellcmd($fastcgi_starter_path.$fastcgi_config["fastcgi_starter_script"]); |
| | | file_put_contents($fcgi_starter_script,$fcgi_tpl->grab()); |
| | |
| | | $cgi_tpl->newTemplate("php-cgi-starter.master"); |
| | | |
| | | // This works, because php "rewrites" a symlink to the physical path |
| | | $cgi_tpl->setVar('open_basedir', $data["new"]["document_root"]); |
| | | $php_open_basedir = ($data["new"]["php_open_basedir"] == '')?$data["new"]["document_root"]:$data["new"]["php_open_basedir"]; |
| | | $cgi_tpl->setVar('open_basedir', escapeshellcmd($php_open_basedir)); |
| | | $cgi_tpl->setVar('document_root', escapeshellcmd($data["new"]["document_root"])); |
| | | |
| | | // This will NOT work! |
| | | //$cgi_tpl->setVar('open_basedir', "/var/www/" . $data["new"]["domain"]); |
| | | $cgi_tpl->setVar('php_cgi_bin',$cgi_config["cgi_bin"]); |
| | |
| | | } |
| | | |
| | | //* Create .htaccess and .htpasswd file for website statistics |
| | | if(!is_file($data["new"]["document_root"].'/web/stats/.htaccess')) { |
| | | if(!is_file($data["new"]["document_root"].'/web/stats/.htaccess') or $data["old"]["document_root"] != $data["new"]["document_root"]) { |
| | | if(!is_dir($data["new"]["document_root"].'/web/stats')) mkdir($data["new"]["document_root"].'/web/stats'); |
| | | $ht_file = "AuthType Basic\nAuthName \"Members Only\"\nAuthUserFile ".$data["new"]["document_root"]."/.htpasswd_stats\n<limit GET PUT POST>\nrequire valid-user\n</limit>"; |
| | | $ht_file = "AuthType Basic\nAuthName \"Members Only\"\nAuthUserFile ".$data["new"]["document_root"]."/.htpasswd_stats\nrequire valid-user"; |
| | | file_put_contents($data["new"]["document_root"].'/web/stats/.htaccess',$ht_file); |
| | | chmod($data["new"]["document_root"].'/web/stats/.htaccess',0664); |
| | | chmod($data["new"]["document_root"].'/web/stats/.htaccess',0755); |
| | | unset($ht_file); |
| | | } |
| | | |
| | |
| | | if(trim($data["new"]["stats_password"]) != '') { |
| | | $htp_file = 'admin:'.trim($data["new"]["stats_password"]); |
| | | file_put_contents($data["new"]["document_root"].'/.htpasswd_stats',$htp_file); |
| | | chmod($data["new"]["document_root"].'/.htpasswd_stats',0664); |
| | | chmod($data["new"]["document_root"].'/.htpasswd_stats',0755); |
| | | unset($htp_file); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | // request a httpd reload when all records have been processed |
| | | $app->services->restartServiceDelayed('httpd','reload'); |
| | | if($apache_chrooted) { |
| | | $app->services->restartServiceDelayed('httpd','restart'); |
| | | } else { |
| | | // request a httpd reload when all records have been processed |
| | | $app->services->restartServiceDelayed('httpd','reload'); |
| | | } |
| | | |
| | | //* Unset action to clean it for next processed vhost. |
| | | $this->action = ''; |
| | |
| | | $app->uses("getconf"); |
| | | $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); |
| | | |
| | | //* Check if this is a chrooted setup |
| | | if($web_config['website_basedir'] != '' && @is_file($web_config['/var/www'].'/etc/passwd')) { |
| | | $apache_chrooted = true; |
| | | } else { |
| | | $apache_chrooted = false; |
| | | } |
| | | |
| | | if($data["old"]["type"] != "vhost" && $data["old"]["parent_domain_id"] > 0) { |
| | | //* This is a alias domain or subdomain, so we have to update the website instead |
| | |
| | | $command = 'userdel'; |
| | | $command .= ' '.$data["old"]["system_user"]; |
| | | exec($command); |
| | | if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." ".$command); |
| | | |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | } |
| | | |
| | | //* Wrapper for exec function for easier debugging |
| | | private function _exec($command) { |
| | | global $app; |
| | | $app->log("exec: ".$command,LOGLEVEL_DEBUG); |
| | | exec($command); |
| | | } |
| | | |
| | | |
| | | } // end class |
| | | |