From b15ac69d4fd0bdcca90c88523f8a5dea5f5b1630 Mon Sep 17 00:00:00 2001 From: "Alexander M. Turek" Date: Sun, 19 Jan 2003 23:33:25 +0000 Subject: [PATCH] Added column privileges editor. --- ChangeLog | 6 +- server_privileges.php3 | 314 ++++++++++++++++++++++++++++------------- 2 files changed, 224 insertions(+), 96 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4a74ba98f..e95d0dff1 100755 --- a/ChangeLog +++ b/ChangeLog @@ -5,8 +5,12 @@ phpMyAdmin - Changelog $Id$ $Source$ +2003-01-19 Alexander M. Turek + * server_privileges.php3: Added column privileges editor. + TODO: Deselection of all columns is not possible yet... + 2003-01-19 Marc Delisle - * sql.php3, tbl_properties_export.php3, tbl_dump.php3, + * sql.php3, tbl_properties_export.php3, tbl_dump.php3, tbl_move_copy.php3, libraries/build_dump.lib.php3: Feature: Export results of SELECTs (TODO: enable row limiting for the export) diff --git a/server_privileges.php3 b/server_privileges.php3 index 82e1f51d0..4a7c2fee6 100644 --- a/server_privileges.php3 +++ b/server_privileges.php3 @@ -93,12 +93,19 @@ function PMA_extractPrivInfo($row = '', $enableHTML = FALSE) $allPrivileges = TRUE; while (list(, $current_grant) = each($grants)) { if ((!empty($row) && isset($row[$current_grant[0]])) || (empty($row) && isset($GLOBALS[$current_grant[0]]))) { - if ((!empty($row) && $row[$current_grant[0]] == 'Y') || (empty($row) && $GLOBALS[$current_grant[0]] == 'Y')) { + if ((!empty($row) && $row[$current_grant[0]] == 'Y') || (empty($row) && ($GLOBALS[$current_grant[0]] == 'Y' || (is_array($GLOBALS[$current_grant[0]]) && count($GLOBALS[$current_grant[0]]) == $GLOBALS['column_count'])))) { if ($enableHTML) { $privs[] = '' . str_replace(' ', ' ', $current_grant[1]) . ''; } else { $privs[] = $current_grant[1]; } + } else if (!empty($GLOBALS[$current_grant[0]]) && is_array($GLOBALS[$current_grant[0]]) && empty($GLOBALS[$current_grant[0] . '_none'])) { + if ($enableHTML) { + $priv_string = '' . str_replace(' ', ' ', $current_grant[1]) . ''; + } else { + $priv_string = $current_grant[1]; + } + $privs[] = $priv_string . ' (' . join(', ', $GLOBALS[$current_grant[0]]) . ')'; } else { $allPrivileges = FALSE; } @@ -197,108 +204,225 @@ function PMA_displayPrivTable($db = '*', $table = '*', $submit = TRUE, $indent = while (list(, $current_grant) = each($av_grants)) { $row[$current_grant . '_priv'] = in_array($current_grant, $users_grants) ? 'Y' : 'N'; } + unset($row['Table_priv']); unset($current_grant); unset($av_grants); unset($users_grants); - } - $privTable[0] = array( - array('Select', 'SELECT', $GLOBALS['strPrivDescSelect']), - array('Insert', 'INSERT', $GLOBALS['strPrivDescInsert']), - array('Update', 'UPDATE', $GLOBALS['strPrivDescUpdate']), - array('Delete', 'DELETE', $GLOBALS['strPrivDescDelete']) - ); - if ($db == '*') { - $privTable[0][] = array('File', 'FILE', $GLOBALS['strPrivDescFile']); - } - $privTable[1] = array( - array('Create', 'CREATE', ($table == '*' ? $GLOBALS['strPrivDescCreateDb'] : $GLOBALS['strPrivDescCreateTbl'])), - array('Alter', 'ALTER', $GLOBALS['strPrivDescAlter']), - array('Index', 'INDEX', $GLOBALS['strPrivDescIndex']), - array('Drop', 'DROP', ($table == '*' ? $GLOBALS['strPrivDescDropDb'] : $GLOBALS['strPrivDescDropTbl'])) - ); - if (isset($row['Create_tmp_table_priv'])) { - $privTable[1][] = array('Create_tmp_table', 'CREATE TEMPORARAY TABLES', $GLOBALS['strPrivDescCreateTmpTable']); - } - $privTable[2] = array(); - if (isset($row['Grant_priv'])) { - $privTable[2][] = array('Grant', 'GRANT', $GLOBALS['strPrivDescGrant']); - } - if ($db == '*') { - if (isset($row['Super_priv'])) { - $privTable[2][] = array('Super', 'SUPER', $GLOBALS['strPrivDescSuper']); - $privTable[2][] = array('Process', 'PROCESS', $GLOBALS['strPrivDescProcess4']); - } else { - $privTable[2][] = array('Process', 'PROCESS', $GLOBALS['strPrivDescProcess3']); - } - $privTable[2][] = array('Reload', 'RELOAD', $GLOBALS['strPrivDescReload']); - $privTable[2][] = array('Shutdown', 'SHUTDOWN', $GLOBALS['strPrivDescShutdown']); - if (isset($row['Show_db_priv'])) { - $privTable[2][] = array('Show_db', 'SHOW DATABASES', $GLOBALS['strPrivDescShowDb']); - } - if (isset($row['Lock_tables_priv'])) { - $privTable[2][] = array('Lock_tables', 'LOCK TABLES', $GLOBALS['strPrivDescLockTables']); + if ($res = PMA_mysql_query('SHOW COLUMNS FROM `' . $db . '`.`' . $table . '`;', $userlink)) { + $columns = array(); + while ($row1 = PMA_mysql_fetch_row($res)) { + $columns[$row1[0]] = array( + 'Select' => FALSE, + 'Insert' => FALSE, + 'Update' => FALSE, + 'References' => FALSE + ); + } + mysql_free_result($res); + unset($res); + unset($row1); } } - $privTable[2][] = array('References', 'REFERENCES', $GLOBALS['strPrivDescReferences']); - if ($db == '*') { - if (isset($row['Execute_priv'])) { - $privTable[2][] = array('Execute', 'EXECUTE', $GLOBALS['strPrivDescExecute']); + if (!empty($columns)) { + $sql_query = 'SELECT `Column_name`, `Column_priv` FROM `columns_priv` WHERE `User` = "' . $username . '" AND `Host` = "' . $hostname . '" AND `Db` = "' . $db . '" AND `Table_name` = "' . $table . '";'; + $res = PMA_mysql_query($sql_query, $userlink) or PMA_mysqlDie(PMA_mysql_error($userlink), $sql_query); + while ($row1 = PMA_mysql_fetch_row($res)) { + $row1[1] = explode(',', $row1[1]); + while (list(, $current) = each($row1[1])) { + $columns[$row1[0]][$current] = TRUE; + } } - if (isset($row['Repl_client_priv'])) { - $privTable[2][] = array('Repl_client', 'REPLICATION CLIENT', $GLOBALS['strPrivDescReplClient']); + mysql_free_result($res); + unset($res); + unset($row1); + unset($current); + echo $spaces . '' . "\n" + . $spaces . '' . "\n" + . $spaces . '' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n"; + list($current_grant, $current_grant_value) = each($row); + while (in_array(substr($current_grant, 0, (strlen($current_grant) - 5)), array('Select', 'Insert', 'Update', 'References'))) { + list($current_grant, $current_grant_value) = each($row); } - if (isset($row['Repl_slave_priv'])) { - $privTable[2][] = array('Repl_slave', 'REPLICATION SLAVE', $GLOBALS['strPrivDescReplSlave']); + echo $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n"; + $rowspan = count($row) - 5; + echo $spaces . '
 ' . $GLOBALS['strTblPrivileges'] . ' 
' . $GLOBALS['strEnglishPrivileges'] . '
 SELECT  INSERT  UPDATE  REFERENCES 
' . "\n" + . $spaces . ' ' . "\n" - . $spaces . '' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n"; - $limitTable = FALSE; - for ($i = 0; isset($privTable[0][$i]) || isset($privTable[1][$i]) || isset($privTable[2][$i]); $i++) { - echo $spaces . ' ' . "\n"; - for ($j = 0; $j < 3; $j++) { - if (isset($privTable[$j][$i])) { - echo $spaces . ' ' . "\n" - . $spaces . ' ' . "\n"; - } else if ($db == '*' && !isset($privTable[0][$i]) && !isset($privTable[1][$i]) - && isset($row['max_questions']) && isset($row['max_updates']) && isset($row['max_connections']) - && !$limitTable) { - echo $spaces . ' ' . "\n"; - $limitTable = TRUE; - } else if (!$limitTable) { - echo $spaces . ' ' . "\n"; + echo $spaces . '
' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n"; + unset($rowspan); + list($current_grant, $current_grant_value) = each($row); + while (in_array(substr($current_grant, 0, (strlen($current_grant) - 5)), array('Select', 'Insert', 'Update', 'References'))) { + list($current_grant, $current_grant_value) = each($row); + } + echo $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n"; + while (list($current_grant, $current_grant_value) = each($row)) { + if (in_array(substr($current_grant, 0, (strlen($current_grant) - 5)), array('Select', 'Insert', 'Update', 'References'))) { + continue; + } + echo $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n"; + } + } else { + $privTable[0] = array( + array('Select', 'SELECT', $GLOBALS['strPrivDescSelect']), + array('Insert', 'INSERT', $GLOBALS['strPrivDescInsert']), + array('Update', 'UPDATE', $GLOBALS['strPrivDescUpdate']), + array('Delete', 'DELETE', $GLOBALS['strPrivDescDelete']) + ); + if ($db == '*') { + $privTable[0][] = array('File', 'FILE', $GLOBALS['strPrivDescFile']); + } + $privTable[1] = array( + array('Create', 'CREATE', ($table == '*' ? $GLOBALS['strPrivDescCreateDb'] : $GLOBALS['strPrivDescCreateTbl'])), + array('Alter', 'ALTER', $GLOBALS['strPrivDescAlter']), + array('Index', 'INDEX', $GLOBALS['strPrivDescIndex']), + array('Drop', 'DROP', ($table == '*' ? $GLOBALS['strPrivDescDropDb'] : $GLOBALS['strPrivDescDropTbl'])) + ); + if (isset($row['Create_tmp_table_priv'])) { + $privTable[1][] = array('Create_tmp_table', 'CREATE TEMPORARAY TABLES', $GLOBALS['strPrivDescCreateTmpTable']); + } + $privTable[2] = array(); + if (isset($row['Grant_priv'])) { + $privTable[2][] = array('Grant', 'GRANT', $GLOBALS['strPrivDescGrant']); + } + if ($db == '*') { + if (isset($row['Super_priv'])) { + $privTable[2][] = array('Super', 'SUPER', $GLOBALS['strPrivDescSuper']); + $privTable[2][] = array('Process', 'PROCESS', $GLOBALS['strPrivDescProcess4']); + } else { + $privTable[2][] = array('Process', 'PROCESS', $GLOBALS['strPrivDescProcess3']); + } + $privTable[2][] = array('Reload', 'RELOAD', $GLOBALS['strPrivDescReload']); + $privTable[2][] = array('Shutdown', 'SHUTDOWN', $GLOBALS['strPrivDescShutdown']); + if (isset($row['Show_db_priv'])) { + $privTable[2][] = array('Show_db', 'SHOW DATABASES', $GLOBALS['strPrivDescShowDb']); + } + if (isset($row['Lock_tables_priv'])) { + $privTable[2][] = array('Lock_tables', 'LOCK TABLES', $GLOBALS['strPrivDescLockTables']); + } + } + $privTable[2][] = array('References', 'REFERENCES', $GLOBALS['strPrivDescReferences']); + if ($db == '*') { + if (isset($row['Execute_priv'])) { + $privTable[2][] = array('Execute', 'EXECUTE', $GLOBALS['strPrivDescExecute']); + } + if (isset($row['Repl_client_priv'])) { + $privTable[2][] = array('Repl_client', 'REPLICATION CLIENT', $GLOBALS['strPrivDescReplClient']); + } + if (isset($row['Repl_slave_priv'])) { + $privTable[2][] = array('Repl_slave', 'REPLICATION SLAVE', $GLOBALS['strPrivDescReplSlave']); + } + } + echo $spaces . '' . "\n" + . $spaces . '
 ' . ($db == '*' ? $GLOBALS['strGlobalPrivileges'] : ($table == '*' ? $GLOBALS['strDbPrivileges'] : $GLOBALS['strTblPrivileges'])) . ' 
' . $GLOBALS['strEnglishPrivileges'] . '
 ' . $GLOBALS['strData'] . '  ' . $GLOBALS['strStructure'] . '  ' . $GLOBALS['strAdministration'] . ' 
' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . ' ' . "\n" - . $spaces . '
 ' . $GLOBALS['strResourceLimits'] . ' 
' . $GLOBALS['strZeroRemovesTheLimit'] . '
' . "\n" - . $spaces . '
 ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . '
' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n"; + $limitTable = FALSE; + for ($i = 0; isset($privTable[0][$i]) || isset($privTable[1][$i]) || isset($privTable[2][$i]); $i++) { + echo $spaces . ' ' . "\n"; + for ($j = 0; $j < 3; $j++) { + if (isset($privTable[$j][$i])) { + echo $spaces . ' ' . "\n" + . $spaces . ' ' . "\n"; + } else if ($db == '*' && !isset($privTable[0][$i]) && !isset($privTable[1][$i]) + && isset($row['max_questions']) && isset($row['max_updates']) && isset($row['max_connections']) + && !$limitTable) { + echo $spaces . ' ' . "\n"; + $limitTable = TRUE; + } else if (!$limitTable) { + echo $spaces . ' ' . "\n"; + } } } echo $spaces . ' ' . "\n";
 ' . ($db == '*' ? $GLOBALS['strGlobalPrivileges'] : ($table == '*' ? $GLOBALS['strDbPrivileges'] : $GLOBALS['strTblPrivileges'])) . ' 
' . $GLOBALS['strEnglishPrivileges'] . '
 ' . $GLOBALS['strData'] . '  ' . $GLOBALS['strStructure'] . '  ' . $GLOBALS['strAdministration'] . ' 
' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . ' ' . "\n" + . $spaces . '
 ' . $GLOBALS['strResourceLimits'] . ' 
' . $GLOBALS['strZeroRemovesTheLimit'] . '
' . "\n" + . $spaces . '