diff --git a/src/App.php b/src/App.php index 505f502e5f..749cbe9cc9 100644 --- a/src/App.php +++ b/src/App.php @@ -9,6 +9,7 @@ use DOMDocument; use DOMXPath; use Exception; use Friendica\App\Arguments; +use Friendica\App\BaseURL; use Friendica\Core\Config\Cache\ConfigCache; use Friendica\Core\Config\Configuration; use Friendica\Core\Config\PConfiguration; @@ -16,12 +17,10 @@ use Friendica\Core\L10n\L10n; use Friendica\Core\System; use Friendica\Core\Theme; use Friendica\Database\Database; -use Friendica\Database\DBA; use Friendica\Model\Profile; use Friendica\Module\Login; use Friendica\Module\Special\HTTPException as ModuleHTTPException; use Friendica\Network\HTTPException; -use Friendica\Util\BaseURL; use Friendica\Util\ConfigFileLoader; use Friendica\Util\HTTPSignature; use Friendica\Util\Profiler; @@ -44,8 +43,8 @@ use Psr\Log\LoggerInterface; class App { /** @deprecated 2019.09 - use App\Arguments->getQueryString() */ - public $query_string = ''; - public $page = []; + public $query_string; + public $page; public $profile; public $profile_uid; public $user; @@ -66,20 +65,20 @@ class App public $timezone; public $interactive = true; public $identities; - public $is_mobile = false; - public $is_tablet = false; - public $theme_info = []; + public $is_mobile; + public $is_tablet; + public $theme_info = []; public $category; // Allow themes to control internal parameters // by changing App values in theme.php - public $sourcename = ''; - public $videowidth = 425; - public $videoheight = 350; - public $force_max_items = 0; + public $sourcename = ''; + public $videowidth = 425; + public $videoheight = 350; + public $force_max_items = 0; public $theme_events_in_profile = true; - public $stylesheets = []; + public $stylesheets = []; public $footerScripts = []; /** @@ -218,9 +217,10 @@ class App * Inclusion is done in App->initHead(). * The path can be absolute or relative to the Friendica installation base folder. * + * @param string $path + * * @see initHead() * - * @param string $path */ public function registerStylesheet($path) { @@ -236,9 +236,10 @@ class App * Inclusion is done in App->initFooter(). * The path can be absolute or relative to the Friendica installation base folder. * + * @param string $path + * * @see initFooter() * - * @param string $path */ public function registerFooterScript($path) { @@ -250,35 +251,62 @@ class App public $queue; /** - * @brief App constructor. - * - * @param Database $database The Friendica Database - * @param Configuration $config The Configuration - * @param App\Mode $mode The mode of this Friendica app - * @param App\Router $router The router of this Friendica app - * @param BaseURL $baseURL The full base URL of this Friendica app - * @param LoggerInterface $logger The current app logger - * @param Profiler $profiler The profiler of this application - * @param L10n $l10n The translator instance - * - * @throws Exception if the Basepath is not usable + * @param Database $database The Friendica Database + * @param Configuration $config The Configuration + * @param App\Mode $mode The mode of this Friendica app + * @param App\Router $router The router of this Friendica app + * @param BaseURL $baseURL The full base URL of this Friendica app + * @param LoggerInterface $logger The current app logger + * @param Profiler $profiler The profiler of this application + * @param L10n $l10n The translator instance + * @param App\Arguments $args The Friendica Arguments of the call + * @param MobileDetect $mobileDetect A mobile detection class */ - public function __construct(Database $database, Configuration $config, App\Mode $mode, App\Router $router, BaseURL $baseURL, LoggerInterface $logger, Profiler $profiler, L10n $l10n, Arguments $args) + public function __construct(Database $database, Configuration $config, App\Mode $mode, App\Router $router, BaseURL $baseURL, LoggerInterface $logger, Profiler $profiler, L10n $l10n, Arguments $args, App\Module $module, MobileDetect $mobileDetect) { - $this->database = $database; - $this->config = $config; - $this->mode = $mode; - $this->router = $router; - $this->baseURL = $baseURL; - $this->profiler = $profiler; - $this->logger = $logger; - $this->l10n = $l10n; - $this->args = $args; + $this->database = $database; + $this->config = $config; + $this->mode = $mode; + $this->router = $router; + $this->baseURL = $baseURL; + $this->profiler = $profiler; + $this->logger = $logger; + $this->l10n = $l10n; + $this->args = $args; + $this->mobileDetect = $mobileDetect; - $this->profiler->reset(); + $this->cmd = $args->getCommand(); + $this->argv = $args->getArgv(); + $this->argc = $args->getArgc(); + $this->query_string = $args->getQueryString(); + $this->module = $module->getName(); - $this->reload(); + $this->is_mobile = $mobileDetect->isMobile(); + $this->is_tablet = $mobileDetect->isTablet(); + $this->isAjax = strtolower(defaults($_SERVER, 'HTTP_X_REQUESTED_WITH', '')) == 'xmlhttprequest'; + + $this->page = [ + 'aside' => '', + 'bottom' => '', + 'content' => '', + 'footer' => '', + 'htmlhead' => '', + 'nav' => '', + 'page_title' => '', + 'right_aside' => '', + 'template' => '', + 'title' => '' + ]; + + $this->load(); + } + + /** + * Load the whole app instance + */ + public function load() + { set_time_limit(0); // This has to be quite large to deal with embedded private photos @@ -290,31 +318,9 @@ class App . $this->getBasePath() . DIRECTORY_SEPARATOR . 'library' . PATH_SEPARATOR . $this->getBasePath()); - $this->cmd = $args->getCommand(); - $this->argv = $args->getArgv(); - $this->argc = $args->getArgc(); - $this->query_string = $args->getQueryString(); + $this->profiler->reset(); - // Detect mobile devices - $mobile_detect = new MobileDetect(); - - $this->mobileDetect = $mobile_detect; - - $this->is_mobile = $mobile_detect->isMobile(); - $this->is_tablet = $mobile_detect->isTablet(); - - $this->isAjax = strtolower(defaults($_SERVER, 'HTTP_X_REQUESTED_WITH', '')) == 'xmlhttprequest'; - - // Register template engines - Core\Renderer::registerTemplateEngine('Friendica\Render\FriendicaSmartyEngine'); - } - - /** - * Reloads the whole app instance - */ - public function reload() - { - if ($this->getMode()->has(App\Mode::DBAVAILABLE)) { + if ($this->mode->has(App\Mode::DBAVAILABLE)) { $this->profiler->update($this->config); Core\Hook::loadHooks(); @@ -323,6 +329,8 @@ class App } $this->loadDefaultTimezone(); + // Register template engines + Core\Renderer::registerTemplateEngine('Friendica\Render\FriendicaSmartyEngine'); } /** @@ -348,6 +356,7 @@ class App /** * Returns the scheme of the current call + * * @return string * * @deprecated 2019.06 - use BaseURL->getScheme() instead @@ -372,7 +381,7 @@ class App } /** - * @brief Initializes the baseurl components + * @brief Initializes the baseurl components * * Clears the baseurl cache to prevent inconsistencies * @@ -466,15 +475,15 @@ class App * being first */ $this->page['htmlhead'] = Core\Renderer::replaceMacros($tpl, [ - '$local_user' => local_user(), - '$generator' => 'Friendica' . ' ' . FRIENDICA_VERSION, - '$delitem' => $this->l10n->t('Delete this item?'), - '$update_interval' => $interval, - '$shortcut_icon' => $shortcut_icon, - '$touch_icon' => $touch_icon, - '$block_public' => intval($this->config->get('system', 'block_public')), - '$stylesheets' => $this->stylesheets, - ]) . $this->page['htmlhead']; + '$local_user' => local_user(), + '$generator' => 'Friendica' . ' ' . FRIENDICA_VERSION, + '$delitem' => $this->l10n->t('Delete this item?'), + '$update_interval' => $interval, + '$shortcut_icon' => $shortcut_icon, + '$touch_icon' => $touch_icon, + '$block_public' => intval($this->config->get('system', 'block_public')), + '$stylesheets' => $this->stylesheets, + ]) . $this->page['htmlhead']; } /** @@ -516,33 +525,25 @@ class App Core\Hook::callAll('footer', $this->page['footer']); - $tpl = Core\Renderer::getMarkupTemplate('footer.tpl'); + $tpl = Core\Renderer::getMarkupTemplate('footer.tpl'); $this->page['footer'] = Core\Renderer::replaceMacros($tpl, [ - '$footerScripts' => $this->footerScripts, - ]) . $this->page['footer']; + '$footerScripts' => $this->footerScripts, + ]) . $this->page['footer']; } /** - * @brief Removes the base url from an url. This avoids some mixed content problems. + * @brief Removes the base url from an url. This avoids some mixed content problems. * * @param string $origURL * * @return string The cleaned url - * @throws HTTPException\InternalServerErrorException + * + * @deprecated 2019.09 - Use BaseURL->remove() instead + * @see BaseURL::remove() */ public function removeBaseURL($origURL) { - // Remove the hostname from the url if it is an internal link - $nurl = Util\Strings::normaliseLink($origURL); - $base = Util\Strings::normaliseLink($this->getBaseURL()); - $url = str_replace($base . '/', '', $nurl); - - // if it is an external link return the orignal value - if ($url == Util\Strings::normaliseLink($origURL)) { - return $origURL; - } else { - return $url; - } + return $this->baseURL->remove($origURL); } /** @@ -567,7 +568,7 @@ class App * @return bool Is it a known backend? * * @deprecated 2019.09 - use App\Mode->isBackend() instead - * @see App\Mode::isBackend() + * @see App\Mode::isBackend() * Use BaseObject::getClass(App\Mode::class) to get the global instance of Mode */ public function isBackend() @@ -604,10 +605,10 @@ class App $processlist = DBA::processlist(); if ($processlist['list'] != '') { - Core\Logger::log('Processcheck: Processes: ' . $processlist['amount'] . ' - Processlist: ' . $processlist['list'], Core\Logger::DEBUG); + $this->logger->debug('Processcheck: Processes: ' . $processlist['amount'] . ' - Processlist: ' . $processlist['list']); if ($processlist['amount'] > $max_processes) { - Core\Logger::log('Processcheck: Maximum number of processes for ' . $process . ' tasks (' . $max_processes . ') reached.', Core\Logger::DEBUG); + $this->logger->debug('Processcheck: Maximum number of processes for ' . $process . ' tasks (' . $max_processes . ') reached.'); return true; } } @@ -641,8 +642,8 @@ class App continue; } list($key, $val) = $data; - $meminfo[$key] = (int) trim(str_replace('kB', '', $val)); - $meminfo[$key] = (int) ($meminfo[$key] / 1024); + $meminfo[$key] = (int)trim(str_replace('kB', '', $val)); + $meminfo[$key] = (int)($meminfo[$key] / 1024); } if (!isset($meminfo['MemFree'])) { @@ -654,7 +655,7 @@ class App $reached = ($free < $min_memory); if ($reached) { - Core\Logger::log('Minimal memory reached: ' . $free . '/' . $meminfo['MemTotal'] . ' - limit ' . $min_memory, Core\Logger::DEBUG); + $this->logger->debug('Minimal memory reached.', ['free' => $free, 'memtotal' => $meminfo['MemTotal'], 'limit' => $min_memory]); } return $reached; @@ -668,14 +669,14 @@ class App */ public function isMaxLoadReached() { - if ($this->isBackend()) { - $process = 'backend'; + if ($this->mode->isBackend()) { + $process = 'backend'; $maxsysload = intval($this->config->get('system', 'maxloadavg')); if ($maxsysload < 1) { $maxsysload = 50; } } else { - $process = 'frontend'; + $process = 'frontend'; $maxsysload = intval($this->config->get('system', 'maxloadavg_frontend')); if ($maxsysload < 1) { $maxsysload = 50; @@ -685,7 +686,7 @@ class App $load = Core\System::currentLoad(); if ($load) { if (intval($load) > $maxsysload) { - Core\Logger::log('system: load ' . $load . ' for ' . $process . ' tasks (' . $maxsysload . ') too high.'); + $this->logger->info('system load for process too high.', ['load' => $load, 'process' => $process, 'maxsysload' => $maxsysload]); return true; } } @@ -697,6 +698,7 @@ class App * * @param string $command The command to execute * @param array $args Arguments to pass to the command ( [ 'key' => value, 'key2' => value2, ... ] + * * @throws HTTPException\InternalServerErrorException */ public function proc_run($command, $args) @@ -728,7 +730,7 @@ class App $resource = proc_open($cmdline . ' &', [], $foo, $this->getBasePath()); } if (!is_resource($resource)) { - Core\Logger::log('We got no resource for command ' . $cmdline, Core\Logger::DEBUG); + $this->logger->debug('We got no resource for command.', ['cmd' => $cmdline]); return; } proc_close($resource); @@ -763,7 +765,7 @@ class App */ public function getCurrentTheme() { - if ($this->getMode()->isInstall()) { + if ($this->mode->isInstall()) { return ''; } @@ -799,8 +801,8 @@ class App if ($this->profile_uid && ($this->profile_uid != local_user())) { // Allow folks to override user themes and always use their own on their own site. // This works only if the user is on the same server - $user = DBA::selectFirst('user', ['theme'], ['uid' => $this->profile_uid]); - if (DBA::isResult($user) && !Core\PConfig::get(local_user(), 'system', 'always_my_theme')) { + $user = $this->database->selectFirst('user', ['theme'], ['uid' => $this->profile_uid]); + if ($this->database->isResult($user) && !Core\PConfig::get(local_user(), 'system', 'always_my_theme')) { $page_theme = $user['theme']; } } @@ -810,7 +812,7 @@ class App // Specific mobile theme override if (($this->is_mobile || $this->is_tablet) && Core\Session::get('show-mobile', true)) { $system_mobile_theme = $this->config->get('system', 'mobile-theme'); - $user_mobile_theme = Core\Session::get('mobile-theme', $system_mobile_theme); + $user_mobile_theme = Core\Session::get('mobile-theme', $system_mobile_theme); // --- means same mobile theme as desktop if (!empty($user_mobile_theme) && $user_mobile_theme !== '---') { @@ -826,9 +828,9 @@ class App $theme_name = Strings::sanitizeFilePathItem($theme_name); if ($theme_name - && in_array($theme_name, Theme::getAllowedList()) - && (file_exists('view/theme/' . $theme_name . '/style.css') - || file_exists('view/theme/' . $theme_name . '/style.php')) + && in_array($theme_name, Theme::getAllowedList()) + && (file_exists('view/theme/' . $theme_name . '/style.css') + || file_exists('view/theme/' . $theme_name . '/style.php')) ) { $this->currentTheme = $theme_name; } @@ -860,7 +862,7 @@ class App /** * @deprecated use Arguments->get() instead * - * @see App\Arguments + * @see App\Arguments */ public function getArgumentValue($position, $default = '') { @@ -902,7 +904,7 @@ class App try { // Missing DB connection: ERROR - if ($this->getMode()->has(App\Mode::LOCALCONFIGPRESENT) && !$this->getMode()->has(App\Mode::DBAVAILABLE)) { + if ($this->mode->has(App\Mode::LOCALCONFIGPRESENT) && !$this->mode->has(App\Mode::DBAVAILABLE)) { throw new HTTPException\InternalServerErrorException('Apologies but the website is unavailable at the moment.'); } @@ -914,7 +916,7 @@ class App throw new HTTPException\ServiceUnavailableException('The node is currently overloaded. Please try again later.'); } - if (!$this->getMode()->isInstall()) { + if (!$this->mode->isInstall()) { // Force SSL redirection if ($this->baseURL->checkRedirectHttps()) { System::externalRedirect($this->baseURL->get() . '/' . $this->args->getQueryString()); @@ -925,7 +927,7 @@ class App } // Exclude the backend processes from the session management - if (!$this->isBackend()) { + if (!$this->mode->isBackend()) { $stamp1 = microtime(true); session_start(); $this->profiler->saveTimestamp($stamp1, 'parser', Core\System::callstack()); @@ -936,7 +938,7 @@ class App Core\Worker::executeIfIdle(); } - if ($this->getMode()->isNormal()) { + if ($this->mode->isNormal()) { $requester = HTTPSignature::getSigner('', $_SERVER); if (!empty($requester)) { Profile::addVisitorCookieForHandle($requester); @@ -944,12 +946,12 @@ class App } // ZRL - if (!empty($_GET['zrl']) && $this->getMode()->isNormal()) { + if (!empty($_GET['zrl']) && $this->mode->isNormal()) { if (!local_user()) { // Only continue when the given profile link seems valid // Valid profile links contain a path with "/profile/" and no query parameters if ((parse_url($_GET['zrl'], PHP_URL_QUERY) == "") && - strstr(parse_url($_GET['zrl'], PHP_URL_PATH), "/profile/")) { + strstr(parse_url($_GET['zrl'], PHP_URL_PATH), "/profile/")) { if (Core\Session::get('visitor_home') != $_GET["zrl"]) { Core\Session::set('my_url', $_GET['zrl']); Core\Session::set('authenticated', 0); @@ -959,13 +961,13 @@ class App } else { // Someone came with an invalid parameter, maybe as a DDoS attempt // We simply stop processing here - Core\Logger::log("Invalid ZRL parameter " . $_GET['zrl'], Core\Logger::DEBUG); + $this->logger->debug('Invalid ZRL parameter.', ['zrl' => $_GET['zrl']]); throw new HTTPException\ForbiddenException(); } } } - if (!empty($_GET['owt']) && $this->getMode()->isNormal()) { + if (!empty($_GET['owt']) && $this->mode->isNormal()) { $token = $_GET['owt']; Model\Profile::openWebAuthInit($token); } @@ -988,30 +990,17 @@ class App // in install mode, any url loads install module // but we need "view" module for stylesheet - if ($this->getMode()->isInstall() && $moduleName !== 'install') { + if ($this->mode->isInstall() && $moduleName !== 'install') { $this->internalRedirect('install'); - } elseif (!$this->getMode()->isInstall() && !$this->getMode()->has(App\Mode::MAINTENANCEDISABLED) && $moduleName !== 'maintenance') { + } elseif (!$this->mode->isInstall() && !$this->mode->has(App\Mode::MAINTENANCEDISABLED) && $moduleName !== 'maintenance') { $this->internalRedirect('maintenance'); } else { $this->checkURL(); - Core\Update::check($this->getBasePath(), false, $this->getMode()); + Core\Update::check($this->getBasePath(), false, $this->mode); Core\Addon::loadAddons(); Core\Hook::loadHooks(); } - $this->page = [ - 'aside' => '', - 'bottom' => '', - 'content' => '', - 'footer' => '', - 'htmlhead' => '', - 'nav' => '', - 'page_title' => '', - 'right_aside' => '', - 'template' => '', - 'title' => '' - ]; - // Compatibility with the Android Diaspora client if ($moduleName == 'stream') { $this->internalRedirect('network?order=post'); @@ -1055,7 +1044,7 @@ class App // Let the module run it's internal process (init, get, post, ...) $module->run($this->l10n, $this, $this->logger, $this->getCurrentTheme(), $_SERVER, $_POST); - } catch(HTTPException $e) { + } catch (HTTPException $e) { ModuleHTTPException::rawContent($e); } @@ -1067,15 +1056,15 @@ class App $arr = ['content' => $content]; Core\Hook::callAll($moduleClass . '_mod_content', $arr); $content = $arr['content']; - $arr = ['content' => call_user_func([$moduleClass, 'content'])]; + $arr = ['content' => call_user_func([$moduleClass, 'content'])]; Core\Hook::callAll($moduleClass . '_mod_aftercontent', $arr); $content .= $arr['content']; - } catch(HTTPException $e) { + } catch (HTTPException $e) { $content = ModuleHTTPException::content($e); } // initialise content region - if ($this->getMode()->isNormal()) { + if ($this->mode->isNormal()) { Core\Hook::callAll('page_content_top', $this->page['content']); } @@ -1102,7 +1091,7 @@ class App // Add the navigation (menu) template if ($moduleName != 'install' && $moduleName != 'maintenance') { $this->page['htmlhead'] .= Core\Renderer::replaceMacros(Core\Renderer::getMarkupTemplate('nav_head.tpl'), []); - $this->page['nav'] = Content\Nav::build($this); + $this->page['nav'] = Content\Nav::build($this); } // Build the page - now that we have all the components @@ -1143,7 +1132,7 @@ class App header("X-Friendica-Version: " . FRIENDICA_VERSION); header("Content-type: text/html; charset=utf-8"); - if ($this->config->get('system', 'hsts') && ($this->baseURL->getSSLPolicy() == BaseUrl::SSL_POLICY_FULL)) { + if ($this->config->get('system', 'hsts') && ($this->baseURL->getSSLPolicy() == BaseURL::SSL_POLICY_FULL)) { header("Strict-Transport-Security: max-age=31536000"); } @@ -1184,7 +1173,7 @@ class App * 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) + * @param bool $ssl if true, base URL will try to get called with https:// (works just for relative paths) * * @throws HTTPException\InternalServerErrorException In Case the given URL is not relative to the Friendica node */ @@ -1194,7 +1183,7 @@ class App throw new HTTPException\InternalServerErrorException("'$toUrl is not a relative path, please use System::externalRedirectTo"); } - $redirectTo = $this->getBaseURL($ssl) . '/' . ltrim($toUrl, '/'); + $redirectTo = $this->baseURL->get($ssl) . '/' . ltrim($toUrl, '/'); Core\System::externalRedirect($redirectTo); } @@ -1203,6 +1192,7 @@ class App * Should only be used if it isn't clear if the URL is either internal or external * * @param string $toUrl The target URL + * * @throws HTTPException\InternalServerErrorException */ public function redirect($toUrl) diff --git a/src/Util/BaseURL.php b/src/App/BaseURL.php similarity index 82% rename from src/Util/BaseURL.php rename to src/App/BaseURL.php index be34de30ec..ad5fd0d4ed 100644 --- a/src/Util/BaseURL.php +++ b/src/App/BaseURL.php @@ -1,8 +1,10 @@ hostname) { if ($this->config->set('config', 'hostname', $hostname)) { - $this->hostname = $hostname; + $this->hostname = $hostname; } else { return false; } @@ -153,7 +166,7 @@ class BaseURL if ($this->config->set('system', 'ssl_policy', $sslPolicy)) { $this->sslPolicy = $sslPolicy; } else { - $this->hostname = $currHostname; + $this->hostname = $currHostname; $this->config->set('config', 'hostname', $this->hostname); return false; } @@ -229,12 +242,12 @@ class BaseURL */ 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'; + 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'; } /** @@ -359,7 +372,7 @@ class BaseURL $scheme = 'https'; } - $this->url = $scheme . '://' . $this->hostname . (!empty($this->urlPath) ? '/' . $this->urlPath : '' ); + $this->url = $scheme . '://' . $this->hostname . (!empty($this->urlPath) ? '/' . $this->urlPath : ''); } /** @@ -370,13 +383,35 @@ class BaseURL $this->scheme = 'http'; if (!empty($this->server['HTTPS']) || - !empty($this->server['HTTP_FORWARDED']) && preg_match('/proto=https/', $this->server['HTTP_FORWARDED']) || - !empty($this->server['HTTP_X_FORWARDED_PROTO']) && $this->server['HTTP_X_FORWARDED_PROTO'] == 'https' || - !empty($this->server['HTTP_X_FORWARDED_SSL']) && $this->server['HTTP_X_FORWARDED_SSL'] == 'on' || - !empty($this->server['FRONT_END_HTTPS']) && $this->server['FRONT_END_HTTPS'] == 'on' || - !empty($this->server['SERVER_PORT']) && (intval($this->server['SERVER_PORT']) == 443) // XXX: reasonable assumption, but isn't this hardcoding too much? + !empty($this->server['HTTP_FORWARDED']) && preg_match('/proto=https/', $this->server['HTTP_FORWARDED']) || + !empty($this->server['HTTP_X_FORWARDED_PROTO']) && $this->server['HTTP_X_FORWARDED_PROTO'] == 'https' || + !empty($this->server['HTTP_X_FORWARDED_SSL']) && $this->server['HTTP_X_FORWARDED_SSL'] == 'on' || + !empty($this->server['FRONT_END_HTTPS']) && $this->server['FRONT_END_HTTPS'] == 'on' || + !empty($this->server['SERVER_PORT']) && (intval($this->server['SERVER_PORT']) == 443) // XXX: reasonable assumption, but isn't this hardcoding too much? ) { $this->scheme = 'https'; } } + + /** + * Removes the base url from an url. This avoids some mixed content problems. + * + * @param string $origURL + * + * @return string The cleaned url + */ + public function remove(string $origURL) + { + // Remove the hostname from the url if it is an internal link + $nurl = Strings::normaliseLink($origURL); + $base = Strings::normaliseLink($this->get()); + $url = str_replace($base . '/', '', $nurl); + + // if it is an external link return the orignal value + if ($url == Strings::normaliseLink($origURL)) { + return $origURL; + } else { + return $url; + } + } } diff --git a/src/Console/AutomaticInstallation.php b/src/Console/AutomaticInstallation.php index 475e3e10c2..0f1e7a742f 100644 --- a/src/Console/AutomaticInstallation.php +++ b/src/Console/AutomaticInstallation.php @@ -4,12 +4,12 @@ namespace Friendica\Console; use Asika\SimpleConsole\Console; use Friendica\App; +use Friendica\App\BaseURL; use Friendica\Core\Config; use Friendica\Core\Installer; use Friendica\Core\Theme; use Friendica\Database\Database; use Friendica\Util\BasePath; -use Friendica\Util\BaseURL; use Friendica\Util\ConfigFileLoader; use RuntimeException; diff --git a/src/Core/Authentication.php b/src/Core/Authentication.php index e75cc93e7f..59061c04c4 100644 --- a/src/Core/Authentication.php +++ b/src/Core/Authentication.php @@ -8,7 +8,6 @@ namespace Friendica\Core; use Friendica\App; use Friendica\BaseObject; use Friendica\Network\HTTPException\ForbiddenException; -use Friendica\Util\BaseURL; /** * Handle Authentification, Session and Cookies @@ -51,7 +50,7 @@ class Authentication extends BaseObject $value = ""; } - setcookie("Friendica", $value, $time, "/", "", (Config::get('system', 'ssl_policy') == BaseUrl::SSL_POLICY_FULL), true); + setcookie("Friendica", $value, $time, "/", "", (Config::get('system', 'ssl_policy') == App\BaseURL::SSL_POLICY_FULL), true); } /** diff --git a/src/Core/Session.php b/src/Core/Session.php index e54c0e49b9..22909a6e6e 100644 --- a/src/Core/Session.php +++ b/src/Core/Session.php @@ -9,9 +9,7 @@ use Friendica\App; use Friendica\Core\Session\CacheSessionHandler; use Friendica\Core\Session\DatabaseSessionHandler; use Friendica\Database\DBA; -use Friendica\Model\Contact; use Friendica\Model\User; -use Friendica\Util\BaseURL; use Friendica\Util\DateTimeFormat; /** @@ -30,7 +28,7 @@ class Session ini_set('session.use_only_cookies', 1); ini_set('session.cookie_httponly', 1); - if (Config::get('system', 'ssl_policy') == BaseURL::SSL_POLICY_FULL) { + if (Config::get('system', 'ssl_policy') == App\BaseURL::SSL_POLICY_FULL) { ini_set('session.cookie_secure', 1); } diff --git a/src/Core/System.php b/src/Core/System.php index 89526bdb4e..0888f390a6 100644 --- a/src/Core/System.php +++ b/src/Core/System.php @@ -4,9 +4,9 @@ */ namespace Friendica\Core; +use Friendica\App\BaseURL; use Friendica\BaseObject; use Friendica\Network\HTTPException\InternalServerErrorException; -use Friendica\Util\BaseURL; use Friendica\Util\XML; /** diff --git a/src/Factory/CacheFactory.php b/src/Factory/CacheFactory.php index 7b30c553e2..39b0b94ff7 100644 --- a/src/Factory/CacheFactory.php +++ b/src/Factory/CacheFactory.php @@ -2,11 +2,11 @@ namespace Friendica\Factory; +use Friendica\App\BaseURL; use Friendica\Core\Cache; use Friendica\Core\Cache\ICache; use Friendica\Core\Config\Configuration; use Friendica\Database\Database; -use Friendica\Util\BaseURL; use Friendica\Util\Profiler; use Psr\Log\LoggerInterface; diff --git a/src/Model/Contact.php b/src/Model/Contact.php index f01cb73604..df3efa0c57 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -4,6 +4,7 @@ */ namespace Friendica\Model; +use Friendica\App\BaseURL; use Friendica\BaseObject; use Friendica\Content\Pager; use Friendica\Core\Config; @@ -22,7 +23,6 @@ use Friendica\Protocol\Diaspora; use Friendica\Protocol\OStatus; use Friendica\Protocol\PortableContact; use Friendica\Protocol\Salmon; -use Friendica\Util\BaseURL; use Friendica\Util\DateTimeFormat; use Friendica\Util\Network; use Friendica\Util\Strings; diff --git a/src/Module/Admin/Site.php b/src/Module/Admin/Site.php index c899729f8e..dff869df20 100644 --- a/src/Module/Admin/Site.php +++ b/src/Module/Admin/Site.php @@ -14,7 +14,6 @@ use Friendica\Module\BaseAdminModule; use Friendica\Module\Register; use Friendica\Protocol\PortableContact; use Friendica\Util\BasePath; -use Friendica\Util\BaseURL; use Friendica\Util\Strings; use Friendica\Worker\Delivery; @@ -246,7 +245,7 @@ class Site extends BaseAdminModule $diaspora_enabled = false; } if ($ssl_policy != intval(Config::get('system', 'ssl_policy'))) { - if ($ssl_policy == BaseURL::SSL_POLICY_FULL) { + if ($ssl_policy == App\BaseURL::SSL_POLICY_FULL) { DBA::e("UPDATE `contact` SET `url` = REPLACE(`url` , 'http:' , 'https:'), `photo` = REPLACE(`photo` , 'http:' , 'https:'), @@ -264,7 +263,7 @@ class Site extends BaseAdminModule `thumb` = REPLACE(`thumb` , 'http:' , 'https:') WHERE 1 " ); - } elseif ($ssl_policy == BaseURL::SSL_POLICY_SELFSIGN) { + } elseif ($ssl_policy == App\BaseURL::SSL_POLICY_SELFSIGN) { DBA::e("UPDATE `contact` SET `url` = REPLACE(`url` , 'https:' , 'http:'), `photo` = REPLACE(`photo` , 'https:' , 'http:'), @@ -512,9 +511,9 @@ class Site extends BaseAdminModule ]; $ssl_choices = [ - BaseURL::SSL_POLICY_NONE => L10n::t('No SSL policy, links will track page SSL state'), - BaseURL::SSL_POLICY_FULL => L10n::t('Force all links to use SSL'), - BaseURL::SSL_POLICY_SELFSIGN => L10n::t('Self-signed certificate, use SSL for local links only (discouraged)') + App\BaseURL::SSL_POLICY_NONE => L10n::t('No SSL policy, links will track page SSL state'), + App\BaseURL::SSL_POLICY_FULL => L10n::t('Force all links to use SSL'), + App\BaseURL::SSL_POLICY_SELFSIGN => L10n::t('Self-signed certificate, use SSL for local links only (discouraged)') ]; $check_git_version_choices = [ diff --git a/src/Module/Install.php b/src/Module/Install.php index 3b8ebb471c..7ba4039665 100644 --- a/src/Module/Install.php +++ b/src/Module/Install.php @@ -10,7 +10,6 @@ use Friendica\Core\L10n; use Friendica\Core\Renderer; use Friendica\Network\HTTPException; use Friendica\Util\BasePath; -use Friendica\Util\BaseURL; use Friendica\Util\Strings; use Friendica\Util\Temporal; @@ -180,9 +179,9 @@ class Install extends BaseModule case self::BASE_CONFIG: $ssl_choices = [ - BaseURL::SSL_POLICY_NONE => L10n::t("No SSL policy, links will track page SSL state"), - BaseURL::SSL_POLICY_FULL => L10n::t("Force all links to use SSL"), - BaseURL::SSL_POLICY_SELFSIGN => L10n::t("Self-signed certificate, use SSL for local links only \x28discouraged\x29") + App\BaseURL::SSL_POLICY_NONE => L10n::t("No SSL policy, links will track page SSL state"), + App\BaseURL::SSL_POLICY_FULL => L10n::t("Force all links to use SSL"), + App\BaseURL::SSL_POLICY_SELFSIGN => L10n::t("Self-signed certificate, use SSL for local links only \x28discouraged\x29") ]; $tpl = Renderer::getMarkupTemplate('install_base.tpl'); diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index 2abdfe1486..273a7c248c 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -11,6 +11,7 @@ namespace Friendica\Protocol; use DOMDocument; use DOMXPath; use Friendica\App; +use Friendica\App\BaseURL; use Friendica\Content\OEmbed; use Friendica\Content\Text\BBCode; use Friendica\Content\Text\HTML; @@ -31,7 +32,6 @@ use Friendica\Model\Profile; use Friendica\Model\User; use Friendica\Network\Probe; use Friendica\Object\Image; -use Friendica\Util\BaseURL; use Friendica\Util\Crypto; use Friendica\Util\DateTimeFormat; use Friendica\Util\Network; diff --git a/static/dependencies.config.php b/static/dependencies.config.php index 7a4adb5ea1..e32f99a60c 100644 --- a/static/dependencies.config.php +++ b/static/dependencies.config.php @@ -85,12 +85,12 @@ return [ ], ], /** - * Creates the Util\BaseURL + * Creates the App\BaseURL * * Same as: - * $baseURL = new Util\BaseURL($configuration, $_SERVER); + * $baseURL = new App\BaseURL($configuration, $_SERVER); */ - Util\BaseURL::class => [ + App\BaseURL::class => [ 'constructParams' => [ $_SERVER, ], diff --git a/tests/src/Console/AutomaticInstallationConsoleTest.php b/tests/src/Console/AutomaticInstallationConsoleTest.php index a8c4894b9d..774db31746 100644 --- a/tests/src/Console/AutomaticInstallationConsoleTest.php +++ b/tests/src/Console/AutomaticInstallationConsoleTest.php @@ -15,7 +15,6 @@ use Friendica\Test\Util\DBAMockTrait; use Friendica\Test\Util\DBStructureMockTrait; use Friendica\Test\Util\RendererMockTrait; use Friendica\Test\Util\VFSTrait; -use Friendica\Util\BaseURL; use Friendica\Util\Logger\VoidLogger; use Mockery\MockInterface; use org\bovigo\vfs\vfsStream; @@ -353,7 +352,7 @@ FIN; $this->assertConfigEntry('system', 'language', $assertion, ($default) ? Installer::DEFAULT_LANG : null); $this->assertConfigEntry('system', 'url', $assertion); $this->assertConfigEntry('system', 'urlpath', $assertion); - $this->assertConfigEntry('system', 'ssl_policy', $assertion, ($default) ? BaseURL::DEFAULT_SSL_SCHEME : null); + $this->assertConfigEntry('system', 'ssl_policy', $assertion, ($default) ? App\BaseURL::DEFAULT_SSL_SCHEME : null); $this->assertConfigEntry('system', 'basepath', ($realBasepath) ? $this->root->url() : $assertion); } diff --git a/tests/src/Content/Text/BBCodeTest.php b/tests/src/Content/Text/BBCodeTest.php index 6938f8ed5a..899f32764d 100644 --- a/tests/src/Content/Text/BBCodeTest.php +++ b/tests/src/Content/Text/BBCodeTest.php @@ -2,12 +2,12 @@ namespace Friendica\Test\src\Content\Text; +use Friendica\App\BaseURL; use Friendica\Content\Text\BBCode; use Friendica\Core\L10n\L10n; use Friendica\Test\MockedTest; use Friendica\Test\Util\AppMockTrait; use Friendica\Test\Util\VFSTrait; -use Friendica\Util\BaseURL; class BBCodeTest extends MockedTest { diff --git a/tests/src/Util/BaseURLTest.php b/tests/src/Util/BaseURLTest.php index 1e74af39fe..7f63027fcb 100644 --- a/tests/src/Util/BaseURLTest.php +++ b/tests/src/Util/BaseURLTest.php @@ -1,9 +1,9 @@