<?php /* vim: set expandtab sw=4 ts=4 sts=4: */ /** * Used to render the footer of PMA's pages * * @package PhpMyAdmin */ namespace PhpMyAdmin; use PhpMyAdmin\Config; use PhpMyAdmin\Core; use PhpMyAdmin\Message; use PhpMyAdmin\Relation; use PhpMyAdmin\Response; use PhpMyAdmin\Sanitize; use PhpMyAdmin\Scripts; use PhpMyAdmin\Url; use PhpMyAdmin\Util; use Traversable; /** * Class used to output the footer * * @package PhpMyAdmin */ class Footer { /** * Scripts instance * * @access private * @var Scripts */ private $_scripts; /** * Whether we are servicing an ajax request. * * @access private * @var bool */ private $_isAjax; /** * Whether to only close the BODY and HTML tags * or also include scripts, errors and links * * @access private * @var bool */ private $_isMinimal; /** * Whether to display anything * * @access private * @var bool */ private $_isEnabled; /** * @var Relation $relation */ private $relation; /** * Creates a new class instance */ public function __construct() { $this->_isEnabled = true; $this->_scripts = new Scripts(); $this->_isMinimal = false; $this->relation = new Relation(); } /** * Returns the message for demo server to error messages * * @return string */ private function _getDemoMessage() { $message = '<a href="/">' . __('phpMyAdmin Demo Server') . '</a>: '; if (@file_exists('./revision-info.php')) { include './revision-info.php'; $message .= sprintf( __('Currently running Git revision %1$s from the %2$s branch.'), '<a target="_blank" rel="noopener noreferrer" href="' . htmlspecialchars($repobase . $fullrevision) . '">' . htmlspecialchars($revision) . '</a>', '<a target="_blank" rel="noopener noreferrer" href="' . htmlspecialchars($repobranchbase . $branch) . '">' . htmlspecialchars($branch) . '</a>' ); } else { $message .= __('Git information missing!'); } return Message::notice($message)->getDisplay(); } /** * Remove recursions and iterator objects from an object * * @param object|array &$object Object to clean * @param array $stack Stack used to keep track of recursion, * need not be passed for the first time * * @return object Reference passed object */ private static function _removeRecursion(&$object, array $stack = array()) { if ((is_object($object) || is_array($object)) && $object) { if ($object instanceof Traversable) { $object = "***ITERATOR***"; } elseif (!in_array($object, $stack, true)) { $stack[] = $object; foreach ($object as &$subobject) { self::_removeRecursion($subobject, $stack); } } else { $object = "***RECURSION***"; } } return $object; } /** * Renders the debug messages * * @return string */ public function getDebugMessage() { $retval = '\'null\''; if ($GLOBALS['cfg']['DBG']['sql'] && empty($_REQUEST['no_debug']) && !empty($_SESSION['debug']) ) { // Remove recursions and iterators from $_SESSION['debug'] self::_removeRecursion($_SESSION['debug']); $retval = JSON_encode($_SESSION['debug']); $_SESSION['debug'] = array(); return json_last_error() ? '\'false\'' : $retval; } $_SESSION['debug'] = array(); return $retval; } /** * Returns the url of the current page * * @return string */ public function getSelfUrl() { $db = isset($GLOBALS['db']) && strlen($GLOBALS['db']) ? $GLOBALS['db'] : ''; $table = isset($GLOBALS['table']) && strlen($GLOBALS['table']) ? $GLOBALS['table'] : ''; $target = isset($_REQUEST['target']) && strlen($_REQUEST['target']) ? $_REQUEST['target'] : ''; $params = array( 'db' => $db, 'table' => $table, 'server' => $GLOBALS['server'], 'target' => $target ); // needed for server privileges tabs if (isset($_GET['viewing_mode']) && in_array($_GET['viewing_mode'], array('server', 'db', 'table')) ) { $params['viewing_mode'] = $_GET['viewing_mode']; } /* * @todo coming from server_privileges.php, here $db is not set, * add the following condition below when that is fixed * && $_GET['checkprivsdb'] == $db */ if (isset($_GET['checkprivsdb']) ) { $params['checkprivsdb'] = $_GET['checkprivsdb']; } /* * @todo coming from server_privileges.php, here $table is not set, * add the following condition below when that is fixed * && $_REQUEST['checkprivstable'] == $table */ if (isset($_GET['checkprivstable']) ) { $params['checkprivstable'] = $_GET['checkprivstable']; } if (isset($_REQUEST['single_table']) && in_array($_REQUEST['single_table'], array(true, false)) ) { $params['single_table'] = $_REQUEST['single_table']; } return basename(Core::getenv('SCRIPT_NAME')) . Url::getCommonRaw($params); } /** * Renders the link to open a new page * * @param string $url The url of the page * * @return string */ private function _getSelfLink($url) { $retval = ''; $retval .= '<div id="selflink" class="print_ignore">'; $retval .= '<a href="' . htmlspecialchars($url) . '"' . ' title="' . __('Open new phpMyAdmin window') . '" target="_blank" rel="noopener noreferrer">'; if (Util::showIcons('TabsMode')) { $retval .= Util::getImage( 'window-new', __('Open new phpMyAdmin window') ); } else { $retval .= __('Open new phpMyAdmin window'); } $retval .= '</a>'; $retval .= '</div>'; return $retval; } /** * Renders the link to open a new page * * @return string */ public function getErrorMessages() { $retval = ''; if ($GLOBALS['error_handler']->hasDisplayErrors()) { $retval .= $GLOBALS['error_handler']->getDispErrors(); } /** * Report php errors */ $GLOBALS['error_handler']->reportErrors(); return $retval; } /** * Saves query in history * * @return void */ private function _setHistory() { if (! Core::isValid($_REQUEST['no_history']) && empty($GLOBALS['error_message']) && ! empty($GLOBALS['sql_query']) && isset($GLOBALS['dbi']) && $GLOBALS['dbi']->isUserType('logged') ) { $this->relation->setHistory( Core::ifSetOr($GLOBALS['db'], ''), Core::ifSetOr($GLOBALS['table'], ''), $GLOBALS['cfg']['Server']['user'], $GLOBALS['sql_query'] ); } } /** * Disables the rendering of the footer * * @return void */ public function disable() { $this->_isEnabled = false; } /** * Set the ajax flag to indicate whether * we are servicing an ajax request * * @param bool $isAjax Whether we are servicing an ajax request * * @return void */ public function setAjax($isAjax) { $this->_isAjax = (boolean) $isAjax; } /** * Turn on minimal display mode * * @return void */ public function setMinimal() { $this->_isMinimal = true; } /** * Returns the Scripts object * * @return Scripts object */ public function getScripts() { return $this->_scripts; } /** * Renders the footer * * @return string */ public function getDisplay() { $retval = ''; $this->_setHistory(); if ($this->_isEnabled) { if (! $this->_isAjax) { $retval .= "</div>"; } if (! $this->_isAjax && ! $this->_isMinimal) { if (Core::getenv('SCRIPT_NAME') && empty($_POST) && ! $this->_isAjax ) { $url = $this->getSelfUrl(); $header = Response::getInstance()->getHeader(); $scripts = $header->getScripts()->getFiles(); $menuHash = $header->getMenu()->getHash(); // prime the client-side cache $this->_scripts->addCode( sprintf( 'if (! (history && history.pushState)) ' . 'PMA_MicroHistory.primer = {' . ' url: "%s",' . ' scripts: %s,' . ' menuHash: "%s"' . '};', Sanitize::escapeJsString($url), json_encode($scripts), Sanitize::escapeJsString($menuHash) ) ); } if (Core::getenv('SCRIPT_NAME') && ! $this->_isAjax ) { $url = $this->getSelfUrl(); $retval .= $this->_getSelfLink($url); } $this->_scripts->addCode( 'var debugSQLInfo = ' . $this->getDebugMessage() . ';' ); $retval .= '<div class="clearfloat" id="pma_errors">'; $retval .= $this->getErrorMessages(); $retval .= '</div>'; $retval .= $this->_scripts->getDisplay(); if ($GLOBALS['cfg']['DBG']['demo']) { $retval .= '<div id="pma_demo">'; $retval .= $this->_getDemoMessage(); $retval .= '</div>'; } $retval .= Config::renderFooter(); } if (! $this->_isAjax) { $retval .= "</body></html>"; } } return $retval; } }
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
Config | Folder | 0755 |
|
|
Controllers | Folder | 0755 |
|
|
Database | Folder | 0755 |
|
|
Dbi | Folder | 0755 |
|
|
Di | Folder | 0755 |
|
|
Display | Folder | 0755 |
|
|
Engines | Folder | 0755 |
|
|
Gis | Folder | 0755 |
|
|
Navigation | Folder | 0755 |
|
|
Plugins | Folder | 0755 |
|
|
Properties | Folder | 0755 |
|
|
Rte | Folder | 0755 |
|
|
Server | Folder | 0755 |
|
|
Twig | Folder | 0755 |
|
|
Utils | Folder | 0755 |
|
|
Advisor.php | File | 18.79 KB | 0644 |
|
Bookmark.php | File | 10.37 KB | 0644 |
|
BrowseForeigners.php | File | 10.73 KB | 0644 |
|
CentralColumns.php | File | 53.12 KB | 0644 |
|
Charsets.php | File | 24.92 KB | 0644 |
|
CheckUserPrivileges.php | File | 11.58 KB | 0644 |
|
Config.php | File | 59.69 KB | 0644 |
|
Console.php | File | 3.58 KB | 0644 |
|
Core.php | File | 38.98 KB | 0644 |
|
CreateAddField.php | File | 17.97 KB | 0644 |
|
DatabaseInterface.php | File | 103.86 KB | 0644 |
|
Encoding.php | File | 8.25 KB | 0644 |
|
Error.php | File | 13.05 KB | 0644 |
|
ErrorHandler.php | File | 16.68 KB | 0644 |
|
ErrorReport.php | File | 8.37 KB | 0644 |
|
Export.php | File | 40.32 KB | 0644 |
|
File.php | File | 20.53 KB | 0644 |
|
FileListing.php | File | 2.83 KB | 0644 |
|
Font.php | File | 4.25 KB | 0644 |
|
Footer.php | File | 10.54 KB | 0644 |
|
Header.php | File | 25.81 KB | 0644 |
|
Import.php | File | 55.59 KB | 0644 |
|
Index.php | File | 24.63 KB | 0644 |
|
IndexColumn.php | File | 4.43 KB | 0644 |
|
InsertEdit.php | File | 129.29 KB | 0644 |
|
IpAllowDeny.php | File | 9.21 KB | 0644 |
|
Language.php | File | 4.3 KB | 0644 |
|
LanguageManager.php | File | 23.42 KB | 0644 |
|
Linter.php | File | 5.1 KB | 0644 |
|
ListAbstract.php | File | 3.15 KB | 0644 |
|
ListDatabase.php | File | 4.22 KB | 0644 |
|
Logging.php | File | 2.56 KB | 0644 |
|
Menu.php | File | 22.34 KB | 0644 |
|
Message.php | File | 19.19 KB | 0644 |
|
Mime.php | File | 891 B | 0644 |
|
MultSubmits.php | File | 23.19 KB | 0644 |
|
Normalization.php | File | 39.03 KB | 0644 |
|
OpenDocument.php | File | 8.5 KB | 0644 |
|
Operations.php | File | 79.06 KB | 0644 |
|
OutputBuffering.php | File | 3.63 KB | 0644 |
|
ParseAnalyze.php | File | 2.46 KB | 0644 |
|
Partition.php | File | 7.26 KB | 0644 |
|
Pdf.php | File | 4.07 KB | 0644 |
|
Plugins.php | File | 21.42 KB | 0644 |
|
RecentFavoriteTable.php | File | 12.13 KB | 0644 |
|
Relation.php | File | 78.19 KB | 0644 |
|
RelationCleanup.php | File | 14.7 KB | 0644 |
|
Replication.php | File | 5.37 KB | 0644 |
|
ReplicationGui.php | File | 41.79 KB | 0644 |
|
Response.php | File | 16.31 KB | 0644 |
|
Sanitize.php | File | 14.15 KB | 0644 |
|
SavedSearches.php | File | 11.95 KB | 0644 |
|
Scripts.php | File | 5.33 KB | 0644 |
|
Session.php | File | 7.82 KB | 0644 |
|
Sql.php | File | 88.22 KB | 0644 |
|
SqlQueryForm.php | File | 17.19 KB | 0644 |
|
StorageEngine.php | File | 13.47 KB | 0644 |
|
SubPartition.php | File | 3.53 KB | 0644 |
|
SysInfo.php | File | 1.54 KB | 0644 |
|
SysInfoBase.php | File | 801 B | 0644 |
|
SysInfoLinux.php | File | 1.96 KB | 0644 |
|
SysInfoSunOS.php | File | 1.87 KB | 0644 |
|
SysInfoWINNT.php | File | 3.25 KB | 0644 |
|
SystemDatabase.php | File | 3.84 KB | 0644 |
|
Table.php | File | 92.59 KB | 0644 |
|
Template.php | File | 3.91 KB | 0644 |
|
Theme.php | File | 10.53 KB | 0644 |
|
ThemeManager.php | File | 10.73 KB | 0644 |
|
Tracker.php | File | 29.72 KB | 0644 |
|
Tracking.php | File | 41.99 KB | 0644 |
|
Transformations.php | File | 16.12 KB | 0644 |
|
TwoFactor.php | File | 7.1 KB | 0644 |
|
Types.php | File | 22.75 KB | 0644 |
|
Url.php | File | 8.17 KB | 0644 |
|
UserPassword.php | File | 8.47 KB | 0644 |
|
UserPreferences.php | File | 8.52 KB | 0644 |
|
Util.php | File | 162.99 KB | 0644 |
|
VersionInformation.php | File | 6.34 KB | 0644 |
|
ZipExtension.php | File | 9.98 KB | 0644 |
|