2 * ============LICENSE_START=======================================================
3 * ONAP : ccsdk features
4 * ================================================================================
5 * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.ccsdk.features.sdnr.wt.dataprovider.http;
24 import java.io.IOException;
25 import java.nio.charset.StandardCharsets;
26 import java.util.Base64;
27 import java.util.regex.Matcher;
28 import java.util.regex.Pattern;
29 import javax.servlet.ServletException;
30 import javax.servlet.http.HttpServlet;
31 import javax.servlet.http.HttpServletRequest;
32 import javax.servlet.http.HttpServletResponse;
33 import org.json.JSONObject;
34 import org.onap.ccsdk.features.sdnr.wt.common.http.BaseHTTPClient;
35 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtUserdataManager;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
39 public class UserdataHttpServlet extends HttpServlet {
41 private static final long serialVersionUID = 1L;
42 private static final Logger LOG = LoggerFactory.getLogger(UserdataHttpServlet.class);
43 private static final String REGEX = "^\\/userdata[\\/]?([a-zA-Z0-9]+)?$";
44 private static final Pattern PATTERN = Pattern.compile(REGEX);
45 private static final String JWT_PAYLOAD_USERNAME_PROPERTYKEY = "sub";
46 private static HtUserdataManager dbUserManager;
49 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
50 final String uri = req.getRequestURI();
51 final Matcher matcher = PATTERN.matcher(uri);
53 LOG.info("GET found match");
54 this.handleGetRequest(req, resp, matcher.groupCount() > 0 ? matcher.group(1) : null);
56 LOG.info("no valid request");
57 super.doGet(req, resp);
62 protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
63 final String uri = req.getRequestURI();
64 final Matcher matcher = PATTERN.matcher(uri);
66 LOG.info("PUT found match");
67 final String payload = getPayload(req);
68 this.handlePutRequest(req, resp, payload, matcher.groupCount() > 0 ? matcher.group(1) : null);
70 LOG.info("no valid request");
71 super.doPut(req, resp);
75 private String getPayload(HttpServletRequest req) throws IOException {
76 return DataTreeHttpServlet.readPayload(req);
80 protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
81 final String uri = req.getRequestURI();
82 final Matcher matcher = PATTERN.matcher(uri);
84 LOG.info("DELETE found match");
85 this.handleDeleteRequest(req, resp, matcher.groupCount() > 0 ? matcher.group(1) : null);
87 LOG.info("no valid request");
88 super.doPut(req, resp);
92 private void handleGetRequest(HttpServletRequest req, HttpServletResponse resp, String key) {
93 final String username = this.getUsername(req);
94 if (username == null) {
95 resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
98 sendJsonResponse(resp,
99 key == null ? dbUserManager.getUserdata(username) : dbUserManager.getUserdata(username, key));
103 private void handlePutRequest(HttpServletRequest req, HttpServletResponse resp, String data, String key) {
104 final String username = this.getUsername(req);
105 if (username == null) {
106 resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
109 boolean success = key == null ? dbUserManager.setUserdata(username, data)
110 : dbUserManager.setUserdata(username, key, data);
111 resp.setStatus(success ? HttpServletResponse.SC_OK : HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
114 private void handleDeleteRequest(HttpServletRequest req, HttpServletResponse resp, String key) {
115 final String username = this.getUsername(req);
116 if (username == null) {
117 resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
121 key == null ? dbUserManager.removeUserdata(username) : dbUserManager.removeUserdata(username, key);
122 resp.setStatus(success ? HttpServletResponse.SC_OK : HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
125 private String getUsername(HttpServletRequest req) {
126 final String authHeader = req.getHeader("Authorization");
127 if (authHeader == null) {
130 String username = null;
131 if (authHeader.startsWith("Basic")) {
132 username = BaseHTTPClient.decodeBasicAuthHeaderUsername(authHeader);
133 } else if (authHeader.startsWith("Bearer")) {
134 username = decodeJWTPayloadUsername(authHeader, JWT_PAYLOAD_USERNAME_PROPERTYKEY);
139 public static String decodeJWTPayloadUsername(String authHeader, String key) {
140 String username = null;
141 if (authHeader.startsWith("Bearer")) {
142 authHeader = authHeader.substring(7);
144 String[] tmp = authHeader.split("\\.");
145 if (tmp.length == 3) {
146 final String decoded = new String(Base64.getDecoder().decode(tmp[1]));
147 JSONObject o = new JSONObject(decoded);
149 username = o.getString(key);
150 if (username != null && username.contains("@")) {
151 username = username.split("@")[0];
158 private static void sendJsonResponse(HttpServletResponse resp, String userdata) {
159 resp.setContentType("application/json");
160 resp.setStatus(HttpServletResponse.SC_OK);
163 resp.getOutputStream().write(userdata.getBytes(StandardCharsets.UTF_8));
164 } catch (IOException e) {
165 LOG.warn("problem sending response: ", e);
170 public void setDatabaseClient(HtUserdataManager dbMgr) {
171 dbUserManager = dbMgr;