From f7bf216e28b209b939071a6a22bedba759df2e81 Mon Sep 17 00:00:00 2001 From: Kasun Chathuranga Date: Sun, 8 Sep 2013 22:58:47 +0530 Subject: [PATCH 1/4] Change the structure of `pma__usergroups` table --- examples/create_tables.sql | 40 ++--------------- examples/create_tables_drizzle.sql | 40 ++--------------- libraries/Menu.class.php | 13 +++--- libraries/server_privileges.lib.php | 67 ++++++++++++++++------------- 4 files changed, 48 insertions(+), 112 deletions(-) diff --git a/examples/create_tables.sql b/examples/create_tables.sql index ca23e71c06..0ac5654dc4 100644 --- a/examples/create_tables.sql +++ b/examples/create_tables.sql @@ -262,43 +262,9 @@ CREATE TABLE IF NOT EXISTS `pma__users` ( CREATE TABLE IF NOT EXISTS `pma__usergroups` ( `usergroup` varchar(64) NOT NULL, - `server_databases` enum('Y','N') NOT NULL DEFAULT 'N', - `server_sql` enum('Y','N') NOT NULL DEFAULT 'N', - `server_status` enum('Y','N') NOT NULL DEFAULT 'N', - `server_rights` enum('Y','N') NOT NULL DEFAULT 'N', - `server_export` enum('Y','N') NOT NULL DEFAULT 'N', - `server_import` enum('Y','N') NOT NULL DEFAULT 'N', - `server_settings` enum('Y','N') NOT NULL DEFAULT 'N', - `server_binlog` enum('Y','N') NOT NULL DEFAULT 'N', - `server_replication` enum('Y','N') NOT NULL DEFAULT 'N', - `server_vars` enum('Y','N') NOT NULL DEFAULT 'N', - `server_charset` enum('Y','N') NOT NULL DEFAULT 'N', - `server_plugins` enum('Y','N') NOT NULL DEFAULT 'N', - `server_engine` enum('Y','N') NOT NULL DEFAULT 'N', - `db_structure` enum('Y','N') NOT NULL DEFAULT 'N', - `db_sql` enum('Y','N') NOT NULL DEFAULT 'N', - `db_search` enum('Y','N') NOT NULL DEFAULT 'N', - `db_qbe` enum('Y','N') NOT NULL DEFAULT 'N', - `db_export` enum('Y','N') NOT NULL DEFAULT 'N', - `db_import` enum('Y','N') NOT NULL DEFAULT 'N', - `db_operation` enum('Y','N') NOT NULL DEFAULT 'N', - `db_privileges` enum('Y','N') NOT NULL DEFAULT 'N', - `db_routines` enum('Y','N') NOT NULL DEFAULT 'N', - `db_events` enum('Y','N') NOT NULL DEFAULT 'N', - `db_triggers` enum('Y','N') NOT NULL DEFAULT 'N', - `db_tracking` enum('Y','N') NOT NULL DEFAULT 'N', - `db_designer` enum('Y','N') NOT NULL DEFAULT 'N', - `table_browse` enum('Y','N') NOT NULL DEFAULT 'N', - `table_structure` enum('Y','N') NOT NULL DEFAULT 'N', - `table_sql` enum('Y','N') NOT NULL DEFAULT 'N', - `table_search` enum('Y','N') NOT NULL DEFAULT 'N', - `table_insert` enum('Y','N') NOT NULL DEFAULT 'N', - `table_export` enum('Y','N') NOT NULL DEFAULT 'N', - `table_import` enum('Y','N') NOT NULL DEFAULT 'N', - `table_operation` enum('Y','N') NOT NULL DEFAULT 'N', - `table_tracking` enum('Y','N') NOT NULL DEFAULT 'N', - `table_triggers` enum('Y','N') NOT NULL DEFAULT 'N', - PRIMARY KEY (`usergroup`) + `tab` varchar(64) NOT NULL, + `allowed` enum('Y','N') NOT NULL DEFAULT 'N', + PRIMARY KEY (`usergroup`,`tab`,`allowed`) ) COMMENT='User groups with configured menu items' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; diff --git a/examples/create_tables_drizzle.sql b/examples/create_tables_drizzle.sql index 4bbb9c34d5..698a15949d 100644 --- a/examples/create_tables_drizzle.sql +++ b/examples/create_tables_drizzle.sql @@ -248,43 +248,9 @@ CREATE TABLE IF NOT EXISTS `pma__users` ( CREATE TABLE IF NOT EXISTS `pma__usergroups` ( `usergroup` varchar(64) NOT NULL, - `server_databases` enum('Y','N') NOT NULL DEFAULT 'N', - `server_sql` enum('Y','N') NOT NULL DEFAULT 'N', - `server_status` enum('Y','N') NOT NULL DEFAULT 'N', - `server_rights` enum('Y','N') NOT NULL DEFAULT 'N', - `server_export` enum('Y','N') NOT NULL DEFAULT 'N', - `server_import` enum('Y','N') NOT NULL DEFAULT 'N', - `server_settings` enum('Y','N') NOT NULL DEFAULT 'N', - `server_binlog` enum('Y','N') NOT NULL DEFAULT 'N', - `server_replication` enum('Y','N') NOT NULL DEFAULT 'N', - `server_vars` enum('Y','N') NOT NULL DEFAULT 'N', - `server_charset` enum('Y','N') NOT NULL DEFAULT 'N', - `server_plugins` enum('Y','N') NOT NULL DEFAULT 'N', - `server_engine` enum('Y','N') NOT NULL DEFAULT 'N', - `db_structure` enum('Y','N') NOT NULL DEFAULT 'N', - `db_sql` enum('Y','N') NOT NULL DEFAULT 'N', - `db_search` enum('Y','N') NOT NULL DEFAULT 'N', - `db_qbe` enum('Y','N') NOT NULL DEFAULT 'N', - `db_export` enum('Y','N') NOT NULL DEFAULT 'N', - `db_import` enum('Y','N') NOT NULL DEFAULT 'N', - `db_operation` enum('Y','N') NOT NULL DEFAULT 'N', - `db_privileges` enum('Y','N') NOT NULL DEFAULT 'N', - `db_routines` enum('Y','N') NOT NULL DEFAULT 'N', - `db_events` enum('Y','N') NOT NULL DEFAULT 'N', - `db_triggers` enum('Y','N') NOT NULL DEFAULT 'N', - `db_tracking` enum('Y','N') NOT NULL DEFAULT 'N', - `db_designer` enum('Y','N') NOT NULL DEFAULT 'N', - `table_browse` enum('Y','N') NOT NULL DEFAULT 'N', - `table_structure` enum('Y','N') NOT NULL DEFAULT 'N', - `table_sql` enum('Y','N') NOT NULL DEFAULT 'N', - `table_search` enum('Y','N') NOT NULL DEFAULT 'N', - `table_insert` enum('Y','N') NOT NULL DEFAULT 'N', - `table_export` enum('Y','N') NOT NULL DEFAULT 'N', - `table_import` enum('Y','N') NOT NULL DEFAULT 'N', - `table_operation` enum('Y','N') NOT NULL DEFAULT 'N', - `table_tracking` enum('Y','N') NOT NULL DEFAULT 'N', - `table_triggers` enum('Y','N') NOT NULL DEFAULT 'N', - PRIMARY KEY (`usergroup`) + `tab` varchar(64) NOT NULL, + `allowed` enum('Y','N') NOT NULL DEFAULT 'N', + PRIMARY KEY (`usergroup`,`tab`,`allowed`) ) COMMENT='User groups with configured menu items' COLLATE utf8_bin; diff --git a/libraries/Menu.class.php b/libraries/Menu.class.php index 4c4ee18ebf..3894b557ab 100644 --- a/libraries/Menu.class.php +++ b/libraries/Menu.class.php @@ -140,19 +140,16 @@ class PMA_Menu $userTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['users']); - $sql_query = "SELECT * FROM " . $groupTable - . " WHERE `usergroup` = (SELECT usergroup FROM " + $sql_query = "SELECT `tab` FROM " . $groupTable + . " WHERE `allowed` = 'N' AND `usergroup` = (SELECT usergroup FROM " . $userTable . " WHERE `username` = '" . PMA_Util::sqlAddSlashes($GLOBALS['cfg']['Server']['user']) . "')"; $result = PMA_queryAsControlUser($sql_query, false); if ($result) { - $row = $GLOBALS['dbi']->fetchAssoc($result); - foreach ($allowedTabs as $key => $tab) { - $colName = $level . '_' . $key; - if (isset($row[$colName]) && $row[$colName] == 'N') { - unset($allowedTabs[$key]); - } + while ($row = $GLOBALS['dbi']->fetchAssoc($result)) { + $tabName = substr($row['tab'], strpos($row['tab'], '_') + 1); + unset($allowedTabs[$tabName]); } } } diff --git a/libraries/server_privileges.lib.php b/libraries/server_privileges.lib.php index fc9199a4e9..4e1d82538a 100644 --- a/libraries/server_privileges.lib.php +++ b/libraries/server_privileges.lib.php @@ -500,7 +500,7 @@ function PMA_getHtmlToChooseUserGroup($username) . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['users']); $userGroups = array(); - $sql_query = "SELECT `usergroup` FROM " . $groupTable; + $sql_query = "SELECT DISTINCT `usergroup` FROM " . $groupTable; $result = PMA_queryAsControlUser($sql_query, false); if ($result) { while ($row = $GLOBALS['dbi']->fetchRow($result)) { @@ -3871,18 +3871,26 @@ function PMA_getHtmlForUserGroupsTable() $html_output .= ''; $odd = true; + $userGroups = array(); while ($row = $GLOBALS['dbi']->fetchAssoc($result)) { + $groupName = $row['usergroup']; + if (! isset($userGroups[$groupName])) { + $userGroups[$groupName] = array(); + } + $userGroups[$groupName][$row['tab']] = $row['allowed']; + } + foreach ($userGroups as $groupName => $tabs) { $html_output .= ''; - $html_output .= '' . htmlspecialchars($row['usergroup']) . ''; - $html_output .= '' . _getAllowedTabNames($row, 'server') . ''; - $html_output .= '' . _getAllowedTabNames($row, 'db') . ''; - $html_output .= '' . _getAllowedTabNames($row, 'table') . ''; + $html_output .= '' . htmlspecialchars($groupName) . ''; + $html_output .= '' . _getAllowedTabNames($tabs, 'server') . ''; + $html_output .= '' . _getAllowedTabNames($tabs, 'db') . ''; + $html_output .= '' . _getAllowedTabNames($tabs, 'table') . ''; $html_output .= ''; $html_output .= '' @@ -3891,7 +3899,7 @@ function PMA_getHtmlForUserGroupsTable() $html_output .= '' @@ -3901,7 +3909,7 @@ function PMA_getHtmlForUserGroupsTable() . ' href="server_user_groups.php' . PMA_URL_getCommon( array( - 'deleteUserGroup' => 1, 'userGroup' => $row['usergroup'] + 'deleteUserGroup' => 1, 'userGroup' => $groupName ) ) . '">' @@ -4028,8 +4036,9 @@ function PMA_getHtmlToEditUserGroup($userGroup = null) . " WHERE `usergroup`='" . PMA_Util::sqlAddSlashes($userGroup) . "'"; $result = PMA_queryAsControlUser($sql_query, false); if ($result) { - $row = $GLOBALS['dbi']->fetchAssoc($result); - foreach ($row as $key => $value) { + while ($row = $GLOBALS['dbi']->fetchAssoc($result)) { + $key = $row['tab']; + $value = $row['allowed']; if (substr($key, 0, 7) == 'server_' && $value == 'Y') { $allowedTabs['server'][] = substr($key, 7); } elseif (substr($key, 0, 3) == 'db_' && $value == 'Y') { @@ -4105,31 +4114,29 @@ function PMA_editUserGroup($userGroup, $new = false) $groupTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['usergroups']); - $cols = ""; - $vals = ""; - $colsNvals = ""; + if (! $new) { + $sql_query = "DELETE FROM " . $groupTable + . " WHERE `usergroup`='" . PMA_Util::sqlAddSlashes($userGroup) . "';"; + PMA_queryAsControlUser($sql_query, true); + } + + $sql_query = "INSERT INTO " . $groupTable + . "(`usergroup`, `tab`, `allowed`)" + . " VALUES "; + $first = true; foreach ($tabs as $tabGroupName => $tabGroup) { foreach ($tabs[$tabGroupName] as $tab => $tabName) { - $colName = $tabGroupName . '_' . $tab; - $cols .= "," . PMA_Util::backquote($colName); - if (isset($_REQUEST[$colName])&& $_REQUEST[$colName] == 'Y') { - $vals .= ",'Y'"; - $colsNvals .= "," . PMA_Util::backquote($colName) . "='Y'"; - } else { - $vals .= ",'N'"; - $colsNvals .= "," . PMA_Util::backquote($colName) . "='N'"; + if (! $first) { + $sql_query .= ", "; } + $tabName = $tabGroupName . '_' . $tab; + $allowed = isset($_REQUEST[$tabName]) && $_REQUEST[$tabName] == 'Y'; + $sql_query .= "('" . $userGroup . "', '" . $tabName . "', '" + . ($allowed ? "Y" : "N") . "')"; + $first = false; } } - if ($new) { - $sql_query = "INSERT INTO " . $groupTable - . "(`usergroup`" . $cols . ")" - . " VALUES" - . " ('" . PMA_Util::sqlAddSlashes($userGroup) . "'" . $vals . ")"; - } else { - $sql_query = "UPDATE " . $groupTable . " SET " . substr($colsNvals, 1) - . " WHERE `usergroup`='" . PMA_Util::sqlAddSlashes($userGroup) . "'"; - } + $sql_query .= ";"; PMA_queryAsControlUser($sql_query, true); } From 99257dea7cc54b366e3d21d036d7f1469b6e958c Mon Sep 17 00:00:00 2001 From: Kasun Chathuranga Date: Sun, 8 Sep 2013 23:34:22 +0530 Subject: [PATCH 2/4] Fix failing tests --- .../libraries/PMA_server_user_groups_test.php | 56 +++++++++---------- 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/test/libraries/PMA_server_user_groups_test.php b/test/libraries/PMA_server_user_groups_test.php index c15bf08034..88653c6cc0 100644 --- a/test/libraries/PMA_server_user_groups_test.php +++ b/test/libraries/PMA_server_user_groups_test.php @@ -99,12 +99,8 @@ class PMA_ServerUserGroupsTest extends PHPUnit_Framework_TestCase $this->returnValue( array( 'usergroup' => 'usergroup', - 'server_sql' => 'Y', - 'server_databases' => 'N', - 'db_sql' => 'Y', - 'db_structure' => 'N', - 'table_sql' => 'Y', - 'table_browse' => 'N' + 'tab' => 'server_sql', + 'allowed' => 'Y' ) ) ); @@ -122,33 +118,33 @@ class PMA_ServerUserGroupsTest extends PHPUnit_Framework_TestCase $html ); $url_tag = ''; - - $usersTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) - . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['users']); - $sql_query = "SELECT `username` FROM " . $usersTable - . " WHERE `usergroup`='" . PMA_Util::sqlAddSlashes($userGroup) . "'"; - $result = PMA_queryAsControlUser($sql_query, false); - if ($result) { - if ($GLOBALS['dbi']->numRows($result) == 0) { - $html_output .= '

' - . __('No users were found belonging to this user group.') - . '

'; - } else { - $html_output .= '' - . '' - . ''; - $i = 0; - while ($row = $GLOBALS['dbi']->fetchRow($result)) { - $i++; - $html_output .= '' - . '' - . '' - . ''; - } - $html_output .= '' - . '
#' . __('User') . '
' . $i . ' ' . htmlspecialchars($row[0]) . '
'; - } - } - $GLOBALS['dbi']->freeResult($result); - return $html_output; -} - -/** - * Returns HTML for the 'user groups' table - * - * @return string HTML for the 'user groups' table - */ -function PMA_getHtmlForUserGroupsTable() -{ - $tabs = PMA_Util::getMenuTabList(); - - $html_output = '

' . __('User groups') . '

'; - $groupTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) - . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['usergroups']); - $sql_query = "SELECT * FROM " . $groupTable . " ORDER BY `usergroup` ASC"; - $result = PMA_queryAsControlUser($sql_query, false); - - if ($result && $GLOBALS['dbi']->numRows($result)) { - $html_output .= '
'; - $html_output .= PMA_URL_getHiddenInputs(); - $html_output .= ''; - $html_output .= ''; - $html_output .= ''; - $html_output .= ''; - $html_output .= ''; - $html_output .= ''; - $html_output .= ''; - $html_output .= ''; - $html_output .= ''; - - $odd = true; - $userGroups = array(); - while ($row = $GLOBALS['dbi']->fetchAssoc($result)) { - $groupName = $row['usergroup']; - if (! isset($userGroups[$groupName])) { - $userGroups[$groupName] = array(); - } - $userGroups[$groupName][$row['tab']] = $row['allowed']; - } - foreach ($userGroups as $groupName => $tabs) { - $html_output .= ''; - $html_output .= ''; - $html_output .= ''; - $html_output .= ''; - $html_output .= ''; - - $html_output .= ''; - - $html_output .= ''; - - $odd = ! $odd; - } - - $html_output .= ''; - $html_output .= '
' - . __('User group') . '' . __('Server level tabs') . '' . __('Database level tabs') . '' . __('Table level tabs') . '' . __('Action') . '
' . htmlspecialchars($groupName) . '' . _getAllowedTabNames($tabs, 'server') . '' . _getAllowedTabNames($tabs, 'db') . '' . _getAllowedTabNames($tabs, 'table') . ''; - $html_output .= '' - . PMA_Util::getIcon('b_usrlist.png', __('View users')) . ''; - $html_output .= '  '; - $html_output .= '' - . PMA_Util::getIcon('b_edit.png', __('Edit')) . ''; - $html_output .= '  '; - $html_output .= '' - . PMA_Util::getIcon('b_drop.png', __('Delete')) . ''; - $html_output .= '
'; - $html_output .= '
'; - } - $GLOBALS['dbi']->freeResult($result); - - $html_output .= '
'; - $html_output .= '' - . PMA_Util::getIcon('b_usradd.png') - . __('Add user group') . ''; - $html_output .= '
'; - - return $html_output; -} - -/** - * Returns the list of allowed menu tab names - * based on a data row from usergroup table. - * - * @param array $row row of usergroup table - * @param string $level 'server', 'db' or 'table' - * - * @return string comma seperated list of allowed menu tab names - */ -function _getAllowedTabNames($row, $level) -{ - $tabNames = array(); - $tabs = PMA_Util::getMenuTabList($level); - foreach ($tabs as $tab => $tabName) { - if (! isset($row[$level . '_' . $tab]) - || $row[$level . '_' . $tab] == 'Y' - ) { - $tabNames[] = $tabName; - } - } - return implode(', ', $tabNames); -} - -/** - * Deletes a user group - * - * @param string $userGroup user group name - * - * @return void - */ -function PMA_deleteUserGroup($userGroup) -{ - $userTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) - . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['users']); - $groupTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) - . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['usergroups']); - $sql_query = "DELETE FROM " . $userTable - . " WHERE `usergroup`='" . PMA_Util::sqlAddSlashes($userGroup) . "'"; - PMA_queryAsControlUser($sql_query, true); - $sql_query = "DELETE FROM " . $groupTable - . " WHERE `usergroup`='" . PMA_Util::sqlAddSlashes($userGroup) . "'"; - PMA_queryAsControlUser($sql_query, true); -} - -/** - * Returns HTML for add/edit user group dialog - * - * @param string $userGroup name of the user group in case of editing - * - * @return string HTML for add/edit user group dialog - */ -function PMA_getHtmlToEditUserGroup($userGroup = null) -{ - $html_output = ''; - if ($userGroup == null) { - $html_output .= '

' . __('Add user group') . '

'; - } else { - $html_output .= '

' - . sprintf(__('Edit user group: \'%s\''), htmlspecialchars($userGroup)) - . '

'; - } - - $html_output .= '
'; - $urlParams = array(); - if ($userGroup != null) { - $urlParams['userGroup'] = $userGroup; - $urlParams['editUserGroupSubmit'] = '1'; - } else { - $urlParams['addUserGroupSubmit'] = '1'; - } - $html_output .= PMA_URL_getHiddenInputs($urlParams); - - $html_output .= '
'; - $html_output .= '' . __('User group menu assignments') - . '   ' - . '' - . '' - . ''; - - if ($userGroup == null) { - $html_output .= ''; - $html_output .= ''; - $html_output .= '
'; - } - - $allowedTabs = array( - 'server' => array(), - 'db' => array(), - 'table' => array() - ); - if ($userGroup != null) { - $groupTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) - . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['usergroups']); - $sql_query = "SELECT * FROM " . $groupTable - . " WHERE `usergroup`='" . PMA_Util::sqlAddSlashes($userGroup) . "'"; - $result = PMA_queryAsControlUser($sql_query, false); - if ($result) { - while ($row = $GLOBALS['dbi']->fetchAssoc($result)) { - $key = $row['tab']; - $value = $row['allowed']; - if (substr($key, 0, 7) == 'server_' && $value == 'Y') { - $allowedTabs['server'][] = substr($key, 7); - } elseif (substr($key, 0, 3) == 'db_' && $value == 'Y') { - $allowedTabs['db'][] = substr($key, 3); - } elseif (substr($key, 0, 6) == 'table_' && $value == 'Y') { - $allowedTabs['table'][] = substr($key, 6); - } - } - } - $GLOBALS['dbi']->freeResult($result); - } - - $html_output .= _getTabList( - __('Server-level tabs'), 'server', $allowedTabs['server'] - ); - $html_output .= _getTabList( - __('Database-level tabs'), 'db', $allowedTabs['db'] - ); - $html_output .= _getTabList( - __('Table-level tabs'), 'table', $allowedTabs['table'] - ); - - $html_output .= '
'; - - $html_output .= ''; - - return $html_output; -} - -/** - * Returns HTML for checkbox groups to choose - * tabs of 'server', 'db' or 'table' levels. - * - * @param string $title title of the checkbox group - * @param string $level 'server', 'db' or 'table' - * @param array $selected array of selected allowed tabs - * - * @return string HTML for checkbox groups - */ -function _getTabList($title, $level, $selected) -{ - $tabs = PMA_Util::getMenuTabList($level); - $html_output = '
'; - $html_output .= '' . $title . ''; - foreach ($tabs as $tab => $tabName) { - $html_output .= '
'; - $html_output .= ''; - $html_output .= ''; - $html_output .= '
'; - } - $html_output .= '
'; - return $html_output; -} - -/** - * Add/update a user group with allowed menu tabs. - * - * @param string $userGroup user group name - * @param boolean $new whether this is a new user group - * - * @return void - */ -function PMA_editUserGroup($userGroup, $new = false) -{ - $tabs = PMA_Util::getMenuTabList(); - $groupTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) - . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['usergroups']); - - if (! $new) { - $sql_query = "DELETE FROM " . $groupTable - . " WHERE `usergroup`='" . PMA_Util::sqlAddSlashes($userGroup) . "';"; - PMA_queryAsControlUser($sql_query, true); - } - - $sql_query = "INSERT INTO " . $groupTable - . "(`usergroup`, `tab`, `allowed`)" - . " VALUES "; - $first = true; - foreach ($tabs as $tabGroupName => $tabGroup) { - foreach ($tabs[$tabGroupName] as $tab => $tabName) { - if (! $first) { - $sql_query .= ", "; - } - $tabName = $tabGroupName . '_' . $tab; - $allowed = isset($_REQUEST[$tabName]) && $_REQUEST[$tabName] == 'Y'; - $sql_query .= "('" . $userGroup . "', '" . $tabName . "', '" - . ($allowed ? "Y" : "N") . "')"; - $first = false; - } - } - $sql_query .= ";"; - PMA_queryAsControlUser($sql_query, true); -} - /** * Get HTML snippet for display user properties * @@ -4520,47 +4177,4 @@ function PMA_getSqlQueriesForDisplayAndAddUser($username, $hostname, $password) $sql_query ); } - -/** - * Get HTML for secondary level menu tabs on 'Users' page - * - * @param string $selfUrl Url of the file - * - * @return string HTML for secondary level menu tabs on 'Users' page - */ -function PMA_getHtmlForSubMenusOnUsersPage($selfUrl) -{ - $url_params = PMA_URL_getCommon(); - $items = array( - array( - 'name' => __('Users overview'), - 'url' => 'server_privileges.php', - 'specific_params' => '&viewing_mode=server' - ), - array( - 'name' => __('User groups'), - 'url' => 'server_user_groups.php', - 'specific_params' => '' - ) - ); - - $retval = ''; - $retval .= '
'; - - return $retval; -} ?> diff --git a/libraries/server_user_groups.lib.php b/libraries/server_user_groups.lib.php new file mode 100644 index 0000000000..7085b60b4a --- /dev/null +++ b/libraries/server_user_groups.lib.php @@ -0,0 +1,355 @@ +' + . sprintf(__('Users of \'%s\' user group'), htmlspecialchars($userGroup)) + . ''; + + $usersTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) + . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['users']); + $sql_query = "SELECT `username` FROM " . $usersTable + . " WHERE `usergroup`='" . PMA_Util::sqlAddSlashes($userGroup) . "'"; + $result = PMA_queryAsControlUser($sql_query, false); + if ($result) { + if ($GLOBALS['dbi']->numRows($result) == 0) { + $html_output .= '

' + . __('No users were found belonging to this user group.') + . '

'; + } else { + $html_output .= '' + . '' + . ''; + $i = 0; + while ($row = $GLOBALS['dbi']->fetchRow($result)) { + $i++; + $html_output .= '' + . '' + . '' + . ''; + } + $html_output .= '' + . '
#' . __('User') . '
' . $i . ' ' . htmlspecialchars($row[0]) . '
'; + } + } + $GLOBALS['dbi']->freeResult($result); + return $html_output; +} + +/** + * Returns HTML for the 'user groups' table + * + * @return string HTML for the 'user groups' table + */ +function PMA_getHtmlForUserGroupsTable() +{ + $tabs = PMA_Util::getMenuTabList(); + + $html_output = '

' . __('User groups') . '

'; + $groupTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) + . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['usergroups']); + $sql_query = "SELECT * FROM " . $groupTable . " ORDER BY `usergroup` ASC"; + $result = PMA_queryAsControlUser($sql_query, false); + + if ($result && $GLOBALS['dbi']->numRows($result)) { + $html_output .= ''; + $html_output .= PMA_URL_getHiddenInputs(); + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + + $odd = true; + $userGroups = array(); + while ($row = $GLOBALS['dbi']->fetchAssoc($result)) { + $groupName = $row['usergroup']; + if (! isset($userGroups[$groupName])) { + $userGroups[$groupName] = array(); + } + $userGroups[$groupName][$row['tab']] = $row['allowed']; + } + foreach ($userGroups as $groupName => $tabs) { + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + + $html_output .= ''; + + $html_output .= ''; + + $odd = ! $odd; + } + + $html_output .= ''; + $html_output .= '
' + . __('User group') . '' . __('Server level tabs') . '' . __('Database level tabs') . '' . __('Table level tabs') . '' . __('Action') . '
' . htmlspecialchars($groupName) . '' . _getAllowedTabNames($tabs, 'server') . '' . _getAllowedTabNames($tabs, 'db') . '' . _getAllowedTabNames($tabs, 'table') . ''; + $html_output .= '' + . PMA_Util::getIcon('b_usrlist.png', __('View users')) . ''; + $html_output .= '  '; + $html_output .= '' + . PMA_Util::getIcon('b_edit.png', __('Edit')) . ''; + $html_output .= '  '; + $html_output .= '' + . PMA_Util::getIcon('b_drop.png', __('Delete')) . ''; + $html_output .= '
'; + $html_output .= '
'; + } + $GLOBALS['dbi']->freeResult($result); + + $html_output .= '
'; + $html_output .= '' + . PMA_Util::getIcon('b_usradd.png') + . __('Add user group') . ''; + $html_output .= '
'; + + return $html_output; +} + +/** + * Returns the list of allowed menu tab names + * based on a data row from usergroup table. + * + * @param array $row row of usergroup table + * @param string $level 'server', 'db' or 'table' + * + * @return string comma seperated list of allowed menu tab names + */ +function _getAllowedTabNames($row, $level) +{ + $tabNames = array(); + $tabs = PMA_Util::getMenuTabList($level); + foreach ($tabs as $tab => $tabName) { + if (! isset($row[$level . '_' . $tab]) + || $row[$level . '_' . $tab] == 'Y' + ) { + $tabNames[] = $tabName; + } + } + return implode(', ', $tabNames); +} + +/** + * Deletes a user group + * + * @param string $userGroup user group name + * + * @return void + */ +function PMA_deleteUserGroup($userGroup) +{ + $userTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) + . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['users']); + $groupTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) + . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['usergroups']); + $sql_query = "DELETE FROM " . $userTable + . " WHERE `usergroup`='" . PMA_Util::sqlAddSlashes($userGroup) . "'"; + PMA_queryAsControlUser($sql_query, true); + $sql_query = "DELETE FROM " . $groupTable + . " WHERE `usergroup`='" . PMA_Util::sqlAddSlashes($userGroup) . "'"; + PMA_queryAsControlUser($sql_query, true); +} + +/** + * Returns HTML for add/edit user group dialog + * + * @param string $userGroup name of the user group in case of editing + * + * @return string HTML for add/edit user group dialog + */ +function PMA_getHtmlToEditUserGroup($userGroup = null) +{ + $html_output = ''; + if ($userGroup == null) { + $html_output .= '

' . __('Add user group') . '

'; + } else { + $html_output .= '

' + . sprintf(__('Edit user group: \'%s\''), htmlspecialchars($userGroup)) + . '

