]> source.dussan.org Git - nextcloud-server.git/commitdiff
Add file size as check
authorJoas Schilling <coding@schilljs.com>
Wed, 27 Jul 2016 13:57:00 +0000 (15:57 +0200)
committerJoas Schilling <coding@schilljs.com>
Wed, 3 Aug 2016 12:40:20 +0000 (14:40 +0200)
apps/workflowengine/js/filesizeplugin.js [new file with mode: 0644]
apps/workflowengine/lib/AppInfo/Application.php
apps/workflowengine/lib/Check/FileSize.php [new file with mode: 0644]

diff --git a/apps/workflowengine/js/filesizeplugin.js b/apps/workflowengine/js/filesizeplugin.js
new file mode 100644 (file)
index 0000000..add2e57
--- /dev/null
@@ -0,0 +1,51 @@
+/**
+ * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com>
+ *
+ * @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/>.
+ *
+ */
+
+(function() {
+
+       OCA.WorkflowEngine = OCA.WorkflowEngine || {};
+       OCA.WorkflowEngine.Plugins = OCA.WorkflowEngine.Plugins || {};
+
+       OCA.WorkflowEngine.Plugins.FileSizePlugin = {
+               getCheck: function() {
+                       return {
+                               'class': 'OCA\\WorkflowEngine\\Check\\FileSize',
+                               'name': t('workflowengine', 'File size'),
+                               'operators': [
+                                       {'operator': 'less', 'name': t('workflowengine', 'less')},
+                                       {'operator': '!greater', 'name': t('workflowengine', 'less or equals')},
+                                       {'operator': '!less', 'name': t('workflowengine', 'greater or equals')},
+                                       {'operator': 'greater', 'name': t('workflowengine', 'greater')}
+                               ]
+                       };
+               },
+               render: function(element, classname, value) {
+                       if (classname !== 'OCA\\WorkflowEngine\\Check\\FileSize') {
+                               return;
+                       }
+
+                       $(element).css('width', '250px')
+                               .attr('placeholder', t('workflowengine', '12 MB'))
+                       ;
+               }
+       };
+})();
+
+OC.Plugins.register('OCA.WorkflowEngine.CheckPlugins', OCA.WorkflowEngine.Plugins.FileSizePlugin);
index e5b884c0a2aef8f0b84aafe6c88cd1633b845bce..64e03081a3427cc1d00e6d8774887e45fb130cd0 100644 (file)
@@ -55,6 +55,7 @@ class Application extends \OCP\AppFramework\App {
                                        'admin',
 
                                        // Check plugins
+                                       'filesizeplugin',
                                        'filesystemtagsplugin',
                                        'usergroupmembershipplugin',
                                ]);
diff --git a/apps/workflowengine/lib/Check/FileSize.php b/apps/workflowengine/lib/Check/FileSize.php
new file mode 100644 (file)
index 0000000..7007175
--- /dev/null
@@ -0,0 +1,113 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com>
+ *
+ * @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\WorkflowEngine\Check;
+
+
+use OCP\Files\Storage\IStorage;
+use OCP\IRequest;
+use OCP\Util;
+use OCP\WorkflowEngine\ICheck;
+
+class FileSize implements ICheck {
+
+       /** @var int */
+       protected $size;
+
+       /** @var IRequest */
+       protected $request;
+
+       /**
+        * @param IRequest $request
+        */
+       public function __construct(IRequest $request) {
+               $this->request = $request;
+       }
+
+       /**
+        * @param IStorage $storage
+        * @param string $path
+        */
+       public function setFileInfo(IStorage $storage, $path) {
+       }
+
+       /**
+        * @param string $operator
+        * @param string $value
+        * @return bool
+        */
+       public function executeCheck($operator, $value) {
+               $size = $this->getFileSizeFromHeader();
+
+               $value = Util::computerFileSize($value);
+               if ($size !== false) {
+                       switch ($operator) {
+                               case 'less':
+                                       return $size < $value;
+                               case '!less':
+                                       return $size >= $value;
+                               case 'greater':
+                                       return $size > $value;
+                               case '!greater':
+                                       return $size <= $value;
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * @param string $operator
+        * @param string $value
+        * @throws \UnexpectedValueException
+        */
+       public function validateCheck($operator, $value) {
+               if (!in_array($operator, ['less', '!less', 'greater', '!greater'])) {
+                       throw new \UnexpectedValueException('Invalid operator', 1);
+               }
+
+               if (!preg_match('/^[0-9]+[ ]?[kmgt]?b$/i', $value)) {
+                       throw new \UnexpectedValueException('Invalid file size', 2);
+               }
+       }
+
+       /**
+        * @return string
+        */
+       protected function getFileSizeFromHeader() {
+               if ($this->size !== null) {
+                       return $this->size;
+               }
+
+               $size = $this->request->getHeader('OC-Total-Length');
+               if ($size === null) {
+                       if (in_array($this->request->getMethod(), ['POST', 'PUT'])) {
+                               $size = $this->request->getHeader('Content-Length');
+                       }
+               }
+
+               if ($size === null) {
+                       $size = false;
+               }
+
+               $this->size = $size;
+               return $this->size;
+       }
+}