diff --git a/workflow/engine/classes/class.webdav.php b/workflow/engine/classes/class.webdav.php index 9f6c496ed..1564bed9a 100755 --- a/workflow/engine/classes/class.webdav.php +++ b/workflow/engine/classes/class.webdav.php @@ -1,252 +1,271 @@ base = '/'; - $this->uriBase = '/sys' . SYS_SYS . '/' . SYS_LANG . '/' . SYS_SKIN . '/services/webdav/'; - - // let the base class do all the work - parent::ServeRequest(); - } + /** + * Serve a webdav request + * + * @access public + * @param string + */ + function ServeRequest ($base = false) + { + //$this->base = '/'; + $this->uriBase = '/sys' . SYS_SYS . '/' . SYS_LANG . '/' . SYS_SKIN . '/services/webdav/'; - /** - * 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); + // let the base class do all the work + parent::ServeRequest(); } - 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); + /** + * 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; } - - //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); + + /** + * 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 + ); } - $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); + 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 + ); + } + } + } - $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); + } //path classes - $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); - } + $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 + ); } - } - }//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 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 - //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 - /* + //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) ); @@ -257,741 +276,736 @@ class ProcessMakerWebDav extends HTTP_WebDAV_Server $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)); + // ok, all done 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; + /** + * 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" ); } - } - - 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; + + // 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"; } - } - - 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; + + // 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; + } } - } - } - - 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 ""; - 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 "
"; - - $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 "