richdocuments/lib/Db/WopiMapper.php

132 строки
3.6 KiB
PHP

<?php
/**
* @copyright 2018, Roeland Jago Douma <roeland@famdouma.nl>
*
* @author Roeland Jago Douma <roeland@famdouma.nl>
*
* @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\Db;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\Mapper;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\IDBConnection;
use OCP\ILogger;
use OCP\Security\ISecureRandom;
class WopiMapper extends Mapper {
// Tokens expire after this many seconds (not defined by WOPI specs).
const TOKEN_LIFETIME_SECONDS = 1800;
/** @var ISecureRandom */
private $random;
/** @var ILogger */
private $logger;
/** @var ITimeFactory */
private $timeFactory;
public function __construct(IDBConnection $db,
ISecureRandom $random,
ILogger $logger,
ITimeFactory $timeFactory) {
parent::__construct($db, 'richdocuments_wopi', Wopi::class);
$this->random = $random;
$this->logger = $logger;
$this->timeFactory = $timeFactory;
}
/**
* @param int $fileId
* @param string $owner
* @param string $editor
* @param int $version
* @param bool $updatable
* @param string $serverHost
* @param string $guestDisplayname
* @param int $templateDestination
* @return Wopi
*/
public function generateFileToken($fileId, $owner, $editor, $version, $updatable, $serverHost, $guestDisplayname, $templateDestination = 0) {
$token = $this->random->generate(32, ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_UPPER . ISecureRandom::CHAR_DIGITS);
$wopi = Wopi::fromParams([
'fileid' => $fileId,
'ownerUid' => $owner,
'editorUid' => $editor,
'version' => $version,
'canwrite' => $updatable,
'serverHost' => $serverHost,
'token' => $token,
'expiry' => $this->timeFactory->getTime() + self::TOKEN_LIFETIME_SECONDS,
'guestDisplayname' => $guestDisplayname,
'templateDestination' => $templateDestination,
]);
/** @var Wopi $wopi */
$wopi = $this->insert($wopi);
return $wopi;
}
/**
* Given a token, validates it and
* constructs and validates the path.
* Returns the path, if valid, else false.
*
* @param string $token
* @throws DoesNotExistException
* @return Wopi
*/
public function getPathForToken($token) {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from('richdocuments_wopi')
->where(
$qb->expr()->eq('token', $qb->createNamedParameter($token))
);
$result = $qb->execute();
$row = $result->fetch();
$result->closeCursor();
$this->logger->debug('Loaded WOPI Token record: {row}.', [
'row' => $row,
'app' => 'richdocuments'
]);
if ($row === false) {
throw new DoesNotExistException('Could not find token.');
}
/** @var Wopi $wopi */
$wopi = Wopi::fromRow($row);
//TODO: validate.
if ($wopi->getExpiry() > $this->timeFactory->getTime()){
// Expired token!
//http_response_code(404);
//$wopi->deleteBy('id', $row['id']);
//return false;
}
return $wopi;
}
}