This is an automated email from the ASF dual-hosted git repository.

more pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/knox.git


The following commit(s) were added to refs/heads/master by this push:
     new 8e55969f3 KNOX-2974 - Add a new endpoint 'extauthz' similar to pre 
that accepts HTTP verbs other than GET and if confgiured ignores additional 
context path params (#813)
8e55969f3 is described below

commit 8e55969f3f85ac99925842744c143f7e916f784d
Author: Sandeep MorĂ© <[email protected]>
AuthorDate: Mon Oct 30 10:23:29 2023 -0400

    KNOX-2974 - Add a new endpoint 'extauthz' similar to pre that accepts HTTP 
verbs other than GET and if confgiured ignores additional context path params 
(#813)
---
 ...AuthResource.java => AbstractAuthResource.java} |  76 ++++----
 .../knox/gateway/service/auth/AuthMessages.java    |   3 +
 .../gateway/service/auth/ExtAuthzResource.java     | 143 ++++++++++++++
 .../knox/gateway/service/auth/PreAuthResource.java |  95 ++-------
 .../gateway/service/auth/ExtAuthzResourceTest.java | 214 +++++++++++++++++++++
 5 files changed, 406 insertions(+), 125 deletions(-)

diff --git 
a/gateway-service-auth/src/main/java/org/apache/knox/gateway/service/auth/PreAuthResource.java
 
b/gateway-service-auth/src/main/java/org/apache/knox/gateway/service/auth/AbstractAuthResource.java
similarity index 69%
copy from 
gateway-service-auth/src/main/java/org/apache/knox/gateway/service/auth/PreAuthResource.java
copy to 
gateway-service-auth/src/main/java/org/apache/knox/gateway/service/auth/AbstractAuthResource.java
index 9aaab2a16..61c9aed76 100644
--- 
a/gateway-service-auth/src/main/java/org/apache/knox/gateway/service/auth/PreAuthResource.java
+++ 
b/gateway-service-auth/src/main/java/org/apache/knox/gateway/service/auth/AbstractAuthResource.java
@@ -17,9 +17,13 @@
  */
 package org.apache.knox.gateway.service.auth;
 
-import static javax.ws.rs.core.Response.ok;
-import static javax.ws.rs.core.Response.status;
+import org.apache.knox.gateway.i18n.messages.MessagesFactory;
+import org.apache.knox.gateway.security.SubjectUtils;
 
+import javax.security.auth.Subject;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.core.Response;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -29,58 +33,46 @@ import java.util.Set;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
-import javax.annotation.PostConstruct;
-import javax.security.auth.Subject;
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.Response;
+import static javax.ws.rs.core.Response.ok;
+import static javax.ws.rs.core.Response.status;
 
-import org.apache.knox.gateway.i18n.messages.MessagesFactory;
-import org.apache.knox.gateway.security.SubjectUtils;
+public abstract class AbstractAuthResource {
+  public static final String AUTH_ACTOR_ID_HEADER_NAME = 
"preauth.auth.header.actor.id.name";
+  public static final String AUTH_ACTOR_GROUPS_HEADER_PREFIX = 
"preauth.auth.header.actor.groups.prefix";
+  public static final String GROUP_FILTER_PATTERN = 
"preauth.group.filter.pattern";
 
-@Path(PreAuthResource.RESOURCE_PATH)
-public class PreAuthResource {
-  static final String RESOURCE_PATH = "auth/api/v1/pre";
-  private static final AuthMessages LOG = 
MessagesFactory.get(AuthMessages.class);
-  static final String AUTH_ACTOR_ID_HEADER_NAME = 
"preauth.auth.header.actor.id.name";
-  static final String AUTH_ACTOR_GROUPS_HEADER_PREFIX = 
"preauth.auth.header.actor.groups.prefix";
-  static final String GROUP_FILTER_PATTERN = "preauth.group.filter.pattern";
+  static final AuthMessages LOG = MessagesFactory.get(AuthMessages.class);
 
   static final String DEFAULT_AUTH_ACTOR_ID_HEADER_NAME = "X-Knox-Actor-ID";
   static final String DEFAULT_AUTH_ACTOR_GROUPS_HEADER_PREFIX = 
"X-Knox-Actor-Groups";
-  private static final Pattern DEFAULT_GROUP_FILTER_PATTERN = 
Pattern.compile(".*");
-
-  private static final int MAX_HEADER_LENGTH = 1000;
-  private static final String ACTOR_GROUPS_HEADER_FORMAT = "%s-%d";
-
-  @Context
-  HttpServletResponse response;
+  static final Pattern DEFAULT_GROUP_FILTER_PATTERN = Pattern.compile(".*");
 
-  @Context
-  ServletContext context;
+  protected static final int MAX_HEADER_LENGTH = 1000;
+  protected static final String ACTOR_GROUPS_HEADER_FORMAT = "%s-%d";
 
-  private String authHeaderActorIDName;
-  private String authHeaderActorGroupsPrefix;
-  private Pattern groupFilterPattern;
+  protected String authHeaderActorIDName;
+  protected String authHeaderActorGroupsPrefix;
+  protected Pattern groupFilterPattern;
 
-  @PostConstruct
-  public void init() {
+  protected void initialize() {
     authHeaderActorIDName = getInitParameter(AUTH_ACTOR_ID_HEADER_NAME, 
DEFAULT_AUTH_ACTOR_ID_HEADER_NAME);
     authHeaderActorGroupsPrefix = 
getInitParameter(AUTH_ACTOR_GROUPS_HEADER_PREFIX, 
DEFAULT_AUTH_ACTOR_GROUPS_HEADER_PREFIX);
-    final String groupFilterPatternString = 
context.getInitParameter(GROUP_FILTER_PATTERN);
+    final String groupFilterPatternString = 
getInitParameter(GROUP_FILTER_PATTERN, null);
     groupFilterPattern = groupFilterPatternString == null ? 
DEFAULT_GROUP_FILTER_PATTERN : Pattern.compile(groupFilterPatternString);
   }
 
-  private String getInitParameter(String paramName, String defaultValue) {
-    final String initParam = context.getInitParameter(paramName);
+  /* abstract method to get the response instance */
+  abstract HttpServletResponse getResponse();
+
+  /* Abstract method that gets context instance */
+  abstract ServletContext getContext();
+
+  String getInitParameter(String paramName, String defaultValue) {
+    final String initParam = getContext().getInitParameter(paramName);
     return initParam == null ? defaultValue : initParam;
   }
 
-  @GET
-  public Response doGet() {
+  public Response doGetImpl() {
     final Subject subject = SubjectUtils.getCurrentSubject();
 
     final String primaryPrincipalName = subject == null ? null : 
SubjectUtils.getPrimaryPrincipalName(subject);
@@ -88,16 +80,16 @@ public class PreAuthResource {
       LOG.noPrincipalFound();
       return status(HttpServletResponse.SC_UNAUTHORIZED).build();
     }
-    response.setHeader(authHeaderActorIDName, primaryPrincipalName);
+    getResponse().setHeader(authHeaderActorIDName, primaryPrincipalName);
 
     // Populate actor groups headers
     final Set<String> matchingGroupNames = subject == null ? 
Collections.emptySet()
         : SubjectUtils.getGroupPrincipals(subject).stream().filter(group -> 
groupFilterPattern.matcher(group.getName()).matches()).map(group -> 
group.getName())
-            .collect(Collectors.toSet());
+        .collect(Collectors.toSet());
     if (!matchingGroupNames.isEmpty()) {
       final List<String> groupStrings = getGroupStrings(matchingGroupNames);
       for (int i = 0; i < groupStrings.size(); i++) {
-        response.addHeader(String.format(Locale.ROOT, 
ACTOR_GROUPS_HEADER_FORMAT, authHeaderActorGroupsPrefix, i + 1), 
groupStrings.get(i));
+        getResponse().addHeader(String.format(Locale.ROOT, 
ACTOR_GROUPS_HEADER_FORMAT, authHeaderActorGroupsPrefix, i + 1), 
groupStrings.get(i));
       }
     }
     return ok().build();
@@ -125,4 +117,4 @@ public class PreAuthResource {
     return groupStrings;
   }
 
-}
\ No newline at end of file
+}
diff --git 
a/gateway-service-auth/src/main/java/org/apache/knox/gateway/service/auth/AuthMessages.java
 
b/gateway-service-auth/src/main/java/org/apache/knox/gateway/service/auth/AuthMessages.java
index e744713f9..662833f26 100644
--- 
a/gateway-service-auth/src/main/java/org/apache/knox/gateway/service/auth/AuthMessages.java
+++ 
b/gateway-service-auth/src/main/java/org/apache/knox/gateway/service/auth/AuthMessages.java
@@ -27,4 +27,7 @@ public interface AuthMessages {
   @Message(level = MessageLevel.ERROR, text = "There was a problem extracting 
authenticated principal from request.")
   void noPrincipalFound();
 
+  @Message(level = MessageLevel.INFO, text = "Serving request for path: {0}")
+  void pathValue(String path);
+
 }
diff --git 
a/gateway-service-auth/src/main/java/org/apache/knox/gateway/service/auth/ExtAuthzResource.java
 
b/gateway-service-auth/src/main/java/org/apache/knox/gateway/service/auth/ExtAuthzResource.java
new file mode 100644
index 000000000..883e0f51f
--- /dev/null
+++ 
b/gateway-service-auth/src/main/java/org/apache/knox/gateway/service/auth/ExtAuthzResource.java
@@ -0,0 +1,143 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.knox.gateway.service.auth;
+
+import javax.annotation.PostConstruct;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.HEAD;
+import javax.ws.rs.OPTIONS;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+@Path(ExtAuthzResource.RESOURCE_PATH)
+public class ExtAuthzResource extends AbstractAuthResource {
+  static final String RESOURCE_PATH = "auth/api/v1/extauthz";
+  static final String IGNORE_ADDITIONAL_PATH = "ignore.additional.path";
+  static final String DEFAULT_IGNORE_ADDITIONAL_PATH = "false";
+
+  private boolean ignoreAdditionalPath;
+
+  @Context
+  HttpServletResponse response;
+
+  @Context
+  ServletContext context;
+
+  @PostConstruct
+  public void init() {
+    initialize();
+    ignoreAdditionalPath = 
Boolean.parseBoolean(getInitParameter(IGNORE_ADDITIONAL_PATH, 
DEFAULT_IGNORE_ADDITIONAL_PATH));
+  }
+
+  @Override
+  HttpServletResponse getResponse() {
+    return response;
+  }
+
+  @Override
+  ServletContext getContext() {
+    return context;
+  }
+
+  /*
+  Enable all the http verbs,
+  wish there was a way to specify multiple paths on the same method
+  */
+  @GET
+  public Response doGet() {
+    return doGetImpl();
+  }
+
+  @POST
+  public Response doPostWithRootPath() {
+    return doGetImpl();
+  }
+
+  @PUT
+  public Response doPutWithRootPath() {
+    return doGetImpl();
+  }
+
+  @DELETE
+  public Response doDeleteWithRootPath() {
+    return doGetImpl();
+  }
+
+  @HEAD
+  public Response doHeadWithPath() {
+    return doGetImpl();
+  }
+
+  @OPTIONS
+  public Response doOptionsWithPath() {
+    return doGetImpl();
+  }
+
+  /*
+   * This method will handle additional paths.
+   * Currently, if there are any additional paths they are ignored.
+   */
+  @Path("{subResources:.*}")
+  @GET
+  public Response doGetWithPath(@Context UriInfo ui) {
+    if(ignoreAdditionalPath) {
+      LOG.pathValue(ui.getPath());
+      return doGet();
+    } else {
+      return  Response.status(Response.Status.NOT_FOUND).build();
+    }
+  }
+
+  @Path("{subResources:.*}")
+  @POST
+  public Response doPostWithPath(@Context UriInfo ui) {
+    return doGetWithPath(ui);
+  }
+
+  @Path("{subResources: .*}")
+  @PUT
+  public Response doPutWithPath(@Context UriInfo ui) {
+    return doGetWithPath(ui);
+  }
+
+  @Path("{subResources: .*}")
+  @DELETE
+  public Response doDeleteWithPath(@Context UriInfo ui) {
+    return doGetWithPath(ui);
+  }
+
+  @Path("{subResources: .*}")
+  @HEAD
+  public Response doHeadWithPath(@Context UriInfo ui) {
+    return doGetWithPath(ui);
+  }
+
+  @Path("{subResources: .*}")
+  @OPTIONS
+  public Response doOptionsWithPath(@Context UriInfo ui) {
+    return doGetWithPath(ui);
+  }
+
+}
\ No newline at end of file
diff --git 
a/gateway-service-auth/src/main/java/org/apache/knox/gateway/service/auth/PreAuthResource.java
 
b/gateway-service-auth/src/main/java/org/apache/knox/gateway/service/auth/PreAuthResource.java
index 9aaab2a16..d44dd8e73 100644
--- 
a/gateway-service-auth/src/main/java/org/apache/knox/gateway/service/auth/PreAuthResource.java
+++ 
b/gateway-service-auth/src/main/java/org/apache/knox/gateway/service/auth/PreAuthResource.java
@@ -17,20 +17,7 @@
  */
 package org.apache.knox.gateway.service.auth;
 
-import static javax.ws.rs.core.Response.ok;
-import static javax.ws.rs.core.Response.status;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
 import javax.annotation.PostConstruct;
-import javax.security.auth.Subject;
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.GET;
@@ -38,91 +25,33 @@ import javax.ws.rs.Path;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Response;
 
-import org.apache.knox.gateway.i18n.messages.MessagesFactory;
-import org.apache.knox.gateway.security.SubjectUtils;
-
 @Path(PreAuthResource.RESOURCE_PATH)
-public class PreAuthResource {
-  static final String RESOURCE_PATH = "auth/api/v1/pre";
-  private static final AuthMessages LOG = 
MessagesFactory.get(AuthMessages.class);
-  static final String AUTH_ACTOR_ID_HEADER_NAME = 
"preauth.auth.header.actor.id.name";
-  static final String AUTH_ACTOR_GROUPS_HEADER_PREFIX = 
"preauth.auth.header.actor.groups.prefix";
-  static final String GROUP_FILTER_PATTERN = "preauth.group.filter.pattern";
+public class PreAuthResource extends AbstractAuthResource {
 
-  static final String DEFAULT_AUTH_ACTOR_ID_HEADER_NAME = "X-Knox-Actor-ID";
-  static final String DEFAULT_AUTH_ACTOR_GROUPS_HEADER_PREFIX = 
"X-Knox-Actor-Groups";
-  private static final Pattern DEFAULT_GROUP_FILTER_PATTERN = 
Pattern.compile(".*");
-
-  private static final int MAX_HEADER_LENGTH = 1000;
-  private static final String ACTOR_GROUPS_HEADER_FORMAT = "%s-%d";
+  static final String RESOURCE_PATH = "auth/api/v1/pre";
 
   @Context
   HttpServletResponse response;
 
   @Context
   ServletContext context;
-
-  private String authHeaderActorIDName;
-  private String authHeaderActorGroupsPrefix;
-  private Pattern groupFilterPattern;
-
   @PostConstruct
   public void init() {
-    authHeaderActorIDName = getInitParameter(AUTH_ACTOR_ID_HEADER_NAME, 
DEFAULT_AUTH_ACTOR_ID_HEADER_NAME);
-    authHeaderActorGroupsPrefix = 
getInitParameter(AUTH_ACTOR_GROUPS_HEADER_PREFIX, 
DEFAULT_AUTH_ACTOR_GROUPS_HEADER_PREFIX);
-    final String groupFilterPatternString = 
context.getInitParameter(GROUP_FILTER_PATTERN);
-    groupFilterPattern = groupFilterPatternString == null ? 
DEFAULT_GROUP_FILTER_PATTERN : Pattern.compile(groupFilterPatternString);
+    initialize();
   }
 
-  private String getInitParameter(String paramName, String defaultValue) {
-    final String initParam = context.getInitParameter(paramName);
-    return initParam == null ? defaultValue : initParam;
+  @Override
+  HttpServletResponse getResponse() {
+    return response;
   }
 
-  @GET
-  public Response doGet() {
-    final Subject subject = SubjectUtils.getCurrentSubject();
-
-    final String primaryPrincipalName = subject == null ? null : 
SubjectUtils.getPrimaryPrincipalName(subject);
-    if (primaryPrincipalName == null) {
-      LOG.noPrincipalFound();
-      return status(HttpServletResponse.SC_UNAUTHORIZED).build();
-    }
-    response.setHeader(authHeaderActorIDName, primaryPrincipalName);
-
-    // Populate actor groups headers
-    final Set<String> matchingGroupNames = subject == null ? 
Collections.emptySet()
-        : SubjectUtils.getGroupPrincipals(subject).stream().filter(group -> 
groupFilterPattern.matcher(group.getName()).matches()).map(group -> 
group.getName())
-            .collect(Collectors.toSet());
-    if (!matchingGroupNames.isEmpty()) {
-      final List<String> groupStrings = getGroupStrings(matchingGroupNames);
-      for (int i = 0; i < groupStrings.size(); i++) {
-        response.addHeader(String.format(Locale.ROOT, 
ACTOR_GROUPS_HEADER_FORMAT, authHeaderActorGroupsPrefix, i + 1), 
groupStrings.get(i));
-      }
-    }
-    return ok().build();
+  @Override
+  ServletContext getContext() {
+    return context;
   }
 
-  private List<String> getGroupStrings(Collection<String> groupNames) {
-    if (groupNames.isEmpty()) {
-      return Collections.emptyList();
-    }
-    List<String> groupStrings = new ArrayList<>();
-    StringBuilder sb = new StringBuilder();
-    for (String groupName : groupNames) {
-      if (sb.length() + groupName.length() > MAX_HEADER_LENGTH) {
-        groupStrings.add(sb.toString());
-        sb = new StringBuilder();
-      }
-      if (sb.length() > 0) {
-        sb.append(',');
-      }
-      sb.append(groupName);
-    }
-    if (sb.length() > 0) {
-      groupStrings.add(sb.toString());
-    }
-    return groupStrings;
+  @GET
+  public Response doGet() {
+    return doGetImpl();
   }
-
 }
\ No newline at end of file
diff --git 
a/gateway-service-auth/src/test/java/org/apache/knox/gateway/service/auth/ExtAuthzResourceTest.java
 
b/gateway-service-auth/src/test/java/org/apache/knox/gateway/service/auth/ExtAuthzResourceTest.java
new file mode 100644
index 000000000..ead516211
--- /dev/null
+++ 
b/gateway-service-auth/src/test/java/org/apache/knox/gateway/service/auth/ExtAuthzResourceTest.java
@@ -0,0 +1,214 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.knox.gateway.service.auth;
+
+import org.apache.knox.gateway.security.GroupPrincipal;
+import org.apache.knox.gateway.security.PrimaryPrincipal;
+import org.apache.knox.gateway.security.SubjectUtils;
+import org.easymock.EasyMock;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.security.auth.Subject;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.PathSegment;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriBuilder;
+import javax.ws.rs.core.UriInfo;
+import java.net.URI;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class ExtAuthzResourceTest {
+
+  private static final String USER_NAME = "test-username";
+  private ServletContext context;
+  private HttpServletRequest request;
+  private HttpServletResponse response;
+  private final Subject subject = new Subject();
+
+  @Before
+  public void setUp() {
+    subject.getPrincipals().add(new PrimaryPrincipal(USER_NAME));
+  }
+
+  @Test
+  public void testIgnoreAdditionalPaths() throws Exception {
+    configureCommonExpectations(null, null, Collections.singleton("group1"));
+    final ExtAuthzResource extAuthzResource = new ExtAuthzResource();
+    extAuthzResource.context = context;
+    extAuthzResource.response = response;
+    executeResourceWithAdditionalPath(extAuthzResource);
+    EasyMock.verify(response);
+  }
+
+
+  private void configureCommonExpectations(String actorIdHeaderName, String 
groupsHeaderPrefix, Collection<String> groups) {
+    context = EasyMock.createNiceMock(ServletContext.class);
+    
EasyMock.expect(context.getInitParameter(ExtAuthzResource.AUTH_ACTOR_ID_HEADER_NAME)).andReturn(actorIdHeaderName).anyTimes();
+    
EasyMock.expect(context.getInitParameter(ExtAuthzResource.AUTH_ACTOR_GROUPS_HEADER_PREFIX)).andReturn(groupsHeaderPrefix).anyTimes();
+    
EasyMock.expect(context.getInitParameter(ExtAuthzResource.IGNORE_ADDITIONAL_PATH)).andReturn("true").anyTimes();
+    request = EasyMock.createNiceMock(HttpServletRequest.class);
+    response = EasyMock.createNiceMock(HttpServletResponse.class);
+
+    if (SubjectUtils.getPrimaryPrincipalName(subject) != null) {
+      final String expectedActorIdHeader = actorIdHeaderName == null ? 
"X-Knox-Actor-ID" : actorIdHeaderName;
+      response.setHeader(expectedActorIdHeader, USER_NAME);
+      EasyMock.expectLastCall();
+    }
+
+    if (!groups.isEmpty()) {
+      groups.forEach(group -> subject.getPrincipals().add(new 
GroupPrincipal(group)));
+      final int groupStringSize = calculateGroupStringSize(groups);
+      final int expectedGroupHeaderCount = groupStringSize / 1000 + 1;
+      final String expectedGroupsHeaderPrefix = (groupsHeaderPrefix == null ? 
"X-Knox-Actor-Groups" : groupsHeaderPrefix)
+          + "-";
+      for (int i = 1; i <= expectedGroupHeaderCount; i++) {
+        response.addHeader(EasyMock.eq(expectedGroupsHeaderPrefix + i), 
EasyMock.anyString());
+        EasyMock.expectLastCall();
+      }
+    }
+    EasyMock.replay(context, request, response);
+  }
+
+  private int calculateGroupStringSize(Collection<String> groups) {
+    final AtomicInteger size = new AtomicInteger(0);
+    groups.forEach(group -> size.addAndGet(group.length()));
+    size.addAndGet(groups.size() - 1); // commas
+    return size.get();
+  }
+
+
+  private Response executeResourceWithAdditionalPath(final ExtAuthzResource 
extAuthzResource) throws PrivilegedActionException {
+    return (Response) Subject.doAs(subject, new 
PrivilegedExceptionAction<Object>() {
+
+      @Override
+      public Object run() throws Exception {
+        extAuthzResource.init();
+        return extAuthzResource.doGetWithPath(new UriInfo() {
+          @Override
+          public String getPath() {
+            return "/gateway/sandbox/auth/api/v1/extauthz/does-not-exist";
+          }
+
+          @Override
+          public String getPath(boolean decode) {
+            return "/gateway/sandbox/auth/api/v1/extauthz/does-not-exist";
+          }
+
+          @Override
+          public List<PathSegment> getPathSegments() {
+            return null;
+          }
+
+          @Override
+          public List<PathSegment> getPathSegments(boolean decode) {
+            return null;
+          }
+
+          @Override
+          public URI getRequestUri() {
+            return null;
+          }
+
+          @Override
+          public UriBuilder getRequestUriBuilder() {
+            return null;
+          }
+
+          @Override
+          public URI getAbsolutePath() {
+            return null;
+          }
+
+          @Override
+          public UriBuilder getAbsolutePathBuilder() {
+            return null;
+          }
+
+          @Override
+          public URI getBaseUri() {
+            return null;
+          }
+
+          @Override
+          public UriBuilder getBaseUriBuilder() {
+            return null;
+          }
+
+          @Override
+          public MultivaluedMap<String, String> getPathParameters() {
+            return null;
+          }
+
+          @Override
+          public MultivaluedMap<String, String> getPathParameters(
+              boolean decode) {
+            return null;
+          }
+
+          @Override
+          public MultivaluedMap<String, String> getQueryParameters() {
+            return null;
+          }
+
+          @Override
+          public MultivaluedMap<String, String> getQueryParameters(
+              boolean decode) {
+            return null;
+          }
+
+          @Override
+          public List<String> getMatchedURIs() {
+            return null;
+          }
+
+          @Override
+          public List<String> getMatchedURIs(boolean decode) {
+            return null;
+          }
+
+          @Override
+          public List<Object> getMatchedResources() {
+            return null;
+          }
+
+          @Override
+          public URI resolve(URI uri) {
+            return null;
+          }
+
+          @Override
+          public URI relativize(URI uri) {
+            return null;
+          }
+        });
+      }
+
+    });
+  }
+
+
+}

Reply via email to