summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>2016-11-09 13:39:08 +0100
committerRoeland Jago Douma <roeland@famdouma.nl>2017-01-06 09:42:13 +0100
commit1caaa7f4cd05e45a02ead069adf8625d7b192dcc (patch)
tree0bd4950f9f5fdc38c897498a374c631cc98f9b18
parent3a7d6846facec4e03966ab8e03f0fcbd946a8ef0 (diff)
downloadnextcloud-server-1caaa7f4cd05e45a02ead069adf8625d7b192dcc.tar.gz
nextcloud-server-1caaa7f4cd05e45a02ead069adf8625d7b192dcc.zip
Appdata integration 2
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
-rw-r--r--core/Controller/CssController.php83
-rw-r--r--core/routes.php1
-rw-r--r--lib/private/AppFramework/DependencyInjection/DIContainer.php5
-rw-r--r--lib/private/CssManager.php63
-rw-r--r--lib/private/Server.php15
-rwxr-xr-xlib/private/Template/CSSResourceLocator.php7
-rwxr-xr-xlib/private/Template/ResourceLocator.php1
-rwxr-xr-xlib/private/Template/SCSSCacher.php41
-rw-r--r--lib/public/ICssManager.php38
9 files changed, 248 insertions, 6 deletions
diff --git a/core/Controller/CssController.php b/core/Controller/CssController.php
new file mode 100644
index 00000000000..45a188adba6
--- /dev/null
+++ b/core/Controller/CssController.php
@@ -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();
+ }
+ }
+}
diff --git a/core/routes.php b/core/routes.php
index 2b8080a3b7b..dec979c8ce2 100644
--- a/core/routes.php
+++ b/core/routes.php
@@ -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'],
diff --git a/lib/private/AppFramework/DependencyInjection/DIContainer.php b/lib/private/AppFramework/DependencyInjection/DIContainer.php
index ac42960f54d..57e7749ca86 100644
--- a/lib/private/AppFramework/DependencyInjection/DIContainer.php
+++ b/lib/private/AppFramework/DependencyInjection/DIContainer.php
@@ -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
index 00000000000..016227b9c3f
--- /dev/null
+++ b/lib/private/CssManager.php
@@ -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();
+ }
+ }
+}
diff --git a/lib/private/Server.php b/lib/private/Server.php
index 5bc72e3614f..2dbf827844d 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -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
*
diff --git a/lib/private/Template/CSSResourceLocator.php b/lib/private/Template/CSSResourceLocator.php
index 2e1db9a6757..0d190959ea1 100755
--- a/lib/private/Template/CSSResourceLocator.php
+++ b/lib/private/Template/CSSResourceLocator.php
@@ -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);
diff --git a/lib/private/Template/ResourceLocator.php b/lib/private/Template/ResourceLocator.php
index 89a3a1b025b..21a4ce927e1 100755
--- a/lib/private/Template/ResourceLocator.php
+++ b/lib/private/Template/ResourceLocator.php
@@ -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
*/
diff --git a/lib/private/Template/SCSSCacher.php b/lib/private/Template/SCSSCacher.php
index 43160a9c169..def9ecd276e 100755
--- a/lib/private/Template/SCSSCacher.php
+++ b/lib/private/Template/SCSSCacher.php
@@ -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
index 00000000000..0af1472b5c4
--- /dev/null
+++ b/lib/public/ICssManager.php
@@ -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);
+}