On Sat, Sep 06, 2003 at 07:38:00AM +1000, Robert Collins wrote:
> On Sat, 2003-09-06 at 01:18, Diego Woitasen wrote:
> > This patch add 3 switch to acl proxy_auth to force a authentication
> > scheme to bogus clients, like IE and Messenger (see squid.conf help).
> >
> > Please somebody can check this and send me your opinion.
>
> Please run
> indent -br -ce -i4 -ci4 -l80 -nlp -npcs -npsl -d0 -sc -di0 -psl
>
> over your modified files to remove whitespace changes, and then
> regenerate the patch.
>
> Thank you,
> Rob
>
> --
> GPG key available at: <http://members.aardvark.net.au/lifeless/keys.txt>.
ups! sorry. This is the right patch (indent 1.9.1) and apply to
squid-2.5 CVS.
Changes:
-support for bogus clients in authentication.
-authenticateAuthSchemeConfigure() renamed to
authenticateAuthSchemeActive().
-New authenticateAuthSchemeConfigure() function.
Please check this and apply if it is OK or tell me how can I do this
better...
Thanks!
Diego Woitasen
LUGAR - Linux Users Group Argentina
diff -Nru squid-2.5/src/acl.c squid-2.5-ws/src/acl.c
--- squid-2.5/src/acl.c Mon May 12 04:24:37 2003
+++ squid-2.5-ws/src/acl.c Sun Sep 7 13:37:50 2003
@@ -628,11 +628,33 @@
}
data = *current;
Top = data->names;
- if ((t = strtokFile())) {
- debug(28, 5) ("aclParseUserList: First token is %s\n", t);
+ data->flags.schemeid = -1;
+ while ((t = strtokFile())) {
+ debug(28, 5) ("aclParseUserList: token is %s\n", t);
if (strcmp("-i", t) == 0) {
debug(28, 5) ("aclParseUserList: Going case-insensitive\n");
data->flags.case_insensitive = 1;
+ } else if (strcmp("-b", t) == 0) {
+ if (!authenticateAuthSchemeConfigured("basic")) {
+ debug(28, 5) ("aclParseUserList: -b switch ignored, basic auth not configured\n");
+ continue;
+ }
+ debug(28, 5) ("aclParseUserList: using basic auth\n");
+ data->flags.schemeid = authenticateAuthSchemeId("basic");
+ } else if (strcmp("-n", t) == 0) {
+ if (!authenticateAuthSchemeConfigured("ntlm")) {
+ debug(28, 5) ("aclParseUserList: -n switch ignored, ntlm auth not configured\n");
+ continue;
+ }
+ debug(28, 5) ("aclParseUserList: using ntlm auth\n");
+ data->flags.schemeid = authenticateAuthSchemeId("ntlm");
+ } else if (strcmp("-d", t) == 0) {
+ if (!authenticateAuthSchemeConfigured("digest")) {
+ debug(28, 5) ("aclParseUserList: -d switch ignored, digest auth not configured\n");
+ continue;
+ }
+ debug(28, 5) ("aclParseUserList: using digest auth\n");
+ data->flags.schemeid = authenticateAuthSchemeId("digest");
} else if (strcmp("REQUIRED", t) == 0) {
debug(28, 5) ("aclParseUserList: REQUIRED-type enabled\n");
data->flags.required = 1;
@@ -644,15 +666,9 @@
}
debug(28, 3) ("aclParseUserList: Case-insensitive-switch is %d\n",
data->flags.case_insensitive);
- /* we might inherit from a previous declaration */
-
- debug(28, 4) ("aclParseUserList: parsing user list\n");
- while ((t = strtokFile())) {
- debug(28, 6) ("aclParseUserList: Got token: %s\n", t);
- if (data->flags.case_insensitive)
- Tolower(t);
- Top = splay_insert(xstrdup(t), Top, (SPLAYCMP *) strcmp);
- }
+ debug(28, 3) ("aclParseUserList: scheme ID is %d\n", data->flags.schemeid);
+ /* we might inherit from a previous declaration, (?, diegows@linux.org.ar) */
+ debug(28, 4) ("aclParseUserList: user list parsed \n");
data->names = Top;
}
@@ -1695,6 +1711,7 @@
int answer;
checklist->current_acl = list->acl;
AclMatchedName = list->acl->name;
+ AclMatched = list->acl;
debug(28, 3) ("aclMatchAclList: checking %s%s\n",
list->op ? null_string : "!", list->acl->name);
answer = aclMatchAcl(list->acl, checklist);
diff -Nru squid-2.5/src/authenticate.c squid-2.5-ws/src/authenticate.c
--- squid-2.5/src/authenticate.c Sun May 18 18:49:19 2003
+++ squid-2.5-ws/src/authenticate.c Sun Sep 7 18:53:25 2003
@@ -56,9 +56,8 @@
/* Generic Functions */
-
static int
-authenticateAuthSchemeConfigured(const char *proxy_auth)
+authenticateAuthSchemeActive(const char *proxy_auth)
{
authScheme *scheme;
int i;
@@ -71,6 +70,7 @@
return 0;
}
+
int
authenticateAuthSchemeId(const char *typestr)
{
@@ -90,7 +90,7 @@
assert(proxy_auth != NULL);
assert(auth_user_request != NULL); /* we need this created for us. */
debug(29, 9) ("authenticateDecodeAuth: header = '%s'\n", proxy_auth);
- if (authenticateAuthSchemeConfigured(proxy_auth)) {
+ if (authenticateAuthSchemeActive(proxy_auth)) {
/* we're configured to use this scheme - but is it active ? */
if ((i = authenticateAuthSchemeId(proxy_auth)) != -1) {
authscheme_list[i].decodeauth(auth_user_request, proxy_auth);
@@ -733,14 +733,26 @@
else {
int i;
authScheme *scheme;
- /* call each configured & running authscheme */
- for (i = 0; i < Config.authConfig.n_configured; i++) {
- scheme = Config.authConfig.schemes + i;
- if (authscheme_list[scheme->Id].Active())
- authscheme_list[scheme->Id].authFixHeader(NULL, rep, type,
- request);
+ acl_user_data *user_data;
+
+ user_data = AclMatched->data;
+ if ((AclMatched->type == ACL_PROXY_AUTH || AclMatched->type == ACL_PROXY_AUTH) &&
+ user_data->flags.schemeid >= 0) {
+ if (authscheme_list[user_data->flags.schemeid].Active())
+ authscheme_list[user_data->flags.schemeid].authFixHeader(NULL,
+ rep, type, request);
else
- debug(29, 4) ("authenticateFixHeader: Configured scheme %s not Active\n", scheme->typestr);
+ debug(29, 4) ("authenticateFixHeader: Configured scheme %d not Active\n", user_data->flags.schemeid);
+ } else {
+ /* call each configured & running authscheme */
+ for (i = 0; i < Config.authConfig.n_configured; i++) {
+ scheme = Config.authConfig.schemes + i;
+ if (authscheme_list[scheme->Id].Active())
+ authscheme_list[scheme->Id].authFixHeader(NULL, rep, type,
+ request);
+ else
+ debug(29, 4) ("authenticateFixHeader: Configured scheme %s not Active\n", scheme->typestr);
+ }
}
}
}
@@ -754,7 +766,6 @@
if (auth_user_request != NULL)
auth_user_request->lastReply = AUTH_ACL_CANNOT_AUTHENTICATE;
}
-
/* call the active auth module and allow it to add a trailer to the request */
void
authenticateAddTrailer(HttpReply * rep, auth_user_request_t * auth_user_request, request_t * request, int accelerated)
@@ -763,7 +774,6 @@
&& (authscheme_list[auth_user_request->auth_user->auth_module - 1].AddTrailer))
authscheme_list[auth_user_request->auth_user->auth_module - 1].AddTrailer(auth_user_request, rep, accelerated);
}
-
void
authenticateAuthUserLock(auth_user_t * auth_user)
{
@@ -771,9 +781,8 @@
assert(auth_user != NULL);
auth_user->references++;
debug(29, 9) ("authenticateAuthUserLock auth_user '%p' now at '%ld'.\n", auth_user, (long int) auth_user->references);
-}
+} void
-void
authenticateAuthUserUnlock(auth_user_t * auth_user)
{
debug(29, 9) ("authenticateAuthUserUnlock auth_user '%p'.\n", auth_user);
@@ -795,9 +804,8 @@
assert(auth_user_request != NULL);
auth_user_request->references++;
debug(29, 9) ("authenticateAuthUserRequestLock auth_user request '%p' now at '%ld'.\n", auth_user_request, (long int) auth_user_request->references);
-}
+} void
-void
authenticateAuthUserRequestUnlock(auth_user_request_t * auth_user_request)
{
debug(29, 9) ("authenticateAuthUserRequestUnlock auth_user request '%p'.\n", auth_user_request);
@@ -820,15 +828,13 @@
{
assert(auth_user != NULL);
return auth_user->references;
-}
-
-/*
- * Combine two user structs. ONLY to be called from within a scheme
- * module. The scheme module is responsible for ensuring that the
- * two users _can_ be merged without invalidating all the request
- * scheme data. the scheme is also responsible for merging any user
- * related scheme data itself.
- */
+} /*
+ * Combine two user structs. ONLY to be called from within a scheme
+ * module. The scheme module is responsible for ensuring that the
+ * two users _can_ be merged without invalidating all the request
+ * scheme data. the scheme is also responsible for merging any user
+ * related scheme data itself.
+ */
void
authenticateAuthUserMerge(auth_user_t * from, auth_user_t * to)
{
@@ -873,8 +879,7 @@
* structure */
memFree(u->usernamehash, MEM_AUTH_USER_HASH);
}
- /* remove any outstanding requests */
- link = u->requests.head;
+ /* remove any outstanding requests */ link = u->requests.head;
while (link) {
debug(29, 5) ("authenticateFreeProxyAuthUser: removing request entry '%p'\n", link->data);
auth_user_request = link->data;
@@ -906,7 +911,6 @@
eventAdd("User Cache Maintenance", authenticateProxyUserCacheCleanup, NULL, Config.authenticateGCInterval, 1);
}
}
-
void
authenticateProxyUserCacheCleanup(void *datanotused)
{
@@ -960,12 +964,9 @@
debug(29, 5) ("authenticateUserCacheRestat: Clearing cache ACL results for user: %s\n", username);
aclCacheMatchFlush(&auth_user->proxy_match_cache);
}
-
-}
-
-/*
- * called to add another auth scheme module
- */
+} /*
+ * called to add another auth scheme module
+ */
void
authSchemeAdd(const char *type, AUTHSSETUP * setup)
{
@@ -974,8 +975,7 @@
/* find the number of currently known authscheme types */
for (i = 0; authscheme_list && authscheme_list[i].typestr; i++) {
assert(strcmp(authscheme_list[i].typestr, type) != 0);
- }
- /* add the new type */
+ } /* add the new type */
authscheme_list = xrealloc(authscheme_list, (i + 2) * sizeof(authscheme_entry_t));
memset(&authscheme_list[i], 0, sizeof(authscheme_entry_t));
memset(&authscheme_list[i + 1], 0, sizeof(authscheme_entry_t));
@@ -998,4 +998,16 @@
auth_user->usernamehash = usernamehash;
/* lock for presence in the cache */
authenticateAuthUserLock(auth_user);
+} int
+authenticateAuthSchemeConfigured(const char *proxy_auth)
+{
+ authScheme *scheme;
+ int i;
+ for (i = 0; i < Config.authConfig.n_configured; i++) {
+ scheme = Config.authConfig.schemes + i;
+ if ((strncasecmp(proxy_auth, scheme->typestr, strlen(scheme->typestr)) == 0) &&
+ (authscheme_list[scheme->Id].configured()))
+ return 1;
+ }
+ return 0;
}
diff -Nru squid-2.5/src/cf.data.pre squid-2.5-ws/src/cf.data.pre
--- squid-2.5/src/cf.data.pre Tue Sep 2 04:49:32 2003
+++ squid-2.5-ws/src/cf.data.pre Sat Sep 6 23:39:51 2003
@@ -1971,10 +1971,14 @@
# cache_peer_access mycache.mydomain.net allow asexample
# cache_peer_access mycache_mydomain.net deny all
- acl aclname proxy_auth username ...
+ acl aclname proxy_auth [-i] [-b | -n | -d ] username ...
acl aclname proxy_auth_regex [-i] pattern ...
# list of valid usernames
# use REQUIRED to accept any valid username.
+ # -i: case-insensitive
+ # -b: use basic authentication
+ # -n: use NTLM authentication
+ # -d: use digest authentication
#
# NOTE: when a Proxy-Authentication header is sent but it is not
# needed during ACL checking the username is NOT logged
@@ -1983,6 +1987,9 @@
# NOTE: proxy_auth requires a EXTERNAL authentication program
# to check username/password combinations (see
# auth_param directive).
+ #
+ # NOTE: If -b, -n or -d is not especified, the three schemes are
+ # offered to the client.
#
# WARNING: proxy_auth can't be used in a transparent proxy. It
# collides with any authentication done by origin servers. It may
diff -Nru squid-2.5/src/globals.h squid-2.5-ws/src/globals.h
--- squid-2.5/src/globals.h Mon Jan 13 20:01:13 2003
+++ squid-2.5-ws/src/globals.h Sat Sep 6 23:30:09 2003
@@ -47,6 +47,7 @@
extern char ThisCache2[SQUIDHOSTNAMELEN << 1];
extern char config_input_line[BUFSIZ];
extern const char *AclMatchedName; /* NULL */
+extern acl *AclMatched; /* NULL */
extern const char *DefaultConfigFile; /* DEFAULT_CONFIG_FILE */
extern const char *RequestMethodStr[];
extern const char *ProtocolStr[];
diff -Nru squid-2.5/src/protos.h squid-2.5-ws/src/protos.h
--- squid-2.5/src/protos.h Sun Aug 10 18:04:47 2003
+++ squid-2.5-ws/src/protos.h Sun Sep 7 00:47:45 2003
@@ -739,6 +739,7 @@
extern void authSchemeSetup(void);
/* authenticate.c */
+extern int authenticateAuthSchemeConfigured(const char *proxy_auth);
extern void authenticateAuthUserMerge(auth_user_t *, auth_user_t *);
extern auth_user_t *authenticateAuthUserNew(const char *);
extern int authenticateAuthSchemeId(const char *typestr);
diff -Nru squid-2.5/src/structs.h squid-2.5-ws/src/structs.h
--- squid-2.5/src/structs.h Wed Aug 6 10:49:03 2003
+++ squid-2.5-ws/src/structs.h Sun Sep 7 18:52:55 2003
@@ -53,6 +53,7 @@
struct {
unsigned int case_insensitive:1;
unsigned int required:1;
+ short int schemeid;
} flags;
};
Received on Sun Sep 07 2003 - 16:36:39 MDT
This archive was generated by hypermail pre-2.1.9 : Tue Dec 09 2003 - 16:20:40 MST