uid = $UserId; $this->l10n = $l10n; $this->settings = $settings; $this->appConfig = $appConfig; $this->wopiParser = $wopiParser; $this->shareManager = $shareManager; $this->tokenManager = $tokenManager; $this->rootFolder = $rootFolder; $this->session = $session; $this->logger = $logger; } /** * @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 access_token, urlsrc */ public function extAppGetData($fileId) { $secretToken = $this->request->getParam('secret_token'); $apps = array_filter(explode(',', $this->appConfig->getAppValue('external_apps'))); foreach($apps as $app) { if ($app !== '') { if ($secretToken === $app) { $appName = explode(':', $app); \OC::$server->getLogger()->debug('External app "{extApp}" authenticated; issuing access token for fileId {fileId}', [ 'app' => $this->appName, 'extApp' => $appName[0], 'fileId' => $fileId ]); try { $folder = $this->rootFolder->getUserFolder($this->uid); $item = $folder->getById($fileId)[0]; if(!($item instanceof Node)) { throw new \Exception(); } list($urlSrc, $token) = $this->tokenManager->getToken($item->getId()); return array( 'status' => 'success', 'urlsrc' => $urlSrc, 'token' => $token ); } catch (\Exception $e) { $this->logger->logException($e, ['app'=>'richdocuments']); $params = [ 'remoteAddr' => $this->request->getRemoteAddress(), 'requestID' => $this->request->getId(), 'debugMode' => $this->settings->getSystemValue('debug'), 'errorClass' => get_class($e), 'errorCode' => $e->getCode(), 'errorMsg' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine(), 'trace' => $e->getTraceAsString() ]; return new TemplateResponse('core', 'exception', $params, 'guest'); } } } return array( 'status' => 'error', 'message' => 'Permission denied' ); } } /** * @NoAdminRequired * * @param string $fileId * @return TemplateResponse */ public function index($fileId) { try { $folder = $this->rootFolder->getUserFolder($this->uid); $item = $folder->getById($fileId)[0]; if(!($item instanceof Node)) { throw new \Exception(); } list($urlSrc, $token) = $this->tokenManager->getToken($item->getId()); $params = [ 'permissions' => $item->getPermissions(), 'title' => $item->getName(), 'fileId' => $item->getId() . '_' . $this->settings->getSystemValue('instanceid'), 'token' => $token, 'urlsrc' => $urlSrc, 'path' => $folder->getRelativePath($item->getPath()), 'instanceId' => $this->settings->getSystemValue('instanceid'), 'canonical_webroot' => $this->appConfig->getAppValue('canonical_webroot'), ]; $encryptionManager = \OC::$server->getEncryptionManager(); if ($encryptionManager->isEnabled()) { // Update the current file to be accessible with system public shared key $owner = $item->getOwner()->getUID(); $absPath = '/' . $owner . '/' . $item->getInternalPath(); $accessList = \OC::$server->getEncryptionFilesHelper()->getAccessList($absPath); $accessList['public'] = true; $encryptionManager->getEncryptionModule()->update($absPath, $owner, $accessList); } $response = new TemplateResponse('richdocuments', 'documents', $params, 'empty'); $policy = new ContentSecurityPolicy(); $policy->addAllowedFrameDomain($this->appConfig->getAppValue('wopi_url')); $policy->allowInlineScript(true); $response->setContentSecurityPolicy($policy); return $response; } catch (\Exception $e) { $this->logger->logException($e, ['app'=>'richdocuments']); $params = [ 'remoteAddr' => $this->request->getRemoteAddress(), 'requestID' => $this->request->getId(), 'debugMode' => $this->settings->getSystemValue('debug'), 'errorClass' => get_class($e), 'errorCode' => $e->getCode(), 'errorMsg' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine(), 'trace' => $e->getTraceAsString() ]; return new TemplateResponse('core', 'exception', $params, 'guest'); } return new TemplateResponse('core', '403', [], 'guest'); } /** * @PublicPage * * @param string $shareToken * @param string $fileName * @return TemplateResponse * @throws \Exception */ public function publicPage($shareToken, $fileName, $fileId) { try { $share = $this->shareManager->getShareByToken($shareToken); // not authenticated ? if($share->getPassword()){ if (!$this->session->exists('public_link_authenticated') || $this->session->get('public_link_authenticated') !== (string)$share->getId() ) { throw new \Exception('Invalid password'); } } $node = $share->getNode(); if($node instanceof Folder) { $item = $node->getById($fileId)[0]; } else { $item = $node; } if ($item instanceof Node) { list($urlSrc, $token) = $this->tokenManager->getToken($item->getId(), $shareToken); $params = [ 'permissions' => $share->getPermissions(), 'title' => $item->getName(), 'fileId' => $item->getId() . '_' . $this->settings->getSystemValue('instanceid'), 'token' => $token, 'urlsrc' => $urlSrc, 'path' => '/', 'instanceId' => $this->settings->getSystemValue('instanceid'), ]; $response = new TemplateResponse('richdocuments', 'documents', $params, 'empty'); $policy = new ContentSecurityPolicy(); $policy->addAllowedFrameDomain($this->appConfig->getAppValue('wopi_url')); $policy->allowInlineScript(true); $response->setContentSecurityPolicy($policy); return $response; } } catch (\Exception $e) { $this->logger->logException($e, ['app'=>'richdocuments']); $params = [ 'remoteAddr' => $this->request->getRemoteAddress(), 'requestID' => $this->request->getId(), 'debugMode' => $this->settings->getSystemValue('debug'), 'errorClass' => get_class($e), 'errorCode' => $e->getCode(), 'errorMsg' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine(), 'trace' => $e->getTraceAsString() ]; return new TemplateResponse('core', 'exception', $params, 'guest'); } return new TemplateResponse('core', '403', [], 'guest'); } /** * @NoAdminRequired * * @param string $mimetype * @param string $filename * @param string $dir * @return JSONResponse */ public function create($mimetype, $filename, $dir){ $view = new View('/' . $this->uid . '/files'); if (!$dir){ $dir = '/'; } $basename = $this->l10n->t('New Document.odt'); switch ($mimetype) { case 'application/vnd.oasis.opendocument.spreadsheet': $basename = $this->l10n->t('New Spreadsheet.ods'); break; case 'application/vnd.oasis.opendocument.presentation': $basename = $this->l10n->t('New Presentation.odp'); break; case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': $basename = $this->l10n->t('New Document.docx'); break; case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': $basename = $this->l10n->t('New Spreadsheet.xlsx'); break; case 'application/vnd.openxmlformats-officedocument.presentationml.presentation': $basename = $this->l10n->t('New Presentation.pptx'); break; default: // to be safe $mimetype = 'application/vnd.oasis.opendocument.text'; break; } if (!$filename){ $path = Helper::getNewFileName($view, $dir . '/' . $basename); } else { $path = $dir . '/' . $filename; } $content = ''; if (class_exists('\OC\Files\Type\TemplateManager')){ $manager = \OC_Helper::getFileTemplateManager(); $content = $manager->getTemplate($mimetype); } if (!$content){ $content = file_get_contents(dirname(__DIR__) . self::ODT_TEMPLATE_PATH); } if ($content && $view->file_put_contents($path, $content)) { $info = $view->getFileInfo($path); $ret = $this->wopiParser->getUrlSrc($mimetype); $response = array( 'status' => 'success', 'data' => \OCA\Files\Helper::formatFileInfo($info) ); } else { $response = array( 'status' => 'error', 'message' => (string) $this->l10n->t('Can\'t create document') ); } return $response; } }