1 #!/bin/sh
3 test_description='basic credential helper tests'
4 . ./test-lib.sh
5 . "$TEST_DIRECTORY"/lib-credential.sh
7 test_expect_success 'setup helper scripts' '
8 cat >dump <<-\EOF &&
9 whoami=`echo $0 | sed s/.*git-credential-//`
10 echo >&2 "$whoami: $*"
11 OIFS=$IFS
12 IFS==
13 while read key value; do
14 echo >&2 "$whoami: $key=$value"
15 eval "$key=$value"
16 done
17 IFS=$OIFS
18 EOF
20 write_script git-credential-useless <<-\EOF &&
21 . ./dump
22 exit 0
23 EOF
25 write_script git-credential-verbatim <<-\EOF &&
26 user=$1; shift
27 pass=$1; shift
28 . ./dump
29 test -z "$user" || echo username=$user
30 test -z "$pass" || echo password=$pass
31 EOF
33 PATH="$PWD:$PATH"
34 '
36 test_expect_success 'credential_fill invokes helper' '
37 check fill "verbatim foo bar" <<-\EOF
38 --
39 username=foo
40 password=bar
41 --
42 verbatim: get
43 EOF
44 '
46 test_expect_success 'credential_fill invokes multiple helpers' '
47 check fill useless "verbatim foo bar" <<-\EOF
48 --
49 username=foo
50 password=bar
51 --
52 useless: get
53 verbatim: get
54 EOF
55 '
57 test_expect_success 'credential_fill stops when we get a full response' '
58 check fill "verbatim one two" "verbatim three four" <<-\EOF
59 --
60 username=one
61 password=two
62 --
63 verbatim: get
64 EOF
65 '
67 test_expect_success 'credential_fill continues through partial response' '
68 check fill "verbatim one \"\"" "verbatim two three" <<-\EOF
69 --
70 username=two
71 password=three
72 --
73 verbatim: get
74 verbatim: get
75 verbatim: username=one
76 EOF
77 '
79 test_expect_success 'credential_fill passes along metadata' '
80 check fill "verbatim one two" <<-\EOF
81 protocol=ftp
82 host=example.com
83 path=foo.git
84 --
85 username=one
86 password=two
87 --
88 verbatim: get
89 verbatim: protocol=ftp
90 verbatim: host=example.com
91 verbatim: path=foo.git
92 EOF
93 '
95 test_expect_success 'credential_approve calls all helpers' '
96 check approve useless "verbatim one two" <<-\EOF
97 username=foo
98 password=bar
99 --
100 --
101 useless: store
102 useless: username=foo
103 useless: password=bar
104 verbatim: store
105 verbatim: username=foo
106 verbatim: password=bar
107 EOF
108 '
110 test_expect_success 'do not bother storing password-less credential' '
111 check approve useless <<-\EOF
112 username=foo
113 --
114 --
115 EOF
116 '
119 test_expect_success 'credential_reject calls all helpers' '
120 check reject useless "verbatim one two" <<-\EOF
121 username=foo
122 password=bar
123 --
124 --
125 useless: erase
126 useless: username=foo
127 useless: password=bar
128 verbatim: erase
129 verbatim: username=foo
130 verbatim: password=bar
131 EOF
132 '
134 test_expect_success 'usernames can be preserved' '
135 check fill "verbatim \"\" three" <<-\EOF
136 username=one
137 --
138 username=one
139 password=three
140 --
141 verbatim: get
142 verbatim: username=one
143 EOF
144 '
146 test_expect_success 'usernames can be overridden' '
147 check fill "verbatim two three" <<-\EOF
148 username=one
149 --
150 username=two
151 password=three
152 --
153 verbatim: get
154 verbatim: username=one
155 EOF
156 '
158 test_expect_success 'do not bother completing already-full credential' '
159 check fill "verbatim three four" <<-\EOF
160 username=one
161 password=two
162 --
163 username=one
164 password=two
165 --
166 EOF
167 '
169 # We can't test the basic terminal password prompt here because
170 # getpass() tries too hard to find the real terminal. But if our
171 # askpass helper is run, we know the internal getpass is working.
172 test_expect_success 'empty helper list falls back to internal getpass' '
173 check fill <<-\EOF
174 --
175 username=askpass-username
176 password=askpass-password
177 --
178 askpass: Username:
179 askpass: Password:
180 EOF
181 '
183 test_expect_success 'internal getpass does not ask for known username' '
184 check fill <<-\EOF
185 username=foo
186 --
187 username=foo
188 password=askpass-password
189 --
190 askpass: Password:
191 EOF
192 '
194 HELPER="!f() {
195 cat >/dev/null
196 echo username=foo
197 echo password=bar
198 }; f"
199 test_expect_success 'respect configured credentials' '
200 test_config credential.helper "$HELPER" &&
201 check fill <<-\EOF
202 --
203 username=foo
204 password=bar
205 --
206 EOF
207 '
209 test_expect_success 'match configured credential' '
210 test_config credential.https://example.com.helper "$HELPER" &&
211 check fill <<-\EOF
212 protocol=https
213 host=example.com
214 path=repo.git
215 --
216 username=foo
217 password=bar
218 --
219 EOF
220 '
222 test_expect_success 'do not match configured credential' '
223 test_config credential.https://foo.helper "$HELPER" &&
224 check fill <<-\EOF
225 protocol=https
226 host=bar
227 --
228 username=askpass-username
229 password=askpass-password
230 --
231 askpass: Username for '\''https://bar'\'':
232 askpass: Password for '\''https://askpass-username@bar'\'':
233 EOF
234 '
236 test_expect_success 'pull username from config' '
237 test_config credential.https://example.com.username foo &&
238 check fill <<-\EOF
239 protocol=https
240 host=example.com
241 --
242 username=foo
243 password=askpass-password
244 --
245 askpass: Password for '\''https://foo@example.com'\'':
246 EOF
247 '
249 test_expect_success 'http paths can be part of context' '
250 check fill "verbatim foo bar" <<-\EOF &&
251 protocol=https
252 host=example.com
253 path=foo.git
254 --
255 username=foo
256 password=bar
257 --
258 verbatim: get
259 verbatim: protocol=https
260 verbatim: host=example.com
261 EOF
262 test_config credential.https://example.com.useHttpPath true &&
263 check fill "verbatim foo bar" <<-\EOF
264 protocol=https
265 host=example.com
266 path=foo.git
267 --
268 username=foo
269 password=bar
270 --
271 verbatim: get
272 verbatim: protocol=https
273 verbatim: host=example.com
274 verbatim: path=foo.git
275 EOF
276 '
278 test_done