]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Upgrade AuthUserRequest ref-counting
authorAmos Jeffries <squid3@treenet.co.nz>
Thu, 17 Dec 2009 04:48:51 +0000 (17:48 +1300)
committerAmos Jeffries <squid3@treenet.co.nz>
Thu, 17 Dec 2009 04:48:51 +0000 (17:48 +1300)
TODO:
 Test auth still runs. Some problems were noted in conversion which affect
digest, NTLM, Negotiate AuthUser objects.
Notably that the virtual functions setting a custom field instead of the
parent objects _auth_user woudl result in teh *::Pointer having a NULL user()

 Convert AuthUser, AuthScheme, AuthConfig to ref-counted as well.

40 files changed:
src/CompositePoolNode.h
src/HttpRequest.cc
src/HttpRequest.h
src/acl/FilledChecklist.cc
src/acl/FilledChecklist.h
src/adaptation/icap/ModXact.cc
src/auth/Acl.cc
src/auth/AclMaxUserIp.cc
src/auth/AclMaxUserIp.h
src/auth/AclProxyAuth.cc
src/auth/Config.cc
src/auth/Config.h
src/auth/Makefile.am
src/auth/User.cc
src/auth/User.cci
src/auth/User.h
src/auth/UserRequest.cc
src/auth/UserRequest.h
src/auth/basic/auth_basic.cc
src/auth/basic/auth_basic.h
src/auth/digest/auth_digest.cc
src/auth/digest/auth_digest.h
src/auth/negotiate/auth_negotiate.cc
src/auth/negotiate/auth_negotiate.h
src/auth/ntlm/auth_ntlm.cc
src/auth/ntlm/auth_ntlm.h
src/client_side.cc
src/client_side.h
src/client_side_reply.cc
src/client_side_reply.h
src/client_side_request.cc
src/enums.h
src/errorpage.cc
src/errorpage.h
src/external_acl.cc
src/http.cc
src/peer_userhash.cc
src/redirect.cc
src/stat.cc
src/tests/testAuth.cc

index ccecf4a671d5df3fee10bc758b66ea85e9e79b7f..6318c8233bf0a8f30b74c4f222534657f0c5a273 100644 (file)
@@ -41,6 +41,7 @@
 
 #if DELAY_POOLS
 #include "squid.h"
+#include "auth/UserRequest.h"
 #include "DelayPools.h"
 #include "DelayIdComposite.h"
 #include "CommRead.h"
@@ -48,8 +49,6 @@
 
 class StoreEntry;
 
-class AuthUserRequest;
-
 /// \ingroup DelayPoolsAPI
 class CompositePoolNode : public RefCountable, public Updateable
 {
@@ -77,7 +76,7 @@ public:
         CompositeSelectionDetails() {}
 
         IpAddress src_addr;
-        AuthUserRequest *user;
+        AuthUserRequest::Pointer user;
         String tag;
     };
 
index 0ce9786b0ba8990568bffa0cfb39c197c26f8451..c003ccfa029d6bca671b466b71717e60a5647b29 100644 (file)
@@ -123,7 +123,7 @@ HttpRequest::clean()
     // points to a pipe that is owned and initiated by another object.
     body_pipe = NULL;
 
-    AUTHUSERREQUESTUNLOCK(auth_user_request, "request");
+    auth_user_request = NULL;
 
     safe_free(canonical);
 
@@ -589,10 +589,7 @@ bool HttpRequest::inheritProperties(const HttpMsg *aMsg)
     // may eventually need cloneNullAdaptationImmune() for that.
     flags = aReq->flags.cloneAdaptationImmune();
 
