Skip to content

Commit 9416a04

Browse files
authored
Use relative links for ACL link headers (#731)
Resolves #728
1 parent 9d9d5c2 commit 9416a04

File tree

3 files changed

+22
-23
lines changed

3 files changed

+22
-23
lines changed

components/test/src/main/java/org/trellisldp/test/AbstractApplicationAuthTests.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
*/
1414
package org.trellisldp.test;
1515

16+
import static java.net.URI.create;
1617
import static javax.ws.rs.client.Entity.entity;
1718
import static javax.ws.rs.core.HttpHeaders.AUTHORIZATION;
1819
import static javax.ws.rs.core.HttpHeaders.LINK;
@@ -304,7 +305,9 @@ protected void setUp() {
304305
setPublicContainerChild(res.getLocation().toString());
305306
final String publicContainerAcl = getLinks(res).stream().filter(link -> link.getRel().equals(acl))
306307
.map(link -> link.getUri().toString()).findFirst().orElse("");
307-
assertEquals(getPublicContainer() + EXT_ACL, publicContainerAcl, "Check ACL location for 'public'");
308+
assertEquals(getPublicContainer() + EXT_ACL,
309+
create(getPublicContainer()).resolve(publicContainerAcl).toString(),
310+
"Check ACL location for 'public'");
308311
}
309312

310313
final String publicAcl = "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n"
@@ -336,7 +339,9 @@ protected void setUp() {
336339
setProtectedContainerChild(res.getLocation().toString());
337340
final String protectedContainerAcl = getLinks(res).stream().filter(link -> link.getRel().equals(acl))
338341
.map(link -> link.getUri().toString()).findFirst().orElse("");
339-
assertEquals(getProtectedContainer() + EXT_ACL, protectedContainerAcl, "Check 'protected' ACL URL");
342+
assertEquals(getProtectedContainer() + EXT_ACL,
343+
create(protectedContainer).resolve(protectedContainerAcl).toString(),
344+
"Check 'protected' ACL URL");
340345
}
341346

342347
final String protectedAcl = prefixAcl
@@ -370,7 +375,8 @@ protected void setUp() {
370375
setPrivateContainerChild(res.getLocation().toString());
371376
final String privateContainerAcl = getLinks(res).stream().filter(link -> link.getRel().equals(acl))
372377
.map(link -> link.getUri().toString()).findFirst().orElse("");
373-
assertEquals(getPrivateContainer() + EXT_ACL, privateContainerAcl, "Check 'private' ACL URL");
378+
assertEquals(getPrivateContainer() + EXT_ACL,
379+
create(privateContainer).resolve(privateContainerAcl).toString(), "Check 'private' ACL URL");
374380
}
375381

376382
final String privateAcl = prefixAcl
@@ -418,7 +424,8 @@ protected void setUp() {
418424
setGroupContainerChild(res.getLocation().toString());
419425
final String groupContainerAcl = getLinks(res).stream().filter(link -> link.getRel().equals(acl))
420426
.map(link -> link.getUri().toString()).findFirst().orElse("");
421-
assertEquals(getGroupContainer() + EXT_ACL, groupContainerAcl, "Check 'group' ACL URL");
427+
assertEquals(getGroupContainer() + EXT_ACL,
428+
create(groupContainer).resolve(groupContainerAcl).toString(), "Check 'group' ACL URL");
422429
}
423430

424431
final String groupAcl = prefixAcl
@@ -451,7 +458,8 @@ protected void setUp() {
451458
defaultContainerChild = res.getLocation().toString();
452459
final String defaultContainerAcl = getLinks(res).stream().filter(link -> link.getRel().equals(acl))
453460
.map(link -> link.getUri().toString()).findFirst().orElse("");
454-
assertEquals(getDefaultContainer() + EXT_ACL, defaultContainerAcl, "Check 'default' ACL URL");
461+
assertEquals(getDefaultContainer() + EXT_ACL,
462+
create(defaultContainer).resolve(defaultContainerAcl).toString(), "Check 'default' ACL URL");
455463
}
456464

457465
final String defaultAcl = "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n"

components/webac/src/main/java/org/trellisldp/webac/WebAcFilter.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import static javax.ws.rs.core.HttpHeaders.LINK;
2525
import static javax.ws.rs.core.Link.fromUri;
2626
import static javax.ws.rs.core.Response.Status.Family.SUCCESSFUL;
27+
import static javax.ws.rs.core.UriBuilder.fromPath;
2728
import static org.eclipse.microprofile.config.ConfigProvider.getConfig;
2829
import static org.slf4j.LoggerFactory.getLogger;
2930
import static org.trellisldp.api.TrellisUtils.TRELLIS_DATA_PREFIX;
@@ -45,7 +46,6 @@
4546
import javax.ws.rs.container.ContainerRequestFilter;
4647
import javax.ws.rs.container.ContainerResponseContext;
4748
import javax.ws.rs.container.ContainerResponseFilter;
48-
import javax.ws.rs.core.UriBuilder;
4949
import javax.ws.rs.ext.Provider;
5050

5151
import org.apache.commons.rdf.api.IRI;
@@ -199,8 +199,9 @@ public void filter(final ContainerRequestContext req, final ContainerResponseCon
199199
final boolean isAcl = req.getUriInfo().getQueryParameters()
200200
.getOrDefault(HttpConstants.EXT, emptyList()).contains(HttpConstants.ACL);
201201
final String rel = isAcl ? HttpConstants.ACL + " self" : HttpConstants.ACL;
202-
res.getHeaders().add(LINK, fromUri(getRequestUri(req).queryParam(HttpConstants.EXT, HttpConstants.ACL)
203-
.build()).rel(rel).build());
202+
final String path = req.getUriInfo().getPath();
203+
res.getHeaders().add(LINK, fromUri(fromPath(path.startsWith("/") ? path : "/" + path)
204+
.queryParam(HttpConstants.EXT, HttpConstants.ACL).build()).rel(rel).build());
204205
}
205206
}
206207

