summaryrefslogtreecommitdiffstats
path: root/container-core
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@vespa.ai>2023-11-17 13:57:59 +0100
committerBjørn Christian Seime <bjorncs@vespa.ai>2023-11-17 13:57:59 +0100
commit9203ba4ddcbabe3e9f7381f226ce47d84bea9ce8 (patch)
tree89c7f85f4eda0df6fd251754d7b169b48de87e31 /container-core
parentc2e103bc18a65fae30fac5b4abbec6882f598e39 (diff)
Allow filter to set principal
Diffstat (limited to 'container-core')
-rw-r--r--container-core/src/main/java/com/yahoo/restapi/RestApi.java2
-rw-r--r--container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java1
-rw-r--r--container-core/src/test/java/com/yahoo/restapi/RestApiImplTest.java12
3 files changed, 14 insertions, 1 deletions
diff --git a/container-core/src/main/java/com/yahoo/restapi/RestApi.java b/container-core/src/main/java/com/yahoo/restapi/RestApi.java
index 36daa618e3f..ee5628988c9 100644
--- a/container-core/src/main/java/com/yahoo/restapi/RestApi.java
+++ b/container-core/src/main/java/com/yahoo/restapi/RestApi.java
@@ -16,7 +16,6 @@ import com.yahoo.security.tls.ConnectionAuthContext;
import javax.net.ssl.SSLSession;
import java.io.InputStream;
import java.net.InetSocketAddress;
-import java.net.SocketAddress;
import java.security.Principal;
import java.util.List;
import java.util.Optional;
@@ -196,6 +195,7 @@ public interface RestApi {
interface FilterContext {
RequestContext requestContext();
String route();
+ void setPrincipal(Principal principal);
HttpResponse executeNext();
}
}
diff --git a/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java b/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java
index 7282d976675..090e06c221f 100644
--- a/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java
+++ b/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java
@@ -559,6 +559,7 @@ class RestApiImpl implements RestApi {
@Override public RestApi.RequestContext requestContext() { return requestContext; }
@Override public String route() { return route.name != null ? route.name : route.pathPattern; }
+ @Override public void setPrincipal(Principal p) { requestContext.request.getJDiscRequest().setUserPrincipal(p); }
HttpResponse executeFirst() { return filter.filterRequest(this); }
diff --git a/container-core/src/test/java/com/yahoo/restapi/RestApiImplTest.java b/container-core/src/test/java/com/yahoo/restapi/RestApiImplTest.java
index 95ccff1a075..d27e04bbd7a 100644
--- a/container-core/src/test/java/com/yahoo/restapi/RestApiImplTest.java
+++ b/container-core/src/test/java/com/yahoo/restapi/RestApiImplTest.java
@@ -182,6 +182,18 @@ class RestApiImplTest {
"{\"error-code\":\"BAD_REQUEST\",\"message\":\"Query parameter 'missing' is missing\"}");
}
+ @Test
+ void principal_from_filter_is_visible_to_handler() {
+ var restApi = RestApi.builder()
+ .addRoute(route("/api1").get(ctx -> ctx.userPrincipalOrThrow().getName()))
+ .addFilter(ctx -> {
+ ctx.setPrincipal(() -> "my-principal-name");
+ return ctx.executeNext();
+ })
+ .build();
+ verifyJsonResponse(restApi, Method.GET, "/api1", null, 200, "{\"message\":\"my-principal-name\"}");
+ }
+
private static void verifyJsonResponse(
RestApi restApi, Method method, String path, String requestContent, int expectedStatusCode,
String expectedJson) {