_server = $server; $this->_db = $db; $this->_table = $table; } /** * Prints the menu and the breadcrumbs * * @return void */ public function display() { echo $this->getDisplay(); } /** * Returns the menu and the breadcrumbs as a string * * @return string */ public function getDisplay() { $retval = $this->_getBreadcrumbs(); $retval .= $this->_getMenu(); return $retval; } /** * Returns hash for the menu and the breadcrumbs * * @return string */ public function getHash() { return substr( md5($this->_getMenu() . $this->_getBreadcrumbs()), 0, 8 ); } /** * Returns the menu as HTML * * @return string HTML formatted menubar */ private function _getMenu() { $url_params = array('db' => $this->_db); if (strlen($this->_table) > 0) { $tabs = $this->_getTableTabs(); $url_params['table'] = $this->_table; $level = 'table'; } else if (strlen($this->_db) > 0) { $tabs = $this->_getDbTabs(); $level = 'db'; } else { $tabs = $this->_getServerTabs(); $level = 'server'; } $allowedTabs = $this->_getAllowedTabs($level); foreach ($tabs as $key => $value) { if (! array_key_exists($key, $allowedTabs)) { unset($tabs[$key]); } } return Util::getHtmlTabs($tabs, $url_params, 'topmenu', true); } /** * Returns a list of allowed tabs for the current user for the given level * * @param string $level 'server', 'db' or 'table' level * * @return array list of allowed tabs */ private function _getAllowedTabs($level) { $cache_key = 'menu-levels-' . $level; if (Util::cacheExists($cache_key)) { return Util::cacheGet($cache_key); } $allowedTabs = Util::getMenuTabList($level); $cfgRelation = PMA_getRelationsParam(); if ($cfgRelation['menuswork']) { $groupTable = Util::backquote($cfgRelation['db']) . "." . Util::backquote($cfgRelation['usergroups']); $userTable = Util::backquote($cfgRelation['db']) . "." . Util::backquote($cfgRelation['users']); $sql_query = "SELECT `tab` FROM " . $groupTable . " WHERE `allowed` = 'N'" . " AND `tab` LIKE '" . $level . "%'" . " AND `usergroup` = (SELECT usergroup FROM " . $userTable . " WHERE `username` = '" . $GLOBALS['dbi']->escapeString($GLOBALS['cfg']['Server']['user']) . "')"; $result = PMA_queryAsControlUser($sql_query, false); if ($result) { while ($row = $GLOBALS['dbi']->fetchAssoc($result)) { $tabName = mb_substr( $row['tab'], mb_strpos($row['tab'], '_') + 1 ); unset($allowedTabs[$tabName]); } } } Util::cacheSet($cache_key, $allowedTabs); return $allowedTabs; } /** * Returns the breadcrumbs as HTML * * @return string HTML formatted breadcrumbs */ private function _getBreadcrumbs() { $retval = ''; $tbl_is_view = $GLOBALS['dbi']->getTable($this->_db, $this->_table) ->isView(); if (empty($GLOBALS['cfg']['Server']['host'])) { $GLOBALS['cfg']['Server']['host'] = ''; } $server_info = ! empty($GLOBALS['cfg']['Server']['verbose']) ? $GLOBALS['cfg']['Server']['verbose'] : $GLOBALS['cfg']['Server']['host']; $server_info .= empty($GLOBALS['cfg']['Server']['port']) ? '' : ':' . $GLOBALS['cfg']['Server']['port']; $separator = " ยป"; $item = ''; if (Util::showText('TabsMode')) { $item .= '%4$s: '; } $item .= '%3$s'; $retval .= "
"; $retval .= "
"; if (Util::showIcons('TabsMode')) { $retval .= Util::getImage( 's_host.png', '', array('class' => 'item') ); } $retval .= sprintf( $item, Util::getScriptNameForOption( $GLOBALS['cfg']['DefaultTabServer'], 'server' ), URL::getCommon(), htmlspecialchars($server_info), __('Server') ); if (strlen($this->_db) > 0) { $retval .= $separator; if (Util::showIcons('TabsMode')) { $retval .= Util::getImage( 's_db.png', '', array('class' => 'item') ); } $retval .= sprintf( $item, Util::getScriptNameForOption( $GLOBALS['cfg']['DefaultTabDatabase'], 'database' ), URL::getCommon(array('db' => $this->_db)), htmlspecialchars($this->_db), __('Database') ); // if the table is being dropped, $_REQUEST['purge'] is set to '1' // so do not display the table name in upper div if (strlen($this->_table) > 0 && ! (isset($_REQUEST['purge']) && $_REQUEST['purge'] == '1') ) { include './libraries/tbl_info.inc.php'; $retval .= $separator; if (Util::showIcons('TabsMode')) { $icon = $tbl_is_view ? 'b_views.png' : 's_tbl.png'; $retval .= Util::getImage( $icon, '', array('class' => 'item') ); } $retval .= sprintf( $item, Util::getScriptNameForOption( $GLOBALS['cfg']['DefaultTabTable'], 'table' ), URL::getCommon( array( 'db' => $this->_db, 'table' => $this->_table ) ), str_replace(' ', ' ', htmlspecialchars($this->_table)), $tbl_is_view ? __('View') : __('Table') ); /** * Displays table comment */ if (! empty($show_comment) && ! isset($GLOBALS['avoid_show_comment']) ) { if (mb_strstr($show_comment, '; InnoDB free')) { $show_comment = preg_replace( '@; InnoDB free:.*?$@', '', $show_comment ); } $retval .= '_db); /** * Displays table comment */ if (! empty($comment)) { $retval .= '"' . htmlspecialchars($comment) . '"'; } // end if } } } $retval .= '
'; $retval .= '
'; return $retval; } /** * Returns the table tabs as an array * * @return array Data for generating table tabs */ private function _getTableTabs() { $db_is_system_schema = $GLOBALS['dbi']->isSystemSchema($this->_db); $tbl_is_view = $GLOBALS['dbi']->getTable($this->_db, $this->_table) ->isView(); $updatable_view = false; if ($tbl_is_view) { $updatable_view = $GLOBALS['dbi']->getTable($this->_db, $this->_table) ->isUpdatableView(); } $is_superuser = $GLOBALS['dbi']->isSuperuser(); $isCreateOrGrantUser = $GLOBALS['dbi']->isUserType('grant') || $GLOBALS['dbi']->isUserType('create'); $tabs = array(); $tabs['browse']['icon'] = 'b_browse.png'; $tabs['browse']['text'] = __('Browse'); $tabs['browse']['link'] = 'sql.php'; $tabs['browse']['args']['pos'] = 0; $tabs['structure']['icon'] = 'b_props.png'; $tabs['structure']['link'] = 'tbl_structure.php'; $tabs['structure']['text'] = __('Structure'); $tabs['structure']['active'] = in_array( basename($GLOBALS['PMA_PHP_SELF']), array('tbl_structure.php', 'tbl_relation.php') ); $tabs['sql']['icon'] = 'b_sql.png'; $tabs['sql']['link'] = 'tbl_sql.php'; $tabs['sql']['text'] = __('SQL'); $tabs['search']['icon'] = 'b_search.png'; $tabs['search']['text'] = __('Search'); $tabs['search']['link'] = 'tbl_select.php'; $tabs['search']['active'] = in_array( basename($GLOBALS['PMA_PHP_SELF']), array('tbl_select.php', 'tbl_zoom_select.php', 'tbl_find_replace.php') ); if (! $db_is_system_schema && (! $tbl_is_view || $updatable_view)) { $tabs['insert']['icon'] = 'b_insrow.png'; $tabs['insert']['link'] = 'tbl_change.php'; $tabs['insert']['text'] = __('Insert'); } $tabs['export']['icon'] = 'b_tblexport.png'; $tabs['export']['link'] = 'tbl_export.php'; $tabs['export']['args']['single_table'] = 'true'; $tabs['export']['text'] = __('Export'); /** * Don't display "Import" for views and information_schema */ if (! $tbl_is_view && ! $db_is_system_schema) { $tabs['import']['icon'] = 'b_tblimport.png'; $tabs['import']['link'] = 'tbl_import.php'; $tabs['import']['text'] = __('Import'); } if (($is_superuser || $isCreateOrGrantUser) && ! $db_is_system_schema ) { $tabs['privileges']['link'] = 'server_privileges.php'; $tabs['privileges']['args']['checkprivsdb'] = $this->_db; $tabs['privileges']['args']['checkprivstable'] = $this->_table; // stay on table view $tabs['privileges']['args']['viewing_mode'] = 'table'; $tabs['privileges']['text'] = __('Privileges'); $tabs['privileges']['icon'] = 's_rights.png'; } /** * Don't display "Operations" for views and information_schema */ if (! $tbl_is_view && ! $db_is_system_schema) { $tabs['operation']['icon'] = 'b_tblops.png'; $tabs['operation']['link'] = 'tbl_operations.php'; $tabs['operation']['text'] = __('Operations'); } /** * Views support a limited number of operations */ if ($tbl_is_view && ! $db_is_system_schema) { $tabs['operation']['icon'] = 'b_tblops.png'; $tabs['operation']['link'] = 'view_operations.php'; $tabs['operation']['text'] = __('Operations'); } if (Tracker::isActive() && ! $db_is_system_schema) { $tabs['tracking']['icon'] = 'eye.png'; $tabs['tracking']['text'] = __('Tracking'); $tabs['tracking']['link'] = 'tbl_tracking.php'; } if (! $db_is_system_schema && Util::currentUserHasPrivilege( 'TRIGGER', $this->_db, $this->_table ) && ! $tbl_is_view ) { $tabs['triggers']['link'] = 'tbl_triggers.php'; $tabs['triggers']['text'] = __('Triggers'); $tabs['triggers']['icon'] = 'b_triggers.png'; } return $tabs; } /** * Returns the db tabs as an array * * @return array Data for generating db tabs */ private function _getDbTabs() { $db_is_system_schema = $GLOBALS['dbi']->isSystemSchema($this->_db); $num_tables = count($GLOBALS['dbi']->getTables($this->_db)); $is_superuser = $GLOBALS['dbi']->isSuperuser(); $isCreateOrGrantUser = $GLOBALS['dbi']->isUserType('grant') || $GLOBALS['dbi']->isUserType('create'); /** * Gets the relation settings */ $cfgRelation = PMA_getRelationsParam(); $tabs = array(); $tabs['structure']['link'] = 'db_structure.php'; $tabs['structure']['text'] = __('Structure'); $tabs['structure']['icon'] = 'b_props.png'; $tabs['sql']['link'] = 'db_sql.php'; $tabs['sql']['text'] = __('SQL'); $tabs['sql']['icon'] = 'b_sql.png'; $tabs['search']['text'] = __('Search'); $tabs['search']['icon'] = 'b_search.png'; $tabs['search']['link'] = 'db_search.php'; if ($num_tables == 0) { $tabs['search']['warning'] = __('Database seems to be empty!'); } $tabs['qbe']['text'] = __('Query'); $tabs['qbe']['icon'] = 's_db.png'; $tabs['qbe']['link'] = 'db_qbe.php'; if ($num_tables == 0) { $tabs['qbe']['warning'] = __('Database seems to be empty!'); } $tabs['export']['text'] = __('Export'); $tabs['export']['icon'] = 'b_export.png'; $tabs['export']['link'] = 'db_export.php'; if ($num_tables == 0) { $tabs['export']['warning'] = __('Database seems to be empty!'); } if (! $db_is_system_schema) { $tabs['import']['link'] = 'db_import.php'; $tabs['import']['text'] = __('Import'); $tabs['import']['icon'] = 'b_import.png'; $tabs['operation']['link'] = 'db_operations.php'; $tabs['operation']['text'] = __('Operations'); $tabs['operation']['icon'] = 'b_tblops.png'; if (($is_superuser || $isCreateOrGrantUser)) { $tabs['privileges']['link'] = 'server_privileges.php'; $tabs['privileges']['args']['checkprivsdb'] = $this->_db; // stay on database view $tabs['privileges']['args']['viewing_mode'] = 'db'; $tabs['privileges']['text'] = __('Privileges'); $tabs['privileges']['icon'] = 's_rights.png'; } $tabs['routines']['link'] = 'db_routines.php'; $tabs['routines']['text'] = __('Routines'); $tabs['routines']['icon'] = 'b_routines.png'; if (Util::currentUserHasPrivilege('EVENT', $this->_db)) { $tabs['events']['link'] = 'db_events.php'; $tabs['events']['text'] = __('Events'); $tabs['events']['icon'] = 'b_events.png'; } if (Util::currentUserHasPrivilege('TRIGGER', $this->_db)) { $tabs['triggers']['link'] = 'db_triggers.php'; $tabs['triggers']['text'] = __('Triggers'); $tabs['triggers']['icon'] = 'b_triggers.png'; } } if (Tracker::isActive() && ! $db_is_system_schema) { $tabs['tracking']['text'] = __('Tracking'); $tabs['tracking']['icon'] = 'eye.png'; $tabs['tracking']['link'] = 'db_tracking.php'; } if (! $db_is_system_schema) { $tabs['designer']['text'] = __('Designer'); $tabs['designer']['icon'] = 'b_relations.png'; $tabs['designer']['link'] = 'db_designer.php'; $tabs['designer']['id'] = 'designer_tab'; } if (! $db_is_system_schema && $cfgRelation['centralcolumnswork'] ) { $tabs['central_columns']['text'] = __('Central columns'); $tabs['central_columns']['icon'] = 'centralColumns.png'; $tabs['central_columns']['link'] = 'db_central_columns.php'; } return $tabs; } /** * Returns the server tabs as an array * * @return array Data for generating server tabs */ private function _getServerTabs() { $is_superuser = $GLOBALS['dbi']->isSuperuser(); $isCreateOrGrantUser = $GLOBALS['dbi']->isUserType('grant') || $GLOBALS['dbi']->isUserType('create'); if (Util::cacheExists('binary_logs')) { $binary_logs = Util::cacheGet('binary_logs'); } else { $binary_logs = $GLOBALS['dbi']->fetchResult( 'SHOW MASTER LOGS', 'Log_name', null, null, DatabaseInterface::QUERY_STORE ); Util::cacheSet('binary_logs', $binary_logs); } $tabs = array(); $tabs['databases']['icon'] = 's_db.png'; $tabs['databases']['link'] = 'server_databases.php'; $tabs['databases']['text'] = __('Databases'); $tabs['sql']['icon'] = 'b_sql.png'; $tabs['sql']['link'] = 'server_sql.php'; $tabs['sql']['text'] = __('SQL'); $tabs['status']['icon'] = 's_status.png'; $tabs['status']['link'] = 'server_status.php'; $tabs['status']['text'] = __('Status'); $tabs['status']['active'] = in_array( basename($GLOBALS['PMA_PHP_SELF']), array( 'server_status.php', 'server_status_advisor.php', 'server_status_monitor.php', 'server_status_queries.php', 'server_status_variables.php', 'server_status_processes.php' ) ); if ($is_superuser || $isCreateOrGrantUser) { $tabs['rights']['icon'] = 's_rights.png'; $tabs['rights']['link'] = 'server_privileges.php'; $tabs['rights']['text'] = __('User accounts'); $tabs['rights']['active'] = in_array( basename($GLOBALS['PMA_PHP_SELF']), array('server_privileges.php', 'server_user_groups.php') ); $tabs['rights']['args']['viewing_mode'] = 'server'; } $tabs['export']['icon'] = 'b_export.png'; $tabs['export']['link'] = 'server_export.php'; $tabs['export']['text'] = __('Export'); $tabs['import']['icon'] = 'b_import.png'; $tabs['import']['link'] = 'server_import.php'; $tabs['import']['text'] = __('Import'); $tabs['settings']['icon'] = 'b_tblops.png'; $tabs['settings']['link'] = 'prefs_manage.php'; $tabs['settings']['text'] = __('Settings'); $tabs['settings']['active'] = in_array( basename($GLOBALS['PMA_PHP_SELF']), array('prefs_forms.php', 'prefs_manage.php') ); if (! empty($binary_logs)) { $tabs['binlog']['icon'] = 's_tbl.png'; $tabs['binlog']['link'] = 'server_binlog.php'; $tabs['binlog']['text'] = __('Binary log'); } if ($is_superuser) { $tabs['replication']['icon'] = 's_replication.png'; $tabs['replication']['link'] = 'server_replication.php'; $tabs['replication']['text'] = __('Replication'); } $tabs['vars']['icon'] = 's_vars.png'; $tabs['vars']['link'] = 'server_variables.php'; $tabs['vars']['text'] = __('Variables'); $tabs['charset']['icon'] = 's_asci.png'; $tabs['charset']['link'] = 'server_collations.php'; $tabs['charset']['text'] = __('Charsets'); $tabs['engine']['icon'] = 'b_engine.png'; $tabs['engine']['link'] = 'server_engines.php'; $tabs['engine']['text'] = __('Engines'); $tabs['plugins']['icon'] = 'b_plugin.png'; $tabs['plugins']['link'] = 'server_plugins.php'; $tabs['plugins']['text'] = __('Plugins'); return $tabs; } /** * Set current table * * @param string $table Current table * * @return $this */ public function setTable($table) { $this->_table = $table; return $this; } }