Implement 'Update Service by importing Tosca Template'-story
[sdc.git] / common-app-api / src / main / java / org / openecomp / sdc / common / filters / DataValidatorFilterAbstract.java
1 /*
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2022 Nordix Foundation. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.common.filters;
22
23 import java.io.IOException;
24 import java.util.Iterator;
25 import java.util.List;
26 import javax.servlet.Filter;
27 import javax.servlet.FilterChain;
28 import javax.servlet.FilterConfig;
29 import javax.servlet.ServletException;
30 import javax.servlet.ServletRequest;
31 import javax.servlet.ServletResponse;
32 import javax.servlet.http.Cookie;
33 import javax.servlet.http.HttpServletRequest;
34 import javax.ws.rs.HttpMethod;
35 import javax.ws.rs.core.MediaType;
36 import org.apache.commons.collections4.CollectionUtils;
37 import org.apache.commons.lang3.StringUtils;
38 import org.openecomp.sdc.common.util.DataValidator;
39 import org.openecomp.sdc.common.util.SecureString;
40 import org.openecomp.sdc.exception.NotAllowedSpecialCharsException;
41
42 /**
43  * Provides mechanism to filter request according to {@link DataValidator} and {@code dataValidatorFilterExcludedUrlsList}.
44  */
45 public abstract class DataValidatorFilterAbstract implements Filter {
46
47     protected static final String DATA_VALIDATOR_FILTER_EXCLUDED_URLS = "dataValidatorFilterExcludedUrls";
48     protected static final String ERROR_SPECIAL_CHARACTERS_NOT_ALLOWED = "Error: HTML elements not permitted in field values.";
49     private DataValidator dataValidator;
50
51     @Override
52     public void init(final FilterConfig filterConfig) throws ServletException {
53         dataValidator = new DataValidator();
54     }
55
56     @Override
57     public void destroy() {
58         dataValidator = null;
59     }
60
61     @Override
62     public void doFilter(ServletRequest request, final ServletResponse response, final FilterChain chain)
63         throws IOException, ServletException {
64         if (isExcluded(((HttpServletRequest) request).getRequestURI()) || !isPostOrPut(((HttpServletRequest) request).getMethod())) {
65             chain.doFilter(request, response);
66         } else {
67             if (!skipCheckBody((HttpServletRequest) request)) {
68                 request = new RequestWrapper((HttpServletRequest) request);
69             }
70             if (isValid((HttpServletRequest) request)) {
71                 chain.doFilter(request, response);
72             } else {
73                 throw new NotAllowedSpecialCharsException();
74             }
75         }
76     }
77
78     private boolean isPostOrPut(final String method) {
79         return method.equals(HttpMethod.POST) || method.equals(HttpMethod.PUT);
80     }
81
82     private boolean isExcluded(final String path) {
83         final List<String> dataValidatorFilterExcludedUrlsList = getDataValidatorFilterExcludedUrls();
84         return CollectionUtils.isNotEmpty(dataValidatorFilterExcludedUrlsList)
85             && dataValidatorFilterExcludedUrlsList.stream().anyMatch(s -> path.trim().contains(s.trim()));
86     }
87
88     protected abstract List<String> getDataValidatorFilterExcludedUrls();
89
90     private boolean skipCheckBody(final HttpServletRequest requestWrapper) {
91         final String contentType = requestWrapper.getContentType();
92         return StringUtils.isNotEmpty(contentType) && contentType.contains(MediaType.MULTIPART_FORM_DATA);
93     }
94
95     private boolean isValid(final HttpServletRequest request) {
96         final boolean skipCheckBody = skipCheckBody(request);
97         return (skipCheckBody || checkBody((RequestWrapper) request))
98             && checkHeaders(request)
99             && checkCookies(request)
100             && checkParameters(request)
101             && checkQuery(request);
102     }
103
104     private boolean checkParameters(final HttpServletRequest httpRequest) {
105         final Iterator<String> parameterNamesIterator = httpRequest.getParameterNames().asIterator();
106         while (parameterNamesIterator.hasNext()) {
107             final String parameterName = parameterNamesIterator.next();
108             final String parameter = httpRequest.getParameter(parameterName);
109             if (!dataValidator.isValid(new SecureString(parameter))) {
110                 return false;
111             }
112             final String[] parameterValues = httpRequest.getParameterValues(parameterName);
113             if (parameterValues != null) {
114                 for (final String parameterValue : parameterValues) {
115                     if (!dataValidator.isValid(new SecureString(parameterValue))) {
116                         return false;
117                     }
118                 }
119             }
120         }
121         return true;
122     }
123
124     private boolean checkHeaders(final HttpServletRequest httpRequest) {
125         final Iterator<String> headerNamesIterator = httpRequest.getHeaderNames().asIterator();
126         while (headerNamesIterator.hasNext()) {
127             final String headerName = headerNamesIterator.next();
128             final String header = httpRequest.getHeader(headerName);
129             if (!dataValidator.isValid(new SecureString(header))) {
130                 return false;
131             }
132         }
133         return true;
134     }
135
136     private boolean checkCookies(final HttpServletRequest httpRequest) {
137         final Cookie[] cookies = httpRequest.getCookies();
138         if (cookies != null) {
139             for (final Cookie cookie : cookies) {
140                 if (!dataValidator.isValid(new SecureString(cookie.getValue()))) {
141                     return false;
142                 }
143             }
144         }
145         return true;
146     }
147
148     private boolean checkQuery(final HttpServletRequest httpRequest) {
149         final String queryString = httpRequest.getQueryString();
150         return StringUtils.isEmpty(queryString) || dataValidator.isValid(new SecureString(queryString));
151     }
152
153     private boolean checkBody(final RequestWrapper httpRequest) {
154         final String body = httpRequest.getBody();
155         return StringUtils.isEmpty(body) || dataValidator.isValid(new SecureString(body));
156     }
157
158 }
159