1 #define SQUID_UNIT_TEST 1
7 #include "auth/Config.h"
8 #include "auth/Gadgets.h"
9 #include "auth/Scheme.h"
10 #include "auth/UserRequest.h"
11 #include "ConfigParser.h"
15 CPPUNIT_TEST_SUITE_REGISTRATION( testAuth
);
16 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthConfig
);
17 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthUserRequest
);
18 #if HAVE_AUTH_MODULE_BASIC
19 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthBasicUserRequest
);
21 #if HAVE_AUTH_MODULE_DIGEST
22 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthDigestUserRequest
);
24 #if HAVE_AUTH_MODULE_NTLM
25 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthNTLMUserRequest
);
27 #if HAVE_AUTH_MODULE_NEGOTIATE
28 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthNegotiateUserRequest
);
31 /* Instantiate all auth framework types */
33 testAuth::instantiate()
36 char const * stub_config
="auth_param digest program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd\n"
37 "auth_param digest children 5\n"
38 "auth_param digest realm Squid proxy-caching web server\n"
39 "auth_param digest nonce_garbage_interval 5 minutes\n"
40 "auth_param digest nonce_max_duration 30 minutes\n"
41 "auth_param digest nonce_max_count 50\n";
45 find_proxy_auth(char const *type
)
47 char const * proxy_auths
[][2]= { {"basic","Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="},
49 {"digest", "Digest username=\"robertdig\", realm=\"Squid proxy-caching web server\", nonce=\"yy8rQXjEWwixXVBj\", uri=\"/images/bg8.gif\", response=\"f75a7d3edd48d93c681c75dc4fb58700\", qop=auth, nc=00000012, cnonce=\"e2216641961e228e\" "},
51 {"negotiate", "Negotiate "}
54 for (unsigned count
= 0; count
< 4 ; ++count
) {
55 if (strcasecmp(type
, proxy_auths
[count
][0]) == 0)
56 return proxy_auths
[count
][1];
64 getConfig(char const *type_str
)
66 Auth::ConfigVector
&config
= Auth::TheConfig
;
67 /* find a configuration for the scheme */
68 Auth::Config
*scheme
= Auth::Config::Find(type_str
);
71 /* Create a configuration */
72 Auth::Scheme::Pointer theScheme
= Auth::Scheme::Find(type_str
);
74 if (theScheme
== NULL
) {
76 //fatalf("Unknown authentication scheme '%s'.\n", type_str);
79 config
.push_back(theScheme
->createConfig());
80 scheme
= config
.back();
89 setup_scheme(Auth::Config
*scheme
, char const **params
, unsigned param_count
)
91 Auth::ConfigVector
&config
= Auth::TheConfig
;
93 for (unsigned position
=0; position
< param_count
; ++position
) {
94 char *param_str
=xstrdup(params
[position
]);
95 strtok(param_str
, w_space
);
96 ConfigParser::SetCfgLine(strtok(NULL
, ""));
97 scheme
->parse(scheme
, config
.size(), param_str
);
105 static bool setup(false);
112 Auth::ConfigVector
&config
= Auth::TheConfig
;
114 char const *digest_parms
[]= {"program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd",
118 char const *basic_parms
[]= {"program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd",
122 char const *ntlm_parms
[]= {"program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd"};
124 char const *negotiate_parms
[]= {"program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd"};
126 struct _scheme_params
{
129 unsigned paramlength
;
132 params
[]={ {"digest", digest_parms
, 2},
133 {"basic", basic_parms
, 2},
134 {"ntlm", ntlm_parms
, 1},
135 {"negotiate", negotiate_parms
, 1}
138 for (unsigned scheme
=0; scheme
< 4; ++scheme
) {
139 Auth::Config
*schemeConfig
;
140 schemeConfig
= getConfig(params
[scheme
].name
);
141 if (schemeConfig
!= NULL
)
142 setup_scheme(schemeConfig
, params
[scheme
].params
,
143 params
[scheme
].paramlength
);
145 fprintf(stderr
,"Skipping unknown authentication scheme '%s'.\n",
146 params
[scheme
].name
);
149 authenticateInit(&config
);
154 /* Auth::Config::CreateAuthUser works for all
155 * authentication types
158 testAuthConfig::create()
163 for (Auth::Scheme::iterator i
= Auth::Scheme::GetSchemes().begin(); i
!= Auth::Scheme::GetSchemes().end(); ++i
) {
164 AuthUserRequest::Pointer authRequest
= Auth::Config::CreateAuthUser(find_proxy_auth((*i
)->type()));
165 CPPUNIT_ASSERT(authRequest
!= NULL
);
173 /* AuthUserRequest::scheme returns the correct scheme for all
174 * authentication types
177 testAuthUserRequest::scheme()
182 for (Auth::Scheme::iterator i
= Auth::Scheme::GetSchemes().begin(); i
!= Auth::Scheme::GetSchemes().end(); ++i
) {
183 // create a user request
184 // check its scheme matches *i
185 AuthUserRequest::Pointer authRequest
= Auth::Config::CreateAuthUser(find_proxy_auth((*i
)->type()));
186 CPPUNIT_ASSERT_EQUAL(authRequest
->scheme(), *i
);
190 #if HAVE_AUTH_MODULE_BASIC
191 #include "auth/basic/User.h"
192 #include "auth/basic/UserRequest.h"
193 /* AuthBasicUserRequest::AuthBasicUserRequest works
196 testAuthBasicUserRequest::construction()
198 AuthBasicUserRequest();
199 AuthBasicUserRequest
*temp
=new AuthBasicUserRequest();
204 testAuthBasicUserRequest::username()
206 AuthUserRequest::Pointer temp
= new AuthBasicUserRequest();
207 Auth::Basic::User
*basic_auth
=new Auth::Basic::User(Auth::Config::Find("basic"));
208 basic_auth
->username("John");
209 temp
->user(basic_auth
);
210 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp
->username()));
212 #endif /* HAVE_AUTH_MODULE_BASIC */
214 #if HAVE_AUTH_MODULE_DIGEST
215 #include "auth/digest/User.h"
216 #include "auth/digest/UserRequest.h"
217 /* AuthDigestUserRequest::AuthDigestUserRequest works
220 testAuthDigestUserRequest::construction()
222 AuthDigestUserRequest();
223 AuthDigestUserRequest
*temp
=new AuthDigestUserRequest();
228 testAuthDigestUserRequest::username()
230 AuthUserRequest::Pointer temp
= new AuthDigestUserRequest();
231 Auth::Digest::User
*duser
=new Auth::Digest::User(Auth::Config::Find("digest"));
232 duser
->username("John");
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/User.h"
240 #include "auth/ntlm/UserRequest.h"
241 /* AuthNTLMUserRequest::AuthNTLMUserRequest works
244 testAuthNTLMUserRequest::construction()
246 AuthNTLMUserRequest();
247 AuthNTLMUserRequest
*temp
=new AuthNTLMUserRequest();
252 testAuthNTLMUserRequest::username()
254 AuthUserRequest::Pointer temp
= new AuthNTLMUserRequest();
255 Auth::Ntlm::User
*nuser
=new Auth::Ntlm::User(Auth::Config::Find("ntlm"));
256 nuser
->username("John");
258 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp
->username()));
260 #endif /* HAVE_AUTH_MODULE_NTLM */
262 #if HAVE_AUTH_MODULE_NEGOTIATE
263 #include "auth/negotiate/User.h"
264 #include "auth/negotiate/UserRequest.h"
265 /* AuthNegotiateUserRequest::AuthNegotiateUserRequest works
268 testAuthNegotiateUserRequest::construction()
270 AuthNegotiateUserRequest();
271 AuthNegotiateUserRequest
*temp
=new AuthNegotiateUserRequest();
276 testAuthNegotiateUserRequest::username()
278 AuthUserRequest::Pointer temp
= new AuthNegotiateUserRequest();
279 Auth::Negotiate::User
*nuser
=new Auth::Negotiate::User(Auth::Config::Find("negotiate"));
280 nuser
->username("John");
282 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp
->username()));
285 #endif /* HAVE_AUTH_MODULE_NEGOTIATE */
286 #endif /* USE_AUTH */