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 #ifdef HAVE_AUTH_MODULE_BASIC
15 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthBasicUserRequest
);
17 #ifdef HAVE_AUTH_MODULE_DIGEST
18 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthDigestUserRequest
);
20 #ifdef HAVE_AUTH_MODULE_NTLM
21 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthNTLMUserRequest
);
23 #ifdef 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 Vector
<AuthConfig
*> &config
= Config
.authConfiguration
;
63 /* find a configuration for the scheme */
64 AuthConfig
*scheme
= AuthConfig::Find (type_str
);
67 /* Create a configuration */
68 AuthScheme
*theScheme
;
70 if ((theScheme
= AuthScheme::Find(type_str
)) == 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 Vector
<AuthConfig
*> &config
= Config
.authConfiguration
;
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 Vector
<AuthConfig
*> &config
= Config
.authConfiguration
;
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::const_iterator i
= AuthScheme::Schemes().begin(); i
!= AuthScheme::Schemes().end(); ++i
) {
159 AuthUserRequest
*authRequest
= AuthConfig::CreateAuthUser(find_proxy_auth((*i
)->type()));
160 CPPUNIT_ASSERT(authRequest
!= NULL
);
166 /* AuthUserRequest::scheme returns the correct scheme for all
167 * authentication types
170 testAuthUserRequest::scheme()
175 for (AuthScheme::const_iterator i
= AuthScheme::Schemes().begin(); i
!= AuthScheme::Schemes().end(); ++i
) {
176 // create a user request
177 // check its scheme matches *i
178 AuthUserRequest
*authRequest
= AuthConfig::CreateAuthUser(find_proxy_auth((*i
)->type()));
179 CPPUNIT_ASSERT_EQUAL(authRequest
->scheme(), *i
);
183 #ifdef HAVE_AUTH_MODULE_BASIC
184 #include "auth/basic/auth_basic.h"
185 /* AuthBasicUserRequest::AuthBasicUserRequest works
188 testAuthBasicUserRequest::construction()
190 AuthBasicUserRequest();
191 AuthBasicUserRequest
*temp
=new AuthBasicUserRequest();
196 testAuthBasicUserRequest::username()
198 AuthBasicUserRequest();
199 AuthBasicUserRequest
*temp
=new AuthBasicUserRequest();
200 BasicUser
*basic_auth
=new BasicUser(AuthConfig::Find("basic"));
201 basic_auth
->username("John");
202 temp
->user(basic_auth
);
203 basic_auth
->addRequest(temp
);
204 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp
->username()));
207 #endif /* HAVE_AUTH_MODULE_BASIC */
209 #ifdef HAVE_AUTH_MODULE_DIGEST
210 #include "auth/digest/auth_digest.h"
211 /* AuthDigestUserRequest::AuthDigestUserRequest works
214 testAuthDigestUserRequest::construction()
216 AuthDigestUserRequest();
217 AuthDigestUserRequest
*temp
=new AuthDigestUserRequest();
222 testAuthDigestUserRequest::username()
224 AuthDigestUserRequest();
225 AuthDigestUserRequest
*temp
=new AuthDigestUserRequest();
226 DigestUser
*user
=new DigestUser(AuthConfig::Find("digest"));
227 user
->username("John");
229 user
->addRequest(temp
);
230 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp
->username()));
233 #endif /* HAVE_AUTH_MODULE_DIGEST */
235 #ifdef HAVE_AUTH_MODULE_NTLM
236 #include "auth/ntlm/auth_ntlm.h"
237 /* AuthNTLMUserRequest::AuthNTLMUserRequest works
240 testAuthNTLMUserRequest::construction()
242 AuthNTLMUserRequest();
243 AuthNTLMUserRequest
*temp
=new AuthNTLMUserRequest();
248 testAuthNTLMUserRequest::username()
250 AuthNTLMUserRequest();
251 AuthNTLMUserRequest
*temp
=new AuthNTLMUserRequest();
252 NTLMUser
*user
=new NTLMUser(AuthConfig::Find("ntlm"));
253 user
->username("John");
255 user
->addRequest(temp
);
256 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp
->username()));
259 #endif /* HAVE_AUTH_MODULE_NTLM */
261 #ifdef HAVE_AUTH_MODULE_NEGOTIATE
262 #include "auth/negotiate/auth_negotiate.h"
263 /* AuthNegotiateUserRequest::AuthNegotiateUserRequest works
266 testAuthNegotiateUserRequest::construction()
268 AuthNegotiateUserRequest();
269 AuthNegotiateUserRequest
*temp
=new AuthNegotiateUserRequest();
274 testAuthNegotiateUserRequest::username()
276 AuthNegotiateUserRequest();
277 AuthNegotiateUserRequest
*temp
=new AuthNegotiateUserRequest();
278 NegotiateUser
*user
=new NegotiateUser(AuthConfig::Find("negotiate"));
279 user
->username("John");
281 user
->addRequest(temp
);
282 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp
->username()));
286 #endif /* HAVE_AUTH_MODULE_NEGOTIATE */