From bb10adda6f2f41448d809c3fe86175b5b69cba7b Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Mon, 16 Apr 2018 19:19:13 -0400 Subject: [PATCH] Try again to mirror fix (Issue #5289) --- scheduler/client.c | 14 +++++++++++++- scheduler/client.h | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/scheduler/client.c b/scheduler/client.c index f68924aa1..1c4760bfd 100644 --- a/scheduler/client.c +++ b/scheduler/client.c @@ -818,6 +818,18 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ if (status == HTTP_STATUS_OK) { + /* + * Record whether the client is a web browser. "Mozilla" was the original + * and it seems that every web browser in existence now uses that as the + * prefix with additional information identifying *which* browser. + * + * Chrome (at least) has problems with multiple WWW-Authenticate values in + * a single header, so we only report Basic or Negotiate to web browsers and + * leave the multiple choices to the native CUPS client... + */ + + con->is_browser = !strncmp(httpGetField(con->http, HTTP_FIELD_USER_AGENT), "Mozilla/", 8); + if (httpGetField(con->http, HTTP_FIELD_ACCEPT_LANGUAGE)[0]) { /* @@ -2361,7 +2373,7 @@ cupsdSendHeader( strlcpy(auth_str, "Negotiate", sizeof(auth_str)); } - if (con->best && auth_type != CUPSD_AUTH_NEGOTIATE && + if (con->best && auth_type != CUPSD_AUTH_NEGOTIATE && !con->is_browser && !_cups_strcasecmp(httpGetHostname(con->http, NULL, 0), "localhost")) { /* diff --git a/scheduler/client.h b/scheduler/client.h index 7705f2c59..beddab0cc 100644 --- a/scheduler/client.h +++ b/scheduler/client.h @@ -30,6 +30,7 @@ struct cupsd_client_s struct timeval start; /* Request start time */ http_state_t operation; /* Request operation */ off_t bytes; /* Bytes transferred for this request */ + int is_browser; /* Is the client a web browser? */ int type; /* AuthType for username */ char username[HTTP_MAX_VALUE], /* Username from Authorization: line */