}
char *p = buf;
+ bool sawNA = false;
// optimization: do not consider parsing result code if the response is short.
// URL-rewriter may return relative URLs or empty response for a large portion
// NTLM fail-closed ERR response
result = HelperReply::Error;
p+=3;
+ sawNA=true;
}
for (; xisspace(*p); ++p); // skip whitespace
// NULL-terminate so the helper callback handlers do not buffer-overrun
other_.terminate();
- parseResponseKeys();
+ // Hack for backward-compatibility: Do not parse for kv-pairs on NA response
+ if (!sawNA)
+ parseResponseKeys();
- // Hack for backward-compatibility: BH used to be a text message...
- if (other().hasContent() && result == HelperReply::BrokenHelper) {
+ // Hack for backward-compatibility: BH and NA used to be a text message...
+ if (other().hasContent() && (sawNA || result == HelperReply::BrokenHelper)) {
notes.add("message",other().content());
modifiableOther().clean();
}
case HelperReply::Error: {
Note::Pointer messageNote = reply.notes.find("message");
Note::Pointer tokenNote = reply.notes.find("token");
- if (tokenNote == NULL) {
- /* protocol error */
- fatalf("authenticateNegotiateHandleReply: *** Unsupported helper response ***, '%s'\n", reply.other().content());
- break;
- }
/* authentication failure (wrong password, etc.) */
- auth_user_request->denyMessage(messageNote->firstValue());
+ if (messageNote != NULL) {
+ auth_user_request->denyMessage(messageNote->firstValue());
+ else
+ auth_user_request->denyMessage("Negotiate Authentication denied with no reason given");
auth_user_request->user()->credentials(Auth::Failed);
safe_free(lm_request->server_blob);
- lm_request->server_blob = xstrdup(tokenNote->firstValue());
+ if (tokenNote != NULL)
+ lm_request->server_blob = xstrdup(tokenNote->firstValue());
lm_request->releaseAuthServer();
debugs(29, 4, HERE << "Failed validating user via Negotiate. Error returned '" << reply << "'");
}