2 * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
13 #include "auth/Config.h"
14 #include "auth/Gadgets.h"
15 #include "auth/UserRequest.h"
16 #include "ConfigParser.h"
18 #include "unitTestMain.h"
20 CPPUNIT_TEST_SUITE_REGISTRATION( testAuth
);
21 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthConfig
);
22 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthUserRequest
);
23 #if HAVE_AUTH_MODULE_BASIC
24 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthBasicUserRequest
);
26 #if HAVE_AUTH_MODULE_DIGEST
27 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthDigestUserRequest
);
29 #if HAVE_AUTH_MODULE_NTLM
30 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthNTLMUserRequest
);
32 #if HAVE_AUTH_MODULE_NEGOTIATE
33 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthNegotiateUserRequest
);
36 /* Instantiate all auth framework types */
38 testAuth::instantiate()
41 char const * stub_config
="auth_param digest program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd\n"
42 "auth_param digest children 5\n"
43 "auth_param digest realm Squid proxy-caching web server\n"
44 "auth_param digest nonce_garbage_interval 5 minutes\n"
45 "auth_param digest nonce_max_duration 30 minutes\n"
46 "auth_param digest nonce_max_count 50\n";
50 find_proxy_auth(char const *type
)
52 char const * proxy_auths
[][2]= { {"basic","Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="},
54 {"digest", "Digest username=\"robertdig\", realm=\"Squid proxy-caching web server\", nonce=\"yy8rQXjEWwixXVBj\", uri=\"/images/bg8.gif\", response=\"f75a7d3edd48d93c681c75dc4fb58700\", qop=auth, nc=00000012, cnonce=\"e2216641961e228e\" "},
56 {"negotiate", "Negotiate "}
59 for (unsigned count
= 0; count
< 4 ; ++count
) {
60 if (strcasecmp(type
, proxy_auths
[count
][0]) == 0)
61 return proxy_auths
[count
][1];
69 getConfig(char const *type_str
)
71 Auth::ConfigVector
&config
= Auth::TheConfig
;
72 /* find a configuration for the scheme */
73 Auth::Config
*scheme
= Auth::Config::Find(type_str
);
76 /* Create a configuration */
77 Auth::Scheme::Pointer theScheme
= Auth::Scheme::Find(type_str
);
79 if (theScheme
== NULL
) {
81 //fatalf("Unknown authentication scheme '%s'.\n", type_str);
84 config
.push_back(theScheme
->createConfig());
85 scheme
= config
.back();
94 setup_scheme(Auth::Config
*scheme
, char const **params
, unsigned param_count
)
96 Auth::ConfigVector
&config
= Auth::TheConfig
;
98 for (unsigned position
=0; position
< param_count
; ++position
) {
99 char *param_str
=xstrdup(params
[position
]);
100 strtok(param_str
, w_space
);
101 ConfigParser::SetCfgLine(strtok(NULL
, ""));
102 scheme
->parse(scheme
, config
.size(), param_str
);
110 static bool setup(false);
117 Auth::ConfigVector
&config
= Auth::TheConfig
;
119 char const *digest_parms
[]= {"program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd",
123 char const *basic_parms
[]= {"program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd",
127 char const *ntlm_parms
[]= {"program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd"};
129 char const *negotiate_parms
[]= {"program /home/robertc/install/squid/libexec/digest_pw_auth /home/robertc/install/squid/etc/digest.pwd"};
131 struct _scheme_params
{
134 unsigned paramlength
;
137 params
[]= { {"digest", digest_parms
, 2},
138 {"basic", basic_parms
, 2},
139 {"ntlm", ntlm_parms
, 1},
140 {"negotiate", negotiate_parms
, 1}
143 for (unsigned scheme
=0; scheme
< 4; ++scheme
) {
144 Auth::Config
*schemeConfig
;
145 schemeConfig
= getConfig(params
[scheme
].name
);
146 if (schemeConfig
!= NULL
)
147 setup_scheme(schemeConfig
, params
[scheme
].params
,
148 params
[scheme
].paramlength
);
150 fprintf(stderr
,"Skipping unknown authentication scheme '%s'.\n",
151 params
[scheme
].name
);
154 authenticateInit(&config
);
159 /* Auth::Config::CreateAuthUser works for all
160 * authentication types
163 testAuthConfig::create()
168 for (Auth::Scheme::iterator i
= Auth::Scheme::GetSchemes().begin(); i
!= Auth::Scheme::GetSchemes().end(); ++i
) {
169 AuthUserRequest::Pointer authRequest
= Auth::Config::CreateAuthUser(find_proxy_auth((*i
)->type()));
170 CPPUNIT_ASSERT(authRequest
!= NULL
);
176 /* AuthUserRequest::scheme returns the correct scheme for all
177 * authentication types
180 testAuthUserRequest::scheme()
185 for (Auth::Scheme::iterator i
= Auth::Scheme::GetSchemes().begin(); i
!= Auth::Scheme::GetSchemes().end(); ++i
) {
186 // create a user request
187 // check its scheme matches *i
188 AuthUserRequest::Pointer authRequest
= Auth::Config::CreateAuthUser(find_proxy_auth((*i
)->type()));
189 CPPUNIT_ASSERT_EQUAL(authRequest
->scheme(), *i
);
193 #if HAVE_AUTH_MODULE_BASIC
194 #include "auth/basic/User.h"
195 #include "auth/basic/UserRequest.h"
196 /* AuthBasicUserRequest::AuthBasicUserRequest works
199 testAuthBasicUserRequest::construction()
201 AuthBasicUserRequest();
202 AuthBasicUserRequest
*temp
=new AuthBasicUserRequest();
207 testAuthBasicUserRequest::username()
209 AuthUserRequest::Pointer temp
= new AuthBasicUserRequest();
210 Auth::Basic::User
*basic_auth
=new Auth::Basic::User(Auth::Config::Find("basic"));
211 basic_auth
->username("John");
212 temp
->user(basic_auth
);
213 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp
->username()));
215 #endif /* HAVE_AUTH_MODULE_BASIC */
217 #if HAVE_AUTH_MODULE_DIGEST
218 #include "auth/digest/User.h"
219 #include "auth/digest/UserRequest.h"
220 /* AuthDigestUserRequest::AuthDigestUserRequest works
223 testAuthDigestUserRequest::construction()
225 AuthDigestUserRequest();
226 AuthDigestUserRequest
*temp
=new AuthDigestUserRequest();
231 testAuthDigestUserRequest::username()
233 AuthUserRequest::Pointer temp
= new AuthDigestUserRequest();
234 Auth::Digest::User
*duser
=new Auth::Digest::User(Auth::Config::Find("digest"));
235 duser
->username("John");
237 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp
->username()));
239 #endif /* HAVE_AUTH_MODULE_DIGEST */
241 #if HAVE_AUTH_MODULE_NTLM
242 #include "auth/ntlm/User.h"
243 #include "auth/ntlm/UserRequest.h"
244 /* AuthNTLMUserRequest::AuthNTLMUserRequest works
247 testAuthNTLMUserRequest::construction()
249 AuthNTLMUserRequest();
250 AuthNTLMUserRequest
*temp
=new AuthNTLMUserRequest();
255 testAuthNTLMUserRequest::username()
257 AuthUserRequest::Pointer temp
= new AuthNTLMUserRequest();
258 Auth::Ntlm::User
*nuser
=new Auth::Ntlm::User(Auth::Config::Find("ntlm"));
259 nuser
->username("John");
261 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp
->username()));
263 #endif /* HAVE_AUTH_MODULE_NTLM */
265 #if HAVE_AUTH_MODULE_NEGOTIATE
266 #include "auth/negotiate/User.h"
267 #include "auth/negotiate/UserRequest.h"
268 /* AuthNegotiateUserRequest::AuthNegotiateUserRequest works
271 testAuthNegotiateUserRequest::construction()
273 AuthNegotiateUserRequest();
274 AuthNegotiateUserRequest
*temp
=new AuthNegotiateUserRequest();
279 testAuthNegotiateUserRequest::username()
281 AuthUserRequest::Pointer temp
= new AuthNegotiateUserRequest();
282 Auth::Negotiate::User
*nuser
=new Auth::Negotiate::User(Auth::Config::Find("negotiate"));
283 nuser
->username("John");
285 CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp
->username()));
288 #endif /* HAVE_AUTH_MODULE_NEGOTIATE */
289 #endif /* USE_AUTH */