Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
100.00% |
1 / 1 |
|
100.00% |
4 / 4 |
CRAP | |
100.00% |
22 / 22 |
SearchFolderService | |
100.00% |
1 / 1 |
|
100.00% |
4 / 4 |
9 | |
100.00% |
22 / 22 |
getCurrentFolder | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
findFolder | |
100.00% |
1 / 1 |
3 | |
100.00% |
11 / 11 |
|||
validateLocation | |
100.00% |
1 / 1 |
2 | |
100.00% |
3 / 3 |
|||
sendFolder | |
100.00% |
1 / 1 |
3 | |
100.00% |
6 / 6 |
<?php | |
/** | |
* Gallery | |
* | |
* This file is licensed under the Affero General Public License version 3 or | |
* later. See the COPYING file. | |
* | |
* @author Olivier Paroz <galleryapps@oparoz.com> | |
* | |
* @copyright Olivier Paroz 2014-2016 | |
*/ | |
namespace OCA\Gallery\Service; | |
use OCP\Files\Folder; | |
use OCA\Gallery\Environment\NotFoundEnvException; | |
/** | |
* Looks for the folder to use, based on the request made by the client | |
* | |
* This is to make sure we were not: | |
* * given a file | |
* * given a folder name with a typo | |
* | |
* @package OCA\Gallery\Service | |
*/ | |
class SearchFolderService extends FilesService { | |
/** | |
* @var int | |
*/ | |
protected $virtualRootLevel = null; | |
/** | |
* This returns what we think is the current folder node based on a given path | |
* | |
* @param string $location | |
* @param string[] $features | |
* | |
* @return array <string,Folder,bool> | |
*/ | |
public function getCurrentFolder($location, $features) { | |
$this->features = $features; | |
return $this->findFolder($location); | |
} | |
/** | |
* This returns the current folder node based on a path | |
* | |
* If the path leads to a file, we'll return the node of the containing folder | |
* | |
* If we can't find anything, we try with the parent folder, up to the root or until we reach | |
* our recursive limit | |
* | |
* @param string $location | |
* @param int $depth | |
* | |
* @return array <string,Folder,bool> | |
*/ | |
private function findFolder($location, $depth = 0) { | |
$node = null; | |
$location = $this->validateLocation($location, $depth); | |
try { | |
$node = $this->environment->getNodeFromVirtualRoot($location); | |
if ($node->getType() === 'file') { | |
$node = $node->getParent(); | |
} | |
} catch (NotFoundEnvException $exception) { | |
// There might be a typo in the file or folder name | |
$folder = pathinfo($location, PATHINFO_DIRNAME); | |
$depth++; | |
return $this->findFolder($folder, $depth); | |
} | |
$path = $this->environment->getPathFromVirtualRoot($node); | |
return $this->sendFolder($path, $node); | |
} | |
/** | |
* Makes sure we don't go too far up before giving up | |
* | |
* @param string $location | |
* @param int $depth | |
* | |
* @return string | |
*/ | |
private function validateLocation($location, $depth) { | |
if ($depth === 4) { | |
// We can't find anything, so we decide to return data for the root folder | |
$location = ''; | |
} | |
return $location; | |
} | |
/** | |
* Makes sure that the folder is not empty, does meet our requirements in terms of location and | |
* returns details about it | |
* | |
* @param string $path | |
* @param Folder $node | |
* | |
* @return array <string,Folder,bool> | |
* @throws ForbiddenServiceException|NotFoundServiceException | |
*/ | |
private function sendFolder($path, $node) { | |
if (is_null($node)) { | |
// Something very wrong has just happened | |
throw new NotFoundServiceException('Oh Nooooes!'); | |
} elseif (!$this->isAllowedAndAvailable($node)) { | |
throw new ForbiddenServiceException( | |
'The owner has placed a restriction or the storage location is unavailable' | |
); | |
} | |
return [$path, $node]; | |
} | |
} |