Skip to content

Commit 83b2ab4

Browse files
authored
fix path prefix detection (#294)
1 parent a8ec029 commit 83b2ab4

File tree

7 files changed

+72
-30
lines changed

7 files changed

+72
-30
lines changed

xtraplatform-auth/src/main/java/de/ii/xtraplatform/auth/infra/rest/OidcEndpoint.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.github.azahnen.dagger.annotations.AutoBind;
1111
import de.ii.xtraplatform.auth.domain.Oidc;
1212
import de.ii.xtraplatform.auth.domain.SplitCookie;
13+
import de.ii.xtraplatform.services.domain.ServicesContext;
1314
import de.ii.xtraplatform.web.domain.Endpoint;
1415
import de.ii.xtraplatform.web.domain.ForwardedUri;
1516
import de.ii.xtraplatform.web.domain.LoginHandler;
@@ -33,10 +34,13 @@
3334
@Singleton
3435
@AutoBind
3536
public class OidcEndpoint implements Endpoint, LoginHandler {
37+
38+
private final ServicesContext servicesContext;
3639
private final Oidc oidc;
3740

3841
@Inject
39-
public OidcEndpoint(Oidc oidc) {
42+
public OidcEndpoint(ServicesContext servicesContext, Oidc oidc) {
43+
this.servicesContext = servicesContext;
4044
this.oidc = oidc;
4145
}
4246

@@ -75,20 +79,22 @@ public Response getLogout(
7579

7680
private URI getCallbackUri(ContainerRequestContext containerRequestContext) {
7781
return URI.create(
78-
ForwardedUri.base(containerRequestContext).appendPath(PATH_CALLBACK).toString());
82+
ForwardedUri.base(containerRequestContext, servicesContext)
83+
.appendPath(PATH_CALLBACK)
84+
.toString());
7985
}
8086

8187
private URI getCallbackRedirectUri(
8288
ContainerRequestContext containerRequestContext, String redirectUri) {
8389
return URI.create(
84-
ForwardedUri.base(containerRequestContext)
90+
ForwardedUri.base(containerRequestContext, servicesContext)
8591
.appendPath(PATH_CALLBACK)
8692
.addParameter(LoginHandler.PARAM_LOGIN_REDIRECT_URI, redirectUri)
8793
.toString());
8894
}
8995

9096
private String getAssetsPrefix(ContainerRequestContext containerRequestContext) {
91-
return ForwardedUri.base(containerRequestContext)
97+
return ForwardedUri.base(containerRequestContext, servicesContext)
9298
.appendPath(StaticResourceHandler.PREFIX)
9399
.getPath();
94100
}

xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/AppContext.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@
88
package de.ii.xtraplatform.base.domain;
99

1010
import de.ii.xtraplatform.base.domain.Constants.ENV;
11-
import java.net.URI;
1211
import java.nio.file.Path;
1312

14-
public interface AppContext {
13+
public interface AppContext extends WebContext {
1514

1615
String getName();
1716

@@ -25,8 +24,6 @@ public interface AppContext {
2524

2625
AppConfiguration getConfiguration();
2726

28-
URI getUri();
29-
3027
String getInstanceName();
3128

3229
default boolean isDevEnv() {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright 2025 interactive instruments GmbH
3+
*
4+
* This Source Code Form is subject to the terms of the Mozilla Public
5+
* License, v. 2.0. If a copy of the MPL was not distributed with this
6+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
7+
*/
8+
package de.ii.xtraplatform.base.domain;
9+
10+
import com.google.common.base.Splitter;
11+
import com.google.common.base.Strings;
12+
import java.net.URI;
13+
import java.util.List;
14+
15+
public interface WebContext {
16+
17+
URI getUri();
18+
19+
default List<String> getPathPrefix() {
20+
return Strings.isNullOrEmpty(getUri().getPath())
21+
? List.of()
22+
: Splitter.on('/').trimResults().omitEmptyStrings().splitToList(getUri().getPath());
23+
}
24+
}

xtraplatform-services/src/main/java/de/ii/xtraplatform/services/app/ServicesContextImpl.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,27 @@
1111
import de.ii.xtraplatform.base.domain.AppContext;
1212
import de.ii.xtraplatform.services.domain.ServicesContext;
1313
import java.net.URI;
14+
import java.util.List;
1415
import javax.inject.Inject;
1516
import javax.inject.Singleton;
1617

1718
@Singleton
1819
@AutoBind
1920
public class ServicesContextImpl implements ServicesContext {
2021

21-
private final URI uri;
22+
private final AppContext appContext;
2223

2324
@Inject
2425
ServicesContextImpl(AppContext appContext) {
25-
this.uri = appContext.getUri();
26+
this.appContext = appContext;
2627
}
2728

2829
@Override
2930
public URI getUri() {
30-
return uri;
31+
return appContext.getUri();
32+
}
33+
34+
public List<String> getPathPrefix() {
35+
return appContext.getPathPrefix();
3136
}
3237
}

xtraplatform-services/src/main/java/de/ii/xtraplatform/services/app/ServicesEndpoint.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public class ServicesEndpoint implements Endpoint {
6969

7070
private final EntityRegistry entityRegistry;
7171
private final ServiceInjectableContext serviceContext;
72-
private final URI servicesUri;
72+
private final ServicesContext servicesContext;
7373
private final StaticResourceHandler staticResourceHandler;
7474
private final Lazy<Set<LoginHandler>> loginHandler;
7575

@@ -86,7 +86,7 @@ public ServicesEndpoint(
8686
Lazy<Set<ServiceEndpoint>> serviceResources,
8787
Lazy<Set<ServiceListingProvider>> serviceListingProviders) {
8888
this.entityRegistry = entityRegistry;
89-
this.servicesUri = servicesContext.getUri();
89+
this.servicesContext = servicesContext;
9090
this.serviceContext = serviceContext;
9191
this.staticResourceHandler = staticResourceHandler;
9292
this.loginHandler = loginHandler;
@@ -142,7 +142,9 @@ public Response getServices(
142142
Optional<Principal> user =
143143
Optional.ofNullable(containerRequestContext.getSecurityContext().getUserPrincipal());
144144
URICustomizer uriCustomizer =
145-
ForwardedUri.from(containerRequestContext).clearParameters().ensureNoTrailingSlash();
145+
ForwardedUri.from(containerRequestContext, servicesContext)
146+
.clearParameters()
147+
.ensureNoTrailingSlash();
146148
Response serviceListing = provider.get().getServiceListing(services, uriCustomizer, user);
147149

148150
return Response.ok().entity(serviceListing.getEntity()).type(mediaType).build();
@@ -194,7 +196,13 @@ public Response getLogin(
194196
.iterator()
195197
.next()
196198
.handle(
197-
containerRequestContext, redirectUri, scopes, servicesUri.getPath(), false, null, null);
199+
containerRequestContext,
200+
redirectUri,
201+
scopes,
202+
servicesContext.getUri().getPath(),
203+
false,
204+
null,
205+
null);
198206
}
199207

200208
@GET
@@ -215,7 +223,13 @@ public Response getCallback(
215223
.iterator()
216224
.next()
217225
.handle(
218-
containerRequestContext, redirectUri, null, servicesUri.getPath(), true, state, token);
226+
containerRequestContext,
227+
redirectUri,
228+
null,
229+
servicesContext.getUri().getPath(),
230+
true,
231+
state,
232+
token);
219233
}
220234

221235
@GET
@@ -304,7 +318,7 @@ private Service getService(String id, String callback) {
304318
}
305319

306320
private Optional<URI> getExternalUri() {
307-
return Optional.of(servicesUri);
321+
return Optional.of(servicesContext.getUri());
308322
}
309323

310324
private void openLoggingContext(ContainerRequestContext containerRequestContext) {

xtraplatform-services/src/main/java/de/ii/xtraplatform/services/domain/ServicesContext.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,6 @@
77
*/
88
package de.ii.xtraplatform.services.domain;
99

10-
import java.net.URI;
10+
import de.ii.xtraplatform.base.domain.WebContext;
1111

12-
public interface ServicesContext {
13-
14-
String STATIC_PREFIX = "___static___";
15-
16-
URI getUri();
17-
}
12+
public interface ServicesContext extends WebContext {}

xtraplatform-web/src/main/java/de/ii/xtraplatform/web/domain/ForwardedUri.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package de.ii.xtraplatform.web.domain;
99

1010
import com.google.common.base.Splitter;
11+
import de.ii.xtraplatform.base.domain.WebContext;
1112
import java.util.List;
1213
import javax.ws.rs.container.ContainerRequestContext;
1314

@@ -16,22 +17,22 @@ public interface ForwardedUri {
1617
String X_FORWARDED_PREFIX = "X-Forwarded-Prefix";
1718
Splitter PATH_SPLITTER = Splitter.on('/').trimResults().omitEmptyStrings();
1819

19-
static URICustomizer from(ContainerRequestContext requestContext) {
20+
static URICustomizer from(ContainerRequestContext requestContext, WebContext webContext) {
2021
return new URICustomizer(requestContext.getUriInfo().getRequestUri())
21-
.prependPathSegments(prefix(requestContext));
22+
.prependPathSegments(prefix(requestContext, webContext));
2223
}
2324

24-
static URICustomizer base(ContainerRequestContext requestContext) {
25+
static URICustomizer base(ContainerRequestContext requestContext, WebContext webContext) {
2526
return new URICustomizer(requestContext.getUriInfo().getRequestUri())
26-
.setPathSegments(prefix(requestContext))
27+
.setPathSegments(prefix(requestContext, webContext))
2728
.ensureNoTrailingSlash()
2829
.clearParameters();
2930
}
3031

31-
static List<String> prefix(ContainerRequestContext requestContext) {
32+
static List<String> prefix(ContainerRequestContext requestContext, WebContext webContext) {
3233
if (requestContext.getHeaders().containsKey(X_FORWARDED_PREFIX)) {
3334
return PATH_SPLITTER.splitToList(requestContext.getHeaderString(X_FORWARDED_PREFIX));
3435
}
35-
return List.of();
36+
return webContext.getPathPrefix();
3637
}
3738
}

0 commit comments

Comments
 (0)