#include "squid.h" #include "acl/Acl.h" #include "acl/FilledChecklist.h" #include "auth/UserRequest.h" #include "auth/Acl.h" #include "auth/AclProxyAuth.h" #include "HttpRequest.h" /** retval -1 user not authenticated (authentication error?) retval 0 user not authorized OR user authentication is in pgrogress retval +1 user authenticated and authorized */ int AuthenticateAcl(ACLChecklist *ch) { ACLFilledChecklist *checklist = Filled(ch); HttpRequest *request = checklist->request; http_hdr_type headertype; if (NULL == request) { fatal ("requiresRequest SHOULD have been true for this ACL!!"); return 0; } else if (request->flags.accelerated) { /* WWW authorization on accelerated requests */ headertype = HDR_AUTHORIZATION; } else if (request->flags.intercepted || request->flags.spoof_client_ip) { debugs(28, DBG_IMPORTANT, HERE << " authentication not applicable on intercepted requests."); return -1; } else { /* Proxy authorization on proxy requests */ headertype = HDR_PROXY_AUTHORIZATION; } /* 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: debugs(28, 4, HERE << "returning 0 user authenticated but not authorised."); return 0; case AUTH_AUTHENTICATED: return 1; break; case AUTH_ACL_HELPER: debugs(28, 4, HERE << "returning 0 sending credentials to helper."); checklist->changeState(ProxyAuthLookup::Instance()); return 0; case AUTH_ACL_CHALLENGE: debugs(28, 4, HERE << "returning 0 sending authentication challenge."); checklist->changeState (ProxyAuthNeeded::Instance()); return 0; default: fatal("unexpected authenticateAuthenticate reply\n"); return 0; } }