760 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			760 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * PDLC is a Pdirl Directory Listing Class
 | |
|  * @package pdirl
 | |
|  */
 | |
| class pdlc {
 | |
| 	
 | |
| 	function __construct($configuration) {
 | |
| 		if (!isset($configuration))
 | |
| 			$configuration = array();
 | |
| 		$conf = $this -> configuration($configuration);
 | |
| 		$this -> host = $conf['host'];
 | |
| //		$this -> scriptPath = $conf['scriptpath'];
 | |
| 		$this -> scriptPath = $this -> rewriteScriptPath();
 | |
| 		$this -> ignore = $conf['ignore'];
 | |
| 		$this -> countElements = $conf['countelements'];
 | |
| 		$this -> sortOptions = $conf['sort'];
 | |
| 		$this -> userSort = $conf['usersort'];
 | |
| 		$this -> types = $conf['types'];
 | |
| 		$this -> listHidden = $conf['listhidden'];
 | |
| 		$this -> searchEnabled = $conf['searchenabled'];
 | |
| 		$this -> searchTag = $conf['searchtag'];
 | |
| 		$this -> searchHidden = $conf['searchhidden'];
 | |
| 		$this -> searchCaseSensitive = $conf['searchcasesensitive'];
 | |
| 		$this -> modRewrite = $conf['modrewrite'];
 | |
| //		$this -> directoryPrefix = $conf['directory'];
 | |
| //		// strip double prefixes
 | |
| //		$this -> directory = $this -> stripDoublePrefix(@$_GET['directory'], $this -> directoryPrefix);
 | |
| 		// make the path more secure and remove illegal characters
 | |
| 		$this -> directory = $this -> rewritePath(@$_GET['directory']);
 | |
| 		$this -> sessionSort();
 | |
| 	}
 | |
| 	
 | |
| 	
 | |
| 	/**
 | |
| 	 * Adjusts user configuration with default configuration.
 | |
| 	 * If a configuration key has an empty value, use a default value instead
 | |
| 	 * @param array $configuration
 | |
| 	 * @param array $default
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	public function configuration($configuration, $default = false) {
 | |
| 		if (!$default) {
 | |
| 			$default = array(
 | |
| 				'host' => $_SERVER['HTTP_HOST'],
 | |
| //				'scriptpath' => $this -> rewriteScriptPath(),
 | |
| //				'directory' => '',
 | |
| 				'ignore' => array("index.php", ".htaccess", ".pdirl"),
 | |
| 				'countelements' => true,
 | |
| 				'sort' => array('key' => 'name', 'sort' => "SORT_ASC"),
 | |
| 				'usersort' => true,
 | |
| 				'listhidden' => false,
 | |
| 				'searchenabled' => true,
 | |
| 				'searchtag' => @$_GET['search'],
 | |
| 				'searchhidden' => false,
 | |
| 				'searchcasesensitive' => false,
 | |
| 				'modrewrite' => @$_GET['modrewrite'],
 | |
| 			);
 | |
| 		}
 | |
| 		if (!$configuration)
 | |
| 			return $default;
 | |
| 		foreach ($default as $key => $defaultValue) {
 | |
| 			if (isset($configuration[$key])) {
 | |
| 				// If configuration is empty, use the default value
 | |
| 				if ($configuration[$key] === '')
 | |
| 					$configuration[$key] = $defaultValue;
 | |
| 			}
 | |
| 		}
 | |
| 		return $configuration;
 | |
| 	}
 | |
| 	
 | |
| 	
 | |
| 	/**
 | |
| 	 * Makes path more secure.
 | |
| 	 * Please try to hack this, I'm not very sure if this is the most secure function
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	private function rewritePath($path) {
 | |
| 		$path = './'.$path.'/';
 | |
| 		if (count($path) > 0) {
 | |
| 			if ($path == './') {
 | |
| 				return '';
 | |
| 			} else {
 | |
| 				if (($path[0] == '.' OR $path[0] == '/') AND $path[0].$path[1] != './')
 | |
| 					return '';
 | |
| 				$search = array ("..", "//", ".?", ".*", "././", "/./");
 | |
| 				$replace= array ("",   "/" , "",   "",   "./",   "/");
 | |
| 				while ($path != str_replace($search, $replace, $path))
 | |
| 					$path = str_replace($search, $replace, $path);
 | |
| 			}
 | |
| 		}	   
 | |
| 		return $path;
 | |
| 	}
 | |
| 	
 | |
| //	/**
 | |
| //	 * Returns current directory path with the directory path in the configuration.
 | |
| //	 * Because you get a double suffix when you list a subdirectory with pdirl (suffix + path)
 | |
| //	 * it must be removed.
 | |
| //	 * @return string
 | |
| //	 */
 | |
| //	function stripDoublePrefix ($path = false, $prefix = false) {
 | |
| //		if (!$path && !$prefix) {
 | |
| //			return '';
 | |
| //		} elseif (!$path) {
 | |
| //			return $prefix;
 | |
| //		} elseif (!$prefix) {
 | |
| //			return $path;
 | |
| //		} else {
 | |
| //			// double prefix to search and to destroy ;-)
 | |
| //			$prefixSearch = $prefix.$prefix;
 | |
| //			// Escape . \ + * ? [ ^ ] ( $ )
 | |
| //			$prefixSearch = quotemeta($prefixSearch);
 | |
| //			// Also strip something like '//' and '/./'
 | |
| //			$prefixSearch = $this -> rewritePath ($prefixSearch);
 | |
| //			// Escape '/', too
 | |
| //			$prefixSearch = str_replace('/', '\/', $prefixSearch);
 | |
| //			// Replace the double prefix with the normal prefix
 | |
| //			return preg_replace("/^{$prefixSearch}/", $prefix, $this -> rewritePath($prefix.$path));
 | |
| //		}
 | |
| //	}
 | |
| 	
 | |
| 	/**
 | |
| 	 * returns a legal script path
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	private function rewriteScriptPath() {
 | |
| 		// make sure the path contains no illegal characters
 | |
| 		$scriptPath = $this -> rewritePath($_SERVER['PHP_SELF']);
 | |
| 		// delete the "." at the beginning of the path
 | |
| 		$scriptPath = str_replace('./', '/', $scriptPath);
 | |
| 		// delete the slash at the end
 | |
| 		$scriptPath = rtrim($scriptPath, '/');
 | |
| 		return $scriptPath;
 | |
| 	}
 | |
| 	
 | |
| 	
 | |
| //	/**
 | |
| //	 * script path should'nt be part of current directory path, to prevent double bredcrumbs.
 | |
| //	 * @return string
 | |
| //	 */
 | |
| //	function currentDirectoryOnly($currentDir = false, $scriptPath = false) {
 | |
| //		if (!$currentDir)
 | |
| //			$currentDir = $this -> getCurrentDirectory();
 | |
| //		if (!$scriptPath)
 | |
| //			$scriptPath = $this -> getScriptPath();
 | |
| //		if (strpos($currentDir, $scriptPath) === 0)
 | |
| //			$currentDir = substr_replace($currentDir, "", 0, strlen($scriptPath));
 | |
| //		else
 | |
| //			return $currentDir;
 | |
| //	}
 | |
| 	
 | |
| 	/**
 | |
| 	 * Returns formatted path, when modrewrite is inactive it will return the path via GET
 | |
| 	 * @param string $path
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function urlPath($path) {
 | |
| 		$path = $this -> rewritePath($path);
 | |
| 		if (!$this -> modRewrite)
 | |
| 			return "?directory=".urlencode($path);
 | |
| 		else
 | |
| 			// because basename() sucks on foreign characters, I use explode -> array_pop
 | |
| 			return htmlspecialchars($this -> getScriptDirectory()).'/'.$this -> encode($path);
 | |
| 	}
 | |
| 	
 | |
| 	/**
 | |
| 	 * urlencode on everything except the slashes
 | |
| 	 * @param array $path
 | |
| 	 * @return unknown_type
 | |
| 	 */
 | |
| 	public function encode($path) {
 | |
| 		if (!is_array($path)) {
 | |
| 			$path = explode ('/', $path);
 | |
| 		}
 | |
| 		$newPath = array();
 | |
| 		foreach ($path as $pathElement) {
 | |
| 			$newPath[] = rawurlencode($pathElement);
 | |
| 		}
 | |
| 		return implode('/', $newPath);
 | |
| 	}
 | |
| 	
 | |
| 	/**
 | |
| 	 * Sorts array columns
 | |
| 	 * @link http://us.php.net/manual/en/function.array-multisort.php#83117 php_multisort
 | |
| 	 * @author <php.net@sebble.com>
 | |
| 	 * @uses array_multisort
 | |
| 	 * @param multi-dimensional_array $elements [optional]
 | |
| 	 * @param array $sortOptions [optional]
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	public function sortElements($elementsVar = false, $sortOptions = false) {
 | |
| 		if (!$elementsVar) {
 | |
| 			if (!empty($this -> elements)) {
 | |
| 				$elements = $this -> elements;
 | |
| 			} else {
 | |
| 				return false;
 | |
| 			}		
 | |
| 		} else {
 | |
| 			$elements = $elementsVar;
 | |
| 		}
 | |
| 		if (!$sortOptions)
 | |
| 			$sortOptions = $this -> sortOptions;
 | |
| 		foreach($elements as $elementKey => $elementData) {
 | |
| 			$columns[$sortOptions['key']][$elementKey] = $elementData[$sortOptions['key']];
 | |
| 		}
 | |
| 		// $idkeys is a key-index
 | |
| 		$idkeys = array_keys($elements);
 | |
| 		array_multisort(array_map('strtolower', $columns[$sortOptions['key']]), constant($sortOptions['sort']), $idkeys);
 | |
| 		// if we have no idkeys, we'll return false
 | |
| 		$result = false;
 | |
| 		foreach($idkeys as $idkey) {
 | |
| 			// apply new sorting
 | |
| 			$result[$idkey] = $elements[$idkey];
 | |
| 		}
 | |
| 		if (!$elementsVar)
 | |
| 			$this -> elements = $result;
 | |
| 		return $result;
 | |
| 	}
 | |
| 	
 | |
| 	
 | |
| 	/**
 | |
| 	 * 
 | |
| 	 * @param string $file
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function getType($file) {
 | |
| 		if (is_dir($file))
 | |
| 			return 'directory';
 | |
| 		$typeList = $this -> types;
 | |
| 		$pathinfo = pathinfo($file);
 | |
| 		if (isset($pathinfo["extension"]))
 | |
| 			$extension = strtolower($pathinfo["extension"]);
 | |
| 		else
 | |
| 			$extension = '';
 | |
| 		// MIME-type will be split in two parts, type and subtype
 | |
| 		$mimeType = array("","");
 | |
| 		
 | |
| 		// via mime_content_type, the most exact method to get the mime-type, deprecated in 5.3
 | |
| 		if (function_exists('mime_content_type')) {
 | |
| 			// MCT is "mime_content_type", I use this name to separate from the mimeType that should be set
 | |
| 			if ($mctType = mime_content_type($file)) {
 | |
| 				$mimeType = explode('/', $mctType);
 | |
| 			}
 | |
| 			
 | |
| 		// via Fileinfo, "alternative" for mime_content_type()
 | |
| 		// Problems with Fileinfo
 | |
| 		// <http://de3.php.net/manual/de/function.finfo-open.php#74965>
 | |
| 		// <http://de3.php.net/manual/de/ref.fileinfo.php#79063>
 | |
| 		} elseif (function_exists('finfo_open')) {
 | |
| 			$finfoHandler = finfo_open(FILEINFO_MIME);
 | |
| 			if ($finfoType = finfo_file($finfoHandler, $file)) {
 | |
| 				// <http://de3.php.net/manual/de/function.finfo-file.php#77975>
 | |
| 				// "contrary to the documentation, finfo_file seems to be returning a 
 | |
| 				// semicolon delimited string that contains not just the mime type but also the character set."
 | |
| 				$finfoType = explode(';', $finfoType);
 | |
| 				$mimeType = explode('/', $finfoType[0]);
 | |
| 			}
 | |
| 			finfo_close($finfoHandler);
 | |
| 			
 | |
| 		// via Unix file command
 | |
| 		} elseif (array_search(php_uname('s'), array('Linux', 'FreeBSD', 'Mac OS X', 'Solaris')) !== false) {
 | |
| 			// output buffer, "records" what the shell returns
 | |
| 			ob_start();
 | |
| 			// --mime-type returns mime-type only w/o mime-encoding, -b keeps it brief, w/o the path of the file
 | |
|             system('/usr/bin/file --mime-type -b ' . escapeshellarg(realpath($file)));
 | |
| 			$unixFileType = ob_get_contents();
 | |
|             if (stristr($unixFileType, 'error') == false) {
 | |
| 				$mimeType = explode('/', $unixFileType);
 | |
|             }
 | |
|             ob_clean();
 | |
| 		}
 | |
| 		
 | |
| 		// <https://bugs.launchpad.net/pdirl/+bug/815701>
 | |
| 		$subtype = "";
 | |
| 		if(count($mimeType) > 1){
 | |
| 			$subtype = $mimeType[1];
 | |
| 		}
 | |
| 		$mimeType = array('type' => $mimeType[0], 'subtype' => $subtype);
 | |
| 
 | |
| 		// search for MIME-type and extension in $typeList, if found, break foreach
 | |
| 		foreach ($typeList as $key => $value) {
 | |
| 			if (in_array($mimeType['subtype'], $value)) {
 | |
| 				return $key;
 | |
| 				break;
 | |
| 			} elseif ($mimeType['type'] == $key) {
 | |
| 				return $key;
 | |
| 				break;
 | |
| 			// the last method: search in the extension list, that was defined in the config
 | |
| 			} elseif (in_array($extension, $value)) {
 | |
| 				return $key;
 | |
| 				break;
 | |
| 			}
 | |
| 		}
 | |
| 		// if no other type was returned, return "default", which means that the file type is unknown
 | |
| 		return "default";
 | |
| 	}
 | |
| 	
 | |
| 	/**
 | |
| 	 * Checks if file/dir is ignored in configuration
 | |
| 	 * @return boolean
 | |
| 	 */
 | |
| 	private function ignored ($element, $ignoreList=false) {
 | |
| 		if (!$ignoreList)
 | |
| 			$ignoreList = $this -> ignore;
 | |
| 		if(is_array($ignoreList) ) {
 | |
| 			$ignoreList[] = '\/\.(\.)?$';
 | |
| 			foreach($ignoreList as $expression) {
 | |
| 				$expression = str_replace(".", "\.", $expression);
 | |
| 				if(preg_match("/$expression/", $element))
 | |
| 					return true;
 | |
| 			}
 | |
| 		}
 | |
| 		return false; 
 | |
| 	}
 | |
| 	
 | |
| 	/**
 | |
| 	 * Replacement for sql_regcase
 | |
| 	 * @link http://de3.php.net/manual/en/function.sql-regcase.php#86011
 | |
| 	 * @author <irker@irker.net>
 | |
| 	 * @param string $string
 | |
| 	 * @param string $encoding
 | |
| 	 */
 | |
| 	private function iregcase($string,$encoding='auto'){
 | |
| 		$max = mb_strlen($string,$encoding);
 | |
| 		$ret = '';
 | |
| 		for ($i = 0; $i < $max; $i++) {
 | |
| 			$char = mb_substr($string,$i,1,$encoding);
 | |
| 			$up = mb_strtoupper ($char,$encoding);
 | |
| 			$low = mb_strtolower($char,$encoding);
 | |
| 			$ret .= ($up!=$low)?'['.$up.$low.']' : $char;
 | |
| 		}
 | |
| 		return $ret;
 | |
| 	}
 | |
| 	
 | |
| 	/**
 | |
| 	 * recursive glob() function
 | |
| 	 * @link http://de3.php.net/manual/en/function.glob.php#90278
 | |
| 	 * @author <me@lx.sg>
 | |
| 	 * @param string $pattern [optional]
 | |
| 	 * @param string $path [optional]
 | |
| 	 * @param mixed $flags [optional]
 | |
| 	 * @return 
 | |
| 	 */
 | |
| 	private function rglob($pattern='*', $path='', $flags = 0) {
 | |
| 		$dir = dirname($pattern);
 | |
| 	    if (!$path && $dir != './') {
 | |
| 		    return $this -> rglob(basename($pattern), $dir . '/', $flags);
 | |
| 		}
 | |
| 		$path = $this -> escapePathBrackets($path);
 | |
| 		$paths = glob($path . '*', GLOB_ONLYDIR | GLOB_NOSORT);
 | |
| 		$files = glob($path . $pattern, $flags);
 | |
| 		
 | |
| 		// if glob returns false
 | |
| 		if ($paths == false) $paths = array();
 | |
| 		if ($files == false) $files = array();
 | |
| 	    
 | |
| 	    foreach ($paths as $p) $files = array_merge($files, $this -> rglob($pattern, $p . '/', $flags));
 | |
| 	    return $files;
 | |
| 	}
 | |
| 
 | |
| 	
 | |
| 	/**
 | |
| 	 * Works like stat, but only for directories.
 | |
| 	 * A patchscript between http://us.php.net/manual/en/function.stat.php#61238
 | |
| 	 * and http://de3.php.net/manual/en/function.filemtime.php#91665
 | |
| 	 * @link http://de3.php.net/manual/en/function.filemtime.php#91665
 | |
| 	 * @author <info@daniel-marschall.de>
 | |
| 	 * @link http://us.php.net/manual/en/function.stat.php#61238
 | |
| 	 * @author <marting.dc@gmail.com>
 | |
| 	 * @param string $directory
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	private function rstat($directory) {
 | |
| 		$files = $this -> rglob('*', $directory, 0);
 | |
| 		$newestModification = 0;
 | |
| 		$DirectorySize = 0;
 | |
| 		foreach ($files as $val) {
 | |
| 			$stat = @stat($val);
 | |
| 			if ($stat['mtime'] > $newestModification)
 | |
| 				$newestModification = $stat['mtime'];
 | |
| 			$DirectorySize += $stat['size'];
 | |
| 		}
 | |
| 		return array('mtime' => $newestModification, 'size' => $DirectorySize);
 | |
| 	}
 | |
| 	
 | |
| 	/** Counts number of elements in a directory
 | |
| 	 * @param string $directory
 | |
| 	 * @return interger
 | |
| 	 */
 | |
| 	public function countElementsInDir($directory) {
 | |
| 		return count($this -> rglob('*', $directory, 0));
 | |
| 	}
 | |
| 	
 | |
| 	/**
 | |
| 	 * if search query was detected in URL or not, get the elements for the search/dirlist query
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	public function requestElements () {
 | |
| 		if (!empty($this -> searchTag) && $this -> searchEnabled) {
 | |
| 			$this -> getSearchElements();
 | |
| 		} else {
 | |
| 			$this -> getDirectoryElements();
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns all files in a directory
 | |
| 	 * @param string $directory [optional]
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	public function getDirectoryElements ($directory = '') {
 | |
| 		if (!$directory) {
 | |
| 			$directory = $this -> directory;
 | |
| 		}
 | |
| 		$directory = $this -> escapePathBrackets($directory);
 | |
| 		if ($this -> listHidden) {
 | |
| 			$elements = glob($directory.'{,.}*', GLOB_BRACE); //list hidden files ("."-prefix)
 | |
| 		} else {
 | |
| 			$elements = glob($directory.'*');
 | |
| 		}
 | |
| 		$elements = $this -> getElementInfo($elements);
 | |
| 		$this -> elements = $elements;
 | |
| 		
 | |
| 		return $elements;
 | |
| 	}
 | |
| 	
 | |
| 	
 | |
| 	/**
 | |
| 	 * Searches for $search and returns a array with paths to found files/directories
 | |
| 	 * @param string $search [optional]
 | |
| 	 * @param string $directory [optional]
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	public function getSearchElements($search = '', $directory = '') {
 | |
| 		if (!$search) {
 | |
| 			$search = $this -> searchTag;
 | |
| 		}
 | |
| 		if (!$directory) {
 | |
| 			$directory = $this -> directory;
 | |
| 		}
 | |
| 		
 | |
| 		if (!empty($search)) {
 | |
| 			// Search for term in current directory
 | |
| 			$search = htmlspecialchars($this -> searchTag);
 | |
| 			# thx to <http://de3.php.net/manual/en/function.glob.php#74109>
 | |
| 			if (!$this -> searchCaseSensitive)
 | |
| 				$search = $this -> iregcase($search);
 | |
| 			$found = $this -> getElementInfo($this -> rglob("*$search*", $directory, 0));
 | |
| 			$this -> elements = $found;
 | |
| 			return $found;
 | |
| 		} else {
 | |
| 			return false;
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 
 | |
| 	public function getElementInfo($elements, $directory = false) {
 | |
| 		if (!$directory)
 | |
| 			$directory = $this -> directory;
 | |
| 		$list = array();
 | |
| 		if (is_array($elements)) {
 | |
| 			foreach ($elements as $path) {
 | |
| 				if (is_file($path) || is_dir($path)) {
 | |
| 				    if ($this -> ignored($path) === false) {
 | |
| 				    	
 | |
| 				    	
 | |
| 				    	/*
 | |
| 				    	 * path => "./examples/sub directory"
 | |
| 				    	 * urlpath => "?directory=./examples/sub%20directory/"
 | |
| 				    	 * or with mod_rewrite: urlpath => "./examples/sub%20directory"
 | |
| 				    	 */
 | |
| 				    	
 | |
| 				    	// If not in the directory where pdirl is
 | |
| 				    	if (!empty($directory)) {
 | |
| 				    		// The reason why pdirl is not compatible with PHP <5
 | |
| 				    		// <http://de.php.net/manual/function.strpos.php>
 | |
| 					    	if (strpos($path, $directory) === 0 AND $this -> modRewrite) {
 | |
| 				    			/*
 | |
| 				    			 * If you search with glob e.g. in "examples" you will get paths like "examples/foobar.mp3"
 | |
| 				    			 * The path should be shortened.
 | |
| 				    			 */
 | |
| 					    		$item['path'] = substr_replace($path, "", 0, strlen($directory));
 | |
| 					    	} else {
 | |
| 								/*
 | |
| 								 * Okay, you will probably ask why I save the path of the file/folder
 | |
| 								 * Because of the sorting options - files and folders should be sorted according to their name and not
 | |
| 								 * their path. In version 0.9.2beta files and folders were sorted according to their path (only in search mode).
 | |
| 								 */
 | |
| 							    $item['path'] = $path;
 | |
| 						    }
 | |
| 				    	} else {
 | |
| 				    		// Take absolute path
 | |
| 				    		$item['path'] = $path;
 | |
| 				    	}
 | |
| 				    	
 | |
| 				    	// if you have brackets etc. e.g. '<item>' in your name htmlspecialchars would distort the name it wouldnt be accessible,
 | |
| 				    	// so they are seperate variables for (display)name and pathname which is encoded with urlencode
 | |
| 				    	// There is also 'urlpath' which is especially for using pdirl without modrewrite and adds (if needed) ?directory= before the url
 | |
| 				    	$path_array = explode("/", $item['path']);
 | |
| 						$item['name'] = array_pop($path_array);
 | |
| 						$item['directory'] = is_dir($path);
 | |
| 						$item['location'] = '';
 | |
| 						// pdirl needs location only when you search or
 | |
| 						// modRewrite is on
 | |
| 						if ($this -> modRewrite || $this -> getSearchTag() || !$item['directory']) {
 | |
| 						    $item['location'] = implode('/', $path_array);
 | |
| 							$item['location'] .= '/';
 | |
| 							// Makes location path more secure
 | |
| 							$item['location'] = $this -> rewritePath($item['location']);
 | |
| 						}
 | |
| 					    // urlencode on everything except the slashes
 | |
| 				    	$item['urlpath'] = $this -> encode($item['location'].$item['name']);
 | |
| 						$stat = array('size' => 0, 'mtime' => 0);
 | |
| 						$item['numberofelements'] = 0;
 | |
| 						$item['countonly'] = false;
 | |
| 						if ($item['directory']) {
 | |
| 							if ($item['readable'] = is_readable($path) || is_executable($path)) {
 | |
| 								if ($this -> countElements) {
 | |
| 									$item['numberofelements'] = $this -> countElementsInDir($path) - 1;
 | |
| 									$item['countonly'] = true;
 | |
| 								} else {
 | |
| 									$stat = $this -> rstat($path);
 | |
| 								}
 | |
| 							}
 | |
| 							$item['urlpath'] = $this -> urlPath($directory.$item['location'].$item['name']);
 | |
| 						} else {
 | |
| 							// stat() is slow, but faster than using filemtime() & filesize() instead.
 | |
| 							$stat = @stat($path);
 | |
| 							// if stat() returns an error, we ignore it and convert it to false via the @
 | |
| 							$item['readable'] = (bool) $stat;
 | |
| 						}
 | |
| 						
 | |
| 						$item['path'] = urlencode($item['path']);
 | |
| 						$item['name'] = htmlspecialchars($item['name']);
 | |
| 						$item['locationurl'] = $item['location'];
 | |
| 						$item['location'] = htmlspecialchars($item['location']);
 | |
| 						
 | |
| 						
 | |
| 						/*
 | |
| 						 * Ok, fine, what did I do with $item['readable']? I mark files and directories,
 | |
| 						 * that are not accessible with $item['readable'] = false;
 | |
| 						 */
 | |
| 						$item['bytes'] = $stat['size'];
 | |
| 						$item['mtime'] = $stat['mtime'];
 | |
| 						// Add this items file size to this folders total size
 | |
| 						$this -> totalSize += $item['bytes'];
 | |
| 						$item['type'] = $this -> getType($path);
 | |
| 						$list[] = $item;
 | |
| 				    }
 | |
