Skip to content

Commit 7c66522

Browse files
committed
Fixes for supporting passwords with weird characters
Use URL encoding in DATABASE_URL and return mysql_options as an array (via ugly global variable), so each element in it can be separately added to the command line using `@` for expansion.
1 parent 0cb10aa commit 7c66522

File tree

1 file changed

+24
-13
lines changed

1 file changed

+24
-13
lines changed

sql/dj_setup_database.in

+24-13
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#!/bin/sh
1+
#!/bin/bash
22
# @configure_input@
33

44
# This script allows one to perform DOMjudge database setup actions.
@@ -52,32 +52,43 @@ not have to pass any of the options above.
5252
EOF
5353
}
5454

55+
urlencode()
56+
{
57+
php -r "echo rawurlencode('$1');"
58+
}
59+
5560
mysql_options()
5661
{
5762
local user pass
63+
declare -a _mysql_options=()
5864

5965
# shellcheck disable=SC2153
6066
if [ -n "$DBUSER" ]; then
61-
user="-u $DBUSER"
62-
else
63-
user="${DBA_USER:+-u ${DBA_USER}}"
67+
result+=('-u', "$DBUSER")
68+
elif [ -n "$DBA_USER" ]; then
69+
result+=('-u', "$DBUSER")
6470
fi
6571
# shellcheck disable=SC2153
6672
if [ -n "$PASSWD" ]; then
67-
pass="-p$PASSWD"
68-
else
69-
[ -n "$PROMPT_PASSWD" ] && pass="-p"
70-
[ -n "$DBA_PASSWD" ] && pass="-p$DBA_PASSWD"
73+
result+=("-p$PASSWD")
74+
elif [ -n "$DBA_PASSWD" ]; then
75+
result+=("-p$DBA_PASSWD")
76+
elif [ -n "$PROMPT_PASSWD" ]; then
77+
result+=('-p')
7178
fi
7279

73-
[ -z "$USE_SOCKET" ] && port="-P$DBPORT"
74-
echo $user ${pass:+"$pass"} -h "$DBHOST" ${port:+"$port"}
80+
results+=('-h', "$DBHOST")
81+
82+
if [ -z "$USE_SOCKET" ]; then
83+
results+=("-P$DBPORT")
84+
fi
7585
}
7686

7787
# Wrapper around mysql command to allow setting options, user, etc.
7888
mysql()
7989
{
80-
command mysql $(mysql_options) --silent --skip-column-names "$@"
90+
mysql_options
91+
command mysql "${_mysql_options[@]}" --silent --skip-column-names "$@"
8192
}
8293

8394
# Quick shell hack to get a key from an INI file.
@@ -129,9 +140,9 @@ symfony_console()
129140

130141
if [ -n "$DBA_USER" ]; then
131142
if [ -n "$DBA_PASSWD" ]; then
132-
DATABASE_URL=mysql://${DBA_USER}:${DBA_PASSWD}@${domjudge_DBHOST}:${domjudge_DBPORT}/${domjudge_DBNAME}
143+
DATABASE_URL="mysql://$(urlencode '${DBA_USER}'):$(urlencode '${DBA_PASSWD}')@$(urlencode '${domjudge_DBHOST}'):${domjudge_DBPORT}/$(urlencode '${domjudge_DBNAME}')"
133144
else
134-
DATABASE_URL=mysql://${DBA_USER}@${domjudge_DBHOST}:${domjudge_DBPORT}/${domjudge_DBNAME}
145+
DATABASE_URL="mysql://$(urlencode '${DBA_USER}')@$(urlencode '${domjudge_DBHOST}'):${domjudge_DBPORT}/$(urlencode '${domjudge_DBNAME}')"
135146
fi
136147
fi
137148
fi

0 commit comments

Comments
 (0)