ftimme
2013-02-12 4ccdf7b9c1783e2b80000af92ba73c1bcf7cac01
server/plugins-available/nginx_plugin.inc.php
@@ -435,39 +435,43 @@
            }
         }
         //* Move the site data
         $tmp_docroot = explode('/',$data['new']['document_root']);
         unset($tmp_docroot[count($tmp_docroot)-1]);
         $new_dir = implode('/',$tmp_docroot);
         if($data["new"]["type"] != "vhostsubdomain") {
            //* Move the site data
            $tmp_docroot = explode('/',$data['new']['document_root']);
            unset($tmp_docroot[count($tmp_docroot)-1]);
            $new_dir = implode('/',$tmp_docroot);
         $tmp_docroot = explode('/',$data['old']['document_root']);
         unset($tmp_docroot[count($tmp_docroot)-1]);
         $old_dir = implode('/',$tmp_docroot);
            $tmp_docroot = explode('/',$data['old']['document_root']);
            unset($tmp_docroot[count($tmp_docroot)-1]);
            $old_dir = implode('/',$tmp_docroot);
         //* Check if there is already some data in the new docroot and rename it as we need a clean path to move the existing site to the new path
         if(@is_dir($data['new']['document_root'])) {
            $app->system->rename($data['new']['document_root'],$data['new']['document_root'].'_bak_'.date('Y_m_d'));
            $app->log('Renaming existing directory in new docroot location. mv '.$data['new']['document_root'].' '.$data['new']['document_root'].'_bak_'.date('Y_m_d'),LOGLEVEL_DEBUG);
         }
            //* Check if there is already some data in the new docroot and rename it as we need a clean path to move the existing site to the new path
            if(@is_dir($data['new']['document_root'])) {
               $app->system->web_folder_protection($data['new']['document_root'],false);
               $app->system->rename($data['new']['document_root'],$data['new']['document_root'].'_bak_'.date('Y_m_d_H_i_s'));
               $app->log('Renaming existing directory in new docroot location. mv '.$data['new']['document_root'].' '.$data['new']['document_root'].'_bak_'.date('Y_m_d_H_i_s'),LOGLEVEL_DEBUG);
            }
         
         //* Create new base directory, if it does not exist yet
         if(!is_dir($new_dir)) $app->system->mkdirpath($new_dir);
         exec('mv '.escapeshellarg($data['old']['document_root']).' '.escapeshellarg($new_dir));
         //$app->system->rename($data['old']['document_root'],$new_dir);
         $app->log('Moving site to new document root: mv '.$data['old']['document_root'].' '.$new_dir,LOGLEVEL_DEBUG);
            //* Create new base directory, if it does not exist yet
            if(!is_dir($new_dir)) $app->system->mkdirpath($new_dir);
            $app->system->web_folder_protection($data['old']['document_root'],false);
            exec('mv '.escapeshellarg($data['old']['document_root']).' '.escapeshellarg($new_dir));
            //$app->system->rename($data['old']['document_root'],$new_dir);
            $app->log('Moving site to new document root: mv '.$data['old']['document_root'].' '.$new_dir,LOGLEVEL_DEBUG);
         // Handle the change in php_open_basedir
         $data['new']['php_open_basedir'] = str_replace($data['old']['document_root'],$data['new']['document_root'],$data['old']['php_open_basedir']);
            // Handle the change in php_open_basedir
            $data['new']['php_open_basedir'] = str_replace($data['old']['document_root'],$data['new']['document_root'],$data['old']['php_open_basedir']);
         //* Change the owner of the website files to the new website owner
         exec('chown --recursive --from='.escapeshellcmd($data['old']['system_user']).':'.escapeshellcmd($data['old']['system_group']).' '.escapeshellcmd($data['new']['system_user']).':'.escapeshellcmd($data['new']['system_group']).' '.$new_dir);
            //* Change the owner of the website files to the new website owner
            exec('chown --recursive --from='.escapeshellcmd($data['old']['system_user']).':'.escapeshellcmd($data['old']['system_group']).' '.escapeshellcmd($data['new']['system_user']).':'.escapeshellcmd($data['new']['system_group']).' '.$new_dir);
         //* Change the home directory and group of the website user
         $command = 'usermod';
         $command .= ' --home '.escapeshellcmd($data['new']['document_root']);
         $command .= ' --gid '.escapeshellcmd($data['new']['system_group']);
         $command .= ' '.escapeshellcmd($data['new']['system_user']);
         exec($command);
            //* Change the home directory and group of the website user
            $command = 'killall -u '.escapeshellcmd($data['new']['system_user']).' && usermod';
            $command .= ' --home '.escapeshellcmd($data['new']['document_root']);
            $command .= ' --gid '.escapeshellcmd($data['new']['system_group']);
            $command .= ' '.escapeshellcmd($data['new']['system_user']);
            exec($command);
         }
         if($nginx_chrooted) $this->_exec('chroot '.escapeshellcmd($web_config['website_basedir']).' '.$command);
         
