Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
9 / 9
CRAP
100.00% covered (success)
100.00%
61 / 61
PageController
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
9 / 9
12
100.00% covered (success)
100.00%
61 / 61
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
5 / 5
 index
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
5 / 5
 publicIndex
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
9 / 9
 errorPage
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
9 / 9
 addContentSecurityToResponse
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
4 / 4
 slideshow
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 getIndexParameters
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
10 / 10
 showPublicPage
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
12 / 12
 getServer2ServerProperties
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 Robin Appelman <robin@icewind.nl>
 * @author Olivier Paroz <galleryapps@oparoz.com>
 *
 * @copyright Robin Appelman 2012-2015
 * @copyright Olivier Paroz 2014-2016
 */
namespace OCA\Gallery\Controller;
use OCP\IURLGenerator;
use OCP\IRequest;
use OCP\IConfig;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Http\RedirectResponse;
use OCA\Gallery\Environment\Environment;
use OCA\Gallery\Http\ImageResponse;
/**
 * Generates templates for the landing page from within ownCloud, the public
 * gallery and error pages
 *
 * @package OCA\Gallery\Controller
 */
class PageController extends Controller {
    /** @var Environment */
    private $environment;
    /** @var IURLGenerator */
    private $urlGenerator;
    /** @var IConfig */
    private $appConfig;
    /**
     * Constructor
     *
     * @param string $appName
     * @param IRequest $request
     * @param Environment $environment
     * @param IURLGenerator $urlGenerator
     * @param IConfig $appConfig
     */
    public function __construct(
        $appName,
        IRequest $request,
        Environment $environment,
        IURLGenerator $urlGenerator,
        IConfig $appConfig
    ) {
        parent::__construct($appName, $request);
        $this->environment = $environment;
        $this->urlGenerator = $urlGenerator;
        $this->appConfig = $appConfig;
    }
    /**
     * @NoAdminRequired
     * @NoCSRFRequired
     *
     * Shows the albums and pictures at the root folder or a message if
     * there are no pictures.
     *
     * This is the entry page for logged-in users accessing the app from
     * within ownCloud.
     * A TemplateResponse response uses a template from the templates folder
     * and parameters provided here to build the page users will see
     *
     * @return TemplateResponse
     */
    public function index() {
        $appName = $this->appName;
        // Parameters sent to the template
        $params = $this->getIndexParameters($appName);
        // Will render the page using the template found in templates/index.php
        $response = new TemplateResponse($appName, 'index', $params);
        $this->addContentSecurityToResponse($response);
        return $response;
    }
    /**
     * @PublicPage
     * @NoCSRFRequired
     *
     * Shows the albums and pictures or redirects to the download location the token gives access to
     *
     * @param string $token
     * @param null|string $filename
     *
     * @return TemplateResponse|ImageResponse|RedirectResponse
     */
    public function publicIndex($token, $filename) {
        $node = $this->environment->getSharedNode();
        if ($node->getType() === 'dir') {
            return $this->showPublicPage($token);
        } else {
            $url = $this->urlGenerator->linkToRoute(
                $this->appName . '.files_public.download',
                [
                    'token'    => $token,
                    'fileId'   => $node->getId(),
                    'filename' => $filename
                ]
            );
            return new RedirectResponse($url);
        }
    }
    /**
     * @PublicPage
     * @NoCSRFRequired
     * @Guest
     *
     * Generates an error page based on the error code
     *
     * @param int $code
     *
     * @return TemplateResponse
     */
    public function errorPage($code) {
        $appName = $this->appName;
        $message = $this->request->getCookie('galleryErrorMessage');
        $params = [
            'appName' => $appName,
            'message' => $message,
            'code'    => $code,
        ];
        $errorTemplate = new TemplateResponse($appName, 'index', $params, 'guest');
        $errorTemplate->setStatus($code);
        $errorTemplate->invalidateCookie('galleryErrorMessage');
        return $errorTemplate;
    }
    /**
     * Adds the domain "data:" to the allowed image domains
     * this function is called by reference
     *
     * @param TemplateResponse $response
     */
    private function addContentSecurityToResponse($response) {
        $csp = new Http\ContentSecurityPolicy();
        $csp->addAllowedFontDomain("data:");
        $response->setContentSecurityPolicy($csp);
    }
    /**
     * @PublicPage
     * @NoCSRFRequired
     * @Guest
     *
     * Returns the slideshow template
     *
     * @return TemplateResponse
     */
    public function slideshow() {
        return new TemplateResponse($this->appName, 'slideshow', [], 'blank');
    }
    /**
     * Returns the parameters to be used in the index function
     *
     * @param $appName
     *
     * @return array<string,string>
     */
    private function getIndexParameters($appName) {
        // Parameters sent to the index function
        $params = [
            'appName' => $appName,
            'uploadUrl' => $this->urlGenerator->linkTo(
                'files', 'ajax/upload.php'
            ),
            'publicUploadEnabled' => $this->appConfig->getAppValue(
                'core', 'shareapi_allow_public_upload', 'yes'
            ),
            'mailNotificationEnabled' => $this->appConfig->getAppValue(
                'core', 'shareapi_allow_mail_notification', 'no'
            ),
            'mailPublicNotificationEnabled' => $this->appConfig->getAppValue(
                'core', 'shareapi_allow_public_notification', 'no'
            )
        ];
        return $params;
    }
    /**
     * Shows the albums and pictures the token gives access to
     *
     * @param $token
     *
     * @return TemplateResponse
     */
    private function showPublicPage($token) {
        $albumName = $this->environment->getSharedFolderName();
        list($server2ServerSharing, $protected) = $this->getServer2ServerProperties();
        // Parameters sent to the template
        $params = [
            'appName'              => $this->appName,
            'token'                => $token,
            'displayName'          => $this->environment->getDisplayName(),
            'albumName'            => $albumName,
            'server2ServerSharing' => $server2ServerSharing,
            'protected'            => $protected,
            'filename'             => $albumName
        ];
        // Will render the page using the template found in templates/public.php
        $response = new TemplateResponse($this->appName, 'public', $params, 'public');
        $this->addContentSecurityToResponse($response);
        return $response;
    }
    /**
     * Determines if we can add external shared to this instance
     *
     * @return array<bool,string>
     */
    private function getServer2ServerProperties() {
        $server2ServerSharing = $this->appConfig->getAppValue(
            'files_sharing', 'outgoing_server2server_share_enabled', 'yes'
        );
        $server2ServerSharing = ($server2ServerSharing === 'yes') ? true : false;
        $password = $this->environment->getSharePassword();
        $passwordProtected = ($password) ? 'true' : 'false';
        return [$server2ServerSharing, $passwordProtected];
    }
}