From 480b7e3489ee5cc46744e190ccb01325172bd05f Mon Sep 17 00:00:00 2001 From: djmaze <> Date: Fri, 24 Dec 2021 14:43:17 +0100 Subject: [PATCH] Improved index html generator --- .../0.0.0/app/libraries/RainLoop/Service.php | 104 ++++++++---------- .../v/0.0.0/app/libraries/RainLoop/Utils.php | 4 +- 2 files changed, 50 insertions(+), 58 deletions(-) diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Service.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Service.php index 02e4f6b9a..96e52e4ab 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Service.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Service.php @@ -50,7 +50,9 @@ class Service \ini_set('log_errors', 1); } - $sServer = \trim($this->oActions->Config()->Get('security', 'custom_server_signature', '')); + $oConfig = $this->oActions->Config(); + + $sServer = \trim($oConfig->Get('security', 'custom_server_signature', '')); if (\strlen($sServer)) { \header('Server: '.$sServer); @@ -64,13 +66,13 @@ class Service $this->setCSP(); - $sXFrameOptionsHeader = \trim($this->oActions->Config()->Get('security', 'x_frame_options_header', '')) ?: 'DENY'; + $sXFrameOptionsHeader = \trim($oConfig->Get('security', 'x_frame_options_header', '')) ?: 'DENY'; \header('X-Frame-Options: '.$sXFrameOptionsHeader); - $sXssProtectionOptionsHeader = \trim($this->oActions->Config()->Get('security', 'x_xss_protection_header', '')) ?: '1; mode=block'; + $sXssProtectionOptionsHeader = \trim($oConfig->Get('security', 'x_xss_protection_header', '')) ?: '1; mode=block'; \header('X-XSS-Protection: '.$sXssProtectionOptionsHeader); - if ($this->oActions->Config()->Get('labs', 'force_https', false) && !$this->oHttp->IsSecure()) + if ($oConfig->Get('labs', 'force_https', false) && !$this->oHttp->IsSecure()) { \header('Location: https://'.$this->oHttp->GetHost(false, false).$this->oHttp->GetUrl()); exit(0); @@ -99,10 +101,10 @@ class Service $this->oActions->Plugins()->RunHook('filter.http-paths', array(&$aPaths)); $bAdmin = false; - $sAdminPanelHost = $this->oActions->Config()->Get('security', 'admin_panel_host', ''); + $sAdminPanelHost = $oConfig->Get('security', 'admin_panel_host', ''); if (empty($sAdminPanelHost)) { - $sAdminPanelKey = \strtolower($this->oActions->Config()->Get('security', 'admin_panel_key', 'admin')); + $sAdminPanelKey = \strtolower($oConfig->Get('security', 'admin_panel_key', 'admin')); $bAdmin = !empty($aPaths[0]) && \strtolower($aPaths[0]) === $sAdminPanelKey; } else if (empty($aPaths[0]) && @@ -116,7 +118,7 @@ class Service $this->oHttp->ServerNoCache(); } - if ($bAdmin && !$this->oActions->Config()->Get('security', 'allow_admin_panel', true)) + if ($bAdmin && !$oConfig->Get('security', 'allow_admin_panel', true)) { \MailSo\Base\Http::StatusHeader(403); echo $this->oServiceActions->ErrorTemplates('Access Denied.', @@ -174,12 +176,37 @@ class Service $sLanguage = $this->oActions->GetLanguage($bAdmin); - $aTemplateParameters = $this->indexTemplateParameters($bAdmin); + $sAppJsMin = $oConfig->Get('labs', 'use_app_debug_js', false) ? '' : '.min'; + $sAppCssMin = $oConfig->Get('labs', 'use_app_debug_css', false) ? '' : '.min'; + + $sFaviconUrl = (string) $oConfig->Get('webmail', 'favicon_url', ''); + + $sFaviconPngLink = $sFaviconUrl ? $sFaviconUrl : $this->oActions->StaticPath('apple-touch-icon.png'); + $sAppleTouchLink = $sFaviconUrl ? '' : $this->oActions->StaticPath('apple-touch-icon.png'); + + $aTemplateParameters = array( + '{{BaseAppFaviconPngLinkTag}}' => $sFaviconPngLink ? '' : '', + '{{BaseAppFaviconTouchLinkTag}}' => $sAppleTouchLink ? '' : '', + '{{BaseAppMainCssLink}}' => $this->oActions->StaticPath('css/'.($bAdmin ? 'admin' : 'app').$sAppCssMin.'.css'), + '{{BaseAppThemeCssLink}}' => $this->oActions->ThemeLink($bAdmin), + '{{BaseAppManifestLink}}' => $this->oActions->StaticPath('manifest.json'), + '{{LoadingDescriptionEsc}}' => \htmlspecialchars($oConfig->Get('webmail', 'loading_description', 'SnappyMail'), ENT_QUOTES|ENT_IGNORE, 'UTF-8'), + '{{BaseAppAdmin}}' => $bAdmin ? 1 : 0 + ); $sCacheFileName = ''; - if ($this->oActions->Config()->Get('labs', 'cache_system_data', true) && !empty($aTemplateParameters['{{BaseHash}}'])) + if ($oConfig->Get('labs', 'cache_system_data', true)) { - $sCacheFileName = 'TMPL:'.$sLanguage.$aTemplateParameters['{{BaseHash}}']; + $sCacheFileName = 'TMPL:' . $sLanguage . \md5( + \json_encode(array( + $oConfig->Get('cache', 'index', ''), + $this->oActions->Plugins()->Hash(), + $sAppJsMin, + $sAppCssMin, + $aTemplateParameters, + APP_VERSION + )) + ); $sResult = $this->oActions->Cacher()->Get($sCacheFileName); } @@ -189,9 +216,19 @@ class Service $aTemplateParameters['{{BaseAppThemeCss}}'] = $this->oActions->compileCss($this->oActions->GetTheme($bAdmin), $bAdmin); $aTemplateParameters['{{BaseLanguage}}'] = $this->oActions->compileLanguage($sLanguage, $bAdmin); $aTemplateParameters['{{BaseTemplates}}'] = $this->oServiceActions->compileTemplates($bAdmin); + $aTemplateParameters['{{BaseAppBootCss}}'] = \file_get_contents(APP_VERSION_ROOT_PATH.'static/css/boot'.$sAppCssMin.'.css'); + $aTemplateParameters['{{BaseAppBootScript}}'] = \file_get_contents(APP_VERSION_ROOT_PATH.'static/js'.($sAppJsMin ? '/min' : '').'/boot'.$sAppJsMin.'.js'); $sResult = \strtr(\file_get_contents(APP_VERSION_ROOT_PATH.'app/templates/Index.html'), $aTemplateParameters); - $sResult = Utils::ClearHtmlOutput($sResult); + if ($sAppJsMin || $sAppCssMin) { + $sResult = \preg_replace( + ['@\\s*/>@', '/\\s* /i', '/ \\s*/i', '/>\\s+', "\xC2\xA0", "\xC2\xA0", '><'], + \trim($sResult) + ); + } else { + $sResult = Utils::ClearHtmlOutput($sResult); + } if ($sCacheFileName) { $this->oActions->Cacher()->Set($sCacheFileName, $sResult); } @@ -241,49 +278,4 @@ class Service } \header('Content-Security-Policy: '.$sContentSecurityPolicy); } - - private function staticPath(string $sPath) : string - { - return $this->oActions->StaticPath($sPath); - } - - private function indexTemplateParameters(bool $bAdmin) : array - { - $oConfig = $this->oActions->Config(); - - $bAppJsDebug = !!$oConfig->Get('labs', 'use_app_debug_js', false); - $bAppCssDebug = !!$oConfig->Get('labs', 'use_app_debug_css', false); - - $sFaviconUrl = (string) $oConfig->Get('webmail', 'favicon_url', ''); - - $sFaviconPngLink = $sFaviconUrl ? $sFaviconUrl : $this->staticPath('apple-touch-icon.png'); - $sAppleTouchLink = $sFaviconUrl ? '' : $this->staticPath('apple-touch-icon.png'); - - $LoadingDescription = $oConfig->Get('webmail', 'loading_description', 'SnappyMail'); - - $aTemplateParameters = array( - '{{BaseAppFaviconPngLinkTag}}' => $sFaviconPngLink ? '' : '', - '{{BaseAppFaviconTouchLinkTag}}' => $sAppleTouchLink ? '' : '', - '{{BaseAppMainCssLink}}' => $this->staticPath('css/'.($bAdmin ? 'admin' : 'app').($bAppCssDebug ? '' : '.min').'.css'), - '{{BaseAppThemeCssLink}}' => $this->oActions->ThemeLink($bAdmin), - '{{BaseAppBootScript}}' => \file_get_contents(APP_VERSION_ROOT_PATH.'static/js/min/boot.min.js'), - '{{BaseAppManifestLink}}' => $this->staticPath('manifest.json'), - '{{BaseAppBootCss}}' => \file_get_contents(APP_VERSION_ROOT_PATH.'static/css/boot.min.css'), - '{{LoadingDescriptionEsc}}' => \htmlspecialchars($LoadingDescription, ENT_QUOTES|ENT_IGNORE, 'UTF-8'), - '{{BaseAppAdmin}}' => $bAdmin ? 1 : 0 - ); - - $aTemplateParameters['{{BaseHash}}'] = \md5( - \implode('~', array( - $bAdmin ? '1' : '0', - \md5($oConfig->Get('cache', 'index', '')), - $this->oActions->Plugins()->Hash(), - Utils::WebVersionPath(), - APP_VERSION, - )). - \implode('~', $aTemplateParameters) - ); - - return $aTemplateParameters; - } } diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Utils.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Utils.php index cabd8db57..56952b90b 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Utils.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Utils.php @@ -113,8 +113,8 @@ class Utils { // return $sHtml; return \preg_replace( - ['@"\\s*/>@', '/\\s* /i', '/ \\s*/i', '/[\\r\\n\\t]+/', '/>\\s+', "\xC2\xA0", "\xC2\xA0", ' ', '><'], + ['@\\s*/>@', '/\\s* /i', '/ \\s*/i', '/[\\r\\n\\t]+/', '/>\\s+', "\xC2\xA0", "\xC2\xA0", ' ', '><'], \trim($sHtml) ); }