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:
authorAshod Nakashian <ashod.nakashian@collabora.co.uk>2016-03-09 05:15:44 +0300
committerAshod Nakashian <ashod.nakashian@collabora.co.uk>2016-03-09 16:40:48 +0300
commitbe97780451e103d4b8faf28202d51998ec1d742e (patch)
treea040ae144883a7c756207ffd9bab573bcfd9214b /lib
parent789d0050fb1da8c15bb5114dd217a3d77287284a (diff)
WOPI Token table and database plumbing added
Diffstat (limited to 'lib')
-rw-r--r--lib/db/wopi.php101
1 files changed, 101 insertions, 0 deletions
diff --git a/lib/db/wopi.php b/lib/db/wopi.php
new file mode 100644
index 00000000..306204d3
--- /dev/null
+++ b/lib/db/wopi.php
@@ -0,0 +1,101 @@
+<?php
+
+/**
+ * ownCloud - Richdocuments App
+ *
+ * @author Ashod Nakashian
+ * @copyright 2016 Ashod Nakashian ashod.nakashian@collabora.co.uk
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ */
+
+namespace OCA\Richdocuments\Db;
+
+use \OCA\Richdocuments\Download;
+use \OCA\Richdocuments\DownloadResponse;
+
+/**
+ * @method string generateFileToken()
+ * @method string getPathForToken()
+ */
+
+class Wopi extends \OCA\Richdocuments\Db{
+
+ const DB_TABLE = '`*PREFIX*richdocuments_wopi`';
+
+ // Tokens expire after this many seconds (not defined by WOPI specs).
+ const TOKEN_LIFETIME_SECONDS = 30 * 60;
+
+ protected $tableName = '`*PREFIX*richdocuments_wopi`';
+
+ protected $insertStatement = 'INSERT INTO `*PREFIX*richdocuments_wopi` (`uid`, `fileid`, `path`, `token`, `expiry`)
+ VALUES (?, ?, ?, ?, ?)';
+
+ protected $loadStatement = 'SELECT * FROM `*PREFIX*richdocuments_wopi` WHERE `token`= ?';
+
+ /*
+ * Given a fileId, generates a token
+ * and stores in the database.
+ * Returns the token.
+ */
+ public function generateFileToken($fileId){
+ $user = \OC_User::getUser();
+ $view = new \OC\Files\View('/' . $user . '/');
+ $path = $view->getPath($fileId);
+
+ if (!$view->is_file($path)) {
+ throw new \Exception('Invalid fileId.');
+ }
+
+ $token = \OC::$server->getSecureRandom()->getMediumStrengthGenerator()->generate(32,
+ \OCP\Security\ISecureRandom::CHAR_LOWER . \OCP\Security\ISecureRandom::CHAR_UPPER .
+ \OCP\Security\ISecureRandom::CHAR_DIGITS);
+
+ \OC::$server->getLogger()->debug('Issuing token for {user} file {fileId}: {token}',
+ [ 'user' => $user, 'fileId' => $fileId, 'token' => $token ]);
+
+ $wopi = new \OCA\Richdocuments\Db\Wopi([
+ $user,
+ $fileId,
+ $path,
+ $token,
+ time() + self::TOKEN_LIFETIME_SECONDS
+ ]);
+
+ if (!$wopi->insert()){
+ throw new \Exception('Failed to add wopi token into database');
+ }
+
+ return $token;
+ }
+
+ /*
+ * Given a token, validates it and
+ * constructs and validates the path.
+ * Returns the path, if valid, else false.
+ */
+ public function getPathForToken($fileId, $token){
+
+ $wopi = new Wopi();
+ $row = $wopi->loadBy('token', $token)->getData();
+ \OC::$server->getLogger()->debug('Loaded WOPI Token record: {row}.', [ 'row' => $row ]);
+
+ //TODO: validate.
+ if ($row['expiry'] > time() || $row['fileid'] !== $fileId){
+ // Expired token!
+ //$wopi->deleteBy('id', $row['id']);
+ //return false;
+ }
+
+ $user = $row['uid'];
+ $view = new \OC\Files\View('/' . $user . '/');
+ $path = $row['path'];
+
+ if (!$view->is_file($path)) {
+ throw new \Exception('Invalid file path.');
+ }
+
+ return array('user' => $user, 'path' => $path);
+ }
+}