35 if (
user() !=
nullptr)
36 return user()->username();
50 startHelperLookup(request, al, handler, data);
56 debugs(29, 9,
"Validating Auth::UserRequest '" <<
this <<
"'.");
58 if (user() ==
nullptr) {
59 debugs(29, 4,
"No associated Auth::User data");
64 debugs(29, 4,
"Auth::User '" << user() <<
"' uses unknown scheme.");
69 debugs(29, 4,
"Auth::User '" << user() <<
"' is broken for it's scheme.");
76 debugs(29, 5,
"Validated. Auth::UserRequest '" <<
this <<
"'.");
81Auth::UserRequest::operator
new (
size_t)
83 fatal(
"Auth::UserRequest not directly allocatable\n");
88Auth::UserRequest::operator
delete (
void *)
90 fatal(
"Auth::UserRequest child failed to override operator delete\n");
98 debugs(29, 5,
"initialised request " <<
this);
104 debugs(29, 5,
"freeing request " <<
this);
106 if (user() !=
nullptr) {
130 if (getDenyMessage() ==
nullptr)
131 return default_message;
133 return getDenyMessage();
139 const auto u = user();
140 if (u && u->credentials() ==
Auth::Ok) {
157 auth_user->
addIp(ipaddr);
174 if (auth_user_request !=
nullptr)
181 assert(auth_user_request !=
nullptr);
192 if (!auth_user_request || !auth_user_request->
valid())
201 if (user() ==
nullptr)
207 return module_direction();
225 fatal(
"Auth::UserRequest::connLastHeader should always be overridden by conn based auth schemes");
248 if (auth_user_request !=
nullptr)
249 res = auth_user_request;
252 else if (conn !=
nullptr)
256 if (request !=
nullptr && res !=
nullptr && res->
user() !=
nullptr) {
291 const char *proxy_auth;
306 debugs(29, 4,
"No Proxy-Auth header and no working alternative. Requesting auth header.");
311 if (conn !=
nullptr) {
312 conn->
setAuth(
nullptr,
"HTTP request missing credentials");
315 *auth_user_request =
nullptr;
324 if (proxy_auth && conn !=
nullptr && conn->
getAuth() !=
nullptr &&
328 debugs(29, 2,
"WARNING: DUPLICATE AUTH - authentication header on already authenticated connection!. AU " <<
329 conn->
getAuth() <<
", Current user '" <<
338 assert(*auth_user_request ==
nullptr);
339 conn->
setAuth(
nullptr,
"changed credentials token");
344 debugs(29, 9,
"header " << (proxy_auth ? proxy_auth :
"-") <<
".");
346 if (*auth_user_request ==
nullptr) {
347 if (conn !=
nullptr) {
357 "' to '" << proxy_auth <<
"' (client " <<
360 conn->
setAuth(
nullptr,
"changed auth scheme");
366 debugs(29, 4,
"No connection authentication type");
369 if (*auth_user_request ==
nullptr)
371 else if (!(*auth_user_request)->valid()) {
375 if ((*auth_user_request)->username()) {
379 *auth_user_request =
nullptr;
387 if (conn->
getAuth() !=
nullptr) {
388 *auth_user_request = conn->
getAuth();
391 debugs(29, 4,
"Auth user request " << *auth_user_request <<
" conn-auth missing and failed to authenticate.");
392 *auth_user_request =
nullptr;
402 switch ((*auth_user_request)->direction()) {
409 *auth_user_request =
nullptr;
414 *auth_user_request =
nullptr;
427 if ((*auth_user_request)->username()) {
433 *auth_user_request =
nullptr;
485 if (answer.allowed())
516 debugs(29, 9,
"headertype:" << type <<
" authuser:" << auth_user_request);
529 for (
auto *scheme : configs) {
530 if (scheme->active()) {
531 if (auth_user_request !=
nullptr && auth_user_request->
scheme()->type() == scheme->type())
532 scheme->fixHeader(auth_user_request, rep, type, request);
534 scheme->fixHeader(
nullptr, rep, type, request);
536 debugs(29, 4,
"Configured scheme " << scheme->type() <<
" not Active");
546 if (auth_user_request !=
nullptr) {
568 reqFmt->assemble(mb, al, 0);
579 auto messageNote = reply.
notes.
find(
"message");
582 messageNote =
ToSBuf(proto,
" Authentication denied with no reason given");
585 setDenyMessage(messageNote->c_str());
@ AUTH_ACL_CANNOT_AUTHENTICATE
void UpdateRequestNotes(ConnStateData *csd, HttpRequest &request, NotePairs const &helperNotes)
static Auth::ConfigVector & schemesConfig(HttpRequest *request, HttpReply *rep)
void authenticateAuthUserRequestClearIp(Auth::UserRequest::Pointer auth_user_request)
void authenticateAuthUserRequestRemoveIp(Auth::UserRequest::Pointer auth_user_request, Ip::Address const &ipaddr)
static void authenticateAuthUserRequestSetIp(Auth::UserRequest::Pointer auth_user_request, Ip::Address &ipaddr)
static Auth::UserRequest::Pointer authTryGetUser(Auth::UserRequest::Pointer auth_user_request, ConnStateData *conn, HttpRequest *request)
int authenticateAuthUserRequestIPCount(Auth::UserRequest::Pointer auth_user_request)
bool authenticateUserAuthenticated(const Auth::UserRequest::Pointer &auth_user_request)
static void authenticateAuthenticateUser(Auth::UserRequest::Pointer auth_user_request, HttpRequest *request, ConnStateData *conn, Http::HdrType type)
static void authenticate(int socket_fd, const char *username, const char *passwd)
Acl::Answer const & fastCheck()
void updateReply(const HttpReply::Pointer &)
Auth::ConfigVector schemes
set of auth_params directives
acl_access * schemeAccess
the ACL list for auth_schemes directives
std::vector< Auth::SchemesConfig > schemeLists
set of auth_schemes directives
virtual void fixHeader(UserRequest::Pointer, HttpReply *, Http::HdrType, HttpRequest *)=0
virtual const char * type() const =0
static SchemeConfig * Find(const char *proxy_auth)
static UserRequest::Pointer CreateAuthUser(const char *proxy_auth, AccessLogEntry::Pointer &al)
static Scheme::Pointer Find(const char *)
virtual void addAuthenticationInfoHeader(HttpReply *rep, int accel)
static AuthAclState tryToAuthenticateAndSetAuthUser(UserRequest::Pointer *aUR, Http::HdrType, HttpRequest *, ConnStateData *, Ip::Address &, AccessLogEntry::Pointer &)
const char * helperRequestKeyExtras(HttpRequest *, AccessLogEntry::Pointer &al)
static void AddReplyAuthHeader(HttpReply *rep, UserRequest::Pointer auth_user_request, HttpRequest *request, int accelerated, int internal)
Add the appropriate [Proxy-]Authenticate header to the given reply.
void setDenyMessage(char const *)
virtual bool authenticated() const
void denyMessageFromHelper(char const *proto, const Helper::Reply &reply)
Sets the reason of 'authentication denied' helper response.
Scheme::Pointer scheme() const
virtual void releaseAuthServer()
virtual void addAuthenticationInfoTrailer(HttpReply *rep, int accel)
char const * denyMessage(char const *const default_message=nullptr) const
void start(HttpRequest *request, AccessLogEntry::Pointer &al, AUTHCB *handler, void *data)
char const * getDenyMessage() const
virtual const char * connLastHeader()
char const * username() const
virtual User::Pointer user()
virtual void authenticate(HttpRequest *request, ConnStateData *conn, Http::HdrType type)=0
Auth::SchemeConfig * config
NotePairs notes
list of key=value pairs the helper produced
void removeIp(Ip::Address)
void setAuth(const Auth::UserRequest::Pointer &aur, const char *cause)
const Auth::UserRequest::Pointer & getAuth() const
Auth::UserRequest::Pointer auth_user_request
Http::StatusCode status() const
retrieve the status code for this status line
char * content()
start of the added data
std::optional< SBuf > find(const char *noteKey, const char *sep=",") const
Comm::ConnectionPointer clientConnection
#define debugs(SECTION, LEVEL, CONTENT)
void fatal(const char *message)
std::vector< Auth::SchemeConfig * > ConfigVector
@ CRED_ERROR
ERROR in the auth module. Cannot determine the state of this request.
@ CRED_CHALLENGE
Client needs to be challenged. secure token.
@ CRED_LOOKUP
Credentials need to be validated with the backend helper.
@ CRED_VALID
Credentials are valid and a up to date. The OK/Failed state is accurate.
@ scProxyAuthenticationRequired
SBuf ToSBuf(Args &&... args)
slowly stream-prints all arguments into a freshly allocated SBuf