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

Commit a5d31bd

Browse files
author
alessandro.gherardi
committed
Exclude query parameters when caching authentication info
1 parent 88c6d7d commit a5d31bd

File tree

3 files changed

+98
-7
lines changed

3 files changed

+98
-7
lines changed

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

+57
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import javax.ws.rs.core.Context;
5454
import javax.ws.rs.core.HttpHeaders;
5555
import javax.ws.rs.core.Response;
56+
import javax.ws.rs.core.UriInfo;
5657

5758
import javax.inject.Singleton;
5859

@@ -140,6 +141,8 @@ public void testPreemptiveAuthPost() {
140141
public static class AuthResource {
141142

142143
int requestCount = 0;
144+
int queryParamsBasicRequestCount = 0;
145+
int queryParamsDigestRequestCount = 0;
143146

144147
@GET
145148
public String get(@Context HttpHeaders h) {
@@ -229,6 +232,30 @@ public String deleteFilterWithEntity(@Context HttpHeaders h, String e) {
229232

230233
return e;
231234
}
235+
236+
@GET
237+
@Path("queryParamsBasic")
238+
public String getQueryParamsBasic(@Context HttpHeaders h, @Context UriInfo uriDetails) {
239+
queryParamsBasicRequestCount++;
240+
String value = h.getRequestHeaders().getFirst("Authorization");
241+
if (value == null) {
242+
throw new WebApplicationException(
243+
Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
244+
}
245+
return "GET " + queryParamsBasicRequestCount;
246+
}
247+
248+
@GET
249+
@Path("queryParamsDigest")
250+
public String getQueryParamsDigest(@Context HttpHeaders h, @Context UriInfo uriDetails) {
251+
queryParamsDigestRequestCount++;
252+
String value = h.getRequestHeaders().getFirst("Authorization");
253+
if (value == null) {
254+
throw new WebApplicationException(
255+
Response.status(401).header("WWW-Authenticate", "Digest realm=\"WallyWorld\"").build());
256+
}
257+
return "GET " + queryParamsDigestRequestCount;
258+
}
232259
}
233260

234261
@Test
@@ -372,4 +399,34 @@ public void testAuthInteractivePost() {
372399

373400
assertEquals("POST", r.request().post(Entity.text("POST"), String.class));
374401
}
402+
403+
@Test
404+
public void testAuthGetQueryParamsBasic() {
405+
ClientConfig cc = new ClientConfig();
406+
cc.connectorProvider(new ApacheConnectorProvider());
407+
Client client = ClientBuilder.newClient(cc);
408+
client.register(HttpAuthenticationFeature.universal("name", "password"));
409+
410+
WebTarget r = client.target(getBaseUri()).path("test/queryParamsBasic");
411+
assertEquals("GET 2", r.request().get(String.class));
412+
413+
r = client.target(getBaseUri()).path("test/queryParamsBasic").queryParam("param1", "value1").queryParam("param2", "value2");
414+
assertEquals("GET 3", r.request().get(String.class));
415+
416+
}
417+
418+
@Test
419+
public void testAuthGetQueryParamsDigest() {
420+
ClientConfig cc = new ClientConfig();
421+
cc.connectorProvider(new ApacheConnectorProvider());
422+
Client client = ClientBuilder.newClient(cc);
423+
client.register(HttpAuthenticationFeature.universal("name", "password"));
424+
425+
WebTarget r = client.target(getBaseUri()).path("test/queryParamsDigest");
426+
assertEquals("GET 2", r.request().get(String.class));
427+
428+
r = client.target(getBaseUri()).path("test/queryParamsDigest").queryParam("param1", "value1").queryParam("param2", "value2");
429+
assertEquals("GET 3", r.request().get(String.class));
430+
431+
}
375432
}

core-client/src/main/java/org/glassfish/jersey/client/authentication/DigestAuthenticator.java

+23-3
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242

4343
import java.io.IOException;
4444
import java.net.URI;
45+
import java.net.URISyntaxException;
4546
import java.security.MessageDigest;
4647
import java.security.NoSuchAlgorithmException;
4748
import java.security.SecureRandom;
@@ -114,7 +115,7 @@ protected boolean removeEldestEntry(final Map.Entry eldest) {
114115
* @throws IOException When error with encryption occurs.
115116
*/
116117
boolean filterRequest(final ClientRequestContext request) throws IOException {
117-
final DigestScheme digestScheme = digestCache.get(request.getUri());
118+
final DigestScheme digestScheme = digestCache.get(getCacheKey(request));
118119
if (digestScheme != null) {
119120
final HttpAuthenticationFilter.Credentials cred = HttpAuthenticationFilter.getCredentials(request,
120121
this.credentials, HttpAuthenticationFilter.Type.DIGEST);
@@ -155,10 +156,11 @@ public boolean filterResponse(final ClientRequestContext request, final ClientRe
155156

156157
final boolean success = HttpAuthenticationFilter.repeatRequest(request, response, createNextAuthToken(digestScheme,
157158
request, cred));
159+
URI cacheKey = getCacheKey(request);
158160
if (success) {
159-
digestCache.put(request.getUri(), digestScheme);
161+
digestCache.put(cacheKey, digestScheme);
160162
} else {
161-
digestCache.remove(request.getUri());
163+
digestCache.remove(cacheKey);
162164
}
163165
return success;
164166
}
@@ -373,6 +375,24 @@ private String randomBytes(final int nbBytes) {
373375
return bytesToHex(bytes);
374376
}
375377

378+
private URI getCacheKey(ClientRequestContext request) {
379+
URI requestUri = request.getUri();
380+
if (requestUri.getRawQuery() != null) {
381+
// Return a URI without the query part of the request URI
382+
try {
383+
return new URI(
384+
requestUri.getScheme(),
385+
requestUri.getAuthority(),
386+
requestUri.getPath(),
387+
null,
388+
requestUri.getFragment());
389+
} catch (URISyntaxException e) {
390+
// Ignore and fall through
391+
}
392+
}
393+
return requestUri;
394+
}
395+
376396
private enum QOP {
377397

378398
UNSPECIFIED(null),

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

+18-4
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,16 @@
4343
import java.io.IOException;
4444
import java.io.InputStream;
4545
import java.net.URI;
46+
import java.net.URISyntaxException;
4647
import java.nio.charset.Charset;
4748
import java.util.Collections;
4849
import java.util.LinkedHashMap;
4950
import java.util.List;
5051
import java.util.Map;
5152

53+
import javax.annotation.Priority;
5254
import javax.ws.rs.Priorities;
5355
import javax.ws.rs.client.Client;
54-
import javax.ws.rs.client.ClientBuilder;
5556
import javax.ws.rs.client.ClientRequestContext;
5657
import javax.ws.rs.client.ClientRequestFilter;
5758
import javax.ws.rs.client.ClientResponseContext;
@@ -66,8 +67,6 @@
6667
import javax.ws.rs.core.MultivaluedMap;
6768
import javax.ws.rs.core.Response;
6869

69-
import javax.annotation.Priority;
70-
7170
import org.glassfish.jersey.client.ClientProperties;
7271
import org.glassfish.jersey.client.internal.LocalizationMessages;
7372

@@ -271,7 +270,22 @@ public void filter(ClientRequestContext request, ClientResponseContext response)
271270
}
272271

273272
private String getCacheKey(ClientRequestContext request) {
274-
return request.getUri().toString() + ":" + request.getMethod();
273+
URI requestUri = request.getUri();
274+
if (requestUri.getRawQuery() != null) {
275+
// Build a URI without the query part of the request URI
276+
try {
277+
URI requestUriWithoutQuery = new URI(
278+
requestUri.getScheme(),
279+
requestUri.getAuthority(),
280+
requestUri.getPath(),
281+
null,
282+
requestUri.getFragment());
283+
return requestUriWithoutQuery.toString() + ":" + request.getMethod();
284+
} catch (URISyntaxException e) {
285+
// Ignore and fall through
286+
}
287+
}
288+
return requestUri.toString() + ":" + request.getMethod();
275289
}
276290

277291
private void updateCache(ClientRequestContext request, boolean success, Type operation) {

0 commit comments

Comments
 (0)