コミット
7ef24654cf
@ -0,0 +1,105 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Richdocuments;
|
||||
|
||||
use OC\Share\Constants;
|
||||
use OCA\Richdocuments\Db\Wopi;
|
||||
use OCA\Richdocuments\WOPI\Parser;
|
||||
use OCP\Files\File;
|
||||
use OCP\Files\IRootFolder;
|
||||
use OCP\IURLGenerator;
|
||||
use OCP\Share\IManager;
|
||||
|
||||
class TokenManager {
|
||||
/** @var IRootFolder */
|
||||
private $rootFolder;
|
||||
/** @var IManager */
|
||||
private $shareManager;
|
||||
/** @var IURLGenerator */
|
||||
private $urlGenerator;
|
||||
/** @var Parser */
|
||||
private $wopiParser;
|
||||
|
||||
/**
|
||||
* @param IRootFolder $rootFolder
|
||||
* @param IManager $shareManager
|
||||
* @param IURLGenerator $urlGenerator
|
||||
* @param string $UserId
|
||||
*/
|
||||
public function __construct(IRootFolder $rootFolder,
|
||||
IManager $shareManager,
|
||||
IURLGenerator $urlGenerator,
|
||||
Parser $wopiParser,
|
||||
$UserId) {
|
||||
$this->rootFolder = $rootFolder;
|
||||
$this->shareManager = $shareManager;
|
||||
$this->urlGenerator = $urlGenerator;
|
||||
$this->wopiParser = $wopiParser;
|
||||
$this->userId = $UserId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $fileId
|
||||
* @param string $shareToken
|
||||
* @return array
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function getToken($fileId, $shareToken = null) {
|
||||
$arr = explode('_', $fileId, 2);
|
||||
$version = '0';
|
||||
if (count($arr) === 2) {
|
||||
list($fileId, $version) = $arr;
|
||||
}
|
||||
|
||||
// if the user is not logged-in do use the sharers storage
|
||||
if($shareToken !== null) {
|
||||
/** @var File $file */
|
||||
$rootFolder = $this->rootFolder;
|
||||
$share = $this->shareManager->getShareByToken($shareToken);
|
||||
$updatable = (bool)($share->getPermissions() & \OCP\Constants::PERMISSION_UPDATE);
|
||||
} else {
|
||||
try {
|
||||
/** @var File $file */
|
||||
$rootFolder = $this->rootFolder->getUserFolder($this->userId);
|
||||
$updatable = $rootFolder->isUpdateable();
|
||||
} catch (\Exception $e) {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
/** @var File $file */
|
||||
$file = $rootFolder->getById($fileId)[0];
|
||||
|
||||
$row = new Wopi();
|
||||
$serverHost = $this->urlGenerator->getAbsoluteURL('/');//$this->request->getServerProtocol() . '://' . $this->request->getServerHost();
|
||||
$token = $row->generateFileToken($fileId, $file->getOwner()->getUID(), $this->userId, $version, $updatable, $serverHost);
|
||||
|
||||
try {
|
||||
|
||||
return [
|
||||
$this->wopiParser->getUrlSrc($file->getMimeType())['urlsrc'],
|
||||
$token,
|
||||
];
|
||||
} catch (\Exception $e){
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,74 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - Richdocuments App
|
||||
*
|
||||
* @author Victor Dubiniuk
|
||||
* @copyright 2013 Victor Dubiniuk victor.dubiniuk@gmail.com
|
||||
*
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
*/
|
||||
|
||||
namespace OCA\Richdocuments;
|
||||
|
||||
class Filter {
|
||||
protected static $filters = array();
|
||||
|
||||
public static function add($mimetype, $class){
|
||||
self::$filters[$mimetype] = $class;
|
||||
}
|
||||
|
||||
public static function read($content, $mimetype){
|
||||
$data = array(
|
||||
'mimetype' => $mimetype,
|
||||
'content' => $content
|
||||
);
|
||||
|
||||
if (isset(self::$filters[$mimetype])){
|
||||
$data = call_user_func(
|
||||
array(
|
||||
self::$filters[$mimetype],
|
||||
'read'
|
||||
),
|
||||
$data
|
||||
);
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public static function write($content, $mimetype){
|
||||
$data = array(
|
||||
'mimetype' => $mimetype,
|
||||
'content' => $content
|
||||
);
|
||||
|
||||
if (isset(self::$filters[$mimetype])){
|
||||
$data = call_user_func(
|
||||
array(
|
||||
self::$filters[$mimetype],
|
||||
'write'
|
||||
),
|
||||
$data
|
||||
);
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public static function getAll(){
|
||||
return array_keys(self::$filters);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if mimetype is supported by the app
|
||||
* @param string $mimetype - checked mimetype
|
||||
* @return bool
|
||||
*/
|
||||
public static function isSupportedMimetype($mimetype){
|
||||
return in_array($mimetype, Storage::getSupportedMimetypes());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,175 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - Richdocuments App
|
||||
*
|
||||
* @author Frank Karlitschek
|
||||
* @copyright 2013-2014 Frank Karlitschek frank@owncloud.org
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OCA\Richdocuments;
|
||||
|
||||
class Storage {
|
||||
public static $MIMETYPE_LIBREOFFICE_WORDPROCESSOR = array(
|
||||
'application/vnd.oasis.opendocument.text',
|
||||
'application/vnd.oasis.opendocument.presentation',
|
||||
'application/vnd.oasis.opendocument.spreadsheet',
|
||||
'application/vnd.oasis.opendocument.graphics',
|
||||
'application/vnd.lotus-wordpro',
|
||||
'image/svg+xml',
|
||||
'application/vnd.visio',
|
||||
'application/vnd.wordperfect',
|
||||
'application/msonenote',
|
||||
'application/msword',
|
||||
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
||||
'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
|
||||
'application/vnd.ms-word.document.macroEnabled.12',
|
||||
'application/vnd.ms-word.template.macroEnabled.12',
|
||||
'application/vnd.ms-excel',
|
||||
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||
'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
|
||||
'application/vnd.ms-excel.sheet.macroEnabled.12',
|
||||
'application/vnd.ms-excel.template.macroEnabled.12',
|
||||
'application/vnd.ms-excel.addin.macroEnabled.12',
|
||||
'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
|
||||
'application/vnd.ms-powerpoint',
|
||||
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
||||
'application/vnd.openxmlformats-officedocument.presentationml.template',
|
||||
'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
|
||||
'application/vnd.ms-powerpoint.addin.macroEnabled.12',
|
||||
'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
|
||||
'application/vnd.ms-powerpoint.template.macroEnabled.12',
|
||||
'application/vnd.ms-powerpoint.slideshow.macroEnabled.12'
|
||||
);
|
||||
|
||||
public static function getDocuments() {
|
||||
$list = array_filter(
|
||||
self::searchDocuments(),
|
||||
function($item){
|
||||
//filter Deleted
|
||||
if (strpos($item['path'], '_trashbin')===0){
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
);
|
||||
|
||||
return $list;
|
||||
}
|
||||
|
||||
public static function getDocumentById($fileId){
|
||||
$root = \OC::$server->getUserFolder();
|
||||
$ret = array();
|
||||
|
||||
// If type of fileId is a string, then it
|
||||
// doesn't work for shared documents, lets cast to int everytime
|
||||
$document = $root->getById((int)$fileId)[0];
|
||||
if ($document === null){
|
||||
error_log('File with file id, ' . $fileId . ', not found');
|
||||
return $ret;
|
||||
}
|
||||
|
||||
$ret['mimetype'] = $document->getMimeType();
|
||||
$ret['path'] = $root->getRelativePath($document->getPath());
|
||||
$ret['name'] = $document->getName();
|
||||
$ret['fileid'] = $fileId;
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
public static function resolvePath($fileId){
|
||||
$list = array_filter(
|
||||
self::searchDocuments(),
|
||||
function($item) use ($fileId){
|
||||
return intval($item['fileid'])==$fileId;
|
||||
}
|
||||
);
|
||||
if (count($list)>0){
|
||||
$item = current($list);
|
||||
return $item['path'];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Cleanup session data on removing the document
|
||||
* @param array
|
||||
*
|
||||
* This function is connected to the delete signal of OC_Filesystem
|
||||
* to delete the related info from database
|
||||
*/
|
||||
public static function onDelete($params) {
|
||||
$info = \OC\Files\Filesystem::getFileInfo($params['path']);
|
||||
|
||||
$fileId = @$info['fileid'];
|
||||
if (!$fileId){
|
||||
return;
|
||||
}
|
||||
|
||||
$session = new Db\Session();
|
||||
$session->loadBy('file_id', $fileId);
|
||||
|
||||
if (!$session->getEsId()){
|
||||
return;
|
||||
}
|
||||
|
||||
$member = new Db\Member();
|
||||
$sessionMembers = $member->getCollectionBy('es_id', $session->getEsId());
|
||||
foreach ($sessionMembers as $memberData){
|
||||
if (intval($memberData['status'])===Db\Member::MEMBER_STATUS_ACTIVE){
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static function processDocuments($rawDocuments){
|
||||
$documents = array();
|
||||
$view = \OC\Files\Filesystem::getView();
|
||||
foreach($rawDocuments as $rawDocument){
|
||||
$document = array(
|
||||
'fileid' => $rawDocument->getId(),
|
||||
'path' => $view->getPath($rawDocument->getId()),
|
||||
'name' => $rawDocument->getName(),
|
||||
'mimetype' => $rawDocument->getMimetype(),
|
||||
'mtime' => $rawDocument->getMTime()
|
||||
);
|
||||
|
||||
array_push($documents, $document);
|
||||
}
|
||||
|
||||
return $documents;
|
||||
}
|
||||
|
||||
protected static function searchDocuments(){
|
||||
$documents = array();
|
||||
foreach (self::getSupportedMimetypes() as $mime){
|
||||
$rawDocuments = \OCP\Files::searchByMime($mime);
|
||||
$documents = array_merge($documents, self::processDocuments($rawDocuments));
|
||||
}
|
||||
|
||||
return $documents;
|
||||
}
|
||||
|
||||
public static function getSupportedMimetypes(){
|
||||
return array_merge(
|
||||
self::$MIMETYPE_LIBREOFFICE_WORDPROCESSOR,
|
||||
Filter::getAll()
|
||||
);
|
||||
}
|
||||
}
|
読み込み中…
新しいイシューから参照