Skip to content
apache2_plugin.inc.php 49.4 KiB
Newer Older
				$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;
		$app->log("exec: ".$command,LOGLEVEL_DEBUG);
		exec($command);
	}
redray's avatar
redray committed
?>