diff options
Diffstat (limited to 'lib/private/URLGenerator.php')
-rw-r--r-- | lib/private/URLGenerator.php | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/lib/private/URLGenerator.php b/lib/private/URLGenerator.php new file mode 100644 index 00000000000..327c0c32dfe --- /dev/null +++ b/lib/private/URLGenerator.php @@ -0,0 +1,224 @@ +<?php +/** + * @author Bart Visscher <bartv@thisnet.nl> + * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Jörn Friedrich Dreyer <jfd@butonic.de> + * @author Lukas Reschke <lukas@owncloud.com> + * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <robin@mccorkell.me.uk> + * @author Thomas Müller <thomas.mueller@tmit.eu> + * @author Thomas Tanghus <thomas@tanghus.net> + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OC; +use OC_Defaults; +use OCP\ICacheFactory; +use OCP\IConfig; +use OCP\IURLGenerator; +use RuntimeException; + +/** + * Class to generate URLs + */ +class URLGenerator implements IURLGenerator { + /** @var IConfig */ + private $config; + /** @var ICacheFactory */ + private $cacheFactory; + + /** + * @param IConfig $config + * @param ICacheFactory $cacheFactory + */ + public function __construct(IConfig $config, + ICacheFactory $cacheFactory) { + $this->config = $config; + $this->cacheFactory = $cacheFactory; + } + + /** + * Creates an url using a defined route + * @param string $route + * @param array $parameters args with param=>value, will be appended to the returned url + * @return string the url + * + * Returns a url to the given route. + */ + public function linkToRoute($route, $parameters = array()) { + // TODO: mock router + $urlLinkTo = \OC::$server->getRouter()->generate($route, $parameters); + return $urlLinkTo; + } + + /** + * Creates an absolute url using a defined route + * @param string $routeName + * @param array $arguments args with param=>value, will be appended to the returned url + * @return string the url + * + * Returns an absolute url to the given route. + */ + public function linkToRouteAbsolute($routeName, $arguments = array()) { + return $this->getAbsoluteURL($this->linkToRoute($routeName, $arguments)); + } + + /** + * Creates an url + * @param string $app app + * @param string $file file + * @param array $args array with param=>value, will be appended to the returned url + * The value of $args will be urlencoded + * @return string the url + * + * Returns a url to the given app and file. + */ + public function linkTo( $app, $file, $args = array() ) { + $frontControllerActive = (getenv('front_controller_active') === 'true'); + + if( $app != '' ) { + $app_path = \OC_App::getAppPath($app); + // Check if the app is in the app folder + if ($app_path && file_exists($app_path . '/' . $file)) { + if (substr($file, -3) == 'php') { + + $urlLinkTo = \OC::$WEBROOT . '/index.php/apps/' . $app; + if ($frontControllerActive) { + $urlLinkTo = \OC::$WEBROOT . '/apps/' . $app; + } + $urlLinkTo .= ($file != 'index.php') ? '/' . $file : ''; + } else { + $urlLinkTo = \OC_App::getAppWebPath($app) . '/' . $file; + } + } else { + $urlLinkTo = \OC::$WEBROOT . '/' . $app . '/' . $file; + } + } else { + if (file_exists(\OC::$SERVERROOT . '/core/' . $file)) { + $urlLinkTo = \OC::$WEBROOT . '/core/' . $file; + } else { + if ($frontControllerActive && $file === 'index.php') { + $urlLinkTo = \OC::$WEBROOT . '/'; + } else { + $urlLinkTo = \OC::$WEBROOT . '/' . $file; + } + } + } + + if ($args && $query = http_build_query($args, '', '&')) { + $urlLinkTo .= '?' . $query; + } + + return $urlLinkTo; + } + + /** + * Creates path to an image + * @param string $app app + * @param string $image image name + * @throws \RuntimeException If the image does not exist + * @return string the url + * + * Returns the path to the image. + */ + public function imagePath($app, $image) { + $cache = $this->cacheFactory->create('imagePath'); + $cacheKey = $app.'-'.$image; + if($key = $cache->get($cacheKey)) { + return $key; + } + + // Read the selected theme from the config file + $theme = \OC_Util::getTheme(); + + //if a theme has a png but not an svg always use the png + $basename = substr(basename($image),0,-4); + + $appPath = \OC_App::getAppPath($app); + + // Check if the app is in the app folder + $path = ''; + if (file_exists(\OC::$SERVERROOT . "/themes/$theme/apps/$app/img/$image")) { + $path = \OC::$WEBROOT . "/themes/$theme/apps/$app/img/$image"; + } elseif (!file_exists(\OC::$SERVERROOT . "/themes/$theme/apps/$app/img/$basename.svg") + && file_exists(\OC::$SERVERROOT . "/themes/$theme/apps/$app/img/$basename.png")) { + $path = \OC::$WEBROOT . "/themes/$theme/apps/$app/img/$basename.png"; + } elseif ($appPath && file_exists($appPath . "/img/$image")) { + $path = \OC_App::getAppWebPath($app) . "/img/$image"; + } elseif ($appPath && !file_exists($appPath . "/img/$basename.svg") + && file_exists($appPath . "/img/$basename.png")) { + $path = \OC_App::getAppWebPath($app) . "/img/$basename.png"; + } elseif (!empty($app) and file_exists(\OC::$SERVERROOT . "/themes/$theme/$app/img/$image")) { + $path = \OC::$WEBROOT . "/themes/$theme/$app/img/$image"; + } elseif (!empty($app) and (!file_exists(\OC::$SERVERROOT . "/themes/$theme/$app/img/$basename.svg") + && file_exists(\OC::$SERVERROOT . "/themes/$theme/$app/img/$basename.png"))) { + $path = \OC::$WEBROOT . "/themes/$theme/$app/img/$basename.png"; + } elseif (!empty($app) and file_exists(\OC::$SERVERROOT . "/$app/img/$image")) { + $path = \OC::$WEBROOT . "/$app/img/$image"; + } elseif (!empty($app) and (!file_exists(\OC::$SERVERROOT . "/$app/img/$basename.svg") + && file_exists(\OC::$SERVERROOT . "/$app/img/$basename.png"))) { + $path = \OC::$WEBROOT . "/$app/img/$basename.png"; + } elseif (file_exists(\OC::$SERVERROOT . "/themes/$theme/core/img/$image")) { + $path = \OC::$WEBROOT . "/themes/$theme/core/img/$image"; + } elseif (!file_exists(\OC::$SERVERROOT . "/themes/$theme/core/img/$basename.svg") + && file_exists(\OC::$SERVERROOT . "/themes/$theme/core/img/$basename.png")) { + $path = \OC::$WEBROOT . "/themes/$theme/core/img/$basename.png"; + } elseif (file_exists(\OC::$SERVERROOT . "/core/img/$image")) { + $path = \OC::$WEBROOT . "/core/img/$image"; + } + + if($path !== '') { + $cache->set($cacheKey, $path); + return $path; + } else { + throw new RuntimeException('image not found: image:' . $image . ' webroot:' . \OC::$WEBROOT . ' serverroot:' . \OC::$SERVERROOT); + } + } + + + /** + * Makes an URL absolute + * @param string $url the url in the ownCloud host + * @return string the absolute version of the url + */ + public function getAbsoluteURL($url) { + $separator = $url[0] === '/' ? '' : '/'; + + if (\OC::$CLI && !defined('PHPUNIT_RUN')) { + return rtrim($this->config->getSystemValue('overwrite.cli.url'), '/') . '/' . ltrim($url, '/'); + } + + // The ownCloud web root can already be prepended. + $webRoot = substr($url, 0, strlen(\OC::$WEBROOT)) === \OC::$WEBROOT + ? '' + : \OC::$WEBROOT; + + $request = \OC::$server->getRequest(); + return $request->getServerProtocol() . '://' . $request->getServerHost() . $webRoot . $separator . $url; + } + + /** + * @param string $key + * @return string url to the online documentation + */ + public function linkToDocs($key) { + $theme = new OC_Defaults(); + return $theme->buildDocLinkToKey($key); + } +} |