]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Auth lookup state cbdata upgrade
authorAmos Jeffries <squid3@treenet.co.nz>
Mon, 13 Jun 2011 12:25:12 +0000 (06:25 -0600)
committerAmos Jeffries <squid3@treenet.co.nz>
Mon, 13 Jun 2011 12:25:12 +0000 (06:25 -0600)
The authenticators utilize a "statedata" structure to store and pass
the callback and Auth::UserRequest an auth lookup is about.

This patch converts the structure from a CBDATA_GLOBAL_TYPE struct to a
CBDATA_CLASS2 and adds a parameterized constructor for it.

The result is that all the code using it no longer has to explicitly
manage fields assignments and cbdata referencing. Simply new the object
when submitting to the helper system and delete once its handler has
been called.

src/auth/State.cc
src/auth/State.h
src/auth/basic/auth_basic.cc
src/auth/digest/UserRequest.cc
src/auth/digest/auth_digest.cc
src/auth/negotiate/UserRequest.cc
src/auth/negotiate/auth_negotiate.cc
src/auth/ntlm/UserRequest.cc
src/auth/ntlm/auth_ntlm.cc

index 9c483855d93ff69b6eeddbdec6d67fef96bbbe81..78cb4bff996e3efba6f60b177ea9c1d82e0cffbf 100644 (file)
@@ -3,12 +3,5 @@
 #if USE_AUTH
 #include "auth/State.h"
 
-CBDATA_GLOBAL_TYPE(authenticateStateData);
-
-void
-authenticateStateFree(authenticateStateData * r)
-{
-    r->auth_user_request = NULL;
-    cbdataFree(r);
-}
+CBDATA_NAMESPACED_CLASS_INIT(Auth, StateData);
 #endif /* USE_AUTH */
index 0cb34ad32fe5034a20ba21cbb4bde2f6a7a354d1..5361e69f8c6c5727abf28ca983aa95a938b86f79 100644 (file)
@@ -4,19 +4,36 @@
 #if USE_AUTH
 
 #include "auth/UserRequest.h"
+#include "cbdata.h"
+
+namespace Auth
+{
 
 /**
  * CBDATA state for NTLM, Negotiate, and Digest stateful authentication.
  */
-typedef struct {
+class StateData {
+public:
+    StateData(const AuthUserRequest::Pointer &r, RH *h, void *d) :
+        data(cbdataReference(d)),
+        auth_user_request(r),
+        handler(h)
+    {}
+
+    ~StateData() {
+        auth_user_request = NULL;
+        cbdataReferenceDone(data);
+    }
+
     void *data;
     AuthUserRequest::Pointer auth_user_request;
     RH *handler;
-} authenticateStateData;
 
-extern CBDATA_GLOBAL_TYPE(authenticateStateData);
+private:
+    CBDATA_CLASS2(StateData);
+};
 
-extern void authenticateStateFree(authenticateStateData * r);
+} // namespace Auth
 
 #endif /* USE_AUTH */
 #endif /* __AUTH_AUTHENTICATE_STATE_T__ */
index 8b765cb79a490bc0b78b792ba8202390d62319e0..946ed93ebe24af90496419e77e1d6d67b26e2f52 100644 (file)
@@ -138,7 +138,7 @@ Auth::Basic::Config::done()
 static void
 authenticateBasicHandleReply(void *data, char *reply)
 {
-    authenticateStateData *r = static_cast<authenticateStateData *>(data);
+    Auth::StateData *r = static_cast<Auth::StateData *>(data);
     BasicAuthQueueNode *tmpnode;
     char *t = NULL;
     void *cbdata;
@@ -188,7 +188,7 @@ authenticateBasicHandleReply(void *data, char *reply)
         basic_auth->auth_queue = tmpnode;
     }
 
-    authenticateStateFree(r);
+    delete r;
 }
 
 void
@@ -416,8 +416,6 @@ Auth::Basic::Config::init(Auth::Config * schemeCfg)
         basicauthenticators->ipc_type = IPC_STREAM;
 
         helperOpenServers(basicauthenticators);
-
-        CBDATA_INIT_TYPE(authenticateStateData);
     }
 }
 
