Re-factor DB permissions editing

This commit is contained in:
Jamie Cameron
2015-12-22 17:21:26 -08:00
parent 6330deb1bc
commit 2e625451a3
6 changed files with 43 additions and 111 deletions

View File

@@ -27,6 +27,8 @@ else {
print &ui_hidden("olduser", $u->[2]);
}
print &ui_table_start($text{'db_header'}, undef, 2);
%fieldmap = map { $_->{'field'}, $_->{'index'} }
&table_structure($master_db, "db");
# Database name
print &ui_table_row($text{'db_db'}, &select_db($u->[1]));
@@ -43,9 +45,9 @@ print &ui_table_row($text{'db_host'},
[ 2, &ui_textbox("host", $u->[0] eq '%' ? '' : $u->[0], 40) ] ]));
# Permissions for DB
for($i=3; $i<=&db_priv_cols()+3-1; $i++) {
push(@opts, [ $i, $text{"db_priv$i"} ]);
push(@sel, $i) if ($u->[$i] eq 'Y');
foreach my $f (&priv_fields('db')) {
push(@opts, $f);
push(@sel, $f->[0]) if ($u->[$fieldmap{$f->[0]}] eq 'Y');
}
print &ui_table_row($text{'db_perms'},
&ui_select("perms", \@sel, \@opts, 10, 1, 1));

View File

@@ -229,32 +229,6 @@ users_host=Hosts
users_pass=Encrypted password
users_perms=Permissions
users_add=Create new user.
users_priv3=Select
users_priv4=Insert
users_priv5=Update
users_priv6=Delete
users_priv7=Create
users_priv8=Drop
users_priv9=Reload
users_priv10=Shutdown
users_priv11=Process
users_priv12=File
users_priv13=Grant
users_priv14=References
users_priv15=Index
users_priv16=Alter
users_priv17=Show DB
users_priv18=Super
users_priv19=Create temp
users_priv20=Lock
users_priv21=Execute
users_priv22=Slave
users_priv23=Client
users_priv24=Create View
users_priv25=Show View
users_priv26=Create Routine
users_priv27=Alter Routine
users_priv28=Create User
users_all=All
users_anon=Anonymous
users_none=None
@@ -306,6 +280,7 @@ user_priv_show_db=Show databases
user_priv_super=Superuser
user_priv_create_tmp_table=Create temp tables
user_priv_lock=Lock tables
user_priv_lock_tables=Lock tables
user_priv_execute=Execute
user_priv_repl_slave=Slave replication
user_priv_repl_client=Client replication
@@ -346,23 +321,6 @@ dbs_any=Any
dbs_empty=No database permissions defined.
dbs_hosts=From host permissions
dbs_add=Create new database permissions.
dbs_priv3=Select
dbs_priv4=Insert
dbs_priv5=Update
dbs_priv6=Delete
dbs_priv7=Create
dbs_priv8=Drop
dbs_priv9=Grant
dbs_priv10=References
dbs_priv11=Index
dbs_priv12=Alter
dbs_priv13=Create temp
dbs_priv14=Lock
dbs_priv15=Create View
dbs_priv16=Show View
dbs_priv17=Create Routine
dbs_priv18=Alter Routine
dbs_priv19=Execute
dbs_all=All
dbs_none=None
dbs_return=database permissions
@@ -382,25 +340,6 @@ db_host=Hosts
db_hosts=From host permissions
db_any=Any
db_perms=Permissions
db_priv3=Select table data
db_priv4=Insert table data
db_priv5=Update table data
db_priv6=Delete table data
db_priv7=Create tables
db_priv8=Drop tables
db_priv9=Grant privileges
db_priv10=Reference operations
db_priv11=Manage indexes
db_priv12=Alter tables
db_priv13=Create temp tables
db_priv14=Lock tables
db_priv15=Create View
db_priv16=Show View
db_priv17=Create Routine
db_priv18=Alter Routine
db_priv19=Execute
db_priv20=Create Triggers
db_priv21=Create Events
db_err=Failed to save database permissions
db_euser=Missing or invalid username
db_ehost=Missing or invalid hostname

View File

@@ -8,6 +8,8 @@ $access{'perms'} || &error($text{'perms_ecannot'});
@rowlinks = ( &ui_link("edit_db.cgi?new=1",$text{'dbs_add'}) );
$d = &execute_sql_safe($master_db, "select * from db order by db");
%fieldmap = map { $_->{'field'}, $_->{'index'} }
&table_structure($master_db, "db");
if (@{$d->{'data'}}) {
print &ui_form_start("delete_dbs.cgi");
unshift(@rowlinks, &select_all_link("d", 0),
@@ -32,13 +34,20 @@ if (@{$d->{'data'}}) {
push(@cols, $u->[0] eq '%' ? $text{'dbs_any'} :
$u->[0] eq '' ? $text{'dbs_hosts'}
: &html_escape($u->[0]));
local @priv;
for($j=3; $j<=&db_priv_cols()+3-1; $j++) {
push(@priv, $text{"dbs_priv$j"}) if ($u->[$j] eq 'Y');
my @priv;
my ($allprivs, $noprivs) = (1, 1);
foreach my $f (&priv_fields('db')) {
if ($u->[$fieldmap{$f->[0]}] eq 'Y') {
push(@priv, $f->[1]);
$noprivs = 0;
}
else {
$allprivs = 0;
}
}
push(@cols,
scalar(@priv) == &db_priv_cols() ? $text{'dbs_all'} :
!@priv ? $text{'dbs_none'} : join("&nbsp;| ", @priv));
push(@cols, $allprivs ? $text{'users_all'} :
$noprivs ? $text{'users_none'} :
join("&nbsp;| ", @priv));
print &ui_checked_columns_row(\@cols, \@tds,
"d", join(" ", $u->[0], $u->[1], $u->[2]));
}

View File

@@ -29,11 +29,11 @@ if (@{$d->{'data'}}) {
push(@cols, $u->[0] eq '%' || $u->[0] eq '' ?
$text{'hosts_any'} : &html_escape($u->[0]));
local @priv;
for($j=2; $j<=&db_priv_cols()+2-1; $j++) {
for($j=2; $j<=&host_priv_cols()+2-1; $j++) {
push(@priv, $text{"hosts_priv$j"}) if ($u->[$j] eq 'Y');
}
push(@cols,
scalar(@priv) == &db_priv_cols() ? $text{'hosts_all'} :
scalar(@priv) == &host_priv_cols() ? $text{'hosts_all'} :
!@priv ? $text{'hosts_none'} : join("&nbsp;| ", @priv));
print &ui_checked_columns_row(\@cols, \@tds,
"d", $u->[0]." ".$u->[1]);

View File

@@ -771,20 +771,6 @@ if (!$priv_fields{$type}) {
return @{$priv_fields{$type}};
}
# db_priv_cols()
# Returns the number of columns used for privileges in the db table
sub db_priv_cols
{
if (!$db_priv_cols) {
local @str = &table_structure("mysql", "db");
local $s;
foreach $s (@str) {
$db_priv_cols++ if ($s->{'field'} =~ /_priv/i);
}
}
return $db_priv_cols;
}
# host_priv_cols()
# Returns the number of columns used for privileges in the db table
sub host_priv_cols

View File

@@ -35,36 +35,32 @@ else {
&can_edit_db($db) || &error($text{'perms_edb'});
}
map { $perms[$_]++ } split(/\0/, $in{'perms'});
%perms = map { $_, 1 } split(/\0/, $in{'perms'});
@desc = &table_structure($master_db, 'db');
@pfields = map { $_->[0] } &priv_fields('db');
$host = $in{'host_mode'} == 0 ? '' :
$in{'host_mode'} == 1 ? '%' : $in{'host'};
$user = $in{'user_def'} ? '' : $in{'user'};
if ($in{'new'}) {
# Create a new db
for($i=3; $i<=&db_priv_cols()+3-1; $i++) {
push(@yesno, $perms[$i] ? "'Y'" : "'N'");
}
$sql = sprintf "insert into db (%s) values ('%s', '%s', '%s', %s)",
join(",", map { $desc[$_]->{'field'} } (0 .. &db_priv_cols()+3-1)),
$in{'host_mode'} == 0 ? '' :
$in{'host_mode'} == 1 ? '%' : $in{'host'},
$db, $in{'user_def'} ? '' : $in{'user'},
join(",", @yesno);
$sql = "insert into db (host, db, user, ".
join(", ", @pfields).
") values (?, ?, ?, ".
join(", ", map { "?" } @pfields).")";
&execute_sql_logged($master_db, $sql,
$host, $db, $user,
(map { $perms{$_} ? 'Y' : 'N' } @pfields));
}
else {
# Update existing user
for($i=3; $i<=&db_priv_cols()+3-1; $i++) {
push(@yesno, $desc[$i]->{'field'}."=".
($perms[$i] ? "'Y'" : "'N'"));
}
$sql = sprintf "update db set user = '%s', host = '%s', ".
"db = '%s', %s where user = '%s' and ".
"host = '%s' and db = '%s'",
$in{'user_def'} ? '' : $in{'user'},
$in{'host_mode'} == 0 ? '' :
$in{'host_mode'} == 1 ? '%' : $in{'host'},
$db, join(" , ", @yesno),
$in{'olduser'}, $in{'oldhost'}, $in{'olddb'};
# Update existing db
$sql = "update db set host = ?, db = ?, user = ?, ".
join(", ",map { "$_ = ?" } @pfields).
" where host = ? and db = ? and user = ?";
&execute_sql_logged($master_db, $sql,
$host, $db, $user,
(map { $perms{$_} ? 'Y' : 'N' } @pfields),
$in{'oldhost'}, $in{'olddb'}, $in{'olduser'});
}
&execute_sql_logged($master_db, $sql);
}
&execute_sql_logged($master_db, 'flush privileges');
if ($in{'delete'}) {