diff --git a/mysql/edit_user.cgi b/mysql/edit_user.cgi index db6f7e2e4..6c3ad498f 100755 --- a/mysql/edit_user.cgi +++ b/mysql/edit_user.cgi @@ -5,7 +5,7 @@ require './mysql-lib.pl'; &ReadParse(); $access{'perms'} == 1 || &error($text{'perms_ecannot'}); - +my ($ver, $variant) = &get_remote_mysql_variant(); if ($in{'new'}) { &ui_print_header(undef, $text{'user_title1'}, "", "create_user"); } @@ -95,15 +95,20 @@ foreach $f ('max_user_connections', 'max_connections', } # SSL needed? -if ($remote_mysql_version >= 5 && $fieldmap{'ssl_type'}) { - print &ui_table_row($text{'user_ssl'}, - &ui_select("ssl_type", uc($u->[$fieldmap{'ssl_type'}]), - [ [ '', $text{'user_ssl_'} ], - [ 'ANY', $text{'user_ssl_any'} ], - [ 'X509', $text{'user_ssl_x509'} ] ], - 1, 0, 1)); - print &ui_table_row($text{'user_cipher'}, - &ui_textbox("ssl_cipher", $u->[$fieldmap{'ssl_cipher'}], 80)); +if ($variant eq "mariadb" && &compare_version_numbers($ver, "10.4") >= 0) { + # XXX??? + } +else { + if ($remote_mysql_version >= 5 && $fieldmap{'ssl_type'}) { + print &ui_table_row($text{'user_ssl'}, + &ui_select("ssl_type", uc($u->[$fieldmap{'ssl_type'}]), + [ [ '', $text{'user_ssl_'} ], + [ 'ANY', $text{'user_ssl_any'} ], + [ 'X509', $text{'user_ssl_x509'} ] ], + 1, 0, 1)); + print &ui_table_row($text{'user_cipher'}, + &ui_textbox("ssl_cipher", $u->[$fieldmap{'ssl_cipher'}], 80)); + } } print &ui_table_end(); diff --git a/mysql/save_user.cgi b/mysql/save_user.cgi index a813cf2d3..f5e4d0849 100755 --- a/mysql/save_user.cgi +++ b/mysql/save_user.cgi @@ -33,33 +33,53 @@ else { my @ssl_field_values = map { '' } @ssl_field_names; my @other_field_names = &other_user_fields(); my @other_field_values = map { '' } @other_field_names; + my $plugin = &get_mysql_plugin(1); + my ($ver, $variant) = &get_remote_mysql_variant(); if ($in{'new'}) { # Create a new user - $sql = "insert into user (host, user, ". - join(", ", @pfields, @ssl_field_names, - @other_field_names). - ") values (?, ?, ". - join(", ", map { "?" } (@pfields, @ssl_field_names, - @other_field_names)).")"; - &execute_sql_logged($master_db, $sql, - $host, $user, - (map { $perms{$_} ? 'Y' : 'N' } @pfields), - @ssl_field_values, @other_field_values); + if ($variant eq "mariadb" && &compare_version_numbers($ver, "10.4") >= 0) { + $sql = "create user '$user'\@'$host' identified $plugin by ". + "'".&escapestr($in{'mysqlpass'})."'"; + &execute_sql_logged($master_db, $sql); + } + else { + $sql = "insert into user (host, user, ". + join(", ", @pfields, @ssl_field_names, + @other_field_names). + ") values (?, ?, ". + join(", ", map { "?" } (@pfields, @ssl_field_names, + @other_field_names)).")"; + &execute_sql_logged($master_db, $sql, + $host, $user, + (map { $perms{$_} ? 'Y' : 'N' } @pfields), + @ssl_field_values, @other_field_values); + } } else { # Update existing user - $sql = "update user set host = ?, user = ?, ". - join(", ",map { "$_ = ?" } @pfields). - " where host = ? and user = ?"; - &execute_sql_logged($master_db, $sql, - $host, $user, - (map { $perms{$_} ? 'Y' : 'N' } @pfields), - $in{'oldhost'}, $in{'olduser'}); + if ($variant eq "mariadb" && &compare_version_numbers($ver, "10.4") >= 0) { + # Assign permissions XXX + # &execute_sql_logged($mysql::master_db, "GRANT ALL PRIVILEGES ON *.* TO '$user'\@'$host'"); + + # Rename user + if ($user && $user ne $in{'olduser'}) { + &execute_sql_logged($mysql::master_db, + "rename user '$in{'olduser'}'\@'$host' to '$user'\@'$host'"); + } + } + else { + $sql = "update user set host = ?, user = ?, ". + join(", ",map { "$_ = ?" } @pfields). + " where host = ? and user = ?"; + &execute_sql_logged($master_db, $sql, + $host, $user, + (map { $perms{$_} ? 'Y' : 'N' } @pfields), + $in{'oldhost'}, $in{'olduser'}); + } } &execute_sql_logged($master_db, 'flush privileges'); # Update the password using the correct syntax for the mysql version - ($ver, $variant) = &get_remote_mysql_variant(); if ($in{'mysqlpass_mode'} == 0) { $esc = &escapestr($in{'mysqlpass'}); if ($variant eq "mysql" && @@ -75,45 +95,68 @@ else { } } elsif ($in{'mysqlpass_mode'} == 2) { - if ($fieldmap{'password'}) { - &execute_sql_logged($master_db, - "update user set password = '' ". - "where user = ? and host = ?", - $user, $host); + if ($variant eq "mariadb" && &compare_version_numbers($ver, "10.4") >= 0) { + $sql = "alter user '$user'\@'$host' identified $plugin by ''"; + &execute_sql_logged($master_db, $sql); } - if ($fieldmap{'authentication_string'}) { - &execute_sql_logged($master_db, - "update user set authentication_string = '' ". - "where user = ? and host = ?", - $user, $host); + else { + if ($fieldmap{'password'}) { + &execute_sql_logged($master_db, + "update user set password = '' ". + "where user = ? and host = ?", + $user, $host); + } + if ($fieldmap{'authentication_string'}) { + &execute_sql_logged($master_db, + "update user set authentication_string = '' ". + "where user = ? and host = ?", + $user, $host); + } } } # Save various limits + 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}); - &execute_sql_logged($master_db, - "update user set $f = ? ". - "where user = ? and host = ?", - $in{$f.'_def'} ? 0 : $in{$f}, $user, $host); + 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 '$user'\@'$host' with $f_tbl_diff " + .($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}, $user, $host); + } + } # Set SSL fields - 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'}, $user, $host); - &execute_sql_logged($master_db, - "update user set ssl_cipher = ? ". - "where user = ? and host = ?", - $in{'ssl_cipher'}, $user, $host); + if ($variant eq "mariadb" && &compare_version_numbers($ver, "10.4") >= 0) { + # XXX??? + } + 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'}, $user, $host); + &execute_sql_logged($master_db, + "update user set ssl_cipher = ? ". + "where user = ? and host = ?", + $in{'ssl_cipher'}, $user, $host); + } } } &execute_sql_logged($master_db, 'flush privileges');