'; + } + + $html_output .= '
'; + $urlParams = array(); + if ($userGroup != null) { + $urlParams['userGroup'] = $userGroup; + $urlParams['editUserGroupSubmit'] = '1'; + } else { + $urlParams['addUserGroupSubmit'] = '1'; + } + $html_output .= PMA_URL_getHiddenInputs($urlParams); + + $html_output .= '
'; + $html_output .= '' . __('User group menu assignments') + . '   ' + . '' + . '' + . ''; + + if ($userGroup == null) { + $html_output .= ''; + $html_output .= ''; + $html_output .= '
'; + } + + $allowedTabs = array( + 'server' => array(), + 'db' => array(), + 'table' => array() + ); + if ($userGroup != null) { + $groupTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) + . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['usergroups']); + $sql_query = "SELECT * FROM " . $groupTable + . " WHERE `usergroup`='" . PMA_Util::sqlAddSlashes($userGroup) . "'"; + $result = PMA_queryAsControlUser($sql_query, false); + if ($result) { + while ($row = $GLOBALS['dbi']->fetchAssoc($result)) { + $key = $row['tab']; + $value = $row['allowed']; + if (substr($key, 0, 7) == 'server_' && $value == 'Y') { + $allowedTabs['server'][] = substr($key, 7); + } elseif (substr($key, 0, 3) == 'db_' && $value == 'Y') { + $allowedTabs['db'][] = substr($key, 3); + } elseif (substr($key, 0, 6) == 'table_' && $value == 'Y') { + $allowedTabs['table'][] = substr($key, 6); + } + } + } + $GLOBALS['dbi']->freeResult($result); + } + + $html_output .= _getTabList( + __('Server-level tabs'), 'server', $allowedTabs['server'] + ); + $html_output .= _getTabList( + __('Database-level tabs'), 'db', $allowedTabs['db'] + ); + $html_output .= _getTabList( + __('Table-level tabs'), 'table', $allowedTabs['table'] + ); + + $html_output .= '
'; + + $html_output .= ''; + + return $html_output; +} + +/** + * Returns HTML for checkbox groups to choose + * tabs of 'server', 'db' or 'table' levels. + * + * @param string $title title of the checkbox group + * @param string $level 'server', 'db' or 'table' + * @param array $selected array of selected allowed tabs + * + * @return string HTML for checkbox groups + */ +function _getTabList($title, $level, $selected) +{ + $tabs = PMA_Util::getMenuTabList($level); + $html_output = '
'; + $html_output .= '' . $title . ''; + foreach ($tabs as $tab => $tabName) { + $html_output .= '
'; + $html_output .= ''; + $html_output .= ''; + $html_output .= '
'; + } + $html_output .= '
'; + return $html_output; +} + +/** + * Add/update a user group with allowed menu tabs. + * + * @param string $userGroup user group name + * @param boolean $new whether this is a new user group + * + * @return void + */ +function PMA_editUserGroup($userGroup, $new = false) +{ + $tabs = PMA_Util::getMenuTabList(); + $groupTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) + . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['usergroups']); + + if (! $new) { + $sql_query = "DELETE FROM " . $groupTable + . " WHERE `usergroup`='" . PMA_Util::sqlAddSlashes($userGroup) . "';"; + PMA_queryAsControlUser($sql_query, true); + } + + $sql_query = "INSERT INTO " . $groupTable + . "(`usergroup`, `tab`, `allowed`)" + . " VALUES "; + $first = true; + foreach ($tabs as $tabGroupName => $tabGroup) { + foreach ($tabs[$tabGroupName] as $tab => $tabName) { + if (! $first) { + $sql_query .= ", "; + } + $tabName = $tabGroupName . '_' . $tab; + $allowed = isset($_REQUEST[$tabName]) && $_REQUEST[$tabName] == 'Y'; + $sql_query .= "('" . $userGroup . "', '" . $tabName . "', '" + . ($allowed ? "Y" : "N") . "')"; + $first = false; + } + } + $sql_query .= ";"; + PMA_queryAsControlUser($sql_query, true); +} +?> \ No newline at end of file diff --git a/libraries/server_users.lib.php b/libraries/server_users.lib.php new file mode 100644 index 0000000000..57d59b7657 --- /dev/null +++ b/libraries/server_users.lib.php @@ -0,0 +1,55 @@ + __('Users overview'), + 'url' => 'server_privileges.php', + 'specific_params' => '&viewing_mode=server' + ), + array( + 'name' => __('User groups'), + 'url' => 'server_user_groups.php', + 'specific_params' => '' + ) + ); + + $retval = ''; + $retval .= '
'; + + return $retval; +} +?> \ No newline at end of file diff --git a/server_privileges.php b/server_privileges.php index 410f82b03e..4500f439b2 100644 --- a/server_privileges.php +++ b/server_privileges.php @@ -30,6 +30,7 @@ $scripts->addFile('server_privileges.js'); if ((isset($_REQUEST['viewing_mode']) && $_REQUEST['viewing_mode'] == 'server') && $GLOBALS['cfgRelation']['menuswork'] ) { + include_once 'libraries/server_users.lib.php'; $response->addHTML('
'); $response->addHTML(PMA_getHtmlForSubMenusOnUsersPage('server_privileges.php')); } diff --git a/server_user_groups.php b/server_user_groups.php index 65900a87ef..7236a91615 100644 --- a/server_user_groups.php +++ b/server_user_groups.php @@ -7,7 +7,8 @@ */ require_once 'libraries/common.inc.php'; -require_once 'libraries/server_privileges.lib.php'; +require_once 'libraries/server_users.lib.php'; +require_once 'libraries/server_user_groups.lib.php'; PMA_getRelationsParam(); if (! $GLOBALS['cfgRelation']['menuswork']) { diff --git a/test/libraries/PMA_server_user_groups_test.php b/test/libraries/PMA_server_user_groups_test.php index 88653c6cc0..aac165c3e4 100644 --- a/test/libraries/PMA_server_user_groups_test.php +++ b/test/libraries/PMA_server_user_groups_test.php @@ -12,7 +12,7 @@ require_once 'libraries/relation.lib.php'; /* * Include to test. */ -require_once 'libraries/server_privileges.lib.php'; +require_once 'libraries/server_user_groups.lib.php'; /** * Tests for server_user_groups.lib.php From 99e4afadcf54d0b35215abc61861862f6ef1a3a6 Mon Sep 17 00:00:00 2001 From: Kasun Chathuranga Date: Mon, 9 Sep 2013 07:33:59 +0530 Subject: [PATCH 4/4] Fix tests --- test/libraries/PMA_server_privileges_test.php | 36 ----------- test/libraries/PMA_server_users_test.php | 62 +++++++++++++++++++ 2 files changed, 62 insertions(+), 36 deletions(-) create mode 100644 test/libraries/PMA_server_users_test.php diff --git a/test/libraries/PMA_server_privileges_test.php b/test/libraries/PMA_server_privileges_test.php index ffc6a5ee78..dd41e1bac9 100644 --- a/test/libraries/PMA_server_privileges_test.php +++ b/test/libraries/PMA_server_privileges_test.php @@ -739,42 +739,6 @@ class PMA_ServerPrivileges_Test extends PHPUnit_Framework_TestCase ); } - /** - * Test for PMA_getHtmlForSubMenusOnUsersPage - * - * @return void - */ - public function testPMAGetHtmlForSubMenusOnUsersPage() - { - $html = PMA_getHtmlForSubMenusOnUsersPage('server_privileges.php'); - - //validate 1: topmenu2 - $this->assertContains( - '