#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 */
#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__ */
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;
basic_auth->auth_queue = tmpnode;
}
- authenticateStateFree(r);
+ delete r;
}
void
basicauthenticators->ipc_type = IPC_STREAM;
helperOpenServers(basicauthenticators);
-
- CBDATA_INIT_TYPE(authenticateStateData);
}
}
{
/* 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);
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));
}
void
AuthDigestUserRequest::module_start(RH * handler, void *data)
{
- authenticateStateData *r = NULL;
char buf[8192];
assert(user() != NULL && user()->auth_type == Auth::AUTH_DIGEST);
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());
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>") << "}");
if (cbdataReferenceValidDone(replyData->data, &cbdata))
replyData->handler(cbdata, NULL);
- replyData->auth_user_request = NULL;
-
- cbdataFree(replyData);
+ delete replyData;
}
static int authdigest_initialised = 0;
static MemAllocator *digest_nonce_pool = NULL;
-// CBDATA_TYPE(DigestAuthenticateStateData);
-
enum http_digest_attr_type {
DIGEST_USERNAME,
DIGEST_REALM,
digestauthenticators->ipc_type = IPC_STREAM;
helperOpenServers(digestauthenticators);
-
- CBDATA_INIT_TYPE(authenticateStateData);
}
}
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 {
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);
}
/**
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;
}
lm_request->request = NULL;
r->handler(r->data, NULL);
- cbdataReferenceDone(r->data);
- authenticateStateFree(r);
+ delete r;
}
void
negotiateauthenticators->ipc_type = IPC_STREAM;
helperStatefulOpenServers(negotiateauthenticators);
-
- CBDATA_INIT_TYPE(authenticateStateData);
}
}
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 {
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);
}
/**
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;
}
lm_request->request = NULL;
}
r->handler(r->data, NULL);
- cbdataReferenceDone(r->data);
- authenticateStateFree(r);
+ delete r;
}
ntlmauthenticators->ipc_type = IPC_STREAM;
helperStatefulOpenServers(ntlmauthenticators);
-
- CBDATA_INIT_TYPE(authenticateStateData);
}
}