| 				}
 | |
| 			}
 | |
| 			$this -> elements = $list;
 | |
| 		}
 | |
| 		return $list;
 | |
| 	}
 | |
| 	
 | |
| 	/**
 | |
| 	 * allowing brackets in directory names
 | |
| 	 * http://sockittoemjt.tumblr.com/post/20481660360/managed-to-come-across-your-tumblr-whilst-googling-for
 | |
| 	 * https://bugs.php.net/bug.php?id=33047
 | |
| 	 * returns directory path, but only that the brackets are escaped.
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	private function escapePathBrackets($directory = false) {
 | |
| 		if ($directory == false) {
 | |
| 			$directory = $this -> directory;
 | |
| 		}
 | |
| 		$escapedBracketPath = str_replace('[', '\[', $directory);
 | |
| 		$escapedBracketPath = str_replace(']', '\]', $escapedBracketPath);
 | |
| 			
 | |
| 		/* Next, replace all "escaped" brackets with brackets like so */
 | |
| 		$escapedBracketPath = str_replace('\[', '[[]', $escapedBracketPath);
 | |
| 		$escapedBracketPath = str_replace('\]', '[]]', $escapedBracketPath);
 | |
| 		return $escapedBracketPath;
 | |
| 	}
 | |
| 	
 | |