@@ -699,7 +703,7 @@
            }
            
            if($web_config['add_web_users_to_sshusers_group'] == 'y') {
               $command = 'usermod';
               $command = 'killall -u '.escapeshellcmd($data['new']['system_user']).' && usermod';
               $command .= ' --groups sshusers';
               $command .= ' '.escapeshellcmd($data['new']['system_user']);
               $this->_exec($command);
@@ -982,6 +986,7 @@
      // Rewrite rules
      $own_rewrite_rules = array();
      $rewrite_rules = array();
      $local_rewrite_rules = array();
      if($data['new']['redirect_type'] != '' && $data['new']['redirect_path'] != '') {
         if(substr($data['new']['redirect_path'],-1) != '/') $data['new']['redirect_path'] .= '/';
         if(substr($data['new']['redirect_path'],0,8) == '[scheme]'){
@@ -1011,6 +1016,7 @@
         switch($data['new']['subdomain']) {
            case 'www':
               $exclude_own_hostname = '';
               if(substr($data['new']['redirect_path'],0,1) == '/'){ // relative path
                  if($data['new']['redirect_type'] == 'proxy'){
                     $vhost_data['web_document_root_www_proxy'] = 'root '.$vhost_data['web_document_root_www'].';';
@@ -1033,6 +1039,7 @@
                        break;
                     } else {
                        $rewrite_exclude = '(?!/\b('.substr($tmp_redirect_path_parts['path'],1).(substr($tmp_redirect_path_parts['path'],1) != ''? '|': '').'stats'.($vhost_data['errordocs'] == 1 ? '|error' : '').')\b)/';
                        $exclude_own_hostname = $tmp_redirect_path_parts['host'];
                     }
                  } else {
                     // external URL
@@ -1041,7 +1048,8 @@
                        $vhost_data['use_proxy'] = 'y';
                        $rewrite_subdir = $tmp_redirect_path_parts['path'];
                        if(substr($rewrite_subdir,0,1) == '/') $rewrite_subdir = substr($rewrite_subdir,1);
                        if(substr($rewrite_subdir,-1) == '/') $rewrite_subdir = substr($rewrite_subdir,0,-1);
                        if(substr($rewrite_subdir,-1) != '/') $rewrite_subdir .= '/';
                        if($rewrite_subdir == '/') $rewrite_subdir = '';
                     }
                  }
                  unset($tmp_redirect_path);
@@ -1052,11 +1060,13 @@
                  'rewrite_target'    => $data['new']['redirect_path'],
                  'rewrite_exclude'   => $rewrite_exclude,
                  'rewrite_subdir'   => $rewrite_subdir,
                  'exclude_own_hostname' => $exclude_own_hostname,
                  'proxy_directives'   => $final_proxy_directives,
                  'use_rewrite'   => ($data['new']['redirect_type'] == 'proxy' ? false:true),
                  'use_proxy'   => ($data['new']['redirect_type'] == 'proxy' ? true:false));
               break;
            case '*':
               $exclude_own_hostname = '';
               if(substr($data['new']['redirect_path'],0,1) == '/'){ // relative path
                  if($data['new']['redirect_type'] == 'proxy'){
                     $vhost_data['web_document_root_www_proxy'] = 'root '.$vhost_data['web_document_root_www'].';';
@@ -1081,6 +1091,7 @@
                        break;
                     } else {
                        $rewrite_exclude = '(?!/\b('.substr($tmp_redirect_path_parts['path'],1).(substr($tmp_redirect_path_parts['path'],1) != ''? '|': '').'stats'.($vhost_data['errordocs'] == 1 ? '|error' : '').')\b)/';
                        $exclude_own_hostname = $tmp_redirect_path_parts['host'];
                     }
                  } else {
                     // external URL
@@ -1089,7 +1100,8 @@
                        $vhost_data['use_proxy'] = 'y';
                        $rewrite_subdir = $tmp_redirect_path_parts['path'];
                        if(substr($rewrite_subdir,0,1) == '/') $rewrite_subdir = substr($rewrite_subdir,1);
                        if(substr($rewrite_subdir,-1) == '/') $rewrite_subdir = substr($rewrite_subdir,0,-1);
                        if(substr($rewrite_subdir,-1) != '/') $rewrite_subdir .= '/';
                        if($rewrite_subdir == '/') $rewrite_subdir = '';
                     }
                  }
                  unset($tmp_redirect_path);
@@ -1100,12 +1112,14 @@
                  'rewrite_target'    => $data['new']['redirect_path'],
                  'rewrite_exclude'   => $rewrite_exclude,
                  'rewrite_subdir'   => $rewrite_subdir,
                  'exclude_own_hostname' => $exclude_own_hostname,
                  'proxy_directives'   => $final_proxy_directives,
                  'use_rewrite'   => ($data['new']['redirect_type'] == 'proxy' ? false:true),
                  'use_proxy'   => ($data['new']['redirect_type'] == 'proxy' ? true:false));
               break;
            default:
               if(substr($data['new']['redirect_path'],0,1) == '/'){ // relative path
                  $exclude_own_hostname = '';
                  if($data['new']['redirect_type'] == 'proxy'){
                     $vhost_data['web_document_root_www_proxy'] = 'root '.$vhost_data['web_document_root_www'].';';
                     $vhost_data['web_document_root_www'] .= substr($data['new']['redirect_path'],0,-1);
@@ -1127,6 +1141,7 @@
                        break;
                     } else {
                        $rewrite_exclude = '(?!/\b('.substr($tmp_redirect_path_parts['path'],1).(substr($tmp_redirect_path_parts['path'],1) != ''? '|': '').'stats'.($vhost_data['errordocs'] == 1 ? '|error' : '').')\b)/';
                        $exclude_own_hostname = $tmp_redirect_path_parts['host'];
                     }
                  } else {
                     // external URL
@@ -1135,7 +1150,8 @@
                        $vhost_data['use_proxy'] = 'y';
                        $rewrite_subdir = $tmp_redirect_path_parts['path'];
                        if(substr($rewrite_subdir,0,1) == '/') $rewrite_subdir = substr($rewrite_subdir,1);
                        if(substr($rewrite_subdir,-1) == '/') $rewrite_subdir = substr($rewrite_subdir,0,-1);
                        if(substr($rewrite_subdir,-1) != '/') $rewrite_subdir .= '/';
                        if($rewrite_subdir == '/') $rewrite_subdir = '';
                     }
                  }
                  unset($tmp_redirect_path);
