base = '/'; $this->uriBase = '/sys' . SYS_SYS . '/' . SYS_LANG . '/' . SYS_SKIN . '/services/webdav/'; // let the base class do all the work parent::ServeRequest(); } /** * No authentication is needed here * * @access private * @param string HTTP Authentication type (Basic, Digest, ...) * @param string Username * @param string Password * @return bool true on successful authentication */ function check_auth($type, $user, $pass) { return true; } /** * PROPFIND method handler * * @param array general parameter passing array * @param array return array for file properties * @return bool true on success */ function PROPFIND(&$options, &$files) { $paths = $this->paths; // prepare property array $files["files"] = array(); $pathClasses = PATH_DB . PATH_SEP . SYS_SYS . PATH_SEP . 'classes' . PATH_SEP; if ( count($paths) == 0 && is_dir( $pathClasses ) ) { $props = array (); $props[] = $this->mkprop("displayname", 'Classes' ); $props[] = $this->mkprop("creationdate", filectime($pathClasses) ); $props[] = $this->mkprop("getlastmodified", filemtime($pathClasses) ); $props[] = $this->mkprop("lastaccessed", filemtime($pathClasses) ); $props[] = $this->mkprop("resourcetype", 'collection' ); $props[] = $this->mkprop("getcontenttype", 'httpd/unix-directory' ); $files["files"][] = array ( 'path' => 'classes' , 'props' => $props); } if ( count($paths) > 0 && $paths[0] == 'classes' && is_dir( $pathClasses ) ) { // try to open directory $handle = @opendir($pathClasses); if ($handle) { while ($filename = readdir($handle)) { $ext = array_pop ( explode ( '.', $filename) ); if ($filename != "." && $filename != ".." && !is_dir($pathClasses.$filename) && $ext == 'php' ) { $props = array (); $props[] = $this->mkprop("displayname", $filename ); $props[] = $this->mkprop("creationdate", filectime($pathClasses.$filename) ); $props[] = $this->mkprop("getlastmodified", filemtime($pathClasses.$filename) ); $props[] = $this->mkprop("getetag", fileatime($pathClasses.$filename) ); $props[] = $this->mkprop("lastaccessed", filemtime($pathClasses.$filename) ); $props[] = $this->mkprop("resourcetype", '' ); $props[] = $this->mkprop("getcontenttype", 'text/plain' ); $props[] = $this->mkprop("getcontentlength", filesize($pathClasses.$filename) ); if ( count( $paths ) == 1 || ( count( $paths ) == 2 && $paths[1] == $filename ) ) $files["files"][] = array ( 'path' => "classes/$filename" , 'props' => $props); } } } }//path classes $pathProcesses = PATH_DB . SYS_SYS . PATH_SEP ; if ( count($paths) == 0 && is_dir( $pathProcesses ) ) { $props = array (); $props[] = $this->mkprop("displayname", 'Processes' ); $props[] = $this->mkprop("creationdate", filectime($pathProcesses) ); $props[] = $this->mkprop("getlastmodified", filemtime($pathProcesses) ); $props[] = $this->mkprop("resourcetype", 'collection' ); $props[] = $this->mkprop("getcontenttype", 'httpd/unix-directory' ); $files["files"][] = array ( 'path' => 'processes' , 'props' => $props); } //list all active processes if ( count($paths) == 1 && $paths[0] == 'processes' && is_dir( $pathProcesses ) ) { // try to get the process directory list G::LoadClass ( 'processMap'); G::LoadClass ( 'model/Process'); $oProcessMap = new processMap(); $oProcess = new Process(); $c = $oProcessMap->getConditionProcessList(); $oDataset = ProcessPeer::doSelectRS($c); $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); $oDataset->next(); while ($aRow = $oDataset->getRow()) { if ($aRow['PRO_STATUS'] == 'ACTIVE' ) { $aProcess = $oProcess->load($aRow['PRO_UID']); $props = array (); $props[] = $this->mkprop("displayname", $aProcess['PRO_TITLE'] ); $props[] = $this->mkprop("creationdate", filectime($pathProcesses) ); $props[] = $this->mkprop("getlastmodified", filemtime($pathProcesses) ); $props[] = $this->mkprop("lastaccessed", filemtime($pathProcesses) ); $props[] = $this->mkprop("resourcetype", 'collection' ); $props[] = $this->mkprop("getcontenttype", 'httpd/unix-directory' ); $files["files"][] = array ( 'path' => "processes/". $aRow['PRO_UID'] , 'props' => $props); } $oDataset->next(); } }//dir of processes //content of any process ( the three major folders of Processes ) $pathXmlform = $pathProcesses . 'xmlForms' . PATH_SEP; if ( count($paths) == 2 && $paths[0] == 'processes' && is_dir( $pathProcesses ) ) { $props = array (); $props[] = $this->mkprop("displayname", 'xmlforms' ); $props[] = $this->mkprop("creationdate", filectime($pathXmlform) ); $props[] = $this->mkprop("getlastmodified", filemtime($pathXmlform) ); $props[] = $this->mkprop("lastaccessed", filemtime($pathXmlform) ); $props[] = $this->mkprop("resourcetype", 'collection' ); $props[] = $this->mkprop("getcontenttype", 'httpd/unix-directory' ); $files["files"][] = array ( 'path' => 'processes/' . $paths[1] . '/xmlforms' , 'props' => $props); $props[] = $this->mkprop("displayname", 'mailTemplates' ); $props[] = $this->mkprop("creationdate", filectime($pathProcesses) ); $props[] = $this->mkprop("getlastmodified", filemtime($pathProcesses) ); $props[] = $this->mkprop("lastaccessed", filemtime($pathProcesses) ); $props[] = $this->mkprop("resourcetype", 'collection' ); $props[] = $this->mkprop("getcontenttype", 'httpd/unix-directory' ); $files["files"][] = array ( 'path' => 'processes/' . $paths[1] . '/mailTemplates' , 'props' => $props); $props[] = $this->mkprop("displayname", 'public_html' ); $props[] = $this->mkprop("creationdate", filectime($pathProcesses) ); $props[] = $this->mkprop("getlastmodified", filemtime($pathProcesses) ); $props[] = $this->mkprop("lastaccessed", filemtime($pathProcesses) ); $props[] = $this->mkprop("resourcetype", 'collection' ); $props[] = $this->mkprop("getcontenttype", 'httpd/unix-directory' ); $files["files"][] = array ( 'path' => 'processes/' . $paths[1] . '/public_html' , 'props' => $props); }//content of any processes //list available xmlforms if ( count($paths) == 3 && $paths[0] == 'processes' && $paths[2] == 'xmlforms' && is_dir( $pathXmlform ) ) { $pathXmlform = $pathProcesses . 'xmlForms' . PATH_SEP . $paths[1] . PATH_SEP; $handle = @opendir($pathXmlform); if ($handle) { while ($filename = readdir($handle)) { $ext = array_pop ( explode ( '.', $filename) ); if ($filename != "." && $filename != ".." && !is_dir($pathXmlform.$filename) && ( $ext == 'xml' || $ext == 'html' ) ) { $props = array (); $props[] = $this->mkprop("displayname", $filename ); $props[] = $this->mkprop("creationdate", filectime($pathXmlform.$filename) ); $props[] = $this->mkprop("getlastmodified", filemtime($pathXmlform.$filename) ); $props[] = $this->mkprop("getetag", fileatime($pathXmlform.$filename) ); $props[] = $this->mkprop("lastaccessed", filemtime($pathXmlform.$filename) ); $props[] = $this->mkprop("resourcetype", '' ); $props[] = $this->mkprop("getcontenttype", 'text/plain' ); $props[] = $this->mkprop("getcontentlength", filesize($pathXmlform.$filename) ); //if ( count( $paths ) == 1 || ( count( $paths ) == 2 && $paths[1] == $filename ) ) $files["files"][] = array ( 'path' => 'processes/' . $paths[1] . '/xmlforms/' . $filename , 'props' => $props); } } } }//content of xmlforms //list available mailTemplates $pathTemplates = $pathProcesses . 'mailTemplates' . PATH_SEP; if ( count($paths) == 3 && $paths[0] == 'processes' && $paths[2] == 'mailTemplates' && is_dir( $pathTemplates ) ) { $pathTemplates = $pathProcesses . 'mailTemplates' . PATH_SEP . $paths[1] . PATH_SEP; $handle = @opendir($pathTemplates); if ($handle) { while ($filename = readdir($handle)) { $ext = array_pop ( explode ( '.', $filename) ); if ($filename != "." && $filename != ".." && !is_dir($pathTemplates.$filename) /* && ( $ext == 'xml' || $ext == 'html' ) */ ) { $props = array (); $props[] = $this->mkprop("displayname", $filename ); $props[] = $this->mkprop("creationdate", filectime($pathTemplates.$filename) ); $props[] = $this->mkprop("getlastmodified", filemtime($pathTemplates.$filename) ); $props[] = $this->mkprop("getetag", fileatime($pathTemplates.$filename) ); $props[] = $this->mkprop("lastaccessed", filemtime($pathTemplates.$filename) ); $props[] = $this->mkprop("resourcetype", '' ); $props[] = $this->mkprop("getcontenttype", 'text/plain' ); $props[] = $this->mkprop("getcontentlength", filesize($pathTemplates.$filename) ); //if ( count( $paths ) == 1 || ( count( $paths ) == 2 && $paths[1] == $filename ) ) $files["files"][] = array ( 'path' => 'processes/' . $paths[1] . '/mailTemplates/' . $filename , 'props' => $props); } } } }//content of mailTemplates //list available public_html files $pathPublic = $pathProcesses . 'public' . PATH_SEP; if ( count($paths) == 3 && $paths[0] == 'processes' && $paths[2] == 'public_html' && is_dir( $pathTemplates ) ) { $pathPublic = $pathProcesses . 'public' . PATH_SEP . $paths[1] . PATH_SEP; $handle = @opendir($pathPublic); if ($handle) { while ($filename = readdir($handle)) { $ext = array_pop ( explode ( '.', $filename) ); if ($filename != "." && $filename != ".." && !is_dir($pathPublic.$filename) /* && ( $ext == 'xml' || $ext == 'html' ) */ ) { $props = array (); $props[] = $this->mkprop("displayname", $filename ); $props[] = $this->mkprop("creationdate", filectime($pathPublic.$filename) ); $props[] = $this->mkprop("getlastmodified", filemtime($pathPublic.$filename) ); $props[] = $this->mkprop("getetag", fileatime($pathPublic.$filename) ); $props[] = $this->mkprop("lastaccessed", filemtime($pathPublic.$filename) ); $props[] = $this->mkprop("resourcetype", '' ); $props[] = $this->mkprop("getcontenttype", 'text/plain' ); $props[] = $this->mkprop("getcontentlength", filesize($pathPublic.$filename) ); //if ( count( $paths ) == 1 || ( count( $paths ) == 2 && $paths[1] == $filename ) ) $files["files"][] = array ( 'path' => 'processes/' . $paths[1] . '/public_html/' . $filename , 'props' => $props); } } } }//content of public_html files /* if ( 1 ) { $props = array (); $props[] = $this->mkprop("displayname", print_r ($pathPublic, 1) ); $props[] = $this->mkprop("creationdate", filectime( PATH_DB ) ); $props[] = $this->mkprop("getlastmodified", filemtime( PATH_DB ) ); $props[] = $this->mkprop("resourcetype", 'collection' ); $props[] = $this->mkprop("getcontenttype", 'httpd/unix-directory' ); $files["files"][] = array ( 'path' => '/' , 'props' => $props); } */ // ok, all done return true; } /** * detect if a given program is found in the search PATH * * helper function used by _mimetype() to detect if the * external 'file' utility is available * * @param string program name * @param string optional search path, defaults to $PATH * @return bool true if executable program found in path */ function _can_execute($name, $path = false) { // path defaults to PATH from environment if not set if ($path === false) { $path = getenv("PATH"); } // check method depends on operating system if (!strncmp(PHP_OS, "WIN", 3)) { // on Windows an appropriate COM or EXE file needs to exist $exts = array(".exe", ".com"); $check_fn = "file_exists"; } else { // anywhere else we look for an executable file of that name $exts = array(""); $check_fn = "is_executable"; } // now check the directories in the path for the program foreach (explode(PATH_SEPARATOR, $path) as $dir) { // skip invalid path entries if (!file_exists($dir)) continue; if (!is_dir($dir)) continue; // and now look for the file foreach ($exts as $ext) { if ($check_fn("$dir/$name".$ext)) return true; } } return false; } /** * try to detect the mime type of a file * * @param string file path * @return string guessed mime type */ function _mimetype($fspath) { if (@is_dir($fspath)) { // directories are easy return "httpd/unix-directory"; } else if (function_exists("mime_content_type")) { // use mime magic extension if available $mime_type = mime_content_type($fspath); } else if ($this->_can_execute("file")) { // it looks like we have a 'file' command, // lets see it it does have mime support $fp = popen("file -i '$fspath' 2>/dev/null", "r"); $reply = fgets($fp); pclose($fp); // popen will not return an error if the binary was not found // and find may not have mime support using "-i" // so we test the format of the returned string // the reply begins with the requested filename if (!strncmp($reply, "$fspath: ", strlen($fspath)+2)) { $reply = substr($reply, strlen($fspath)+2); // followed by the mime type (maybe including options) if (preg_match('/^[[:alnum:]_-]+/[[:alnum:]_-]+;?.*/', $reply, $matches)) { $mime_type = $matches[0]; } } } if (empty($mime_type)) { // Fallback solution: try to guess the type by the file extension // TODO: add more ... // TODO: it has been suggested to delegate mimetype detection // to apache but this has at least three issues: // - works only with apache // - needs file to be within the document tree // - requires apache mod_magic // TODO: can we use the registry for this on Windows? // OTOH if the server is Windos the clients are likely to // be Windows, too, and tend do ignore the Content-Type // anyway (overriding it with information taken from // the registry) // TODO: have a seperate PEAR class for mimetype detection? switch (strtolower(strrchr(basename($fspath), "."))) { case ".html": $mime_type = "text/html"; break; case ".gif": $mime_type = "image/gif"; break; case ".jpg": $mime_type = "image/jpeg"; break; default: $mime_type = "application/octet-stream"; break; } } return $mime_type; } /** * GET method handler * * @param array parameter passing array * @return bool true on success */ function GET(&$options) { $paths = $this->paths; $pathClasses = PATH_DB . SYS_SYS . PATH_SEP . 'classes' . PATH_SEP; if ( count($paths) > 0 && $paths[0] == 'classes' && is_dir( $pathClasses ) ) { $fsFile = $pathClasses. $paths[1]; if ( count($paths) == 2 && file_exists( $fsFile ) ) { $content = file_get_contents ($fsFile); print $content; header("Content-Type: " . mime_content_type($fsFile ) ); header("Last-Modified: " . date("D, j M Y H:m:s ", file_mtime($fsFile )) . "GMT"); header("Content-Length: ". filesize($fsFile)); return true; } } $pathProcesses = PATH_DB . SYS_SYS . PATH_SEP; if ( count($paths) > 0 && $paths[0] == 'processes' && is_dir( $pathProcesses ) ) { if ( count($paths) == 4 && $paths[2] == 'xmlforms' ) { $pathXmlform = $pathProcesses . 'xmlForms' . PATH_SEP . $paths[1] . PATH_SEP; $fsFile = $pathXmlform. $paths[3]; if ( count($paths) == 4 && file_exists( $fsFile ) ) { $content = file_get_contents ($fsFile); print $content; header("Content-Type: " . mime_content_type($fsFile ) ); header("Last-Modified: " . date("D, j M Y H:m:s ", file_mtime($fsFile )) . "GMT"); header("Content-Length: ". filesize($fsFile)); return true; } } if ( count($paths) == 4 && $paths[2] == 'mailTemplates' ) { $pathTemplates = $pathProcesses . 'mailTemplates' . PATH_SEP . $paths[1] . PATH_SEP; $fsFile = $pathTemplates. $paths[3]; if ( count($paths) == 4 && file_exists( $fsFile ) ) { $content = file_get_contents ($fsFile); print $content; header("Content-Type: " . mime_content_type($fsFile ) ); header("Last-Modified: " . date("D, j M Y H:m:s ", file_mtime($fsFile )) . "GMT"); header("Content-Length: ". filesize($fsFile)); return true; } } if ( count($paths) == 4 && $paths[2] == 'public_html' ) { $pathPublic = $pathProcesses . 'public' . PATH_SEP . $paths[1] . PATH_SEP; $fsFile = $pathPublic. $paths[3]; if ( count($paths) == 4 && file_exists( $fsFile ) ) { $content = file_get_contents ($fsFile); print $content; header("Content-Type: " . mime_content_type($fsFile ) ); header("Last-Modified: " . date("D, j M Y H:m:s ", file_mtime($fsFile )) . "GMT"); header("Content-Length: ". filesize($fsFile)); return true; } } } print_r ( $paths ); return true; if ( $options["path"] == '/' ) { return $this->getRoot( $options ); } //print_r ($options); // get absolute fs path to requested resource $fspath = $this->base . $options["path"]; // sanity check if (!file_exists($fspath)) return false; // is this a collection? if (is_dir($fspath)) { return $this->GetDir($fspath, $options); } // detect resource type $options['mimetype'] = $this->_mimetype($fspath); // detect modification time // see rfc2518, section 13.7 // some clients seem to treat this as a reverse rule // requiering a Last-Modified header if the getlastmodified header was set $options['mtime'] = filemtime($fspath); // detect resource size $options['size'] = filesize($fspath); // no need to check result here, it is handled by the base class $options['stream'] = fopen($fspath, "r"); return true; } /** * getRoot * * @param string &$options * @return boolean false */ function getRoot (&$options) { $path = $this->_slashify($options["path"]); // fixed width directory column format $format = "%15s %-19s %-s\n"; echo "
";
printf($format, "Size", "Last modified", "Filename");
echo "
";
$pathRoot = array ( 'xmlforms', 'public_html', 'dir1', 'dir2' );
foreach ( $pathRoot as $key => $val ) {
$fullpath = $fspath."/".$filename;
$name = htmlspecialchars($val);
printf($format, number_format(filesize($fullpath)),
strftime("%Y-%m-%d %H:%M:%S", filemtime($fullpath)),
"$name");
}
echo "";
echo "\n";
die;
$handle = @opendir($fspath);
if (!$handle) {
return false;
}
while ($filename = readdir($handle)) {
if ($filename != "." && $filename != "..") {
$fullpath = $fspath."/".$filename;
$name = htmlspecialchars($filename);
printf($format,
number_format(filesize($fullpath)),
strftime("%Y-%m-%d %H:%M:%S", filemtime($fullpath)),
"$name");
}
}
echo "";
closedir($handle);
echo "