X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FNodeHttp.java;h=f17e1579764a62810b65214c0438bf3b41cc1b33;hb=3fc22751d5f0023316497dcc321d470936dcd9fb;hp=de635983999998a5bcb2e6ad02d7ebad0f259d8b;hpb=c90be8d8cf3c1b52480e51fb7841cd3e7a5a3796;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeHttp.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeHttp.java index de6359839..f17e15797 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeHttp.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeHttp.java @@ -7,9 +7,12 @@ import static org.argeo.cms.CmsTypes.CMS_IMAGE; import java.io.IOException; import java.io.PrintWriter; +import java.net.MalformedURLException; +import java.net.URL; import java.security.PrivilegedExceptionAction; import java.security.cert.X509Certificate; import java.util.Calendar; +import java.util.Collection; import java.util.Enumeration; import javax.jcr.Node; @@ -28,16 +31,18 @@ import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.cms.CmsException; -import org.argeo.cms.util.CmsUtils; -import org.argeo.jcr.ArgeoJcrConstants; import org.argeo.jcr.JcrUtils; -import org.eclipse.equinox.http.servlet.ExtendedHttpService; +import org.argeo.node.NodeConstants; +import org.argeo.node.NodeUtils; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.osgi.service.http.HttpService; /** * Intercepts and enriches http access, mainly focusing on security and * transactionality. */ -class NodeHttp implements KernelConstants, ArgeoJcrConstants { +class NodeHttp implements KernelConstants { private final static Log log = LogFactory.getLog(NodeHttp.class); // Filters @@ -46,16 +51,16 @@ class NodeHttp implements KernelConstants, ArgeoJcrConstants { // private final DoSFilter dosFilter; // private final QoSFilter qosFilter; - private Repository repository; + private BundleContext bc; - NodeHttp(ExtendedHttpService httpService, Repository node) { - this.repository = node; + NodeHttp(HttpService httpService, BundleContext bc) { + this.bc = bc; // rootFilter = new RootFilter(); // dosFilter = new CustomDosFilter(); // qosFilter = new QoSFilter(); try { - httpService.registerServlet("/!", new LinkServlet(repository), null, null); + httpService.registerServlet("/!", new LinkServlet(), null, null); httpService.registerServlet("/robots.txt", new RobotServlet(), null, null); } catch (Exception e) { throw new CmsException("Cannot register filters", e); @@ -65,13 +70,8 @@ class NodeHttp implements KernelConstants, ArgeoJcrConstants { public void destroy() { } - static class LinkServlet extends HttpServlet { + class LinkServlet extends HttpServlet { private static final long serialVersionUID = 3749990143146845708L; - private final Repository repository; - - public LinkServlet(Repository repository) { - this.repository = repository; - } @Override protected void service(HttpServletRequest request, HttpServletResponse response) @@ -118,6 +118,9 @@ class NodeHttp implements KernelConstants, ArgeoJcrConstants { @Override public Session run() throws Exception { + Collection> srs = bc.getServiceReferences(Repository.class, + "(" + NodeConstants.CN + "=" + NodeConstants.NODE + ")"); + Repository repository = bc.getService(srs.iterator().next()); return repository.login(); } @@ -127,13 +130,13 @@ class NodeHttp implements KernelConstants, ArgeoJcrConstants { String desc = node.hasProperty(JCR_DESCRIPTION) ? node.getProperty(JCR_DESCRIPTION).getString() : null; Calendar lastUpdate = node.hasProperty(JCR_LAST_MODIFIED) ? node.getProperty(JCR_LAST_MODIFIED).getDate() : null; - String url = CmsUtils.getCanonicalUrl(node, request); + String url = getCanonicalUrl(node, request); String imgUrl = null; loop: for (NodeIterator it = node.getNodes(); it.hasNext();) { // Takes the first found cms:image Node child = it.nextNode(); if (child.isNodeType(CMS_IMAGE)) { - imgUrl = CmsUtils.getDataUrl(child, request); + imgUrl = getDataUrl(child, request); break loop; } } @@ -176,7 +179,7 @@ class NodeHttp implements KernelConstants, ArgeoJcrConstants { * escaping-html-in-java (+ escaping '). TODO Use * org.apache.commons.lang.StringEscapeUtils */ - private static String escapeHTML(String s) { + private String escapeHTML(String s) { StringBuilder out = new StringBuilder(Math.max(16, s.length())); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); @@ -207,6 +210,71 @@ class NodeHttp implements KernelConstants, ArgeoJcrConstants { } buf.append(""); } + + // DATA + private StringBuilder getServerBaseUrl(HttpServletRequest request) { + try { + URL url = new URL(request.getRequestURL().toString()); + StringBuilder buf = new StringBuilder(); + buf.append(url.getProtocol()).append("://").append(url.getHost()); + if (url.getPort() != -1) + buf.append(':').append(url.getPort()); + return buf; + } catch (MalformedURLException e) { + throw new CmsException("Cannot extract server base URL from " + request.getRequestURL(), e); + } + } + + private String getDataUrl(Node node, HttpServletRequest request) throws RepositoryException { + try { + StringBuilder buf = getServerBaseUrl(request); + buf.append(NodeUtils.getDataPath(NodeConstants.NODE, node)); + return new URL(buf.toString()).toString(); + } catch (MalformedURLException e) { + throw new CmsException("Cannot build data URL for " + node, e); + } + } + + // public static String getDataPath(Node node) throws + // RepositoryException { + // assert node != null; + // String userId = node.getSession().getUserID(); + //// if (log.isTraceEnabled()) + //// log.trace(userId + " : " + node.getPath()); + // StringBuilder buf = new StringBuilder(); + // boolean isAnonymous = + // userId.equalsIgnoreCase(NodeConstants.ROLE_ANONYMOUS); + // if (isAnonymous) + // buf.append(WEBDAV_PUBLIC); + // else + // buf.append(WEBDAV_PRIVATE); + // Session session = node.getSession(); + // Repository repository = session.getRepository(); + // String cn; + // if (repository.isSingleValueDescriptor(NodeConstants.CN)) { + // cn = repository.getDescriptor(NodeConstants.CN); + // } else { + //// log.warn("No cn defined in repository, using " + + // NodeConstants.NODE); + // cn = NodeConstants.NODE; + // } + // return + // buf.append('/').append(cn).append('/').append(session.getWorkspace().getName()).append(node.getPath()) + // .toString(); + // } + + private String getCanonicalUrl(Node node, HttpServletRequest request) throws RepositoryException { + try { + StringBuilder buf = getServerBaseUrl(request); + buf.append('/').append('!').append(node.getPath()); + return new URL(buf.toString()).toString(); + } catch (MalformedURLException e) { + throw new CmsException("Cannot build data URL for " + node, e); + } + // return request.getRequestURL().append('!').append(node.getPath()) + // .toString(); + } + } class RobotServlet extends HttpServlet { @@ -247,7 +315,7 @@ class NodeHttp implements KernelConstants, ArgeoJcrConstants { } // skip data - if (servletPath.startsWith(PATH_DATA)) { + if (servletPath.startsWith(NodeConstants.PATH_DATA)) { filterChain.doFilter(request, response); return; }