Skip to content

Commit dc8d4e7

Browse files
agherardialessandro.gherardi
authored andcommitted
Exclude query parameters when caching authentication info
Signed-off-by: agherardi <alessandro.gherardi@yahoo.com>
1 parent 02f2cb6 commit dc8d4e7

File tree

3 files changed

+104
-7
lines changed

3 files changed

+104
-7
lines changed

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

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import javax.ws.rs.core.Context;
3030
import javax.ws.rs.core.HttpHeaders;
3131
import javax.ws.rs.core.Response;
32+
import javax.ws.rs.core.UriInfo;
3233

3334
import javax.inject.Singleton;
3435

@@ -116,6 +117,8 @@ public void testPreemptiveAuthPost() {
116117
public static class AuthResource {
117118

118119
int requestCount = 0;
120+
int queryParamsBasicRequestCount = 0;
121+
int queryParamsDigestRequestCount = 0;
119122

120123
@GET
121124
public String get(@Context HttpHeaders h) {
@@ -205,6 +208,30 @@ public String deleteFilterWithEntity(@Context HttpHeaders h, String e) {
205208

206209
return e;
207210
}
211+
212+
@GET
213+
@Path("queryParamsBasic")
214+
public String getQueryParamsBasic(@Context HttpHeaders h, @Context UriInfo uriDetails) {
215+
queryParamsBasicRequestCount++;
216+
String value = h.getRequestHeaders().getFirst("Authorization");
217+
if (value == null) {
218+
throw new WebApplicationException(
219+
Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
220+
}
221+
return "GET " + queryParamsBasicRequestCount;
222+
}
223+
224+
@GET
225+
@Path("queryParamsDigest")
226+
public String getQueryParamsDigest(@Context HttpHeaders h, @Context UriInfo uriDetails) {
227+
queryParamsDigestRequestCount++;
228+
String value = h.getRequestHeaders().getFirst("Authorization");
229+
if (value == null) {
230+
throw new WebApplicationException(
231+
Response.status(401).header("WWW-Authenticate", "Digest realm=\"WallyWorld\"").build());
232+
}
233+
return "GET " + queryParamsDigestRequestCount;
234+
}
208235
}
209236

210237
@Test
@@ -348,4 +375,40 @@ public void testAuthInteractivePost() {
348375

349376
assertEquals("POST", r.request().post(Entity.text("POST"), String.class));
350377
}
378+
379+
@Test
380+
public void testAuthGetQueryParamsBasic() {
381+
ClientConfig cc = new ClientConfig();
382+
cc.connectorProvider(new ApacheConnectorProvider());
383+
Client client = ClientBuilder.newClient(cc);
384+
client.register(HttpAuthenticationFeature.universal("name", "password"));
385+
386+
WebTarget r = client.target(getBaseUri()).path("test/queryParamsBasic");
387+
assertEquals("GET 2", r.request().get(String.class));
388+
389+
r = client.target(getBaseUri())
390+
.path("test/queryParamsBasic")
391+
.queryParam("param1", "value1")
392+
.queryParam("param2", "value2");
393+
assertEquals("GET 3", r.request().get(String.class));
394+
395+
}
396+
397+
@Test
398+
public void testAuthGetQueryParamsDigest() {
399+
ClientConfig cc = new ClientConfig();
400+
cc.connectorProvider(new ApacheConnectorProvider());
401+
Client client = ClientBuilder.newClient(cc);
402+
client.register(HttpAuthenticationFeature.universal("name", "password"));
403+
404+
WebTarget r = client.target(getBaseUri()).path("test/queryParamsDigest");
405+
assertEquals("GET 2", r.request().get(String.class));
406+
407+
r = client.target(getBaseUri())
408+
.path("test/queryParamsDigest")
409+
.queryParam("param1", "value1")
410+
.queryParam("param2", "value2");
411+
assertEquals("GET 3", r.request().get(String.class));
412+
413+
}
351414
}

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

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.io.IOException;
2020
import java.net.URI;
21+
import java.net.URISyntaxException;
2122
import java.security.MessageDigest;
2223
import java.security.NoSuchAlgorithmException;
2324
import java.security.SecureRandom;
@@ -90,7 +91,7 @@ protected boolean removeEldestEntry(final Map.Entry eldest) {
9091
* @throws IOException When error with encryption occurs.
9192
*/
9293
boolean filterRequest(final ClientRequestContext request) throws IOException {
93-
final DigestScheme digestScheme = digestCache.get(request.getUri());
94+
final DigestScheme digestScheme = digestCache.get(getCacheKey(request));
9495
if (digestScheme != null) {
9596
final HttpAuthenticationFilter.Credentials cred = HttpAuthenticationFilter.getCredentials(request,
9697
this.credentials, HttpAuthenticationFilter.Type.DIGEST);
@@ -131,10 +132,11 @@ public boolean filterResponse(final ClientRequestContext request, final ClientRe
131132

132133
final boolean success = HttpAuthenticationFilter.repeatRequest(request, response, createNextAuthToken(digestScheme,
133134
request, cred));
135+
URI cacheKey = getCacheKey(request);
134136
if (success) {
135-
digestCache.put(request.getUri(), digestScheme);
137+
digestCache.put(cacheKey, digestScheme);
136138
} else {
137-
digestCache.remove(request.getUri());
139+
digestCache.remove(cacheKey);
138140
}
139141
return success;
140142
}
@@ -349,6 +351,24 @@ private String randomBytes(final int nbBytes) {
349351
return bytesToHex(bytes);
350352
}
351353

354+
private URI getCacheKey(ClientRequestContext request) {
355+
URI requestUri = request.getUri();
356+
if (requestUri.getRawQuery() != null) {
357+
// Return a URI without the query part of the request URI
358+
try {
359+
return new URI(
360+
requestUri.getScheme(),
361+
requestUri.getAuthority(),
362+
requestUri.getPath(),
363+
null,
364+
requestUri.getFragment());
365+
} catch (URISyntaxException e) {
366+
// Ignore and fall through
367+
}
368+
}
369+
return requestUri;
370+
}
371+
352372
private enum QOP {
353373

354374
UNSPECIFIED(null),

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

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,16 @@
1919
import java.io.IOException;
2020
import java.io.InputStream;
2121
import java.net.URI;
22+
import java.net.URISyntaxException;
2223
import java.nio.charset.Charset;
2324
import java.util.Collections;
2425
import java.util.LinkedHashMap;
2526
import java.util.List;
2627
import java.util.Map;
2728

29+
import javax.annotation.Priority;
2830
import javax.ws.rs.Priorities;
2931
import javax.ws.rs.client.Client;
30-
import javax.ws.rs.client.ClientBuilder;
3132
import javax.ws.rs.client.ClientRequestContext;
3233
import javax.ws.rs.client.ClientRequestFilter;
3334
import javax.ws.rs.client.ClientResponseContext;
@@ -42,8 +43,6 @@
4243
import javax.ws.rs.core.MultivaluedMap;
4344
import javax.ws.rs.core.Response;
4445

45-
import javax.annotation.Priority;
46-
4746
import org.glassfish.jersey.client.ClientProperties;
4847
import org.glassfish.jersey.client.internal.LocalizationMessages;
4948

@@ -247,7 +246,22 @@ public void filter(ClientRequestContext request, ClientResponseContext response)
247246
}
248247

249248
private String getCacheKey(ClientRequestContext request) {
250-
return request.getUri().toString() + ":" + request.getMethod();
249+
URI requestUri = request.getUri();
250+
if (requestUri.getRawQuery() != null) {
251+
// Build a URI without the query part of the request URI
252+
try {
253+
URI requestUriWithoutQuery = new URI(
254+
requestUri.getScheme(),
255+
requestUri.getAuthority(),
256+
requestUri.getPath(),
257+
null,
258+
requestUri.getFragment());
259+
return requestUriWithoutQuery.toString() + ":" + request.getMethod();
260+
} catch (URISyntaxException e) {
261+
// Ignore and fall through
262+
}
263+
}
264+
return requestUri.toString() + ":" + request.getMethod();
251265
}
252266

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

0 commit comments

Comments
 (0)