Skip to content

Commit 501befb

Browse files
authored
Merge pull request #3862 from agherardi/authCache
Exclude query parameters when caching authentication info
2 parents 2f8baf1 + 181fd5d commit 501befb

File tree

4 files changed

+114
-7
lines changed

4 files changed

+114
-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
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Copyright (c) 2013, 2018 Oracle and/or its affiliates. All rights reserved.
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Eclipse Public License v. 2.0, which is available at
6+
* http://www.eclipse.org/legal/epl-2.0.
7+
*
8+
* This Source Code may also be made available under the following Secondary
9+
* Licenses when the conditions for such availability set forth in the
10+
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
11+
* version 2 with the GNU Classpath Exception, which is available at
12+
* https://www.gnu.org/software/classpath/license.html.
13+
*
14+
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15+
*/
16+
17+
package org.glassfish.jersey.client.authentication;
18+
19+
import java.net.URI;
20+
import java.net.URISyntaxException;
21+
22+
import javax.ws.rs.client.ClientRequestContext;
23+
24+
/**
25+
* Common authentication utilities
26+
*/
27+
class AuthenticationUtil {
28+
static URI getCacheKey(ClientRequestContext request) {
29+
URI requestUri = request.getUri();
30+
if (requestUri.getRawQuery() != null) {
31+
// Return a URI without the query part of the request URI
32+
try {
33+
return new URI(
34+
requestUri.getScheme(),
35+
requestUri.getAuthority(),
36+
requestUri.getPath(),
37+
null,
38+
requestUri.getFragment());
39+
} catch (URISyntaxException e) {
40+
// Ignore and fall through
41+
}
42+
}
43+
return requestUri;
44+
}
45+
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ protected boolean removeEldestEntry(final Map.Entry eldest) {
9090
* @throws IOException When error with encryption occurs.
9191
*/
9292
boolean filterRequest(final ClientRequestContext request) throws IOException {
93-
final DigestScheme digestScheme = digestCache.get(request.getUri());
93+
final DigestScheme digestScheme = digestCache.get(AuthenticationUtil.getCacheKey(request));
9494
if (digestScheme != null) {
9595
final HttpAuthenticationFilter.Credentials cred = HttpAuthenticationFilter.getCredentials(request,
9696
this.credentials, HttpAuthenticationFilter.Type.DIGEST);
@@ -131,10 +131,11 @@ public boolean filterResponse(final ClientRequestContext request, final ClientRe
131131

132132
final boolean success = HttpAuthenticationFilter.repeatRequest(request, response, createNextAuthToken(digestScheme,
133133
request, cred));
134+
URI cacheKey = AuthenticationUtil.getCacheKey(request);
134135
if (success) {
135-
digestCache.put(request.getUri(), digestScheme);
136+
digestCache.put(cacheKey, digestScheme);
136137
} else {
137-
digestCache.remove(request.getUri());
138+
digestCache.remove(cacheKey);
138139
}
139140
return success;
140141
}

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
import java.util.List;
2626
import java.util.Map;
2727

28+
import javax.annotation.Priority;
2829
import javax.ws.rs.Priorities;
2930
import javax.ws.rs.client.Client;
30-
import javax.ws.rs.client.ClientBuilder;
3131
import javax.ws.rs.client.ClientRequestContext;
3232
import javax.ws.rs.client.ClientRequestFilter;
3333
import javax.ws.rs.client.ClientResponseContext;
@@ -42,8 +42,6 @@
4242
import javax.ws.rs.core.MultivaluedMap;
4343
import javax.ws.rs.core.Response;
4444

45-
import javax.annotation.Priority;
46-
4745
import org.glassfish.jersey.client.ClientProperties;
4846
import org.glassfish.jersey.client.internal.LocalizationMessages;
4947

@@ -247,7 +245,7 @@ public void filter(ClientRequestContext request, ClientResponseContext response)
247245
}
248246

249247
private String getCacheKey(ClientRequestContext request) {
250-
return request.getUri().toString() + ":" + request.getMethod();
248+
return AuthenticationUtil.getCacheKey(request).toString() + ":" + request.getMethod();
251249
}
252250

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

0 commit comments

Comments
 (0)