123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- <?php
- /* vim: set expandtab sw=4 ts=4 sts=4: */
- /**
- * holds the PMA_List_Database class
- *
- * @package PhpMyAdmin
- */
- if (! defined('PHPMYADMIN')) {
- exit;
- }
- /**
- * the list base class
- */
- require_once './libraries/List.class.php';
- /**
- * handles database lists
- *
- * <code>
- * $PMA_List_Database = new PMA_List_Database($userlink, $controllink);
- * </code>
- *
- * @todo this object should be attached to the PMA_Server object
- * @todo ? make use of INFORMATION_SCHEMA
- * @todo ? support --skip-showdatabases and user has only global rights
- *
- * @package PhpMyAdmin
- * @since phpMyAdmin 2.9.10
- */
- class PMA_List_Database extends PMA_List
- {
- /**
- * @var mixed database link resource|object to be used
- * @access protected
- */
- protected $db_link = null;
- /**
- * @var mixed user database link resource|object
- * @access protected
- */
- protected $db_link_user = null;
- /**
- * @var mixed controluser database link resource|object
- * @access protected
- */
- protected $db_link_control = null;
- /**
- * @var boolean whether SHOW DATABASES is disabled or not
- * @access protected
- */
- protected $show_databases_disabled = false;
- /**
- * @var string command to retrieve databases from server
- * @access protected
- */
- protected $command = null;
- /**
- * Constructor
- *
- * @param mixed $db_link_user user database link resource|object
- * @param mixed $db_link_control control database link resource|object
- *
- * @return void
- */
- public function __construct($db_link_user = null, $db_link_control = null)
- {
- $this->db_link = $db_link_user;
- $this->db_link_user = $db_link_user;
- $this->db_link_control = $db_link_control;
- parent::__construct();
- $this->build();
- }
- /**
- * checks if the configuration wants to hide some databases
- *
- * @return void
- */
- protected function checkHideDatabase()
- {
- if (empty($GLOBALS['cfg']['Server']['hide_db'])) {
- return;
- }
- foreach ($this->getArrayCopy() as $key => $db) {
- if (preg_match('/' . $GLOBALS['cfg']['Server']['hide_db'] . '/', $db)) {
- $this->offsetUnset($key);
- }
- }
- }
- /**
- * retrieves database list from server
- *
- * @param string $like_db_name usally a db_name containing wildcards
- *
- * @return array
- * @todo we could also search mysql tables if all fail?
- */
- protected function retrieve($like_db_name = null)
- {
- if ($this->show_databases_disabled) {
- return array();
- }
- if (null !== $like_db_name) {
- $command = "SHOW DATABASES LIKE '" . $like_db_name . "'";
- } elseif (null === $this->command) {
- $command = str_replace(
- '#user#', $GLOBALS['cfg']['Server']['user'],
- $GLOBALS['cfg']['Server']['ShowDatabasesCommand']
- );
- $this->command = $command;
- } else {
- $command = $this->command;
- }
- $database_list = PMA_DBI_fetch_result($command, null, null, $this->db_link);
- PMA_DBI_getError();
- if ($GLOBALS['errno'] !== 0) {
- // failed to get database list, try the control user
- // (hopefully there is one and he has SHOW DATABASES right)
- $this->db_link = $this->db_link_control;
- $database_list = PMA_DBI_fetch_result(
- $command, null, null, $this->db_link
- );
- PMA_DBI_getError();
- if ($GLOBALS['errno'] !== 0) {
- // failed! we will display a warning that phpMyAdmin could not safely
- // retrieve database list, the admin has to setup a control user or
- // allow SHOW DATABASES
- $GLOBALS['error_showdatabases'] = true;
- $this->show_databases_disabled = true;
- }
- }
- if ($GLOBALS['cfg']['NaturalOrder']) {
- natsort($database_list);
- } else {
- // need to sort anyway, otherwise information_schema
- // goes at the top
- sort($database_list);
- }
- return $database_list;
- }
- /**
- * builds up the list
- *
- * @return void
- */
- public function build()
- {
- if (! $this->checkOnlyDatabase()) {
- $items = $this->retrieve();
- $this->exchangeArray($items);
- }
- $this->checkHideDatabase();
- }
- /**
- * checks the only_db configuration
- *
- * @return boolean false if there is no only_db, otherwise true
- */
- protected function checkOnlyDatabase()
- {
- if (is_string($GLOBALS['cfg']['Server']['only_db'])
- && strlen($GLOBALS['cfg']['Server']['only_db'])
- ) {
- $GLOBALS['cfg']['Server']['only_db'] = array(
- $GLOBALS['cfg']['Server']['only_db']
- );
- }
- if (! is_array($GLOBALS['cfg']['Server']['only_db'])) {
- return false;
- }
- $items = array();
- foreach ($GLOBALS['cfg']['Server']['only_db'] as $each_only_db) {
- // check if the db name contains wildcard,
- // thus containing not escaped _ or %
- if (! preg_match('/(^|[^\\\\])(_|%)/', $each_only_db)) {
- // ... not contains wildcard
- $items[] = PMA_Util::unescapeMysqlWildcards($each_only_db);
- continue;
- }
- if (! $this->show_databases_disabled) {
- $items = array_merge($items, $this->retrieve($each_only_db));
- continue;
- }
- // @todo induce error, about not using wildcards
- // with SHOW DATABASE disabled?
- }
- $this->exchangeArray($items);
- return true;
- }
- /**
- * returns default item
- *
- * @return string default item
- */
- public function getDefault()
- {
- if (strlen($GLOBALS['db'])) {
- return $GLOBALS['db'];
- }
- return $this->getEmpty();
- }
- /**
- * this is just a backup, if all is fine this can be deleted later
- *
- * @deprecated
- * @return void
- */
- protected function checkAgainstPrivTables()
- {
- // 1. get allowed dbs from the "mysql.db" table
- // User can be blank (anonymous user)
- $local_query = "
- SELECT DISTINCT `Db` FROM `mysql`.`db`
- WHERE `Select_priv` = 'Y'
- AND `User`
- IN ('" . PMA_Util::sqlAddSlashes($GLOBALS['cfg']['Server']['user']) . "', '')";
- $tmp_mydbs = PMA_DBI_fetch_result(
- $local_query, null, null, $GLOBALS['controllink']
- );
- if ($tmp_mydbs) {
- // Will use as associative array of the following 2 code
- // lines:
- // the 1st is the only line intact from before
- // correction,
- // the 2nd replaces $dblist[] = $row['Db'];
- // Code following those 2 lines in correction continues
- // populating $dblist[], as previous code did. But it is
- // now populated with actual database names instead of
- // with regular expressions.
- $tmp_alldbs = PMA_DBI_query('SHOW DATABASES;', $GLOBALS['controllink']);
- // all databases cases - part 2
- if (isset($tmp_mydbs['%'])) {
- while ($tmp_row = PMA_DBI_fetch_row($tmp_alldbs)) {
- $dblist[] = $tmp_row[0];
- } // end while
- } else {
- while ($tmp_row = PMA_DBI_fetch_row($tmp_alldbs)) {
- $tmp_db = $tmp_row[0];
- if (isset($tmp_mydbs[$tmp_db]) && $tmp_mydbs[$tmp_db] == 1) {
- $dblist[] = $tmp_db;
- $tmp_mydbs[$tmp_db] = 0;
- } elseif (! isset($dblist[$tmp_db])) {
- foreach ($tmp_mydbs as $tmp_matchpattern => $tmp_value) {
- // fixed bad regexp
- // TODO: db names may contain characters
- // that are regexp instructions
- $re = '(^|(\\\\\\\\)+|[^\])';
- $tmp_regex = preg_replace(
- '/' . addcslashes($re, '/') . '%/',
- '\\1.*',
- preg_replace(
- '/' . addcslashes($re, '/') . '_/',
- '\\1.{1}',
- $tmp_matchpattern
- )
- );
- // Fixed db name matching
- // 2000-08-28 -- Benjamin Gandon
- if (preg_match('/^' . addcslashes($tmp_regex, '/') . '$/', $tmp_db)) {
- $dblist[] = $tmp_db;
- break;
- }
- } // end while
- } // end if ... elseif ...
- } // end while
- } // end else
- PMA_DBI_free_result($tmp_alldbs);
- unset($tmp_mydbs);
- } // end if
- // 2. get allowed dbs from the "mysql.tables_priv" table
- $local_query = 'SELECT DISTINCT `Db` FROM `mysql`.`tables_priv`';
- $local_query .= ' WHERE `Table_priv` LIKE \'%Select%\'';
- $local_query .= ' AND `User` = \'';
- $local_query .= PMA_Util::sqlAddSlashes($GLOBALS['cfg']['Server']['user']) . '\'';
- $rs = PMA_DBI_try_query($local_query, $GLOBALS['controllink']);
- if ($rs && @PMA_DBI_num_rows($rs)) {
- while ($row = PMA_DBI_fetch_assoc($rs)) {
- if (!in_array($row['Db'], $dblist)) {
- $dblist[] = $row['Db'];
- }
- } // end while
- PMA_DBI_free_result($rs);
- } // end if
- }
- }
- ?>
|