diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Controller/DocumentController.php | 17 | ||||
-rw-r--r-- | lib/Controller/FederationController.php | 4 | ||||
-rw-r--r-- | lib/Controller/WopiController.php | 9 | ||||
-rw-r--r-- | lib/Events/BeforeFederationRedirectEvent.php | 46 | ||||
-rw-r--r-- | lib/Service/FederationService.php | 8 |
5 files changed, 74 insertions, 10 deletions
diff --git a/lib/Controller/DocumentController.php b/lib/Controller/DocumentController.php index d021f536..3f2071db 100644 --- a/lib/Controller/DocumentController.php +++ b/lib/Controller/DocumentController.php @@ -11,6 +11,7 @@ namespace OCA\Richdocuments\Controller; +use OCA\Richdocuments\Events\BeforeFederationRedirectEvent; use OCA\Richdocuments\Service\FederationService; use OCA\Richdocuments\TokenManager; use \OCP\AppFramework\Controller; @@ -193,11 +194,21 @@ class DocumentController extends Controller { $remoteCollabora = $this->federationService->getRemoteCollaboraURL($remote); if ($remoteCollabora !== '') { $absolute = $item->getParent()->getPath(); - $relative = $folder->getRelativePath($absolute); - $url = '/index.php/apps/files?dir=' . $relative . - '&richdocuments_open=' . $item->getName() . + $relativeFolderPath = $folder->getRelativePath($absolute); + $relativeFilePath = $folder->getRelativePath($item->getPath()); + $url = '/index.php/apps/files/?dir=' . $relativeFolderPath . + '&richdocuments_open=' . $relativeFilePath . '&richdocuments_fileId=' . $fileId . '&richdocuments_remote_access=' . $remote; + + $event = new BeforeFederationRedirectEvent( + $item, $relative, $remote + ); + $eventDispatcher = \OC::$server->getEventDispatcher(); + $eventDispatcher->dispatch(BeforeFederationRedirectEvent::class, $event); + if ($event->getRedirectUrl()) { + $url = $event->getRedirectUrl(); + } return new RedirectResponse($url); } $this->logger->warning('Failed to connect to remote collabora instance for ' . $fileId); diff --git a/lib/Controller/FederationController.php b/lib/Controller/FederationController.php index 1eb4b6c7..6ec1409d 100644 --- a/lib/Controller/FederationController.php +++ b/lib/Controller/FederationController.php @@ -62,9 +62,11 @@ class FederationController extends OCSController { * @NoCSRFRequired */ public function index() { - return new DataResponse([ + $response = new DataResponse([ 'wopi_url' => $this->config->getAppValue('richdocuments', 'wopi_url') ]); + $response->setHeaders(['X-Frame-Options' => 'ALLOW']); + return $response; } /** diff --git a/lib/Controller/WopiController.php b/lib/Controller/WopiController.php index ddb758c2..e9c87e14 100644 --- a/lib/Controller/WopiController.php +++ b/lib/Controller/WopiController.php @@ -161,6 +161,7 @@ class WopiController extends Controller { $guestUserId = 'Guest-' . \OC::$server->getSecureRandom()->generate(8); $user = $this->userManager->get($wopi->getEditorUid()); $userDisplayName = $user !== null && !$isPublic ? $user->getDisplayName() : $wopi->getGuestDisplayname(); + $isVersion = $version !== '0'; $response = [ 'BaseFileName' => $file->getName(), 'Size' => $file->getSize(), @@ -174,10 +175,10 @@ class WopiController extends Controller { 'UserCanNotWriteRelative' => \OC::$server->getEncryptionManager()->isEnabled() || $isPublic, 'PostMessageOrigin' => $wopi->getServerHost(), 'LastModifiedTime' => Helper::toISO8601($file->getMTime()), - 'SupportsRename' => true, - 'UserCanRename' => !$isPublic, + 'SupportsRename' => !$isVersion, + 'UserCanRename' => !$isPublic && !$isVersion, 'EnableInsertRemoteImage' => true, - 'EnableShare' => true, + 'EnableShare' => $file->isShareable() && !$isVersion, 'HideUserList' => 'desktop', 'DisablePrint' => $wopi->getHideDownload(), 'DisableExport' => $wopi->getHideDownload(), @@ -392,7 +393,7 @@ class WopiController extends Controller { } // Set the user to register the change under his name - $this->userScopeService->setUserScope($wopi->getEditorUid()); + $this->userScopeService->setUserScope($wopi->getUserForFileAccess()); $this->userScopeService->setFilesystemScope($isPutRelative ? $wopi->getEditorUid() : $wopi->getUserForFileAccess()); try { diff --git a/lib/Events/BeforeFederationRedirectEvent.php b/lib/Events/BeforeFederationRedirectEvent.php new file mode 100644 index 00000000..40bb8b02 --- /dev/null +++ b/lib/Events/BeforeFederationRedirectEvent.php @@ -0,0 +1,46 @@ +<?php + +namespace OCA\Richdocuments\Events; + + +use OCP\Files\Node; +use Symfony\Component\EventDispatcher\Event; + +class BeforeFederationRedirectEvent extends Event { + + /** @var Node */ + private $node; + /** @var string */ + private $relativePath; + /** @var string|null */ + private $redirectUrl = null; + /** @var string */ + private $remote; + + public function __construct($node, $relativePath, $remote) { + $this->node = $node; + $this->relativePath = $relativePath; + $this->remote = $remote; + } + + public function getRelativePath() { + return $this->relativePath; + } + + public function getNode() { + return $this->node; + } + + public function getRemote() { + return $this->remote; + } + + public function setRedirectUrl($redirectUrl) { + $this->redirectUrl = $redirectUrl; + } + + public function getRedirectUrl() { + return $this->redirectUrl; + } + +}
\ No newline at end of file diff --git a/lib/Service/FederationService.php b/lib/Service/FederationService.php index 665cbe1e..fce2ea74 100644 --- a/lib/Service/FederationService.php +++ b/lib/Service/FederationService.php @@ -60,10 +60,14 @@ class FederationService { } catch (QueryException $e) {} } + /** + * @param $remote + * @return string + * @throws \Exception + */ public function getRemoteCollaboraURL($remote) { if ($this->trustedServers === null || !$this->trustedServers->isTrustedServer($remote)) { - $this->logger->info('Unable to determine collabora URL of remote server ' . $remote . ' - Remote is not a trusted server'); - return ''; + throw new \Exception('Unable to determine collabora URL of remote server ' . $remote . ' - Remote is not a trusted server'); } if ($remoteCollabora = $this->cache->get('richdocuments_remote/' . $remote)) { return $remoteCollabora; |