From: Amos Jeffries Date: Mon, 13 Jun 2011 12:25:12 +0000 (-0600) Subject: Auth lookup state cbdata upgrade X-Git-Tag: take08~55^2~138 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1c756645b487dd32065aba99699b302f66513bc1;p=thirdparty%2Fsquid.git Auth lookup state cbdata upgrade 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. --- diff --git a/src/auth/State.cc b/src/auth/State.cc index 9c483855d9..78cb4bff99 100644 --- a/src/auth/State.cc +++ b/src/auth/State.cc @@ -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 */ diff --git a/src/auth/State.h b/src/auth/State.h index 0cb34ad32f..5361e69f8c 100644 --- a/src/auth/State.h +++ b/src/auth/State.h @@ -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__ */ diff --git a/src/auth/basic/auth_basic.cc b/src/auth/basic/auth_basic.cc index 8b765cb79a..946ed93ebe 100644 --- a/src/auth/basic/auth_basic.cc +++ b/src/auth/basic/auth_basic.cc @@ -138,7 +138,7 @@ Auth::Basic::Config::done() static void authenticateBasicHandleReply(void *data, char *reply) { - authenticateStateData *r = static_cast(data); + Auth::StateData *r = static_cast(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(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)); } diff --git a/src/auth/digest/UserRequest.cc b/src/auth/digest/UserRequest.cc index c52b76109f..a203437d4e 100644 --- a/src/auth/digest/UserRequest.cc +++ b/src/auth/digest/UserRequest.cc @@ -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(this); if (static_cast(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(data); char *t = NULL; void *cbdata; debugs(29, 9, HERE << "{" << (reply ? reply : "") << "}"); @@ -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; } diff --git a/src/auth/digest/auth_digest.cc b/src/auth/digest/auth_digest.cc index 6da17d5e30..42ee98611b 100644 --- a/src/auth/digest/auth_digest.cc +++ b/src/auth/digest/auth_digest.cc @@ -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); } } diff --git a/src/auth/negotiate/UserRequest.cc b/src/auth/negotiate/UserRequest.cc index 68916cb4d7..205dffe38c 100644 --- a/src/auth/negotiate/UserRequest.cc +++ b/src/auth/negotiate/UserRequest.cc @@ -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(data); + Auth::StateData *r = static_cast(data); - int valid; char *blob, *arg = NULL; debugs(29, 8, HERE << "helper: '" << lastserver << "' sent us '" << (reply ? reply : "") << "'"); - 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 diff --git a/src/auth/negotiate/auth_negotiate.cc b/src/auth/negotiate/auth_negotiate.cc index edab8a328c..2496421656 100644 --- a/src/auth/negotiate/auth_negotiate.cc +++ b/src/auth/negotiate/auth_negotiate.cc @@ -181,8 +181,6 @@ Auth::Negotiate::Config::init(Auth::Config * scheme) negotiateauthenticators->ipc_type = IPC_STREAM; helperStatefulOpenServers(negotiateauthenticators); - - CBDATA_INIT_TYPE(authenticateStateData); } } diff --git a/src/auth/ntlm/UserRequest.cc b/src/auth/ntlm/UserRequest.cc index 960e395d7c..8e234d1590 100644 --- a/src/auth/ntlm/UserRequest.cc +++ b/src/auth/ntlm/UserRequest.cc @@ -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(data); - - int valid; + Auth::StateData *r = static_cast(data); char *blob; debugs(29, 8, HERE << "helper: '" << lastserver << "' sent us '" << (reply ? reply : "") << "'"); - 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; } diff --git a/src/auth/ntlm/auth_ntlm.cc b/src/auth/ntlm/auth_ntlm.cc index 27bccd14c3..d84bd0c9fd 100644 --- a/src/auth/ntlm/auth_ntlm.cc +++ b/src/auth/ntlm/auth_ntlm.cc @@ -168,8 +168,6 @@ Auth::Ntlm::Config::init(Auth::Config * scheme) ntlmauthenticators->ipc_type = IPC_STREAM; helperStatefulOpenServers(ntlmauthenticators); - - CBDATA_INIT_TYPE(authenticateStateData); } }