@@ -212,13 +213,6 @@ private boolean reqAudit(final ContainerRequestContext ctx) {
212213
return false;
213214
}
214215

215-
private UriBuilder getRequestUri(final ContainerRequestContext req) {
216-
if (baseUrl != null) {
217-
return UriBuilder.fromUri(baseUrl).path(req.getUriInfo().getPath());
218-
}
219-
return req.getUriInfo().getAbsolutePathBuilder();
220-
}
221-
222216
protected void verifyCanAppend(final Set<IRI> modes, final Session session, final String path) {
223217
if (!modes.contains(ACL.Append) && !modes.contains(ACL.Write)) {
224218
LOGGER.warn("User: {} cannot Append to {}", session.getAgent(), path);

components/webac/src/test/java/org/trellisldp/webac/WebAcFilterTest.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import javax.ws.rs.core.MultivaluedHashMap;
3737
import javax.ws.rs.core.MultivaluedMap;
3838
import javax.ws.rs.core.SecurityContext;
39-
import javax.ws.rs.core.UriBuilder;
4039
import javax.ws.rs.core.UriInfo;
4140

4241
import org.apache.commons.rdf.api.IRI;
@@ -340,7 +339,6 @@ void testFilterResponse() {
340339
final MultivaluedMap<String, Object> headers = new MultivaluedHashMap<>();
341340
when(mockResponseContext.getStatusInfo()).thenReturn(OK);
342341
when(mockResponseContext.getHeaders()).thenReturn(headers);
343-
when(mockUriInfo.getAbsolutePathBuilder()).thenReturn(UriBuilder.fromUri("http://localhost/"));
344342

345343
final WebAcFilter filter = new WebAcFilter(mockWebAcService, asList("Foo", "Bar"), "my-realm", "", null);
346344

@@ -351,7 +349,7 @@ void testFilterResponse() {
351349
final Link link = (Link) headers.getFirst("Link");
352350
assertNotNull(link);
353351
assertEquals("acl", link.getRel());
354-
assertEquals("http://localhost/?ext=acl", link.getUri().toString());
352+
assertEquals("/?ext=acl", link.getUri().toString());
355353
}
356354

357355
@Test
@@ -360,7 +358,6 @@ void testFilterResponseDelete() {
360358
when(mockContext.getMethod()).thenReturn(DELETE);
361359
when(mockResponseContext.getStatusInfo()).thenReturn(OK);
362360
when(mockResponseContext.getHeaders()).thenReturn(headers);
363-
when(mockUriInfo.getAbsolutePathBuilder()).thenReturn(UriBuilder.fromUri("http://localhost/"));
364361

365362
final WebAcFilter filter = new WebAcFilter(mockWebAcService, asList("Foo", "Bar"), "my-realm", "", null);
366363

@@ -374,6 +371,7 @@ void testFilterResponseBaseUrl() {
374371
final MultivaluedMap<String, Object> headers = new MultivaluedHashMap<>();
375372
when(mockResponseContext.getStatusInfo()).thenReturn(OK);
376373
when(mockResponseContext.getHeaders()).thenReturn(headers);
374+
when(mockUriInfo.getPath()).thenReturn("/path");
377375

378376
final WebAcFilter filter = new WebAcFilter(mockWebAcService, asList("Foo", "Bar"), "my-realm", "",
379377
"http://example.com/");
@@ -385,7 +383,7 @@ void testFilterResponseBaseUrl() {
385383
final Link link = (Link) headers.getFirst("Link");
386384
assertNotNull(link);
387385
assertEquals("acl", link.getRel());
388-
assertEquals("http://example.com/?ext=acl", link.getUri().toString());
386+
assertEquals("/path?ext=acl", link.getUri().toString());
389387
}
390388

391389
@Test
@@ -397,7 +395,7 @@ void testFilterResponseWebac2() {
397395
when(mockResponseContext.getStatusInfo()).thenReturn(OK);
398396
when(mockResponseContext.getHeaders()).thenReturn(headers);
399397
when(mockUriInfo.getQueryParameters()).thenReturn(params);
400-
when(mockUriInfo.getAbsolutePathBuilder()).thenReturn(UriBuilder.fromUri("http://localhost/"));
398+
when(mockUriInfo.getPath()).thenReturn("path/");
401399

402400
final WebAcFilter filter = new WebAcFilter(mockWebAcService, asList("Foo", "Bar"), "my-realm", "", null);
403401

@@ -408,8 +406,7 @@ void testFilterResponseWebac2() {
408406
assertNotNull(link);
409407
assertTrue(link.getRels().contains("acl"));
410408
assertTrue(link.getRels().contains("self"));
411-
assertEquals("http://localhost/?ext=acl", link.getUri().toString());
412-
409+
assertEquals("/path/?ext=acl", link.getUri().toString());
413410
}
414411

415412
@Test

0 commit comments

Comments
 (0)