]> source.dussan.org Git - nextcloud-server.git/commitdiff
Appdata integration 2
authorJohn Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
Wed, 9 Nov 2016 12:39:08 +0000 (13:39 +0100)
committerRoeland Jago Douma <roeland@famdouma.nl>
Fri, 6 Jan 2017 08:42:13 +0000 (09:42 +0100)
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
core/Controller/CssController.php [new file with mode: 0644]
core/routes.php
lib/private/AppFramework/DependencyInjection/DIContainer.php
lib/private/CssManager.php [new file with mode: 0644]
lib/private/Server.php
lib/private/Template/CSSResourceLocator.php
lib/private/Template/ResourceLocator.php
lib/private/Template/SCSSCacher.php
lib/public/ICssManager.php [new file with mode: 0644]

diff --git a/core/Controller/CssController.php b/core/Controller/CssController.php
new file mode 100644 (file)
index 0000000..45a188a
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016, John Molakvoæ (skjnldsv@protonmail.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 OC\Core\Controller;
+
+use OC\AppFramework\Utility\TimeFactory;
+use OCP\AppFramework\Controller;
+use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\NotFoundResponse;
+use OCP\AppFramework\Http\FileDisplayResponse;
+use OCP\ICssManager;
+use OCP\IRequest;
+
+
+class CssController extends Controller {
+
+       /** @var ICssManager */
+       protected $cssManager;
+
+       /** @var TimeFactory */
+       protected $timeFactory;
+
+
+
+       /**
+        * @param string $appName
+        * @param IRequest $request
+        * @param ICssManager $cssManager
+        * @param TimeFactory $timeFactory
+        */
+       public function __construct($appName, IRequest $request, ICssManager $cssManager, TimeFactory $timeFactory) {
+               parent::__construct($appName, $request);
+
+               $this->cssManager = $cssManager;
+               $this->timeFactory = $timeFactory;
+       }
+
+       /**
+        * @NoAdminRequired
+        * @NoCSRFRequired
+        *
+        * @param string $fileName css filename with extension
+        * @return text/css
+        */
+       public function getCss($fileName) {
+               try {
+                       $cssFile = $this->cssManager->getCss($fileName);
+               } catch(NotFoundException $e) {
+                       return new NotFoundResponse();
+               }
+
+               if ($cssFile !== false) {
+                       $response = new FileDisplayResponse($cssFile, Http::STATUS_OK, ['Content-Type' => 'text/css']);
+                       $response->cacheFor(86400);
+                       $expires = new \DateTime();
+                       $expires->setTimestamp($this->timeFactory->getTime());
+                       $expires->add(new \DateInterval('PT24H'));
+                       $response->addHeader('Expires', $expires->format(\DateTime::RFC2822));
+                       $response->addHeader('Pragma', 'cache');
+                       return $response;
+               } else {
+                       return new NotFoundResponse();
+               }
+       }
+}
index 2b8080a3b7bee9b3b30a2ceb44fe06d1c64970c1..dec979c8ce24b2856abda98dbe580c6eb0df5d95 100644 (file)
@@ -55,6 +55,7 @@ $application->registerRoutes($this, [
                ['name' => 'OCJS#getConfig', 'url' => '/core/js/oc.js', 'verb' => 'GET'],
                ['name' => 'Preview#getPreview', 'url' => '/core/preview', 'verb' => 'GET'],
                ['name' => 'Preview#getPreview', 'url' => '/core/preview.png', 'verb' => 'GET'],
+               ['name' => 'Css#getCss', 'url' => '/css/{fileName}', 'verb' => 'GET'],
        ],
        'ocs' => [
                ['root' => '/cloud', 'name' => 'OCS#getCapabilities', 'url' => '/capabilities', 'verb' => 'GET'],
index ac42960f54d6b28fa9711779d5ea3a38b84e6455..57e7749ca86904ea568e2a0075f4cba254b2ac4e 100644 (file)
@@ -95,6 +95,11 @@ class DIContainer extends SimpleContainer implements IAppContainer {
                        return $this->getServer()->getAvatarManager();
                });
 
+
+               $this->registerService('OCP\\ICssManager', function($c) {
+                       return $this->getServer()->getCssManager();
+               });
+
                $this->registerService('OCP\\Activity\\IManager', function($c) {
                        return $this->getServer()->getActivityManager();
                });
diff --git a/lib/private/CssManager.php b/lib/private/CssManager.php
new file mode 100644 (file)
index 0000000..016227b
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016, John Molakvoæ (skjnldsv@protonmail.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 OC;
+
+use OCP\Files\IAppData;
+use OCP\Files\NotFoundException;
+use OCP\ICssManager;
+
+/**
+ * This class implements methods to access SCSS cached files
+ */
+class CssManager implements ICssManager {
+
+       /** @var IAppData */
+       private $appData;
+
+       /**
+        * CssManager constructor.
+        *
+        * @param IAppData $appData
+        */
+       public function __construct(IAppData $appData) {
+               $this->appData = $appData;
+       }
+
+       /**
+        * Get the css file and return ISimpleFile
+        *
+        * @param string $fileName css filename with extension
+        * @return ISimpleFile
+        */
+       public function getCss($fileName) {
+               try {
+                       $folder = $this->appData->getFolder('css');
+               } catch(NotFoundException $e) {
+                       throw new NotFoundException();
+               }
+               try {
+                       return $folder->getFile($fileName);
+               } catch(NotFoundException $e) {
+                       throw new NotFoundException();
+               }
+       }
+}
index 5bc72e3614f32d5539ab1b403db4319a57e87f70..2dbf827844d77cd5ec3f20f88ce5019e21a33710 100644 (file)
@@ -417,6 +417,11 @@ class Server extends ServerContainer implements IServerContainer {
                                $c->getConfig()
                        );
                });
+               $this->registerService('CssManager', function (Server $c) {
+                       return new CssManager(
+                               $c->getAppDataDir('server')
+                       );
+               });
                $this->registerService('Logger', function (Server $c) {
                        $logClass = $c->query('AllConfig')->getSystemValue('log_type', 'file');
                        // TODO: Drop backwards compatibility for config in the future
@@ -908,6 +913,16 @@ class Server extends ServerContainer implements IServerContainer {
                return $this->query('AvatarManager');
        }
 
+
+       /**
+        * Returns the css manager
+        *
+        * @return \OCP\ICssManager
+        */
+       public function getCssManager() {
+               return $this->query('CssManager');
+       }
+
        /**
         * Returns the root folder of ownCloud's data directory
         *
index 2e1db9a6757492a29412c3a92f0b6640584cfb0f..0d190959ea16838bf3db82035e55173b7e68ade8 100755 (executable)
@@ -29,6 +29,13 @@ class CSSResourceLocator extends ResourceLocator {
 
        protected $appData;
 
+       /**
+        * @param \OCP\ILogger $logger
+        * @param string $theme
+        * @param array $core_map
+        * @param array $party_map
+        * @param IAppData $appData
+        */
        public function __construct(\OCP\ILogger $logger, $theme, $core_map, $party_map, $appData) {
                $this->appData = $appData;
                parent::__construct($logger, $theme, $core_map, $party_map);
index 89a3a1b025b333929560cf048fe73946eb0edf46..21a4ce927e10298dddbe34419f717a3aacb2e825 100755 (executable)
@@ -111,6 +111,7 @@ abstract class ResourceLocator {
         *
         * @param string $root path to check
         * @param string $file the filename
+        * @param IAppData $appData the appData folder
         * @param string|null $webRoot base for path, default map $root to $webRoot
         * @return bool True if the resource was found and cached, false otherwise
         */
index 43160a9c1696e530d7338fd0ef9e0803bf8ed793..def9ecd276e1c468bc0179997d335fdf1d0ed533 100755 (executable)
@@ -30,19 +30,21 @@ class SCSSCacher {
        protected $root;
        protected $folder;
        protected $file;
-       protected $fileName;
+       protected $fileNameSCSS;
+       protected $fileNameCSS;
        protected $fileLoc;
-       protected $fileCache;
        protected $rootCssLoc;
 
        /** @var \OCP\ILogger */
        protected $logger;
+       /** @var \OCP\Files\IAppData */
        protected $appData;
 
        /**
         * @param \OCP\ILogger $logger
         * @param string $root
         * @param string $file
+        * @param \OCP\Files\IAppData $appData
         */
        public function __construct(\OCP\ILogger $logger, $root, $file, $appData) {
                $this->logger = $logger;
@@ -50,8 +52,10 @@ class SCSSCacher {
                $this->root = $root;
                $this->file = explode('/', $root.'/'.$file);
 
+               /* filenames */
                $this->fileNameSCSS = array_pop($this->file);
                $this->fileNameCSS = str_replace('.scss', '.css', $this->fileNameSCSS);
+
                $this->fileLoc = implode('/', $this->file);
 
                // base uri to css file
@@ -67,6 +71,10 @@ class SCSSCacher {
                }
        }
 
+       /**
+        * Process the caching process if needed
+        * @return boolean
+        */
        public function process() {
 
                if($this->is_cached()) {
@@ -77,6 +85,10 @@ class SCSSCacher {
                return false;
        }
 
+       /**
+        * Check if the file is cached or not
+        * @return boolean
+        */
        private function is_cached() {
                try{
                        $cachedfile = $this->folder->getFile($this->fileNameCSS);
@@ -90,6 +102,10 @@ class SCSSCacher {
         return false;
        }
 
+       /**
+        * Cache the file with AppData
+        * @return boolean
+        */
        private function cache() {
                $scss = new Compiler();
                $scss->setImportPaths($this->fileLoc);
@@ -108,6 +124,7 @@ class SCSSCacher {
                        $cachedfile = $this->folder->newFile($this->fileNameCSS);
                }
 
+               // Compile
                try {
                        $compiledScss = $scss->compile('@import "'.$this->fileNameSCSS.'";');
                } catch(ParserException $e) {
@@ -115,20 +132,32 @@ class SCSSCacher {
                        return false;
                }
 
-               if($cachedfile->putContent($this->rebaseUrls($compiledScss))) {
-                       $this->logger->debug($root.'/'.$file.' compiled and successfully cached', ['app' => 'SCSSPHP']);
+               try {
+                       $cachedfile->putContent($this->rebaseUrls($compiledScss));
+                       $this->logger->debug($this->rootCssLoc.'/'.$this->fileNameSCSS.' compiled and successfully cached', ['app' => 'SCSSPHP']);
                        return true;
+               } catch(NotFoundException $e) {
+                       return false;
                }
                return false;
        }
 
+       /**
+        * Add the correct uri prefix to make uri valid again
+        * @param string $css
+        * @return string
+        */
        private function rebaseUrls($css) {
                $re = '/url\([\'"](.*)[\'"]\)/x';
-               $subst = 'url(\'../'.$this->rootCssLoc.'/$1\')';
+               $subst = 'url(\'../../../'.$this->rootCssLoc.'/$1\')';
                return preg_replace($re, $subst, $css);
        }
 
+       /**
+        * Return the cached css file uri
+        * @return string
+        */
        public function getCachedSCSS() {
-               return $this->fileCache;
+               return "index.php/css/".$this->fileNameCSS;
        }
 }
diff --git a/lib/public/ICssManager.php b/lib/public/ICssManager.php
new file mode 100644 (file)
index 0000000..0af1472
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016, John Molakvoæ (skjnldsv@protonmail.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 OCP;
+
+/**
+ * This class provides scss functionality
+ * @since 11.0.0
+ */
+
+interface ICssManager {
+       
+       /**
+        * Get the css file and return ISimpleFile
+        *
+        * @param string $fileName css filename with extension
+        * @return ISimpleFile
+        */
+       public function getCss($fileName);
+}