@@ -450,13 +448,8 @@ Auth::Basic::User::submitRequest(AuthUserRequest::Pointer auth_user_request, RH
 {
     /* mark the user as having verification in progress */
     credentials(Auth::Pending);
-    authenticateStateData *r = NULL;
     char buf[8192];
     char user[1024], pass[1024];
-    r = cbdataAlloc(authenticateStateData);
-    r->handler = handler;
-    r->data = cbdataReference(data);
-    r->auth_user_request = auth_user_request;
     if (static_cast<Auth::Basic::Config*>(config)->utf8) {
         latin1_to_utf8(user, sizeof(user), username());
         latin1_to_utf8(pass, sizeof(pass), passwd);
@@ -467,5 +460,6 @@ Auth::Basic::User::submitRequest(AuthUserRequest::Pointer auth_user_request, RH
         xstrncpy(pass, rfc1738_escape(passwd), sizeof(pass));
     }
     snprintf(buf, sizeof(buf), "%s %s\n", user, pass);
-    helperSubmit(basicauthenticators, buf, authenticateBasicHandleReply, r);
+    helperSubmit(basicauthenticators, buf, authenticateBasicHandleReply,
+                 new Auth::StateData(auth_user_request, handler, data));
 }
index c52b76109fa8bbc34da08fe3432685491333e1d3..a203437d4ee51f822eb5d79ac7db98d33ddb94e4 100644 (file)
@@ -247,7 +247,6 @@ AuthDigestUserRequest::addAuthenticationInfoTrailer(HttpReply * rep, int accel)
 void
 AuthDigestUserRequest::module_start(RH * handler, void *data)
 {
-    authenticateStateData *r = NULL;
     char buf[8192];
 
     assert(user() != NULL && user()->auth_type == Auth::AUTH_DIGEST);
@@ -259,10 +258,6 @@ AuthDigestUserRequest::module_start(RH * handler, void *data)
         return;
     }
 
-    r = cbdataAlloc(authenticateStateData);
-    r->handler = handler;
-    r->data = cbdataReference(data);
-    r->auth_user_request = static_cast<AuthUserRequest*>(this);
     if (static_cast<Auth::Digest::Config*>(Auth::Config::Find("digest"))->utf8) {
         char userstr[1024];
         latin1_to_utf8(userstr, sizeof(userstr), user()->username());
@@ -271,13 +266,14 @@ AuthDigestUserRequest::module_start(RH * handler, void *data)
         snprintf(buf, 8192, "\"%s\":\"%s\"\n", user()->username(), realm);
     }
 
-    helperSubmit(digestauthenticators, buf, AuthDigestUserRequest::HandleReply, r);
+    helperSubmit(digestauthenticators, buf, AuthDigestUserRequest::HandleReply,
+                 new Auth::StateData(this, handler, data));
 }
 
 void
 AuthDigestUserRequest::HandleReply(void *data, char *reply)
 {
-    authenticateStateData *replyData = static_cast < authenticateStateData * >(data);
+    Auth::StateData *replyData = static_cast<Auth::StateData *>(data);
     char *t = NULL;
     void *cbdata;
     debugs(29, 9, HERE << "{" << (reply ? reply : "<NULL>") << "}");
@@ -315,7 +311,5 @@ AuthDigestUserRequest::HandleReply(void *data, char *reply)
     if (cbdataReferenceValidDone(replyData->data, &cbdata))
         replyData->handler(cbdata, NULL);
 
-    replyData->auth_user_request = NULL;
-
-    cbdataFree(replyData);
+    delete replyData;
 }
index 6da17d5e30e84808fbbbd0ef23806bb6dd5ef23e..42ee98611bc8112ff418a4b921788d9b3944835a 100644 (file)
@@ -65,8 +65,6 @@ static hash_table *digest_nonce_cache;
 static int authdigest_initialised = 0;
 static MemAllocator *digest_nonce_pool = NULL;
 
-// CBDATA_TYPE(DigestAuthenticateStateData);
-
 enum http_digest_attr_type {
     DIGEST_USERNAME,
     DIGEST_REALM,
@@ -590,8 +588,6 @@ Auth::Digest::Config::init(Auth::Config * scheme)
         digestauthenticators->ipc_type = IPC_STREAM;
 
         helperOpenServers(digestauthenticators);
-
-        CBDATA_INIT_TYPE(authenticateStateData);
     }
 }
 
index 68916cb4d772cad6a115592ba74464dfc82e9e09..205dffe38c986442574d511b7142a21e148e678b 100644 (file)
@@ -97,11 +97,6 @@ AuthNegotiateUserRequest::module_start(RH * handler, void *data)
 
     debugs(29, 8, HERE << "credentials state is '" << user()->credentials() << "'");
 
