]> git.mxchange.org Git - friendica.git/blobdiff - src/App.php
Merge pull request #8027 from nupplaphil/task/session_remove_cookie
[friendica.git] / src / App.php
index 1f623c0cfeb8565c5101b8e80b3a203376004e73..3325f5b260357694b0bc81d590cd48abe31788d3 100644 (file)
@@ -8,10 +8,12 @@ use Exception;
 use Friendica\App\Arguments;
 use Friendica\App\BaseURL;
 use Friendica\App\Page;
+use Friendica\App\Authentication;
 use Friendica\Core\Config\Cache\ConfigCache;
 use Friendica\Core\Config\Configuration;
 use Friendica\Core\Config\PConfiguration;
 use Friendica\Core\L10n\L10n;
+use Friendica\Core\Session;
 use Friendica\Core\System;
 use Friendica\Core\Theme;
 use Friendica\Database\Database;
@@ -92,10 +94,10 @@ class App
         */
        private $baseURL;
 
-       /**
-        * @var string The name of the current theme
-        */
+       /** @var string The name of the current theme */
        private $currentTheme;
+       /** @var string The name of the current mobile theme */
+       private $currentMobileTheme;
 
        /**
         * @var Configuration The config
@@ -383,7 +385,7 @@ class App
         * @deprecated 2019.09 - Use BaseURL->remove() instead
         * @see        BaseURL::remove()
         */
-       public function removeBaseURL($origURL)
+       public function removeBaseURL(string $origURL)
        {
                return $this->baseURL->remove($origURL);
        }
@@ -450,10 +452,10 @@ class App
        }
 
        /**
-        * Returns the current theme name.
+        * Returns the current theme name. May be overriden by the mobile theme name.
         *
-        * @return string the name of the current theme
-        * @throws HTTPException\InternalServerErrorException
+        * @return string
+        * @throws Exception
         */
        public function getCurrentTheme()
        {
@@ -461,6 +463,16 @@ class App
                        return '';
                }
 
+               // Specific mobile theme override
+               if (($this->mode->isMobile() || $this->mode->isTablet()) && Core\Session::get('show-mobile', true)) {
+                       $user_mobile_theme = $this->getCurrentMobileTheme();
+
+                       // --- means same mobile theme as desktop
+                       if (!empty($user_mobile_theme) && $user_mobile_theme !== '---') {
+                               return $user_mobile_theme;
+                       }
+               }
+
                if (!$this->currentTheme) {
                        $this->computeCurrentTheme();
                }
@@ -468,13 +480,37 @@ class App
                return $this->currentTheme;
        }
 
+       /**
+        * Returns the current mobile theme name.
+        *
+        * @return string
+        * @throws Exception
+        */
+       public function getCurrentMobileTheme()
+       {
+               if ($this->mode->isInstall()) {
+                       return '';
+               }
+
+               if (is_null($this->currentMobileTheme)) {
+                       $this->computeCurrentMobileTheme();
+               }
+
+               return $this->currentMobileTheme;
+       }
+
        public function setCurrentTheme($theme)
        {
                $this->currentTheme = $theme;
        }
 
+       public function setCurrentMobileTheme($theme)
+       {
+               $this->currentMobileTheme = $theme;
+       }
+
        /**
-        * Computes the current theme name based on the node settings, the user settings and the device type
+        * Computes the current theme name based on the node settings, the page owner settings and the user settings
         *
         * @throws Exception
         */
@@ -486,7 +522,7 @@ class App
                }
 
                // Sane default
-               $this->currentTheme = $system_theme;
+               $this->setCurrentTheme($system_theme);
 
                $page_theme = null;
                // Find the theme that belongs to the user whose stuff we are looking at
@@ -499,24 +535,7 @@ class App
                        }
                }
 
