Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pt 2247 #686

Merged
merged 13 commits into from
May 21, 2024
Merged
Changes from 11 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 57 additions & 13 deletions bin/pt-show-grants
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -2039,25 +2039,52 @@ sub main {

# If MySQL 5.7.6+ then we need to use SHOW CREATE USER
my @create_user;
if (( VersionCompare::cmp($version, '5.7.6') >= 0 ) &&
if (( VersionCompare::cmp($version, '5.7.6') >= 0 ) ||
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With "||" this expression is always true.

( VersionCompare::cmp($version, '10.0.0') <= 0 )) {
eval {
if (!($version =~ m/MariaDB/) && ( VersionCompare::cmp($version, '8.0.17') >= 0 ) && ($o->get('print_identified_with_as_hex'))){
$dbh->do("SET print_identified_with_as_hex=1") or die();
print "-- Setting print_identified_with_as_hex as ACTIVE at session level for correct export/import\n";
}
@create_user = @{ $dbh->selectcol_arrayref("SHOW CREATE USER $user_host") };
};
if ( $EVAL_ERROR ) {
PTDEBUG && _d($EVAL_ERROR);
$exit_status = 1;
}
PTDEBUG && _d('CreateUser:', Dumper(\@create_user));
# make this replication safe converting the CREATE USER into
# CREATE USER IF NOT EXISTS and then doing an ALTER USER
my $create = $create_user[0];
my $alter = $create;
$create =~ s{CREATE USER}{CREATE USER IF NOT EXISTS};
$create =~ s{ IDENTIFIED .*}{};
$alter =~ s{CREATE USER}{ALTER USER};
@create_user = ( $create, $alter );
PTDEBUG && _d('AdjustedCreateUser:', Dumper(\@create_user));
if ($#create_user >= 0){
PTDEBUG && _d('CreateUser:', Dumper(\@create_user));
#given caching_sha2_password issue we need to select the password in binary format and replace the one coming from the create
#my $query = "SELECT authentication_string as sha2, convert(authentication_string using Binary) as bin from mysql.user where user='$u->{User}' and host='$u->{Host}'";
my $query = "SELECT authentication_string sha2 from mysql.user where user='$u->{User}' and host='$u->{Host}'";
PTDEBUG && _d('get password:', Dumper($query));
my ( $pw_sha2) = $dbh->selectrow_array($query);
my $pw_bin = $pw_sha2;
$pw_bin =~ s/(.)/sprintf '%02X', ord $1/seg;
$pw_bin = "0x".$pw_bin;

# make this replication safe converting the CREATE USER into
# CREATE USER IF NOT EXISTS and then doing an ALTER USER
my $create = $create_user[0];
my $alter = $create_user[0];
$create =~ s{CREATE USER}{CREATE USER IF NOT EXISTS};
$create =~ s{ IDENTIFIED VIA }{ IDENTIFIED AS };
$create =~ s{ BY }{ AS };
if (( $create =~ m/caching_sha2_password/ ) && !($o->get('print_identified_with_as_hex'))) {
print "-- Converting $user_host caching_sha2_password to binary for correct export/import\n";
$create =~ s/\sAS\s.*'\s/ AS $pw_bin /g;
}
$alter =~ s{CREATE USER}{ALTER USER};
# Alter user should not be pass in the latest MySQL version
#we need to cleanup other MariaDB diversions
if ( ($version =~ m/MariaDB/) && $o->get('convert-MariaDB')){
$create =~ s{ AS.*PASSWORD }{ AS };
$create =~ s/IDENTIFIED.*USING.*unix_socket.*/IDENTIFIED WITH auth_socket/;
$create =~ s/IDENTIFIED AS/IDENTIFIED WITH mysql_native_password AS/;
}
@create_user = ( $create);
PTDEBUG && _d('AdjustedCreateUser:', Dumper(\@create_user));
}
}
my @grants;
eval {
Expand All @@ -2067,6 +2094,13 @@ sub main {
PTDEBUG && _d($EVAL_ERROR);
$exit_status = 1;
}
#IF is MariaDB we need to remove the password from the user
if (($version =~ m/MariaDB/)){
for my $i (0 .. $#grants){
$grants[$i] =~ s{IDENTIFIED.*}{};
}
PTDEBUG && _d('Grants:', Dumper(\@grants));
}
PTDEBUG && _d('Grants:', Dumper(\@grants));
next unless @grants;

Expand Down Expand Up @@ -2146,8 +2180,8 @@ sub main {

if ( $o->get('drop') && !defined($u->{IsRole}) ) {
print join("\n",
"DROP USER $user_host;",
"DELETE FROM `mysql`.`user` WHERE `User`='$u->{User}' AND `Host`='$u->{Host}';",
"DROP USER IF EXISTS $user_host;",
#"DELETE FROM `mysql`.`user` WHERE `User`='$u->{User}' AND `Host`='$u->{Host}';",
), "\n";
}

Expand Down Expand Up @@ -2433,6 +2467,16 @@ type: array

Only show grants for this comma-separated list of users.

=item --convert-MariaDB

When set it convert some of the proprietary MariaDB syntax into valid MySQL form
svetasmirnova marked this conversation as resolved.
Show resolved Hide resolved

=item --print_identified_with_as_hex
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to the user manual at https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_print_identified_with_as_hex:

Hash values that do not contain unprintable characters still display as regular string literals, even with this variable enabled.

Do we really need this option or checking for correct MySQL version is enough?


Enabling print_identified_with_as_hex causes SHOW CREATE USER to display such hash values as hexadecimal strings rather than as regular string literals.
Hash values that do not contain unprintable characters still display as regular string literals, even with this variable enabled.


=item --password

short form: -p; type: string
Expand Down