-    if (aReq->auth_user_request) {
-        auth_user_request = aReq->auth_user_request;
-        AUTHUSERREQUESTLOCK(auth_user_request, "inheritProperties");
-    }
+    auth_user_request = aReq->auth_user_request;
 
     if (aReq->pinned_connection) {
         pinned_connection = cbdataReference(aReq->pinned_connection);
index 5c935e94409b6c567819bc1ed5ad5658dda4e751..4f8558dc555d77eeb2270d69765d1708d1ba8f7a 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * $Id$
  *
@@ -151,7 +150,7 @@ private:
 public:
     IpAddress host_addr;
 
-    AuthUserRequest *auth_user_request;
+    AuthUserRequest::Pointer auth_user_request;
 
     u_short port;
 
index 9b2c5005494bcb28623601423e192c6653384096..7cfd5306b34cb5202e3c363b14bb4e8187ccae38 100644 (file)
@@ -30,23 +30,7 @@ ACLFilledChecklist::authenticated()
 
     /* get authed here */
     /* Note: this fills in auth_user_request when applicable */
-    /*
-     * DPW 2007-05-08
-     * tryToAuthenticateAndSetAuthUser used to try to lock and
-     * unlock auth_user_request on our behalf, but it was too
-     * ugly and hard to follow.  Now we do our own locking here.
-     *
-     * I'm not sure what tryToAuthenticateAndSetAuthUser does when
-     * auth_user_request is set before calling.  I'm tempted to
-     * unlock and set it to NULL, but it seems safer to save the
-     * pointer before calling and unlock it afterwards.  If the
-     * pointer doesn't change then its a no-op.
-     */
-    AuthUserRequest *old_auth_user_request = auth_user_request;
-    auth_acl_t result = AuthUserRequest::tryToAuthenticateAndSetAuthUser (&auth_user_request, headertype, request, conn(), src_addr);
-    if (auth_user_request)
-        AUTHUSERREQUESTLOCK(auth_user_request, "ACLFilledChecklist");
-    AUTHUSERREQUESTUNLOCK(old_auth_user_request, "old ACLFilledChecklist");
+    auth_acl_t result = AuthUserRequest::tryToAuthenticateAndSetAuthUser(&auth_user_request, headertype, request, conn(), src_addr);
     switch (result) {
 
     case AUTH_ACL_CANNOT_AUTHENTICATE:
@@ -83,18 +67,14 @@ ACLFilledChecklist::checkCallback(allow_t answer)
     /* During reconfigure, we can end up not finishing call
      * sequences into the auth code */
 
-    if (auth_user_request) {
+    if (auth_user_request != NULL) {
         /* the filled_checklist lock */
-        AUTHUSERREQUESTUNLOCK(auth_user_request, "ACLFilledChecklist");
+        auth_user_request = NULL;
         /* it might have been connection based */
-        assert(conn() != NULL);
-        /*
-         * DPW 2007-05-08
-         * yuck, this make me uncomfortable.  why do this here?
-         * ConnStateData will do its own unlocking.
-         */
-        AUTHUSERREQUESTUNLOCK(conn()->auth_user_request, "conn via ACLFilledChecklist");
-        conn()->auth_type = AUTH_BROKEN;
+        if(conn()) {
+            conn()->auth_user_request = NULL;
+            conn()->auth_type = AUTH_BROKEN;
+        }
     }
 
     ACLChecklist::checkCallback(answer); // may delete us
@@ -156,10 +136,6 @@ ACLFilledChecklist::~ACLFilledChecklist()
 
     HTTPMSGUNLOCK(reply);
 
-    // no auth_user_request in builds without any Authentication configured
-    if (auth_user_request)
-        AUTHUSERREQUESTUNLOCK(auth_user_request, "ACLFilledChecklist destructor");
-
     cbdataReferenceDone(conn_);
 
     debugs(28, 4, HERE << "ACLFilledChecklist destroyed " << this);
index dd9572499b191d9f3bbbdd4c76fdff769ffecd8d..80ecd02ab0a7bc344a7afa06e78d3ac96733562f 100644 (file)
@@ -2,8 +2,8 @@
 #define SQUID_ACLFILLED_CHECKLIST_H
 
 #include "acl/Checklist.h"
+#include "auth/UserRequest.h"
 
-class AuthUserRequest;
 class ExternalACLEntry;
 class ConnStateData;
 
@@ -53,7 +53,7 @@ public:
     HttpReply *reply;
 
     char rfc931[USER_IDENT_SZ];
-    AuthUserRequest *auth_user_request;
+    AuthUserRequest::Pointer auth_user_request;
 
 #if SQUID_SNMP
     char *snmp_community;
index 42f05709fa33156c6fc891cf6d862170a6648f23..9c4f237d67514f8134a60f74347f2c4c0d79fd04 100644 (file)
@@ -1271,12 +1271,11 @@ void Adaptation::Icap::ModXact::makeRequestHeaders(MemBuf &buf)
 
 void Adaptation::Icap::ModXact::makeUsernameHeader(const HttpRequest *request, MemBuf &buf)
 {
-    if (const AuthUserRequest *auth = request->auth_user_request) {
-        if (char const *name = auth->username()) {
-            const char *value = TheConfig.client_username_encode ?
-                                base64_encode(name) : name;
-            buf.Printf("%s: %s\r\n", TheConfig.client_username_header,
-                       value);
+    if (request->auth_user_request != NULL) {
+        char const *name = (request->auth_user_request)->username();
+        if (name) {
+            const char *value = TheConfig.client_username_encode ? base64_encode(name) : name;
+            buf.Printf("%s: %s\r\n", TheConfig.client_username_header, value);
         }
     }
 }
index dddea7d0d4868363a03acef56623206bc58a7dd6..6952fbc76d2cb1c5389183221b2998db63a097b2 100644 (file)
@@ -32,25 +32,9 @@ AuthenticateAcl(ACLChecklist *ch)
 
     /* get authed here */
     /* Note: this fills in auth_user_request when applicable */
-    /*
-     * DPW 2007-05-08
-     * tryToAuthenticateAndSetAuthUser used to try to lock and
-     * unlock auth_user_request on our behalf, but it was too
-     * ugly and hard to follow.  Now we do our own locking here.
-     *
-     * I'm not sure what tryToAuthenticateAndSetAuthUser does when
-     * auth_user_request is set before calling.  I'm tempted to
-     * unlock and set it to NULL, but it seems safer to save the
-     * pointer before calling and unlock it afterwards.  If the
-     * pointer doesn't change then its a no-op.
-     */
-    AuthUserRequest *old_auth_user_request = checklist->auth_user_request;
     const auth_acl_t result = AuthUserRequest::tryToAuthenticateAndSetAuthUser(
                                   &checklist->auth_user_request, headertype, request,
                                   checklist->conn(), checklist->src_addr);
-    if (checklist->auth_user_request)
-        AUTHUSERREQUESTLOCK(checklist->auth_user_request, "ACLAuth::authenticated");
-    AUTHUSERREQUESTUNLOCK(old_auth_user_request, "old ACLAuth");
     switch (result) {
 
     case AUTH_ACL_CANNOT_AUTHENTICATE:
index 881ea82fce12f8e26f1757d4e29a8c0c2a0c51ea..571268726a03d161616858aa9c0b293adfecdf14 100644 (file)
@@ -112,9 +112,7 @@ ACLMaxUserIP::parse()
  * 1 : Match
  */
 int
-ACLMaxUserIP::match(AuthUserRequest * auth_user_request,
-
-                    IpAddress const &src_addr)
+ACLMaxUserIP::match(AuthUserRequest::Pointer auth_user_request, IpAddress const &src_addr)
 {
     /*
      * the logic for flush the ip list when the limit is hit vs keep
@@ -159,7 +157,7 @@ ACLMaxUserIP::match(ACLChecklist *cl)
 
     ti = match(checklist->auth_user_request, checklist->src_addr);
 
-    AUTHUSERREQUESTUNLOCK(checklist->auth_user_request, "ACLChecklist via ACLMaxUserIP");
+    checklist->auth_user_request = NULL;
 
     return ti;
 }
index 9b9bcf0239d60ad0b6fb12f4da1910560886f748..feb45428c9afb95880e351c78a5e2e3629170d63 100644 (file)
@@ -37,8 +37,7 @@
 
 #include "acl/Acl.h"
 #include "acl/Checklist.h"
-
-class AuthUserRequest;
+#include "auth/UserRequest.h"
 
 /// \ingroup ACLAPI
 class ACLMaxUserIP : public ACL
@@ -69,7 +68,7 @@ private:
     static Prototype RegistryProtoype;
     static ACLMaxUserIP RegistryEntry_;
 
-    int match(AuthUserRequest *, IpAddress const &);
+    int match(AuthUserRequest::Pointer, IpAddress const &);
     char const *class_;
     int maximum;
 
index b676957f886a1adb8dd919d91afdb9672b2003ec..0eed9c8b75ad88a1a210b2b94a8297d0202bcb27 100644 (file)
@@ -141,7 +141,7 @@ ProxyAuthLookup::checkForAsync(ACLChecklist *cl)const
     checklist->asyncInProgress(true);
     debugs(28, 3, "ACLChecklist::checkForAsync: checking password via authenticator");
 
-    AuthUserRequest *auth_user_request;
+    AuthUserRequest::Pointer auth_user_request;
     /* make sure someone created auth_user_request for us */
     assert(checklist->auth_user_request != NULL);
     auth_user_request = checklist->auth_user_request;
@@ -165,10 +165,10 @@ ProxyAuthLookup::LookupDone(void *data, char *result)
         /* credentials could not be checked either way
          * restart the whole process */
         /* OR the connection was closed, there's no way to continue */
-        AUTHUSERREQUESTUNLOCK(checklist->auth_user_request, "ProxyAuthLookup");
+        checklist->auth_user_request = NULL;
 
         if (checklist->conn() != NULL) {
-            AUTHUSERREQUESTUNLOCK(checklist->conn()->auth_user_request, "conn via ProxyAuthLookup");   // DPW discomfort
+            checklist->conn()->auth_user_request = NULL;
             checklist->conn()->auth_type = AUTH_BROKEN;
         }
     }
@@ -201,7 +201,7 @@ int
 ACLProxyAuth::matchForCache(ACLChecklist *cl)
 {
     ACLFilledChecklist *checklist = Filled(cl);
-    assert (checklist->auth_user_request);
+    assert (checklist->auth_user_request != NULL);
     return data->match(checklist->auth_user_request->username());
 }
 
@@ -215,9 +215,8 @@ ACLProxyAuth::matchProxyAuth(ACLChecklist *cl)
     ACLFilledChecklist *checklist = Filled(cl);
     checkAuthForCaching(checklist);
     /* check to see if we have matched the user-acl before */
-    int result = cacheMatchAcl(&checklist->auth_user_request->user()->
-                               proxy_match_cache, checklist);
-    AUTHUSERREQUESTUNLOCK(checklist->auth_user_request, "ACLChecklist via ACLProxyAuth");
+    int result = cacheMatchAcl(&checklist->auth_user_request->user()->proxy_match_cache, checklist);
+    checklist->auth_user_request = NULL;
     return result;
 }
 
index 0b4beb0862f3c6c31b2656224f6dc68d97e30968..c6557bba852800cba699fd33c31ccbb3041fd905 100644 (file)
@@ -42,7 +42,7 @@
  * Unauthenticated structure. The structure is given an inital lock here.
  * It may also be NULL reflecting that no user could be created.
  */
-AuthUserRequest *
+AuthUserRequest::Pointer
 AuthConfig::CreateAuthUser(const char *proxy_auth)
 {
     assert(proxy_auth != NULL);
@@ -55,14 +55,7 @@ AuthConfig::CreateAuthUser(const char *proxy_auth)
         return NULL;
     }
 
-    AuthUserRequest *result = config->decode (proxy_auth);
-
-    /*
-     * DPW 2007-05-08
-     * Do not lock the AuthUserRequest on the caller's behalf.
-     * Callers must manage their own locks.
-     */
-    return result;
+    return config->decode(proxy_auth);
 }
 
 AuthConfig *
index bdb553c57d3a4e0b8f113e83491763ffa3bd5ea8..db83cfa8c19f82b0f831aff91a1b20a09c113625 100644 (file)
@@ -32,7 +32,8 @@
 #ifndef SQUID_AUTHCONFIG_H
 #define SQUID_AUTHCONFIG_H
 
-class AuthUserRequest;
+#include "auth/UserRequest.h"
+
 class StoreEntry;
 class HttpReply;
 class HttpRequest;
@@ -56,7 +57,7 @@ class AuthConfig
 {
 
 public:
-    static AuthUserRequest *CreateAuthUser (const char *proxy_auth);
+    static AuthUserRequest::Pointer CreateAuthUser(const char *proxy_auth);
 
     static AuthConfig *Find(const char *proxy_auth);
     AuthConfig() {}
@@ -81,7 +82,7 @@ public:
      \param proxy_auth Login Pattern to parse.
      \retval *         Details needed to authenticate.
      */
-    virtual AuthUserRequest *decode(char const *proxy_auth) = 0;
+    virtual AuthUserRequest::Pointer decode(char const *proxy_auth) = 0;
 
     /**
      * squid is finished with this config, release any unneeded resources.
@@ -109,7 +110,7 @@ public:
     virtual void dump(StoreEntry *, const char *, AuthConfig *) = 0;
 
     /** add headers as needed when challenging for auth */
-    virtual void fixHeader(AuthUserRequest *, HttpReply *, http_hdr_type, HttpRequest *) = 0;
+    virtual void fixHeader(AuthUserRequest::Pointer, HttpReply *, http_hdr_type, HttpRequest *) = 0;
     /** prepare to handle requests */
     virtual void init(AuthConfig *) = 0;
     /** expose any/all statistics to a CacheManager */
index 9912440df3afc411e8797b45c517f9e447299878..1abd1280808b909f5692ebd848f5252f83c77281 100644 (file)
@@ -10,6 +10,7 @@ EXTRA_LTLIBRARIES = libbasic.la libdigest.la libntlm.la libnegotiate.la
 libauth_la_SOURCES = \
        Config.cc \
        Config.h \
+       enums.h \
        Scheme.cc \
        Scheme.h \
        User.h \
index 71094e1c0653ab20992a29561cdb52f0d2f573f5..5c242c72e44e4a51ce3db8940822fb0133c38c2e 100644 (file)
@@ -68,9 +68,8 @@ AuthUser::AuthUser (AuthConfig *aConfig) :
  * related scheme data itself.
  */
 void
-AuthUser::absorb (AuthUser *from)
+AuthUser::absorb(AuthUser *from)
 {
-    AuthUserRequest *auth_user_request;
     /*
      * XXX combine two authuser structs. Incomplete: it should merge
      * in hash references too and ask the module to merge in scheme
@@ -80,12 +79,13 @@ AuthUser::absorb (AuthUser *from)
     dlink_node *link = from->requests.head;
 
     while (link) {
-        auth_user_request = static_cast<AuthUserRequest *>(link->data);
+        AuthUserRequest::Pointer *auth_user_request = static_cast<AuthUserRequest::Pointer*>(link->data);
         dlink_node *tmplink = link;
         link = link->next;
         dlinkDelete(tmplink, &from->requests);
         dlinkAddTail(auth_user_request, tmplink, &requests);
-        auth_user_request->user(this);
+        AuthUserRequest::Pointer aur = *(auth_user_request);
+        aur->user(this);
     }
 
     references += from->references;
@@ -95,7 +95,6 @@ AuthUser::absorb (AuthUser *from)
 
 AuthUser::~AuthUser()
 {
-    AuthUserRequest *auth_user_request;
     dlink_node *link, *tmplink;
     debugs(29, 5, "AuthUser::~AuthUser: Freeing auth_user '" << this << "' with refcount '" << references << "'.");
     assert(references == 0);
@@ -116,7 +115,7 @@ AuthUser::~AuthUser()
 
     while (link) {
         debugs(29, 5, "AuthUser::~AuthUser: removing request entry '" << link->data << "'");
-        auth_user_request = static_cast<AuthUserRequest *>(link->data);
+        AuthUserRequest::Pointer *auth_user_request = static_cast<AuthUserRequest::Pointer*>(link->data);
         tmplink = link;
         link = link->next;
         dlinkDelete(tmplink, &requests);
index 38ce96511f8966960785bb752671a87aa0903d26..511a8af746d4de4d8d8f02d1055da32a8b10d22d 100644 (file)
@@ -58,12 +58,14 @@ AuthUser::username(char const*aString)
 }
 
 void
-AuthUser::addRequest(AuthUserRequest *request)
+AuthUser::addRequest(AuthUserRequest::Pointer request)
 {
     /* lock for the request link */
-
+    /* AYJ: 2009-12-12: WTF? locking the AuthUser because it has a reference to a request? */
+    /*    seems to me like this once-upon-a-time may have been intended to lock the AuthUserRequest */
     lock();
+
     dlink_node *node = dlinkNodeNew();
 
-    dlinkAdd(request, node, &requests);
+    dlinkAdd(&request, node, &requests);
 }
index 47a99337e93b54e3b0655b04fcf4b0cc53adb74f..3bccee2b60874764803fd34ae05507ed5e7c9216 100644 (file)
@@ -34,7 +34,8 @@
 #ifndef SQUID_AUTHUSER_H
 #define SQUID_AUTHUSER_H
 
-class AuthUserRequest;
+#include "auth/UserRequest.h"
+
 class AuthConfig;
 class AuthUserHashPointer;
 
@@ -87,7 +88,7 @@ public:
     void clearIp();
     void removeIp(IpAddress);
     void addIp(IpAddress);
-    _SQUID_INLINE_ void addRequest(AuthUserRequest *);
+    _SQUID_INLINE_ void addRequest(AuthUserRequest::Pointer);
 
     void lock();
     void unlock();
index 285e19c70677b6be02800319b4a806f43a3a40fe..417f3812631b493cf82b92ac814aeb0486d4bd6b 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * $Id$
  *
 
 /* Generic Functions */
 
-size_t
-AuthUserRequest::refCount () const
-{
-    return references;
-}
-
 char const *
 AuthUserRequest::username() const
 {
@@ -69,12 +62,6 @@ AuthUserRequest::username() const
         return NULL;
 }
 
-size_t
-authenticateRequestRefCount (AuthUserRequest *aRequest)
-{
-    return aRequest->refCount();
-}
-
 /**** PUBLIC FUNCTIONS (ALL GENERIC!)  ****/
 
 /* send the initial data to an authenticator module */
@@ -92,11 +79,11 @@ AuthUserRequest::start(RH * handler, void *data)
  */
 
 int
-authenticateValidateUser(AuthUserRequest * auth_user_request)
+authenticateValidateUser(AuthUserRequest::Pointer auth_user_request)
 {
     debugs(29, 9, "authenticateValidateUser: Validating Auth_user request '" << auth_user_request << "'.");
 
-    if (auth_user_request == NULL) {
+    if (auth_user_request.getRaw() == NULL) {
         debugs(29, 4, "authenticateValidateUser: Auth_user_request was NULL!");
         return 0;
     }
@@ -141,18 +128,15 @@ AuthUserRequest::operator delete (void *address)
 }
 
 AuthUserRequest::AuthUserRequest():_auth_user(NULL), message(NULL),
-        references (0), lastReply (AUTH_ACL_CANNOT_AUTHENTICATE)
+        lastReply (AUTH_ACL_CANNOT_AUTHENTICATE)
 {
-    debugs(29, 5, "AuthUserRequest::AuthUserRequest: initialised request " <<
-           this);
+    debugs(29, 5, "AuthUserRequest::AuthUserRequest: initialised request " << this);
 }
 
 AuthUserRequest::~AuthUserRequest()
 {
     dlink_node *link;
-    debugs(29, 5, "AuthUserRequest::~AuthUserRequest: freeing request " <<
-           this);
-    assert(references == 0);
+    debugs(29, 5, "AuthUserRequest::~AuthUserRequest: freeing request " << this);
 
     if (user()) {
         /* unlink from the auth_user struct */
@@ -200,7 +184,7 @@ AuthUserRequest::denyMessage(char const * const default_message)
 }
 
 static void
-authenticateAuthUserRequestSetIp(AuthUserRequest * auth_user_request, IpAddress &ipaddr)
+authenticateAuthUserRequestSetIp(AuthUserRequest::Pointer auth_user_request, IpAddress &ipaddr)
 {
     AuthUser *auth_user = auth_user_request->user();
 
@@ -211,7 +195,7 @@ authenticateAuthUserRequestSetIp(AuthUserRequest * auth_user_request, IpAddress
 }
 
 void
-authenticateAuthUserRequestRemoveIp(AuthUserRequest * auth_user_request, IpAddress const &ipaddr)
+authenticateAuthUserRequestRemoveIp(AuthUserRequest::Pointer auth_user_request, IpAddress const &ipaddr)
 {
     AuthUser *auth_user = auth_user_request->user();
 
@@ -222,16 +206,16 @@ authenticateAuthUserRequestRemoveIp(AuthUserRequest * auth_user_request, IpAddre
 }
 
 void
-authenticateAuthUserRequestClearIp(AuthUserRequest * auth_user_request)
+authenticateAuthUserRequestClearIp(AuthUserRequest::Pointer auth_user_request)
 {
-    if (auth_user_request)
+    if (auth_user_request != NULL)
         auth_user_request->user()->clearIp();
 }
 
 int
-authenticateAuthUserRequestIPCount(AuthUserRequest * auth_user_request)
+authenticateAuthUserRequestIPCount(AuthUserRequest::Pointer auth_user_request)
 {
-    assert(auth_user_request);
+    assert(auth_user_request != NULL);
     assert(auth_user_request->user());
     return auth_user_request->user()->ipcount;
 }
@@ -241,7 +225,7 @@ authenticateAuthUserRequestIPCount(AuthUserRequest * auth_user_request)
  * authenticateUserAuthenticated: is this auth_user structure logged in ?
  */
 int
-authenticateUserAuthenticated(AuthUserRequest * auth_user_request)
+authenticateUserAuthenticated(AuthUserRequest::Pointer auth_user_request)
 {
     if (!authenticateValidateUser(auth_user_request))
         return 0;
@@ -286,19 +270,19 @@ AuthUserRequest::connLastHeader()
  * This is basically a handle approach.
  */
 static void
-authenticateAuthenticateUser(AuthUserRequest * auth_user_request, HttpRequest * request, ConnStateData * conn, http_hdr_type type)
+authenticateAuthenticateUser(AuthUserRequest::Pointer auth_user_request, HttpRequest * request, ConnStateData * conn, http_hdr_type type)
 {
-    assert(auth_user_request != NULL);
+    assert(auth_user_request.getRaw() != NULL);
 
     auth_user_request->authenticate(request, conn, type);
 }
 
-static AuthUserRequest *
-authTryGetUser (AuthUserRequest **auth_user_request, ConnStateData * conn, HttpRequest * request)
+static AuthUserRequest::Pointer
+authTryGetUser(AuthUserRequest::Pointer auth_user_request, ConnStateData * conn, HttpRequest * request)
 {
-    if (*auth_user_request)
-        return *auth_user_request;
-    else if (request != NULL && request->auth_user_request)
+    if (auth_user_request != NULL)
+        return auth_user_request;
+    else if (request != NULL && request->auth_user_request != NULL)
         return request->auth_user_request;
     else if (conn != NULL)
         return conn->auth_user_request;
@@ -328,7 +312,7 @@ authTryGetUser (AuthUserRequest **auth_user_request, ConnStateData * conn, HttpR
  * Caller is responsible for locking and unlocking their *auth_user_request!
  */
 auth_acl_t
-AuthUserRequest::authenticate(AuthUserRequest ** auth_user_request, http_hdr_type headertype, HttpRequest * request, ConnStateData * conn, IpAddress &src_addr)
+AuthUserRequest::authenticate(AuthUserRequest::Pointer * auth_user_request, http_hdr_type headertype, HttpRequest * request, ConnStateData * conn, IpAddress &src_addr)
 {
     const char *proxy_auth;
     assert(headertype != 0);
@@ -342,7 +326,7 @@ AuthUserRequest::authenticate(AuthUserRequest ** auth_user_request, http_hdr_typ
      * connection when we recieve no authentication header.
      */
 
-    if (((proxy_auth == NULL) && (!authenticateUserAuthenticated(authTryGetUser(auth_user_request,conn,request))))
+    if (((proxy_auth == NULL) && (!authenticateUserAuthenticated(authTryGetUser(*auth_user_request,conn,request))))
             || (conn != NULL  && conn->auth_type == AUTH_BROKEN)) {
         /* no header or authentication failed/got corrupted - restart */
         debugs(29, 4, "authenticateAuthenticate: broken auth or no proxy_auth header. Requesting auth header.");
@@ -350,7 +334,7 @@ AuthUserRequest::authenticate(AuthUserRequest ** auth_user_request, http_hdr_typ
 
         if (conn != NULL) {
             conn->auth_type = AUTH_UNKNOWN;
-            AUTHUSERREQUESTUNLOCK(conn->auth_user_request, "conn");
+            conn->auth_user_request = NULL;
         }
 
         *auth_user_request = NULL;
@@ -362,7 +346,7 @@ AuthUserRequest::authenticate(AuthUserRequest ** auth_user_request, http_hdr_typ
      * No check for function required in the if: its compulsory for conn based
      * auth modules
      */
-    if (proxy_auth && conn != NULL && conn->auth_user_request &&
+    if (proxy_auth && conn != NULL && conn->auth_user_request != NULL &&
             authenticateUserAuthenticated(conn->auth_user_request) &&
             conn->auth_user_request->connLastHeader() != NULL &&
             strcmp(proxy_auth, conn->auth_user_request->connLastHeader())) {
@@ -379,7 +363,7 @@ AuthUserRequest::authenticate(AuthUserRequest ** auth_user_request, http_hdr_typ
          * authenticateAuthenticate
          */
         assert(*auth_user_request == NULL);
-        AUTHUSERREQUESTUNLOCK(conn->auth_user_request, "conn");
+        conn->auth_user_request = NULL;
         /* Set the connection auth type */
         conn->auth_type = AUTH_UNKNOWN;
     }
@@ -391,7 +375,7 @@ AuthUserRequest::authenticate(AuthUserRequest ** auth_user_request, http_hdr_typ
     if (*auth_user_request == NULL) {
         debugs(29, 9, "authenticateAuthenticate: This is a new checklist test on FD:" << (conn != NULL ? conn->fd : -1)  );
 
-        if (proxy_auth && !request->auth_user_request && conn != NULL && conn->auth_user_request) {
+        if (proxy_auth && request->auth_user_request == NULL && conn != NULL && conn->auth_user_request != NULL) {
             AuthConfig * scheme = AuthConfig::Find(proxy_auth);
 
             if (!conn->auth_user_request->user() || conn->auth_user_request->user()->config != scheme) {
@@ -400,7 +384,7 @@ AuthUserRequest::authenticate(AuthUserRequest ** auth_user_request, http_hdr_typ
                        "' to '" << proxy_auth << "' (client " <<
                        src_addr << ")");
 
-                AUTHUSERREQUESTUNLOCK(conn->auth_user_request, "conn");
+                conn->auth_user_request = NULL;
                 conn->auth_type = AUTH_UNKNOWN;
             }
         }
@@ -420,7 +404,6 @@ AuthUserRequest::authenticate(AuthUserRequest ** auth_user_request, http_hdr_typ
 
                 if ((*auth_user_request)->username()) {
                     request->auth_user_request = *auth_user_request;
-                    AUTHUSERREQUESTLOCK(request->auth_user_request, "request");
                 }
 
                 *auth_user_request = NULL;
@@ -428,11 +411,11 @@ AuthUserRequest::authenticate(AuthUserRequest ** auth_user_request, http_hdr_typ
             }
 
             /* the user_request comes prelocked for the caller to createAuthUser (us) */
-        } else if (request->auth_user_request) {
+        } else if (request->auth_user_request != NULL) {
             *auth_user_request = request->auth_user_request;
         } else {
             assert (conn != NULL);
-            if (conn->auth_user_request) {
+            if (conn->auth_user_request != NULL) {
                 *auth_user_request = conn->auth_user_request;
             } else {
                 /* failed connection based authentication */
@@ -449,16 +432,14 @@ AuthUserRequest::authenticate(AuthUserRequest ** auth_user_request, http_hdr_typ
 
     if (!authenticateUserAuthenticated(*auth_user_request)) {
         /* User not logged in. Log them in */
-        authenticateAuthenticateUser(*auth_user_request, request,
-                                     conn, headertype);
+        authenticateAuthenticateUser(*auth_user_request, request, conn, headertype);
 
         switch (authenticateDirection(*auth_user_request)) {
 
         case 1:
 
-            if (NULL == request->auth_user_request) {
+            if (request->auth_user_request == NULL) {
                 request->auth_user_request = *auth_user_request;
-                AUTHUSERREQUESTLOCK(request->auth_user_request, "request");
             }
 
             /* fallthrough to -2 */
@@ -481,7 +462,6 @@ AuthUserRequest::authenticate(AuthUserRequest ** auth_user_request, http_hdr_typ
             if ((*auth_user_request)->username()) {
                 if (!request->auth_user_request) {
                     request->auth_user_request = *auth_user_request;
-                    AUTHUSERREQUESTLOCK(request->auth_user_request, "request");
                 }
             }
 
@@ -492,9 +472,8 @@ AuthUserRequest::authenticate(AuthUserRequest ** auth_user_request, http_hdr_typ
 
     /* copy username to request for logging on client-side */
     /* the credentials are correct at this point */
-    if (NULL == request->auth_user_request) {
+    if (request->auth_user_request == NULL) {
         request->auth_user_request = *auth_user_request;
-        AUTHUSERREQUESTLOCK(request->auth_user_request, "request");
         authenticateAuthUserRequestSetIp(*auth_user_request, src_addr);
     }
 
@@ -502,20 +481,17 @@ AuthUserRequest::authenticate(AuthUserRequest ** auth_user_request, http_hdr_typ
 }
 
 auth_acl_t
-
-AuthUserRequest::tryToAuthenticateAndSetAuthUser(AuthUserRequest ** auth_user_request, http_hdr_type headertype, HttpRequest * request, ConnStateData * conn, IpAddress &src_addr)
+AuthUserRequest::tryToAuthenticateAndSetAuthUser(AuthUserRequest::Pointer * auth_user_request, http_hdr_type headertype, HttpRequest * request, ConnStateData * conn, IpAddress &src_addr)
 {
     /* If we have already been called, return the cached value */
-    AuthUserRequest *t = authTryGetUser (auth_user_request, conn, request);
+    AuthUserRequest::Pointer t = authTryGetUser(*auth_user_request, conn, request);
 
-    if (t && t->lastReply != AUTH_ACL_CANNOT_AUTHENTICATE
-            && t->lastReply != AUTH_ACL_HELPER) {
-        if (!*auth_user_request)
+    if (t != NULL && t->lastReply != AUTH_ACL_CANNOT_AUTHENTICATE && t->lastReply != AUTH_ACL_HELPER) {
+        if (*auth_user_request == NULL)
             *auth_user_request = t;
 
-        if (!request->auth_user_request && t->lastReply == AUTH_AUTHENTICATED) {
+        if (request->auth_user_request == NULL && t->lastReply == AUTH_AUTHENTICATED) {
             request->auth_user_request = t;
-            AUTHUSERREQUESTLOCK(request->auth_user_request, "request");
         }
         return t->lastReply;
     }
@@ -523,10 +499,9 @@ AuthUserRequest::tryToAuthenticateAndSetAuthUser(AuthUserRequest ** auth_user_re
     /* ok, call the actual authenticator routine. */
     auth_acl_t result = authenticate(auth_user_request, headertype, request, conn, src_addr);
 
-    t = authTryGetUser (auth_user_request, conn, request);
+    t = authTryGetUser(*auth_user_request, conn, request);
 
-    if (t && result != AUTH_ACL_CANNOT_AUTHENTICATE &&
-            result != AUTH_ACL_HELPER)
+    if (t != NULL && result != AUTH_ACL_CANNOT_AUTHENTICATE && result != AUTH_ACL_HELPER)
         t->lastReply = result;
 
     return result;
@@ -539,16 +514,16 @@ AuthUserRequest::tryToAuthenticateAndSetAuthUser(AuthUserRequest ** auth_user_re
  * -2: authenticate broken in some fashion
  */
 int
-authenticateDirection(AuthUserRequest * auth_user_request)
+authenticateDirection(AuthUserRequest::Pointer auth_user_request)
 {
-    if (!auth_user_request)
+    if (auth_user_request == NULL)
         return -2;
 
     return auth_user_request->direction();
 }
 
 void
-AuthUserRequest::addReplyAuthHeader(HttpReply * rep, AuthUserRequest * auth_user_request, HttpRequest * request, int accelerated, int internal)
+AuthUserRequest::addReplyAuthHeader(HttpReply * rep, AuthUserRequest::Pointer auth_user_request, HttpRequest * request, int accelerated, int internal)
 /* send the auth types we are configured to support (and have compiled in!) */
 {
     http_hdr_type type;
@@ -609,7 +584,7 @@ AuthUserRequest::addReplyAuthHeader(HttpReply * rep, AuthUserRequest * auth_user
 }
 
 void
-authenticateFixHeader(HttpReply * rep, AuthUserRequest * auth_user_request, HttpRequest * request, int accelerated, int internal)
+authenticateFixHeader(HttpReply * rep, AuthUserRequest::Pointer auth_user_request, HttpRequest * request, int accelerated, int internal)
 {
     AuthUserRequest::addReplyAuthHeader(rep, auth_user_request, request, accelerated, internal);
 }
@@ -617,40 +592,12 @@ authenticateFixHeader(HttpReply * rep, AuthUserRequest * auth_user_request, Http
 
 /* call the active auth module and allow it to add a trailer to the request */
 void
-authenticateAddTrailer(HttpReply * rep, AuthUserRequest * auth_user_request, HttpRequest * request, int accelerated)
+authenticateAddTrailer(HttpReply * rep, AuthUserRequest::Pointer auth_user_request, HttpRequest * request, int accelerated)
 {
     if (auth_user_request != NULL)
         auth_user_request->addTrailer(rep, accelerated);
 }
 
-void
-
-AuthUserRequest::_lock()
-{
-    assert(this);
-    debugs(29, 9, "AuthUserRequest::lock: auth_user request '" << this << " " << references << "->" << references+1);
-    ++references;
-}
-
-void
-AuthUserRequest::_unlock()
-{
-    assert(this != NULL);
-
-    if (references > 0) {
-        debugs(29, 9, "AuthUserRequest::unlock: auth_user request '" << this << " " << references << "->" << references-1);
-        --references;
-    } else {
-        debugs(29, 1, "Attempt to lower Auth User request " << this << " refcount below 0!");
-    }
-
-    if (references == 0) {
-        debugs(29, 9, "AuthUserRequest::unlock: deleting auth_user_request '" << this << "'.");
-        /* not locked anymore */
-        delete this;
-    }
-}
-
 AuthScheme *
 AuthUserRequest::scheme() const
 {
index 611917629fa148c4b68c3d8640fc510887960b6b..75cd7bfa1a1a53884e4bb3b1c4502e2d932ed329 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * $Id$
  *
 #ifndef SQUID_AUTHUSERREQUEST_H
 #define SQUID_AUTHUSERREQUEST_H
 
-#include "client_side.h"
+#include "auth/enums.h"
+#include "dlink.h"
+#include "ip/IpAddress.h"
+#include "RefCount.h"
+#include "typedefs.h"
+#include "HttpHeader.h"
 
+class AuthScheme;
 class AuthUser;
-
 class ConnStateData;
-
-class AuthScheme;
+class HttpReply;
+class HttpRequest;
 
 struct AuthUserIP {
     dlink_node node;
@@ -56,8 +60,10 @@ struct AuthUserIP {
  \ingroup AuthAPI
  * This is a short lived structure is the visible aspect of the authentication framework.
  */
-class AuthUserRequest
+class AuthUserRequest : public RefCountable
 {
+public:
+    typedef RefCount<AuthUserRequest> Pointer;
 
 public:
     /**
@@ -108,8 +114,8 @@ public:
 
     virtual void user(AuthUser *aUser) {_auth_user=aUser;}
 
-    static auth_acl_t tryToAuthenticateAndSetAuthUser(AuthUserRequest **, http_hdr_type, HttpRequest *, ConnStateData *, IpAddress &);
-    static void addReplyAuthHeader(HttpReply * rep, AuthUserRequest * auth_user_request, HttpRequest * request, int accelerated, int internal);
+    static auth_acl_t tryToAuthenticateAndSetAuthUser(AuthUserRequest::Pointer *, http_hdr_type, HttpRequest *, ConnStateData *, IpAddress &);
+    static void addReplyAuthHeader(HttpReply * rep, AuthUserRequest::Pointer auth_user_request, HttpRequest * request, int accelerated, int internal);
 
     AuthUserRequest();
 
@@ -126,10 +132,6 @@ public:
     /** Possibly overrideable in future */
     char const * getDenyMessage();
 
-    size_t refCount() const;
-    void _lock();            /**< \note please use AUTHUSERREQUESTLOCK()   */
-    void _unlock();          /**< \note please use AUTHUSERREQUESTUNLOCK() */
-
     /**
      * Squid does not make assumptions about where the username is stored.
      * This function must return a pointer to a NULL terminated string to be used in logging the request.
@@ -146,14 +148,11 @@ public:
 
 private:
 
-    static auth_acl_t authenticate(AuthUserRequest ** auth_user_request, http_hdr_type headertype, HttpRequest * request, ConnStateData * conn, IpAddress &src_addr);
+    static auth_acl_t authenticate(AuthUserRequest::Pointer * auth_user_request, http_hdr_type headertype, HttpRequest * request, ConnStateData * conn, IpAddress &src_addr);
 
     /** return a message on the 407 error pages */
     char *message;
 
-    /** how many 'processes' are working on this data */
-    size_t references;
-
     /**
      * We only attempt authentication once per http request. This
      * is to allow multiple auth acl references from different _access areas
@@ -164,40 +163,26 @@ private:
 
 /* AuthUserRequest */
 
-/**
- \ingroup AuthAPI
- \deprecated Use AuthUserRequest::refCount() instead.
- */
-extern size_t authenticateRequestRefCount (AuthUserRequest *);
-
 /// \ingroup AuthAPI
-extern void authenticateFixHeader(HttpReply *, AuthUserRequest *, HttpRequest *, int, int);
+extern void authenticateFixHeader(HttpReply *, AuthUserRequest::Pointer, HttpRequest *, int, int);
 /// \ingroup AuthAPI
-extern void authenticateAddTrailer(HttpReply *, AuthUserRequest *, HttpRequest *, int);
+extern void authenticateAddTrailer(HttpReply *, AuthUserRequest::Pointer, HttpRequest *, int);
 
 /// \ingroup AuthAPI
-extern void authenticateAuthUserRequestRemoveIp(AuthUserRequest *, IpAddress const &);
+extern void authenticateAuthUserRequestRemoveIp(AuthUserRequest::Pointer, IpAddress const &);
 /// \ingroup AuthAPI
-extern void authenticateAuthUserRequestClearIp(AuthUserRequest *);
+extern void authenticateAuthUserRequestClearIp(AuthUserRequest::Pointer);
 /// \ingroup AuthAPI
-extern int authenticateAuthUserRequestIPCount(AuthUserRequest *);
+extern int authenticateAuthUserRequestIPCount(AuthUserRequest::Pointer);
 /// \ingroup AuthAPI
 /// \deprecated Use AuthUserRequest::direction() instead.
-extern int authenticateDirection(AuthUserRequest *);
+extern int authenticateDirection(AuthUserRequest::Pointer);
 
 /// \ingroup AuthAPI
 /// See AuthUserRequest::authenticated()
-extern int authenticateUserAuthenticated(AuthUserRequest *);
+extern int authenticateUserAuthenticated(AuthUserRequest::Pointer);
 /// \ingroup AuthAPI
-extern int authenticateValidateUser(AuthUserRequest *);
-
-/// \todo Drop dead code? or make a debugging option.
-#if 0
-#define AUTHUSERREQUESTUNLOCK(a,b) if(a){(a)->_unlock();debugs(0,0,HERE << "auth_user_request " << a << " was unlocked for " << b); (a)=NULL;}
-#define AUTHUSERREQUESTLOCK(a,b) { (a)->_lock(); debugs(0,0,HERE << "auth_user_request " << a << " was locked for " << b); }
-#endif
-#define AUTHUSERREQUESTUNLOCK(a,b) if(a){(a)->_unlock();(a)=NULL;}
-#define AUTHUSERREQUESTLOCK(a,b) (a)->_lock()
+extern int authenticateValidateUser(AuthUserRequest::Pointer);
 
 
 #endif /* SQUID_AUTHUSERREQUEST_H */
index bc67847427cb48f481a57f0b9e58d53be34e5382..3e30f6345d927f3f478c7cd9985e43b5958ce8d9 100644 (file)
@@ -211,7 +211,7 @@ AuthBasicUserRequest::module_direction()
 }
 
 void
-AuthBasicConfig::fixHeader(AuthUserRequest *auth_user_request, HttpReply *rep, http_hdr_type hdrType, HttpRequest * request)
+AuthBasicConfig::fixHeader(AuthUserRequest::Pointer auth_user_request, HttpReply *rep, http_hdr_type hdrType, HttpRequest * request)
 {
     if (authenticate) {
         debugs(29, 9, HERE << "Sending type:" << hdrType << " header: 'Basic realm=\"" << basicAuthRealm << "\"'");
@@ -462,11 +462,11 @@ BasicUser::extractPassword()
 }
 
 void
-BasicUser::decode(char const *proxy_auth, AuthUserRequest *auth_user_request)
+BasicUser::decode(char const *proxy_auth, AuthUserRequest::Pointer auth_user_request)
 {
     currentRequest = auth_user_request;
     httpAuthHeader = proxy_auth;
-    if (decodeCleartext ()) {
+    if (decodeCleartext()) {
         extractUsername();
         extractPassword();
     }
@@ -485,7 +485,7 @@ BasicUser::valid() const
 }
 
 void
-BasicUser::makeLoggingInstance(AuthBasicUserRequest *auth_user_request)
+BasicUser::makeLoggingInstance(AuthUserRequest::Pointer auth_user_request)
 {
     if (username()) {
         /* log the username */
@@ -552,10 +552,10 @@ BasicUser::updateCached(BasicUser *from)
  * "cannot decode credentials". Use the message field to return a
  * descriptive message to the user.
  */
-AuthUserRequest *
+AuthUserRequest::Pointer
 AuthBasicConfig::decode(char const *proxy_auth)
 {
-    AuthBasicUserRequest *auth_user_request = new AuthBasicUserRequest();
+    AuthUserRequest::Pointer auth_user_request = new AuthBasicUserRequest();
     /* decode the username */
     /* trim BASIC from string */
 
@@ -633,7 +633,7 @@ AuthBasicConfig::registerWithCacheManager(void)
 }
 
 void
-BasicUser::queueRequest(AuthUserRequest * auth_user_request, RH * handler, void *data)
+BasicUser::queueRequest(AuthUserRequest::Pointer auth_user_request, RH * handler, void *data)
 {
     BasicAuthQueueNode *node;
     node = static_cast<BasicAuthQueueNode *>(xmalloc(sizeof(BasicAuthQueueNode)));
@@ -672,7 +672,7 @@ AuthBasicUserRequest::module_start(RH * handler, void *data)
 }
 
 void
-BasicUser::submitRequest(AuthUserRequest * auth_user_request, RH * handler, void *data)
+BasicUser::submitRequest(AuthUserRequest::Pointer auth_user_request, RH * handler, void *data)
 {
     /* mark the user as haveing verification in progress */
     flags.credentials_ok = 2;
index 26001b57a66d95f5c124497e05966a6c1bcc6c3f..4f4df1f9bd6e1c08cf2cacae647183ae4611a804 100644 (file)
@@ -20,7 +20,7 @@ class AuthenticateStateData
 
 public:
     void *data;
-    AuthUserRequest *auth_user_request;
+    AuthUserRequest::Pointer auth_user_request;
     RH *handler;
 };
 
@@ -31,13 +31,11 @@ class BasicAuthQueueNode
 
 public:
     BasicAuthQueueNode *next;
-    AuthUserRequest *auth_user_request;
+    AuthUserRequest::Pointer auth_user_request;
     RH *handler;
     void *data;
 };
 
-class AuthBasicUserRequest;
-
 class BasicUser : public AuthUser
 {
 
@@ -48,13 +46,13 @@ public:
     BasicUser(AuthConfig *);
     ~BasicUser();
     bool authenticated() const;
-    void queueRequest(AuthUserRequest * auth_user_request, RH * handler, void *data);
-    void submitRequest (AuthUserRequest * auth_user_request, RH * handler, void *data);
-    void decode(char const *credentials, AuthUserRequest *);
+    void queueRequest(AuthUserRequest::Pointer auth_user_request, RH * handler, void *data);
+    void submitRequest(AuthUserRequest::Pointer auth_user_request, RH * handler, void *data);
+    void decode(char const *credentials, AuthUserRequest::Pointer);
     char *getCleartext() {return cleartext;}
 
     bool valid() const;
-    void makeLoggingInstance(AuthBasicUserRequest *auth_user_request);
+    void makeLoggingInstance(AuthUserRequest::Pointer auth_user_request);
     AuthUser * makeCachedFrom();
     void updateCached(BasicUser *from);
     char *passwd;
@@ -72,7 +70,7 @@ private:
     void extractUsername();
     void extractPassword();
     char *cleartext;
-    AuthUserRequest *currentRequest;
+    AuthUserRequest::Pointer currentRequest;
     char const *httpAuthHeader;
 };
 
@@ -117,10 +115,10 @@ public:
     ~AuthBasicConfig();
     virtual bool active() const;
     virtual bool configured() const;
-    virtual AuthUserRequest *decode(char const *proxy_auth);
+    virtual AuthUserRequest::Pointer decode(char const *proxy_auth);
     virtual void done();
     virtual void dump(StoreEntry *, const char *, AuthConfig *);
-    virtual void fixHeader(AuthUserRequest *, HttpReply *, http_hdr_type, HttpRequest *);
+    virtual void fixHeader(AuthUserRequest::Pointer, HttpReply *, http_hdr_type, HttpRequest *);
     virtual void init(AuthConfig *);
     virtual void parse(AuthConfig *, int, char *);
     virtual void registerWithCacheManager(void);
index bf0add93133a7740d6eb3abb5764d32dd59fcf0d..daf9a008faf086b9d1ae9329cb6c02020fe5b993 100644 (file)
@@ -773,16 +773,16 @@ AuthDigestUserRequest::addTrailer(HttpReply * rep, int accel)
 
 /* add the [www-|Proxy-]authenticate header on a 407 or 401 reply */
 void
-AuthDigestConfig::fixHeader(AuthUserRequest *auth_user_request, HttpReply *rep, http_hdr_type hdrType, HttpRequest * request)
+AuthDigestConfig::fixHeader(AuthUserRequest::Pointer auth_user_request, HttpReply *rep, http_hdr_type hdrType, HttpRequest * request)
 {
     if (!authenticate)
         return;
 
     int stale = 0;
 
-    if (auth_user_request) {
+    if (auth_user_request != NULL) {
         AuthDigestUserRequest *digest_request;
-        digest_request = dynamic_cast < AuthDigestUserRequest * >(auth_user_request);
+        digest_request = dynamic_cast<AuthDigestUserRequest*>(auth_user_request.getRaw());
         assert (digest_request != NULL);
 
         stale = !digest_request->flags.invalid_password;
@@ -820,9 +820,6 @@ static void
 authenticateDigestHandleReply(void *data, char *reply)
 {
     DigestAuthenticateStateData *replyData = static_cast < DigestAuthenticateStateData * >(data);
-    AuthUserRequest *auth_user_request;
-    AuthDigestUserRequest *digest_request;
-    digest_user_h *digest_user;
     char *t = NULL;
     void *cbdata;
     debugs(29, 9, "authenticateDigestHandleReply: {" << (reply ? reply : "<NULL>") << "}");
@@ -836,11 +833,13 @@ authenticateDigestHandleReply(void *data, char *reply)
     }
 
     assert(replyData->auth_user_request != NULL);
-    auth_user_request = replyData->auth_user_request;
-    digest_request = dynamic_cast < AuthDigestUserRequest * >(auth_user_request);
+    AuthUserRequest::Pointer auth_user_request = replyData->auth_user_request;
+
+    /* AYJ: 2009-12-12: allow this because the digest_request pointer is purely local */
+    AuthDigestUserRequest *digest_request = dynamic_cast < AuthDigestUserRequest * >(auth_user_request.getRaw());
     assert(digest_request);
 
-    digest_user = dynamic_cast < digest_user_h * >(auth_user_request->user());
+    digest_user_h *digest_user = dynamic_cast < digest_user_h * >(auth_user_request->user());
     assert(digest_user != NULL);
 
     if (reply && (strncasecmp(reply, "ERR", 3) == 0)) {
@@ -857,8 +856,7 @@ authenticateDigestHandleReply(void *data, char *reply)
     if (cbdataReferenceValidDone(replyData->data, &cbdata))
         replyData->handler(cbdata, NULL);
 
-    //we know replyData->auth_user_request != NULL, or we'd have asserted
-    AUTHUSERREQUESTUNLOCK(replyData->auth_user_request, "replyData");
+    replyData->auth_user_request = NULL;
 
     cbdataFree(replyData);
 }
@@ -1045,8 +1043,8 @@ authDigestUserLinkNonce(DigestUser * user, digest_nonce_h * nonce)
 }
 
 /* setup the necessary info to log the username */
-static AuthUserRequest *
-authDigestLogUsername(char *username, AuthDigestUserRequest *auth_user_request)
+static AuthUserRequest::Pointer
+authDigestLogUsername(char *username, AuthUserRequest::Pointer auth_user_request)
 {
     assert(auth_user_request != NULL);
 
@@ -1058,9 +1056,9 @@ authDigestLogUsername(char *username, AuthDigestUserRequest *auth_user_request)
     /* set the auth_user type */
     digest_user->auth_type = AUTH_BROKEN;
     /* link the request to the user */
-    auth_user_request->authUser(digest_user);
     auth_user_request->user(digest_user);
-    digest_user->addRequest (auth_user_request);
+    digest_user->lock();
+    digest_user->addRequest(auth_user_request);
     return auth_user_request;
 }
 
@@ -1068,7 +1066,7 @@ authDigestLogUsername(char *username, AuthDigestUserRequest *auth_user_request)
  * Decode a Digest [Proxy-]Auth string, placing the results in the passed
  * Auth_user structure.
  */
-AuthUserRequest *
+AuthUserRequest::Pointer
 AuthDigestConfig::decode(char const *proxy_auth)
 {
     const char *item;
@@ -1360,7 +1358,7 @@ AuthDigestUserRequest::module_start(RH * handler, void *data)
     char buf[8192];
     digest_user_h *digest_user;
     assert(user()->auth_type == AUTH_DIGEST);
-    digest_user = dynamic_cast < digest_user_h * >(user());
+    digest_user = dynamic_cast<digest_user_h*>(user());
     assert(digest_user != NULL);
     debugs(29, 9, "authenticateStart: '\"" << digest_user->username() << "\":\"" << realm << "\"'");
 
@@ -1372,8 +1370,7 @@ AuthDigestUserRequest::module_start(RH * handler, void *data)
     r = cbdataAlloc(DigestAuthenticateStateData);
     r->handler = handler;
     r->data = cbdataReference(data);
-    r->auth_user_request = this;
-    AUTHUSERREQUESTLOCK(r->auth_user_request, "r");
+    r->auth_user_request = static_cast<AuthUserRequest*>(this);
     if (digestConfig.utf8) {
         char userstr[1024];
         latin1_to_utf8(userstr, sizeof(userstr), digest_user->username());
index 02c69773c0b652f75e75ff2a53b1585b91f2b15e..3bf9db8707a51a427d4b582d00998d3a9ef4c21d 100644 (file)
@@ -19,7 +19,7 @@ class DigestAuthenticateStateData
 
 public:
     void *data;
-    AuthUserRequest *auth_user_request;
+    AuthUserRequest::Pointer auth_user_request;
     RH *handler;
 };
 
@@ -143,10 +143,10 @@ public:
     AuthDigestConfig();
     virtual bool active() const;
     virtual bool configured() const;
-    virtual AuthUserRequest *decode(char const *proxy_auth);
+    virtual AuthUserRequest::Pointer decode(char const *proxy_auth);
     virtual void done();
     virtual void dump(StoreEntry *, const char *, AuthConfig *);
-    virtual void fixHeader(AuthUserRequest *, HttpReply *, http_hdr_type, HttpRequest *);
+    virtual void fixHeader(AuthUserRequest::Pointer, HttpReply *, http_hdr_type, HttpRequest *);
     virtual void init(AuthConfig *);
     virtual void parse(AuthConfig *, int, char *);
     virtual void registerWithCacheManager(void);
index 948422083cd30787733e28fb46ed0e72947625ed..14594acae6d15cb4b75eb240b5b082de5a43e8d1 100644 (file)
@@ -66,7 +66,7 @@
 static void
 authenticateStateFree(authenticateStateData * r)
 {
-    AUTHUSERREQUESTUNLOCK(r->auth_user_request, "r");
+    r->auth_user_request = NULL;
     cbdataFree(r);
 }
 
@@ -301,7 +301,7 @@ AuthNegotiateUserRequest::addHeader(HttpReply * rep, int accel)
 }
 
 void
-AuthNegotiateConfig::fixHeader(AuthUserRequest *auth_user_request, HttpReply *rep, http_hdr_type reqType, HttpRequest * request)
+AuthNegotiateConfig::fixHeader(AuthUserRequest::Pointer auth_user_request, HttpReply *rep, http_hdr_type reqType, HttpRequest * request)
 {
     AuthNegotiateUserRequest *negotiate_request;
 
@@ -323,8 +323,7 @@ AuthNegotiateConfig::fixHeader(AuthUserRequest *auth_user_request, HttpReply *re
             request->flags.proxy_keepalive = 0;
         }
     } else {
-        negotiate_request = dynamic_cast<AuthNegotiateUserRequest *>(auth_user_request);
-
+        negotiate_request = dynamic_cast<AuthNegotiateUserRequest *>(auth_user_request.getRaw());
         assert(negotiate_request != NULL);
 
         switch (negotiate_request->auth_state) {
@@ -387,7 +386,6 @@ authenticateNegotiateHandleReply(void *data, void *lastserver, char *reply)
     int valid;
     char *blob, *arg = NULL;
 
-    AuthUserRequest *auth_user_request;
     AuthUser *auth_user;
     NegotiateUser *negotiate_user;
     AuthNegotiateUserRequest *negotiate_request;
@@ -407,20 +405,21 @@ authenticateNegotiateHandleReply(void *data, void *lastserver, char *reply)
         reply = (char *)"BH Internal error";
     }
 
-    auth_user_request = r->auth_user_request;
+    AuthUserRequest::Pointer auth_user_request = r->auth_user_request;
     assert(auth_user_request != NULL);
-    negotiate_request = dynamic_cast<AuthNegotiateUserRequest *>(auth_user_request);
 
+    negotiate_request = dynamic_cast<AuthNegotiateUserRequest *>(auth_user_request.getRaw());
     assert(negotiate_request != NULL);
+
     assert(negotiate_request->waiting);
     negotiate_request->waiting = 0;
     safe_free(negotiate_request->client_blob);
 
-    auth_user = negotiate_request->user();
+    auth_user = auth_user_request->user();
     assert(auth_user != NULL);
     assert(auth_user->auth_type == AUTH_NEGOTIATE);
-    negotiate_user = dynamic_cast<negotiate_user_t *>(auth_user_request->user());
 
+    negotiate_user = dynamic_cast<negotiate_user_t *>(auth_user_request->user());
     assert(negotiate_user != NULL);
 
     if (negotiate_request->authserver == NULL)
@@ -533,10 +532,7 @@ authenticateNegotiateHandleReply(void *data, void *lastserver, char *reply)
         fatalf("authenticateNegotiateHandleReply: *** Unsupported helper response ***, '%s'\n", reply);
     }
 
-    if (negotiate_request->request) {
-        HTTPMSGUNLOCK(negotiate_request->request);
-        negotiate_request->request = NULL;
-    }
+    negotiate_request->request = NULL;
     r->handler(r->data, NULL);
     cbdataReferenceDone(r->data);
     authenticateStateFree(r);
@@ -577,7 +573,6 @@ AuthNegotiateUserRequest::module_start(RH * handler, void *data)
     r->handler = handler;
     r->data = cbdataReference(data);
     r->auth_user_request = this;
-    AUTHUSERREQUESTLOCK(r->auth_user_request, "r");
 
     if (auth_state == AUTHENTICATE_STATE_INITIAL) {
         snprintf(buf, MAX_AUTHTOKEN_LEN, "YR %s\n", client_blob); //CHECKME: can ever client_blob be 0 here?
@@ -624,19 +619,20 @@ AuthNegotiateUserRequest::onConnectionClose(ConnStateData *conn)
     /* unlock the connection based lock */
     debugs(29, 9, "AuthNegotiateUserRequest::onConnectionClose: Unlocking auth_user from the connection '" << conn << "'.");
 
-    AUTHUSERREQUESTUNLOCK(conn->auth_user_request, "conn");
+    conn->auth_user_request = NULL;
 }
 
 /*
  * Decode a Negotiate [Proxy-]Auth string, placing the results in the passed
  * Auth_user structure.
  */
-AuthUserRequest *
+AuthUserRequest::Pointer
 AuthNegotiateConfig::decode(char const *proxy_auth)
 {
     NegotiateUser *newUser = new NegotiateUser(&negotiateConfig);
-    AuthNegotiateUserRequest *auth_user_request = new AuthNegotiateUserRequest ();
+    AuthUserRequest *auth_user_request = new AuthNegotiateUserRequest();
     assert(auth_user_request->user() == NULL);
+
     auth_user_request->user(newUser);
     auth_user_request->user()->auth_type = AUTH_NEGOTIATE;
     auth_user_request->user()->addRequest(auth_user_request);
@@ -721,7 +717,6 @@ AuthNegotiateUserRequest::authenticate(HttpRequest * aRequest, ConnStateData * c
         conn->auth_type = AUTH_NEGOTIATE;
         assert(conn->auth_user_request == NULL);
         conn->auth_user_request = this;
-        AUTHUSERREQUESTLOCK(conn->auth_user_request, "conn");
         request = aRequest;
         HTTPMSGLOCK(request);
         return;
index e28f518e521af314c1c29ad81df90dcf9b0e162f..7b3707c3b134dbec8088987b020fb3018e6e293b 100644 (file)
@@ -36,7 +36,7 @@ typedef enum {
 /// \ingroup AuthNegotiateAPI
 typedef struct {
     void *data;
-    AuthUserRequest *auth_user_request;
+    AuthUserRequest::Pointer auth_user_request;
     RH *handler;
 } authenticateStateData;
 #endif
@@ -120,10 +120,10 @@ public:
     AuthNegotiateConfig();
     virtual bool active() const;
     virtual bool configured() const;
-    virtual AuthUserRequest *decode(char const *proxy_auth);
+    virtual AuthUserRequest::Pointer decode(char const *proxy_auth);
     virtual void done();
     virtual void dump(StoreEntry *, const char *, AuthConfig *);
-    virtual void fixHeader(AuthUserRequest *, HttpReply *, http_hdr_type, HttpRequest *);
+    virtual void fixHeader(AuthUserRequest::Pointer, HttpReply *, http_hdr_type, HttpRequest *);
     virtual void init(AuthConfig *);
     virtual void parse(AuthConfig *, int, char *);
     virtual void registerWithCacheManager(void);
index a2b119bf3e2461f243422201daf05e595e598e48..3eaade7d6aa192db6f0f9720ed37115e74a28a43 100644 (file)
@@ -54,7 +54,7 @@
 static void
 authenticateStateFree(authenticateStateData * r)
 {
-    AUTHUSERREQUESTUNLOCK(r->auth_user_request, "r");
+    r->auth_user_request = NULL;
     cbdataFree(r);
 }
 
@@ -259,10 +259,8 @@ AuthNTLMUserRequest::module_direction()
 }
 
 void
-AuthNTLMConfig::fixHeader(AuthUserRequest *auth_user_request, HttpReply *rep, http_hdr_type hdrType, HttpRequest * request)
+AuthNTLMConfig::fixHeader(AuthUserRequest::Pointer auth_user_request, HttpReply *rep, http_hdr_type hdrType, HttpRequest * request)
 {
-    AuthNTLMUserRequest *ntlm_request;
-
     if (!authenticate)
         return;
 
@@ -280,8 +278,7 @@ AuthNTLMConfig::fixHeader(AuthUserRequest *auth_user_request, HttpReply *rep, ht
             request->flags.proxy_keepalive = 0;
         }
     } else {
-        ntlm_request = dynamic_cast<AuthNTLMUserRequest *>(auth_user_request);
-
+        AuthNTLMUserRequest *ntlm_request = dynamic_cast<AuthNTLMUserRequest *>(auth_user_request.getRaw());
         assert(ntlm_request != NULL);
 
         switch (ntlm_request->auth_state) {
@@ -312,7 +309,6 @@ AuthNTLMConfig::fixHeader(AuthUserRequest *auth_user_request, HttpReply *rep, ht
             safe_free(ntlm_request->server_blob);
             break;
 
-
         default:
             debugs(29, 0, "AuthNTLMConfig::fixHeader: state " << ntlm_request->auth_state << ".");
             fatal("unexpected state in AuthenticateNTLMFixErrorHeader.\n");
@@ -333,9 +329,9 @@ authenticateNTLMHandleReply(void *data, void *lastserver, char *reply)
     int valid;
     char *blob;
 
-    AuthUserRequest *auth_user_request;
     AuthUser *auth_user;
     NTLMUser *ntlm_user;
+    AuthUserRequest::Pointer auth_user_request;
     AuthNTLMUserRequest *ntlm_request;
 
     debugs(29, 8, "authenticateNTLMHandleReply: helper: '" << lastserver << "' sent us '" << (reply ? reply : "<NULL>") << "'");
@@ -355,8 +351,8 @@ authenticateNTLMHandleReply(void *data, void *lastserver, char *reply)
 
     auth_user_request = r->auth_user_request;
     assert(auth_user_request != NULL);
-    ntlm_request = dynamic_cast<AuthNTLMUserRequest *>(auth_user_request);
 
+    ntlm_request = dynamic_cast<AuthNTLMUserRequest *>(auth_user_request.getRaw());
     assert(ntlm_request != NULL);
     assert(ntlm_request->waiting);
     ntlm_request->waiting = 0;
@@ -493,7 +489,6 @@ AuthNTLMUserRequest::module_start(RH * handler, void *data)
     r->handler = handler;
     r->data = cbdataReference(data);
     r->auth_user_request = this;
-    AUTHUSERREQUESTLOCK(r->auth_user_request, "r");
 
     if (auth_state == AUTHENTICATE_STATE_INITIAL) {
         snprintf(buf, 8192, "YR %s\n", client_blob); //CHECKME: can ever client_blob be 0 here?
@@ -541,19 +536,20 @@ AuthNTLMUserRequest::onConnectionClose(ConnStateData *conn)
     /* unlock the connection based lock */
     debugs(29, 9, "AuthNTLMUserRequest::onConnectionClose: Unlocking auth_user from the connection '" << conn << "'.");
 
-    AUTHUSERREQUESTUNLOCK(conn->auth_user_request, "conn");
+    conn->auth_user_request = NULL;
 }
 
 /*
  * Decode a NTLM [Proxy-]Auth string, placing the results in the passed
  * Auth_user structure.
  */
-AuthUserRequest *
+AuthUserRequest::Pointer
 AuthNTLMConfig::decode(char const *proxy_auth)
 {
     NTLMUser *newUser = new NTLMUser(&ntlmConfig);
-    AuthNTLMUserRequest *auth_user_request = new AuthNTLMUserRequest ();
+    AuthUserRequest::Pointer auth_user_request = new AuthNTLMUserRequest();
     assert(auth_user_request->user() == NULL);
+
     auth_user_request->user(newUser);
     auth_user_request->user()->auth_type = AUTH_NTLM;
     auth_user_request->user()->addRequest(auth_user_request);
@@ -639,7 +635,6 @@ AuthNTLMUserRequest::authenticate(HttpRequest * aRequest, ConnStateData * conn,
         conn->auth_type = AUTH_NTLM;
         assert(conn->auth_user_request == NULL);
         conn->auth_user_request = this;
-        AUTHUSERREQUESTLOCK(conn->auth_user_request, "conn");
         request = aRequest;
         HTTPMSGLOCK(request);
         return;
index e26cba601809b872cf205a8f912173fb3cc87f78..949c882a269c6782a87f438c06f22a82f1a8640e 100644 (file)
@@ -27,7 +27,7 @@ typedef enum {
 
 typedef struct {
     void *data;
-    AuthUserRequest *auth_user_request;
+    AuthUserRequest::Pointer auth_user_request;
     RH *handler;
 } authenticateStateData;
 #endif
@@ -105,10 +105,10 @@ public:
     AuthNTLMConfig();
     virtual bool active() const;
     virtual bool configured() const;
-    virtual AuthUserRequest *decode(char const *proxy_auth);
+    virtual AuthUserRequest::Pointer decode(char const *proxy_auth);
     virtual void done();
     virtual void dump(StoreEntry *, const char *, AuthConfig *);
-    virtual void fixHeader(AuthUserRequest *, HttpReply *, http_hdr_type, HttpRequest *);
+    virtual void fixHeader(AuthUserRequest::Pointer, HttpReply *, http_hdr_type, HttpRequest *);
     virtual void init(AuthConfig *);
     virtual void parse(AuthConfig *, int, char *);
     virtual void registerWithCacheManager(void);
index 45a13d09c90bd79cc1f86c9d81a39611bc068028..1b72d6f9ea5ed46840fefd0604b6ed2569b90937 100644 (file)
@@ -489,13 +489,12 @@ prepareLogWithRequestDetails(HttpRequest * request, AccessLogEntry * aLogEntry)
         aLogEntry->cache.requestSize += request->content_length;
     aLogEntry->cache.extuser = request->extacl_user.termedBuf();
 
-    if (request->auth_user_request) {
+    if (request->auth_user_request != NULL) {
 
         if (request->auth_user_request->username())
-            aLogEntry->cache.authuser =
-                xstrdup(request->auth_user_request->username());
+            aLogEntry->cache.authuser = xstrdup(request->auth_user_request->username());
 
-        AUTHUSERREQUESTUNLOCK(request->auth_user_request, "request via clientPrepareLogWithRequestDetails");
+        request->auth_user_request = NULL;
     }
 }
 
@@ -672,8 +671,6 @@ ConnStateData::~ConnStateData()
     if (!flags.swanSang)
         debugs(33, 1, "BUG: ConnStateData was not destroyed properly; FD " << fd);
 
-    AUTHUSERREQUESTUNLOCK(auth_user_request, "~conn");
-
     cbdataReferenceDone(port);
 
     if (bodyPipe != NULL)
index 72fe1195afa09b93f6dd2f7b4bdce9fbb4aa8740..d812e228518446d735e93e221609488ef2f10ac5 100644 (file)
@@ -33,6 +33,7 @@
 #ifndef SQUID_CLIENTSIDE_H
 #define SQUID_CLIENTSIDE_H
 
+#include "auth/UserRequest.h"
 #include "base/AsyncJob.h"
 #include "BodyPipe.h"
 #include "comm.h"
 #include "StoreIOBuffer.h"
 
 class ConnStateData;
-
 class ClientHttpRequest;
-
 class clientStreamNode;
-
-class AuthUserRequest;
-
 class ChunkedCodingParser;
 class HttpParser;
+// class AuthUserRequest::Pointer;
 
 template <class T>
 class Range;
@@ -181,7 +178,7 @@ public:
      * note this is ONLY connection based because NTLM is against HTTP spec.
      * the user details for connection based authentication
      */
-    AuthUserRequest *auth_user_request;
+    AuthUserRequest::Pointer auth_user_request;
 
     /**
      * used by the owner of the connection, opaque otherwise
index 8d37cb327d60731a72d36da651c28c5d1e166fcf..6f685d820179d8df9e68417412b87eec319b81ef 100644 (file)
@@ -95,10 +95,9 @@ void
 clientReplyContext::setReplyToError(
     err_type err, http_status status, const HttpRequestMethod& method, char const *uri,
     IpAddress &addr, HttpRequest * failedrequest, const char *unparsedrequest,
-    AuthUserRequest * auth_user_request)
+    AuthUserRequest::Pointer auth_user_request)
 {
-    ErrorState *errstate =
-        clientBuildError(err, status, uri, addr, failedrequest);
+    ErrorState *errstate = clientBuildError(err, status, uri, addr, failedrequest);
 
     if (unparsedrequest)
         errstate->request_hdrs = xstrdup(unparsedrequest);
@@ -111,10 +110,7 @@ clientReplyContext::setReplyToError(
 
     createStoreEntry(method, request_flags());
 
-    if (auth_user_request) {
-        errstate->auth_user_request = auth_user_request;
-        AUTHUSERREQUESTLOCK(errstate->auth_user_request, "errstate");
-    }
+    errstate->auth_user_request = auth_user_request;
 
     assert(errstate->callback_data == NULL);
     errorAppendEntry(http->storeEntry(), errstate);
@@ -1361,9 +1357,8 @@ clientReplyContext::buildReplyHeader()
          * responses
          */
         authenticateFixHeader(reply, request->auth_user_request, request, 0, 1);
-    } else if (request->auth_user_request)
-        authenticateFixHeader(reply, request->auth_user_request, request,
-                              http->flags.accel, 0);
+    } else if (request->auth_user_request != NULL)
+        authenticateFixHeader(reply, request->auth_user_request, request, http->flags.accel, 0);
 
     /* Append X-Cache */
     httpHeaderPutStrf(hdr, HDR_X_CACHE, "%s from %s",
index 1d0e827f59c5e36809f705a33930f4fccea965bf..1bee5ced9a5145680ed036567b87c82d55d6a7de 100644 (file)
@@ -72,7 +72,7 @@ public:
     int storeOKTransferDone() const;
     int storeNotOKTransferDone() const;
 
-    void setReplyToError(err_type, http_status, const HttpRequestMethod&, char const *, IpAddress &, HttpRequest *, const char *, AuthUserRequest *);
+    void setReplyToError(err_type, http_status, const HttpRequestMethod&, char const *, IpAddress &, HttpRequest *, const char *, AuthUserRequest::Pointer);
     void createStoreEntry(const HttpRequestMethod& m, request_flags flags);
     void removeStoreReference(store_client ** scp, StoreEntry ** ep);
     void removeClientStoreReference(store_client **scp, ClientHttpRequest *http);
index 434c1ce2026a29575592806c8767250158f5968e..a020a75b39b9bab51c22d571304868a379618fa3 100644 (file)
@@ -602,7 +602,7 @@ ClientRequestContext::clientAccessCheckDone(int answer)
                                     http->getConn() != NULL ? http->getConn()->peer : tmpnoaddr,
                                     http->request,
                                     NULL,
-                                    http->getConn() != NULL && http->getConn()->auth_user_request ?
+                                    http->getConn() != NULL && http->getConn()->auth_user_request != NULL ?
                                     http->getConn()->auth_user_request : http->request->auth_user_request);
 
         node = (clientStreamNode *)http->client_stream.tail->data;
@@ -1017,11 +1017,7 @@ ClientRequestContext::clientRedirectDone(char *result)
         new_request->my_addr = old_request->my_addr;
         new_request->flags = old_request->flags;
         new_request->flags.redirected = 1;
-
-        if (old_request->auth_user_request) {
-            new_request->auth_user_request = old_request->auth_user_request;
-            AUTHUSERREQUESTLOCK(new_request->auth_user_request, "new request");
-        }
+        new_request->auth_user_request = old_request->auth_user_request;
 
         if (old_request->body_pipe != NULL) {
             new_request->body_pipe = old_request->body_pipe;
@@ -1492,7 +1488,7 @@ ClientHttpRequest::handleAdaptationFailure(bool bypassable)
     repContext->setReplyToError(ERR_ICAP_FAILURE, HTTP_INTERNAL_SERVER_ERROR,
                                 request->method, NULL,
                                 (c != NULL ? c->peer : noAddr), request, NULL,
-                                (c != NULL && c->auth_user_request ?
+                                (c != NULL && c->auth_user_request != NULL ?
                                  c->auth_user_request : request->auth_user_request));
 
     node = (clientStreamNode *)client_stream.tail->data;
index e06a933f559fa9ac9466057e80329e840d70008b..47385dc2bc4fd80a3c05f723c308f3a949e82451 100644 (file)
@@ -249,22 +249,6 @@ typedef enum {
     STREAM_FAILED
 } clientStream_status_t;
 
-typedef enum {
-    AUTH_ACL_CHALLENGE = -2,
-    AUTH_ACL_HELPER = -1,
-    AUTH_ACL_CANNOT_AUTHENTICATE = 0,
-    AUTH_AUTHENTICATED = 1
-} auth_acl_t;
-
-typedef enum {
-    AUTH_UNKNOWN,              /* default */
-    AUTH_BASIC,
-    AUTH_NTLM,
-    AUTH_DIGEST,
-    AUTH_NEGOTIATE,
-    AUTH_BROKEN                        /* known type, but broken data */
-} auth_type_t;
-
 /* stateful helper callback response codes */
 typedef enum {
     S_HELPER_UNKNOWN,
index b0b773ebfd74b75785dde63f9035cce58e18c8d1..a8259b85859bc114a4aacdac560ca63f0d29f03d 100644 (file)
@@ -501,7 +501,7 @@ errorStateFree(ErrorState * err)
     wordlistDestroy(&err->ftp.server_msg);
     safe_free(err->ftp.request);
     safe_free(err->ftp.reply);
-    AUTHUSERREQUESTUNLOCK(err->auth_user_request, "errstate");
+    err->auth_user_request = NULL;
     safe_free(err->err_msg);
 #if USE_ERR_LOCALES
     if (err->err_language != Config.errorDefaultLanguage)
@@ -609,7 +609,7 @@ ErrorState::Convert(char token, bool url_presentable)
     switch (token) {
 
     case 'a':
-        if (request && request->auth_user_request)
+        if (request && request->auth_user_request != NULL)
             p = request->auth_user_request->username();
         if (!p)
             p = "-";
index 8a22d85fe7dbffb2d217c66fd4106561aa8aab18..21255fc719c4ffcc8a01328d134357dad2a34479 100644 (file)
@@ -35,6 +35,7 @@
 #define   SQUID_ERRORPAGE_H
 
 #include "squid.h"
+#include "auth/UserRequest.h"
 #include "cbdata.h"
 #include "ip/IpAddress.h"
 
@@ -78,7 +79,6 @@
  \endverbatim
  */
 
-class AuthUserRequest;
 class HttpReply;
 class MemBuf;
 
@@ -127,7 +127,7 @@ public:
     int page_id;
     char *err_language;
     http_status httpStatus;
-    AuthUserRequest *auth_user_request;
+    AuthUserRequest::Pointer auth_user_request;
     HttpRequest *request;
     char *url;
     int xerrno;
index 90ff036841da45e62bf74a551191eb24aec06d76..1b182a19c6e1b7e253d602550965381d869b0716 100644 (file)
@@ -729,8 +729,7 @@ aclMatchExternal(external_acl_data *acl, ACLFilledChecklist *ch)
 
         key = makeExternalAclKey(ch, acl);
 
-        if (acl->def->require_auth)
-            AUTHUSERREQUESTUNLOCK(ch->auth_user_request, "ACLChecklist via aclMatchExternal");
+        acl->def->require_auth = NULL;
 
         if (!key) {
             /* Not sufficient data to process */
@@ -845,7 +844,7 @@ makeExternalAclKey(ACLFilledChecklist * ch, external_acl_data * acl_data)
         switch (format->type) {
 
         case _external_acl_format::EXT_ACL_LOGIN:
-            assert (ch->auth_user_request);
+            assert (ch->auth_user_request != NULL);
             str = ch->auth_user_request->username();
             break;
 #if USE_IDENT
index e8ddbe92c1a051221a3c14a2bb8c7dc10f1459d1..206b2b56bef20c585c3727f67ae855ba3924c079 100644 (file)
@@ -1490,7 +1490,7 @@ httpFixupAuthentication(HttpRequest * request, HttpRequest * orig_request, const
 
         if (orig_request->extacl_user.size())
             username = orig_request->extacl_user.termedBuf();
-        else if (orig_request->auth_user_request)
+        else if (orig_request->auth_user_request != NULL)
             username = orig_request->auth_user_request->username();
 
         snprintf(loginbuf, sizeof(loginbuf), "%s%s", username, orig_request->peer_login + 1);
index 5d4255ff0cf03eafed3dab1d8cbe09b927e9e792..b966336c4a659b84a717950d987516de6a342e95 100644 (file)
@@ -180,7 +180,7 @@ peerUserHashSelectParent(HttpRequest * request)
     if (n_userhash_peers == 0)
         return NULL;
 
-    if (request->auth_user_request)
+    if (request->auth_user_request != NULL)
         key = request->auth_user_request->username();
 
     if (!key)
index 04bbe8a08a2140a5549899953e6be5f0276bd4fe..e6f00fc856309ddd1b92af6460f8ab33c4ac0eb5 100644 (file)
@@ -136,7 +136,7 @@ redirectStart(ClientHttpRequest * http, RH * handler, void *data)
         r->client_addr.SetNoAddr();
     r->client_ident = NULL;
 
-    if (http->request->auth_user_request)
+    if (http->request->auth_user_request != NULL)
         r->client_ident = http->request->auth_user_request->username();
     else if (http->request->extacl_user.defined()) {
         r->client_ident = http->request->extacl_user.termedBuf();
index b90b2d8eec72e14cdc109fc06965e5e85178a5ba..dd909d9caf1512e2c3c5c947b28ab0498d87f42a 100644 (file)
@@ -1653,7 +1653,7 @@ statClientRequests(StoreEntry * s)
                           (int) http->start_time.tv_usec,
                           tvSubDsec(http->start_time, current_time));
 
-        if (http->request->auth_user_request)
+        if (http->request->auth_user_request != NULL)
             p = http->request->auth_user_request->username();
         else if (http->request->extacl_user.defined()) {
             p = http->request->extacl_user.termedBuf();
index 161bd0aa9d9bcbfc54fd38e1e74f24154635ff08..5eb4ce90f4d5ee9cb97b59b63067978e3a9c1e55 100644 (file)
 CPPUNIT_TEST_SUITE_REGISTRATION( testAuth );
 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthConfig );
 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthUserRequest );
-#ifdef HAVE_AUTH_MODULE_BASIC
+#if HAVE_AUTH_MODULE_BASIC
 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthBasicUserRequest );
 #endif
-#ifdef HAVE_AUTH_MODULE_DIGEST
+#if HAVE_AUTH_MODULE_DIGEST
 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthDigestUserRequest );
 #endif
-#ifdef HAVE_AUTH_MODULE_NTLM
+#if HAVE_AUTH_MODULE_NTLM
 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthNTLMUserRequest );
 #endif
-#ifdef HAVE_AUTH_MODULE_NEGOTIATE
+#if HAVE_AUTH_MODULE_NEGOTIATE
 CPPUNIT_TEST_SUITE_REGISTRATION( testAuthNegotiateUserRequest );
 #endif
 
@@ -74,7 +74,7 @@ getConfig(char const *type_str)
 
         config.push_back(theScheme->createConfig());
         scheme = config.back();
-        assert (scheme);
+        assert(scheme);
     }
 
     return scheme;
@@ -156,7 +156,7 @@ testAuthConfig::create()
     fake_auth_setup();
 
     for (AuthScheme::const_iterator i = AuthScheme::Schemes().begin(); i != AuthScheme::Schemes().end(); ++i) {
-        AuthUserRequest *authRequest = AuthConfig::CreateAuthUser(find_proxy_auth((*i)->type()));
+        AuthUserRequest::Pointer authRequest = AuthConfig::CreateAuthUser(find_proxy_auth((*i)->type()));
         CPPUNIT_ASSERT(authRequest != NULL);
     }
 }
@@ -177,12 +177,12 @@ testAuthUserRequest::scheme()
     for (AuthScheme::const_iterator i = AuthScheme::Schemes().begin(); i != AuthScheme::Schemes().end(); ++i) {
         // create a user request
         // check its scheme matches *i
-        AuthUserRequest *authRequest = AuthConfig::CreateAuthUser(find_proxy_auth((*i)->type()));
+        AuthUserRequest::Pointer authRequest = AuthConfig::CreateAuthUser(find_proxy_auth((*i)->type()));
         CPPUNIT_ASSERT_EQUAL(authRequest->scheme(), *i);
     }
 }
 
-#ifdef HAVE_AUTH_MODULE_BASIC
+#if HAVE_AUTH_MODULE_BASIC
 #include "auth/basic/auth_basic.h"
 /* AuthBasicUserRequest::AuthBasicUserRequest works
  */
@@ -197,18 +197,16 @@ testAuthBasicUserRequest::construction()
 void
 testAuthBasicUserRequest::username()
 {
-    AuthBasicUserRequest();
-    AuthBasicUserRequest *temp=new AuthBasicUserRequest();
+    AuthUserRequest::Pointer temp = new AuthBasicUserRequest();
     BasicUser *basic_auth=new BasicUser(AuthConfig::Find("basic"));
     basic_auth->username("John");
     temp->user(basic_auth);
     basic_auth->addRequest(temp);
     CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp->username()));
-    delete temp;
 }
 #endif /* HAVE_AUTH_MODULE_BASIC */
 
-#ifdef HAVE_AUTH_MODULE_DIGEST
+#if HAVE_AUTH_MODULE_DIGEST
 #include "auth/digest/auth_digest.h"
 /* AuthDigestUserRequest::AuthDigestUserRequest works
  */
@@ -223,18 +221,16 @@ testAuthDigestUserRequest::construction()
 void
 testAuthDigestUserRequest::username()
 {
-    AuthDigestUserRequest();
-    AuthDigestUserRequest *temp=new AuthDigestUserRequest();
-    DigestUser *user=new DigestUser(AuthConfig::Find("digest"));
-    user->username("John");
-    temp->user(user);
-    user->addRequest(temp);
+    AuthUserRequest::Pointer temp = new AuthDigestUserRequest();
+    DigestUser *duser=new DigestUser(AuthConfig::Find("digest"));
+    duser->username("John");
+    temp->user(duser);
+    duser->addRequest(temp);
     CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp->username()));
-    delete temp;
 }
 #endif /* HAVE_AUTH_MODULE_DIGEST */
 
-#ifdef HAVE_AUTH_MODULE_NTLM
+#if HAVE_AUTH_MODULE_NTLM
 #include "auth/ntlm/auth_ntlm.h"
 /* AuthNTLMUserRequest::AuthNTLMUserRequest works
  */
@@ -249,18 +245,16 @@ testAuthNTLMUserRequest::construction()
 void
 testAuthNTLMUserRequest::username()
 {
-    AuthNTLMUserRequest();
-    AuthNTLMUserRequest *temp=new AuthNTLMUserRequest();
-    NTLMUser *user=new NTLMUser(AuthConfig::Find("ntlm"));
-    user->username("John");
-    temp->user(user);
-    user->addRequest(temp);
+    AuthUserRequest::Pointer temp = new AuthNTLMUserRequest();
+    NTLMUser *nuser=new NTLMUser(AuthConfig::Find("ntlm"));
+    nuser->username("John");
+    temp->user(nuser);
+    nuser->addRequest(temp);
     CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp->username()));
-    delete temp;
 }
 #endif /* HAVE_AUTH_MODULE_NTLM */
 
-#ifdef HAVE_AUTH_MODULE_NEGOTIATE
+#if HAVE_AUTH_MODULE_NEGOTIATE
 #include "auth/negotiate/auth_negotiate.h"
 /* AuthNegotiateUserRequest::AuthNegotiateUserRequest works
  */
@@ -275,14 +269,12 @@ testAuthNegotiateUserRequest::construction()
 void
 testAuthNegotiateUserRequest::username()
 {
-    AuthNegotiateUserRequest();
-    AuthNegotiateUserRequest *temp=new AuthNegotiateUserRequest();
-    NegotiateUser *user=new NegotiateUser(AuthConfig::Find("negotiate"));
-    user->username("John");
-    temp->user(user);
-    user->addRequest(temp);
+    AuthUserRequest::Pointer temp = new AuthNegotiateUserRequest();
+    NegotiateUser *nuser=new NegotiateUser(AuthConfig::Find("negotiate"));
+    nuser->username("John");
+    temp->user(nuser);
+    nuser->addRequest(temp);
     CPPUNIT_ASSERT_EQUAL(0, strcmp("John", temp->username()));
-    delete temp;
 }
 
 #endif /* HAVE_AUTH_MODULE_NEGOTIATE */