From cd91e6cd80ab56a12d99a0940d38f8ee8286fd7b Mon Sep 17 00:00:00 2001 From: Morten Tokle Date: Thu, 22 Apr 2021 14:52:26 +0200 Subject: Provide standard mapping --- container-core/abi-spec.json | 41 ++++++++----- .../yahoo/container/jdisc/DefaultAclMapping.java | 29 --------- .../container/jdisc/HttpMethodAclMapping.java | 71 ++++++++++++++++++++++ .../yahoo/container/jdisc/RequestHandlerSpec.java | 2 +- 4 files changed, 99 insertions(+), 44 deletions(-) delete mode 100644 container-core/src/main/java/com/yahoo/container/jdisc/DefaultAclMapping.java create mode 100644 container-core/src/main/java/com/yahoo/container/jdisc/HttpMethodAclMapping.java (limited to 'container-core') diff --git a/container-core/abi-spec.json b/container-core/abi-spec.json index 43e0cab967e..9b139aacf3f 100644 --- a/container-core/abi-spec.json +++ b/container-core/abi-spec.json @@ -546,20 +546,6 @@ ], "fields": [] }, - "com.yahoo.container.jdisc.DefaultAclMapping": { - "superClass": "java.lang.Object", - "interfaces": [ - "com.yahoo.container.jdisc.AclMapping" - ], - "attributes": [ - "public" - ], - "methods": [ - "public void ()", - "public com.yahoo.container.jdisc.AclMapping$Action get(com.yahoo.container.jdisc.RequestView)" - ], - "fields": [] - }, "com.yahoo.container.jdisc.EmptyResponse": { "superClass": "com.yahoo.container.jdisc.HttpResponse", "interfaces": [], @@ -590,6 +576,33 @@ ], "fields": [] }, + "com.yahoo.container.jdisc.HttpMethodAclMapping$Builder": { + "superClass": "java.lang.Object", + "interfaces": [], + "attributes": [ + "public" + ], + "methods": [ + "public void ()", + "public com.yahoo.container.jdisc.HttpMethodAclMapping$Builder override(com.yahoo.jdisc.http.HttpRequest$Method, com.yahoo.container.jdisc.AclMapping$Action)", + "public com.yahoo.container.jdisc.HttpMethodAclMapping build()" + ], + "fields": [] + }, + "com.yahoo.container.jdisc.HttpMethodAclMapping": { + "superClass": "java.lang.Object", + "interfaces": [ + "com.yahoo.container.jdisc.AclMapping" + ], + "attributes": [ + "public" + ], + "methods": [ + "public com.yahoo.container.jdisc.AclMapping$Action get(com.yahoo.container.jdisc.RequestView)", + "public static com.yahoo.container.jdisc.HttpMethodAclMapping$Builder standard()" + ], + "fields": [] + }, "com.yahoo.container.jdisc.HttpRequest$Builder": { "superClass": "java.lang.Object", "interfaces": [], diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/DefaultAclMapping.java b/container-core/src/main/java/com/yahoo/container/jdisc/DefaultAclMapping.java deleted file mode 100644 index 93639029128..00000000000 --- a/container-core/src/main/java/com/yahoo/container/jdisc/DefaultAclMapping.java +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. - -package com.yahoo.container.jdisc; - -/** - * Default ACL mapping - * @author mortent - */ -public class DefaultAclMapping implements AclMapping { - - @Override - public Action get(RequestView requestMeta) { - switch (requestMeta.method()) { - case GET: - case HEAD: - case OPTIONS: - return Action.READ; - case POST: - case DELETE: - case PUT: - case PATCH: - case CONNECT: - case TRACE: - return Action.WRITE; - default: - throw new IllegalArgumentException("Illegal request method: " + requestMeta.method()); - } - } -} diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/HttpMethodAclMapping.java b/container-core/src/main/java/com/yahoo/container/jdisc/HttpMethodAclMapping.java new file mode 100644 index 00000000000..c40c4eb96a2 --- /dev/null +++ b/container-core/src/main/java/com/yahoo/container/jdisc/HttpMethodAclMapping.java @@ -0,0 +1,71 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +package com.yahoo.container.jdisc; + +import com.yahoo.jdisc.http.HttpRequest; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +import static com.yahoo.jdisc.http.HttpRequest.Method.CONNECT; +import static com.yahoo.jdisc.http.HttpRequest.Method.DELETE; +import static com.yahoo.jdisc.http.HttpRequest.Method.GET; +import static com.yahoo.jdisc.http.HttpRequest.Method.HEAD; +import static com.yahoo.jdisc.http.HttpRequest.Method.OPTIONS; +import static com.yahoo.jdisc.http.HttpRequest.Method.PATCH; +import static com.yahoo.jdisc.http.HttpRequest.Method.POST; +import static com.yahoo.jdisc.http.HttpRequest.Method.PUT; +import static com.yahoo.jdisc.http.HttpRequest.Method.TRACE; + +/** + * Acl Mapping based on http method. + * Defaults to: + * {GET, HEAD, OPTIONS} -> READ + * {POST, DELETE, PUT, PATCH, CONNECT, TRACE} -> WRITE + * @author mortent + */ +public class HttpMethodAclMapping implements AclMapping { + + private final Map mappings; + + private HttpMethodAclMapping(Map overrides) { + HashMap tmp = new HashMap<>(defaultMappings()); + tmp.putAll(overrides); + mappings = Map.copyOf(tmp); + } + + private static Map defaultMappings() { + return Map.of(GET, Action.READ, + HEAD, Action.READ, + OPTIONS, Action.READ, + POST, Action.WRITE, + DELETE, Action.WRITE, + PUT, Action.WRITE, + PATCH, Action.WRITE, + CONNECT, Action.WRITE, + TRACE, Action.WRITE); + } + + @Override + public Action get(RequestView requestView) { + return Optional.ofNullable(mappings.get(requestView.method())) + .orElseThrow(() -> new IllegalArgumentException("Illegal request method: " + requestView.method())); + } + + public static HttpMethodAclMapping.Builder standard() { + return new HttpMethodAclMapping.Builder(); + } + + public static class Builder { + private final Map overrides = new HashMap<>(); + public HttpMethodAclMapping.Builder override(HttpRequest.Method method, Action action) { + overrides.put(method, action); + return this; + } + public HttpMethodAclMapping build() { + return new HttpMethodAclMapping(overrides); + } + } +} diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/RequestHandlerSpec.java b/container-core/src/main/java/com/yahoo/container/jdisc/RequestHandlerSpec.java index 91fac9ac448..0ebb0bb99d9 100644 --- a/container-core/src/main/java/com/yahoo/container/jdisc/RequestHandlerSpec.java +++ b/container-core/src/main/java/com/yahoo/container/jdisc/RequestHandlerSpec.java @@ -31,7 +31,7 @@ public class RequestHandlerSpec { public static class Builder { - private AclMapping aclMapping = new DefaultAclMapping(); + private AclMapping aclMapping = HttpMethodAclMapping.standard().build(); public Builder withAclMapping(AclMapping aclMapping) { this.aclMapping = Objects.requireNonNull(aclMapping); -- cgit v1.2.3