249 lines
6.2 KiB
PHP
249 lines
6.2 KiB
PHP
<?php
|
|
/**
|
|
* Nextcloud - 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 2017
|
|
* @copyright Olivier Paroz 2017
|
|
*/
|
|
|
|
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];
|
|
}
|
|
}
|