Skip to content

Commit c2a2c72

Browse files
committed
machine: escape % as %% in proxy values written to systemd unit conf
systemd interprets % as specifier characters in unit configuration files (e.g. %H, %u, %40). Proxy environment variable values that contain percent-encoded URL characters (such as %40 for @ in usernames) cause systemd to emit warnings and fail to parse the generated /etc/systemd/system.conf.d/default-env.conf: system.conf.d/default-env.conf:2: Failed to resolve specifiers in HTTP_PROXY=http://user%40example.com@proxy:3128 Fix by adding a bash variable substitution that doubles every % to %% before writing to the systemd unit conf files. The profile.d and environment.d destinations do not need this escaping and continue to use the original value. Fixes #28698 Signed-off-by: crawfordxx <crawfordxx@users.noreply.github.com>
1 parent 9e13b9e commit c2a2c72

2 files changed

Lines changed: 40 additions & 4 deletions

File tree

pkg/machine/proxyenv/env.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@ rm -f $SYSTEMD_SYSTEM_CONF $SYSTEMD_USER_CONF $ENVD_CONF $PROFILE_CONF
2626
echo "[Manager]" >> $SYSTEMD_SYSTEM_CONF
2727
echo "[Manager]" >> $SYSTEMD_USER_CONF
2828
for proxy in %s; do
29-
printf "DefaultEnvironment=\"%%s\"\n" "$proxy" >> $SYSTEMD_SYSTEM_CONF
30-
printf "DefaultEnvironment=\"%%s\"\n" "$proxy" >> $SYSTEMD_USER_CONF
29+
systemd_proxy="${proxy//%%/%%%%}"
30+
printf "DefaultEnvironment=\"%%s\"\n" "$systemd_proxy" >> $SYSTEMD_SYSTEM_CONF
31+
printf "DefaultEnvironment=\"%%s\"\n" "$systemd_proxy" >> $SYSTEMD_USER_CONF
3132
printf "%%s\n" "$proxy" >> $ENVD_CONF
3233
printf "export %%s\n" "$proxy" >> $PROFILE_CONF
3334
done

pkg/machine/proxyenv/env_test.go

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,43 @@ rm -f $SYSTEMD_SYSTEM_CONF $SYSTEMD_USER_CONF $ENVD_CONF $PROFILE_CONF
5555
echo "[Manager]" >> $SYSTEMD_SYSTEM_CONF
5656
echo "[Manager]" >> $SYSTEMD_USER_CONF
5757
for proxy in "http_proxy=proxy1" "https_proxy=sproxy1" "no_proxy=no1,no2"; do
58-
printf "DefaultEnvironment=\"%s\"\n" "$proxy" >> $SYSTEMD_SYSTEM_CONF
59-
printf "DefaultEnvironment=\"%s\"\n" "$proxy" >> $SYSTEMD_USER_CONF
58+
systemd_proxy="${proxy//%/%%}"
59+
printf "DefaultEnvironment=\"%s\"\n" "$systemd_proxy" >> $SYSTEMD_SYSTEM_CONF
60+
printf "DefaultEnvironment=\"%s\"\n" "$systemd_proxy" >> $SYSTEMD_USER_CONF
61+
printf "%s\n" "$proxy" >> $ENVD_CONF
62+
printf "export %s\n" "$proxy" >> $PROFILE_CONF
63+
done
64+
65+
systemctl daemon-reload
66+
`,
67+
},
68+
{
69+
name: "percent sign in proxy value is escaped for systemd",
70+
args: args{
71+
isWSL: false,
72+
envs: []env{
73+
{
74+
name: "http_proxy",
75+
value: "http://user%40example.com@proxy:3128",
76+
},
77+
},
78+
},
79+
want: `#!/bin/bash
80+
81+
SYSTEMD_SYSTEM_CONF=/etc/systemd/system.conf.d/default-env.conf
82+
SYSTEMD_USER_CONF=/etc/systemd/user.conf.d/default-env.conf
83+
ENVD_CONF=/etc/environment.d/default-env.conf
84+
PROFILE_CONF=/etc/profile.d/default-env.sh
85+
86+
mkdir -p /etc/profile.d /etc/environment.d /etc/systemd/system.conf.d/ /etc/systemd/user.conf.d/
87+
rm -f $SYSTEMD_SYSTEM_CONF $SYSTEMD_USER_CONF $ENVD_CONF $PROFILE_CONF
88+
89+
echo "[Manager]" >> $SYSTEMD_SYSTEM_CONF
90+
echo "[Manager]" >> $SYSTEMD_USER_CONF
91+
for proxy in "http_proxy=http://user%40example.com@proxy:3128"; do
92+
systemd_proxy="${proxy//%/%%}"
93+
printf "DefaultEnvironment=\"%s\"\n" "$systemd_proxy" >> $SYSTEMD_SYSTEM_CONF
94+
printf "DefaultEnvironment=\"%s\"\n" "$systemd_proxy" >> $SYSTEMD_USER_CONF
6095
printf "%s\n" "$proxy" >> $ENVD_CONF
6196
printf "export %s\n" "$proxy" >> $PROFILE_CONF
6297
done

0 commit comments

Comments
 (0)