Added functions to check cloud files path and return path with hashed names
This commit is contained in:
		| @@ -262,61 +262,15 @@ class Webpages extends \Zotlabs\Web\Controller { | ||||
| 		}  | ||||
| 		 | ||||
| 		if (($_POST) && array_key_exists('path',$_POST) && isset($_POST['cloudsubmit'])) { | ||||
| 			$ret = []; | ||||
| 			// Warning: Do not edit the following line. The first symbol is UTF-8 @  | ||||
| 			$path = str_replace('@','@',notags(trim($_REQUEST['path'])));		 | ||||
|  | ||||
| 			$h = @parse_url($path); | ||||
|  | ||||
| 			if(! $h || !x($h, 'path')) { | ||||
| 			$channel = \App::get_channel(); | ||||
| 			$dirpath = get_dirpath_by_cloudpath($channel, $_POST['path']); | ||||
| 			if(!$dirpath) { | ||||
| 				notice( t('Invalid folder path.') . EOL); | ||||
| 				return null; | ||||
| 			} | ||||
| 			if(substr($h['path'],-1,1) === '/') { | ||||
| 				$h['path'] = substr($h['path'],0,-1); | ||||
| 			} | ||||
| 			if(substr($h['path'],0,1) === '/') { | ||||
| 				$h['path'] = substr($h['path'],1); | ||||
| 			} | ||||
| 			$folders = explode('/', $h['path']); | ||||
| 			$f = array_shift($folders); | ||||
| 			info( t('Valid folder path.') . EOL); | ||||
| 			 | ||||
| 			$channel = \App::get_channel(); | ||||
| 			$nick = \App::$profile['channel_address']; | ||||
| 			//check to see if the absolute path was provided (/cloud/channelname/path/to/folder) | ||||
| 			if(($f === 'cloud') ) {  | ||||
| 				$g = array_shift($folders); | ||||
| 				if( $g !== $nick) { | ||||
| 					// if nick does not follow "cloud", then the top level folder must be called  "cloud" | ||||
| 					// and the given path must be relative to "/cloud/channelname/".  | ||||
| 					$folders = array_unshift($f,array_unshift($g, $folders)); | ||||
| 				}  | ||||
| 			} | ||||
| 			$clouddir = 'store/' . $nick . '/'; | ||||
| 			$folder_path = $clouddir . implode('/', $folders); | ||||
| 			 | ||||
| 			 | ||||
| //			if(!(is_dir($folder_path) && is_readable($folder_path))) { | ||||
| //				logger('path is not readable: ' . $folder_path); | ||||
| //				return null; | ||||
| //			} | ||||
| 			$subdir = '/'; | ||||
| 			$valid = true; | ||||
| 			while($folders && $valid && is_dir($clouddir . $subdir) && is_readable($clouddir . $subdir)) { | ||||
| 				logger('hashed path: ' . $clouddir . $subdir); | ||||
| 				$valid = false; | ||||
| 				$f = array_shift($folders); | ||||
| 				$items = array_diff(scandir($clouddir . $subdir), array('.', '..')); // hashed names | ||||
| 				foreach($items as $item) { | ||||
| 					$filename = find_filename_by_hash($channel['channel_id'], $item); | ||||
| 					if($filename === $f) { | ||||
| 						$subdir .= $item . '/'; | ||||
| 						$valid = true; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			if(!$valid) { | ||||
| 				logger('path is not valid: ' . $folder_path); | ||||
| 			} | ||||
| 			 | ||||
| 			 | ||||
| 			return null; | ||||
|   | ||||
| @@ -371,6 +371,7 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota { | ||||
| 		); | ||||
|  | ||||
| 		if ($r) { | ||||
| 			require_once('include/attach.php'); | ||||
| 			$result = attach_mkdir($r[0], $this->auth->observer, array('filename' => $name, 'folder' => $this->folder_hash)); | ||||
|  | ||||
| 			if($result['success']) { | ||||
|   | ||||
| @@ -1910,3 +1910,70 @@ function get_attach_binname($s) { | ||||
| 	} | ||||
| 	return $p; | ||||
| } | ||||
|  | ||||
|  | ||||
| function get_dirpath_by_cloudpath($channel, $path) { | ||||
| 	 | ||||
| 	// Warning: Do not edit the following line. The first symbol is UTF-8 @  | ||||
| 	$path = str_replace('@','@',notags(trim($path)));		 | ||||
|  | ||||
| 	$h = @parse_url($path); | ||||
|  | ||||
| 	if(! $h || !x($h, 'path')) { | ||||
| 		return null; | ||||
| 	} | ||||
| 	if(substr($h['path'],-1,1) === '/') { | ||||
| 		$h['path'] = substr($h['path'],0,-1); | ||||
| 	} | ||||
| 	if(substr($h['path'],0,1) === '/') { | ||||
| 		$h['path'] = substr($h['path'],1); | ||||
| 	} | ||||
| 	$folders = explode('/', $h['path']); | ||||
| 	$f = array_shift($folders); | ||||
| 	 | ||||
| 	$nick = $channel['channel_address']; | ||||
| 	//check to see if the absolute path was provided (/cloud/channelname/path/to/folder) | ||||
| 	if($f === 'cloud' ) {  | ||||
| 		$g = array_shift($folders); | ||||
| 		if( $g !== $nick) { | ||||
| 			// if nick does not follow "cloud", then the top level folder must be called  "cloud" | ||||
| 			// and the given path must be relative to "/cloud/channelname/".  | ||||
| 			$folders = array_unshift(array_unshift($folders, $g), $f); | ||||
| 		}  | ||||
| 	} else { | ||||
| 		array_unshift($folders, $f); | ||||
| 	} | ||||
| 	$clouddir = 'store/' . $nick . '/' ; | ||||
| 	$subdir = '/'; | ||||
| 	$valid = true; | ||||
| 	while($folders && $valid && is_dir($clouddir . $subdir) && is_readable($clouddir . $subdir)) { | ||||
| 		$valid = false; | ||||
| 		$f = array_shift($folders); | ||||
| 		$items = array_diff(scandir($clouddir . $subdir), array('.', '..')); // hashed names | ||||
| 		foreach($items as $item) { | ||||
| 			$filename = find_filename_by_hash($channel['channel_id'], $item); | ||||
| 			if($filename === $f) { | ||||
| 				$subdir .= $item . '/'; | ||||
| 				$valid = true; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	if(!$valid) { | ||||
| 		return null; | ||||
| 	} else { | ||||
| 		return $clouddir . $subdir; | ||||
| 	} | ||||
| 	 | ||||
| 	 | ||||
| } | ||||
|  | ||||
| function get_filename_by_cloudname($cloudname, $channel, $storepath) { | ||||
| 	$items = array_diff(scandir($storepath), array('.', '..')); // hashed names | ||||
| 	foreach($items as $item) { | ||||
| 		$filename = find_filename_by_hash($channel['channel_id'], $item); | ||||
| 		if($filename === $cloudname) { | ||||
| 			return $filename; | ||||
| 		} | ||||
| 	} | ||||
| 	return null; | ||||
| } | ||||
| @@ -1218,8 +1218,8 @@ function convert_oldfields(&$arr,$old,$new) { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| function scan_webpage_elements($path, $type) { | ||||
|  | ||||
| function scan_webpage_elements($path, $type, $cloud = false) { | ||||
| 		$channel = \App::get_channel(); | ||||
| 		$dirtoscan = $path; | ||||
| 		switch ($type) { | ||||
| 			case 'page': | ||||
| @@ -1237,6 +1237,9 @@ function scan_webpage_elements($path, $type) { | ||||
| 			default : | ||||
| 				return array(); | ||||
| 		} | ||||
| 		if($cloud) { | ||||
| 			$dirtoscan = get_dirpath_by_cloudpath($channel, $dirtoscan); | ||||
| 		} | ||||
| 		$elements = []; | ||||
| 		if (is_dir($dirtoscan)) { | ||||
| 			$dirlist = scandir($dirtoscan); | ||||
| @@ -1247,15 +1250,25 @@ function scan_webpage_elements($path, $type) { | ||||
| 					} | ||||
| 					$folder = $dirtoscan . '/' . $element; | ||||
| 					if (is_dir($folder)) { | ||||
| 						$jsonfilepath = $folder . '/' . $json_filename; | ||||
| 						if($cloud) { | ||||
| 							$jsonfilepath = get_filename_by_cloudname($json_filename, $channel, $folder); | ||||
| 						} else { | ||||
| 							$jsonfilepath = $folder . '/' . $json_filename; | ||||
| 						} | ||||
| 						if (is_file($jsonfilepath)) { | ||||
| 							$metadata = json_decode(file_get_contents($jsonfilepath), true); | ||||
| 							$metadata['path'] = $folder . '/' . $metadata['contentfile']; | ||||
| 							if($cloud) { | ||||
| 								$contentfilename = get_filename_by_cloudname($metadata['contentfile'], $channel, $folder); | ||||
| 								$metadata['path'] = $folder . '/' . $contentfilename; | ||||
| 							} else { | ||||
| 								$contentfilename = $metadata['contentfile']; | ||||
| 								$metadata['path'] = $folder . '/' . $contentfilename; | ||||
| 							} | ||||
| 							if ($metadata['contentfile'] === '') { | ||||
| 								logger('Invalid ' . $type . ' content file'); | ||||
| 								return false; | ||||
| 							} | ||||
| 							$content = file_get_contents($folder . '/' . $metadata['contentfile']); | ||||
| 							$content = file_get_contents($folder . '/' . $contentfilename); | ||||
| 							if (!$content) { | ||||
| 								logger('Failed to get file content for ' . $metadata['contentfile']); | ||||
| 								return false; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user