]> git.ipfire.org Git - thirdparty/squid.git/blob - src/tests/testAuth.cc
Merge from trunk
[thirdparty/squid.git] / src / tests / testAuth.cc
1 #define SQUID_UNIT_TEST 1
2
3 #include "squid.h"
4 #include "testAuth.h"
5 #include "auth/Gadgets.h"
6 #include "auth/UserRequest.h"
7 #include "auth/Scheme.h"
8 #include "auth/Config.h"
9 #include "Mem.h"
10
11 CPPUNIT_TEST_SUITE_REGISTRATION( testAuth );
12 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthConfig );
13 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthUserRequest );
14 #if HAVE_AUTH_MODULE_BASIC
15 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthBasicUserRequest );
16 #endif
17 #if HAVE_AUTH_MODULE_DIGEST
18 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthDigestUserRequest );
19 #endif
20 #if HAVE_AUTH_MODULE_NTLM
21 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthNTLMUserRequest );
22 #endif
23 #if HAVE_AUTH_MODULE_NEGOTIATE
24 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthNegotiateUserRequest );
25 #endif
26
27 /* Instantiate all auth framework types */
28 void
29 testAuth::instantiate()
30 {}
31
32 char const * stub_config="auth_param digest program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd\n"
33 "auth_param digest children 5\n"
34 "auth_param digest realm Squid proxy-caching web server\n"
35 "auth_param digest nonce_garbage_interval 5 minutes\n"
36 "auth_param digest nonce_max_duration 30 minutes\n"
37 "auth_param digest nonce_max_count 50\n";
38
39 static
40 char const *
41 find_proxy_auth(char const *type)
42 {
43 char const * proxy_auths[][2]= { {"basic","Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="},
44
45 {"digest", "Digest username=\"robertdig\", realm=\"Squid proxy-caching web server\", nonce=\"yy8rQXjEWwixXVBj\", uri=\"/images/bg8.gif\", response=\"f75a7d3edd48d93c681c75dc4fb58700\", qop=auth, nc=00000012, cnonce=\"e2216641961e228e\" "},
46 {"ntlm", "NTLM "},
47 {"negotiate", "Negotiate "}
48 };
49
50 for (unsigned count = 0; count < 4 ; count++) {
51 if (strcasecmp(type, proxy_auths[count][0]) == 0)
52 return proxy_auths[count][1];
53 }
54
55 return NULL;
56 }
57
58 static
59 AuthConfig *
60 getConfig(char const *type_str)
61 {
62 Auth::authConfig &config = Auth::TheConfig;
63 /* find a configuration for the scheme */
64 AuthConfig *scheme = AuthConfig::Find(type_str);
65
66 if (scheme == NULL) {
67 /* Create a configuration */
68 AuthScheme::Pointer theScheme = AuthScheme::Find(type_str);
69
70 if (theScheme == NULL) {
71 return NULL;
72 //fatalf("Unknown authentication scheme '%s'.\n", type_str);
73 }
74
75 config.push_back(theScheme->createConfig());
76 scheme = config.back();
77 assert(scheme);
78 }
79
80 return scheme;
81 }
82
83 static
84 void
85 setup_scheme(AuthConfig *scheme, char const **params, unsigned param_count)
86 {
87 Auth::authConfig &config = Auth::TheConfig;
88
89 for (unsigned position=0; position < param_count; position++) {
90 char *param_str=xstrdup(params[position]);
91 strtok(param_str, w_space);
92 scheme->parse(scheme, config.size(), param_str);
93 }
94 }
95
96 static
97 void
98 fake_auth_setup()
99 {
100 static bool setup(false);
101
102 if (setup)
103 return;
104
105 Mem::Init();
106
107 Auth::authConfig &config = Auth::TheConfig;
108
109 char const *digest_parms[]= {"program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd",
110 "realm foo"
111 };
112
113 char const *basic_parms[]= {"program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd",
114 "realm foo"
115 };
116
117 char const *ntlm_parms[]= {"program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd"};
118
119 char const *negotiate_parms[]= {"program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd"};
120
121 struct _scheme_params {
122 char const *name;
123 char const **params;
124 unsigned paramlength;
125 }
126
127 params[]={ {"digest", digest_parms, 2},
128 {"basic", basic_parms, 2},
129 {"ntlm", ntlm_parms, 1},
130 {"negotiate", negotiate_parms, 1}
131 };
132
133 for (unsigned scheme=0; scheme < 4; scheme++) {
134 AuthConfig *schemeConfig;
135 schemeConfig = getConfig(params[scheme].name);
136 if (schemeConfig != NULL)
137 setup_scheme(schemeConfig, params[scheme].params,
138 params[scheme].paramlength);
139 else
140 fprintf(stderr,"Skipping unknown authentication scheme '%s'.\n",
141 params[scheme].name);
142 }
143
144 authenticateInit(&config);
145
146 setup=true;
147 }
148
149 /* AuthConfig::CreateAuthUser works for all
150 * authentication types
151 */
152 void
153 testAuthConfig::create()
154 {
155 Debug::Levels[29]=9;
156 fake_auth_setup();
157
158 for (AuthScheme::iterator i = AuthScheme::GetSchemes().begin(); i != AuthScheme::GetSchemes().end(); ++i) {
159 AuthUserRequest::Pointer authRequest = AuthConfig::CreateAuthUser(find_proxy_auth((*i)->type()));
160 CPPUNIT_ASSERT(authRequest != NULL);
161 }
162 }
163
164 #if HAVE_IOSTREAM
165 #include <iostream>
166 #endif
167
168 /* AuthUserRequest::scheme returns the correct scheme for all
169 * authentication types
170 */
171 void
172 testAuthUserRequest::scheme()
173 {
174 Debug::Levels[29]=9;
175 fake_auth_setup();
176
177 for (AuthScheme::iterator i = AuthScheme::GetSchemes().begin(); i != AuthScheme::GetSchemes().end(); ++i) {
178 // create a user request
179 // check its scheme matches *i
180 AuthUserRequest::Pointer authRequest = AuthConfig::CreateAuthUser(find_proxy_auth((*i)->type()));
181 CPPUNIT_ASSERT_EQUAL(authRequest->scheme(), *i);
182 }
183 }
184
185 #if HAVE_AUTH_MODULE_BASIC
186 #include "auth/basic/basicUserRequest.h"
187 #include "auth/basic/auth_basic.h"
188 /* AuthBasicUserRequest::AuthBasicUserRequest works
189 */
190 void
191 testAuthBasicUserRequest::construction()
192 {
193 AuthBasicUserRequest();
194 AuthBasicUserRequest *temp=new AuthBasicUserRequest();
195 delete temp;
196 }
197
198 void
199 testAuthBasicUserRequest::username()
200 {
201 AuthUserRequest::Pointer temp = new AuthBasicUserRequest();
202 BasicUser *basic_auth=new BasicUser(AuthConfig::Find("basic"));
203 basic_auth->username("John");
204 temp->user(basic_auth);
205 #if USER_REQUEST_LOOP_DEAD
206 basic_auth->addRequest(temp);
207 #endif
208 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp->username()));
209 }
210 #endif /* HAVE_AUTH_MODULE_BASIC */
211
212 #if HAVE_AUTH_MODULE_DIGEST
213 #include "auth/digest/auth_digest.h"
214 /* AuthDigestUserRequest::AuthDigestUserRequest works
215 */
216 void
217 testAuthDigestUserRequest::construction()
218 {
219 AuthDigestUserRequest();
220 AuthDigestUserRequest *temp=new AuthDigestUserRequest();
221 delete temp;
222 }
223
224 void
225 testAuthDigestUserRequest::username()
226 {
227 AuthUserRequest::Pointer temp = new AuthDigestUserRequest();
228 DigestUser *duser=new DigestUser(AuthConfig::Find("digest"));
229 duser->username("John");
230 temp->user(duser);
231 #if USER_REQUEST_LOOP_DEAD
232 duser->addRequest(temp);
233 #endif
234 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp->username()));
235 }
236 #endif /* HAVE_AUTH_MODULE_DIGEST */
237
238 #if HAVE_AUTH_MODULE_NTLM
239 #include "auth/ntlm/auth_ntlm.h"
240 /* AuthNTLMUserRequest::AuthNTLMUserRequest works
241 */
242 void
243 testAuthNTLMUserRequest::construction()
244 {
245 AuthNTLMUserRequest();
246 AuthNTLMUserRequest *temp=new AuthNTLMUserRequest();
247 delete temp;
248 }
249
250 void
251 testAuthNTLMUserRequest::username()
252 {
253 AuthUserRequest::Pointer temp = new AuthNTLMUserRequest();
254 NTLMUser *nuser=new NTLMUser(AuthConfig::Find("ntlm"));
255 nuser->username("John");
256 temp->user(nuser);
257 #if USER_REQUEST_LOOP_DEAD
258 nuser->addRequest(temp);
259 #endif
260 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp->username()));
261 }
262 #endif /* HAVE_AUTH_MODULE_NTLM */
263
264 #if HAVE_AUTH_MODULE_NEGOTIATE
265 #include "auth/negotiate/auth_negotiate.h"
266 /* AuthNegotiateUserRequest::AuthNegotiateUserRequest works
267 */
268 void
269 testAuthNegotiateUserRequest::construction()
270 {
271 AuthNegotiateUserRequest();
272 AuthNegotiateUserRequest *temp=new AuthNegotiateUserRequest();
273 delete temp;
274 }
275
276 void
277 testAuthNegotiateUserRequest::username()
278 {
279 AuthUserRequest::Pointer temp = new AuthNegotiateUserRequest();
280 NegotiateUser *nuser=new NegotiateUser(AuthConfig::Find("negotiate"));
281 nuser->username("John");
282 temp->user(nuser);
283 #if USER_REQUEST_LOOP_DEAD
284 nuser->addRequest(temp);
285 #endif
286 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp->username()));
287 }
288
289 #endif /* HAVE_AUTH_MODULE_NEGOTIATE */