]>
Commit | Line | Data |
---|---|---|
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 | ||
11 | CPPUNIT_TEST_SUITE_REGISTRATION( testAuth ); | |
12 | CPPUNIT_TEST_SUITE_REGISTRATION( testAuthConfig ); | |
13 | CPPUNIT_TEST_SUITE_REGISTRATION( testAuthUserRequest ); | |
14 | CPPUNIT_TEST_SUITE_REGISTRATION( testAuthBasicUserRequest ); | |
15 | CPPUNIT_TEST_SUITE_REGISTRATION( testAuthDigestUserRequest ); | |
16 | CPPUNIT_TEST_SUITE_REGISTRATION( testAuthNTLMUserRequest ); | |
f46fe759 | 17 | CPPUNIT_TEST_SUITE_REGISTRATION( testAuthNegotiateUserRequest ); |
f5691f9c | 18 | |
19 | /* Instantiate all auth framework types */ | |
20 | void | |
21 | testAuth::instantiate() | |
22 | {} | |
23 | ||
24 | char 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 | ||
31 | static | |
32 | char const * | |
33 | find_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 | ||
50 | static | |
51 | AuthConfig * | |
52 | getConfig(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 | ||
74 | static | |
75 | void | |
76 | setup_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 | ||
87 | static | |
88 | void | |
89 | fake_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 | */ | |
135 | void | |
136 | testAuthConfig::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 | */ | |
152 | void | |
153 | testAuthUserRequest::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 | */ | |
169 | void | |
170 | testAuthBasicUserRequest::construction() | |
171 | { | |
172 | AuthBasicUserRequest(); | |
173 | AuthBasicUserRequest *temp=new AuthBasicUserRequest(); | |
174 | delete temp; | |
175 | } | |
176 | ||
177 | void | |
178 | testAuthBasicUserRequest::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 | */ | |
193 | void | |
194 | testAuthDigestUserRequest::construction() | |
195 | { | |
196 | AuthDigestUserRequest(); | |
197 | AuthDigestUserRequest *temp=new AuthDigestUserRequest(); | |
198 | delete temp; | |
199 | } | |
200 | ||
201 | void | |
202 | testAuthDigestUserRequest::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 | */ | |
217 | void | |
218 | testAuthNTLMUserRequest::construction() | |
219 | { | |
220 | AuthNTLMUserRequest(); | |
221 | AuthNTLMUserRequest *temp=new AuthNTLMUserRequest(); | |
222 | delete temp; | |
223 | } | |
224 | ||
225 | void | |
226 | testAuthNTLMUserRequest::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 | */ | |
241 | void | |
242 | testAuthNegotiateUserRequest::construction() | |
243 | { | |
244 | AuthNegotiateUserRequest(); | |
245 | AuthNegotiateUserRequest *temp=new AuthNegotiateUserRequest(); | |
246 | delete temp; | |
247 | } | |
248 | ||
249 | void | |
250 | testAuthNegotiateUserRequest::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 | } |