Merge pull request #797 from percona/PT-2327_pt-mysql-summary_fails_to_connect_if_password_has_a_single_quote_character

PT-2327 - pt-mysql-summary fails to connect if password has a single …
This commit is contained in:
Sveta Smirnova
2024-04-18 13:15:11 +03:00
committed by GitHub
9 changed files with 93 additions and 16 deletions

View File

@@ -408,7 +408,7 @@ _parse_command_line() {
fi
if $(echo $opt | grep '^[a-z-][a-z-]*=' >/dev/null 2>&1); then
val="$(echo $opt | awk -F= '{print $2}')"
val="$(echo "$opt" | awk '{ st = index($0,"="); print substr($0, st+1)}')"
opt="$(echo $opt | awk -F= '{print $1}')"
fi
@@ -453,7 +453,7 @@ _parse_command_line() {
val=$(size_to_bytes $val)
fi
eval "OPT_$opt"="'$val'"
eval "OPT_$opt"='$val'
opt=""
val=""

View File

@@ -449,7 +449,7 @@ _parse_command_line() {
fi
if $(echo $opt | grep '^[a-z-][a-z-]*=' >/dev/null 2>&1); then
val="$(echo $opt | awk -F= '{print $2}')"
val="$(echo "$opt" | awk '{ st = index($0,"="); print substr($0, st+1)}')"
opt="$(echo $opt | awk -F= '{print $1}')"
fi
@@ -494,7 +494,7 @@ _parse_command_line() {
val=$(size_to_bytes $val)
fi
eval "OPT_$opt"="'$val'"
eval "OPT_$opt"='$val'
opt=""
val=""

View File

@@ -410,7 +410,7 @@ _parse_command_line() {
fi
if $(echo $opt | grep '^[a-z-][a-z-]*=' >/dev/null 2>&1); then
val="$(echo $opt | awk -F= '{print $2}')"
val="$(echo "$opt" | awk '{ st = index($0,"="); print substr($0, st+1)}')"
opt="$(echo $opt | awk -F= '{print $1}')"
fi
@@ -455,7 +455,7 @@ _parse_command_line() {
val=$(size_to_bytes $val)
fi
eval "OPT_$opt"="'$val'"
eval "OPT_$opt"='$val'
opt=""
val=""

View File

@@ -451,7 +451,7 @@ _parse_command_line() {
fi
if $(echo $opt | grep '^[a-z-][a-z-]*=' >/dev/null 2>&1); then
val="$(echo $opt | awk -F= '{print $2}')"
val="$(echo "$opt" | awk '{ st = index($0,"="); print substr($0, st+1)}')"
opt="$(echo $opt | awk -F= '{print $1}')"
fi
@@ -496,7 +496,7 @@ _parse_command_line() {
val=$(size_to_bytes $val)
fi
eval "OPT_$opt"="'$val'"
eval "OPT_$opt"='$val'
opt=""
val=""

View File

@@ -449,7 +449,7 @@ _parse_command_line() {
fi
if $(echo $opt | grep '^[a-z-][a-z-]*=' >/dev/null 2>&1); then
val="$(echo $opt | awk -F= '{print $2}')"
val="$(echo "$opt" | awk '{ st = index($0,"="); print substr($0, st+1)}')"
opt="$(echo $opt | awk -F= '{print $1}')"
fi
@@ -494,7 +494,7 @@ _parse_command_line() {
val=$(size_to_bytes $val)
fi
eval "OPT_$opt"="'$val'"
eval "OPT_$opt"='$val'
opt=""
val=""

View File

@@ -462,7 +462,7 @@ _parse_command_line() {
fi
if $(echo $opt | grep '^[a-z-][a-z-]*=' >/dev/null 2>&1); then
val="$(echo $opt | awk -F= '{print $2}')"
val="$(echo "$opt" | awk '{ st = index($0,"="); print substr($0, st+1)}')"
opt="$(echo $opt | awk -F= '{print $1}')"
fi
@@ -507,7 +507,7 @@ _parse_command_line() {
val=$(size_to_bytes $val)
fi
eval "OPT_$opt"="'$val'"
eval "OPT_$opt"='$val'
opt=""
val=""

View File

@@ -417,7 +417,7 @@ _parse_command_line() {
fi
if $(echo $opt | grep '^[a-z-][a-z-]*=' >/dev/null 2>&1); then
val="$(echo $opt | awk -F= '{print $2}')"
val="$(echo "$opt" | awk '{ st = index($0,"="); print substr($0, st+1)}')"
opt="$(echo $opt | awk -F= '{print $1}')"
fi
@@ -462,7 +462,7 @@ _parse_command_line() {
val=$(size_to_bytes $val)
fi
eval "OPT_$opt"="'$val'"
eval "OPT_$opt"='$val'
opt=""
val=""

View File

@@ -475,7 +475,7 @@ _parse_command_line() {
# Split opt=val pair.
if $(echo $opt | grep '^[a-z-][a-z-]*=' >/dev/null 2>&1); then
val="$(echo $opt | awk -F= '{print $2}')"
val="$(echo "$opt" | awk '{ st = index($0,"="); print substr($0, st+1)}')"
opt="$(echo $opt | awk -F= '{print $1}')"
fi
@@ -533,7 +533,7 @@ _parse_command_line() {
fi
# Re-eval the option to update its global variable value.
eval "OPT_$opt"="'$val'"
eval "OPT_$opt"='$val'
opt=""
val=""

View File

@@ -0,0 +1,77 @@
#!/usr/bin/env perl
BEGIN {
die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
};
use strict;
use warnings FATAL => 'all';
use English qw(-no_match_vars);
use PerconaTest;
use Sandbox;
use DSNParser;
require VersionParser;
use Test::More;
local $ENV{PTDEBUG} = "";
my $dp = new DSNParser(opts=>$dsn_opts);
my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
my $dbh = $sb->get_dbh_for('master');
my $cnf = '/tmp/12345/my.sandbox.cnf';
my $output;
if ( !$dbh ) {
plan skip_all => 'Cannot connect to sandbox master';
}
else {
plan tests => 5;
}
$sb->do_as_root("master", q/create user pt2302 identified by "root_'f<=*password"/);
$sb->do_as_root("master", q/grant all on *.* to pt2302/);
my $cmd = "$trunk/bin/pt-mysql-summary --sleep 1 -- --defaults-file=$cnf --user=pt2302 --password=\"root_'f<=*password\"";
$output = `$cmd 2>&1`;
unlike(
$output,
qr/eval: Syntax error: Unterminated quoted string/s,
"pt-mysql-summary does not stop with password containing an apostrophe"
);
unlike(
$output,
qr/Access denied for user/s,
"pt-mysql-summary works fine with password containing an apostrophe"
);
$sb->do_as_root("master", q/drop user pt2302/);
$sb->do_as_root("master", q/create user pt2302 identified by 'root_"f<=*password'/);
$sb->do_as_root("master", q/grant all on *.* to pt2302/);
$cmd = "$trunk/bin/pt-mysql-summary --sleep 1 -- --defaults-file=$cnf --user=pt2302 --password='root_\"f<=*password'";
$output = `$cmd 2>&1`;
unlike(
$output,
qr/eval: Syntax error: Unterminated quoted string/s,
"pt-mysql-summary does not stop with password containing a quote"
);
unlike(
$output,
qr/Access denied for user/s,
"pt-mysql-summary works fine with password containing a quote"
);
# #############################################################################
# Done.
# #############################################################################
$sb->do_as_root("master", q/drop user pt2302/);
$sb->wipe_clean($dbh);
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
exit;