aboutsummaryrefslogtreecommitdiff
path: root/srcs/phpmyadmin/libraries/classes/ThemeManager.php
diff options
context:
space:
mode:
Diffstat (limited to 'srcs/phpmyadmin/libraries/classes/ThemeManager.php')
-rw-r--r--srcs/phpmyadmin/libraries/classes/ThemeManager.php417
1 files changed, 417 insertions, 0 deletions
diff --git a/srcs/phpmyadmin/libraries/classes/ThemeManager.php b/srcs/phpmyadmin/libraries/classes/ThemeManager.php
new file mode 100644
index 0000000..8bba657
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/ThemeManager.php
@@ -0,0 +1,417 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * phpMyAdmin theme manager
+ *
+ * @package PhpMyAdmin
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin;
+
+use PhpMyAdmin\Theme;
+use PhpMyAdmin\Url;
+
+/**
+ * phpMyAdmin theme manager
+ *
+ * @package PhpMyAdmin
+ */
+class ThemeManager
+{
+ /**
+ * ThemeManager instance
+ *
+ * @access private
+ * @static
+ * @var ThemeManager
+ */
+ private static $_instance;
+
+ /**
+ * @var string path to theme folder
+ * @access protected
+ */
+ private $_themes_path = './themes/';
+
+ /**
+ * @var array available themes
+ */
+ public $themes = [];
+
+ /**
+ * @var string cookie name
+ */
+ public $cookie_name = 'pma_theme';
+
+ /**
+ * @var boolean
+ */
+ public $per_server = false;
+
+ /**
+ * @var string name of active theme
+ */
+ public $active_theme = '';
+
+ /**
+ * @var Theme Theme active theme
+ */
+ public $theme = null;
+
+ /**
+ * @var string
+ */
+ public $theme_default;
+
+ /**
+ * @const string The name of the fallback theme
+ */
+ public const FALLBACK_THEME = 'pmahomme';
+
+ /**
+ * Constructor for Theme Manager class
+ *
+ * @access public
+ */
+ public function __construct()
+ {
+ $this->themes = [];
+ $this->theme_default = self::FALLBACK_THEME;
+ $this->active_theme = '';
+
+ if (! $this->setThemesPath('./themes/')) {
+ return;
+ }
+
+ $this->setThemePerServer($GLOBALS['cfg']['ThemePerServer']);
+
+ $this->loadThemes();
+
+ $this->theme = new Theme();
+
+ $config_theme_exists = true;
+
+ if (! $this->checkTheme($GLOBALS['cfg']['ThemeDefault'])) {
+ trigger_error(
+ sprintf(
+ __('Default theme %s not found!'),
+ htmlspecialchars($GLOBALS['cfg']['ThemeDefault'])
+ ),
+ E_USER_ERROR
+ );
+ $config_theme_exists = false;
+ } else {
+ $this->theme_default = $GLOBALS['cfg']['ThemeDefault'];
+ }
+
+ // check if user have a theme cookie
+ $cookie_theme = $this->getThemeCookie();
+ if (! $cookie_theme || ! $this->setActiveTheme($cookie_theme)) {
+ if ($config_theme_exists) {
+ // otherwise use default theme
+ $this->setActiveTheme($this->theme_default);
+ } else {
+ // or fallback theme
+ $this->setActiveTheme(self::FALLBACK_THEME);
+ }
+ }
+ }
+
+ /**
+ * Returns the singleton ThemeManager object
+ *
+ * @return ThemeManager The instance
+ */
+ public static function getInstance(): ThemeManager
+ {
+ if (empty(self::$_instance)) {
+ self::$_instance = new ThemeManager();
+ }
+ return self::$_instance;
+ }
+
+ /**
+ * sets path to folder containing the themes
+ *
+ * @param string $path path to themes folder
+ *
+ * @access public
+ * @return boolean success
+ */
+ public function setThemesPath($path)
+ {
+ if (! $this->_checkThemeFolder($path)) {
+ return false;
+ }
+
+ $this->_themes_path = trim($path);
+ return true;
+ }
+
+ /**
+ * sets if there are different themes per server
+ *
+ * @param boolean $per_server Whether to enable per server flag
+ *
+ * @access public
+ * @return void
+ */
+ public function setThemePerServer($per_server)
+ {
+ $this->per_server = (bool) $per_server;
+ }
+
+ /**
+ * Sets active theme
+ *
+ * @param string $theme theme name
+ *
+ * @access public
+ * @return bool true on success
+ */
+ public function setActiveTheme($theme = null)
+ {
+ if (! $this->checkTheme($theme)) {
+ trigger_error(
+ sprintf(
+ __('Theme %s not found!'),
+ htmlspecialchars($theme)
+ ),
+ E_USER_ERROR
+ );
+ return false;
+ }
+
+ $this->active_theme = $theme;
+ $this->theme = $this->themes[$theme];
+
+ // need to set later
+ //$this->setThemeCookie();
+
+ return true;
+ }
+
+ /**
+ * Returns name for storing theme
+ *
+ * @return string cookie name
+ * @access public
+ */
+ public function getThemeCookieName()
+ {
+ // Allow different theme per server
+ if (isset($GLOBALS['server']) && $this->per_server) {
+ return $this->cookie_name . '-' . $GLOBALS['server'];
+ }
+
+ return $this->cookie_name;
+ }
+
+ /**
+ * returns name of theme stored in the cookie
+ *
+ * @return string|bool theme name from cookie or false
+ * @access public
+ */
+ public function getThemeCookie()
+ {
+ /** @var Config $PMA_Config */
+ global $PMA_Config;
+
+ $name = $this->getThemeCookieName();
+ if ($PMA_Config->issetCookie($name)) {
+ return $PMA_Config->getCookie($name);
+ }
+
+ return false;
+ }
+
+ /**
+ * save theme in cookie
+ *
+ * @return bool true
+ * @access public
+ */
+ public function setThemeCookie()
+ {
+ $GLOBALS['PMA_Config']->setCookie(
+ $this->getThemeCookieName(),
+ $this->theme->id,
+ $this->theme_default
+ );
+ // force a change of a dummy session variable to avoid problems
+ // with the caching of phpmyadmin.css.php
+ $GLOBALS['PMA_Config']->set('theme-update', $this->theme->id);
+ return true;
+ }
+
+ /**
+ * Checks whether folder is valid for storing themes
+ *
+ * @param string $folder Folder name to test
+ *
+ * @return boolean
+ * @access private
+ */
+ private function _checkThemeFolder($folder)
+ {
+ if (! is_dir($folder)) {
+ trigger_error(
+ sprintf(
+ __('Theme path not found for theme %s!'),
+ htmlspecialchars($folder)
+ ),
+ E_USER_ERROR
+ );
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * read all themes
+ *
+ * @return bool true
+ * @access public
+ */
+ public function loadThemes()
+ {
+ $this->themes = [];
+
+ if (false === ($handleThemes = opendir($this->_themes_path))) {
+ trigger_error(
+ 'phpMyAdmin-ERROR: cannot open themes folder: '
+ . $this->_themes_path,
+ E_USER_WARNING
+ );
+ return false;
+ }
+
+ // check for themes directory
+ while (false !== ($PMA_Theme = readdir($handleThemes))) {
+ // Skip non dirs, . and ..
+ if ($PMA_Theme == '.'
+ || $PMA_Theme == '..'
+ || ! @is_dir(ROOT_PATH . $this->_themes_path . $PMA_Theme)
+ ) {
+ continue;
+ }
+ if (array_key_exists($PMA_Theme, $this->themes)) {
+ continue;
+ }
+ $new_theme = Theme::load(
+ $this->_themes_path . $PMA_Theme
+ );
+ if ($new_theme) {
+ $new_theme->setId($PMA_Theme);
+ $this->themes[$PMA_Theme] = $new_theme;
+ }
+ } // end get themes
+ closedir($handleThemes);
+
+ ksort($this->themes);
+ return true;
+ }
+
+ /**
+ * checks if given theme name is a known theme
+ *
+ * @param string $theme name fo theme to check for
+ *
+ * @return bool
+ * @access public
+ */
+ public function checkTheme($theme)
+ {
+ return array_key_exists($theme, $this->themes);
+ }
+
+ /**
+ * returns HTML selectbox, with or without form enclosed
+ *
+ * @param boolean $form whether enclosed by from tags or not
+ *
+ * @return string
+ * @access public
+ */
+ public function getHtmlSelectBox($form = true)
+ {
+ $select_box = '';
+
+ if ($form) {
+ $select_box .= '<form name="setTheme" method="post"';
+ $select_box .= ' action="index.php" class="disableAjax">';
+ $select_box .= Url::getHiddenInputs();
+ }
+
+ $theme_preview_path = './themes.php';
+ $theme_preview_href = '<a href="'
+ . $theme_preview_path . '" target="themes" class="themeselect">';
+ $select_box .= $theme_preview_href . __('Theme:') . '</a>' . "\n";
+
+ $select_box .= '<select name="set_theme" lang="en" dir="ltr"'
+ . ' class="autosubmit">';
+ foreach ($this->themes as $each_theme_id => $each_theme) {
+ $select_box .= '<option value="' . $each_theme_id . '"';
+ if ($this->active_theme === $each_theme_id) {
+ $select_box .= ' selected="selected"';
+ }
+ $select_box .= '>' . htmlspecialchars($each_theme->getName())
+ . '</option>';
+ }
+ $select_box .= '</select>';
+
+ if ($form) {
+ $select_box .= '</form>';
+ }
+
+ return $select_box;
+ }
+
+ /**
+ * Renders the previews for all themes
+ *
+ * @return string
+ * @access public
+ */
+ public function getPrintPreviews()
+ {
+ $retval = '';
+ foreach ($this->themes as $each_theme) {
+ $retval .= $each_theme->getPrintPreview();
+ } // end 'open themes'
+ return $retval;
+ }
+
+ /**
+ * Theme initialization
+ *
+ * @return void
+ * @access public
+ */
+ public static function initializeTheme()
+ {
+ $tmanager = self::getInstance();
+
+ /**
+ * the theme object
+ *
+ * @global Theme $GLOBALS['PMA_Theme']
+ */
+ $GLOBALS['PMA_Theme'] = $tmanager->theme;
+
+ // BC
+ /**
+ * the theme path
+ * @global string $GLOBALS['pmaThemePath']
+ */
+ $GLOBALS['pmaThemePath'] = $GLOBALS['PMA_Theme']->getPath();
+ /**
+ * the theme image path
+ * @global string $GLOBALS['pmaThemeImage']
+ */
+ $GLOBALS['pmaThemeImage'] = $GLOBALS['PMA_Theme']->getImgPath();
+ }
+}