<?php
+/**
+ * @copyright Copyright (C) 2010-2022, the Friendica project
+ *
+ * @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 <https://www.gnu.org/licenses/>.
+ *
+ */
namespace Friendica\App;
-use Friendica\Core\Config\Configuration;
+use Friendica\Core\Config\Capability\IManageConfigValues;
+use Friendica\Core\System;
use Friendica\Util\Network;
use Friendica\Util\Strings;
+use Friendica\Network\HTTPException;
/**
* A class which checks and contains the basic
/**
* The Friendica Config
*
- * @var Configuration
+ * @var IManageConfigValues
*/
private $config;
*
* @return string
*/
- public function getHostname()
+ public function getHostname(): string
{
return $this->hostname;
}
*
* @return string
*/
- public function getScheme()
+ public function getScheme(): string
{
return $this->scheme;
}
*
* @return int
*/
- public function getSSLPolicy()
+ public function getSSLPolicy(): int
{
return $this->sslPolicy;
}
*
* @return string
*/
- public function getUrlPath()
+ public function getUrlPath(): string
{
return $this->urlPath;
}
*
* @return string
*/
- public function get($ssl = false)
+ public function get(bool $ssl = false): string
{
if ($this->sslPolicy === self::SSL_POLICY_SELFSIGN && $ssl) {
return Network::switchScheme($this->url);
* @param string? $urlPath
*
* @return bool true, if successful
+ * @TODO Find proper types
*/
- public function save($hostname = null, $sslPolicy = null, $urlPath = null)
+ public function save($hostname = null, $sslPolicy = null, $urlPath = null): bool
{
$currHostname = $this->hostname;
$currSSLPolicy = $this->sslPolicy;
/**
* Save the current url as base URL
*
- * @param $url
+ * @param string $url
*
* @return bool true, if the save was successful
*/
- public function saveByURL($url)
+ public function saveByURL(string $url): bool
{
$parsed = @parse_url($url);
- if (empty($parsed)) {
+ if (empty($parsed) || empty($parsed['host'])) {
return false;
}
}
/**
- * @param Configuration $config The Friendica configuration
- * @param array $server The $_SERVER array
+ * @param IManageConfigValues $config The Friendica IConfiguration
+ * @param array $server The $_SERVER array
*/
- public function __construct(Configuration $config, array $server)
+ public function __construct(IManageConfigValues $config, array $server)
{
$this->config = $config;
$this->server = $server;
/* Relative script path to the web server root
* Not all of those $_SERVER properties can be present, so we do by inverse priority order
*/
- $relative_script_path = '';
- $relative_script_path = defaults($this->server, 'REDIRECT_URL', $relative_script_path);
- $relative_script_path = defaults($this->server, 'REDIRECT_URI', $relative_script_path);
- $relative_script_path = defaults($this->server, 'REDIRECT_SCRIPT_URL', $relative_script_path);
- $relative_script_path = defaults($this->server, 'SCRIPT_URL', $relative_script_path);
- $relative_script_path = defaults($this->server, 'REQUEST_URI', $relative_script_path);
+ $relative_script_path =
+ ($this->server['REDIRECT_URL'] ?? '') ?:
+ ($this->server['REDIRECT_URI'] ?? '') ?:
+ ($this->server['REDIRECT_SCRIPT_URL'] ?? '') ?:
+ ($this->server['SCRIPT_URL'] ?? '') ?:
+ $this->server['REQUEST_URI'] ?? '';
/* $relative_script_path gives /relative/path/to/friendica/module/parameter
* QUERY_STRING gives pagename=module/parameter
if (!empty($relative_script_path)) {
// Module
if (!empty($this->server['QUERY_STRING'])) {
- $this->urlPath = trim(rdirname($relative_script_path, substr_count(trim($this->server['QUERY_STRING'], '/'), '/') + 1), '/');
+ $this->urlPath = trim(dirname($relative_script_path, substr_count(trim($this->server['QUERY_STRING'], '/'), '/') + 1), '/');
} else {
// Root page
$this->urlPath = trim($relative_script_path, '/');
*
* @return string The cleaned url
*/
- public function remove(string $origURL)
+ public function remove(string $origURL): string
{
// Remove the hostname from the url if it is an internal link
$nurl = Strings::normaliseLink($origURL);
return $url;
}
}
+
+ /**
+ * Redirects to another module relative to the current Friendica base URL.
+ * If you want to redirect to a external URL, use System::externalRedirectTo()
+ *
+ * @param string $toUrl The destination URL (Default is empty, which is the default page of the Friendica node)
+ * @param bool $ssl if true, base URL will try to get called with https:// (works just for relative paths)
+ *
+ * @throws HTTPException\FoundException
+ * @throws HTTPException\MovedPermanentlyException
+ * @throws HTTPException\TemporaryRedirectException
+ *
+ * @throws HTTPException\InternalServerErrorException In Case the given URL is not relative to the Friendica node
+ */
+ public function redirect(string $toUrl = '', bool $ssl = false)
+ {
+ if (!empty(parse_url($toUrl, PHP_URL_SCHEME))) {
+ throw new HTTPException\InternalServerErrorException("'$toUrl is not a relative path, please use System::externalRedirectTo");
+ }
+
+ $redirectTo = $this->get($ssl) . '/' . ltrim($toUrl, '/');
+ System::externalRedirect($redirectTo);
+ }
+
+ /**
+ * Returns the base url as string
+ */
+ public function __toString(): string
+ {
+ return (string) $this->get();
+ }
}