Fix of reading payload in request and response 91/71191/1
authorPavel Paroulek <pavel.paroulek@orange.com>
Wed, 24 Oct 2018 21:42:28 +0000 (23:42 +0200)
committerPavel Paroulek <pavel.paroulek@orange.com>
Wed, 24 Oct 2018 21:42:28 +0000 (23:42 +0200)
Reading the request response payload leads to an exception, adding a buffer class which enables multiple reads. Also adding logging of AAF.

Change-Id: I2fb78c5e9c1e720bf510fd46a23f5fe5ce4ef075
Issue-ID: AAI-1762
Signed-off-by: Pavel Paroulek <pavel.paroulek@orange.com>
aai-traversal/src/main/java/org/onap/aai/config/aaf/AafAuthorizationFilter.java
aai-traversal/src/main/java/org/onap/aai/config/aaf/AafFilter.java
aai-traversal/src/main/java/org/onap/aai/config/aaf/PayloadBufferingRequestWrapper.java [new file with mode: 0644]
aai-traversal/src/main/java/org/onap/aai/config/aaf/ResponseFormatter.java
aai-traversal/src/main/resources/aaf/org.onap.aai.props
aai-traversal/src/main/resources/logback.xml

index a64d3e5..af5f399 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.onap.aai.config.aaf;
 
+import org.apache.commons.io.IOUtils;
 import org.onap.aai.Profiles;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.web.filter.OrderedRequestContextFilter;
@@ -31,9 +32,7 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.util.stream.Collectors;
-
-import static org.onap.aai.config.aaf.ResponseFormatter.errorResponse;
+import java.nio.charset.StandardCharsets;
 
 /**
  * AAF authorization filter
@@ -46,6 +45,7 @@ public class AafAuthorizationFilter extends OrderedRequestContextFilter {
 
     private static final String ADVANCED = "advanced";
     private static final String BASIC = "basic";
+    private static final String ECHO_ENDPOINT = "^.*/util/echo$";
 
     @Value("${permission.type}")
     String type;
@@ -58,19 +58,22 @@ public class AafAuthorizationFilter extends OrderedRequestContextFilter {
     }
 
     @Override
-    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
+    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
+
+        PayloadBufferingRequestWrapper request = new PayloadBufferingRequestWrapper(req);
 
-        if(request.getRequestURI().matches("^.*/util/echo$")){
+        if(request.getRequestURI().matches(ECHO_ENDPOINT)){
             filterChain.doFilter(request, response);
         }
 
-        boolean containsWordGremlin = request.getReader().lines().collect(Collectors.joining(System.lineSeparator())).contains("\"gremlin\"");
+        String payload = IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8.name());
+        boolean containsWordGremlin = payload.contains("\"gremlin\"");
         //if the request contains the word "gremlin" it's an advanced query
         String queryType = containsWordGremlin ? ADVANCED : BASIC;
         String permission = String.format("%s|%s|%s", type, instance, queryType);
 
         if(!request.isUserInRole(permission)){
-            errorResponse(request, response);
+            response.setStatus(403);
         }else{
             filterChain.doFilter(request,response);
         }
index 6295c8e..4a20fe8 100644 (file)
@@ -57,7 +57,7 @@ public class AafFilter extends OrderedRequestContextFilter {
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
         if(!request.getRequestURI().matches("^.*/util/echo$")) {
             cadiFilter.doFilter(request, response, filterChain);
-            if (response.getStatus() >= 400 && response.getStatus() < 500) {
+            if (response.getStatus() == 401 || response.getStatus() == 403) {
                 errorResponse(request, response);
             }
         }
diff --git a/aai-traversal/src/main/java/org/onap/aai/config/aaf/PayloadBufferingRequestWrapper.java b/aai-traversal/src/main/java/org/onap/aai/config/aaf/PayloadBufferingRequestWrapper.java
new file mode 100644 (file)
index 0000000..ea0260c
--- /dev/null
@@ -0,0 +1,49 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.config.aaf;
+
+import org.apache.commons.io.IOUtils;
+import org.onap.aaf.cadi.BufferedServletInputStream;
+
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.io.*;
+
+/**
+ * This class buffers the payload of the servlet request. The reason is that we access the payload multiple times,
+ * which is not supported by the request per se.
+ */
+
+class PayloadBufferingRequestWrapper extends HttpServletRequestWrapper {
+
+    private byte[] buffer;
+
+    PayloadBufferingRequestWrapper(HttpServletRequest req) throws IOException {
+        super(req);
+        this.buffer = IOUtils.toByteArray(req.getInputStream());
+    }
+
+    @Override
+    public ServletInputStream getInputStream() {
+        ByteArrayInputStream bais = new ByteArrayInputStream(this.buffer);
+        return new BufferedServletInputStream(bais);
+    }
+}
index 9e09827..1b932e6 100644 (file)
@@ -37,9 +37,8 @@ class ResponseFormatter {
         String accept = request.getHeader(ACCEPT_HEADER) == null ? MediaType.APPLICATION_XML : request.getHeader(ACCEPT_HEADER);
         AAIException aaie = new AAIException("AAI_3300");
         response.setStatus(aaie.getErrorObject().getHTTPResponseCode().getStatusCode());
-        response.getWriter().write(ErrorLogHelper.getRESTAPIErrorResponse(Collections.singletonList(MediaType.valueOf(accept)), aaie, new ArrayList<>()));
-        response.getWriter().flush();
-        response.getWriter().close();
+        response.resetBuffer();
+        response.getOutputStream().print(ErrorLogHelper.getRESTAPIErrorResponse(Collections.singletonList(MediaType.valueOf(accept)), aaie, new ArrayList<>()));
+        response.flushBuffer();
     }
-
 }
index b981493..f9a0789 100644 (file)
@@ -10,5 +10,5 @@ cadi_keystore_password=enc:383RDJRFA6yQz9AOxUxC1iIg3xTJXityw05MswnpnEtelRQy2D4r5
 cadi_alias=aai@aai.onap.org
 cadi_truststore=aai-traversal/src/main/resources/aaf/truststoreONAPall.jks
 cadi_truststore_password=enc:s77wlnZFoQ08NhnU3OSeWO6uKgRwC6sAK-wTvVubNz2
-cadi_loglevel=INFO
+cadi_loglevel=DEBUG
 cadi_bath_convert=aai-traversal/src/main/resources/aaf/bath_config.csv
index 7947f8f..3a6dae4 100644 (file)
        <logger name="org.apache.commons" level="WARN" />
        <logger name="org.apache.coyote" level="WARN" />
        <logger name="org.apache.jasper" level="WARN" />
+    <logger name="org.onap.aaf" level="DEBUG" />
 
        <!-- Camel Related Loggers (including restlet/servlet/jaxrs/cxf logging. 
                May aid in troubleshooting) -->