Merge branch 'master' of https://github.com/phpmyadmin/phpmyadmin into server_refactor2
This commit is contained in:
commit
ab05e84092
@ -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
|
||||
|
||||
@ -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';
|
||||
|
||||
|
||||
@ -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']
|
||||
|
||||
@ -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';
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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 = $('<div/>')
|
||||
.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'
|
||||
*
|
||||
|
||||
@ -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 = '<a href="%1$s?%2$s" class="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</a>';
|
||||
$retval .= "<div id='floating_menubar'></div>";
|
||||
$retval .= "<div id='serverinfo'>";
|
||||
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';
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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.
|
||||
*
|
||||
|
||||
@ -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.');
|
||||
|
||||
@ -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',
|
||||
|
||||
@ -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 .= '</table>' . "\n";
|
||||
|
||||
$retval .= '<p>' . __('Quick steps to setup advanced features:') . '</p>';
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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 = '<form class="ajax" id="changeUserGroupForm"'
|
||||
. ' action="server_privileges.php" method="post">';
|
||||
$params = array('username' => $username);
|
||||
$html_output .= PMA_generate_common_hidden_inputs($params);
|
||||
$html_output .= '<fieldset id="fieldset_user_group_selection">';
|
||||
$html_output .= '<legend>' . __('User group') . '</legend>';
|
||||
|
||||
$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 .= '<select name="userGroup">';
|
||||
$html_output .= '<option value=""></option>';
|
||||
foreach ($userGroups as $oneUserGroup) {
|
||||
$html_output .= '<option value="' . htmlspecialchars($oneUserGroup) . '"'
|
||||
. ($oneUserGroup == $userGroup ? ' selected="selected"' : '')
|
||||
. '>'
|
||||
. htmlspecialchars($oneUserGroup)
|
||||
. '</option>';
|
||||
}
|
||||
$html_output .= '</select>';
|
||||
$html_output .= '<input type="hidden" name="changeUserGroup" value="1">';
|
||||
$html_output .= '</fieldset>';
|
||||
$html_output .= '</form>';
|
||||
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')
|
||||
)
|
||||
. '</th>' . "\n"
|
||||
. '<th>' . __('Grant') . '</th>' . "\n"
|
||||
. '<th colspan="2">' . __('Action') . '</th>' . "\n"
|
||||
. '</th>' . "\n";
|
||||
if ($GLOBALS['cfgRelation']['menuswork']) {
|
||||
$html_output .= '<th>' . __('User group') . '</th>' . "\n";
|
||||
}
|
||||
$html_output .= '<th>' . __('Grant') . '</th>' . "\n"
|
||||
. '<th colspan="3">' . __('Action') . '</th>' . "\n"
|
||||
. '</tr>' . "\n"
|
||||
. '</thead>' . "\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 = '<a class="edit_user_group_anchor ajax"'
|
||||
. ' href="server_privileges.php?'
|
||||
. str_replace('%', '%%', $GLOBALS['url_query'])
|
||||
. '&username=%s">'
|
||||
. PMA_Util::getIcon('b_usrlist.png', __('Edit user group'))
|
||||
. '</a>';
|
||||
}
|
||||
|
||||
$odd_row = true;
|
||||
$index_checkbox = 0;
|
||||
$html_output = '';
|
||||
@ -2521,28 +2642,48 @@ function PMA_getTableBodyForUserRightsTable($db_rights, $link_edit, $link_export
|
||||
|
||||
$html_output .= '<td><code>' . "\n"
|
||||
. '' . implode(',' . "\n" . ' ', $host['privs']) . "\n"
|
||||
. '</code></td>' . "\n"
|
||||
. '<td>'
|
||||
. '</code></td>' . "\n";
|
||||
if ($GLOBALS['cfgRelation']['menuswork']) {
|
||||
$html_output .= '<td class="usrGroup">' . "\n"
|
||||
. (isset($groupAssignment[$host['User']])
|
||||
? $groupAssignment[$host['User']]
|
||||
: ''
|
||||
)
|
||||
. '</td>' . "\n";
|
||||
}
|
||||
$html_output .= '<td>'
|
||||
. ($host['Grant_priv'] == 'Y' ? __('Yes') : __('No'))
|
||||
. '</td>' . "\n"
|
||||
. '<td class="center">'
|
||||
. '</td>' . "\n";
|
||||
|
||||
$html_output .= '<td class="center">'
|
||||
. sprintf(
|
||||
$link_edit,
|
||||
urlencode($host['User']),
|
||||
urlencode($host['Host']),
|
||||
'',
|
||||
''
|
||||
);
|
||||
$html_output .= '</td>';
|
||||
|
||||
$html_output .= '<td class="center">';
|
||||
$html_output .= sprintf(
|
||||
$link_export,
|
||||
urlencode($host['User']),
|
||||
urlencode($host['Host']),
|
||||
(isset($_GET['initial']) ? $_GET['initial'] : '')
|
||||
);
|
||||
$html_output .= '</td>';
|
||||
)
|
||||
. '</td>';
|
||||
if ($GLOBALS['cfgRelation']['menuswork']) {
|
||||
if (empty($host['User'])) {
|
||||
$html_output .= '<td class="center"></td>';
|
||||
} else {
|
||||
$html_output .= '<td class="center">'
|
||||
. sprintf(
|
||||
$link_edit_user_group,
|
||||
urlencode($host['User'])
|
||||
)
|
||||
. '</td>';
|
||||
}
|
||||
}
|
||||
$html_output .= '<td class="center">'
|
||||
. sprintf(
|
||||
$link_export,
|
||||
urlencode($host['User']),
|
||||
urlencode($host['Host']),
|
||||
(isset($_GET['initial']) ? $_GET['initial'] : '')
|
||||
)
|
||||
. '</td>';
|
||||
$html_output .= '</tr>';
|
||||
$odd_row = ! $odd_row;
|
||||
}
|
||||
@ -3028,8 +3169,324 @@ function PMA_getHtmlForDisplayUserOverviewPage($link_edit, $pmaThemeImage,
|
||||
$flushnote->addParam('</a>', 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 = '<h2>'
|
||||
. sprintf(__('Users of \'%s\' user group'), htmlspecialchars($userGroup))
|
||||
. '</h2>';
|
||||
|
||||
$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 .= '<p>'
|
||||
. __('No users were found belonging to this user group')
|
||||
. '</p>';
|
||||
} else {
|
||||
$html_output .= '<table>'
|
||||
. '<thead><tr><th>#</th><th>' . __('User') . '</th></tr></thead>'
|
||||
. '<tbody>';
|
||||
$i = 0;
|
||||
while ($row = $GLOBALS['dbi']->fetchRow($result)) {
|
||||
$i++;
|
||||
$html_output .= '<tr>'
|
||||
. '<td>' . $i . ' </td>'
|
||||
. '<td>' . htmlspecialchars($row[0]) . '</td>'
|
||||
. '</tr>';
|
||||
}
|
||||
$html_output .= '</tbody>'
|
||||
. '</table>';
|
||||
}
|
||||
}
|
||||
$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 = '<h2>' . __('User groups') . '</h2>';
|
||||
$html_output .= '<form name="userGroupsForm" id="userGroupsForm"'
|
||||
. ' action="server_privileges.php" method="post">';
|
||||
$html_output .= PMA_generate_common_hidden_inputs();
|
||||
$html_output .= '<table id="userGroupsTable">';
|
||||
$html_output .= '<thead><tr>';
|
||||
$html_output .= '<th style="white-space: nowrap">' . __('User group') . '</th>';
|
||||
$html_output .= '<th>' . __('Server level tabs') . '</th>';
|
||||
$html_output .= '<th>' . __('Database level tabs') . '</th>';
|
||||
$html_output .= '<th>' . __('Table level tabs') . '</th>';
|
||||
$html_output .= '<th>' . __('Action') . '</th>';
|
||||
$html_output .= '</tr></thead>';
|
||||
$html_output .= '<tbody>';
|
||||
|
||||
$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 .= '<tr class="' . ($odd ? 'odd' : 'even') . '">';
|
||||
$html_output .= '<td>' . htmlspecialchars($row['usergroup']) . '</td>';
|
||||
$html_output .= '<td>' . _getAllowedTabNames($row, 'server') . '</td>';
|
||||
$html_output .= '<td>' . _getAllowedTabNames($row, 'db') . '</td>';
|
||||
$html_output .= '<td>' . _getAllowedTabNames($row, 'table') . '</td>';
|
||||
|
||||
$html_output .= '<td>';
|
||||
$html_output .= '<a class="" href="server_user_groups.php?'
|
||||
. PMA_generate_common_url() . '&viewUsers=1&userGroup='
|
||||
. urlencode($row['usergroup']) . '">'
|
||||
. PMA_Util::getIcon('b_usrlist.png', __('View users')) . '</a>';
|
||||
$html_output .= ' ';
|
||||
$html_output .= '<a class="" href="server_user_groups.php?'
|
||||
. PMA_generate_common_url() . '&editUserGroup=1&userGroup='
|
||||
. urlencode($row['usergroup']) . '">'
|
||||
. PMA_Util::getIcon('b_edit.png', __('Edit')) . '</a>';
|
||||
$html_output .= ' ';
|
||||
$html_output .= '<a class="" href="server_user_groups.php?'
|
||||
. PMA_generate_common_url() . '&deleteUserGroup=1&userGroup='
|
||||
. urlencode($row['usergroup']) . '">'
|
||||
. PMA_Util::getIcon('b_drop.png', __('Delete')) . '</a>';
|
||||
$html_output .= '</td>';
|
||||
|
||||
$html_output .= '</tr>';
|
||||
|
||||
$odd = ! $odd;
|
||||
}
|
||||
}
|
||||
$GLOBALS['dbi']->freeResult($result);
|
||||
|
||||
$html_output .= '</tbody>';
|
||||
$html_output .= '</table>';
|
||||
$html_output .= '</form>';
|
||||
|
||||
$html_output .= '<fieldset id="fieldset_add_user_group">';
|
||||
$html_output .= '<a href="server_user_groups.php?'
|
||||
. PMA_generate_common_url() . '&addUserGroup=1">'
|
||||
. PMA_Util::getIcon('b_usradd.png')
|
||||
. __('Add user group') . '</a>';
|
||||
$html_output .= '</fieldset>';
|
||||
|
||||
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 .= '<h2>' . __('Add user group') . '</h2>';
|
||||
} else {
|
||||
$html_output .= '<h2>'
|
||||
. sprintf(__('Edit user group: \'%s\''), htmlspecialchars($userGroup))
|
||||
. '</h2>';
|
||||
}
|
||||
|
||||
$html_output .= '<form name="userGroupForm" id="userGroupForm"'
|
||||
. ' action="server_user_groups.php" method="post">';
|
||||
$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 .= '<fieldset id="fieldset_user_group_rights">';
|
||||
$html_output .= '<legend>' . __('User group privileges')
|
||||
. ' '
|
||||
. '<input type="checkbox" class="checkall_box" title="Check All">'
|
||||
. '<label for="addUsersForm_checkall">' . __('Check All') .'</label>'
|
||||
. '</legend>';
|
||||
|
||||
if ($userGroup == null) {
|
||||
$html_output .= '<label for="userGroup">' . __('Group name: ') . '</label>';
|
||||
$html_output .= '<input type="text" name="userGroup" autocomplete="off" />';
|
||||
$html_output .= '<div class="clearfloat"></div>';
|
||||
}
|
||||
|
||||
$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 .= '</fieldset>';
|
||||
|
||||
$html_output .= '<fieldset id="fieldset_user_group_rights_footer"'
|
||||
. ' class="tblFooters">';
|
||||
$html_output .= '<input type="submit" name="update_privs" value="Go">';
|
||||
$html_output .= '</fieldset>';
|
||||
|
||||
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 = '<fieldset>';
|
||||
$html_output .= '<legend>' . $title . '</legend>';
|
||||
foreach ($tabs as $tab => $tabName) {
|
||||
$html_output .= '<div class="item">';
|
||||
$html_output .= '<input type="checkbox" class="checkall"'
|
||||
. (in_array($tab, $selected) ? 'checked="checked"' : '')
|
||||
. ' name="' . $level . '_' . $tab . '" value="Y" />';
|
||||
$html_output .= '<label for="' . $level . '_' . $tab . '">'
|
||||
. '<code>' . $tabName . '</code>'
|
||||
. '</label>';
|
||||
$html_output .= '</div>';
|
||||
}
|
||||
$html_output .= '</fieldset>';
|
||||
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 .= '<form' . $class . ' name="usersForm" id="addUsersForm"'
|
||||
. ' action="server_privileges.php" method="post">' . "\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 .= '<form' . $class . ' name="usersForm" id="addUsersForm"'
|
||||
. ' action="server_privileges.php" method="post">' . "\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 = '<ul id="topmenu2">';
|
||||
foreach ($items as $item) {
|
||||
$class = '';
|
||||
if ($item['url'] === $selfUrl) {
|
||||
$class = ' class="tabactive"';
|
||||
}
|
||||
$retval .= '<li>';
|
||||
$retval .= '<a' . $class;
|
||||
$retval .= ' href="' . $item['url'] . '?' . $url_params . '">';
|
||||
$retval .= $item['name'];
|
||||
$retval .= '</a>';
|
||||
$retval .= '</li>';
|
||||
}
|
||||
$retval .= '</ul>';
|
||||
$retval .= '<div class="clearfloat"></div>';
|
||||
|
||||
return $retval;
|
||||
}
|
||||
?>
|
||||
|
||||
@ -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('<div>');
|
||||
$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('</div>');
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
59
server_user_groups.php
Normal file
59
server_user_groups.php
Normal file
@ -0,0 +1,59 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* Displays the 'User groups' sub page under 'Users' page.
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
|
||||
require_once 'libraries/common.inc.php';
|
||||
require_once 'libraries/server_privileges.lib.php';
|
||||
|
||||
PMA_getRelationsParam();
|
||||
if (! $GLOBALS['cfgRelation']['menuswork']) {
|
||||
exit;
|
||||
}
|
||||
|
||||
$response = PMA_Response::getInstance();
|
||||
$response->addHTML('<div>');
|
||||
$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('</div>');
|
||||
?>
|
||||
@ -953,6 +953,10 @@ div#tablestatistics table {
|
||||
float: <?php echo $left; ?>;
|
||||
}
|
||||
|
||||
#fieldset_user_group_rights fieldset {
|
||||
float: <?php echo $left; ?>;
|
||||
}
|
||||
|
||||
#fieldset_user_global_rights legend input {
|
||||
margin-<?php echo $left; ?>: 2em;
|
||||
}
|
||||
|
||||
@ -1207,6 +1207,10 @@ div#tablestatistics table {
|
||||
float: <?php echo $left; ?>;
|
||||
}
|
||||
|
||||
#fieldset_user_group_rights fieldset {
|
||||
float: <?php echo $left; ?>;
|
||||
}
|
||||
|
||||
#fieldset_user_global_rights legend input {
|
||||
margin-<?php echo $left; ?>: 2em;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user