]> git.argeo.org Git - lgpl/argeo-commons.git/blob - NodeHttp.java
5e1f39acb1f7a57d0651a0976a5c0cc786a781a1
[lgpl/argeo-commons.git] / NodeHttp.java
1 package org.argeo.cms.internal.kernel;
2
3 import java.io.IOException;
4 import java.security.cert.X509Certificate;
5 import java.util.Enumeration;
6
7 import javax.servlet.FilterChain;
8 import javax.servlet.ServletException;
9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 import javax.servlet.http.HttpSession;
12
13 import org.apache.commons.logging.Log;
14 import org.apache.commons.logging.LogFactory;
15 import org.argeo.cms.CmsException;
16 import org.argeo.jcr.ArgeoJcrConstants;
17 import org.eclipse.equinox.http.servlet.ExtendedHttpService;
18
19 /**
20 * Intercepts and enriches http access, mainly focusing on security and
21 * transactionality.
22 */
23 @Deprecated
24 class NodeHttp implements KernelConstants, ArgeoJcrConstants {
25 private final static Log log = LogFactory.getLog(NodeHttp.class);
26
27 // Filters
28 private final RootFilter rootFilter;
29
30 // private final DoSFilter dosFilter;
31 // private final QoSFilter qosFilter;
32
33 NodeHttp(ExtendedHttpService httpService) {
34 rootFilter = new RootFilter();
35 // dosFilter = new CustomDosFilter();
36 // qosFilter = new QoSFilter();
37
38 try {
39 httpService.registerFilter("/", rootFilter, null, null);
40 } catch (Exception e) {
41 throw new CmsException("Cannot register filters", e);
42 }
43 }
44
45 public void destroy() {
46 }
47
48 /** Intercepts all requests. Authenticates. */
49 class RootFilter extends HttpFilter {
50
51 @Override
52 public void doFilter(HttpSession httpSession,
53 HttpServletRequest request, HttpServletResponse response,
54 FilterChain filterChain) throws IOException, ServletException {
55 if (log.isTraceEnabled()) {
56 log.trace(request.getRequestURL().append(
57 request.getQueryString() != null ? "?"
58 + request.getQueryString() : ""));
59 logRequest(request);
60 }
61
62 String servletPath = request.getServletPath();
63
64 // client certificate
65 X509Certificate clientCert = extractCertificate(request);
66 if (clientCert != null) {
67 // TODO authenticate
68 // if (log.isDebugEnabled())
69 // log.debug(clientCert.getSubjectX500Principal().getName());
70 }
71
72 // skip data
73 if (servletPath.startsWith(PATH_DATA)) {
74 filterChain.doFilter(request, response);
75 return;
76 }
77
78 // skip /ui (workbench) for the time being
79 if (servletPath.startsWith(PATH_WORKBENCH)) {
80 filterChain.doFilter(request, response);
81 return;
82 }
83
84 // redirect long RWT paths to anchor
85 String path = request.getRequestURI().substring(
86 servletPath.length());
87 int pathLength = path.length();
88 if (pathLength != 0 && (path.charAt(0) == '/')
89 && !servletPath.endsWith("rwt-resources")
90 && !path.startsWith(KernelConstants.PATH_WORKBENCH)
91 && path.lastIndexOf('/') != 0) {
92 String newLocation = request.getServletPath() + "#" + path;
93 response.setHeader("Location", newLocation);
94 response.setStatus(HttpServletResponse.SC_FOUND);
95 return;
96 }
97
98 // process normally
99 filterChain.doFilter(request, response);
100 }
101 }
102
103 private void logRequest(HttpServletRequest request) {
104 log.debug("contextPath=" + request.getContextPath());
105 log.debug("servletPath=" + request.getServletPath());
106 log.debug("requestURI=" + request.getRequestURI());
107 log.debug("queryString=" + request.getQueryString());
108 StringBuilder buf = new StringBuilder();
109 // headers
110 Enumeration<String> en = request.getHeaderNames();
111 while (en.hasMoreElements()) {
112 String header = en.nextElement();
113 Enumeration<String> values = request.getHeaders(header);
114 while (values.hasMoreElements())
115 buf.append(" " + header + ": " + values.nextElement());
116 buf.append('\n');
117 }
118
119 // attributed
120 Enumeration<String> an = request.getAttributeNames();
121 while (an.hasMoreElements()) {
122 String attr = an.nextElement();
123 Object value = request.getAttribute(attr);
124 buf.append(" " + attr + ": " + value);
125 buf.append('\n');
126 }
127 log.debug("\n" + buf);
128 }
129
130 private X509Certificate extractCertificate(HttpServletRequest req) {
131 X509Certificate[] certs = (X509Certificate[]) req
132 .getAttribute("javax.servlet.request.X509Certificate");
133 if (null != certs && certs.length > 0) {
134 return certs[0];
135 }
136 return null;
137 }
138
139 // class CustomDosFilter extends DoSFilter {
140 // @Override
141 // protected String extractUserId(ServletRequest request) {
142 // HttpSession httpSession = ((HttpServletRequest) request)
143 // .getSession();
144 // if (isSessionAuthenticated(httpSession)) {
145 // String userId = ((SecurityContext) httpSession
146 // .getAttribute(SPRING_SECURITY_CONTEXT_KEY))
147 // .getAuthentication().getName();
148 // return userId;
149 // }
150 // return super.extractUserId(request);
151 //
152 // }
153 // }
154 }