-    authenticateStateData *r = cbdataAlloc(authenticateStateData);
-    r->handler = handler;
-    r->data = cbdataReference(data);
-    r->auth_user_request = this;
-
     if (user()->credentials() == Auth::Pending) {
         snprintf(buf, sizeof(buf), "YR %s\n", client_blob); //CHECKME: can ever client_blob be 0 here?
     } else {
@@ -111,7 +106,9 @@ AuthNegotiateUserRequest::module_start(RH * handler, void *data)
     waiting = 1;
 
     safe_free(client_blob);
-    helperStatefulSubmit(negotiateauthenticators, buf, AuthNegotiateUserRequest::HandleReply, r, authserver);
+
+    helperStatefulSubmit(negotiateauthenticators, buf, AuthNegotiateUserRequest::HandleReply,
+                         new Auth::StateData(this, handler, data), authserver);
 }
 
 /**
@@ -234,18 +231,15 @@ AuthNegotiateUserRequest::authenticate(HttpRequest * aRequest, ConnStateData * c
 void
 AuthNegotiateUserRequest::HandleReply(void *data, void *lastserver, char *reply)
 {
-    authenticateStateData *r = static_cast<authenticateStateData *>(data);
+    Auth::StateData *r = static_cast<Auth::StateData *>(data);
 
-    int valid;
     char *blob, *arg = NULL;
 
     debugs(29, 8, HERE << "helper: '" << lastserver << "' sent us '" << (reply ? reply : "<NULL>") << "'");
-    valid = cbdataReferenceValid(r->data);
 
-    if (!valid) {
+    if (!cbdataReferenceValid(r->data)) {
         debugs(29, DBG_IMPORTANT, "ERROR: Negotiate Authentication invalid callback data. helper '" << lastserver << "'.");
-        cbdataReferenceDone(r->data);
-        authenticateStateFree(r);
+        delete r;
         return;
     }
 
@@ -367,8 +361,7 @@ AuthNegotiateUserRequest::HandleReply(void *data, void *lastserver, char *reply)
 
     lm_request->request = NULL;
     r->handler(r->data, NULL);
-    cbdataReferenceDone(r->data);
-    authenticateStateFree(r);
+    delete r;
 }
 
 void
index edab8a328ce04af0cce220711744cec8c0d383eb..2496421656aecceca579f7f9c30265469e68055e 100644 (file)
@@ -181,8 +181,6 @@ Auth::Negotiate::Config::init(Auth::Config * scheme)
         negotiateauthenticators->ipc_type = IPC_STREAM;
 
         helperStatefulOpenServers(negotiateauthenticators);
-
-        CBDATA_INIT_TYPE(authenticateStateData);
     }
 }
 
index 960e395d7ca1a43fe8ed5d448a161aff54a7f8b6..8e234d1590d3d57e887cdceec7d56e1b5de8e2f0 100644 (file)
@@ -92,11 +92,6 @@ AuthNTLMUserRequest::module_start(RH * handler, void *data)
 
     debugs(29, 8, HERE << "credentials state is '" << user()->credentials() << "'");
 
-    authenticateStateData *r = cbdataAlloc(authenticateStateData);
-    r->handler = handler;
-    r->data = cbdataReference(data);
-    r->auth_user_request = this;
-
     if (user()->credentials() == Auth::Pending) {
         snprintf(buf, sizeof(buf), "YR %s\n", client_blob); //CHECKME: can ever client_blob be 0 here?
     } else {
@@ -106,7 +101,8 @@ AuthNTLMUserRequest::module_start(RH * handler, void *data)
     waiting = 1;
 
     safe_free(client_blob);
-    helperStatefulSubmit(ntlmauthenticators, buf, AuthNTLMUserRequest::HandleReply, r, authserver);
+    helperStatefulSubmit(ntlmauthenticators, buf, AuthNTLMUserRequest::HandleReply,
+                         new Auth::StateData(this, handler, data), authserver);
 }
 
 /**
@@ -229,18 +225,14 @@ AuthNTLMUserRequest::authenticate(HttpRequest * aRequest, ConnStateData * conn,
 void
 AuthNTLMUserRequest::HandleReply(void *data, void *lastserver, char *reply)
 {
-    authenticateStateData *r = static_cast<authenticateStateData *>(data);
-
-    int valid;
+    Auth::StateData *r = static_cast<Auth::StateData *>(data);
     char *blob;
 
     debugs(29, 8, HERE << "helper: '" << lastserver << "' sent us '" << (reply ? reply : "<NULL>") << "'");
-    valid = cbdataReferenceValid(r->data);
 
-    if (!valid) {
+    if (!cbdataReferenceValid(r->data)) {
         debugs(29, DBG_IMPORTANT, "ERROR: NTLM Authentication invalid callback data. helper '" << lastserver << "'.");
-        cbdataReferenceDone(r->data);
-        authenticateStateFree(r);
+        delete r;
         return;
     }
 
@@ -349,6 +341,5 @@ AuthNTLMUserRequest::HandleReply(void *data, void *lastserver, char *reply)
         lm_request->request = NULL;
     }
     r->handler(r->data, NULL);
-    cbdataReferenceDone(r->data);
-    authenticateStateFree(r);
+    delete r;
 }
index 27bccd14c3e482053005f532ea13016ee0c1987d..d84bd0c9fd2b0c0886aff97b75b17300f0c8da20 100644 (file)
@@ -168,8 +168,6 @@ Auth::Ntlm::Config::init(Auth::Config * scheme)
         ntlmauthenticators->ipc_type = IPC_STREAM;
 
         helperStatefulOpenServers(ntlmauthenticators);
-
-        CBDATA_INIT_TYPE(authenticateStateData);
     }
 }