mirror of https://github.com/nextcloud/bookmarks
224 lines
5.9 KiB
PHP
224 lines
5.9 KiB
PHP
<?php
|
|
|
|
/*
|
|
* Copyright (c) 2020. The Nextcloud Bookmarks contributors.
|
|
*
|
|
* This file is licensed under the Affero General Public License version 3 or later. See the COPYING file.
|
|
*/
|
|
|
|
namespace OCA\Bookmarks\Controller;
|
|
|
|
use OCA\Bookmarks\AugmentedTemplateResponse;
|
|
use OCA\Bookmarks\Db\Folder;
|
|
use OCA\Bookmarks\Db\FolderMapper;
|
|
use OCA\Bookmarks\Db\PublicFolder;
|
|
use OCA\Bookmarks\Db\PublicFolderMapper;
|
|
use OCP\AppFramework\Controller;
|
|
use OCP\AppFramework\Db\DoesNotExistException;
|
|
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
|
|
use OCP\AppFramework\Http\ContentSecurityPolicy;
|
|
use OCP\AppFramework\Http\JSONResponse;
|
|
use OCP\AppFramework\Http\NotFoundResponse;
|
|
use OCP\AppFramework\Http\StreamResponse;
|
|
use OCP\AppFramework\Http\Template\PublicTemplateResponse;
|
|
use OCP\IConfig;
|
|
use OCP\IL10N;
|
|
use OCP\IRequest;
|
|
use OCP\IURLGenerator;
|
|
use OCP\IUserManager;
|
|
|
|
class WebViewController extends Controller {
|
|
|
|
/** @var string */
|
|
private $userId;
|
|
|
|
/**
|
|
* @var IL10N
|
|
*/
|
|
private $l;
|
|
|
|
/**
|
|
* @var PublicFolderMapper
|
|
*/
|
|
private $publicFolderMapper;
|
|
|
|
/**
|
|
* @var IUserManager
|
|
*/
|
|
private $userManager;
|
|
/**
|
|
* @var FolderMapper
|
|
*/
|
|
private $folderMapper;
|
|
/**
|
|
* @var IURLGenerator
|
|
*/
|
|
private $urlGenerator;
|
|
/**
|
|
* @var \OCP\IInitialStateService
|
|
*/
|
|
private $initialState;
|
|
/**
|
|
* @var InternalFoldersController
|
|
*/
|
|
private $folderController;
|
|
/**
|
|
* @var IConfig
|
|
*/
|
|
private $config;
|
|
|
|
|
|
/**
|
|
* WebViewController constructor.
|
|
*
|
|
* @param string $appName
|
|
* @param IRequest $request
|
|
* @param $userId
|
|
* @param IL10N $l
|
|
* @param PublicFolderMapper $publicFolderMapper
|
|
* @param IUserManager $userManager
|
|
* @param FolderMapper $folderMapper
|
|
* @param IURLGenerator $urlGenerator
|
|
* @param \OCP\IInitialStateService $initialState
|
|
* @param InternalFoldersController $folderController
|
|
* @param IConfig $config
|
|
*/
|
|
public function __construct($appName, $request, $userId, IL10N $l, PublicFolderMapper $publicFolderMapper, IUserManager $userManager, FolderMapper $folderMapper, IURLGenerator $urlGenerator, \OCP\IInitialStateService $initialState, \OCA\Bookmarks\Controller\InternalFoldersController $folderController, IConfig $config) {
|
|
parent::__construct($appName, $request);
|
|
$this->userId = $userId;
|
|
$this->l = $l;
|
|
$this->publicFolderMapper = $publicFolderMapper;
|
|
$this->userManager = $userManager;
|
|
$this->folderMapper = $folderMapper;
|
|
$this->urlGenerator = $urlGenerator;
|
|
$this->initialState = $initialState;
|
|
$this->folderController = $folderController;
|
|
$this->config = $config;
|
|
}
|
|
|
|
/**
|
|
* @NoAdminRequired
|
|
*
|
|
* @NoCSRFRequired
|
|
*
|
|
* @return AugmentedTemplateResponse
|
|
*/
|
|
public function index(): AugmentedTemplateResponse {
|
|
$res = new AugmentedTemplateResponse($this->appName, 'main', ['url' => $this->urlGenerator]);
|
|
|
|
$policy = new ContentSecurityPolicy();
|
|
$policy->addAllowedWorkerSrcDomain("'self'");
|
|
$policy->addAllowedScriptDomain("'self'");
|
|
$policy->addAllowedConnectDomain("'self'");
|
|
$policy->addAllowedFrameDomain("'self'");
|
|
$res->setContentSecurityPolicy($policy);
|
|
|
|
// Provide complete folder hierarchy
|
|
$this->initialState->provideInitialState($this->appName, 'folders', $this->folderController->getFolders()->getData()['data']);
|
|
|
|
$settings = [];
|
|
foreach (['sorting', 'viewMode'] as $setting) {
|
|
$settings[$setting] = $this->config->getUserValue($this->userId, $this->appName, $setting);
|
|
}
|
|
$this->initialState->provideInitialState($this->appName, 'settings', $settings);
|
|
|
|
return $res;
|
|
}
|
|
|
|
/**
|
|
* @param string $token
|
|
*
|
|
* @return NotFoundResponse|PublicTemplateResponse
|
|
*
|
|
* @NoAdminRequired
|
|
*
|
|
* @NoCSRFRequired
|
|
*
|
|
* @PublicPage
|
|
*/
|
|
public function link(string $token) {
|
|
$title = 'No title found';
|
|
$userName = 'Unknown';
|
|
try {
|
|
/**
|
|
* @var $publicFolder PublicFolder
|
|
*/
|
|
$publicFolder = $this->publicFolderMapper->find($token);
|
|
/**
|
|
* @var $folder Folder
|
|
*/
|
|
$folder = $this->folderMapper->find($publicFolder->getFolderId());
|
|
$title = $folder->getTitle();
|
|
$user = $this->userManager->get($folder->getUserId());
|
|
if ($user !== null) {
|
|
$userName = $user->getDisplayName();
|
|
}
|
|
} catch (DoesNotExistException $e) {
|
|
return new NotFoundResponse();
|
|
} catch (MultipleObjectsReturnedException $e) {
|
|
return new NotFoundResponse();
|
|
}
|
|
|
|
$res = new PublicTemplateResponse($this->appName, 'main', []);
|
|
$res->setHeaderTitle($title);
|
|
$res->setHeaderDetails($this->l->t('Bookmarks shared by %s', [$userName]));
|
|
$res->setFooterVisible(false);
|
|
return $res;
|
|
}
|
|
|
|
/**
|
|
* @NoAdminRequired
|
|
*
|
|
* @NoCSRFRequired
|
|
*
|
|
* @return StreamResponse
|
|
*/
|
|
public function serviceWorker(): StreamResponse {
|
|
$response = new StreamResponse(__DIR__.'/../../js/bookmarks-service-worker.js');
|
|
$response->setHeaders(['Content-Type' => 'application/javascript']);
|
|
$policy = new ContentSecurityPolicy();
|
|
$policy->addAllowedWorkerSrcDomain("'self'");
|
|
$policy->addAllowedScriptDomain("'self'");
|
|
$policy->addAllowedConnectDomain("'self'");
|
|
$response->setContentSecurityPolicy($policy);
|
|
return $response;
|
|
}
|
|
|
|
/**
|
|
* @NoAdminRequired
|
|
*
|
|
* @NoCSRFRequired
|
|
*
|
|
* @PublicPage
|
|
*
|
|
* @return JSONResponse
|
|
*/
|
|
public function manifest(): JSONResponse {
|
|
$responseJS = [
|
|
'name' => $this->l->t('Bookmarks'),
|
|
'short_name' => $this->l->t('Bookmarks'),
|
|
'start_url' => $this->urlGenerator->linkToRouteAbsolute('bookmarks.web_view.index'),
|
|
'icons' =>
|
|
[
|
|
[
|
|
'src' => $this->urlGenerator->linkToRoute('theming.Icon.getTouchIcon',
|
|
['app' => 'bookmarks']),
|
|
'type' => 'image/png',
|
|
'sizes' => '512x512'
|
|
],
|
|
[
|
|
'src' => $this->urlGenerator->linkToRoute('theming.Icon.getFavicon',
|
|
['app' => 'bookmark']),
|
|
'type' => 'image/svg+xml',
|
|
'sizes' => '128x128'
|
|
]
|
|
],
|
|
'display' => 'standalone'
|
|
];
|
|
$response = new JSONResponse($responseJS);
|
|
$response->setHeaders(['Content-Type' => 'application/manifest+json']);
|
|
//$response->cacheFor(3600);
|
|
return $response;
|
|
}
|
|
}
|