@@ -1146,6 +1162,7 @@
                  'rewrite_target'    => $data['new']['redirect_path'],
                  'rewrite_exclude'   => $rewrite_exclude,
                  'rewrite_subdir'   => $rewrite_subdir,
                  'exclude_own_hostname' => $exclude_own_hostname,
                  'proxy_directives'   => $final_proxy_directives,
                  'use_rewrite'   => ($data['new']['redirect_type'] == 'proxy' ? false:true),
                  'use_proxy'   => ($data['new']['redirect_type'] == 'proxy' ? true:false));
@@ -1202,7 +1219,7 @@
               $final_proxy_directives = false;
            }
         
            if($alias['redirect_type'] == '' || $alias['redirect_path'] == '') {
            if($alias['redirect_type'] == '' || $alias['redirect_path'] == '' || substr($alias['redirect_path'],0,1) == '/') {
               switch($alias['subdomain']) {
                  case 'www':
                     $server_alias[] = 'www.'.$alias['domain'].' '.$alias['domain'].' ';
@@ -1225,8 +1242,44 @@
               }
            }
            
            // Rewriting
            if($alias['redirect_type'] != '' && $alias['redirect_path'] != '') {
            // Local Rewriting (inside vhost server {} container)
            if($alias['redirect_type'] != '' && substr($alias['redirect_path'],0,1) == '/' && $alias['redirect_type'] != 'proxy') {  // proxy makes no sense with local path
               if(substr($alias['redirect_path'],-1) != '/') $alias['redirect_path'] .= '/';
               $rewrite_exclude = '(?!/\b('.substr($alias['redirect_path'],1,-1).(substr($alias['redirect_path'],1,-1) != ''? '|': '').'stats'.($vhost_data['errordocs'] == 1 ? '|error' : '').')\b)/';
               switch($alias['subdomain']) {
                  case 'www':
                     // example.com
                     $local_rewrite_rules[] = array(   'local_redirect_origin_domain'    => $alias['domain'],
                        'local_redirect_operator'   => '=',
                        'local_redirect_exclude' => $rewrite_exclude,
                        'local_redirect_target' => $alias['redirect_path'],
                        'local_redirect_type' => ($alias['redirect_type'] == 'no')?'':$alias['redirect_type']);
                     // www.example.com
                     $local_rewrite_rules[] = array(   'local_redirect_origin_domain'    => 'www.'.$alias['domain'],
                        'local_redirect_operator'   => '=',
                        'local_redirect_exclude' => $rewrite_exclude,
                        'local_redirect_target' => $alias['redirect_path'],
                        'local_redirect_type' => ($alias['redirect_type'] == 'no')?'':$alias['redirect_type']);
                     break;
                  case '*':
                     $local_rewrite_rules[] = array(   'local_redirect_origin_domain'    => '^('.str_replace('.', '\.', $alias['domain']).'|.+\.'.str_replace('.', '\.', $alias['domain']).')$',
                        'local_redirect_operator'   => '~*',
                        'local_redirect_exclude' => $rewrite_exclude,
                        'local_redirect_target' => $alias['redirect_path'],
                        'local_redirect_type' => ($alias['redirect_type'] == 'no')?'':$alias['redirect_type']);
                     break;
                  default:
                     $local_rewrite_rules[] = array(   'local_redirect_origin_domain'    => $alias['domain'],
                        'local_redirect_operator'   => '=',
                        'local_redirect_exclude' => $rewrite_exclude,
                        'local_redirect_target' => $alias['redirect_path'],
                        'local_redirect_type' => ($alias['redirect_type'] == 'no')?'':$alias['redirect_type']);
               }
            }
            // External Rewriting (extra server {} containers)
            if($alias['redirect_type'] != '' && $alias['redirect_path'] != '' && substr($alias['redirect_path'],0,1) != '/') {
               if(substr($alias['redirect_path'],-1) != '/') $alias['redirect_path'] .= '/';
               if(substr($alias['redirect_path'],0,8) == '[scheme]'){
                  if($alias['redirect_type'] != 'proxy'){
@@ -1238,21 +1291,15 @@
               
               switch($alias['subdomain']) {
                  case 'www':
                     if(substr($alias['redirect_path'],0,1) == '/'){ // relative path
                        if($alias['redirect_type'] == 'proxy'){
                           $rewrite_subdir = substr($alias['redirect_path'],1);
                           if(substr($rewrite_subdir,-1) == '/') $rewrite_subdir = substr($rewrite_subdir,0,-1);
                        }
                        $alias['redirect_path'] = ($alias['redirect_type'] == 'proxy'? 'http' : '$scheme').'://'.($vhost_data['seo_redirect_enabled'] ? $vhost_data['seo_redirect_target_domain'] : $data['new']['domain']).$alias['redirect_path'];
                     } else {
                        if($alias['redirect_type'] == 'proxy'){
                           $tmp_redirect_path = $alias['redirect_path'];
                           $tmp_redirect_path_parts = parse_url($tmp_redirect_path);
                           $rewrite_subdir = $tmp_redirect_path_parts['path'];
                           if(substr($rewrite_subdir,0,1) == '/') $rewrite_subdir = substr($rewrite_subdir,1);
                           if(substr($rewrite_subdir,-1) == '/') $rewrite_subdir = substr($rewrite_subdir,0,-1);
                        }
                     if($alias['redirect_type'] == 'proxy'){
                        $tmp_redirect_path = $alias['redirect_path'];
                        $tmp_redirect_path_parts = parse_url($tmp_redirect_path);
                        $rewrite_subdir = $tmp_redirect_path_parts['path'];
                        if(substr($rewrite_subdir,0,1) == '/') $rewrite_subdir = substr($rewrite_subdir,1);
                        if(substr($rewrite_subdir,-1) != '/') $rewrite_subdir .= '/';
                        if($rewrite_subdir == '/') $rewrite_subdir = '';
                     }
                     if($alias['redirect_type'] != 'proxy'){
                        if(substr($alias['redirect_path'],-1) == '/') $alias['redirect_path'] = substr($alias['redirect_path'],0,-1);
                     }
@@ -1272,26 +1319,7 @@
                        'use_rewrite'   => ($alias['redirect_type'] == 'proxy' ? false:true),
                        'use_proxy'   => ($alias['redirect_type'] == 'proxy' ? true:false),
                        'alias_seo_redirects2' => (count($alias_seo_redirects2) > 0 ? $alias_seo_redirects2 : false));
                     if(substr($alias['redirect_path'],0,1) == '/'){ // relative path
                        if($alias['redirect_type'] == 'proxy'){
                           $rewrite_subdir = substr($alias['redirect_path'],1);
                           if(substr($rewrite_subdir,-1) == '/') $rewrite_subdir = substr($rewrite_subdir,0,-1);
                        }
                        $alias['redirect_path'] = ($alias['redirect_type'] == 'proxy'? 'http' : '$scheme').'://'.($vhost_data['seo_redirect_enabled'] ? $vhost_data['seo_redirect_target_domain'] : $data['new']['domain']).$alias['redirect_path'];
                     } else {
                        if($alias['redirect_type'] == 'proxy'){
                           $tmp_redirect_path = $alias['redirect_path'];
                           $tmp_redirect_path_parts = parse_url($tmp_redirect_path);
                           $rewrite_subdir = $tmp_redirect_path_parts['path'];
                           if(substr($rewrite_subdir,0,1) == '/') $rewrite_subdir = substr($rewrite_subdir,1);
                           if(substr($rewrite_subdir,-1) == '/') $rewrite_subdir = substr($rewrite_subdir,0,-1);
                        }
                     }
                     if($alias['redirect_type'] != 'proxy'){
                        if(substr($alias['redirect_path'],-1) == '/') $alias['redirect_path'] = substr($alias['redirect_path'],0,-1);
                     }
                     // Add SEO redirects for alias domains
                     $alias_seo_redirects2 = array();
                     if($alias['seo_redirect'] != ''){
@@ -1310,21 +1338,15 @@
                        'alias_seo_redirects2' => (count($alias_seo_redirects2) > 0 ? $alias_seo_redirects2 : false));
                     break;
                  case '*':
                     if(substr($alias['redirect_path'],0,1) == '/'){ // relative path
                        if($alias['redirect_type'] == 'proxy'){
                           $rewrite_subdir = substr($alias['redirect_path'],1);
                           if(substr($rewrite_subdir,-1) == '/') $rewrite_subdir = substr($rewrite_subdir,0,-1);
                        }
                        $alias['redirect_path'] = ($alias['redirect_type'] == 'proxy'? 'http' : '$scheme').'://'.($vhost_data['seo_redirect_enabled'] ? $vhost_data['seo_redirect_target_domain'] : $data['new']['domain']).$alias['redirect_path'];
                     } else {
                        if($alias['redirect_type'] == 'proxy'){
                           $tmp_redirect_path = $alias['redirect_path'];
                           $tmp_redirect_path_parts = parse_url($tmp_redirect_path);
                           $rewrite_subdir = $tmp_redirect_path_parts['path'];
                           if(substr($rewrite_subdir,0,1) == '/') $rewrite_subdir = substr($rewrite_subdir,1);
                           if(substr($rewrite_subdir,-1) == '/') $rewrite_subdir = substr($rewrite_subdir,0,-1);
                        }
                     if($alias['redirect_type'] == 'proxy'){
                        $tmp_redirect_path = $alias['redirect_path'];
                        $tmp_redirect_path_parts = parse_url($tmp_redirect_path);
                        $rewrite_subdir = $tmp_redirect_path_parts['path'];
                        if(substr($rewrite_subdir,0,1) == '/') $rewrite_subdir = substr($rewrite_subdir,1);
                        if(substr($rewrite_subdir,-1) != '/') $rewrite_subdir .= '/';
                        if($rewrite_subdir == '/') $rewrite_subdir = '';
                     }
                     if($alias['redirect_type'] != 'proxy'){
                        if(substr($alias['redirect_path'],-1) == '/') $alias['redirect_path'] = substr($alias['redirect_path'],0,-1);
                     }
@@ -1346,21 +1368,15 @@
                        'alias_seo_redirects2' => (count($alias_seo_redirects2) > 0 ? $alias_seo_redirects2 : false));
                     break;
                  default:
                     if(substr($alias['redirect_path'],0,1) == '/'){ // relative path
                        if($alias['redirect_type'] == 'proxy'){
                           $rewrite_subdir = substr($alias['redirect_path'],1);
                           if(substr($rewrite_subdir,-1) == '/') $rewrite_subdir = substr($rewrite_subdir,0,-1);
                        }
                        $alias['redirect_path'] = ($alias['redirect_type'] == 'proxy'? 'http' : '$scheme').'://'.($vhost_data['seo_redirect_enabled'] ? $vhost_data['seo_redirect_target_domain'] : $data['new']['domain']).$alias['redirect_path'];
                     } else {
                        if($alias['redirect_type'] == 'proxy'){
                           $tmp_redirect_path = $alias['redirect_path'];
                           $tmp_redirect_path_parts = parse_url($tmp_redirect_path);
                           $rewrite_subdir = $tmp_redirect_path_parts['path'];
                           if(substr($rewrite_subdir,0,1) == '/') $rewrite_subdir = substr($rewrite_subdir,1);
                           if(substr($rewrite_subdir,-1) == '/') $rewrite_subdir = substr($rewrite_subdir,0,-1);
                        }
                     if($alias['redirect_type'] == 'proxy'){
                        $tmp_redirect_path = $alias['redirect_path'];
                        $tmp_redirect_path_parts = parse_url($tmp_redirect_path);
                        $rewrite_subdir = $tmp_redirect_path_parts['path'];
                        if(substr($rewrite_subdir,0,1) == '/') $rewrite_subdir = substr($rewrite_subdir,1);
                        if(substr($rewrite_subdir,-1) != '/') $rewrite_subdir .= '/';
                        if($rewrite_subdir == '/') $rewrite_subdir = '';
                     }
                     if($alias['redirect_type'] != 'proxy'){
                        if(substr($alias['redirect_path'],-1) == '/') $alias['redirect_path'] = substr($alias['redirect_path'],0,-1);
                     }
@@ -1411,6 +1427,9 @@
      }
      if(count($own_rewrite_rules) > 0) {
         $tpl->setLoop('own_redirects',$own_rewrite_rules);
      }
      if(count($local_rewrite_rules) > 0) {
         $tpl->setLoop('local_redirects',$local_rewrite_rules);
      }
      if(count($alias_seo_redirects) > 0) {
         $tpl->setLoop('alias_seo_redirects',$alias_seo_redirects);
@@ -1798,8 +1817,8 @@
            
            if($data['old']['type'] == 'vhost') {
                //delete the web user
                $command = 'userdel';
                $command .= ' '.$data['old']['system_user'];
                $command = 'killall -u '.escapeshellcmd($data['old']['system_user']).' && userdel';
                $command .= ' '.escapeshellcmd($data['old']['system_user']);
                exec($command);
                if($nginx_chrooted) $this->_exec('chroot '.escapeshellcmd($web_config['website_basedir']).' '.$command);
                
@@ -2424,6 +2443,17 @@
         
         $client_dir = $web_config['website_basedir'].'/clients/client'.$client_id;
         if(is_dir($client_dir) && !stristr($client_dir,'..')) {
            // remove symlinks from $client_dir
            $files = array_diff(scandir($client_dir), array('.','..'));
            if(is_array($files) && !empty($files)){
               foreach($files as $file){
                  if(is_link($client_dir.'/'.$file)){
                     unlink($client_dir.'/'.$file);
                     $app->log('Removed symlink: '.$client_dir.'/'.$file,LOGLEVEL_DEBUG);
                  }
               }
            }
            @rmdir($client_dir);
            $app->log('Removed client directory: '.$client_dir,LOGLEVEL_DEBUG);
         }