Index: squid/src/acl.c diff -c squid/src/acl.c:1.270.2.21 squid/src/acl.c:1.270.2.22 *** squid/src/acl.c:1.270.2.21 Thu Jan 15 00:43:57 2004 --- squid/src/acl.c Tue Feb 17 21:00:08 2004 *************** *** 1633,1649 **** case ACL_PROXY_AUTH_REGEX: if ((ti = aclAuthenticated(checklist)) != 1) return ti; ! ti = aclMatchProxyAuth(ae->data, checklist->auth_user_request, checklist, ae->type); - checklist->auth_user_request = NULL; return ti; /* NOTREACHED */ case ACL_MAX_USER_IP: if ((ti = aclAuthenticated(checklist)) != 1) return ti; ! ti = aclMatchUserMaxIP(ae->data, checklist->auth_user_request, checklist->src_addr); - checklist->auth_user_request = NULL; return ti; /* NOTREACHED */ #if SQUID_SNMP --- 1633,1647 ---- case ACL_PROXY_AUTH_REGEX: if ((ti = aclAuthenticated(checklist)) != 1) return ti; ! ti = aclMatchProxyAuth(ae->data, r->auth_user_request, checklist, ae->type); return ti; /* NOTREACHED */ case ACL_MAX_USER_IP: if ((ti = aclAuthenticated(checklist)) != 1) return ti; ! ti = aclMatchUserMaxIP(ae->data, r->auth_user_request, checklist->src_addr); return ti; /* NOTREACHED */ #if SQUID_SNMP *************** *** 1740,1745 **** --- 1738,1747 ---- cbdataUnlock(checklist->extacl_entry); checklist->extacl_entry = NULL; } + if (checklist->auth_user_request) { + authenticateAuthUserRequestUnlock(checklist->auth_user_request); + checklist->auth_user_request = NULL; + } checklist->current_acl = NULL; } *************** *** 1902,1912 **** if (checklist->auth_user_request) { /* the checklist lock */ authenticateAuthUserRequestUnlock(checklist->auth_user_request); /* it might have been connection based */ assert(checklist->conn); ! checklist->conn->auth_user_request = NULL; checklist->conn->auth_type = AUTH_BROKEN; - checklist->auth_user_request = NULL; } if (cbdataValid(checklist->callback_data)) checklist->callback(answer, checklist->callback_data); --- 1904,1922 ---- if (checklist->auth_user_request) { /* the checklist lock */ authenticateAuthUserRequestUnlock(checklist->auth_user_request); + checklist->auth_user_request = NULL; /* it might have been connection based */ assert(checklist->conn); ! if (checklist->conn->auth_user_request) { ! authenticateAuthUserRequestUnlock(checklist->conn->auth_user_request); ! checklist->conn->auth_user_request = NULL; ! } ! assert(checklist->request); ! if (checklist->request->auth_user_request) { ! authenticateAuthUserRequestUnlock(checklist->request->auth_user_request); ! checklist->request->auth_user_request = NULL; ! } checklist->conn->auth_type = AUTH_BROKEN; } if (cbdataValid(checklist->callback_data)) checklist->callback(answer, checklist->callback_data); *************** *** 1983,1993 **** * restart the whole process */ /* OR the connection was closed, there's no way to continue */ authenticateAuthUserRequestUnlock(checklist->auth_user_request); if (checklist->conn) { ! checklist->conn->auth_user_request = NULL; checklist->conn->auth_type = AUTH_BROKEN; } - checklist->auth_user_request = NULL; } aclCheck(checklist); } --- 1993,2006 ---- * restart the whole process */ /* OR the connection was closed, there's no way to continue */ authenticateAuthUserRequestUnlock(checklist->auth_user_request); + checklist->auth_user_request = NULL; if (checklist->conn) { ! if (checklist->conn->auth_user_request) { ! authenticateAuthUserRequestUnlock(checklist->conn->auth_user_request); ! checklist->conn->auth_user_request = NULL; ! } checklist->conn->auth_type = AUTH_BROKEN; } } aclCheck(checklist); } Index: squid/src/authenticate.c diff -c squid/src/authenticate.c:1.36.2.12 squid/src/authenticate.c:1.36.2.14 *** squid/src/authenticate.c:1.36.2.12 Thu Feb 12 05:49:36 2004 --- squid/src/authenticate.c Wed Feb 18 11:51:16 2004 *************** *** 381,386 **** --- 381,388 ---- { if (!authenticateValidateUser(auth_user_request)) return 0; + if (auth_user_request->lastReply == AUTH_AUTHENTICATED) + return 1; if (auth_user_request->auth_user->auth_module> 0) return authscheme_list[auth_user_request->auth_user->auth_module - 1].authenticated(auth_user_request); else *************** *** 461,467 **** if (*auth_user_request) { /* unlock the ACL lock */ authenticateAuthUserRequestUnlock(*auth_user_request); ! auth_user_request = NULL; } return AUTH_ACL_CHALLENGE; } --- 463,469 ---- if (*auth_user_request) { /* unlock the ACL lock */ authenticateAuthUserRequestUnlock(*auth_user_request); ! *auth_user_request = NULL; } return AUTH_ACL_CHALLENGE; } *************** *** 585,590 **** --- 587,593 ---- } /* Unlock the request - we've authenticated it */ authenticateAuthUserRequestUnlock(*auth_user_request); + *auth_user_request = NULL; return AUTH_AUTHENTICATED; } *************** *** 596,611 **** auth_acl_t result; if (t && t->lastReply != AUTH_ACL_CANNOT_AUTHENTICATE && t->lastReply != AUTH_ACL_HELPER) { ! if (!*auth_user_request) *auth_user_request = t; return t->lastReply; } /* ok, call the actual authenticator routine. */ result = authenticateAuthenticate(auth_user_request, headertype, request, conn, src_addr); t = authTryGetUser(auth_user_request, conn, request); if (t && result != AUTH_ACL_CANNOT_AUTHENTICATE && ! result != AUTH_ACL_HELPER) t->lastReply = result; return result; } --- 599,621 ---- auth_acl_t result; if (t && t->lastReply != AUTH_ACL_CANNOT_AUTHENTICATE && t->lastReply != AUTH_ACL_HELPER) { ! if (!*auth_user_request) { *auth_user_request = t; + authenticateAuthUserRequestLock(*auth_user_request); + } + if (!request->auth_user_request) { + request->auth_user_request = t; + authenticateAuthUserRequestLock(request->auth_user_request); + } return t->lastReply; } /* ok, call the actual authenticator routine. */ result = authenticateAuthenticate(auth_user_request, headertype, request, conn, src_addr); t = authTryGetUser(auth_user_request, conn, request); if (t && result != AUTH_ACL_CANNOT_AUTHENTICATE && ! result != AUTH_ACL_HELPER) { t->lastReply = result; + } return result; } *************** *** 732,738 **** || (rep->sline.status == HTTP_UNAUTHORIZED)) && internal) /* this is a authenticate-needed response */ { ! if ((auth_user_request != NULL) && (auth_user_request->auth_user->auth_module> 0) & !authenticateUserAuthenticated(auth_user_request)) authscheme_list[auth_user_request->auth_user->auth_module - 1].authFixHeader(auth_user_request, rep, type, request); else { int i; --- 742,748 ---- || (rep->sline.status == HTTP_UNAUTHORIZED)) && internal) /* this is a authenticate-needed response */ { ! if ((auth_user_request != NULL) && (auth_user_request->auth_user->auth_module> 0) && authenticateDirection(auth_user_request) == 1) authscheme_list[auth_user_request->auth_user->auth_module - 1].authFixHeader(auth_user_request, rep, type, request); else { int i; *************** *** 785,791 **** if (auth_user->references> 0) { auth_user->references--; } else { ! debug(29, 1) ("Attempt to lower Auth User %p refcount below 0!\n", auth_user); } debug(29, 9) ("authenticateAuthUserUnlock auth_user '%p' now at '%ld'.\n", auth_user, (long int) auth_user->references); if (auth_user->references == 0) --- 795,801 ---- if (auth_user->references> 0) { auth_user->references--; } else { ! fatalf("Attempt to lower Auth User %p refcount below 0!\n", auth_user); } debug(29, 9) ("authenticateAuthUserUnlock auth_user '%p' now at '%ld'.\n", auth_user, (long int) auth_user->references); if (auth_user->references == 0) Index: squid/src/external_acl.c diff -c squid/src/external_acl.c:1.1.2.29 squid/src/external_acl.c:1.1.2.30 *** squid/src/external_acl.c:1.1.2.29 Wed Nov 19 09:47:43 2003 --- squid/src/external_acl.c Tue Feb 17 21:00:08 2004 *************** *** 423,430 **** /* Not sufficient data to process */ return -1; } - if (acl->def->require_auth) - ch->auth_user_request = NULL; if (entry) { if (entry->def != acl->def || strcmp(entry->hash.key, key) != 0) { /* Not ours.. get rid of it */ --- 423,428 ---- *************** *** 509,515 **** const char *str = NULL; switch (format->type) { case EXT_ACL_LOGIN: ! str = authenticateUserRequestUsername(ch->auth_user_request); break; #if USE_IDENT case EXT_ACL_IDENT: --- 507,513 ---- const char *str = NULL; switch (format->type) { case EXT_ACL_LOGIN: ! str = authenticateUserRequestUsername(request->auth_user_request); break; #if USE_IDENT case EXT_ACL_IDENT: *************** *** 761,767 **** } } key = makeExternalAclKey(ch, acl); - ch->auth_user_request = NULL; if (!key) { debug(82, 1) ("externalAclLookup: lookup in '%s', prerequisit failure\n", def->name); callback(callback_data, NULL); --- 759,764 ----