link = link->next;
dlinkDelete(tmplink, &requests);
dlinkNodeDelete(tmplink);
- delete auth_user_request;
+ *auth_user_request = NULL;
}
/* free cached acl results */
debugs(29, 5, "AuthUserRequest::~AuthUserRequest: freeing request " << this);
if (user()) {
+ /* AYJ: something strange: in order to be deleted this object must not be
+ * referenced anywhere. Including the AuthUser list of requests.
+ * I expect the following loop to NEVER find a pointer to this request object.
+ */
+
/* unlink from the auth_user struct */
link = user()->requests.head;
- while (link && (link->data != this))
- link = link->next;
-
- assert(link != NULL);
+ while (link) {
- dlinkDelete(link, &user()->requests);
+ assert( static_cast<AuthUserRequest::Pointer*>(link->data)->getRaw() != this );
- dlinkNodeDelete(link);
+ if (static_cast<AuthUserRequest::Pointer*>(link->data)->getRaw() == this) {
+ dlinkDelete(link, &user()->requests);
+ dlinkNodeDelete(link);
+ }
+ link = link->next;
+ }
/* unlock the request structure's lock */
user()->unlock();
return basicScheme::GetInstance().type();
}
-AuthBasicUserRequest::AuthBasicUserRequest() : _theUser(NULL)
+AuthBasicUserRequest::AuthBasicUserRequest()
{}
AuthBasicUserRequest::~AuthBasicUserRequest()
virtual void authenticate(HttpRequest * request, ConnStateData *conn, http_hdr_type type);
virtual int module_direction();
virtual void module_start(RH *, void *);
- virtual AuthUser *user() {return _theUser;}
-
- virtual const AuthUser *user() const {return _theUser;}
-
- virtual void user (AuthUser *aUser) {_theUser=dynamic_cast<BasicUser *>(aUser);}
-
-private:
- BasicUser *_theUser;
};
MEMPROXY_CLASS_INLINE(AuthBasicUserRequest);
void
AuthDigestUserRequest::authenticate(HttpRequest * request, ConnStateData * conn, http_hdr_type type)
{
- AuthUser *auth_user;
AuthDigestUserRequest *digest_request;
digest_user_h *digest_user;
HASHHEX HA2 = "";
HASHHEX Response;
- assert(authUser() != NULL);
- auth_user = authUser();
-
- digest_user = dynamic_cast < digest_user_h * >(auth_user);
+ assert(user() != NULL);
+ AuthUser *auth_user = user();
+ digest_user = dynamic_cast<digest_user_h*>(auth_user);
assert(digest_user != NULL);
/* if the check has corrupted the user, just return */
/*link the request and the user */
assert(digest_request != NULL);
- digest_request->authUser (digest_user);
-
+ digest_user->lock();
digest_request->user(digest_user);
- digest_user->addRequest (digest_request);
+ digest_user->addRequest(digest_request);
debugs(29, 9, "username = '" << digest_user->username() << "'\nrealm = '" <<
digest_request->realm << "'\nqop = '" << digest_request->qop <<
DigestUser::DigestUser (AuthConfig *aConfig) : AuthUser (aConfig), HA1created (0)
{}
-AuthUser *
-AuthDigestUserRequest::authUser() const
-{
- return const_cast<AuthUser *>(user());
-}
-
-void
-AuthDigestUserRequest::authUser(AuthUser *aUser)
-{
- assert(!authUser());
- user(aUser);
- user()->lock();
-}
-
AuthDigestUserRequest::CredentialsState
AuthDigestUserRequest::credentials() const
{
AuthDigestUserRequest::AuthDigestUserRequest() : nonceb64(NULL) ,cnonce(NULL) ,realm(NULL),
pszPass(NULL) ,algorithm(NULL) ,pszMethod(NULL),
qop(NULL) ,uri(NULL) ,response(NULL),
- nonce(NULL), _theUser (NULL) ,
+ nonce(NULL),
credentials_ok (Unchecked)
{}
#endif
virtual void module_start(RH *, void *);
- virtual AuthUser *user() {return _theUser;}
-
- virtual const AuthUser *user() const {return _theUser;}
-
- virtual void user(AuthUser *aUser) {_theUser=dynamic_cast<DigestUser *>(aUser);}
CredentialsState credentials() const;
void credentials(CredentialsState);
- void authUser(AuthUser *);
- AuthUser *authUser() const;
+// void authUser(AuthUser *);
+// AuthUser *authUser() const;
char *nonceb64; /* "dcd98b7102dd2f0e8b11d0f600bfb0c093" */
char *cnonce; /* "0a4f113b" */
digest_nonce_h *nonce;
private:
- DigestUser *_theUser;
CredentialsState credentials_ok;
};
}
AuthNegotiateUserRequest::AuthNegotiateUserRequest() :
- /*conn(NULL),*/ auth_state(AUTHENTICATE_STATE_NONE),
- _theUser(NULL)
+ /*conn(NULL),*/ auth_state(AUTHENTICATE_STATE_NONE)
{
waiting=0;
client_blob=0;
virtual int module_direction();
virtual void onConnectionClose(ConnStateData *);
virtual void module_start(RH *, void *);
- virtual AuthUser *user() {return _theUser;}
-
- virtual const AuthUser *user() const {return _theUser;}
virtual void addHeader(HttpReply * rep, int accel);
- virtual void user (AuthUser *aUser) {_theUser=dynamic_cast<NegotiateUser *>(aUser);}
-
virtual const char * connLastHeader();
/*we need to store the helper server between requests */
/* need access to the request flags to mess around on pconn failure */
HttpRequest *request;
-
-private:
- /* the user */
- NegotiateUser * _theUser;
};
MEMPROXY_CLASS_INLINE(AuthNegotiateUserRequest);
}
AuthNTLMUserRequest::AuthNTLMUserRequest() :
- /*conn(NULL),*/ auth_state(AUTHENTICATE_STATE_NONE),
- _theUser(NULL)
+ /*conn(NULL),*/ auth_state(AUTHENTICATE_STATE_NONE)
{
waiting=0;
client_blob=0;
virtual int module_direction();
virtual void onConnectionClose(ConnStateData *);
virtual void module_start(RH *, void *);
- virtual AuthUser *user() {return _theUser;}
-
- virtual const AuthUser *user() const {return _theUser;}
-
- virtual void user (AuthUser *aUser) {_theUser=dynamic_cast<NTLMUser *>(aUser);}
virtual const char * connLastHeader();
/* need access to the request flags to mess around on pconn failure */
HttpRequest *request;
-
-private:
- /* the user */
- NTLMUser * _theUser;
};
MEMPROXY_CLASS_INLINE(AuthNTLMUserRequest);