-               $user_theme = Core\Session::get('theme', $system_theme);
-
-               // 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);
-
-                       // --- means same mobile theme as desktop
-                       if (!empty($user_mobile_theme) && $user_mobile_theme !== '---') {
-                               $user_theme = $user_mobile_theme;
-                       }
-               }
-
-               if ($page_theme) {
-                       $theme_name = $page_theme;
-               } else {
-                       $theme_name = $user_theme;
-               }
+               $theme_name = $page_theme ?: Core\Session::get('theme', $system_theme);
 
                $theme_name = Strings::sanitizeFilePathItem($theme_name);
                if ($theme_name
@@ -524,7 +543,40 @@ class App
                    && (file_exists('view/theme/' . $theme_name . '/style.css')
                        || file_exists('view/theme/' . $theme_name . '/style.php'))
                ) {
-                       $this->currentTheme = $theme_name;
+                       $this->setCurrentTheme($theme_name);
+               }
+       }
+
+       /**
+        * Computes the current mobile theme name based on the node settings, the page owner settings and the user settings
+        */
+       private function computeCurrentMobileTheme()
+       {
+               $system_mobile_theme = $this->config->get('system', 'mobile-theme', '');
+
+               // Sane default
+               $this->setCurrentMobileTheme($system_mobile_theme);
+
+               $page_mobile_theme = null;
+               // Find the theme that belongs to the user whose stuff we are looking at
+               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
+                       if (!Core\PConfig::get(local_user(), 'system', 'always_my_theme')) {
+                               $page_mobile_theme = Core\PConfig::get($this->profile_uid, 'system', 'mobile-theme');
+                       }
+               }
+
+               $mobile_theme_name = $page_mobile_theme ?: Core\Session::get('mobile-theme', $system_mobile_theme);
+
+               $mobile_theme_name = Strings::sanitizeFilePathItem($mobile_theme_name);
+               if ($mobile_theme_name == '---'
+                       ||
+                       in_array($mobile_theme_name, Theme::getAllowedList())
+                       && (file_exists('view/theme/' . $mobile_theme_name . '/style.css')
+                               || file_exists('view/theme/' . $mobile_theme_name . '/style.php'))
+               ) {
+                       $this->setCurrentMobileTheme($mobile_theme_name);
                }
        }
 
@@ -534,7 +586,7 @@ class App
         * Provide a sane default if nothing is chosen or the specified theme does not exist.
         *
         * @return string
-        * @throws HTTPException\InternalServerErrorException
+        * @throws Exception
         */
        public function getCurrentThemeStylesheetPath()
        {
@@ -590,10 +642,11 @@ class App
         * @param App\Module     $module The determined module
         * @param App\Router     $router
         * @param PConfiguration $pconfig
+        * @param Authentication $auth The Authentication backend of the node
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public function runFrontend(App\Module $module, App\Router $router, PConfiguration $pconfig)
+       public function runFrontend(App\Module $module, App\Router $router, PConfiguration $pconfig, Authentication $auth)
        {
                $moduleName = $module->getName();
 
@@ -617,19 +670,11 @@ class App
                                        System::externalRedirect($this->baseURL->get() . '/' . $this->args->getQueryString());
                                }
 
-                               Core\Session::init();
                                Core\Hook::callAll('init_1');
                        }
 
                        // Exclude the backend processes from the session management
-                       if (!$this->mode->isBackend()) {
-                               $stamp1 = microtime(true);
-                               session_start();
-                               $this->profiler->saveTimestamp($stamp1, 'parser', Core\System::callstack());
-                               $this->l10n->setSessionVariable();
-                               $this->l10n->setLangFromSession();
-                       } else {
-                               $_SESSION = [];
+                       if ($this->mode->isBackend()) {
                                Core\Worker::executeIfIdle();
                        }
 
@@ -667,7 +712,7 @@ class App
                                Model\Profile::openWebAuthInit($token);
                        }
 
-                       Login::sessionAuth();
+                       $auth->withSession($this);
 
                        if (empty($_SESSION['authenticated'])) {
                                header('X-Account-Management-Status: none');
@@ -746,22 +791,12 @@ class App
        }
 
        /**
-        * Redirects to another module relative to the current Friendica base.
-        * 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\InternalServerErrorException In Case the given URL is not relative to the Friendica node
+        * @deprecated 2019.12 use BaseUrl::redirect instead
+        * @see BaseURL::redirect()
         */
        public function internalRedirect($toUrl = '', $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->baseURL->get($ssl) . '/' . ltrim($toUrl, '/');
-               Core\System::externalRedirect($redirectTo);
+               $this->baseURL->redirect($toUrl, $ssl);
        }
 
        /**
@@ -777,7 +812,7 @@ class App
                if (!empty(parse_url($toUrl, PHP_URL_SCHEME))) {
                        Core\System::externalRedirect($toUrl);
                } else {
-                       $this->internalRedirect($toUrl);
+                       $this->baseURL->redirect($toUrl);
                }
        }
 }