| | |
| | | /* |
| | | Register for the events |
| | | */ |
| | | |
| | | |
| | | |
| | | $app->plugins->registerEvent('web_domain_insert',$this->plugin_name,'ssl'); |
| | | $app->plugins->registerEvent('web_domain_update',$this->plugin_name,'ssl'); |
| | | $app->plugins->registerEvent('web_domain_delete',$this->plugin_name,'ssl'); |
| | |
| | | $app->plugins->registerEvent('server_ip_update',$this->plugin_name,'server_ip'); |
| | | $app->plugins->registerEvent('server_ip_delete',$this->plugin_name,'server_ip'); |
| | | |
| | | $app->plugins->registerEvent('webdav_user_insert',$this->plugin_name,'webdav'); |
| | | $app->plugins->registerEvent('webdav_user_update',$this->plugin_name,'webdav'); |
| | | $app->plugins->registerEvent('webdav_user_delete',$this->plugin_name,'webdav'); |
| | | } |
| | | |
| | | // Handle the creation of SSL certificates |
| | |
| | | * TODO: Create form for fastcgi configs per site. |
| | | */ |
| | | |
| | | if ($data["new"]["php"] == "fast-cgi") |
| | | { |
| | | if ($data["new"]["php"] == "fast-cgi") { |
| | | $fastcgi_config = $app->getconf->get_server_config($conf["server_id"], 'fastcgi'); |
| | | |
| | | $fastcgi_starter_path = str_replace("[system_user]",$data["new"]["system_user"],$fastcgi_config["fastcgi_starter_path"]); |
| | | $fastcgi_starter_path = str_replace("[client_id]",$client_id,$fastcgi_starter_path); |
| | | |
| | | if (!is_dir($fastcgi_starter_path)) |
| | | { |
| | | if (!is_dir($fastcgi_starter_path)) { |
| | | exec("mkdir -p ".escapeshellcmd($fastcgi_starter_path)); |
| | | //exec("chown ".$data["new"]["system_user"].":".$data["new"]["system_group"]." ".escapeshellcmd($fastcgi_starter_path)); |
| | | |
| | |
| | | * TODO: we have to fetch the data from the server-settings. |
| | | */ |
| | | |
| | | if ($data["new"]["php"] == "cgi") |
| | | { |
| | | if ($data["new"]["php"] == "cgi") { |
| | | //$cgi_config = $app->getconf->get_server_config($conf["server_id"], 'cgi'); |
| | | |
| | | $cgi_config["cgi_starter_path"] = $web_config["website_basedir"]."/php-cgi-scripts/[system_user]/"; |
| | |
| | | $cgi_starter_path = str_replace("[system_user]",$data["new"]["system_user"],$cgi_config["cgi_starter_path"]); |
| | | $cgi_starter_path = str_replace("[client_id]",$client_id,$cgi_starter_path); |
| | | |
| | | if (!is_dir($cgi_starter_path)) |
| | | { |
| | | if (!is_dir($cgi_starter_path)) { |
| | | exec("mkdir -p ".escapeshellcmd($cgi_starter_path)); |
| | | exec("chown ".$data["new"]["system_user"].":".$data["new"]["system_group"]." ".escapeshellcmd($cgi_starter_path)); |
| | | |
| | |
| | | file_put_contents($vhost_file,$tpl->grab()); |
| | | $app->log("Writing the vhost file: $vhost_file",LOGLEVEL_DEBUG); |
| | | unset($tpl); |
| | | |
| | | /* |
| | | * maybe we have some webdav - user. If so, add them... |
| | | */ |
| | | $this->_patchVhostWebdav($vhost_file, $data["new"]["document_root"] . '/webdav'); |
| | | |
| | | // Set the symlink to enable the vhost |
| | | $vhost_symlink = escapeshellcmd($web_config["vhost_conf_enabled_dir"].'/'.$data["new"]["domain"].'.vhost'); |
| | |
| | | |
| | | |
| | | //remove the php fastgi starter script if available |
| | | if ($data["old"]["php"] == "fast-cgi") |
| | | { |
| | | if ($data["old"]["php"] == "fast-cgi") { |
| | | $fastcgi_starter_path = str_replace("[system_user]",$data["old"]["system_user"],$web_config["fastcgi_starter_path"]); |
| | | if (is_dir($fastcgi_starter_path)) |
| | | { |
| | | if (is_dir($fastcgi_starter_path)) { |
| | | exec("rm -rf $fastcgi_starter_path"); |
| | | } |
| | | } |
| | | |
| | | //remove the php cgi starter script if available |
| | | if ($data["old"]["php"] == "cgi") |
| | | { |
| | | if ($data["old"]["php"] == "cgi") { |
| | | // TODO: fetch the date from the server-settings |
| | | $web_config["cgi_starter_path"] = $web_config["website_basedir"]."/php-cgi-scripts/[system_user]/"; |
| | | |
| | | $cgi_starter_path = str_replace("[system_user]",$data["old"]["system_user"],$web_config["cgi_starter_path"]); |
| | | if (is_dir($cgi_starter_path)) |
| | | { |
| | | if (is_dir($cgi_starter_path)) { |
| | | exec("rm -rf $cgi_starter_path"); |
| | | } |
| | | } |
| | |
| | | |
| | | } |
| | | |
| | | /** |
| | | * This function is called when a Webdav-User is inserted, updated or deleted. |
| | | * |
| | | * @author Oliver Vogel |
| | | * @param string $event_name |
| | | * @param array $data |
| | | */ |
| | | public function webdav($event_name,$data) { |
| | | global $app, $conf; |
| | | |
| | | if (($event_name == 'webdav_user_insert') || ($event_name == 'webdav_user_update')) { |
| | | /* |
| | | * load the server configuration options |
| | | */ |
| | | $app->uses("getconf"); |
| | | $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); |
| | | |
| | | /* |
| | | * Get additional informations |
| | | */ |
| | | $sitedata = $app->db->queryOneRecord("SELECT document_root, domain FROM web_domain WHERE domain_id = " . $data['new']['parent_domain_id']); |
| | | $documentRoot = $sitedata['document_root']; |
| | | $domain = $sitedata['domain']; |
| | | |
| | | /* 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; |
| | | } |
| | | |
| | | /* |
| | | * First the webdav-root - folder has to exist |
| | | */ |
| | | if(!is_dir($documentRoot . '/webdav/' . $data['new']['dir'])) { |
| | | $app->log("Webdav User directory '".$documentRoot.'/webdav/' . $data['new']['dir']."' does not exist. Creating it now.",LOGLEVEL_DEBUG); |
| | | exec('mkdir -p '.escapeshellcmd($documentRoot . '/webdav/' . $data['new']['dir'])); |
| | | } |
| | | |
| | | /* |
| | | * The webdav folder (not the root!) has to be owned by the apache-user |
| | | */ |
| | | exec('chown ' . escapeshellcmd($web_config['user']) . ':' . escapeshellcmd($web_config['group']) . ' ' . $documentRoot . '/webdav/' . $data['new']['dir'] . ' -R'); |
| | | |
| | | /* |
| | | * Next step is to update the password - file |
| | | */ |
| | | $this->_writeHtDigestFile( $documentRoot . '/webdav/' . $data['new']['dir'] . '.htdigest', $data['new']['username'], $data['new']['dir'], $data['new']['password']); |
| | | |
| | | /* |
| | | * Next step, patch the vhost - file |
| | | */ |
| | | $vhost_file = escapeshellcmd($web_config["vhost_conf_dir"] . '/' . $domain . '.vhost'); |
| | | $this->_patchVhostWebdav($vhost_file, $documentRoot . '/webdav'); |
| | | |
| | | /* |
| | | * Last, restart apache |
| | | */ |
| | | if($apache_chrooted) { |
| | | $app->services->restartServiceDelayed('httpd','restart'); |
| | | } else { |
| | | // request a httpd reload when all records have been processed |
| | | $app->services->restartServiceDelayed('httpd','reload'); |
| | | } |
| | | |
| | | } |
| | | |
| | | if ($event_name == 'webdav_user_delete') { |
| | | /* |
| | | * Get additional informations |
| | | */ |
| | | $sitedata = $app->db->queryOneRecord("SELECT document_root, domain FROM web_domain WHERE domain_id = " . $data['old']['parent_domain_id']); |
| | | $documentRoot = $sitedata['document_root']; |
| | | |
| | | /* |
| | | * We dont't want to destroy any (transfer)-Data. So we do NOT delete any dir. |
| | | * So the only thing, we have to do, is to delete the user from the password-file |
| | | */ |
| | | $this->_writeHtDigestFile( $documentRoot . '/webdav/' . $data['old']['dir'] . '.htdigest', $data['old']['username'], $data['old']['dir'], ''); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * This function writes the htdigest - files used by webdav and digest |
| | | * @author Oliver Vogel |
| | | * @param string $filename The name of the digest-file |
| | | * @param string $username The name of the webdav-user |
| | | * @param string $authname The name of the realm |
| | | * @param string $pwd The password of the user |
| | | */ |
| | | private function _writeHtDigestFile($filename, $username, $authname, $pwd ) { |
| | | $changed = false; |
| | | $in = fopen($filename, 'r'); |
| | | $output = ''; |
| | | |
| | | /* |
| | | * read line by line and search for the username and authname |
| | | */ |
| | | while (preg_match("/:/", $line = fgets($in))) { |
| | | $line = rtrim($line); |
| | | $tmp = explode(':', $line); |
| | | if ($tmp[0] == $username && $tmp[1] == $authname) { |
| | | /* |
| | | * found the user. delete or change it? |
| | | */ |
| | | if ($pwd != '') { |
| | | $tmp[2] = md5($username . ':' . $authname . ':' .$pwd); |
| | | $output .= $tmp[0] . ':' . $tmp[1] . ':' . $tmp[2] . "\n"; |
| | | } |
| | | $changed = true; |
| | | } |
| | | else { |
| | | $output .= $line . "\n"; |
| | | } |
| | | } |
| | | /* |
| | | * if we didn't change anything, we have to add the new user at the end of the file |
| | | */ |
| | | if (!$changed) { |
| | | $output .= $username . ':' . $authname . ':' . md5($username . ':' . $authname . ':' . $pwd) . "\n"; |
| | | } |
| | | fclose($in); |
| | | |
| | | /* |
| | | * Now lets write the new file |
| | | */ |
| | | file_put_contents($filename, $output); |
| | | } |
| | | |
| | | /** |
| | | * This function patches the vhost-file and adds all webdav - user. |
| | | * This function is written, because the creation of the vhost - file is sophisticated and |
| | | * i don't want to make it more "heavy" by also adding this code too... |
| | | * @author Oliver Vogel |
| | | * @param string $fileName The Name of the .vhost-File (path included) |
| | | * @param string $webdavRoot The root of the webdav-folder |
| | | */ |
| | | private function _patchVhostWebdav($fileName, $webdavRoot) { |
| | | $in = fopen($fileName, 'r'); |
| | | $output = ''; |
| | | $inWebdavSection = false; |
| | | |
| | | /* |
| | | * read line by line and search for the username and authname |
| | | */ |
| | | while ($line = fgets($in)) { |
| | | /* |
| | | * is the "replace-comment" found... |
| | | */ |
| | | if (trim($line) == '# WEBDAV BEGIN') { |
| | | /* |
| | | * The begin of the webdav - section is found, so ignore all lines til the end is found |
| | | */ |
| | | $inWebdavSection = true; |
| | | |
| | | $output .= " # WEBDAV BEGIN\n"; |
| | | |
| | | /* |
| | | * add all the webdav-dirs to the webdav-section |
| | | */ |
| | | $files = scandir($webdavRoot); |
| | | foreach($files as $file) { |
| | | if (substr($file, strlen($file) - strlen('.htdigest')) == '.htdigest') { |
| | | /* |
| | | * found a htdigest - file, so add it to webdav |
| | | */ |
| | | $fn = substr($file, 0, strlen($file) - strlen('.htdigest')); |
| | | $output .= "\n"; |
| | | $output .= " Alias /" . $fn . " " . $webdavRoot . "/" . $fn . "\n"; |
| | | $output .= " <Location /" . $fn . ">\n"; |
| | | $output .= " DAV On\n"; |
| | | $output .= " AuthType Digest\n"; |
| | | $output .= " AuthName \"" . $fn . "\"\n"; |
| | | $output .= " AuthUserFile " . $webdavRoot . "/" . $file . "\n"; |
| | | $output .= " Require valid-user \n"; |
| | | $output .= " Options +Indexes \n"; |
| | | $output .= " Order allow,deny \n"; |
| | | $output .= " Allow from all \n"; |
| | | $output .= " </Location> \n"; |
| | | } |
| | | } |
| | | } |
| | | /* |
| | | * is the "replace-comment-end" found... |
| | | */ |
| | | if (trim($line) == '# WEBDAV END') { |
| | | /* |
| | | * The end of the webdav - section is found, so stop ignoring |
| | | */ |
| | | $inWebdavSection = false; |
| | | } |
| | | |
| | | /* |
| | | * Write the line to the output, if it is not in the section |
| | | */ |
| | | if (!$inWebdavSection) { |
| | | $output .= $line; |
| | | } |
| | | } |
| | | fclose($in); |
| | | |
| | | /* |
| | | * Now lets write the new file |
| | | */ |
| | | file_put_contents($fileName, $output); |
| | | |
| | | } |
| | | |
| | | //* Wrapper for exec function for easier debugging |
| | | private function _exec($command) { |
| | | global $app; |