From 6de05e0437070d68f918bbffe044334076ea106c Mon Sep 17 00:00:00 2001 From: Franco Fichtner Date: Mon, 18 Mar 2024 11:29:35 +0100 Subject: [PATCH] mvc: fix lang= hint in HTML; closes #7336 --- src/opnsense/mvc/app/config/services.php | 20 +++++++++---------- .../OPNsense/Base/ControllerBase.php | 2 ++ .../OPNsense/Base/ControllerRoot.php | 10 ++++++++-- .../library/OPNsense/Base/ViewTranslator.php | 4 +--- .../mvc/app/views/layouts/default.volt | 2 +- src/opnsense/www/index.php | 11 ++++++++++ 6 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/opnsense/mvc/app/config/services.php b/src/opnsense/mvc/app/config/services.php index be571dc63..96b5ebe98 100644 --- a/src/opnsense/mvc/app/config/services.php +++ b/src/opnsense/mvc/app/config/services.php @@ -31,8 +31,8 @@ $di->set('url', function () use ($config) { * Setting up the view component */ $di->set('view', function () use ($config) { - $view = new View(); + // if configuration defines more view locations, convert phalcon config items to array if (is_string($config->application->viewsDir)) { $view->setViewsDir($config->application->viewsDir); @@ -43,24 +43,26 @@ $di->set('view', function () use ($config) { } $view->setViewsDir($viewDirs); } - $view->registerEngines(array( - '.volt' => function ($view) use ($config) { + $view->registerEngines([ + '.volt' => function ($view) use ($config) { $volt = new VoltEngine($view, $this); - $volt->setOptions(array( + $volt->setOptions([ 'path' => $config->application->cacheDir, 'separator' => '_' - )); - // register additional volt template functions + ]); + + // register additional volt template functions and filters $volt->getCompiler()->addFunction('theme_file_or_default', 'view_fetch_themed_filename'); $volt->getCompiler()->addFunction('file_exists', 'view_file_exists'); $volt->getCompiler()->addFunction('cache_safe', 'view_cache_safe'); + $volt->getCompiler()->addFilter('safe', 'view_html_safe'); return $volt; }, - '.phtml' => 'Phalcon\Mvc\View\Engine\Php' - )); + '.phtml' => 'Phalcon\Mvc\View\Engine\Php', + ]); return $view; }, true); @@ -96,8 +98,6 @@ $di->setShared('session', function () { return $session; }); - - /** * Setup router */ diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Base/ControllerBase.php b/src/opnsense/mvc/app/controllers/OPNsense/Base/ControllerBase.php index addc2c19b..ad4c1a90f 100644 --- a/src/opnsense/mvc/app/controllers/OPNsense/Base/ControllerBase.php +++ b/src/opnsense/mvc/app/controllers/OPNsense/Base/ControllerBase.php @@ -230,6 +230,8 @@ class ControllerBase extends ControllerRoot $cnf = Config::getInstance(); $this->view->setVar('lang', $this->translator); + $this->view->setVar('langcode', str_replace('_', '-', $this->langcode)); + $rewrite_uri = explode("?", $_SERVER["REQUEST_URI"])[0]; $this->view->menuSystem = $menu->getItems($rewrite_uri); /* XXX generating breadcrumbs requires getItems() call */ diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Base/ControllerRoot.php b/src/opnsense/mvc/app/controllers/OPNsense/Base/ControllerRoot.php index 5885e8f75..afb26acf2 100644 --- a/src/opnsense/mvc/app/controllers/OPNsense/Base/ControllerRoot.php +++ b/src/opnsense/mvc/app/controllers/OPNsense/Base/ControllerRoot.php @@ -45,7 +45,6 @@ class ControllerRoot extends Controller */ public $translator; - /** * log handle */ @@ -56,6 +55,11 @@ class ControllerRoot extends Controller */ protected $logged_in_user = null; + /** + * current language code + */ + protected $langcode = 'en_US'; + /** * Wrap close session, for long running operations. */ @@ -70,7 +74,7 @@ class ControllerRoot extends Controller protected function setLang() { $config = Config::getInstance()->object(); - $lang = 'en_US'; + $lang = $this->langcode; foreach ($config->system->children() as $key => $node) { if ($key == 'language') { @@ -100,6 +104,8 @@ class ControllerRoot extends Controller /* somehow this is not done by Phalcon */ bind_textdomain_codeset('OPNsense', $locale); putenv('LANG=' . $locale); + + $this->langcode = $lang; } /** diff --git a/src/opnsense/mvc/app/library/OPNsense/Base/ViewTranslator.php b/src/opnsense/mvc/app/library/OPNsense/Base/ViewTranslator.php index c33c43d8a..f90b2bd41 100644 --- a/src/opnsense/mvc/app/library/OPNsense/Base/ViewTranslator.php +++ b/src/opnsense/mvc/app/library/OPNsense/Base/ViewTranslator.php @@ -38,8 +38,6 @@ class ViewTranslator extends Gettext { public function _($translateKey, array $placeholders = []): string { - $translateValue = parent::_($translateKey, $placeholders); - /* gettext() embedded in JavaScript can cause syntax errors */ - return str_replace("\n", ' ', htmlspecialchars($translateValue ?? '', ENT_QUOTES | ENT_HTML401)); + return view_html_safe(parent::_($translateKey, $placeholders)); } } diff --git a/src/opnsense/mvc/app/views/layouts/default.volt b/src/opnsense/mvc/app/views/layouts/default.volt index c64a4b0e6..8ef2fee4d 100644 --- a/src/opnsense/mvc/app/views/layouts/default.volt +++ b/src/opnsense/mvc/app/views/layouts/default.volt @@ -1,5 +1,5 @@ - + diff --git a/src/opnsense/www/index.php b/src/opnsense/www/index.php index 65127f5fd..b4d7510e8 100644 --- a/src/opnsense/www/index.php +++ b/src/opnsense/www/index.php @@ -46,6 +46,17 @@ function view_cache_safe($url) return $url; } +/** + * return safe HTML encoded version of input string + * @param string $text to make HTML safe + * @return string + */ +function view_html_safe($text) +{ + /* gettext() embedded in JavaScript can cause syntax errors */ + return str_replace("\n", ' ', htmlspecialchars($text ?? '', ENT_QUOTES | ENT_HTML401)); +} + try { /** * Read the configuration