DR AAF CADI integration
[dmaap/datarouter.git] / datarouter-prov / src / main / java / org / onap / dmaap / datarouter / provisioning / utils / DRProvCadiFilter.java
1 /**
2  * -
3  * ============LICENSE_START=======================================================
4  * Copyright (C) 2019 Nordix Foundation.
5  * ================================================================================
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  * <p>
10  * http://www.apache.org/licenses/LICENSE-2.0
11  * <p>
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  * <p>
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21 package org.onap.dmaap.datarouter.provisioning.utils;
22
23 import org.apache.log4j.Logger;
24 import org.onap.aaf.cadi.PropAccess;
25 import org.onap.aaf.cadi.filter.CadiFilter;
26 import org.onap.dmaap.datarouter.provisioning.BaseServlet;
27 import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;
28 import org.onap.dmaap.datarouter.provisioning.beans.Feed;
29 import org.onap.dmaap.datarouter.provisioning.beans.Subscription;
30
31 import javax.servlet.FilterChain;
32 import javax.servlet.ServletException;
33 import javax.servlet.ServletRequest;
34 import javax.servlet.ServletResponse;
35 import javax.servlet.http.HttpServletRequest;
36 import javax.servlet.http.HttpServletResponse;
37 import java.io.IOException;
38
39
40 public class DRProvCadiFilter extends CadiFilter {
41     private static Logger eventlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.events");
42     private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
43     private String aafInstance = "";
44
45     public DRProvCadiFilter(boolean init, PropAccess access) throws ServletException {
46         super(init, access);
47     }
48
49     @Override
50     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
51         HttpServletRequest httpRequest = null;
52         HttpServletResponse httpResponse = null;
53         //cadi code
54         try {
55             httpRequest = (HttpServletRequest) request;
56             httpResponse = (HttpServletResponse) response;
57         } catch (ClassCastException e) {
58             try {
59                 throw new ServletException("Only serving HTTP today", e);
60             } catch (ServletException e1) {
61                 intlogger.error("PROV7001 DRProvCadiFilter.doFilter: ", e1);
62             }
63         }
64         EventLogRecord elr = new EventLogRecord(httpRequest);
65         String excludeAAF = httpRequest.getHeader(BaseServlet.EXCLUDE_AAF_HEADER);//send this param value as true, if want to add legacy feed/subscriber in AAF env
66
67         String pathUrl = httpRequest.getServletPath();
68         if (!(pathUrl.contains("internal") ||
69                 pathUrl.contains("sublog") ||
70                 pathUrl.contains("feedlog") ||
71                 pathUrl.contains("statistics") ||
72                 pathUrl.contains("publish") ||
73                 pathUrl.contains("group"))) {
74
75             String method = httpRequest.getMethod().toUpperCase();
76             if (!(method.equals("POST"))) { // if request method is PUT method (publish or Feed update) Needs to check for DELETE
77                 if (method.equals("PUT") || method.equals("DELETE")) {
78                     if ((pathUrl.contains("subs"))) {//edit subscriber
79                         int subId = BaseServlet.getIdFromPath(httpRequest);
80                         if (subId <= 0) {
81                             String message = String.format("Invalid request URI - %s", httpRequest.getPathInfo());
82                             elr.setMessage(message);
83                             elr.setResult(HttpServletResponse.SC_NOT_FOUND);
84                             eventlogger.info(elr);
85                             httpResponse.sendError(HttpServletResponse.SC_NOT_FOUND, message);
86                             return;
87                         }
88                         if (isAAFSubscriber(subId)) {//edit AAF Subscriber
89                             String message = String.format("DRProvCadiFilter - Edit AAF Subscriber : %d : AAF Instance - %s", subId, aafInstance);
90                             elr.setMessage(message);
91                             eventlogger.info(elr);
92                             //request.setAttribute("aafInstance", aafInstance);// no need to set it in request since it is taken care in respective servlets
93                             super.doFilter(request, response, chain);
94
95                         } else {//Edit or publish legacy Subscriber
96                             String message = "DRProvCadiFilter - Edit/Publish Legacy Subscriber :" + subId;
97                             elr.setMessage(message);
98                             eventlogger.info(elr);
99                             chain.doFilter(request, response);
100                         }
101
102                     } else {//edit or publish Feed
103                         int feedId = BaseServlet.getIdFromPath(httpRequest);
104                         if (feedId <= 0) {
105                             String message = "Invalid request URI - " + httpRequest.getPathInfo();
106                             elr.setMessage(message);
107                             elr.setResult(HttpServletResponse.SC_NOT_FOUND);
108                             eventlogger.info(elr);
109                             httpResponse.sendError(HttpServletResponse.SC_NOT_FOUND, message);
110                             return;
111                         }
112
113                         if (isAAFFeed(feedId)) {//edit AAF Feed
114                             String message = "DRProvCadiFilter - Edit AAF Feed:" + feedId + ":" + "AAF Instance -" + aafInstance;
115                             elr.setMessage(message);
116                             eventlogger.info(elr);
117                             super.doFilter(request, response, chain);
118
119                         } else {//Edit or publish legacy Feed
120                             String message = "DRProvCadiFilter - Edit/Publish Legacy Feed:" + feedId;
121                             elr.setMessage(message);
122                             eventlogger.info(elr);
123                             chain.doFilter(request, response);
124                         }
125                     }
126                 } else {// in all other cases defaults to legacy behavior
127                     String message = "DRProvCadiFilter - Default Legacy Feed/Subscriber URI -:" + httpRequest.getPathInfo();
128                     elr.setMessage(message);
129                     eventlogger.info(elr);
130                     chain.doFilter(request, response);
131                 }
132             } else {
133                 //check to add legacy/AAF subscriber
134                 if ((pathUrl.contains("subscribe"))) {//add subscriber
135                     int feedId = BaseServlet.getIdFromPath(httpRequest);
136                     if (feedId <= 0) {
137                         String message = "Invalid request URI - " + httpRequest.getPathInfo();
138                         elr.setMessage(message);
139                         elr.setResult(HttpServletResponse.SC_NOT_FOUND);
140                         eventlogger.info(elr);
141                         httpResponse.sendError(HttpServletResponse.SC_NOT_FOUND, message);
142                         return;
143                     }
144                     if (isAAFFeed(feedId)) {//check if AAF Feed or legacy to add new subscriber
145                         if (excludeAAF == null) {
146                             String message = "DRProvCadiFilter -Invalid request Header Parmeter " + BaseServlet.EXCLUDE_AAF_HEADER + " = " + httpRequest.getHeader(BaseServlet.EXCLUDE_AAF_HEADER);
147                             elr.setMessage(message);
148                             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
149                             eventlogger.info(elr);
150                             httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
151                             return;
152                         }
153                         if (excludeAAF.equalsIgnoreCase("true")) {//Check to add legacy subscriber to AAF Feed
154                             String message = "DRProvCadiFilter - add legacy subscriber to AAF Feed, FeedID:" + feedId;
155                             elr.setMessage(message);
156                             eventlogger.info(elr);
157                             chain.doFilter(request, response);
158                         } else {
159                             String message = "DRProvCadiFilter - Add AAF subscriber to AAF Feed, FeedID:" + feedId + ":" + "AAF Instance -" + aafInstance;
160                             elr.setMessage(message);
161                             eventlogger.info(elr);
162                             super.doFilter(request, response, chain);
163                         }
164                     } else {//Add legacy susbcriber to legacy Feed
165                         String message = "DRProvCadiFilter - add legacy subscriber to legacy Feed:" + feedId;
166                         elr.setMessage(message);
167                         eventlogger.info(elr);
168                         chain.doFilter(request, response);
169                     }
170                 } else {//add AAF feed
171                     if (excludeAAF == null) {
172                         String message = "DRProvCadiFilter -Invalid request Header Parmeter " + BaseServlet.EXCLUDE_AAF_HEADER + " = " + httpRequest.getHeader(BaseServlet.EXCLUDE_AAF_HEADER);
173                         elr.setMessage(message);
174                         elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
175                         eventlogger.info(elr);
176                         httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
177                         return;
178                     }
179                     if (excludeAAF.equalsIgnoreCase("true")) {//add legacy feed
180                         String message = "DRProvCadiFilter - Create new legacy Feed : EXCLUDE_AAF = " + excludeAAF;
181                         elr.setMessage(message);
182                         eventlogger.info(elr);
183                         chain.doFilter(request, response);
184                     } else {//add AAF Feed
185                         String message = "DRProvCadiFilter - Create new AAF Feed : EXCLUDE_AAF = " + excludeAAF;
186                         elr.setMessage(message);
187                         eventlogger.info(elr);
188                         super.doFilter(request, response, chain);
189                     }
190                 }
191             }
192         } else {
193             //All other requests default to (Non CADI) legacy
194             chain.doFilter(request, response);
195         }
196     }
197
198     /**
199      * Check if it is AAF feed OR existing feed.
200      *
201      * @param feedId the Feed ID
202      * @return true if it is valid
203      */
204     @SuppressWarnings("resource")
205     private boolean isAAFFeed(int feedId) {
206         try {
207             Feed feed = Feed.getFeedById(feedId);
208             if (feed != null) {
209                 if (!((feed.getAafInstance().equalsIgnoreCase("legacy")) || feed.getAafInstance() == null || feed.getAafInstance().equals(""))) { //also apply null check and empty check too
210                     aafInstance = feed.getAafInstance();
211                     String message = "DRProvCadiFilter.isAAFFeed: aafInstance-:" + aafInstance + "; feedId:- " + feedId;
212                     intlogger.debug(message);
213                     return true;
214                 } else {
215                     return false;
216                 }
217             } else {
218                 String message = "DRProvCadiFilter.isAAFFeed; Feed does not exist FeedID:-" + feedId;
219                 intlogger.debug(message);
220             }
221
222         } catch (Exception e) {
223             intlogger.error("PROV0073 DRProvCadiFilter.isAAFFeed: ", e);
224             return false;
225         }
226         return false;
227     }
228
229     /**
230      * Check if it is AAF sub OR existing sub.
231      *
232      * @param subId the Sub ID
233      * @return true if it is valid
234      */
235     @SuppressWarnings("resource")
236     private boolean isAAFSubscriber(int subId) {
237         try {
238             Subscription subscriber = Subscription.getSubscriptionById(subId);
239             if (subscriber != null) {
240                 if (!((subscriber.getAafInstance().equalsIgnoreCase("legacy")) || subscriber.getAafInstance() == null || subscriber.getAafInstance().equals(""))) { //also apply null check and empty check too
241                     aafInstance = subscriber.getAafInstance();
242                     String message = "DRProvCadiFilter.isAAFSubscriber: aafInstance-:" + aafInstance + "; subId:- " + subId;
243                     intlogger.debug(message);
244                     return true;
245                 } else {
246                     return false;
247                 }
248             } else {
249                 String message = "DRProvCadiFilter.isAAFSubscriber; Subscriber does not exist subId:-" + subId;
250                 intlogger.debug(message);
251             }
252         } catch (Exception e) {
253             intlogger.error("PROV0073 DRProvCadiFilter.isAAFSubscriber: ", e);
254             return false;
255         }
256         return false;
257     }
258
259 }