diff options
-rw-r--r-- | Zotlabs/Module/Webpages.php | 56 | ||||
-rw-r--r-- | Zotlabs/Storage/Directory.php | 1 | ||||
-rw-r--r-- | include/attach.php | 67 | ||||
-rw-r--r-- | include/import.php | 23 |
4 files changed, 91 insertions, 56 deletions
diff --git a/Zotlabs/Module/Webpages.php b/Zotlabs/Module/Webpages.php index c78109cb7..e85c49b44 100644 --- a/Zotlabs/Module/Webpages.php +++ b/Zotlabs/Module/Webpages.php @@ -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')) { - 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); - $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)); - } + $dirpath = get_dirpath_by_cloudpath($channel, $_POST['path']); + if(!$dirpath) { + notice( t('Invalid folder path.') . EOL); + return null; } - $clouddir = 'store/' . $nick . '/'; - $folder_path = $clouddir . implode('/', $folders); - + info( t('Valid folder path.') . EOL); -// 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; diff --git a/Zotlabs/Storage/Directory.php b/Zotlabs/Storage/Directory.php index b524b3cab..89f83c73c 100644 --- a/Zotlabs/Storage/Directory.php +++ b/Zotlabs/Storage/Directory.php @@ -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']) { 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; |