| 	
 | |
| 	/**
 | |
| 	 * returns pdirl::elements
 | |
| 	 * @return array 
 | |
| 	 */
 | |
| 	public function getElements () {
 | |
| 		if (empty($this -> elements))
 | |
| 			return false;
 | |
| 		else
 | |
| 			return $this -> elements;
 | |
| 	}
 | |
| 	
 | |
| 	/**
 | |
| 	 * returns pdirl::directory
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function getCurrentDirectory() {
 | |
| 		if (!isset($this -> directory))
 | |
| 			return false;
 | |
| 		else
 | |
| 			return $this -> directory;
 | |
| 	}
 | |
| 	
 | |
| 	
 | |
| 	/**
 | |
| 	 * returns pdirl::scriptPath
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function getScriptPath() {
 | |
| 		if (!isset($this -> scriptPath))
 | |
| 			return false;
 | |
| 		else
 | |
| 			return $this -> scriptPath;
 | |
| 	}
 | |
| 	
 | |
| 	/**
 | |
| 	 * returns the directory of pdirl::scriptPath
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function getScriptDirectory() {
 | |
| 		if (!isset($this -> scriptPath))
 | |
| 			return false;
 | |
| 		else
 | |
| 			$scriptDirectory = dirname($this -> scriptPath);
 | |
| 			//if the script directory path is only consists of a slash, give out an empty string
 | |
| 			if ($scriptDirectory == '/')
 | |
| 				return '';
 | |
| 			else
 | |
| 				return $scriptDirectory;
 | |
| 	}
 | |
| 	
 | |
| 	
 | |
| 	/**
 | |
| 	 * returns pdirl::host
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function getHost() {
 | |
| 		if (!isset($this -> host))
 | |
| 			return false;
 | |
| 		else
 | |
| 			return $this -> host;
 | |
| 	}
 | |
| 	
 | |
| 	
 | |
| 	/**
 | |
| 	 * return pdirl::search
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function getSearchTag() {
 | |
| 		if (!isset($this -> searchTag))
 | |
| 			return false;
 | |
| 		else
 | |
| 			return $this -> searchTag;
 | |
| 	}
 | |
| 	
 | |
| 	
 | |
| 	/**
 | |
| 	 * Returns number of elements
 | |
| 	 * @return interger
 | |
| 	 */
 | |
