diff --git a/ChangeLog b/ChangeLog index a79e19f98a..d93d1dcff9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -25,6 +25,7 @@ phpMyAdmin - ChangeLog - [core] Dropped support for PHP 5.2. + rfe #487 and rfe #1405 Find and Replacing column wise + rfe #1373 Use same create view dialog for editing a view ++ rfe #316 Configurable menus; allow user groups with customized menus per group 4.0.5.0 (not yet released) - bug #3977 Not detected configuration storage diff --git a/config.sample.inc.php b/config.sample.inc.php index 37a2f099b5..7c40fb40e3 100644 --- a/config.sample.inc.php +++ b/config.sample.inc.php @@ -59,6 +59,8 @@ $cfg['Servers'][$i]['AllowNoPassword'] = false; // $cfg['Servers'][$i]['designer_coords'] = 'pma__designer_coords'; // $cfg['Servers'][$i]['userconfig'] = 'pma__userconfig'; // $cfg['Servers'][$i]['recent'] = 'pma__recent'; +// $cfg['Servers'][$i]['users'] = 'pma__users'; +// $cfg['Servers'][$i]['usergroups'] = 'pma__usergroups'; /* Contrib / Swekey authentication */ // $cfg['Servers'][$i]['auth_swekey_config'] = '/etc/swekey-pma.conf'; diff --git a/doc/config.rst b/doc/config.rst index 5b9657c8c7..54fa34fe5d 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -649,6 +649,29 @@ Server connection settings * put the table name in :config:option:`$cfg['Servers'][$i]['table\_uiprefs']` (e.g. ``pma__table_uiprefs``) +.. _configurablemenus: +.. config:option:: $cfg['Servers'][$i]['users'] + + :type: string + :default: ``''`` + +.. config:option:: $cfg['Servers'][$i]['usergroups'] + + :type: string + :default: ``''`` + + Since release 4.1.0 you can create different user groups with menu items + attached to them. Users can be assigned to these groups and the logged in + user would only see menu items configured to the usergroup he is assigned to. + To do this it needs two tables "usergroups" (storing allowed menu items for each + user group) and "users" (storing users and their assignments to user groups). + + To allow the usage of this functionality: + + * set up :config:option:`$cfg['Servers'][$i]['pmadb']` and the phpMyAdmin configuration storage + * put the correct table names in + :config:option:`$cfg['Servers'][$i]['users']` (e.g. ``pma__users``) and + :config:option:`$cfg['Servers'][$i]['usergroups']` (e.g. ``pma__usergroups``) .. _tracking: .. config:option:: $cfg['Servers'][$i]['tracking'] diff --git a/examples/config.manyhosts.inc.php b/examples/config.manyhosts.inc.php index 1395ecc3d0..b9165355ee 100644 --- a/examples/config.manyhosts.inc.php +++ b/examples/config.manyhosts.inc.php @@ -45,4 +45,6 @@ foreach ($hosts as $host) { $cfg['Servers'][$i]['designer_coords'] = 'pma__designer_coords'; $cfg['Servers'][$i]['userconfig'] = 'pma__userconfig'; $cfg['Servers'][$i]['recent'] = 'pma__recent'; + $cfg['Servers'][$i]['users'] = 'pma__users'; + $cfg['Servers'][$i]['usergroups'] = 'pma__usergroups'; } diff --git a/examples/create_tables.sql b/examples/create_tables.sql index 723334c776..ae2c81408c 100644 --- a/examples/create_tables.sql +++ b/examples/create_tables.sql @@ -239,3 +239,66 @@ CREATE TABLE IF NOT EXISTS `pma__userconfig` ( ) COMMENT='User preferences storage for phpMyAdmin' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__users` +-- + +CREATE TABLE IF NOT EXISTS `pma__users` ( + `username` varchar(64) NOT NULL, + `usergroup` varchar(64) NOT NULL, + PRIMARY KEY (`username`,`usergroup`) +) + COMMENT='Users and their assignments to user groups' + DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__usergroups` +-- + +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`) +) + 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 92de90afec..257018815a 100644 --- a/examples/create_tables_drizzle.sql +++ b/examples/create_tables_drizzle.sql @@ -225,3 +225,66 @@ CREATE TABLE IF NOT EXISTS `pma__userconfig` ( ) COMMENT='User preferences storage for phpMyAdmin' COLLATE utf8_bin; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__users` +-- + +CREATE TABLE IF NOT EXISTS `pma__users` ( + `username` varchar(64) NOT NULL, + `usergroup` varchar(64) NOT NULL, + PRIMARY KEY (`username`,`usergroup`) +) + COMMENT='Users and their assignments to user groups' + COLLATE utf8_bin; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pma__usergroups` +-- + +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`) +) + COMMENT='User groups with configured menu items' + COLLATE utf8_bin; diff --git a/js/server_privileges.js b/js/server_privileges.js index 7f31c93392..935c99f0c5 100644 --- a/js/server_privileges.js +++ b/js/server_privileges.js @@ -172,6 +172,7 @@ AJAX.registerTeardown('server_privileges.js', function () { $('form[name=usersForm]').unbind('submit'); $("#fieldset_delete_user_footer #buttonGo.ajax").die('click'); $("a.edit_user_anchor.ajax").die('click'); + $("a.edit_user_group_anchor.ajax").die('click'); $("#edit_user_dialog").find("form.ajax").die('submit'); $("button.mult_submit[value=export]").die('click'); $("a.export_user_anchor.ajax").die('click'); @@ -300,6 +301,75 @@ AJAX.registerOnload('server_privileges.js', function () { }); // end $.post() }); // end Revoke User + $("a.edit_user_group_anchor.ajax").live('click', function (event) { + event.preventDefault(); + $(this).parents('tr').addClass('current_row'); + var token = $(this).parents('form').find('input[name="token"]').val(); + var $msg = PMA_ajaxShowMessage(); + $.get( + $(this).attr('href'), + { + 'ajax_request': true, + 'edit_user_group_dialog': true, + 'token': token + }, + function (data) { + if (data.success === true) { + PMA_ajaxRemoveMessage($msg); + var buttonOptions = {}; + buttonOptions[PMA_messages.strGo] = function () { + var usrGroup = $('#changeUserGroupDialog') + .find('select[name="userGroup"]') + .val(); + var $message = PMA_ajaxShowMessage(); + $.get( + 'server_privileges.php', + $('#changeUserGroupDialog').find('form').serialize() + '&ajax_request=1', + function (data) { + PMA_ajaxRemoveMessage($message); + if (data.success === true) { + $("#usersForm") + .find('.current_row') + .removeClass('current_row') + .find('.usrGroup') + .text(usrGroup); + } else { + PMA_ajaxShowMessage(data.error, false); + $("#usersForm") + .find('.current_row') + .removeClass('current_row'); + } + } + ); + $(this).dialog("close"); + }; + buttonOptions[PMA_messages.strClose] = function () { + $(this).dialog("close"); + }; + var $dialog = $('
') + .attr('id', 'changeUserGroupDialog') + .append(data.message) + .dialog({ + width: 500, + minWidth: 300, + modal: true, + buttons: buttonOptions, + title: $('legend', $(data.message)).text(), + close: function () { + $(this).remove(); + } + }); + $dialog.find('legend').remove(); + } else { + PMA_ajaxShowMessage(data.error, false); + $("#usersForm") + .find('.current_row') + .removeClass('current_row'); + } + } + ); + }); + /** * AJAX handler for 'Edit User' * diff --git a/libraries/Menu.class.php b/libraries/Menu.class.php index 687c20332a..d1f60d3b40 100644 --- a/libraries/Menu.class.php +++ b/libraries/Menu.class.php @@ -99,17 +99,64 @@ class PMA_Menu { $tabs = array(); $url_params = array('db' => $this->_db); + $level = ''; + if (strlen($this->_table)) { $tabs = $this->_getTableTabs(); $url_params['table'] = $this->_table; + $level = 'table'; } else if (strlen($this->_db)) { $tabs = $this->_getDbTabs(); + $level = 'db'; } else { $tabs = $this->_getServerTabs(); + $level = 'server'; + } + + $allowedTabs = $this->_getAllowedTabs($level); + foreach ($tabs as $key => $value) { + if (! array_key_exists($key, $allowedTabs)) { + unset($tabs[$key]); + } } return PMA_Util::getHtmlTabs($tabs, $url_params, 'topmenu', true); } + /** + * Returns a list of allowed tabs for the current user for the given level + * + * @param string $level 'server', 'db' or 'table' level + * + * @return array list of allowed tabs + */ + private function _getAllowedTabs($level) + { + $allowedTabs = PMA_Util::getMenuTabList($level); + if ($GLOBALS['cfgRelation']['menuswork']) { + $groupTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) + . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['usergroups']); + $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 " + . $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]); + } + } + } + } + return $allowedTabs; + } + /** * Returns the breadcrumbs as HTML * @@ -130,21 +177,13 @@ class PMA_Menu $item = ''; - if (in_array( - $GLOBALS['cfg']['TabsMode'], - array('text', 'both') - ) - ) { + if (in_array($GLOBALS['cfg']['TabsMode'], array('text', 'both'))) { $item .= '%4$s: '; } $item .= '%3$s'; $retval .= "
"; $retval .= "
"; - if (in_array( - $GLOBALS['cfg']['TabsMode'], - array('icons', 'both') - ) - ) { + if (in_array($GLOBALS['cfg']['TabsMode'], array('icons', 'both'))) { $retval .= PMA_Util::getImage( 's_host.png', '', @@ -161,11 +200,7 @@ class PMA_Menu if (strlen($this->_db)) { $retval .= $separator; - if (in_array( - $GLOBALS['cfg']['TabsMode'], - array('icons', 'both') - ) - ) { + if (in_array($GLOBALS['cfg']['TabsMode'], array('icons', 'both'))) { $retval .= PMA_Util::getImage( 's_db.png', '', @@ -187,11 +222,7 @@ class PMA_Menu include './libraries/tbl_info.inc.php'; $retval .= $separator; - if (in_array( - $GLOBALS['cfg']['TabsMode'], - array('icons', 'both') - ) - ) { + if (in_array($GLOBALS['cfg']['TabsMode'], array('icons', 'both'))) { $icon = $tbl_is_view ? 'b_views.png' : 's_tbl.png'; $retval .= PMA_Util::getImage( $icon, @@ -444,11 +475,9 @@ class PMA_Menu { $is_superuser = isset($GLOBALS['dbi']) && $GLOBALS['dbi']->isSuperuser(); $binary_logs = null; - if (isset($GLOBALS['dbi']) - && (! defined('PMA_DRIZZLE') - || (defined('PMA_DRIZZLE') && ! PMA_DRIZZLE) - ) - ) { + $notDrizzle = ! defined('PMA_DRIZZLE') + || (defined('PMA_DRIZZLE') && ! PMA_DRIZZLE); + if (isset($GLOBALS['dbi']) && $notDrizzle) { $binary_logs = $GLOBALS['dbi']->fetchResult( 'SHOW MASTER LOGS', 'Log_name', @@ -486,6 +515,10 @@ class PMA_Menu $tabs['rights']['icon'] = 's_rights.png'; $tabs['rights']['link'] = 'server_privileges.php'; $tabs['rights']['text'] = __('Users'); + $tabs['rights']['active'] = in_array( + basename($GLOBALS['PMA_PHP_SELF']), + array('server_privileges.php', 'server_user_groups.php') + ); } $tabs['export']['icon'] = 'b_export.png'; diff --git a/libraries/Util.class.php b/libraries/Util.class.php index f4ce701e97..5b229ab4aa 100644 --- a/libraries/Util.class.php +++ b/libraries/Util.class.php @@ -4153,6 +4153,69 @@ class PMA_Util return $regex; } + /** + * Return the list of tabs for the menu with corresponding names + * + * @param string $level 'server', 'db' or 'table' level + * + * @return array list of tabs for the menu + */ + public static function getMenuTabList($level = null) + { + $tabList = array( + 'server' => array( + 'databases' => __('Databases'), + 'sql' => __('SQL'), + 'status' => __('Status'), + 'rights' => __('Users'), + 'export' => __('Export'), + 'import' => __('Import'), + 'settings' => __('Settings'), + 'binlog' => __('Binary log'), + 'replication' => __('Replication'), + 'vars' => __('Variables'), + 'charset' => __('Charsets'), + 'plugins' => __('Plugins'), + 'engine' => __('Engines') + ), + 'db' => array( + 'structure' => __('Structure'), + 'sql' => __('SQL'), + 'search' => __('Search'), + 'qbe' => __('Query'), + 'export' => __('Export'), + 'import' => __('Import'), + 'operation' => __('Operations'), + 'privileges' => __('Privileges'), + 'routines' => __('Routines'), + 'events' => __('Events'), + 'triggers' => __('Triggers'), + 'tracking' => __('Tracking'), + 'designer' => __('Designer') + ), + 'table' => array( + 'browse' => __('Browse'), + 'structure' => __('Structure'), + 'sql' => __('SQL'), + 'search' => __('Search'), + 'insert' => __('Insert'), + 'export' => __('Export'), + 'import' => __('Import'), + 'operation' => __('Operations'), + 'tracking' => __('Tracking'), + 'triggers' => __('Triggers'), + ) + ); + + if ($level == null) { + return $tabList; + } else if (array_key_exists($level, $tabList)) { + return $tabList[$level]; + } else { + return null; + } + } + /** * Returns information with latest version from phpmyadmin.net * @@ -4191,9 +4254,8 @@ class PMA_Util $cfg['VersionCheckProxyUser'] . ':' . $cfg['VersionCheckProxyPass'] ); - $context['http']['header'] = - 'Proxy-Authorization: Basic ' - . $auth; + $context['http']['header'] + = 'Proxy-Authorization: Basic ' . $auth; } } $response = file_get_contents( diff --git a/libraries/config.default.php b/libraries/config.default.php index 39ba514a95..e8d2130565 100644 --- a/libraries/config.default.php +++ b/libraries/config.default.php @@ -402,6 +402,24 @@ $cfg['Servers'][$i]['tracking'] = ''; */ $cfg['Servers'][$i]['userconfig'] = ''; +/** + * table to store users and their assignment to user groups + * - leave blank to disable configurable menus feature + * SUGGESTED: 'pma__users' + * + * @global string $cfg['Servers'][$i]['users'] + */ +$cfg['Servers'][$i]['users'] = ''; + +/** + * table to store allowed menu items for each user group + * - leave blank to disable configurable menus feature + * SUGGESTED: 'pma__usergroups' + * + * @global string $cfg['Servers'][$i]['usergroups'] + */ +$cfg['Servers'][$i]['usergroups'] = ''; + /** * Maximum number of records saved in $cfg['Servers'][$i]['table_uiprefs'] table. * diff --git a/libraries/config/messages.inc.php b/libraries/config/messages.inc.php index e419953d86..d0db72b4b7 100644 --- a/libraries/config/messages.inc.php +++ b/libraries/config/messages.inc.php @@ -450,6 +450,10 @@ $strConfigServers_tracking_version_auto_create_desc = __('Whether the tracking m $strConfigServers_tracking_version_auto_create_name = __('Automatically create versions'); $strConfigServers_userconfig_desc = __('Leave blank for no user preferences storage in database, suggested: [kbd]pma__userconfig[/kbd]'); $strConfigServers_userconfig_name = __('User preferences storage table'); +$strConfigServers_users_desc = __('Leave blank to disable configurable menus feature, suggested: [kbd]pma__users[/kbd]'); +$strConfigServers_users_name = __('Users table'); +$strConfigServers_usergroups_desc = __('Leave blank to disable configurable menus feature, suggested: [kbd]pma__usergroups[/kbd]'); +$strConfigServers_usergroups_name = __('User groups table'); $strConfigServers_user_desc = __('Leave empty if not using config auth'); $strConfigServers_user_name = __('User for config auth'); $strConfigServers_verbose_desc = __('A user-friendly description of this server. Leave blank to display the hostname instead.'); diff --git a/libraries/config/setup.forms.php b/libraries/config/setup.forms.php index d2f5e4d6c6..da81bd0a55 100644 --- a/libraries/config/setup.forms.php +++ b/libraries/config/setup.forms.php @@ -70,6 +70,8 @@ $forms['Servers']['Server_pmadb'] = array('Servers' => array(1 => array( 'bookmarktable' => 'pma__bookmark', 'relation' => 'pma__relation', 'userconfig' => 'pma__userconfig', + 'users' => 'pma__users', + 'usergroups' => 'pma__usergroups', 'table_info' => 'pma__table_info', 'column_info' => 'pma__column_info', 'history' => 'pma__history', diff --git a/libraries/relation.lib.php b/libraries/relation.lib.php index b684161a42..c3b83c3d40 100644 --- a/libraries/relation.lib.php +++ b/libraries/relation.lib.php @@ -248,6 +248,23 @@ function PMA_getRelationsParamDiagnostic($cfgRelation) 'userconfigwork', $messages ); + $retval .= PMA_getDiagMessageForParameter( + 'users', + isset($cfgRelation['users']), + $messages, + 'users' + ); + $retval .= PMA_getDiagMessageForParameter( + 'usergroups', + isset($cfgRelation['usergroups']), + $messages, + 'usergroups' + ); + $retval .= PMA_getDiagMessageForFeature( + __('Configurable menus'), + 'menuswork', + $messages + ); $retval .= '' . "\n"; $retval .= '

