1
0
Fork 0

Adding tests

This commit is contained in:
Philipp Holzer 2019-04-08 23:12:34 +02:00
commit edd4f06ad0
No known key found for this signature in database
GPG key ID: 517BE60E2CE5C8A5
8 changed files with 520 additions and 43 deletions

View file

@ -196,7 +196,6 @@ class App
* @see initHead()
*
* @param string $path
* @throws InternalServerErrorException
*/
public function registerStylesheet($path)
{
@ -215,7 +214,6 @@ class App
* @see initFooter()
*
* @param string $path
* @throws InternalServerErrorException
*/
public function registerFooterScript($path)
{
@ -835,7 +833,7 @@ class App
{
$sender_email = $this->config->get('config', 'sender_email');
if (empty($sender_email)) {
$hostname = $this->getHostName();
$hostname = $this->baseURL->getHostname();
if (strpos($hostname, ':')) {
$hostname = substr($hostname, 0, strpos($hostname, ':'));
}
@ -980,7 +978,7 @@ class App
// and www.example.com vs example.com.
// We will only change the url to an ip address if there is no existing setting
if (empty($url) || (!Util\Strings::compareLink($url, $this->getBaseURL())) && (!preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/", $this->getHostName()))) {
if (empty($url) || (!Util\Strings::compareLink($url, $this->getBaseURL())) && (!preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/", $this->baseURL->getHostname()))) {
$this->config->set('system', 'url', $this->getBaseURL());
}
}
@ -1014,10 +1012,7 @@ class App
if (!$this->getMode()->isInstall()) {
// Force SSL redirection
if ($this->config->get('system', 'force_ssl') && ($this->getScheme() == "http")
&& intval($this->config->get('system', 'ssl_policy')) == BaseURL::SSL_POLICY_FULL
&& strpos($this->getBaseURL(), 'https://') === 0
&& $_SERVER['REQUEST_METHOD'] == 'GET') {
if ($this->baseURL->checkRedirectHttps()) {
header('HTTP/1.1 302 Moved Temporarily');
header('Location: ' . $this->getBaseURL() . '/' . $this->query_string);
exit();
@ -1353,7 +1348,7 @@ class App
header("X-Friendica-Version: " . FRIENDICA_VERSION);
header("Content-type: text/html; charset=utf-8");
if ($this->config->get('system', 'hsts') && ($this->config->get('system', 'ssl_policy') == BaseUrl::SSL_POLICY_FULL)) {
if ($this->config->get('system', 'hsts') && ($this->baseURL->getSSLPolicy() == BaseUrl::SSL_POLICY_FULL)) {
header("Strict-Transport-Security: max-age=31536000");
}

View file

@ -17,7 +17,7 @@ class BasePath
*
* @throws \Exception if directory isn't usable
*/
public static function create($basePath, $server = [])
public static function create($basePath, array $server = [])
{
if (!$basePath && !empty($server['DOCUMENT_ROOT'])) {
$basePath = $server['DOCUMENT_ROOT'];

View file

@ -6,7 +6,7 @@ use Friendica\Core\Config\Configuration;
/**
* A class which checks and contains the basic
* environment for the BaseURL (url, urlpath, ssl_policy, hostname)
* environment for the BaseURL (url, urlpath, ssl_policy, hostname, scheme)
*/
class BaseURL
{
@ -25,6 +25,11 @@ class BaseURL
*/
const SSL_POLICY_SELFSIGN = 2;
/**
* Define the Default SSL scheme
*/
const DEFAULT_SSL_SCHEME = self::SSL_POLICY_SELFSIGN;
/**
* The Friendica Config
* @var Configuration
@ -114,7 +119,11 @@ class BaseURL
*/
public function get($ssl = false)
{
return (!$ssl ? $this->url : $this->returnBaseURL($ssl));
if ($this->sslPolicy === self::SSL_POLICY_SELFSIGN && $ssl) {
return Network::switchScheme($this->url);
}
return $this->url;
}
/**
@ -184,7 +193,29 @@ class BaseURL
$urlPath = trim($parsed['path'], '\\/');
}
return $this->save($hostname, null, $urlPath);
$sslPolicy = null;
if (!empty($parsed['scheme'])) {
if ($parsed['scheme'] == 'https') {
$sslPolicy = BaseURL::SSL_POLICY_FULL;
}
}
return $this->save($hostname, $sslPolicy, $urlPath);
}
/**
* Checks, if a redirect to the HTTPS site would be necessary
*
* @return bool
*/
public function checkRedirectHttps()
{
return $this->config->get('system', 'force_ssl')
&& ($this->getScheme() == "http")
&& intval($this->getSSLPolicy()) == BaseURL::SSL_POLICY_FULL
&& strpos($this->get(), 'https://') === 0
&& !empty($this->server['REQUEST_METHOD'])
&& $this->server['REQUEST_METHOD'] === 'GET';
}
/**
@ -196,8 +227,8 @@ class BaseURL
$this->config = $config;
$this->server = $server;
$this->checkConfig();
$this->determineSchema();
$this->checkConfig();
}
/**
@ -205,10 +236,10 @@ class BaseURL
*/
public function checkConfig()
{
$this->hostname = $this->config->get('config', 'hostname', null);
$this->urlPath = $this->config->get('system', 'urlpath', null);
$this->sslPolicy = $this->config->get('system', 'ssl_policy', null);
$this->url = $this->config->get('system', 'url', null);
$this->hostname = $this->config->get('config', 'hostname');
$this->urlPath = $this->config->get('system', 'urlpath');
$this->sslPolicy = $this->config->get('system', 'ssl_policy');
$this->url = $this->config->get('system', 'url');
if (empty($this->hostname)) {
$this->determineHostname();
@ -224,7 +255,11 @@ class BaseURL
}
if (!isset($this->sslPolicy)) {
$this->sslPolicy = self::SSL_POLICY_NONE;
if ($this->scheme == 'https') {
$this->sslPolicy = self::SSL_POLICY_FULL;
} else {
$this->sslPolicy = self::DEFAULT_SSL_SCHEME;
}
$this->config->set('system', 'ssl_policy', $this->sslPolicy);
}
@ -325,20 +360,4 @@ class BaseURL
$this->scheme = 'https';
}
}
/**
* Returns the URL based on the current used ssl setting
*
* @param bool $ssl true, if ssl should be used
*
* @return string
*/
private function returnBaseURL($ssl)
{
if ($this->sslPolicy == self::SSL_POLICY_SELFSIGN && $ssl) {
return Network::switchScheme($this->url);
}
return $this->url;
}
}

View file

@ -838,7 +838,7 @@ class Network
/**
* @brief Switch the scheme of an url between http and https
* Switch the scheme of an url between http and https
*
* @param string $url URL
*
@ -846,15 +846,17 @@ class Network
*/
public static function switchScheme($url)
{
$parts = parse_url($url, PHP_URL_SCHEME);
if (!isset($parts['scheme'])) {
$scheme = parse_url($url, PHP_URL_SCHEME);
if (empty($scheme)) {
return $url;
}
if ($parts['scheme'] == 'http') {
if ($scheme === 'http') {
$url = str_replace('http://', 'https://', $url);
} elseif ($parts['scheme'] == 'https') {
} elseif ($scheme === 'https') {
$url = str_replace('https://', 'http://', $url);
}
return $url;
}
}