strlen($key))&&(substr($size, strlen($size) - strlen($key))==$key)) {
$size = substr($size, 0, strlen($size) - strlen($key)) * $scan[$key];
break;
}
}
return $size;
} // end function
if (!$filesize = ini_get('upload_max_filesize')) {
$filesize = "5M";
}
$max_upload_size = get_real_size($filesize);
if ($postsize = ini_get('post_max_size')) {
$postsize = get_real_size($postsize);
if ($postsize < $max_upload_size) {
$max_upload_size = $postsize;
}
}
unset($filesize);
unset($postsize);
/**
* other functions for maximum upload work
*/
/**
* Displays the maximum size for an upload
*
* @param integer the size
*
* @return string the message
*
* @access public
*/
function PMA_displayMaximumUploadSize($max_upload_size) {
list($max_size, $max_unit) = PMA_formatByteDown($max_upload_size);
return '(' . sprintf($GLOBALS['strMaximumSize'], $max_size, $max_unit) . ')';
}
/**
* Generates a hidden field which should indicate to the browser
* the maximum size for upload
*
* @param integer the size
*
* @return string the INPUT field
*
* @access public
*/
function PMA_generateHiddenMaxFileSize($max_size){
return '';
}
/**
* Charset conversion.
*/
require_once('./libraries/charset_conversion.lib.php');
}
if ($is_minimum_common == FALSE) {
/**
* String handling
*/
require_once('./libraries/string.lib.php');
}
// If zlib output compression is set in the php configuration file, no
// output buffering should be run
if (@ini_get('zlib.output_compression')) {
$cfg['OBGzip'] = FALSE;
}
// disable output-buffering (if set to 'auto') for IE6, else enable it.
if (strtolower($cfg['OBGzip']) == 'auto') {
if (PMA_USR_BROWSER_AGENT == 'IE' && PMA_USR_BROWSER_VER >= 6 && PMA_USR_BROWSER_VER < 7) {
$cfg['OBGzip'] = FALSE;
} else {
$cfg['OBGzip'] = TRUE;
}
}
if ($is_minimum_common == FALSE) {
/**
* Include URL/hidden inputs generating.
*/
require_once('./libraries/url_generating.lib.php');
/**
* Loads the mysql extensions if it is not loaded yet
*/
if (!@function_exists('mysql_connect')) {
PMA_dl('mysql');
}
// check whether mysql is available
if (!@function_exists('mysql_connect')) {
if (empty($is_header_sent)) {
require_once('./libraries/header_http.inc.php');
}
echo $strCantLoadMySQL . ' ' . "\n"
. '' . $GLOBALS['strDocu'] . '' . "\n";
exit();
}
/**
* Now that we know that MySQL is loaded, we can determine the MySQL
* client API version
*/
if (!defined('PMA_MYSQL_CLIENT_API')) {
if (function_exists('mysql_get_client_info')) {
$client_api = explode('.', mysql_get_client_info());
define('PMA_MYSQL_CLIENT_API', (int)sprintf('%d%02d%02d', $client_api[0], $client_api[1], intval($client_api[2])));
unset($client_api);
} else {
define('PMA_MYSQL_CLIENT_API', 32332); // always expect the worst...
}
}
/**
* Add slashes before "'" and "\" characters so a value containing them can
* be used in a sql comparison.
*
* @param string the string to slash
* @param boolean whether the string will be used in a 'LIKE' clause
* (it then requires two more escaped sequences) or not
* @param boolean whether to treat cr/lfs as escape-worthy entities
* (converts \n to \\n, \r to \\r)
*
* @return string the slashed string
*
* @access public
*/
function PMA_sqlAddslashes($a_string = '', $is_like = FALSE, $crlf = FALSE)
{
if ($is_like) {
$a_string = str_replace('\\', '\\\\\\\\', $a_string);
} else {
$a_string = str_replace('\\', '\\\\', $a_string);
}
if ($crlf) {
$a_string = str_replace("\n", '\n', $a_string);
$a_string = str_replace("\r", '\r', $a_string);
$a_string = str_replace("\t", '\t', $a_string);
}
$a_string = str_replace('\'', '\\\'', $a_string);
return $a_string;
} // end of the 'PMA_sqlAddslashes()' function
/**
* Add slashes before "_" and "%" characters for using them in MySQL
* database, table and field names.
* Note: This function does not escape backslashes!
*
* @param string the string to escape
*
* @return string the escaped string
*
* @access public
*/
function PMA_escape_mysql_wildcards($name)
{
$name = str_replace('_', '\\_', $name);
$name = str_replace('%', '\\%', $name);
return $name;
} // end of the 'PMA_escape_mysql_wildcards()' function
/**
* format sql strings
*
* @param mixed pre-parsed SQL structure
*
* @return string the formatted sql
*
* @global array the configuration array
* @global boolean whether the current statement is a multiple one or not
*
* @access public
*
* @author Robin Johnson
*/
function PMA_formatSql($parsed_sql, $unparsed_sql = '')
{
global $cfg;
// Check that we actually have a valid set of parsed data
// well, not quite
// first check for the SQL parser having hit an error
if (PMA_SQP_isError()) {
return $parsed_sql;
}
// then check for an array
if (!is_array($parsed_sql)) {
// We don't so just return the input directly
// This is intended to be used for when the SQL Parser is turned off
$formatted_sql = '
";
} else {
$formatted_sql = PMA_SQP_formatNone($parsed_sql);
}
break;
case 'html':
$formatted_sql = PMA_SQP_formatHtml($parsed_sql,'color');
break;
case 'text':
//$formatted_sql = PMA_SQP_formatText($parsed_sql);
$formatted_sql = PMA_SQP_formatHtml($parsed_sql,'text');
break;
default:
break;
} // end switch
return $formatted_sql;
} // end of the "PMA_formatSql()" function
/**
* Displays a link to the official MySQL documentation
*
* @param chapter of "HTML, one page per chapter" documentation
* @param contains name of page/anchor that is being linked
*
* @return string the html link
*
* @access public
*/
function PMA_showMySQLDocu($chapter, $link)
{
if (!empty($GLOBALS['cfg']['MySQLManualBase'])) {
if (!empty($GLOBALS['cfg']['MySQLManualType'])) {
switch ($GLOBALS['cfg']['MySQLManualType']) {
case 'old':
return '[' . $GLOBALS['strDocu'] . ']';
case 'chapters':
return '[' . $GLOBALS['strDocu'] . ']';
case 'big':
return '[' . $GLOBALS['strDocu'] . ']';
case 'none':
return '';
case 'searchable':
default:
return '[' . $GLOBALS['strDocu'] . ']';
}
} else {
// no Type defined, show the old one
return '[' . $GLOBALS['strDocu'] . ']';
}
} else {
// no URL defined
if (!empty($GLOBALS['cfg']['ManualBaseShort'])) {
// the old configuration
return '[' . $GLOBALS['strDocu'] . ']';
} else {
return '';
}
}
} // end of the 'PMA_showDocu()' function
/**
* Displays a MySQL error message in the right frame.
*
* @param string the error mesage
* @param string the sql query that failed
* @param boolean whether to show a "modify" link or not
* @param string the "back" link url (full path is not required)
* @param boolean EXIT the page?
*
* @global array the configuration array
*
* @access public
*/
function PMA_mysqlDie($error_message = '', $the_query = '',
$is_modify_link = TRUE, $back_url = '',
$exit = TRUE)
{
global $cfg, $table, $db, $sql_query;
require_once('./header.inc.php');
if (!$error_message) {
$error_message = PMA_mysql_error();
}
if (!$the_query && !empty($GLOBALS['sql_query'])) {
$the_query = $GLOBALS['sql_query'];
}
// --- Added to solve bug #641765
// Robbat2 - 12 January 2003, 9:46PM
// Revised, Robbat2 - 13 Janurary 2003, 2:59PM
if (!function_exists('PMA_SQP_isError') || PMA_SQP_isError()) {
$formatted_sql = htmlspecialchars($the_query);
} else {
$formatted_sql = PMA_formatSql(PMA_SQP_parse($the_query), $the_query);
}
// ---
echo '
'. $GLOBALS['strError'] . '
' . "\n";
// if the config password is wrong, or the MySQL server does not
// respond, do not show the query that would reveal the
// username/password
if (!empty($the_query) && !strstr($the_query, 'connect')) {
// --- Added to solve bug #641765
// Robbat2 - 12 January 2003, 9:46PM
// Revised, Robbat2 - 13 Janurary 2003, 2:59PM
if (function_exists('PMA_SQP_isError') && PMA_SQP_isError()) {
echo PMA_SQP_getErrorString();
}
// ---
echo '
' . "\n";
// The error message will be displayed within a CODE segment.
// To preserve original formatting, but allow wordwrapping, we do a couple of replacements
// Replace all non-single blanks with their HTML-counterpart
$error_message = str_replace(' ', ' ', $error_message);
// Replace TAB-characters with their HTML-counterpart
$error_message = str_replace("\t", ' ', $error_message);
// Replace linebreaks
$error_message = nl2br($error_message);
echo '' . "\n"
. $error_message . "\n"
. '
' . "\n";
echo PMA_showMySQLDocu('Error-returns', 'Error-returns');
if (!empty($back_url) && $exit) {
echo ' · [' . $GLOBALS['strBack'] . ']';
}
echo "\n";
if ($exit) {
require_once('./footer.inc.php');
}
} // end of the 'PMA_mysqlDie()' function
/**
* Defines whether a string exists inside an array or not
*
* @param string string to search for
* @param mixed array to search into
*
* @return integer the rank of the $toFind string in the array or '-1' if
* it hasn't been found
*
* @access public
*/
function PMA_isInto($toFind = '', &$in)
{
$max = count($in);
for ($i = 0; $i < $max && ($toFind != $in[$i]); $i++) {
// void();
}
return ($i < $max) ? $i : -1;
} // end of the 'PMA_isInto()' function
}
/**
* Get the complete list of Databases a user can access
*
* @param boolean whether to include check on failed 'only_db' operations
* @param ressource database handle (superuser)
* @param integer amount of databases inside the 'only_db' container
* @param ressource possible ressource from a failed previous query
* @param ressource database handle (user)
* @param array configuration
* @param array previous list of databases
*
* @return array all databases a user has access to
*
* @access private
*/
function PMA_safe_db_list($only_db_check, $dbh, $dblist_cnt, $rs, $userlink, $cfg, $dblist) {
if ($only_db_check == FALSE) {
// ... first checks whether the "safe_show_database" is on or not
// (if MYSQL supports this)
$is_safe_show_dbs = FALSE;
if (PMA_MYSQL_INT_VERSION >= 40002) {
$is_safe_show_dbs = 'ON';
}
else {
$local_query = 'SHOW VARIABLES LIKE \'safe\\_show\\_database\'';
$rs = PMA_mysql_query($local_query, $dbh); // Debug: or PMA_mysqlDie('', $local_query, FALSE);
$is_safe_show_dbs = ($rs) ? @PMA_mysql_result($rs, 0, 'Value') : FALSE;
mysql_free_result($rs);
}
// ... and if on, try to get the available dbs list
if ($is_safe_show_dbs && strtoupper($is_safe_show_dbs) != 'OFF') {
$uva_alldbs = mysql_list_dbs($userlink);
while ($uva_row = PMA_mysql_fetch_array($uva_alldbs)) {
$dblist[] = $uva_row[0];
} // end while
$dblist_cnt = count($dblist);
unset($uva_alldbs);
} // end if ($is_safe_show_dbs)
// ... else checks for available databases in the "mysql" db
if (!$dblist_cnt) {
$auth_query = 'SELECT User, Select_priv '
. 'FROM mysql.user '
. 'WHERE User = \'' . PMA_sqlAddslashes($cfg['Server']['user']) . '\'';
$rs = PMA_mysql_query($auth_query, $dbh); // Debug: or PMA_mysqlDie('', $auth_query, FALSE);
} // end
}
// Access to "mysql" db allowed and dblist still empty -> gets the
// usable db list
if (!$dblist_cnt
&& ($rs && @mysql_numrows($rs))) {
$row = PMA_mysql_fetch_array($rs);
mysql_free_result($rs);
// Correction uva 19991215
// Previous code assumed database "mysql" admin table "db" column
// "db" contains literal name of user database, and works if so.
// Mysql usage generally (and uva usage specifically) allows this
// column to contain regular expressions (we have all databases
// owned by a given student/faculty/staff beginning with user i.d.
// and governed by default by a single set of privileges with
// regular expression as key). This breaks previous code.
// This maintenance is to fix code to work correctly for regular
// expressions.
if ($row['Select_priv'] != 'Y') {
// 1. get allowed dbs from the "mysql.db" table
// lem9: User can be blank (anonymous user)
$local_query = 'SELECT DISTINCT Db FROM mysql.db WHERE Select_priv = \'Y\' AND (User = \'' . PMA_sqlAddslashes($cfg['Server']['user']) . '\' OR User = \'\')';
$rs = PMA_mysql_query($local_query, $dbh); // Debug: or PMA_mysqlDie('', $local_query, FALSE);
if ($rs && @mysql_numrows($rs)) {
// 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'];
$uva_mydbs = array();
// 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.
while ($row = PMA_mysql_fetch_array($rs)) {
// loic1: all databases cases - part 1
if (empty($row['Db']) || $row['Db'] == '%') {
$uva_mydbs['%'] = 1;
break;
}
// loic1: avoid multiple entries for dbs
if (!isset($uva_mydbs[$row['Db']])) {
$uva_mydbs[$row['Db']] = 1;
}
} // end while
mysql_free_result($rs);
$uva_alldbs = mysql_list_dbs($dbh);
// loic1: all databases cases - part 2
if (isset($uva_mydbs['%'])) {
while ($uva_row = PMA_mysql_fetch_array($uva_alldbs)) {
$dblist[] = $uva_row[0];
} // end while
} // end if
else {
while ($uva_row = PMA_mysql_fetch_array($uva_alldbs)) {
$uva_db = $uva_row[0];
if (isset($uva_mydbs[$uva_db]) && $uva_mydbs[$uva_db] == 1) {
$dblist[] = $uva_db;
$uva_mydbs[$uva_db] = 0;
} else if (!isset($dblist[$uva_db])) {
foreach($uva_mydbs AS $uva_matchpattern => $uva_value) {
// loic1: fixed bad regexp
// TODO: db names may contain characters
// that are regexp instructions
$re = '(^|(\\\\\\\\)+|[^\])';
$uva_regex = ereg_replace($re . '%', '\\1.*', ereg_replace($re . '_', '\\1.{1}', $uva_matchpattern));
// Fixed db name matching
// 2000-08-28 -- Benjamin Gandon
if (ereg('^' . $uva_regex . '$', $uva_db)) {
$dblist[] = $uva_db;
break;
}
} // end while
} // end if ... else if....
} // end while
} // end else
mysql_free_result($uva_alldbs);
unset($uva_mydbs);
} // end if
// 2. get allowed dbs from the "mysql.tables_priv" table
$local_query = 'SELECT DISTINCT Db FROM mysql.tables_priv WHERE Table_priv LIKE \'%Select%\' AND User = \'' . PMA_sqlAddslashes($cfg['Server']['user']) . '\'';
$rs = PMA_mysql_query($local_query, $dbh); // Debug: or PMA_mysqlDie('', $local_query, FALSE);
if ($rs && @mysql_numrows($rs)) {
while ($row = PMA_mysql_fetch_array($rs)) {
if (PMA_isInto($row['Db'], $dblist) == -1) {
$dblist[] = $row['Db'];
}
} // end while
mysql_free_result($rs);
} // end if
} // end if
} // end building available dbs from the "mysql" db
return $dblist;
}
/**
* Determines the font sizes to use depending on the os and browser of the
* user.
*
* This function is based on an article from phpBuilder (see
* http://www.phpbuilder.net/columns/tim20000821.php).
*
* @return boolean always true
*
* @global string the standard font size
* @global string the font size for titles
* @global string the small font size
* @global string the smallest font size
*
* @access public
*
* @version 1.1
*/
function PMA_setFontSizes()
{
global $font_size, $font_biggest, $font_bigger, $font_smaller, $font_smallest;
// IE (<6)/Opera (<7) for win case: needs smaller fonts than anyone else
if (PMA_USR_OS == 'Win'
&& ((PMA_USR_BROWSER_AGENT == 'IE' && PMA_USR_BROWSER_VER < 6)
|| (PMA_USR_BROWSER_AGENT == 'OPERA' && PMA_USR_BROWSER_VER < 7))) {
$font_size = 'x-small';
$font_biggest = 'large';
$font_bigger = 'medium';
$font_smaller = '90%';
$font_smallest = '7pt';
}
// IE6 and other browsers for win case
else if (PMA_USR_OS == 'Win') {
$font_size = 'small';
$font_biggest = 'large';
$font_bigger = 'medium';
$font_smaller = (PMA_USR_BROWSER_AGENT == 'IE')
? '90%'
: 'x-small';
$font_smallest = 'x-small';
}
// Some mac browsers need also smaller default fonts size (OmniWeb &
// Opera)...
// and a beta version of Safari did also, but not the final 1.0 version
// so I remove || PMA_USR_BROWSER_AGENT == 'SAFARI'
// but we got a report that Safari 1.0 build 85.5 needs it!
else if (PMA_USR_OS == 'Mac'
&& (PMA_USR_BROWSER_AGENT == 'OMNIWEB' || PMA_USR_BROWSER_AGENT == 'OPERA' || PMA_USR_BROWSER_AGENT == 'SAFARI')) {
$font_size = 'x-small';
$font_biggest = 'large';
$font_bigger = 'medium';
$font_smaller = '90%';
$font_smallest = '7pt';
}
// ... but most of them (except IE 5+ & NS 6+) need bigger fonts
else if ((PMA_USR_OS == 'Mac'
&& ((PMA_USR_BROWSER_AGENT != 'IE' && PMA_USR_BROWSER_AGENT != 'MOZILLA')
|| PMA_USR_BROWSER_VER < 5))
|| PMA_USR_BROWSER_AGENT == 'KONQUEROR') {
$font_size = 'medium';
$font_biggest = 'x-large';
$font_bigger = 'large';
$font_smaller = 'small';
$font_smallest = 'x-small';
}
// OS/2 browser
else if (PMA_USR_OS == 'OS/2'
&& PMA_USR_BROWSER_AGENT == 'OPERA') {
$font_size = 'small';
$font_biggest = 'medium';
$font_bigger = 'medium';
$font_smaller = 'x-small';
$font_smallest = 'x-small';
}
else {
$font_size = 'small';
$font_biggest = 'large';
$font_bigger = 'medium';
$font_smaller = 'x-small';
$font_smallest = 'x-small';
}
return TRUE;
} // end of the 'PMA_setFontSizes()' function
if ($is_minimum_common == FALSE) {
/**
* $cfg['PmaAbsoluteUri'] is a required directive else cookies won't be
* set properly and, depending on browsers, inserting or updating a
* record might fail
*/
$display_pmaAbsoluteUri_warning = 0;
// Olivier: Setup a default value to let the people and lazy syadmins
// work anyway, but display a big warning on the main.php
// page.
if (empty($cfg['PmaAbsoluteUri'])) {
if (!empty($_SERVER)) {
$SERVER_ARRAY = '_SERVER';
} else {
$SERVER_ARRAY = 'GLOBALS';
} // end if
if (isset(${$SERVER_ARRAY}['HTTP_HOST'])) {
$HTTP_HOST = ${$SERVER_ARRAY}['HTTP_HOST'];
}
if (isset(${$SERVER_ARRAY}['HTTPS'])) {
$HTTPS = ${$SERVER_ARRAY}['HTTPS'];
}
if (isset(${$SERVER_ARRAY}['SERVER_PORT'])) {
$SERVER_PORT = ${$SERVER_ARRAY}['SERVER_PORT'];
}
if (isset(${$SERVER_ARRAY}['REQUEST_URI'])) {
$REQUEST_URI = ${$SERVER_ARRAY}['REQUEST_URI'];
}
if (isset(${$SERVER_ARRAY}['PATH_INFO'])) {
$PATH_INFO = ${$SERVER_ARRAY}['PATH_INFO'];
}
if (isset(${$SERVER_ARRAY}['HTTP_SCHEME'])) {
$HTTP_SCHEME = ${$SERVER_ARRAY}['HTTP_SCHEME'];
}
if (!empty($HTTP_SCHEME)) {
$cfg['PmaAbsoluteUri'] = $HTTP_SCHEME . '://';
} else {
$cfg['PmaAbsoluteUri'] = ((!empty($HTTPS) && strtolower($HTTPS) != 'off') ? 'https' : 'http') . '://';
}
$port_in_HTTP_HOST = (strpos($HTTP_HOST, ':') > 0);
$cfg['PmaAbsoluteUri'] .= $HTTP_HOST;
// if $cfg['PmaAbsoluteUri'] is empty and port == 80 or port == 443, do not add ":80" or ":443"
// to the generated URL -> prevents a double password query in case of http authentication.
if (!(!$port_in_HTTP_HOST && !empty($SERVER_PORT) && ($SERVER_PORT == 80 || $SERVER_PORT == 443))) {
$cfg['PmaAbsoluteUri'] .= ((!empty($SERVER_PORT) && !$port_in_HTTP_HOST) ? ':' . $SERVER_PORT : '');
}
// rabus: if php is in CGI mode, $PHP_SELF often contains the path to the CGI executable.
// This is why we try to get the path from $REQUEST_URI or $PATH_INFO first.
if (isset($REQUEST_URI)) {
$cfg['PmaAbsoluteUri'] .= substr($REQUEST_URI, 0, strrpos($REQUEST_URI, '/') + 1);
} else if (isset($PATH_INFO)) {
$cfg['PmaAbsoluteUri'] .= substr($PATH_INFO, 0, strrpos($PATH_INFO, '/') + 1);
} else {
$cfg['PmaAbsoluteUri'] .= substr($PHP_SELF, 0, strrpos($PHP_SELF, '/') + 1);
}
// We display the warning by default, but not if it is disabled thru
// via the $cfg['PmaAbsoluteUri_DisableWarning'] variable.
// This is intended for sysadmins that actually want the default
// behaviour of auto-detection due to their setup.
// See the mailing list message:
// http://sourceforge.net/mailarchive/forum.php?thread_id=859093&forum_id=2141
if ($cfg['PmaAbsoluteUri_DisableWarning'] == FALSE) {
$display_pmaAbsoluteUri_warning = 1;
}
} else {
// The URI is specified, however users do often specify this
// wrongly, so we try to fix this.
// Adds a trailing slash et the end of the phpMyAdmin uri if it
// does not exist.
if (substr($cfg['PmaAbsoluteUri'], -1) != '/') {
$cfg['PmaAbsoluteUri'] .= '/';
}
// If URI doesn't start with http:// or https://, we will add
// this.
if (substr($cfg['PmaAbsoluteUri'], 0, 7) != 'http://' && substr($cfg['PmaAbsoluteUri'], 0, 8) != 'https://') {
if (!empty($_SERVER)) {
$SERVER_ARRAY = '_SERVER';
} else {
$SERVER_ARRAY = 'GLOBALS';
} // end if
if (isset(${$SERVER_ARRAY}['HTTPS'])) {
$HTTPS = ${$SERVER_ARRAY}['HTTPS'];
}
$cfg['PmaAbsoluteUri'] = ((!empty($HTTPS) && strtolower($HTTPS) != 'off') ? 'https' : 'http') . ':'
. (substr($cfg['PmaAbsoluteUri'], 0, 2) == '//' ? '' : '//')
. $cfg['PmaAbsoluteUri'];
}
}
/**
* Use mysql_connect() or mysql_pconnect()?
*/
$connect_func = ($cfg['PersistentConnections']) ? 'mysql_pconnect' : 'mysql_connect';
$dblist = array();
/**
* Gets the valid servers list and parameters
*/
foreach($cfg['Servers'] AS $key => $val) {
// Don't use servers with no hostname
if ( ($val['connect_type'] == 'tcp') && empty($val['host'])) {
unset($cfg['Servers'][$key]);
}
// Final solution to bug #582890
// If we are using a socket connection
// and there is nothing in the verbose server name
// or the host field, then generate a name for the server
// in the form of "Server 2", localized of course!
if ( ($val['connect_type'] == 'socket') && empty($val['host']) && empty($val['verbose']) ) {
$cfg['Servers'][$key]['verbose'] = sprintf($GLOBALS['strServer'], $key);
$val['verbose'] = sprintf($GLOBALS['strServer'],$key);
}
}
if (empty($server) || !isset($cfg['Servers'][$server]) || !is_array($cfg['Servers'][$server])) {
$server = $cfg['ServerDefault'];
}
/**
* If no server is selected, make sure that $cfg['Server'] is empty (so
* that nothing will work), and skip server authentication.
* We do NOT exit here, but continue on without logging into any server.
* This way, the welcome page will still come up (with no server info) and
* present a choice of servers in the case that there are multiple servers
* and '$cfg['ServerDefault'] = 0' is set.
*/
if ($server == 0) {
$cfg['Server'] = array();
}
/**
* Otherwise, set up $cfg['Server'] and do the usual login stuff.
*/
else if (isset($cfg['Servers'][$server])) {
$cfg['Server'] = $cfg['Servers'][$server];
// Check how the config says to connect to the server
$server_port = (empty($cfg['Server']['port']))
? ''
: ':' . $cfg['Server']['port'];
if (strtolower($cfg['Server']['connect_type']) == 'tcp') {
$cfg['Server']['socket'] = '';
}
$server_socket = (empty($cfg['Server']['socket']))
? ''
: ':' . $cfg['Server']['socket'];
if (PMA_MYSQL_CLIENT_API >= 32349) {
$client_flags = $cfg['Server']['compress'] && defined('MYSQL_CLIENT_COMPRESS') ? MYSQL_CLIENT_COMPRESS : 0;
}
// Gets the authentication library that fits the $cfg['Server'] settings
// and run authentication
// (for a quick check of path disclosure in auth/cookies:)
$coming_from_common = TRUE;
require_once('./libraries/auth/' . $cfg['Server']['auth_type'] . '.auth.lib.php');
if (!PMA_auth_check()) {
PMA_auth();
} else {
PMA_auth_set_user();
}
// Check IP-based Allow/Deny rules as soon as possible to reject the
// user
// Based on mod_access in Apache:
// http://cvs.apache.org/viewcvs.cgi/httpd-2.0/modules/aaa/mod_access.c?rev=1.37&content-type=text/vnd.viewcvs-markup
// Look at: "static int check_dir_access(request_rec *r)"
// Robbat2 - May 10, 2002
if (isset($cfg['Server']['AllowDeny']) && isset($cfg['Server']['AllowDeny']['order'])) {
require_once('./libraries/ip_allow_deny.lib.php');
$allowDeny_forbidden = FALSE; // default
if ($cfg['Server']['AllowDeny']['order'] == 'allow,deny') {
$allowDeny_forbidden = TRUE;
if (PMA_allowDeny('allow')) {
$allowDeny_forbidden = FALSE;
}
if (PMA_allowDeny('deny')) {
$allowDeny_forbidden = TRUE;
}
} else if ($cfg['Server']['AllowDeny']['order'] == 'deny,allow') {
if (PMA_allowDeny('deny')) {
$allowDeny_forbidden = TRUE;
}
if (PMA_allowDeny('allow')) {
$allowDeny_forbidden = FALSE;
}
} else if ($cfg['Server']['AllowDeny']['order'] == 'explicit') {
if (PMA_allowDeny('allow')
&& !PMA_allowDeny('deny')) {
$allowDeny_forbidden = FALSE;
} else {
$allowDeny_forbidden = TRUE;
}
} // end if... else if... else if
// Ejects the user if banished
if ($allowDeny_forbidden) {
PMA_auth_fails();
}
unset($allowDeny_forbidden); //Clean up after you!
} // end if
// The user can work with only some databases
if (isset($cfg['Server']['only_db']) && $cfg['Server']['only_db'] != '') {
if (is_array($cfg['Server']['only_db'])) {
$dblist = $cfg['Server']['only_db'];
} else {
$dblist[] = $cfg['Server']['only_db'];
}
} // end if
$bkp_track_err = @ini_set('track_errors', 1);
// Try to connect MySQL with the control user profile (will be used to
// get the privileges list for the current user but the true user link
// must be open after this one so it would be default one for all the
// scripts)
if ($cfg['Server']['controluser'] != '') {
if (empty($client_flags)) {
$dbh = @$connect_func(
$cfg['Server']['host'] . $server_port . $server_socket,
$cfg['Server']['controluser'],
$cfg['Server']['controlpass']
);
} else {
$dbh = @$connect_func(
$cfg['Server']['host'] . $server_port . $server_socket,
$cfg['Server']['controluser'],
$cfg['Server']['controlpass'],
FALSE,
$client_flags
);
}
if ($dbh == FALSE) {
if (PMA_mysql_error()) {
$conn_error = PMA_mysql_error();
} else if (isset($php_errormsg)) {
$conn_error = $php_errormsg;
} else {
$conn_error = 'Cannot connect: invalid settings.';
}
$local_query = $connect_func . '('
. $cfg['Server']['host'] . $server_port . $server_socket . ', '
. $cfg['Server']['controluser'] . ', '
. $cfg['Server']['controlpass']
. (empty($client_flags) ? '' : ', FALSE, ' . $client_flags)
. ')';
require_once('./header.inc.php');
//PMA_mysqlDie($conn_error, $local_query, FALSE);
PMA_mysqlDie($conn_error, '', FALSE);
} // end if
} // end if
// Pass #1 of DB-Config to read in master level DB-Config will go here
// Robbat2 - May 11, 2002
// Connects to the server (validates user's login)
if (empty($client_flags)) {
$userlink = @$connect_func(
$cfg['Server']['host'] . $server_port . $server_socket,
$cfg['Server']['user'],
$cfg['Server']['password']
);
} else {
$userlink = @$connect_func(
$cfg['Server']['host'] . $server_port . $server_socket,
$cfg['Server']['user'],
$cfg['Server']['password'],
FALSE,
$client_flags
);
}
if ($userlink == FALSE) {
PMA_auth_fails();
} // end if
// Pass #2 of DB-Config to read in user level DB-Config will go here
// Robbat2 - May 11, 2002
@ini_set('track_errors', $bkp_track_err);
// If controluser isn't defined, use the current user settings to get
// his rights
if ($cfg['Server']['controluser'] == '') {
$dbh = $userlink;
}
// Gets the mysql release number
require_once('./libraries/defines_mysql.lib.php');
/**
* SQL Parser code
*/
require_once('./libraries/sqlparser.lib.php');
/**
* SQL Validator interface code
*/
require_once('./libraries/sqlvalidator.lib.php');
// if 'only_db' is set for the current user, there is no need to check for
// available databases in the "mysql" db
$dblist_cnt = count($dblist);
if ($dblist_cnt) {
$true_dblist = array();
$is_show_dbs = TRUE;
$dblist_asterisk_bool = FALSE;
for ($i = 0; $i < $dblist_cnt; $i++) {
// The current position
if ($dblist[$i] == '*' && $dblist_asterisk_bool == FALSE) {
$dblist_asterisk_bool = TRUE;
$dblist_full = PMA_safe_db_list(FALSE, $dbh, FALSE, $rs, $userlink, $cfg, $dblist);
foreach($dblist_full AS $dbl_key => $dbl_val) {
if (!in_array($dbl_val, $dblist)) {
$true_dblist[] = $dbl_val;
}
}
continue;
} elseif ($dblist[$i] == '*') {
// We don't want more than one asterisk inside our 'only_db'.
continue;
}
if ($is_show_dbs && ereg('(^|[^\])(_|%)', $dblist[$i])) {
$local_query = 'SHOW DATABASES LIKE \'' . $dblist[$i] . '\'';
$rs = PMA_mysql_query($local_query, $dbh);
// "SHOW DATABASES" statement is disabled
if ($i == 0
&& (PMA_mysql_error() && mysql_errno() == 1045)) {
$true_dblist[] = str_replace('\\_', '_', str_replace('\\%', '%', $dblist[$i]));
$is_show_dbs = FALSE;
}
// Debug
// else if (PMA_mysql_error()) {
// PMA_mysqlDie('', $local_query, FALSE);
// }
while ($row = @PMA_mysql_fetch_row($rs)) {
$true_dblist[] = $row[0];
} // end while
if ($rs) {
mysql_free_result($rs);
}
} else {
$true_dblist[] = str_replace('\\_', '_', str_replace('\\%', '%', $dblist[$i]));
} // end if... else...
} // end for
$dblist = $true_dblist;
unset($true_dblist);
$only_db_check = TRUE;
} // end if
// 'only_db' is empty for the current user...
else {
$only_db_check = FALSE;
} // end if (!$dblist_cnt)
if (isset($dblist_full) && !count($dblist_full)) {
$dblist = PMA_safe_db_list($only_db_check, $dbh, $dblist_cnt, $rs, $userlink, $cfg, $dblist);
}
} // end server connecting
/**
* Missing server hostname
*/
else {
echo $strHostEmpty;
}
/**
* Get the list and number of available databases.
*
* @param string the url to go back to in case of error
*
* @return boolean always true
*
* @global array the list of available databases
* @global integer the number of available databases
*/
function PMA_availableDatabases($error_url = '')
{
global $dblist;
global $num_dbs;
$num_dbs = count($dblist);
// 1. A list of allowed databases has already been defined by the
// authentification process -> gets the available databases list
if ($num_dbs) {
$true_dblist = array();
for ($i = 0; $i < $num_dbs; $i++) {
$dblink = @PMA_mysql_select_db($dblist[$i]);
if ($dblink) {
$true_dblist[] = $dblist[$i];
} // end if
} // end for
$dblist = array();
$dblist = $true_dblist;
unset($true_dblist);
$num_dbs = count($dblist);
} // end if
// 2. Allowed database list is empty -> gets the list of all databases
// on the server
else {
$dbs = mysql_list_dbs() or PMA_mysqlDie('', 'SHOW DATABASES;', FALSE, $error_url);
$num_dbs = ($dbs) ? @mysql_num_rows($dbs) : 0;
$real_num_dbs = 0;
for ($i = 0; $i < $num_dbs; $i++) {
$db_name_tmp = PMA_mysql_dbname($dbs, $i);
$dblink = @PMA_mysql_select_db($db_name_tmp);
if ($dblink) {
$dblist[] = $db_name_tmp;
$real_num_dbs++;
}
} // end for
mysql_free_result($dbs);
$num_dbs = $real_num_dbs;
} // end else
return TRUE;
} // end of the 'PMA_availableDatabases()' function
/* ----------------------- Set of misc functions ----------------------- */
/**
* Adds backquotes on both sides of a database, table or field name.
* Since MySQL 3.23.6 this allows to use non-alphanumeric characters in
* these names.
*
* @param mixed the database, table or field name to "backquote" or
* array of it
* @param boolean a flag to bypass this function (used by dump
* functions)
*
* @return mixed the "backquoted" database, table or field name if the
* current MySQL release is >= 3.23.6, the original one
* else
*
* @access public
*/
function PMA_backquote($a_name, $do_it = TRUE)
{
if ($do_it
&& !empty($a_name) && $a_name != '*') {
if (is_array($a_name)) {
$result = array();
foreach($a_name AS $key => $val) {
$result[$key] = '`' . $val . '`';
}
return $result;
} else {
return '`' . $a_name . '`';
}
} else {
return $a_name;
}
} // end of the 'PMA_backquote()' function
/**
* Format a string so it can be passed to a javascript function.
* This function is used to displays a javascript confirmation box for
* "DROP/DELETE/ALTER" queries.
*
* @param string the string to format
* @param boolean whether to add backquotes to the string or not
*
* @return string the formated string
*
* @access public
*/
function PMA_jsFormat($a_string = '', $add_backquotes = TRUE)
{
if (is_string($a_string)) {
$a_string = htmlspecialchars($a_string);
$a_string = str_replace('\\', '\\\\', $a_string);
$a_string = str_replace('\'', '\\\'', $a_string);
$a_string = str_replace('#', '\\#', $a_string);
$a_string = str_replace("\012", '\\\\n', $a_string);
$a_string = str_replace("\015", '\\\\r', $a_string);
}
return (($add_backquotes) ? PMA_backquote($a_string) : $a_string);
} // end of the 'PMA_jsFormat()' function
/**
* Defines the value depending on the user OS.
*
* @return string the value to use
*
* @access public
*/
function PMA_whichCrlf()
{
$the_crlf = "\n";
// The 'PMA_USR_OS' constant is defined in "./libraries/defines.lib.php"
// Win case
if (PMA_USR_OS == 'Win') {
$the_crlf = "\r\n";
}
// Mac case
else if (PMA_USR_OS == 'Mac') {
$the_crlf = "\r";
}
// Others
else {
$the_crlf = "\n";
}
return $the_crlf;
} // end of the 'PMA_whichCrlf()' function
/**
* Counts and displays the number of records in a table
*
* Last revision 13 July 2001: Patch for limiting dump size from
* vinay@sanisoft.com & girish@sanisoft.com
*
* @param string the current database name
* @param string the current table name
* @param boolean whether to retain or to displays the result
*
* @return mixed the number of records if retain is required, true else
*
* @access public
*/
function PMA_countRecords($db, $table, $ret = FALSE)
{
global $err_url, $cfg;
$local_query = 'SHOW TABLE STATUS FROM ' . PMA_backquote($db) . ' LIKE \'' . PMA_sqlAddslashes($table, TRUE) . '\'';
$result = PMA_mysql_query($local_query) or PMA_mysqlDie('', $local_query, '', $err_url);
$showtable = PMA_mysql_fetch_array($result);
$num = (isset($showtable['Rows']) ? $showtable['Rows'] : 0);
if ($num < $cfg['MaxExactCount']) {
unset($num);
}
mysql_free_result($result);
if (!isset($num)) {
$result = PMA_mysql_query('SELECT COUNT(*) AS num FROM ' . PMA_backquote($db) . '.' . PMA_backquote($table)) or PMA_mysqlDie('', $local_query, '', $err_url);
$num = ($result) ? PMA_mysql_result($result, 0, 'num') : 0;
mysql_free_result($result);
}
if ($ret) {
return $num;
} else {
echo number_format($num, 0, $GLOBALS['number_decimal_separator'], $GLOBALS['number_thousands_separator']);
return TRUE;
}
} // end of the 'PMA_countRecords()' function
/**
* Displays a message at the top of the "main" (right) frame
*
* @param string the message to display
*
* @global array the configuration array
*
* @access public
*/
function PMA_showMessage($message)
{
global $cfg;
require_once('./header.inc.php');
// Reloads the navigation frame via JavaScript if required
if (isset($GLOBALS['reload']) && $GLOBALS['reload']) {
echo "\n";
$reload_url = './left.php?' . PMA_generate_common_url((isset($GLOBALS['db']) ? $GLOBALS['db'] : ''), '', '&')
?>
1024) {
@PMA_mysql_query('REPAIR TABLE ' . PMA_backquote($GLOBALS['table']));
}
}
unset($tbl_status);
echo "\n";
?>
" and not " ")
// If we want to show some sql code it is easiest to create it here
/* SQL-Parser-Analyzer */
$sqlnr = 1;
if (!empty($GLOBALS['show_as_php'])) {
$new_line = '\' ' . "\n" . ' . \' ';
}
if (isset($new_line)) {
/* SQL-Parser-Analyzer */
$query_base = PMA_sqlAddslashes(htmlspecialchars($local_query));
/* SQL-Parser-Analyzer */
$query_base = preg_replace("@((\015\012)|(\015)|(\012))+@", $new_line, $query_base);
} else {
$query_base = $local_query;
}
if (!empty($GLOBALS['show_as_php'])) {
$query_base = '$sql = \'' . $query_base;
} else if (!empty($GLOBALS['validatequery'])) {
$query_base = PMA_validateSQL($query_base);
} else {
$parsed_sql = PMA_SQP_parse($query_base);
$query_base = PMA_formatSql($parsed_sql, $query_base);
}
// Prepares links that may be displayed to edit/explain the query
// (don't go to default pages, we must go to the page
// where the query box is available)
// (also, I don't see why we should check the goto variable)
//if (!isset($GLOBALS['goto'])) {
//$edit_target = (isset($GLOBALS['table'])) ? $cfg['DefaultTabTable'] : $cfg['DefaultTabDatabase'];
$edit_target = isset($GLOBALS['db']) ? (isset($GLOBALS['table']) ? 'tbl_properties.php' : 'db_details.php') : '';
//} else if ($GLOBALS['goto'] != 'main.php') {
// $edit_target = $GLOBALS['goto'];
//} else {
// $edit_target = '';
//}
if (isset($cfg['SQLQuery']['Edit'])
&& ($cfg['SQLQuery']['Edit'] == TRUE )
&& (!empty($edit_target))) {
$onclick = '';
if ($cfg['QueryFrameJS'] && $cfg['QueryFrame']) {
$onclick = 'onclick="focus_querywindow(\'' . urlencode($local_query) . '\'); return false;"';
}
$edit_link = ' [' . $GLOBALS['strEdit'] . ']';
} else {
$edit_link = '';
}
// Want to have the query explained (Mike Beck 2002-05-22)
// but only explain a SELECT (that has not been explained)
/* SQL-Parser-Analyzer */
if (isset($cfg['SQLQuery']['Explain'])
&& $cfg['SQLQuery']['Explain'] == TRUE) {
// Detect if we are validating as well
// To preserve the validate uRL data
if (!empty($GLOBALS['validatequery'])) {
$explain_link_validate = '&validatequery=1';
} else {
$explain_link_validate = '';
}
$explain_link = ' [' . $GLOBALS['strExplain'];
} else if (preg_match('@^EXPLAIN[[:space:]]+SELECT[[:space:]]+@i', $local_query)) {
$explain_link .= urlencode(substr($local_query, 8)) . '">' . $GLOBALS['strNoExplain'];
} else {
$explain_link = '';
}
if(!empty($explain_link)) {
$explain_link .= ']';
}
} else {
$explain_link = '';
} //show explain
// Also we would like to get the SQL formed in some nice
// php-code (Mike Beck 2002-05-22)
if (isset($cfg['SQLQuery']['ShowAsPHP'])
&& $cfg['SQLQuery']['ShowAsPHP'] == TRUE) {
$php_link = ' [' . $GLOBALS['strNoPhp'];
} else {
$php_link .= '1">' . $GLOBALS['strPhp'];
}
$php_link .= ']';
if (isset($GLOBALS['show_as_php']) && $GLOBALS['show_as_php'] == '1') {
$php_link .= ' [' . $GLOBALS['strRunQuery'] . ']';
}
} else {
$php_link = '';
} //show as php
if (isset($cfg['SQLValidator']['use'])
&& $cfg['SQLValidator']['use'] == TRUE
&& isset($cfg['SQLQuery']['Validate'])
&& $cfg['SQLQuery']['Validate'] == TRUE) {
$validate_link = ' [' . $GLOBALS['strNoValidateSQL'] ;
} else {
$validate_link .= '1">'. $GLOBALS['strValidateSQL'] ;
}
$validate_link .= ']';
} else {
$validate_link = '';
} //validator
// Displays the message
echo ' ' . $GLOBALS['strSQLQuery'] . ' :';
if (!empty($edit_target)) {
echo $edit_link . $explain_link . $php_link . $validate_link;
}
echo ' ' . "\n";
echo ' ' . $query_base;
// If a 'LIMIT' clause has been programatically added to the query
// displays it
if (!empty($GLOBALS['sql_limit_to_append'])) {
if (!empty($GLOBALS['show_as_php'])) {
echo $GLOBALS['sql_limit_to_append'];
} else if (!empty($GLOBALS['validatequery'])) {
// skip the extra bit here
} else {
echo ' ' . PMA_formatSql(PMA_SQP_parse($GLOBALS['sql_limit_to_append'], $GLOBALS['sql_limit_to_append']));
}
}
unset($local_query);
//Clean up the end of the PHP
if (!empty($GLOBALS['show_as_php'])) {
echo '\';';
}
echo "\n";
?>
= 1; $d--, $ex-=3 ) {
if (isset($GLOBALS['byteUnits'][$d]) && $value >= $li * pow(10, $ex)) {
$value = round($value / ( pow(1024, $d) / $dh) ) /$dh;
$unit = $GLOBALS['byteUnits'][$d];
break 1;
} // end if
} // end for
if ($unit != $GLOBALS['byteUnits'][0]) {
$return_value = number_format($value, $comma, $GLOBALS['number_decimal_separator'], $GLOBALS['number_thousands_separator']);
} else {
$return_value = number_format($value, 0, $GLOBALS['number_decimal_separator'], $GLOBALS['number_thousands_separator']);
}
return array($return_value, $unit);
} // end of the 'PMA_formatByteDown' function
/**
* Extracts ENUM / SET options from a type definition string
*
* @param string The column type definition
*
* @return array The options or
* boolean FALSE in case of an error.
*
* @author rabus
*/
function PMA_getEnumSetOptions($type_def) {
$open = strpos($type_def, '(');
$close = strrpos($type_def, ')');
if (!$open || !$close) {
return FALSE;
}
$options = substr($type_def, $open + 2, $close - $open - 3);
$options = explode('\',\'', $options);
return $options;
} // end of the 'PMA_getEnumSetOptions' function
/**
* Writes localised date
*
* @param string the current timestamp
*
* @return string the formatted date
*
* @access public
*/
function PMA_localisedDate($timestamp = -1, $format = '')
{
global $datefmt, $month, $day_of_week;
if ($format == '') {
$format = $datefmt;
}
if ($timestamp == -1) {
$timestamp = time();
}
$date = preg_replace('@%[aA]@', $day_of_week[(int)strftime('%w', $timestamp)], $format);
$date = preg_replace('@%[bB]@', $month[(int)strftime('%m', $timestamp)-1], $date);
return strftime($date, $timestamp);
} // end of the 'PMA_localisedDate()' function
/**
* Prints out a tab for tabbed navigation.
* If the variables $link and $args ar left empty, an inactive tab is created
*
* @param string the text to be displayed as link
* @param string main link file, e.g. "test.php"
* @param string link arguments
* @param string link attributes
* @param string include '?' even though no attributes are set. Can be set empty, should be '?'.
* @param boolean force display TAB as active
*
* @return string two table cells, the first beeing a separator, the second the tab itself
*
* @access public
*/
function PMA_printTab($text, $link, $args = '', $attr = '', $sep = '?', $active = false) {
global $PHP_SELF, $cfg;
global $db_details_links_count_tabs;
if (((!isset($GLOBALS['active_page']) && basename($PHP_SELF) == $link) ||
$active ||
(isset($GLOBALS['active_page']) && $GLOBALS['active_page'] == $link)
) && ($text != $GLOBALS['strEmpty'] && $text != $GLOBALS['strDrop'])) {
$bgcolor = 'silver';
} else {
$bgcolor = '#DFDFDF';
}
$db_details_links_count_tabs++;
if (!empty($attr)) {
if ($cfg['LightTabs']) {
$attr = ' ' . $attr;
} else {
$attr = ' style="display:block" ' . $attr;
}
} else {
if ($cfg['LightTabs']) {
$attr = ' ';
} else {
$attr = ' style="display:block" ';
}
}
if ($cfg['LightTabs']) {
$out = '';
if (strlen($link) > 0) {
$out .= ''
. '' . $text . '';
} else {
$out .= '' . $text . '';
}
$out = '[ ' . $out . ' ] ';
} else {
$out = "\n" . ' '
. '