' . __('Quick steps to setup advanced features:') . '

'; @@ -347,22 +364,23 @@ function PMA_getDiagMessageForParameter($parameter, */ function PMA_checkRelationsParam() { - $cfgRelation = array(); - $cfgRelation['relwork'] = false; - $cfgRelation['displaywork'] = false; - $cfgRelation['bookmarkwork']= false; - $cfgRelation['pdfwork'] = false; - $cfgRelation['commwork'] = false; - $cfgRelation['mimework'] = false; - $cfgRelation['historywork'] = false; - $cfgRelation['recentwork'] = false; - $cfgRelation['uiprefswork'] = false; - $cfgRelation['trackingwork'] = false; - $cfgRelation['designerwork'] = false; + $cfgRelation = array(); + $cfgRelation['relwork'] = false; + $cfgRelation['displaywork'] = false; + $cfgRelation['bookmarkwork'] = false; + $cfgRelation['pdfwork'] = false; + $cfgRelation['commwork'] = false; + $cfgRelation['mimework'] = false; + $cfgRelation['historywork'] = false; + $cfgRelation['recentwork'] = false; + $cfgRelation['uiprefswork'] = false; + $cfgRelation['trackingwork'] = false; + $cfgRelation['designerwork'] = false; $cfgRelation['userconfigwork'] = false; - $cfgRelation['allworks'] = false; - $cfgRelation['user'] = null; - $cfgRelation['db'] = null; + $cfgRelation['menuswork'] = false; + $cfgRelation['allworks'] = false; + $cfgRelation['user'] = null; + $cfgRelation['db'] = null; if ($GLOBALS['server'] == 0 || empty($GLOBALS['cfg']['Server']['pmadb']) @@ -408,21 +426,25 @@ function PMA_checkRelationsParam() } elseif ($curr_table[0] == $GLOBALS['cfg']['Server']['table_coords']) { $cfgRelation['table_coords'] = $curr_table[0]; } elseif ($curr_table[0] == $GLOBALS['cfg']['Server']['designer_coords']) { - $cfgRelation['designer_coords'] = $curr_table[0]; + $cfgRelation['designer_coords'] = $curr_table[0]; } elseif ($curr_table[0] == $GLOBALS['cfg']['Server']['column_info']) { - $cfgRelation['column_info'] = $curr_table[0]; + $cfgRelation['column_info'] = $curr_table[0]; } elseif ($curr_table[0] == $GLOBALS['cfg']['Server']['pdf_pages']) { $cfgRelation['pdf_pages'] = $curr_table[0]; } elseif ($curr_table[0] == $GLOBALS['cfg']['Server']['history']) { - $cfgRelation['history'] = $curr_table[0]; + $cfgRelation['history'] = $curr_table[0]; } elseif ($curr_table[0] == $GLOBALS['cfg']['Server']['recent']) { - $cfgRelation['recent'] = $curr_table[0]; + $cfgRelation['recent'] = $curr_table[0]; } elseif ($curr_table[0] == $GLOBALS['cfg']['Server']['table_uiprefs']) { - $cfgRelation['table_uiprefs'] = $curr_table[0]; + $cfgRelation['table_uiprefs'] = $curr_table[0]; } elseif ($curr_table[0] == $GLOBALS['cfg']['Server']['tracking']) { - $cfgRelation['tracking'] = $curr_table[0]; + $cfgRelation['tracking'] = $curr_table[0]; } elseif ($curr_table[0] == $GLOBALS['cfg']['Server']['userconfig']) { - $cfgRelation['userconfig'] = $curr_table[0]; + $cfgRelation['userconfig'] = $curr_table[0]; + } elseif ($curr_table[0] == $GLOBALS['cfg']['Server']['users']) { + $cfgRelation['users'] = $curr_table[0]; + } elseif ($curr_table[0] == $GLOBALS['cfg']['Server']['usergroups']) { + $cfgRelation['usergroups'] = $curr_table[0]; } } // end while $GLOBALS['dbi']->freeResult($tab_rs); @@ -430,7 +452,7 @@ function PMA_checkRelationsParam() if (isset($cfgRelation['relation'])) { $cfgRelation['relwork'] = true; if (isset($cfgRelation['table_info'])) { - $cfgRelation['displaywork'] = true; + $cfgRelation['displaywork'] = true; } } @@ -473,12 +495,17 @@ function PMA_checkRelationsParam() $cfgRelation['bookmarkwork'] = true; } + if (isset($cfgRelation['users']) && isset($cfgRelation['usergroups'])) { + $cfgRelation['menuswork'] = true; + } + if ($cfgRelation['relwork'] && $cfgRelation['displaywork'] && $cfgRelation['pdfwork'] && $cfgRelation['commwork'] && $cfgRelation['mimework'] && $cfgRelation['historywork'] && $cfgRelation['recentwork'] && $cfgRelation['uiprefswork'] && $cfgRelation['trackingwork'] && $cfgRelation['userconfigwork'] && $cfgRelation['bookmarkwork'] && $cfgRelation['designerwork'] + && $cfgRelation['menuswork'] ) { $cfgRelation['allworks'] = true; } diff --git a/libraries/server_privileges.lib.php b/libraries/server_privileges.lib.php index 46a35c6970..543c121b21 100644 --- a/libraries/server_privileges.lib.php +++ b/libraries/server_privileges.lib.php @@ -390,6 +390,103 @@ function PMA_getSqlQueryForDisplayPrivTable($db, $table, $username, $hostname) ." AND `Db` = '" . PMA_Util::unescapeMysqlWildcards($db) . "'" ." AND `Table_name` = '" . PMA_Util::sqlAddSlashes($table) . "';"; } + +/** + * Displays a dropdown to select the user group + * with menu items configured to each of them. + * + * @param string $username username + * + * @return string html to select the user group + */ +function PMA_getHtmlToChoseUserGroup($username) +{ + $html_output = '
'; + $params = array('username' => $username); + $html_output .= PMA_generate_common_hidden_inputs($params); + $html_output .= '
'; + $html_output .= '' . __('User group') . ''; + + $groupTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) + . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['usergroups']); + $userTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) + . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['users']); + + $userGroups = array(); + $sql_query = "SELECT `usergroup` FROM " . $groupTable; + $result = PMA_queryAsControlUser($sql_query, false); + if ($result) { + while ($row = $GLOBALS['dbi']->fetchRow($result)) { + $userGroups[] = $row[0]; + } + } + $GLOBALS['dbi']->freeResult($result); + + $userGroup = ''; + if (isset($GLOBALS['username'])) { + $sql_query = "SELECT `usergroup` FROM " . $userTable + . " WHERE `username` = '" . PMA_Util::sqlAddSlashes($username) . "'"; + $userGroup = $GLOBALS['dbi']->fetchValue( + $sql_query, 0, 0, $GLOBALS['controllink'] + ); + } + + $html_output .= __('User group') . ': '; + $html_output .= ''; + $html_output .= ''; + $html_output .= '
'; + $html_output .= '
'; + return $html_output; +} + +/** + * Sets the user group from request values + * + * @param string $username username + * @param string $userGroup user group to set + * + * @return void + */ +function PMA_setUserGroup($username, $userGroup) +{ + $userTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) + . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['users']); + + $sql_query = "SELECT `usergroup` FROM " . $userTable + . " WHERE `username` = '" . PMA_Util::sqlAddSlashes($username) . "'"; + $oldUserGroup = $GLOBALS['dbi']->fetchValue( + $sql_query, 0, 0, $GLOBALS['controllink'] + ); + + if ($oldUserGroup === false) { + $upd_query = "INSERT INTO " . $userTable . "(`username`, `usergroup`)" + . " VALUES ('" . PMA_Util::sqlAddSlashes($username) . "', " + . "'" . PMA_Util::sqlAddSlashes($userGroup) . "')"; + } else { + if (empty($userGroup)) { + $upd_query = "DELETE FROM " . $userTable + . " WHERE `username`='" . PMA_Util::sqlAddSlashes($username) . "'"; + } elseif ($oldUserGroup != $userGroup) { + $upd_query = "UPDATE " . $userTable + . " SET `usergroup`='" . PMA_Util::sqlAddSlashes($userGroup) . "'" + . " WHERE `username`='" . PMA_Util::sqlAddSlashes($username) . "'"; + } + } + if (isset($upd_query)) { + PMA_queryAsControlUser($upd_query); + } +} + /** * Displays the privileges form table * @@ -591,7 +688,7 @@ function PMA_getHtmlForDisplayResourceLimits($row) * @param string $db the database * @param string $table the table * @param boolean $columns columns array - * @param $row current privileges row + * @param array $row current privileges row * * @return string $html_output */ @@ -2429,9 +2526,12 @@ function PMA_getUsersOverview($result, $db_rights, $link_edit, $pmaThemeImage, . PMA_Util::showHint( __('Note: MySQL privilege names are expressed in English') ) - . '' . "\n" - . '' . __('Grant') . '' . "\n" - . '' . __('Action') . '' . "\n" + . '' . "\n"; + if ($GLOBALS['cfgRelation']['menuswork']) { + $html_output .= '' . __('User group') . '' . "\n"; + } + $html_output .= '' . __('Grant') . '' . "\n" + . '' . __('Action') . '' . "\n" . '' . "\n" . '' . "\n"; @@ -2479,6 +2579,27 @@ function PMA_getUsersOverview($result, $db_rights, $link_edit, $pmaThemeImage, */ function PMA_getTableBodyForUserRightsTable($db_rights, $link_edit, $link_export) { + if ($GLOBALS['cfgRelation']['menuswork']) { + $usersTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) + . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['users']); + $sqlQuery = "SELECT * FROM " . $usersTable; + $result = PMA_queryAsControlUser($sqlQuery, false); + $groupAssignment = array(); + if ($result) { + while ($row = $GLOBALS['dbi']->fetchAssoc($result)) { + $groupAssignment[$row['username']] = $row['usergroup']; + } + } + $GLOBALS['dbi']->freeResult($result); + + $link_edit_user_group = '' + . PMA_Util::getIcon('b_usrlist.png', __('Edit user group')) + . ''; + } + $odd_row = true; $index_checkbox = 0; $html_output = ''; @@ -2521,28 +2642,48 @@ function PMA_getTableBodyForUserRightsTable($db_rights, $link_edit, $link_export $html_output .= '' . "\n" . '' . implode(',' . "\n" . ' ', $host['privs']) . "\n" - . '' . "\n" - . '' + . '' . "\n"; + if ($GLOBALS['cfgRelation']['menuswork']) { + $html_output .= '' . "\n" + . (isset($groupAssignment[$host['User']]) + ? $groupAssignment[$host['User']] + : '' + ) + . '' . "\n"; + } + $html_output .= '' . ($host['Grant_priv'] == 'Y' ? __('Yes') : __('No')) - . '' . "\n" - . '' + . '' . "\n"; + + $html_output .= '' . sprintf( $link_edit, urlencode($host['User']), urlencode($host['Host']), '', '' - ); - $html_output .= ''; - - $html_output .= ''; - $html_output .= sprintf( - $link_export, - urlencode($host['User']), - urlencode($host['Host']), - (isset($_GET['initial']) ? $_GET['initial'] : '') - ); - $html_output .= ''; + ) + . ''; + if ($GLOBALS['cfgRelation']['menuswork']) { + if (empty($host['User'])) { + $html_output .= ''; + } else { + $html_output .= '' + . sprintf( + $link_edit_user_group, + urlencode($host['User']) + ) + . ''; + } + } + $html_output .= '' + . sprintf( + $link_export, + urlencode($host['User']), + urlencode($host['Host']), + (isset($_GET['initial']) ? $_GET['initial'] : '') + ) + . ''; $html_output .= ''; $odd_row = ! $odd_row; } @@ -3028,8 +3169,324 @@ function PMA_getHtmlForDisplayUserOverviewPage($link_edit, $pmaThemeImage, $flushnote->addParam('', false); $html_output .= $flushnote->getDisplay(); } - return $html_output; } + + return $html_output; +} + +/** + * Return HTML to list the users belonging to a given user group + * + * @param string $userGroup user group name + * + * @return HTML to list the users belonging to a given user group + */ +function PMA_getHtmlForListingUsersofAGroup($userGroup) +{ + $html_output = '

