27Auth::Ntlm::UserRequest::UserRequest() :
34Auth::Ntlm::UserRequest::~UserRequest()
49Auth::Ntlm::UserRequest::connLastHeader()
55Auth::Ntlm::UserRequest::credentialsStr()
60 printResult = snprintf(buf,
sizeof(buf),
"YR %s\n", client_blob);
62 printResult = snprintf(buf,
sizeof(buf),
"KK %s\n", client_blob);
66 if (printResult < 0) {
67 debugs(29, 2,
"Can not build ntlm authentication credentials.");
69 }
else if (printResult >= (
int)
sizeof(buf))
70 debugs(29, 2,
"Ntlm authentication credentials truncated.");
76Auth::Ntlm::UserRequest::module_direction()
80 if (waiting || client_blob)
86 switch (user()->credentials()) {
99 debugs(29,
DBG_IMPORTANT,
"WARNING: NTLM Authentication in unexpected state: " << user()->credentials());
118 debugs(29, 8,
"credentials state is '" << user()->credentials() <<
"'");
120 const char *keyExtras = helperRequestKeyExtras(request, al);
124 printResult = snprintf(buf,
sizeof(buf),
"YR %s %s\n", client_blob, keyExtras);
126 printResult = snprintf(buf,
sizeof(buf),
"YR %s\n", client_blob);
129 printResult = snprintf(buf,
sizeof(buf),
"KK %s %s\n", client_blob, keyExtras);
131 printResult = snprintf(buf,
sizeof(buf),
"KK %s\n", client_blob);
135 if (printResult < 0 || printResult >= (
int)
sizeof(buf)) {
139 debugs(29,
DBG_CRITICAL,
"ERROR: Ntlm authentication helper request too big for the " <<
sizeof(buf) <<
"-byte buffer.");
154Auth::Ntlm::UserRequest::releaseAuthServer()
157 debugs(29, 6, reservationId);
159 reservationId.clear();
161 debugs(29, 6,
"No NTLM auth server to release.");
172 debugs(29,
DBG_IMPORTANT,
"WARNING: NTLM Authentication attempt to perform authentication without a connection!");
182 debugs(29, 2,
"need to challenge client '" << server_blob <<
"'!");
191 debugs(29, 4,
"WARNING: NTLM Authentication missing authorization header");
196 const char *blob = proxy_auth;
207 switch (user()->credentials()) {
211 debugs(29, 9,
"auth state ntlm none. Received blob: '" << proxy_auth <<
"'");
216 conn->
setAuth(
this,
"new NTLM handshake request");
237 fatal(
"Auth::Ntlm::UserRequest::authenticate: unexpected auth state DONE! Report a bug to the squid developers.\n");
242 debugs(29, 9,
"auth state ntlm failed. " << proxy_auth);
248Auth::Ntlm::UserRequest::HandleReply(
void *data,
const Helper::Reply &reply)
261 assert(auth_user_request !=
nullptr);
266 auth_user_request->
user()->notes.replaceOrAddOrAppend(&reply.
notes, appendables);
268 auth_user_request->
user()->notes.remove(
"token");
270 Auth::Ntlm::UserRequest *lm_request =
dynamic_cast<Auth::Ntlm::UserRequest *
>(auth_user_request.
getRaw());
271 assert(lm_request !=
nullptr);
272 assert(lm_request->waiting);
274 lm_request->waiting = 0;
280 if (!lm_request->reservationId)
290 if (lm_request->request)
291 lm_request->request->flags.mustKeepalive =
true;
293 if (lm_request->request && lm_request->request->flags.proxyKeepalive) {
295 lm_request->server_blob =
xstrdup(serverBlob);
298 debugs(29, 4,
"Need to challenge the client with a server token: '" << serverBlob <<
"'");
301 auth_user_request->
setDenyMessage(
"NTLM authentication requires a persistent connection");
311 lm_request->releaseAuthServer();
312 debugs(29,
DBG_CRITICAL,
"ERROR: NTLM Authentication helper returned no username. Result: " << reply);
315 auth_user_request->
user()->username(userLabel);
318 lm_request->releaseAuthServer();
320 debugs(29, 4,
"Successfully validated user via NTLM. Username '" << userLabel <<
"'");
322 debugs(29, 4,
"authenticated user " << auth_user_request->
user()->username());
324 auto local_auth_user = lm_request->user();
325 auto cached_user = Auth::Ntlm::User::Cache()->lookup(auth_user_request->
user()->userKey());
327 local_auth_user->addToNameCache();
333 cached_user->absorb(local_auth_user);
335 local_auth_user = cached_user;
336 auth_user_request->
user(local_auth_user);
342 debugs(29, 4,
"Successfully validated user via NTLM. Username '" << auth_user_request->
user()->username() <<
"'");
351 lm_request->releaseAuthServer();
352 debugs(29, 4,
"Failed validating user via NTLM. Result: " << reply);
372 lm_request->releaseAuthServer();
373 debugs(29,
DBG_IMPORTANT,
"ERROR: NTLM Authentication validating user. Result: " << reply);
377 if (lm_request->request) {
379 lm_request->request =
nullptr;
Helper::StatefulClientPointer ntlmauthenticators
int cbdataReferenceValid(const void *p)
static SchemeConfig * Find(const char *proxy_auth)
UserRequest::Pointer auth_user_request
void setDenyMessage(char const *)
void denyMessageFromHelper(char const *proto, const Helper::Reply &reply)
Sets the reason of 'authentication denied' helper response.
virtual User::Pointer user()
void setAuth(const Auth::UserRequest::Pointer &aur, const char *cause)
const Auth::UserRequest::Pointer & getAuth() const
Helper::ResultCode result
The helper response 'result' field.
Helper::ReservationId reservationId
The stateful replies should include the reservation ID.
std::vector< SBuf > Names
const char * findFirst(const char *noteKey) const
void cancelReservation(const Helper::ReservationId reservation)
undo reserveServer(), clear the reservation and kick the queue
#define debugs(SECTION, LEVEL, CONTENT)
void fatal(const char *message)
void helperStatefulSubmit(const statefulhelper::Pointer &hlp, const char *buf, HLPCB *callback, void *data, const Helper::ReservationId &reservation)
void HTTPMSGUNLOCK(M *&a)
void HTTPMSGLOCK(Http::Message *a)
@ 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.
#define MAX_AUTHTOKEN_LEN
struct timeval current_time
the current UNIX time in timeval {seconds, microseconds} format