From 6c5086a933451969b72890c9b703d6ee141f9d9f Mon Sep 17 00:00:00 2001 From: Andrew Manning Date: Sun, 17 Jul 2016 11:52:21 -0400 Subject: Added functions to check cloud files path and return path with hashed names --- include/attach.php | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ include/import.php | 23 +++++++++++++++---- 2 files changed, 85 insertions(+), 5 deletions(-) (limited to 'include') diff --git a/include/attach.php b/include/attach.php index b3ddfee88..0ca87624f 100644 --- a/include/attach.php +++ b/include/attach.php @@ -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; +} \ No newline at end of file diff --git a/include/import.php b/include/import.php index 3dfe9c7c9..ac52cc9cf 100644 --- a/include/import.php +++ b/include/import.php @@ -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; -- cgit v1.2.3