Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
159 changes: 49 additions & 110 deletions lib/Controller/DocumentController.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
use OCA\Officeonline\TokenManager;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\Attribute\PublicPage;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\RedirectResponse;
use OCP\AppFramework\Http\TemplateResponse;
Expand All @@ -35,88 +38,37 @@
use Psr\Log\LoggerInterface;

class DocumentController extends Controller {
/** @var string */
private $uid;
/** @var IL10N */
private $l10n;
/** @var IConfig */
private $settings;
/** @var AppConfig */
private $appConfig;
/** @var LoggerInterface */
private $logger;
/** @var IManager */
private $shareManager;
/** @var TokenManager */
private $tokenManager;
/** @var ISession */
private $session;
/** @var IRootFolder */
private $rootFolder;
/** @var \OCA\Officeonline\TemplateManager */
private $templateManager;
/** @var FederationService */
private $federationService;
/** @var Helper */
private $helper;

public const ODT_TEMPLATE_PATH = '/assets/odttemplate.odt';

/**
* @param string $appName
* @param IRequest $request
* @param IConfig $settings
* @param AppConfig $appConfig
* @param IL10N $l10n
* @param IManager $shareManager
* @param TokenManager $tokenManager
* @param IRootFolder $rootFolder
* @param ISession $session
* @param string $UserId
* @param LoggerInterface $logger
*/
public function __construct(
$appName,
string $appName,
IRequest $request,
IConfig $settings,
AppConfig $appConfig,
IL10N $l10n,
IManager $shareManager,
TokenManager $tokenManager,
IRootFolder $rootFolder,
ISession $session,
$UserId,
LoggerInterface $logger,
\OCA\Officeonline\TemplateManager $templateManager,
FederationService $federationService,
Helper $helper,
private IConfig $settings,
private AppConfig $appConfig,
private IL10N $l10n,
private IManager $shareManager,
private TokenManager $tokenManager,
private IRootFolder $rootFolder,
private ISession $session,
private ?string $userId,
private LoggerInterface $logger,
private \OCA\Officeonline\TemplateManager $templateManager,
private FederationService $federationService,
private Helper $helper,
) {
parent::__construct($appName, $request);
$this->uid = $UserId;
$this->l10n = $l10n;
$this->settings = $settings;
$this->appConfig = $appConfig;
$this->shareManager = $shareManager;
$this->tokenManager = $tokenManager;
$this->rootFolder = $rootFolder;
$this->session = $session;
$this->logger = $logger;
$this->templateManager = $templateManager;
$this->federationService = $federationService;
$this->helper = $helper;
}

/**
* @PublicPage
* @NoCSRFRequired
*
* Returns the access_token and urlsrc for WOPI access for given $fileId
* Requests is accepted only when a secret_token is provided set by admin in
* settings page
*
* @param string $fileId
* @return array access_token, urlsrc
*/
#[PublicPage]
#[NoCSRFRequired]
public function extAppGetData($fileId) {
$secretToken = $this->request->getParam('secret_token');
$apps = array_filter(explode(',', $this->appConfig->getAppValue('external_apps')));
Expand All @@ -129,8 +81,8 @@ public function extAppGetData($fileId) {
'fileId' => $fileId
]);
try {
$folder = $this->rootFolder->getUserFolder($this->uid);
$item = $folder->getById($fileId)[0];
$folder = $this->rootFolder->getUserFolder($this->userId);
$item = $folder->getFirstNodeById($fileId);
if (!($item instanceof Node)) {
throw new \Exception();
}
Expand Down Expand Up @@ -168,14 +120,13 @@ private function domainOnly($url) {
/**
* Redirect to the files app with proper CSP headers set for federated editing
* This is a workaround since we cannot set a nonce for allowing dynamic URLs in the richdocument iframe
*
* @NoAdminRequired
* @NoCSRFRequired
*/
public function open($fileId) {
#[NoAdminRequired]
#[NoCSRFRequired]
public function open(int $fileId) {
try {
$folder = $this->rootFolder->getUserFolder($this->uid);
$item = $folder->getById($fileId)[0];
$folder = $this->rootFolder->getUserFolder($this->userId);
$item = $folder->getFirstNodeById($fileId);
if (!($item instanceof File)) {
throw new \Exception('Node is not a file');
}
Expand Down Expand Up @@ -205,21 +156,15 @@ public function open($fileId) {
return new TemplateResponse('core', '403', [], 'guest');
}

/**
* @NoAdminRequired
*
* @param string $fileId
* @param string|null $path
* @return RedirectResponse|TemplateResponse
*/
public function index($fileId, $path = null) {
#[NoAdminRequired]
public function index(int $fileId, ?string $path = null): RedirectResponse|TemplateResponse {
try {
$folder = $this->rootFolder->getUserFolder($this->uid);
$folder = $this->rootFolder->getUserFolder($this->userId);

if ($path !== null) {
$item = $folder->get($path);
} else {
$item = $folder->getById($fileId)[0];
$item = $folder->getFirstNodeById($fileId);
}

if (!($item instanceof File)) {
Expand Down Expand Up @@ -248,7 +193,7 @@ public function index($fileId, $path = null) {
'path' => $folder->getRelativePath($item->getPath()),
'instanceId' => $this->settings->getSystemValue('instanceid'),
'canonical_webroot' => $this->appConfig->getAppValue('canonical_webroot'),
'userId' => $this->uid
'userId' => $this->userId
];

$encryptionManager = \OC::$server->getEncryptionManager();
Expand All @@ -275,8 +220,6 @@ public function index($fileId, $path = null) {
}

/**
* @NoAdminRequired
*
* Create a new file from a template
*
* @param int $templateId
Expand All @@ -287,12 +230,13 @@ public function index($fileId, $path = null) {
* @throws NotPermittedException
* @throws \OCP\Files\InvalidPathException
*/
#[NoAdminRequired]
public function createFromTemplate($templateId, $fileName, $dir) {
if (!$this->templateManager->isTemplate($templateId)) {
return new TemplateResponse('core', '403', [], 'guest');
}

$userFolder = $this->rootFolder->getUserFolder($this->uid);
$userFolder = $this->rootFolder->getUserFolder($this->userId);
try {
$folder = $userFolder->get($dir);
} catch (NotFoundException $e) {
Expand All @@ -306,7 +250,7 @@ public function createFromTemplate($templateId, $fileName, $dir) {
$file = $folder->newFile($fileName);

$template = $this->templateManager->get($templateId);
[$urlSrc, $wopi] = $this->tokenManager->getTokenForTemplate($template, $this->uid, $file->getId());
[$urlSrc, $wopi] = $this->tokenManager->getTokenForTemplate($template, $this->userId, $file->getId());

$wopiFileId = $template->getId() . '-' . $file->getId() . '_' . $this->settings->getSystemValue('instanceid');
$wopiFileId = $wopi->getFileid() . '_' . $this->settings->getSystemValue('instanceid');
Expand All @@ -320,22 +264,18 @@ public function createFromTemplate($templateId, $fileName, $dir) {
'path' => $userFolder->getRelativePath($file->getPath()),
'instanceId' => $this->settings->getSystemValue('instanceid'),
'canonical_webroot' => $this->appConfig->getAppValue('canonical_webroot'),
'userId' => $this->uid
'userId' => $this->userId
];

return new TemplateResponse('officeonline', 'documents', $params, 'base');
}

/**
* @PublicPage
* @NoCSRFRequired
*
* @param string $shareToken
* @param string $fileName
* @return TemplateResponse
* @throws \Exception
*/
public function publicPage($shareToken, $fileName, $fileId) {
#[PublicPage]
#[NoCSRFRequired]
public function publicPage(string $shareToken, string $fileName, int $fileId): TemplateResponse {
try {
$share = $this->shareManager->getShareByToken($shareToken);
// not authenticated ?
Expand All @@ -349,7 +289,7 @@ public function publicPage($shareToken, $fileName, $fileId) {

$node = $share->getNode();
if ($node instanceof Folder) {
$item = $node->getById($fileId)[0];
$item = $node->getFirstNodeById($fileId);
} else {
$item = $node;
}
Expand All @@ -361,11 +301,11 @@ public function publicPage($shareToken, $fileName, $fileId) {
'path' => '/',
'instanceId' => $this->settings->getSystemValue('instanceid'),
'canonical_webroot' => $this->appConfig->getAppValue('canonical_webroot'),
'userId' => $this->uid,
'userId' => $this->userId,
];

if ($this->uid !== null || ($share->getPermissions() & \OCP\Constants::PERMISSION_UPDATE) === 0 || $this->helper->getGuestName() !== null) {
[$urlSrc, $token] = $this->tokenManager->getToken($item->getId(), $shareToken, $this->uid);
if ($this->userId !== null || ($share->getPermissions() & \OCP\Constants::PERMISSION_UPDATE) === 0 || $this->helper->getGuestName() !== null) {
[$urlSrc, $token] = $this->tokenManager->getToken($item->getId(), $shareToken, $this->userId);
$params['token'] = $token;
$params['urlsrc'] = $urlSrc;
}
Expand All @@ -380,16 +320,15 @@ public function publicPage($shareToken, $fileName, $fileId) {
}

/**
* @PublicPage
* @NoCSRFRequired
*
* @param string $shareToken
* @param $remoteServer
* @param $remoteServerToken
* @param null $filePath
* @return TemplateResponse
*/
public function remote($shareToken, $remoteServer, $remoteServerToken, $filePath = null) {
#[PublicPage]
#[NoCSRFRequired]
public function remote(string $shareToken, $remoteServer, $remoteServerToken, $filePath = null) {
try {
$share = $this->shareManager->getShareByToken($shareToken);
// not authenticated ?
Expand All @@ -407,7 +346,7 @@ public function remote($shareToken, $remoteServer, $remoteServerToken, $filePath
}

if ($node instanceof Node) {
[$urlSrc, $token, $wopi] = $this->tokenManager->getToken($node->getId(), $shareToken, $this->uid);
[$urlSrc, $token, $wopi] = $this->tokenManager->getToken($node->getId(), $shareToken, $this->userId);

$remoteWopi = $this->federationService->getRemoteFileDetails($remoteServer, $remoteServerToken);
$this->tokenManager->updateToRemoteToken($wopi, $shareToken, $remoteServer, $remoteServerToken, $remoteWopi);
Expand Down Expand Up @@ -444,19 +383,18 @@ public function remote($shareToken, $remoteServer, $remoteServerToken, $filePath
}

/**
* @NoAdminRequired
*
* @param string $mimetype
* @param string $filename
* @param string $dir
* @return JSONResponse
* @throws NotPermittedException
* @throws GenericFileException
*/
#[NoAdminRequired]
public function create($mimetype,
$filename,
$dir = '/') {
$root = $this->rootFolder->getUserFolder($this->uid);
$root = $this->rootFolder->getUserFolder($this->userId);
try {
/** @var Folder $folder */
$folder = $root->get($dir);
Expand Down Expand Up @@ -518,6 +456,7 @@ public function create($mimetype,
}

$content = '';

if (class_exists(TemplateManager::class)) {
$manager = \OC_Helper::getFileTemplateManager();
$content = $manager->getTemplate($mimetype);
Expand All @@ -531,7 +470,7 @@ public function create($mimetype,
]);
}

private function renderErrorPage($message) {
private function renderErrorPage(string $message): TemplateResponse {
$params = [
'errors' => [['error' => $message]]
];
Expand Down
Loading
Loading