From 26bece58057cbdfbc58e23e54f83205e3d18dd8a Mon Sep 17 00:00:00 2001 From: Madhura Jayaratne Date: Thu, 6 Nov 2014 10:47:00 +0530 Subject: [PATCH] Use GRANTs to determine the list of dbs to show. Signed-off-by: Madhura Jayaratne --- libraries/navigation/Nodes/Node.class.php | 66 +++++++++++++++-------- 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/libraries/navigation/Nodes/Node.class.php b/libraries/navigation/Nodes/Node.class.php index 4814d17db5..93215921b1 100644 --- a/libraries/navigation/Nodes/Node.class.php +++ b/libraries/navigation/Nodes/Node.class.php @@ -384,9 +384,7 @@ class Node $query .= "ORDER BY SCHEMA_NAME ASC"; $retval = $GLOBALS['dbi']->fetchResult($query); } else { - if (! $GLOBALS['cfg']['Server']['DisableIS'] - || $GLOBALS['dbs_to_test'] === false - ) { + if ($GLOBALS['dbs_to_test'] === false) { $query = "SHOW DATABASES "; $query .= $this->_getWhereClause('Database', $searchClause); $handle = $GLOBALS['dbi']->tryQuery($query); @@ -464,9 +462,7 @@ class Node $query .= "LIMIT $pos, $maxItems"; $retval = $GLOBALS['dbi']->fetchResult($query); } else { - if (! $GLOBALS['cfg']['Server']['DisableIS'] - || $GLOBALS['dbs_to_test'] === false - ) { + if ($GLOBALS['dbs_to_test'] === false) { $retval = array(); $query = "SHOW DATABASES "; $query .= $this->_getWhereClause('Database', $searchClause); @@ -530,19 +526,37 @@ class Node $query .= ") t "; $retval = (int)$GLOBALS['dbi']->fetchValue($query); } else { - $query = "SHOW DATABASES "; - $query .= $this->_getWhereClause('Database', $searchClause); - $handle = $GLOBALS['dbi']->tryQuery($query); - if ($handle !== false) { + if ($GLOBALS['dbs_to_test'] === false) { $prefixMap = array(); - while ($arr = $GLOBALS['dbi']->fetchArray($handle)) { - $prefix = strstr($arr[0], $dbSeparator, true); - if ($prefix === false) { - $prefix = $arr[0]; + $query = "SHOW DATABASES "; + $query .= $this->_getWhereClause('Database', $searchClause); + $handle = $GLOBALS['dbi']->tryQuery($query); + if ($handle !== false) { + while ($arr = $GLOBALS['dbi']->fetchArray($handle)) { + $prefix = strstr($arr[0], $dbSeparator, true); + if ($prefix === false) { + $prefix = $arr[0]; + } + $prefixMap[$prefix] = 1; } - $prefixMap[$prefix] = 1; } - return count($prefixMap); + $retval = count($prefixMap); + } else { + $prefixMap = array(); + foreach ($GLOBALS['dbs_to_test'] as $db_to_test) { + $query = "SHOW DATABASES LIKE '" . $db_to_test . "'"; + $handle = $GLOBALS['dbi']->tryQuery($query); + if ($handle !== false) { + while ($arr = $GLOBALS['dbi']->fetchArray($handle)) { + $prefix = strstr($arr[0], $dbSeparator, true); + if ($prefix === false) { + $prefix = $arr[0]; + } + $prefixMap[$prefix] = 1; + } + } + } + $retval = count($prefixMap); } } } else { @@ -552,11 +566,21 @@ class Node $query .= $this->_getWhereClause('SCHEMA_NAME', $searchClause); $retval = (int)$GLOBALS['dbi']->fetchValue($query); } else { - $query = "SHOW DATABASES "; - $query .= $this->_getWhereClause('Database', $searchClause); - $retval = $GLOBALS['dbi']->numRows( - $GLOBALS['dbi']->tryQuery($query) - ); + if ($GLOBALS['dbs_to_test'] === false) { + $query = "SHOW DATABASES "; + $query .= $this->_getWhereClause('Database', $searchClause); + $retval = $GLOBALS['dbi']->numRows( + $GLOBALS['dbi']->tryQuery($query) + ); + } else { + $retval = 0; + foreach ($GLOBALS['dbs_to_test'] as $db_to_test) { + $query = "SHOW DATABASES LIKE '" . $db_to_test . "'"; + $retval += $GLOBALS['dbi']->numRows( + $GLOBALS['dbi']->tryQuery($query) + ); + } + } } } return $retval;