Skip to content
This repository was archived by the owner on May 28, 2018. It is now read-only.

Commit 39931b3

Browse files
author
alessandro.gherardi
committed
If server supports both basic and digest auth, use digest
1 parent 1f46147 commit 39931b3

File tree

2 files changed

+45
-11
lines changed

2 files changed

+45
-11
lines changed

Diff for: connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/AuthTest.java

+30
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,25 @@ public String getFilter(@Context HttpHeaders h) {
168168
return "GET";
169169
}
170170

171+
@GET
172+
@Path("basicAndDigest")
173+
public String getBasicAndDigest(@Context HttpHeaders h) {
174+
String value = h.getRequestHeaders().getFirst("Authorization");
175+
if (value == null) {
176+
throw new WebApplicationException(
177+
Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"")
178+
.header("WWW-Authenticate", "Digest realm=\"WallyWorld\"")
179+
.entity("Forbidden").build());
180+
} else if (value.startsWith("Basic")) {
181+
throw new WebApplicationException(
182+
Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"")
183+
.header("WWW-Authenticate", "Digest realm=\"WallyWorld\"")
184+
.entity("Digest authentication expected").build());
185+
}
186+
187+
return "GET";
188+
}
189+
171190
@POST
172191
public String post(@Context HttpHeaders h, String e) {
173192
requestCount++;
@@ -259,6 +278,17 @@ public void testAuthGetWithClientFilter() {
259278
assertEquals("GET", r.request().get(String.class));
260279
}
261280

281+
@Test
282+
public void testAuthGetWithBasicAndDigestFilter() {
283+
ClientConfig cc = new ClientConfig();
284+
cc.connectorProvider(new ApacheConnectorProvider());
285+
Client client = ClientBuilder.newClient(cc);
286+
client.register(HttpAuthenticationFeature.universal("name", "password"));
287+
WebTarget r = client.target(getBaseUri()).path("test/basicAndDigest");
288+
289+
assertEquals("GET", r.request().get(String.class));
290+
}
291+
262292
@Test
263293
@Ignore("JERSEY-1750: Cannot retry request with a non-repeatable request entity. How to buffer the entity?"
264294
+ " Allow repeatable write in jersey?")

Diff for: core-client/src/main/java/org/glassfish/jersey/client/authentication/HttpAuthenticationFilter.java

+15-11
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@
4949
import java.util.List;
5050
import java.util.Map;
5151

52+
import javax.annotation.Priority;
5253
import javax.ws.rs.Priorities;
5354
import javax.ws.rs.client.Client;
54-
import javax.ws.rs.client.ClientBuilder;
5555
import javax.ws.rs.client.ClientRequestContext;
5656
import javax.ws.rs.client.ClientRequestFilter;
5757
import javax.ws.rs.client.ClientResponseContext;
@@ -66,8 +66,6 @@
6666
import javax.ws.rs.core.MultivaluedMap;
6767
import javax.ws.rs.core.Response;
6868

69-
import javax.annotation.Priority;
70-
7169
import org.glassfish.jersey.client.ClientProperties;
7270
import org.glassfish.jersey.client.internal.LocalizationMessages;
7371

@@ -222,15 +220,21 @@ public void filter(ClientRequestContext request, ClientResponseContext response)
222220
Type result = null; // which authentication is requested: BASIC or DIGEST
223221
boolean authenticate;
224222

223+
// If the server requests both BASIC and DIGEST, prefer DIGEST since it's stronger
224+
// (see https://tools.ietf.org/html/rfc2617#section-4.6)
225225
if (response.getStatus() == Response.Status.UNAUTHORIZED.getStatusCode()) {
226-
String authString = response.getHeaders().getFirst(HttpHeaders.WWW_AUTHENTICATE);
227-
if (authString != null) {
228-
final String upperCaseAuth = authString.trim().toUpperCase();
229-
if (upperCaseAuth.startsWith("BASIC")) {
230-
result = Type.BASIC;
231-
} else if (upperCaseAuth.startsWith("DIGEST")) {
232-
result = Type.DIGEST;
233-
} else {
226+
List<String> authStrings = response.getHeaders().get(HttpHeaders.WWW_AUTHENTICATE);
227+
if (authStrings != null) {
228+
for (String authString : authStrings) {
229+
final String upperCaseAuth = authString.trim().toUpperCase();
230+
if (result == null && upperCaseAuth.startsWith("BASIC")) {
231+
result = Type.BASIC;
232+
} else if (upperCaseAuth.startsWith("DIGEST")) {
233+
result = Type.DIGEST;
234+
}
235+
}
236+
237+
if (result == null) {
234238
// unknown authentication -> this filter cannot authenticate with this method
235239
return;
236240
}

0 commit comments

Comments
 (0)