vogelor
2010-06-08 ac933eda98110a7b12e488f47ce493c56f1e04de
server/plugins-available/apache2_plugin.inc.php
@@ -60,9 +60,6 @@
      /*
      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');
@@ -75,6 +72,9 @@
      $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
@@ -687,15 +687,13 @@
       * 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));
            
@@ -741,8 +739,7 @@
       * 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]/";
@@ -752,8 +749,7 @@
         $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));
@@ -792,6 +788,11 @@
      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');
@@ -887,24 +888,20 @@
      
      
         //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");
            }
         }
@@ -970,6 +967,216 @@
      
   }
   
   /**
    * 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;