1 /*******************************************************************************
2 * ============LICENSE_START==================================================
4 * * ===========================================================================
5 * * Copyright © 2017 AT&T Intellectual Property. 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
11 * * http://www.apache.org/licenses/LICENSE-2.0
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====================================================
20 * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22 ******************************************************************************/
25 package org.onap.dmaap.datarouter.provisioning;
27 import static org.onap.dmaap.datarouter.provisioning.utils.HttpServletUtils.sendResponseError;
29 import com.att.eelf.configuration.EELFLogger;
30 import com.att.eelf.configuration.EELFManager;
31 import java.io.IOException;
32 import java.io.InvalidObjectException;
33 import javax.servlet.http.HttpServletRequest;
34 import javax.servlet.http.HttpServletResponse;
35 import org.json.JSONException;
36 import org.json.JSONObject;
37 import org.onap.dmaap.datarouter.authz.AuthorizationResponse;
38 import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;
39 import org.onap.dmaap.datarouter.provisioning.beans.Feed;
40 import org.onap.dmaap.datarouter.provisioning.eelf.EelfMsgs;
45 * This servlet handles provisioning for the <feedURL> which is generated by the provisioning
46 * server to handle a particular feed. It supports DELETE to mark the feed as deleted,
47 * and GET to retrieve information about the feed, and PUT to modify the feed.
52 @SuppressWarnings("serial")
54 public class FeedServlet extends ProxyServlet {
56 //Adding EELF Logger Rally:US664892
57 private static EELFLogger eelfLogger = EELFManager.getInstance().getLogger(FeedServlet.class);
60 * Delete the Feed at the address /feed/<feednumber>.
61 * See the <i>Deleting a Feed</i> section in the <b>Provisioning API</b>
62 * document for details on how this method should be invoked.
65 public void doDelete(HttpServletRequest req, HttpServletResponse resp) {
66 setIpFqdnRequestIDandInvocationIDForEelf("doDelete", req);
67 eelfLogger.info(EelfMsgs.ENTRY);
69 eelfLogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID,
70 req.getHeader(BEHALF_HEADER),getIdFromPath(req) + "");
71 EventLogRecord elr = new EventLogRecord(req);
72 String message = isAuthorizedForProvisioning(req);
73 if (message != null) {
74 elr.setMessage(message);
75 elr.setResult(HttpServletResponse.SC_FORBIDDEN);
76 eventlogger.error(elr.toString());
77 sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);
80 if (isProxyServer()) {
81 super.doDelete(req, resp);
84 String bhdr = req.getHeader(BEHALF_HEADER);
86 message = MISSING_ON_BEHALF;
87 elr.setMessage(message);
88 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
89 eventlogger.error(elr.toString());
90 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
93 int feedid = getIdFromPath(req);
95 message = MISSING_FEED;
96 elr.setMessage(message);
97 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
98 eventlogger.error(elr.toString());
99 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
102 Feed feed = Feed.getFeedById(feedid);
103 if (feed == null || feed.isDeleted()) {
104 message = MISSING_FEED;
105 elr.setMessage(message);
106 elr.setResult(HttpServletResponse.SC_NOT_FOUND);
107 eventlogger.error(elr.toString());
108 sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, message, eventlogger);
112 * START - AAF changes
113 * TDP EPIC US# 307413
114 * CADI code - check on permissions based on Legacy/AAF users to allow to delete/remove feed
116 String aafInstance = feed.getAafInstance();
117 if (aafInstance == null || "".equals(aafInstance) || "legacy".equalsIgnoreCase(aafInstance)) {
118 AuthorizationResponse aresp = authz.decide(req);
119 if (! aresp.isAuthorized()) {
120 message = POLICY_ENGINE;
121 elr.setMessage(message);
122 elr.setResult(HttpServletResponse.SC_FORBIDDEN);
123 eventlogger.error(elr.toString());
124 sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);
128 String permission = getFeedPermission(aafInstance, BaseServlet.DELETE_PERMISSION);
129 eventlogger.info("FeedServlet.doDelete().. Permission String - " + permission);
130 if (!req.isUserInRole(permission)) {
131 message = "AAF disallows access to permission - " + permission;
132 elr.setMessage(message);
133 elr.setResult(HttpServletResponse.SC_FORBIDDEN);
134 eventlogger.error(elr.toString());
135 sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);
142 // Delete FEED table entry (set DELETED flag)
143 feed.setDeleted(true);
144 if (doUpdate(feed)) {
147 elr.setResult(HttpServletResponse.SC_NO_CONTENT);
148 eventlogger.info(elr.toString());
149 resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
150 provisioningDataChanged();
152 // Something went wrong with the UPDATE
153 elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
154 eventlogger.error(elr.toString());
155 sendResponseError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG, eventlogger);
158 eelfLogger.info(EelfMsgs.EXIT);
163 * Get information on the feed at the address /feed/<feednumber>.
164 * See the <i>Retrieving Information about a Feed</i> section in the <b>Provisioning API</b>
165 * document for details on how this method should be invoked.
168 public void doGet(HttpServletRequest req, HttpServletResponse resp) {
169 setIpFqdnRequestIDandInvocationIDForEelf("doGet", req);
170 eelfLogger.info(EelfMsgs.ENTRY);
172 eelfLogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID,
173 req.getHeader(BEHALF_HEADER),getIdFromPath(req) + "");
174 EventLogRecord elr = new EventLogRecord(req);
175 String message = isAuthorizedForProvisioning(req);
176 if (message != null) {
177 elr.setMessage(message);
178 elr.setResult(HttpServletResponse.SC_FORBIDDEN);
179 eventlogger.error(elr.toString());
180 sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);
183 if (isProxyServer()) {
184 super.doGet(req, resp);
187 String bhdr = req.getHeader(BEHALF_HEADER);
189 message = MISSING_ON_BEHALF;
190 elr.setMessage(message);
191 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
192 eventlogger.error(elr.toString());
193 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
196 int feedid = getIdFromPath(req);
198 message = MISSING_FEED;
199 elr.setMessage(message);
200 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
201 eventlogger.error(elr.toString());
202 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
205 Feed feed = Feed.getFeedById(feedid);
206 if (feed == null || feed.isDeleted()) {
207 message = MISSING_FEED;
208 elr.setMessage(message);
209 elr.setResult(HttpServletResponse.SC_NOT_FOUND);
210 eventlogger.error(elr.toString());
211 sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, message, eventlogger);
214 // Check with the Authorizer
215 AuthorizationResponse aresp = authz.decide(req);
216 if (! aresp.isAuthorized()) {
217 message = POLICY_ENGINE;
218 elr.setMessage(message);
219 elr.setResult(HttpServletResponse.SC_FORBIDDEN);
220 eventlogger.error(elr.toString());
221 sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);
226 elr.setResult(HttpServletResponse.SC_OK);
227 eventlogger.info(elr.toString());
228 resp.setStatus(HttpServletResponse.SC_OK);
229 resp.setContentType(FEEDFULL_CONTENT_TYPE);
231 resp.getOutputStream().print(feed.asJSONObject(true).toString());
232 } catch (IOException ioe) {
233 eventlogger.error("PROV0101 FeedServlet.doGet: " + ioe.getMessage(), ioe);
236 eelfLogger.info(EelfMsgs.EXIT);
241 * PUT on the <feedURL> for a feed.
242 * See the <i>Modifying a Feed</i> section in the <b>Provisioning API</b>
243 * document for details on how this method should be invoked.
246 public void doPut(HttpServletRequest req, HttpServletResponse resp) {
247 setIpFqdnRequestIDandInvocationIDForEelf("doPut", req);
248 eelfLogger.info(EelfMsgs.ENTRY);
250 eelfLogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID,
251 req.getHeader(BEHALF_HEADER),getIdFromPath(req) + "");
252 EventLogRecord elr = new EventLogRecord(req);
253 String message = isAuthorizedForProvisioning(req);
254 if (message != null) {
255 elr.setMessage(message);
256 elr.setResult(HttpServletResponse.SC_FORBIDDEN);
257 eventlogger.error(elr.toString());
258 sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);
261 if (isProxyServer()) {
262 super.doPut(req, resp);
265 String bhdr = req.getHeader(BEHALF_HEADER);
267 message = MISSING_ON_BEHALF;
268 elr.setMessage(message);
269 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
270 eventlogger.error(elr.toString());
271 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
274 int feedid = getIdFromPath(req);
276 message = MISSING_FEED;
277 elr.setMessage(message);
278 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
279 eventlogger.error(elr.toString());
280 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
283 Feed oldFeed = Feed.getFeedById(feedid);
284 if (oldFeed == null || oldFeed.isDeleted()) {
285 message = MISSING_FEED;
286 elr.setMessage(message);
287 elr.setResult(HttpServletResponse.SC_NOT_FOUND);
288 eventlogger.error(elr.toString());
289 sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, message, eventlogger);
292 // check content type is FEED_CONTENT_TYPE, version 1.0
293 ContentHeader ch = getContentHeader(req);
294 String ver = ch.getAttribute("version");
295 if (!ch.getType().equals(FEED_BASECONTENT_TYPE) || !("1.0".equals(ver) || "2.0".equals(ver))) {
296 message = "Incorrect content-type";
297 elr.setMessage(message);
298 elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
299 eventlogger.error(elr.toString());
300 sendResponseError(resp, HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message, eventlogger);
303 JSONObject jo = getJSONfromInput(req);
306 elr.setMessage(message);
307 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
308 eventlogger.error(elr.toString());
309 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
315 } catch (InvalidObjectException e) {
316 message = e.getMessage();
317 elr.setMessage(message);
318 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
319 eventlogger.error(elr.toString(), e);
320 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
323 feed.setFeedid(feedid);
324 feed.setPublisher(bhdr); // set from X-DMAAP-DR-ON-BEHALF-OF header
326 //Adding for group feature:Rally US708115
327 String subjectgroup = (req.getHeader("X-DMAAP-DR-ON-BEHALF-OF-GROUP"));
328 if (!oldFeed.getPublisher().equals(feed.getPublisher()) && subjectgroup == null) {
329 message = "This feed must be modified by the same publisher that created it.";
330 elr.setMessage(message);
331 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
332 eventlogger.error(elr.toString());
333 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
336 if (!oldFeed.getName().equals(feed.getName())) {
337 message = "The name of the feed may not be updated.";
338 elr.setMessage(message);
339 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
340 eventlogger.error(elr.toString());
341 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
344 // US DSCDR-19 for DCAE if version is not null, version can't be changed
345 if ((oldFeed.getVersion() != null) && (feed.getVersion() != null)
346 && !oldFeed.getVersion().equals(feed.getVersion())) {
347 message = "The version of the feed may not be updated.";
348 elr.setMessage(message);
349 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
350 eventlogger.error(elr.toString());
351 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
356 * START - AAF changes
357 * TDP EPIC US# 307413
358 * CADI code - check on permissions based on Legacy/AAF users to allow feed edit/update/modify
360 String aafInstance = feed.getAafInstance();
361 if (aafInstance == null || "".equals(aafInstance) || "legacy".equalsIgnoreCase(aafInstance)) {
362 // Check with the Authorizer
363 AuthorizationResponse aresp = authz.decide(req);
364 if (!aresp.isAuthorized()) {
365 message = POLICY_ENGINE;
366 elr.setMessage(message);
367 elr.setResult(HttpServletResponse.SC_FORBIDDEN);
368 eventlogger.error(elr.toString());
369 sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);
373 String permission = getFeedPermission(aafInstance, BaseServlet.EDIT_PERMISSION);
374 eventlogger.info("FeedServlet.doPut().. Permission String - " + permission);
375 if (!req.isUserInRole(permission)) {
376 message = "AAF disallows access to permission - " + permission;
377 elr.setMessage(message);
378 elr.setResult(HttpServletResponse.SC_FORBIDDEN);
379 eventlogger.error(elr.toString());
380 sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);
388 // Update FEEDS table entries
389 if (doUpdate(feed)) {
391 elr.setResult(HttpServletResponse.SC_OK);
392 eventlogger.info(elr.toString());
393 resp.setStatus(HttpServletResponse.SC_OK);
394 resp.setContentType(FEEDFULL_CONTENT_TYPE);
396 resp.getOutputStream().print(feed.asLimitedJSONObject().toString());
397 } catch (IOException ioe) {
398 eventlogger.error("PROV0102 FeedServlet.doPut: " + ioe.getMessage(), ioe);
402 /**Change Owner ship of Feed //Adding for group feature. :Rally US708115*/
403 if (jo.has("changeowner") && subjectgroup != null) {
405 Boolean changeowner = (Boolean) jo.get("changeowner");
406 if (changeowner != null && changeowner.equals(true)) {
407 feed.setPublisher(req.getHeader(BEHALF_HEADER));
408 feed.changeOwnerShip();
410 } catch (JSONException je) {
411 eventlogger.error("PROV0103 FeedServlet.doPut: " + je.getMessage(), je);
414 /***End of change ownership.*/
416 provisioningDataChanged();
418 // Something went wrong with the UPDATE
419 elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
420 eventlogger.error(elr.toString());
421 sendResponseError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG, eventlogger);
424 eelfLogger.info(EelfMsgs.EXIT);
429 * POST on the <feedURL> -- not supported.
432 public void doPost(HttpServletRequest req, HttpServletResponse resp) {
433 setIpFqdnRequestIDandInvocationIDForEelf("doPost", req);
434 eelfLogger.info(EelfMsgs.ENTRY);
436 eelfLogger.info(EelfMsgs.MESSAGE_WITH_BEHALF, req.getHeader(BEHALF_HEADER));
437 String message = "POST not allowed for the feedURL.";
438 EventLogRecord elr = new EventLogRecord(req);
439 elr.setMessage(message);
440 elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
441 eventlogger.error(elr.toString());
442 sendResponseError(resp, HttpServletResponse.SC_METHOD_NOT_ALLOWED, message, eventlogger);
444 eelfLogger.info(EelfMsgs.EXIT);