Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
22 / 22
SearchFolderService
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
4 / 4
9
100.00% covered (success)
100.00%
22 / 22
 getCurrentFolder
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 findFolder
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
11 / 11
 validateLocation
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
 sendFolder
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
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];
    }
}