1 package org.openecomp.sdc.webseal.simulator;
3 import org.apache.commons.httpclient.Header;
4 import org.apache.commons.httpclient.HttpClient;
5 import org.apache.commons.httpclient.HttpException;
6 import org.apache.commons.httpclient.HttpMethodBase;
7 import org.apache.commons.httpclient.methods.*;
8 import org.apache.commons.httpclient.protocol.Protocol;
9 import org.openecomp.sdc.webseal.simulator.SSL.DummySSLProtocolSocketFactory;
10 import org.openecomp.sdc.webseal.simulator.conf.Conf;
12 import javax.net.ssl.X509TrustManager;
13 import javax.servlet.RequestDispatcher;
14 import javax.servlet.ServletConfig;
15 import javax.servlet.ServletException;
16 import javax.servlet.http.Cookie;
17 import javax.servlet.http.HttpServlet;
18 import javax.servlet.http.HttpServletRequest;
19 import javax.servlet.http.HttpServletResponse;
21 import java.net.MalformedURLException;
23 import java.net.URLEncoder;
24 import java.security.cert.CertificateException;
25 import java.security.cert.X509Certificate;
26 import java.util.ArrayList;
27 import java.util.Enumeration;
28 import java.util.List;
30 import java.util.zip.GZIPInputStream;
32 public class SdcProxy extends HttpServlet {
34 private static final long serialVersionUID = 1L;
36 private HttpClient proxy;
39 private final String SDC1 = "/sdc1";
40 private final String ONBOARDING = "/onboarding/";
41 private final String SCRIPTS = "/scripts";
42 private final String STYLES = "/styles";
43 private final String LANGUAGES = "/languages";
44 private final String CONFIGURATIONS = "/configurations";
46 public void init(ServletConfig config) throws ServletException {
48 conf = Conf.getInstance();
50 String feHost = conf.getFeHost();
51 this.url = new URL(feHost);
52 } catch (MalformedURLException me) {
53 throw new ServletException("Proxy URL is invalid", me);
55 // Set up an HTTPS socket factory that accepts self-signed certs.
56 Protocol https = new Protocol("https",
57 new DummySSLProtocolSocketFactory(), 9443);
58 Protocol.registerProtocol("https", https);
60 this.proxy = new HttpClient();
61 this.proxy.getHostConfiguration().setHost(this.url.getHost());
67 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
68 proxy(request, response, MethodEnum.GET);
71 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
73 String userId = request.getParameter("userId");
74 String password = request.getParameter("password");
78 userId = request.getHeader("USER_ID");
81 System.out.println("SdcProxy -> doPost userId=" + userId);
82 request.setAttribute("message", "OK");
83 if (password != null && getUser(userId, password) == null) {
84 MutableHttpServletRequest mutableRequest = new MutableHttpServletRequest(request);
85 RequestDispatcher view = request.getRequestDispatcher("login");
86 request.setAttribute("message", "ERROR: userid or password incorect");
87 view.forward(mutableRequest, response);
89 System.out.println("SdcProxy -> doPost going to doGet");
90 request.setAttribute("HTTP_IV_USER", userId);
91 proxy(request, response, MethodEnum.POST);
95 public void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
96 proxy(request, response, MethodEnum.PUT);
99 public void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
100 proxy(request, response, MethodEnum.DELETE);
103 private synchronized void proxy(HttpServletRequest request, HttpServletResponse response, MethodEnum methodEnum) throws IOException, UnsupportedEncodingException, HttpException {
104 Map<String, String[]> requestParameters = request.getParameterMap();
105 System.out.print(request.getRequestURI() + " -> ");
107 String userIdHeader = getUseridFromRequest(request);
108 //System.out.print(" (userIdHeader=" + userIdHeader + ") ");
109 User user = getUser(userIdHeader);
111 // new request - forward to login page
112 if (userIdHeader == null) {
113 System.out.print("Going to login");
114 response.sendRedirect("/login");
118 String uri = getUri(request, requestParameters);
119 HttpMethodBase proxyMethod = getMethod(request, methodEnum, uri);
120 System.out.println(uri);
121 addHeaders(user, proxyMethod);
122 addHeaders(request, proxyMethod);
123 this.proxy.executeMethod(proxyMethod);
124 response.setStatus(proxyMethod.getStatusCode());
126 if (request.getRequestURI().indexOf(".svg") > -1) {
127 response.setContentType("image/svg+xml");
130 InputStream responseBodyStream = proxyMethod.getResponseBodyAsStream();
131 Header contentEncodingHeader = proxyMethod.getResponseHeader("Content-Encoding");
132 if (contentEncodingHeader != null && contentEncodingHeader.getValue().equalsIgnoreCase("gzip")) {
133 responseBodyStream = new GZIPInputStream(responseBodyStream);
135 write(responseBodyStream, response.getOutputStream());
138 private void addHeaders(HttpServletRequest request, HttpMethodBase proxyMethod) {
139 Enumeration<String> headerNames = request.getHeaderNames();
140 while (headerNames.hasMoreElements()) {
141 String headerName = headerNames.nextElement();
142 Enumeration<String> headers = request.getHeaders(headerName);
143 while (headers.hasMoreElements()) {
144 String headerValue = headers.nextElement();
145 proxyMethod.addRequestHeader(headerName, headerValue);
150 private User getUser(String userId, String password) {
151 User user = getUser(userId);
152 if (user.getPassword().equals(password)) {
158 private User getUser(String userId) {
159 return conf.getUsers().get(userId);
163 private List<String> getContextPaths(){
164 List<String> contextPaths = new ArrayList<>();
165 contextPaths.add(SDC1);
166 contextPaths.add(ONBOARDING);
167 contextPaths.add(STYLES);
168 contextPaths.add(SCRIPTS);
169 contextPaths.add(LANGUAGES);
170 contextPaths.add(CONFIGURATIONS);
174 private String getUri(HttpServletRequest request, Map<String, String[]> requestParameters) throws UnsupportedEncodingException {
175 String suffix = request.getRequestURI();
176 if (getContextPaths().stream().anyMatch(request.getRequestURI()::contains)) {
177 suffix = alignUrlProxy(suffix);
179 StringBuilder query = alignUrlParameters(requestParameters);
180 String uri = String.format("%s%s", new Object[] {this.url.toString() + suffix, query.toString() });
184 private HttpMethodBase getMethod(HttpServletRequest request, MethodEnum methodEnum, String uri) throws IOException {
185 HttpMethodBase proxyMethod = null;
186 switch (methodEnum) {
188 proxyMethod = new GetMethod(uri);
191 proxyMethod = new PostMethod(uri);
192 ((PostMethod) proxyMethod).setRequestEntity(new InputStreamRequestEntity(request.getInputStream()));
195 proxyMethod = new PutMethod(uri);
196 ((PutMethod) proxyMethod).setRequestBody(getBody(request));
199 proxyMethod = new DeleteMethod(uri);
205 private String getUseridFromRequest(HttpServletRequest request) {
207 String userIdHeader = request.getHeader("USER_ID");
208 if (userIdHeader != null){
211 Object o = request.getAttribute("HTTP_IV_USER");
215 Cookie[] cookies = request.getCookies();
217 if (cookies != null){
218 for (int i=0; i<cookies.length; ++i){
219 if (cookies[i].getName().equals("USER_ID")){
220 userIdHeader = cookies[i].getValue();
227 private void addHeaders(User user, HttpMethodBase proxyMethod) {
228 proxyMethod.addRequestHeader("HTTP_IV_USER", user.getUserId());
229 proxyMethod.addRequestHeader("USER_ID", user.getUserId());
230 proxyMethod.addRequestHeader("HTTP_CSP_FIRSTNAME", user.getFirstName());
231 proxyMethod.addRequestHeader("HTTP_CSP_EMAIL", user.getEmail());
232 proxyMethod.addRequestHeader("HTTP_CSP_LASTNAME", user.getLastName());
233 proxyMethod.addRequestHeader("HTTP_IV_REMOTE_ADDRESS", "0.0.0.0");
234 proxyMethod.addRequestHeader("HTTP_CSP_WSTYPE", "Intranet");
235 proxyMethod.addRequestHeader("HTTP_CSP_EMAIL", "me@mail.com");
238 private String alignUrlProxy(String requestURI) {
240 int i = requestURI.indexOf(ONBOARDING);
242 return requestURI.substring(i);
245 i = requestURI.indexOf(SDC1+SDC1);
247 return requestURI.substring(SDC1.length());
250 i = requestURI.indexOf(SDC1);
255 return SDC1+requestURI;
258 private StringBuilder alignUrlParameters(Map<String, String[]> requestParameters) throws UnsupportedEncodingException {
259 StringBuilder query = new StringBuilder();
260 for (String name : requestParameters.keySet()) {
261 for (String value : (String[]) requestParameters.get(name)) {
262 if (query.length() == 0) {
267 name = URLEncoder.encode(name, "UTF-8");
268 value = URLEncoder.encode(value, "UTF-8");
270 query.append(String.format("&%s=%s", new Object[] { name, value }));
276 private void write(InputStream inputStream, OutputStream outputStream) throws IOException {
278 while (inputStream != null && (b = inputStream.read()) != -1) {
279 outputStream.write(b);
281 outputStream.flush();
284 public String getServletInfo() {
285 return "Http Proxy Servlet";
289 public String getBody(HttpServletRequest request) throws IOException {
292 StringBuilder stringBuilder = new StringBuilder();
293 BufferedReader bufferedReader = null;
296 InputStream inputStream = request.getInputStream();
297 if (inputStream != null) {
298 bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
299 char[] charBuffer = new char[128];
301 while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
302 stringBuilder.append(charBuffer, 0, bytesRead);
305 stringBuilder.append("");
307 } catch (IOException ex) {
310 if (bufferedReader != null) {
312 bufferedReader.close();
313 } catch (IOException ex) {
319 body = stringBuilder.toString();
323 private class DefaultTrustManager implements X509TrustManager {
326 public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}
329 public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}
332 public X509Certificate[] getAcceptedIssuers() {