1 #define SQUID_UNIT_TEST 1
5 #include "auth/Gadgets.h"
6 #include "auth/UserRequest.h"
7 #include "auth/Scheme.h"
8 #include "auth/Config.h"
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
);
17 #if HAVE_AUTH_MODULE_DIGEST
18 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthDigestUserRequest
);
20 #if HAVE_AUTH_MODULE_NTLM
21 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthNTLMUserRequest
);
23 #if HAVE_AUTH_MODULE_NEGOTIATE
24 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthNegotiateUserRequest
);
27 /* Instantiate all auth framework types */
29 testAuth::instantiate()
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";
41 find_proxy_auth(char const *type
)
43 char const * proxy_auths
[][2]= { {"basic","Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="},
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\" "},
47 {"negotiate", "Negotiate "}
50 for (unsigned count
= 0; count
< 4 ; count
++) {
51 if (strcasecmp(type
, proxy_auths
[count
][0]) == 0)
52 return proxy_auths
[count
][1];
60 getConfig(char const *type_str
)
62 Auth::authConfig
&config
= Auth::TheConfig
;
63 /* find a configuration for the scheme */
64 AuthConfig
*scheme
= AuthConfig::Find(type_str
);
67 /* Create a configuration */
68 AuthScheme::Pointer theScheme
= AuthScheme::Find(type_str
);
70 if (theScheme
== NULL
) {
72 //fatalf("Unknown authentication scheme '%s'.\n", type_str);
75 config
.push_back(theScheme
->createConfig());
76 scheme
= config
.back();
85 setup_scheme(AuthConfig
*scheme
, char const **params
, unsigned param_count
)
87 Auth::authConfig
&config
= Auth::TheConfig
;
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
);
100 static bool setup(false);
107 Auth::authConfig
&config
= Auth::TheConfig
;
109 char const *digest_parms
[]= {"program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd",
113 char const *basic_parms
[]= {"program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd",
117 char const *ntlm_parms
[]= {"program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd"};
119 char const *negotiate_parms
[]= {"program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd"};
121 struct _scheme_params
{
124 unsigned paramlength
;
127 params
[]={ {"digest", digest_parms
, 2},
128 {"basic", basic_parms
, 2},
129 {"ntlm", ntlm_parms
, 1},
130 {"negotiate", negotiate_parms
, 1}
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
);
140 fprintf(stderr
,"Skipping unknown authentication scheme '%s'.\n",
141 params
[scheme
].name
);
144 authenticateInit(&config
);
149 /* AuthConfig::CreateAuthUser works for all
150 * authentication types
153 testAuthConfig::create()
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
);
168 /* AuthUserRequest::scheme returns the correct scheme for all
169 * authentication types
172 testAuthUserRequest::scheme()
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
);
185 #if HAVE_AUTH_MODULE_BASIC
186 #include "auth/basic/basicUserRequest.h"
187 #include "auth/basic/auth_basic.h"
188 /* AuthBasicUserRequest::AuthBasicUserRequest works
191 testAuthBasicUserRequest::construction()
193 AuthBasicUserRequest();
194 AuthBasicUserRequest
*temp
=new AuthBasicUserRequest();
199 testAuthBasicUserRequest::username()
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
);
208 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp
->username()));
210 #endif /* HAVE_AUTH_MODULE_BASIC */
212 #if HAVE_AUTH_MODULE_DIGEST
213 #include "auth/digest/auth_digest.h"
214 /* AuthDigestUserRequest::AuthDigestUserRequest works
217 testAuthDigestUserRequest::construction()
219 AuthDigestUserRequest();
220 AuthDigestUserRequest
*temp
=new AuthDigestUserRequest();
225 testAuthDigestUserRequest::username()
227 AuthUserRequest::Pointer temp
= new AuthDigestUserRequest();
228 DigestUser
*duser
=new DigestUser(AuthConfig::Find("digest"));
229 duser
->username("John");
231 #if USER_REQUEST_LOOP_DEAD
232 duser
->addRequest(temp
);
234 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp
->username()));
236 #endif /* HAVE_AUTH_MODULE_DIGEST */
238 #if HAVE_AUTH_MODULE_NTLM
239 #include "auth/ntlm/auth_ntlm.h"
240 /* AuthNTLMUserRequest::AuthNTLMUserRequest works
243 testAuthNTLMUserRequest::construction()
245 AuthNTLMUserRequest();
246 AuthNTLMUserRequest
*temp
=new AuthNTLMUserRequest();
251 testAuthNTLMUserRequest::username()
253 AuthUserRequest::Pointer temp
= new AuthNTLMUserRequest();
254 NTLMUser
*nuser
=new NTLMUser(AuthConfig::Find("ntlm"));
255 nuser
->username("John");
257 #if USER_REQUEST_LOOP_DEAD
258 nuser
->addRequest(temp
);
260 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp
->username()));
262 #endif /* HAVE_AUTH_MODULE_NTLM */
264 #if HAVE_AUTH_MODULE_NEGOTIATE
265 #include "auth/negotiate/auth_negotiate.h"
266 /* AuthNegotiateUserRequest::AuthNegotiateUserRequest works
269 testAuthNegotiateUserRequest::construction()
271 AuthNegotiateUserRequest();
272 AuthNegotiateUserRequest
*temp
=new AuthNegotiateUserRequest();
277 testAuthNegotiateUserRequest::username()
279 AuthUserRequest::Pointer temp
= new AuthNegotiateUserRequest();
280 NegotiateUser
*nuser
=new NegotiateUser(AuthConfig::Find("negotiate"));
281 nuser
->username("John");
283 #if USER_REQUEST_LOOP_DEAD
284 nuser
->addRequest(temp
);
286 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp
->username()));
289 #endif /* HAVE_AUTH_MODULE_NEGOTIATE */