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