| 	public function getNumberOfElements() {
 | |
| 		if (!isset($this -> elements))
 | |
| 			return false;
 | |
| 		else
 | |
| 			return count($this -> elements);
 | |
| 	}
 | |
| 	
 | |
| 	
 | |
| 	/**
 | |
| 	 * return pdirl::totalSize
 | |
| 	 * @return interger
 | |
| 	 */
 | |
| 	public function getTotalSize() {
 | |
| 		if (!isset($this -> totalSize))
 | |
| 			return false;
 | |
| 		else
 | |
| 			return $this -> totalSize;
 | |
| 	}
 | |
| 	
 | |
| 	/**
 | |
| 	 * Returns "asc", if $sorting is "desc". Returns "desc", if it's "asc".
 | |
| 	 * @param $sorting
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function adesc($sorting) {
 | |
| 		if ($sorting == "SORT_ASC")
 | |
| 			return "SORT_DESC";
 | |
| 		elseif ($sorting == "SORT_DESC")
 | |
| 			return "SORT_ASC";
 | |
| 		else
 | |
| 			return "SORT_ASC";
 | |
| 	}
 | |
| 	
 | |
| 	public function getSortOrder($r = false) {
 | |
| 		if (!isset($this -> sortOptions)) {
 | |
| 			return false;
 | |
| 		} else {
 | |
| 			if ($r) {
 | |
| 				return $this -> adesc($this -> sortOptions['sort']);
 | |
| 			} else {
 | |
| 				return $this -> sortOptions['sort'];
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	public function getSortKey() {
 | |
| 		if (!isset($this -> sortOptions))
 | |
| 			return false;
 | |
| 		else
 | |
| 			return $this -> sortOptions['key'];
 | |
| 	}
 | |
| 	
 | |
| 	private function validizeSortOrder($order) {
 | |
| 		if (in_array($order, array('SORT_ASC', 'SORT_DESC', 'SORT_REGULAR', 'SORT_NUMERIC', 'SORT_STRING'))) {
 | |
| 			return $order;
 | |
| 		} else {
 | |
| 			return 'SORT_ASC';
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	private function validizeSortKey($order) {
 | |
| 		if (in_array($order, array('name', 'path', 'location', 'bytes', 'mtime', 'type'))) {
 | |
| 			return $order;
 | |
| 		} else {
 | |
| 			return 'name';
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	private function sessionSort() {
 | |
| 		if ($this -> isUserSortActive()) {
 | |
| 			session_start();
 | |
| 			if (isset($_SESSION['sortorder'])){
 | |
| 				$this -> sortOptions['sort'] = $_SESSION['sortorder'];
 | |
| 			}
 | |
| 			if (isset($_SESSION['sortkey'])){
 | |
| 				$this -> sortOptions['key'] = $_SESSION['sortkey'];
 | |
| 			}
 | |
| 			if (isset($_GET['sortorder']) || isset($_GET['sortkey'])) {
 | |
| 				if (isset($_GET['sortorder'])){
 | |
| 					$_SESSION['sortorder'] = $this -> validizeSortOrder($_GET['sortorder']);
 | |
| 				}
 | |
| 				if (isset($_GET['sortkey'])){
 | |
| 					$_SESSION['sortkey'] = $this -> validizeSortKey($_GET['sortkey']);
 | |
| 				}
 | |
| 				if (!empty($this->searchTag)) {
 | |
| 					header('Location:http://'.$this->host.$this -> getScriptPath()."?search=".$this->searchTag."&directory=".$this -> directory);
 | |
| 				} else {
 | |
| 					header('Location:http://'.$this->host.$this->getScriptDirectory()."/".$this -> directory);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	public function isUserSortActive() {
 | |
| 		return $this -> userSort;
 | |
| 	}
 | |
| 	
 | |
| 	public function isModRewriteActive() {
 | |
| 		return $this -> modRewrite;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| ?>
 |