' + . 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') . '

'; + $html_output .= '
'; + $html_output .= PMA_generate_common_hidden_inputs(); + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + + $groupTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) + . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['usergroups']); + $sql_query = "SELECT * FROM " . $groupTable; + $result = PMA_queryAsControlUser($sql_query, false); + if ($result) { + $odd = true; + while ($row = $GLOBALS['dbi']->fetchAssoc($result)) { + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + + $html_output .= ''; + + $html_output .= ''; + + $odd = ! $odd; + } + } + $GLOBALS['dbi']->freeResult($result); + + $html_output .= ''; + $html_output .= '
' . __('User group') . '' . __('Server level tabs') . '' . __('Database level tabs') . '' . __('Table level tabs') . '' . __('Action') . '
' . htmlspecialchars($row['usergroup']) . '' . _getAllowedTabNames($row, 'server') . '' . _getAllowedTabNames($row, 'db') . '' . _getAllowedTabNames($row, '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 .= '
'; + + $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) +{ + $groupTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) + . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['usergroups']); + $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_generate_common_hidden_inputs($urlParams); + + $html_output .= '
'; + $html_output .= '' . __('User group privileges') + . '   ' + . '' + . '' + . ''; + + 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) { + $row = $GLOBALS['dbi']->fetchAssoc($result); + foreach ($row as $key => $value) { + 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( + __('Sever 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']); + + $cols = ""; + $vals = ""; + $colsNvals = ""; + 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 ($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) . "'"; + } + PMA_queryAsControlUser($sql_query, true); } /** @@ -3068,9 +3525,6 @@ function PMA_getHtmlForDisplayUserProperties($dbname_is_wildcard,$url_dbname, } $class = ' class="ajax"'; - $html_output .= '' . "\n"; - $_params = array( 'username' => $username, 'hostname' => $hostname, @@ -3081,8 +3535,10 @@ function PMA_getHtmlForDisplayUserProperties($dbname_is_wildcard,$url_dbname, $_params['tablename'] = $tablename; } } - $html_output .= PMA_generate_common_hidden_inputs($_params); + $html_output .= '' . "\n"; + $html_output .= PMA_generate_common_hidden_inputs($_params); $html_output .= PMA_getHtmlToDisplayPrivilegesTable( PMA_ifSetOr($dbname, '*', 'length'), PMA_ifSetOr($tablename, '*', 'length') @@ -3402,4 +3858,44 @@ 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_generate_common_url(); + $items = array( + array( + 'name' => __('Users overview'), + 'url' => 'server_privileges.php' + ), + array( + 'name' => __('User groups'), + 'url' => 'server_user_groups.php' + ) + ); + + $retval = '
    '; + foreach ($items as $item) { + $class = ''; + if ($item['url'] === $selfUrl) { + $class = ' class="tabactive"'; + } + $retval .= '
  • '; + $retval .= ''; + $retval .= $item['name']; + $retval .= ''; + $retval .= '
  • '; + } + $retval .= '
