protected function composePhpOptions($domain, $ssl_vhost = false)
 {
     $php_options_text = '';
     if ($domain['phpenabled'] == '1') {
         $php = new phpinterface($domain);
         $phpconfig = $php->getPhpConfig((int) $domain['phpsettingid']);
         if ((int) Settings::Get('phpfpm.enabled') == 1) {
             $srvName = 'fpm.external';
             if ($domain['ssl'] == 1 && $ssl_vhost) {
                 $srvName = 'ssl-fpm.external';
             }
             // #1317 - perl is executed via apache and therefore, when using fpm, does not know the user
             // which perl is supposed to run as, hence the need for Suexec need
             if (customerHasPerlEnabled($domain['customerid'])) {
                 $php_options_text .= '  SuexecUserGroup "' . $domain['loginname'] . '" "' . $domain['loginname'] . '"' . "\n";
             }
             // mod_proxy stuff for apache-2.4
             if (Settings::Get('system.apache24') == '1' && Settings::Get('phpfpm.use_mod_proxy') == '1') {
                 $php_options_text .= '  <FilesMatch \\.php$>' . "\n";
                 $php_options_text .= '  SetHandler proxy:unix:' . $php->getInterface()->getSocketFile() . '|fcgi://localhost' . "\n";
                 $php_options_text .= '  </FilesMatch>' . "\n";
                 $mypath_dir = new frxDirectory($domain['documentroot']);
                 // only create the require all granted if there is not active directory-protection
                 // for this path, as this would be the first require and therefore grant all access
                 if ($mypath_dir->isUserProtected() == false) {
                     $php_options_text .= '  <Directory "' . makeCorrectDir($domain['documentroot']) . '">' . "\n";
                     $php_options_text .= '    Require all granted' . "\n";
                     $php_options_text .= '  </Directory>' . "\n";
                 }
             } else {
                 $php_options_text .= '  FastCgiExternalServer ' . $php->getInterface()->getAliasConfigDir() . $srvName . ' -socket ' . $php->getInterface()->getSocketFile() . ' -idle-timeout ' . Settings::Get('phpfpm.idle_timeout') . "\n";
                 $php_options_text .= '  <Directory "' . makeCorrectDir($domain['documentroot']) . '">' . "\n";
                 $php_options_text .= '    <FilesMatch "\\.php$">' . "\n";
                 $php_options_text .= '      SetHandler php5-fastcgi' . "\n";
                 $php_options_text .= '      Action php5-fastcgi /fastcgiphp' . "\n";
                 $php_options_text .= '      Options +ExecCGI' . "\n";
                 $php_options_text .= '    </FilesMatch>' . "\n";
                 // >=apache-2.4 enabled?
                 if (Settings::Get('system.apache24') == '1') {
                     $mypath_dir = new frxDirectory($domain['documentroot']);
                     // only create the require all granted if there is not active directory-protection
                     // for this path, as this would be the first require and therefore grant all access
                     if ($mypath_dir->isUserProtected() == false) {
                         $php_options_text .= '    Require all granted' . "\n";
                     }
                 } else {
                     $php_options_text .= '    Order allow,deny' . "\n";
                     $php_options_text .= '    allow from all' . "\n";
                 }
                 $php_options_text .= '  </Directory>' . "\n";
                 $php_options_text .= '  Alias /fastcgiphp ' . $php->getInterface()->getAliasConfigDir() . $srvName . "\n";
             }
         } else {
             $php_options_text .= '  FcgidIdleTimeout ' . Settings::Get('system.mod_fcgid_idle_timeout') . "\n";
             if ((int) Settings::Get('system.mod_fcgid_wrapper') == 0) {
                 $php_options_text .= '  SuexecUserGroup "' . $domain['loginname'] . '" "' . $domain['loginname'] . '"' . "\n";
                 $php_options_text .= '  ScriptAlias /php/ ' . $php->getInterface()->getConfigDir() . "\n";
             } else {
                 $php_options_text .= '  SuexecUserGroup "' . $domain['loginname'] . '" "' . $domain['loginname'] . '"' . "\n";
                 $php_options_text .= '  <Directory "' . makeCorrectDir($domain['documentroot']) . '">' . "\n";
                 $file_extensions = explode(' ', $phpconfig['file_extensions']);
                 $php_options_text .= '    <FilesMatch "\\.(' . implode('|', $file_extensions) . ')$">' . "\n";
                 $php_options_text .= '      SetHandler fcgid-script' . "\n";
                 foreach ($file_extensions as $file_extension) {
                     $php_options_text .= '      FcgidWrapper ' . $php->getInterface()->getStarterFile() . ' .' . $file_extension . "\n";
                 }
                 $php_options_text .= '      Options +ExecCGI' . "\n";
                 $php_options_text .= '    </FilesMatch>' . "\n";
                 // >=apache-2.4 enabled?
                 if (Settings::Get('system.apache24') == '1') {
                     $mypath_dir = new frxDirectory($domain['documentroot']);
                     // only create the require all granted if there is not active directory-protection
                     // for this path, as this would be the first require and therefore grant all access
                     if ($mypath_dir->isUserProtected() == false) {
                         $php_options_text .= '    Require all granted' . "\n";
                     }
                 } else {
                     $php_options_text .= '    Order allow,deny' . "\n";
                     $php_options_text .= '    allow from all' . "\n";
                 }
                 $php_options_text .= '  </Directory>' . "\n";
             }
         }
         // create starter-file | config-file
         $php->getInterface()->createConfig($phpconfig);
         // create php.ini (fpm does nothing here, as it
         // defines ini-settings in its pool config)
         $php->getInterface()->createIniFile($phpconfig);
     } else {
         $php_options_text .= '  # PHP is disabled for this vHost' . "\n";
     }
     return $php_options_text;
 }
 /**
  * We compose the diroption entries for the paths
  */
 public function createFileDirOptions()
 {
     $result_stmt = Database::query("\n\t\t\tSELECT `htac`.*, `c`.`guid`, `c`.`documentroot` AS `customerroot`\n\t\t\tFROM `" . TABLE_PANEL_HTACCESS . "` `htac`\n\t\t\tLEFT JOIN `" . TABLE_PANEL_CUSTOMERS . "` `c` USING (`customerid`)\n\t\t\tORDER BY `htac`.`path`\n\t\t");
     $diroptions = array();
     while ($row_diroptions = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
         if ($row_diroptions['customerid'] != 0 && isset($row_diroptions['customerroot']) && $row_diroptions['customerroot'] != '') {
             $diroptions[$row_diroptions['path']] = $row_diroptions;
             $diroptions[$row_diroptions['path']]['htpasswds'] = array();
         }
     }
     $result_stmt = Database::query("\n\t\t\tSELECT `htpw`.*, `c`.`guid`, `c`.`documentroot` AS `customerroot`\n\t\t\tFROM `" . TABLE_PANEL_HTPASSWDS . "` `htpw`\n\t\t\tLEFT JOIN `" . TABLE_PANEL_CUSTOMERS . "` `c` USING (`customerid`)\n\t\t\tORDER BY `htpw`.`path`, `htpw`.`username`\n\t\t");
     while ($row_htpasswds = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
         if ($row_htpasswds['customerid'] != 0 && isset($row_htpasswds['customerroot']) && $row_htpasswds['customerroot'] != '') {
             if (!isset($diroptions[$row_htpasswds['path']]) || !is_array($diroptions[$row_htpasswds['path']])) {
                 $diroptions[$row_htpasswds['path']] = array();
             }
             $diroptions[$row_htpasswds['path']]['path'] = $row_htpasswds['path'];
             $diroptions[$row_htpasswds['path']]['guid'] = $row_htpasswds['guid'];
             $diroptions[$row_htpasswds['path']]['customerroot'] = $row_htpasswds['customerroot'];
             $diroptions[$row_htpasswds['path']]['customerid'] = $row_htpasswds['customerid'];
             $diroptions[$row_htpasswds['path']]['htpasswds'][] = $row_htpasswds;
         }
     }
     foreach ($diroptions as $row_diroptions) {
         $row_diroptions['path'] = makeCorrectDir($row_diroptions['path']);
         mkDirWithCorrectOwnership($row_diroptions['customerroot'], $row_diroptions['path'], $row_diroptions['guid'], $row_diroptions['guid']);
         $diroptions_filename = makeCorrectFile(Settings::Get('system.apacheconf_diroptions') . '/40_froxlor_diroption_' . md5($row_diroptions['path']) . '.conf');
         if (!isset($this->diroptions_data[$diroptions_filename])) {
             $this->diroptions_data[$diroptions_filename] = '';
         }
         if (is_dir($row_diroptions['path'])) {
             $cperlenabled = customerHasPerlEnabled($row_diroptions['customerid']);
             $this->diroptions_data[$diroptions_filename] .= '<Directory "' . $row_diroptions['path'] . '">' . "\n";
             if (isset($row_diroptions['options_indexes']) && $row_diroptions['options_indexes'] == '1') {
                 $this->diroptions_data[$diroptions_filename] .= '  Options +Indexes';
                 // add perl options if enabled
                 if ($cperlenabled && isset($row_diroptions['options_cgi']) && $row_diroptions['options_cgi'] == '1') {
                     $this->diroptions_data[$diroptions_filename] .= ' +ExecCGI -MultiViews +SymLinksIfOwnerMatch +FollowSymLinks' . "\n";
                 } else {
                     $this->diroptions_data[$diroptions_filename] .= "\n";
                 }
                 fwrite($this->debugHandler, '  cron_tasks: Task3 - Setting Options +Indexes' . "\n");
             }
             if (isset($row_diroptions['options_indexes']) && $row_diroptions['options_indexes'] == '0') {
                 $this->diroptions_data[$diroptions_filename] .= '  Options -Indexes';
                 // add perl options if enabled
                 if ($cperlenabled && isset($row_diroptions['options_cgi']) && $row_diroptions['options_cgi'] == '1') {
                     $this->diroptions_data[$diroptions_filename] .= ' +ExecCGI -MultiViews +SymLinksIfOwnerMatch +FollowSymLinks' . "\n";
                 } else {
                     $this->diroptions_data[$diroptions_filename] .= "\n";
                 }
                 fwrite($this->debugHandler, '  cron_tasks: Task3 - Setting Options -Indexes' . "\n");
             }
             $statusCodes = array('404', '403', '500');
             foreach ($statusCodes as $statusCode) {
                 if (isset($row_diroptions['error' . $statusCode . 'path']) && $row_diroptions['error' . $statusCode . 'path'] != '') {
                     $defhandler = $row_diroptions['error' . $statusCode . 'path'];
                     if (!validateUrl($defhandler)) {
                         if (substr($defhandler, 0, 1) != '"' && substr($defhandler, -1, 1) != '"') {
                             $defhandler = '"' . makeCorrectFile($defhandler) . '"';
                         }
                     }
                     $this->diroptions_data[$diroptions_filename] .= '  ErrorDocument ' . $statusCode . ' ' . $defhandler . "\n";
                 }
             }
             if ($cperlenabled && isset($row_diroptions['options_cgi']) && $row_diroptions['options_cgi'] == '1') {
                 $this->diroptions_data[$diroptions_filename] .= '  AllowOverride None' . "\n";
                 $this->diroptions_data[$diroptions_filename] .= '  AddHandler cgi-script .cgi .pl' . "\n";
                 // >=apache-2.4 enabled?
                 if (Settings::Get('system.apache24') == '1') {
                     $mypath_dir = new frxDirectory($row_diroptions['path']);
                     // only create the require all granted if there is not active directory-protection
                     // for this path, as this would be the first require and therefore grant all access
                     if ($mypath_dir->isUserProtected() == false) {
                         $this->diroptions_data[$diroptions_filename] .= '  Require all granted' . "\n";
                     }
                 } else {
                     $this->diroptions_data[$diroptions_filename] .= '  Order allow,deny' . "\n";
                     $this->diroptions_data[$diroptions_filename] .= '  Allow from all' . "\n";
                 }
                 fwrite($this->debugHandler, '  cron_tasks: Task3 - Enabling perl execution' . "\n");
                 // check for suexec-workaround, #319
                 if ((int) Settings::Get('perl.suexecworkaround') == 1) {
                     // symlink this directory to suexec-safe-path
                     $loginname = getCustomerDetail($row_diroptions['customerid'], 'loginname');
                     $suexecpath = makeCorrectDir(Settings::Get('perl.suexecpath') . '/' . $loginname . '/' . md5($row_diroptions['path']) . '/');
                     if (!file_exists($suexecpath)) {
                         safe_exec('mkdir -p ' . escapeshellarg($suexecpath));
                         safe_exec('chown -R ' . escapeshellarg($row_diroptions['guid']) . ':' . escapeshellarg($row_diroptions['guid']) . ' ' . escapeshellarg($suexecpath));
                     }
                     // symlink to {$givenpath}/cgi-bin
                     // NOTE: symlinks are FILES, so do not append a / here
                     $perlsymlink = makeCorrectFile($row_diroptions['path'] . '/cgi-bin');
                     if (!file_exists($perlsymlink)) {
                         safe_exec('ln -s ' . escapeshellarg($suexecpath) . ' ' . escapeshellarg($perlsymlink));
                     }
                     safe_exec('chown ' . escapeshellarg($row_diroptions['guid']) . ':' . escapeshellarg($row_diroptions['guid']) . ' ' . escapeshellarg($perlsymlink));
                 }
             } else {
                 // if no perl-execution is enabled but the workaround is,
                 // we have to remove the symlink and folder in suexecpath
                 if ((int) Settings::Get('perl.suexecworkaround') == 1) {
                     $loginname = getCustomerDetail($row_diroptions['customerid'], 'loginname');
                     $suexecpath = makeCorrectDir(Settings::Get('perl.suexecpath') . '/' . $loginname . '/' . md5($row_diroptions['path']) . '/');
                     $perlsymlink = makeCorrectFile($row_diroptions['path'] . '/cgi-bin');
                     // remove symlink
                     if (file_exists($perlsymlink)) {
                         safe_exec('rm -f ' . escapeshellarg($perlsymlink));
                     }
                     // remove folder in suexec-path
                     if (file_exists($suexecpath)) {
                         safe_exec('rm -rf ' . escapeshellarg($suexecpath));
                     }
                 }
             }
             if (count($row_diroptions['htpasswds']) > 0) {
                 $htpasswd_filename = makeCorrectFile(Settings::Get('system.apacheconf_htpasswddir') . '/' . $row_diroptions['customerid'] . '-' . md5($row_diroptions['path']) . '.htpasswd');
                 if (!isset($this->htpasswds_data[$htpasswd_filename])) {
                     $this->htpasswds_data[$htpasswd_filename] = '';
                 }
                 foreach ($row_diroptions['htpasswds'] as $row_htpasswd) {
                     $this->htpasswds_data[$htpasswd_filename] .= $row_htpasswd['username'] . ':' . $row_htpasswd['password'] . "\n";
                 }
                 $this->diroptions_data[$diroptions_filename] .= '  AuthType Basic' . "\n";
                 $this->diroptions_data[$diroptions_filename] .= '  AuthName "' . $row_htpasswd['authname'] . '"' . "\n";
                 $this->diroptions_data[$diroptions_filename] .= '  AuthUserFile ' . $htpasswd_filename . "\n";
                 $this->diroptions_data[$diroptions_filename] .= '  require valid-user' . "\n";
             }
             $this->diroptions_data[$diroptions_filename] .= '</Directory>' . "\n";
         }
     }
 }