webmin/mysql/save_user.cgi

169 lines
5.1 KiB
Plaintext
Raw Permalink Normal View History

2007-04-12 20:24:50 +00:00
#!/usr/local/bin/perl
# save_user.cgi
# Save, create or delete a user
require './mysql-lib.pl';
&ReadParse();
$access{'perms'} == 1 || &error($text{'perms_ecannot'});
if ($in{'delete'}) {
# Delete some user
&execute_sql_logged($master_db,
"delete from user where user = '$in{'olduser'}' ".
"and host = '$in{'oldhost'}'");
}
else {
# Validate inputs
&error_setup($text{'user_err'});
$in{'mysqluser_def'} || $in{'mysqluser'} =~ /^\S+$/ ||
&error($text{'user_euser'});
$in{'host_def'} || $in{'host'} =~ /^\S+$/ ||
&error($text{'user_ehost'});
2020-10-11 19:58:04 +03:00
if ($in{'mysqlpass_mode'} eq '0' && $in{'mysqlpas'} =~ /\\/) {
&error($text{'user_eslash'});
}
2007-04-12 20:24:50 +00:00
%perms = map { $_, 1 } split(/\0/, $in{'perms'});
2007-04-12 20:24:50 +00:00
@desc = &table_structure($master_db, 'user');
2020-10-08 22:13:16 -07:00
%fieldmap = map { lc($_->{'field'}), $_->{'index'} } @desc;
2010-08-24 13:31:59 -07:00
$host = $in{'host_def'} ? '%' : $in{'host'};
$oldhost = $host;
$oldhost = $in{'oldhost'}
if ($in{'oldhost'});
2007-04-12 20:24:50 +00:00
$user = $in{'mysqluser_def'} ? '' : $in{'mysqluser'};
$olduser = defined($in{'olduser'}) ? $in{'olduser'} : $user;
2015-12-22 16:30:08 -08:00
@pfields = map { $_->[0] } &priv_fields('user');
my @ssl_field_names = &ssl_fields();
my @ssl_field_values = map { '' } @ssl_field_names;
my @other_field_names = &other_user_fields();
my @other_field_values = map { '' } @other_field_names;
2020-10-10 17:47:44 +03:00
my ($ver, $variant) = &get_remote_mysql_variant();
2020-10-11 19:58:04 +03:00
my $plugin = &get_mysql_plugin(1);
2007-04-12 20:24:50 +00:00
if ($in{'new'}) {
2024-08-20 20:39:02 -07:00
# Create a new user
2020-10-11 13:47:05 -07:00
&create_user({
'user', $olduser,
2020-10-11 19:58:04 +03:00
'pass', $in{'mysqlpass'},
'host', $host,
'perms', \%perms,
'pfields', \@pfields,
2024-08-20 21:28:39 -07:00
'plugin', $in{'plugin'},
2020-10-11 19:58:04 +03:00
'ssl_field_names', \@ssl_field_names,
'ssl_field_values', \@ssl_field_values,
'other_field_names', \@other_field_names,
'other_field_values', \@other_field_values,
2020-10-11 13:47:05 -07:00
});
2007-04-12 20:24:50 +00:00
}
else {
# Rename user and/or host, if requested
my $changing_user = ($user ne $olduser);
my $changing_host = ($host ne $oldhost);
if ($changing_user ||
$changing_host) {
&rename_user({
'user', $user,
'olduser', $olduser,
'host', $host,
'oldhost', $oldhost,
});
$olduser = $user if ($changing_user);
$oldhost = $host if ($changing_host);
}
# Update user password, if requested
if ($in{'mysqlpass_mode'} == 4) {
# Never used for admin accounts
2024-08-20 21:28:39 -07:00
&change_user_password(undef, $olduser, $oldhost,
$in{'plugin'});
}
elsif ($in{'mysqlpass_mode'} == 1 &&
$in{'plugin'} eq "unix_socket") {
&change_user_password('', $olduser, $oldhost,
$in{'plugin'});
}
elsif ($in{'mysqlpass_mode'} != 1) {
($in{'mysqlpass_mode'} eq '0' && !$in{'mysqlpass'}) && &error($text{'root_epass1'});
my $pass = $in{'mysqlpass'} || '';
2024-08-20 21:28:39 -07:00
&change_user_password($pass, $olduser, $oldhost,
$in{'plugin'});
}
2020-10-11 13:47:05 -07:00
&update_privileges({
'user', $olduser,
'host', $oldhost,
2020-10-11 19:58:04 +03:00
'perms', \%perms,
'pfields', \@pfields
2020-10-11 13:47:05 -07:00
});
2007-04-12 20:24:50 +00:00
}
2020-10-11 19:58:04 +03:00
# Save various limits
2020-10-10 17:47:44 +03:00
my %mdb104_diff = ('max_connections', 'max_connections_per_hour',
'max_questions', 'max_queries_per_hour',
'max_updates', 'max_updates_per_hour');
foreach $f ('max_user_connections', 'max_connections',
'max_questions', 'max_updates') {
next if (&compare_version_numbers($ver, 5) < 0 ||
!defined($in{$f.'_def'}));
$in{$f.'_def'} || $in{$f} =~ /^\d+$/ ||
&error($text{'user_e'.$f});
2020-10-10 17:47:44 +03:00
if ($variant eq "mariadb" && &compare_version_numbers($ver, "10.4") >= 0) {
my $f_tbl_diff = $mdb104_diff{$f} || $f;
&execute_sql_logged($mysql::master_db,
"alter user '$olduser'\@'$oldhost' with $f_tbl_diff "
2020-10-10 17:47:44 +03:00
.($in{$f.'_def'} ? 0 : $in{$f})."");
}
else {
&execute_sql_logged($master_db,
"update user set $f = ? ".
"where user = ? and host = ?",
$in{$f.'_def'} ? 0 : $in{$f}, $olduser, $oldhost);
2020-10-10 17:47:44 +03:00
}
2007-04-12 20:24:50 +00:00
}
2010-06-04 10:05:12 -07:00
# Set SSL fields
2020-10-10 17:47:44 +03:00
if ($variant eq "mariadb" && &compare_version_numbers($ver, "10.4") >= 0) {
if ($in{'ssl_type'} =~ /^(NONE|SSL|X509)$/) {
&execute_sql_logged($mysql::master_db,
"alter user '$olduser'\@'$oldhost' require $in{'ssl_type'}");
}
}
2020-10-10 17:47:44 +03:00
else {
if (&compare_version_numbers($ver, 5) >= 0 &&
defined($in{'ssl_type'}) &&
(!$in{'new'} || $in{'ssl_type'} || $in{'ssl_cipher'})) {
&execute_sql_logged($master_db,
"update user set ssl_type = ? ".
"where user = ? and host = ?",
$in{'ssl_type'}, $olduser, $oldhost);
2020-10-10 17:47:44 +03:00
&execute_sql_logged($master_db,
"update user set ssl_cipher = ? ".
"where user = ? and host = ?",
$in{'ssl_cipher'}, $olduser, $oldhost);
2020-10-10 17:47:44 +03:00
}
2010-06-04 10:05:12 -07:00
}
2007-04-12 20:24:50 +00:00
}
&execute_sql_logged($master_db, 'flush privileges');
# Log actions
2007-04-12 20:24:50 +00:00
if ($in{'delete'}) {
&webmin_log("delete", "user", $in{'olduser'},
{ 'user' => $in{'olduser'},
'host' => $in{'oldhost'} } );
}
elsif ($in{'new'}) {
&webmin_log("create", "user",
$in{'mysqluser_def'} ? '' : $in{'mysqluser'},
{ 'user' => $in{'mysqluser_def'} ? '' : $in{'mysqluser'},
'host' => $in{'host_def'} ? '' : $in{'host'} } );
}
else {
&webmin_log("modify", "user",
$in{'mysqluser_def'} ? '' : $in{'mysqluser'},
{ 'user' => $in{'mysqluser_def'} ? '' : $in{'mysqluser'},
'host' => $in{'host_def'} ? '' : $in{'host'} } );
}
&redirect("list_users.cgi");