'; + $retval .= '
'; + + return $retval; +} ?> diff --git a/server_privileges.php b/server_privileges.php index a74f213709..3136e9a8b3 100644 --- a/server_privileges.php +++ b/server_privileges.php @@ -16,6 +16,8 @@ require_once 'libraries/common.inc.php'; require_once 'libraries/display_change_password.lib.php'; require_once 'libraries/server_privileges.lib.php'; +$cfgRelation = PMA_getRelationsParam(); + /** * Does the common work */ @@ -24,6 +26,11 @@ $header = $response->getHeader(); $scripts = $header->getScripts(); $scripts->addFile('server_privileges.js'); +if ($GLOBALS['cfgRelation']['menuswork']) { + $response->addHTML('
'); + $response->addHTML(PMA_getHtmlForSubMenusOnUsersPage('server_privileges.php')); +} + $_add_user_error = false; if (isset ($_REQUEST['username'])) { @@ -228,6 +235,9 @@ if (isset($_REQUEST['adduser_submit']) || isset($_REQUEST['change_copy'])) { $_error, $real_sql_query, $sql_query, $username, $hostname, isset($dbname) ? $dbname : null ); + if (! empty($_REQUEST['userGroup']) && $cfgRelation['menuswork']) { + PMA_setUserGroup($GLOBALS['username'], $_REQUEST['userGroup']); + } } else { if (isset($create_user_real)) { @@ -268,6 +278,14 @@ if (! empty($_POST['update_privs'])) { ); } +/** + * Assign users to user groups + */ +if (! empty($_REQUEST['changeUserGroup']) && $cfgRelation['menuswork']) { + PMA_setUserGroup($username, $_REQUEST['userGroup']); + $message = PMA_Message::success(); +} + /** * Revokes Privileges */ @@ -378,6 +396,7 @@ if ($GLOBALS['is_ajax_request'] && (! isset($_REQUEST['initial']) || empty($_REQUEST['initial'])) && ! isset($_REQUEST['showall']) && ! isset($_REQUEST['edit_user_dialog']) + && ! isset($_REQUEST['edit_user_group_dialog']) && ! isset($_REQUEST['db_specific']) ) { $extra_data = PMA_getExtraDataForAjaxBehavior( @@ -424,6 +443,18 @@ if (isset($_REQUEST['viewing_mode']) && $_REQUEST['viewing_mode'] == 'db') { * Displays the page */ + +if (! empty($_REQUEST['edit_user_group_dialog']) && $cfgRelation['menuswork']) { + $dialog = PMA_getHtmlToChoseUserGroup($username); + $response = PMA_Response::getInstance(); + if ($GLOBALS['is_ajax_request']) { + $response->addJSON('message', $dialog); + exit; + } else { + $response->addHTML($dialog); + } +} + // export user definition if (isset($_REQUEST['export']) || (isset($_REQUEST['submit_mult']) && $_REQUEST['submit_mult'] == 'export') @@ -491,4 +522,8 @@ if (empty($_REQUEST['adduser']) ); } // end if (empty($_REQUEST['adduser']) && empty($checkprivs))... elseif... else... +if ($GLOBALS['cfgRelation']['menuswork']) { + $response->addHTML('
'); +} + ?> diff --git a/server_user_groups.php b/server_user_groups.php new file mode 100644 index 0000000000..4099afc539 --- /dev/null +++ b/server_user_groups.php @@ -0,0 +1,59 @@ +addHTML('
'); +$response->addHTML(PMA_getHtmlForSubMenusOnUsersPage('server_user_groups.php')); + +/** + * Delete user group + */ +if (! empty($_REQUEST['deleteUserGroup'])) { + PMA_deleteUserGroup($_REQUEST['userGroup']); +} + +/** + * Add a new user group + */ +if (! empty($_REQUEST['addUserGroupSubmit'])) { + PMA_editUserGroup($_REQUEST['userGroup'], true); +} + +/** + * Update a user group + */ +if (! empty($_REQUEST['editUserGroupSubmit'])) { + PMA_editUserGroup($_REQUEST['userGroup']); +} + +if (isset($_REQUEST['viewUsers'])) { + // Display users belonging to a user group + $response->addHTML(PMA_getHtmlForListingUsersofAGroup($_REQUEST['userGroup'])); +} + +if (isset($_REQUEST['addUserGroup'])) { + // Display add user group dialog + $response->addHTML(PMA_getHtmlToEditUserGroup()); +} elseif (isset($_REQUEST['editUserGroup'])) { + // Display edit user group dialog + $response->addHTML(PMA_getHtmlToEditUserGroup($_REQUEST['userGroup'])); +} else { + // Display user groups table + $response->addHTML(PMA_getHtmlForUserGroupsTable()); +} + +$response->addHTML('
'); +?> \ No newline at end of file diff --git a/themes/original/css/common.css.php b/themes/original/css/common.css.php index 4b36a6307e..16f32ce1a7 100644 --- a/themes/original/css/common.css.php +++ b/themes/original/css/common.css.php @@ -953,6 +953,10 @@ div#tablestatistics table { float: ; } +#fieldset_user_group_rights fieldset { + float: ; +} + #fieldset_user_global_rights legend input { margin-: 2em; } diff --git a/themes/pmahomme/css/common.css.php b/themes/pmahomme/css/common.css.php index af8e0e5bc9..7c903aed0a 100644 --- a/themes/pmahomme/css/common.css.php +++ b/themes/pmahomme/css/common.css.php @@ -1207,6 +1207,10 @@ div#tablestatistics table { float: ; } +#fieldset_user_group_rights fieldset { + float: ; +} + #fieldset_user_global_rights legend input { margin-: 2em; }