getSystemSchemas(); $GLOBALS['proc_priv'] = false; $GLOBALS['db_priv'] = false; $GLOBALS['col_priv'] = false; $GLOBALS['table_priv'] = false; $rs_usr = $GLOBALS['dbi']->tryQuery('SHOW GRANTS'); if (! $rs_usr) { return; } $re0 = '(^|(\\\\\\\\)+|[^\\\\])'; // non-escaped wildcards $re1 = '(^|[^\\\\])(\\\)+'; // escaped wildcards while ($row = $GLOBALS['dbi']->fetchRow($rs_usr)) { list( $show_grants_str, $show_grants_dbname, $show_grants_tblname ) = self::getItemsFromShowGrantsRow($row[0]); if ($show_grants_dbname == '*') { if ($show_grants_str != 'USAGE') { $GLOBALS['dbs_to_test'] = false; } } elseif ($GLOBALS['dbs_to_test'] !== false) { $GLOBALS['dbs_to_test'][] = $show_grants_dbname; } if ( mb_strpos($show_grants_str,'RELOAD') !== false ) { $GLOBALS['is_reload_priv'] = true; } // check for the required privileges for adjust self::checkRequiredPrivilegesForAdjust( $show_grants_str, $show_grants_dbname, $show_grants_tblname ); /** * @todo if we find CREATE VIEW but not CREATE, do not offer * the create database dialog box */ if ($show_grants_str == 'ALL' || $show_grants_str == 'ALL PRIVILEGES' || $show_grants_str == 'CREATE' || strpos($show_grants_str, 'CREATE,') !== false ) { if ($show_grants_dbname == '*') { // a global CREATE privilege $GLOBALS['is_create_db_priv'] = true; $GLOBALS['is_reload_priv'] = true; $GLOBALS['db_to_create'] = ''; $GLOBALS['dbs_where_create_table_allowed'][] = '*'; // @todo we should not break here, cause GRANT ALL *.* // could be revoked by a later rule like GRANT SELECT ON db.* break; } else { // this array may contain wildcards $GLOBALS['dbs_where_create_table_allowed'][] = $show_grants_dbname; $dbname_to_test = Util::backquote($show_grants_dbname); if ($GLOBALS['is_create_db_priv']) { // no need for any more tests if we already know this continue; } // does this db exist? if ((preg_match('/' . $re0 . '%|_/', $show_grants_dbname) && ! preg_match('/\\\\%|\\\\_/', $show_grants_dbname)) || (! $GLOBALS['dbi']->tryQuery( 'USE ' . preg_replace( '/' . $re1 . '(%|_)/', '\\1\\3', $dbname_to_test ) ) && mb_substr($GLOBALS['dbi']->getError(), 1, 4) != 1044) ) { /** * Do not handle the underscore wildcard * (this case must be rare anyway) */ $GLOBALS['db_to_create'] = preg_replace( '/' . $re0 . '%/', '\\1', $show_grants_dbname ); $GLOBALS['db_to_create'] = preg_replace( '/' . $re1 . '(%|_)/', '\\1\\3', $GLOBALS['db_to_create'] ); $GLOBALS['is_create_db_priv'] = true; /** * @todo collect $GLOBALS['db_to_create'] into an array, * to display a drop-down in the "Create database" dialog */ // we don't break, we want all possible databases //break; } // end if } // end elseif } // end if } // end while $GLOBALS['dbi']->freeResult($rs_usr); // must also cacheUnset() them in // PhpMyAdmin\Plugins\Auth\AuthenticationCookie Util::cacheSet('is_create_db_priv', $GLOBALS['is_create_db_priv']); Util::cacheSet('is_reload_priv', $GLOBALS['is_reload_priv']); Util::cacheSet('db_to_create', $GLOBALS['db_to_create']); Util::cacheSet( 'dbs_where_create_table_allowed', $GLOBALS['dbs_where_create_table_allowed'] ); Util::cacheSet('dbs_to_test', $GLOBALS['dbs_to_test']); Util::cacheSet('proc_priv', $GLOBALS['proc_priv']); Util::cacheSet('table_priv', $GLOBALS['table_priv']); Util::cacheSet('col_priv', $GLOBALS['col_priv']); Util::cacheSet('db_priv', $GLOBALS['db_priv']); } // end function }