Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/richdocuments.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Controller/DocumentController.php17
-rw-r--r--lib/Controller/FederationController.php4
-rw-r--r--lib/Controller/WopiController.php9
-rw-r--r--lib/Events/BeforeFederationRedirectEvent.php46
-rw-r--r--lib/Service/FederationService.php8
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;