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