X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FNodeHttp.java;h=f17e1579764a62810b65214c0438bf3b41cc1b33;hb=7e333073d07b780efe681306a1842a750cbea83c;hp=eee6dcd51228073556365bdbfe30ae719a4ba412;hpb=cdcf890d84a46be33ce570994ae6d97395083b72;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 eee6dcd51..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,6 +7,8 @@ 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; @@ -29,18 +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 @@ -51,7 +53,7 @@ class NodeHttp implements KernelConstants, ArgeoJcrConstants { private BundleContext bc; - NodeHttp(ExtendedHttpService httpService, BundleContext bc) { + NodeHttp(HttpService httpService, BundleContext bc) { this.bc = bc; // rootFilter = new RootFilter(); // dosFilter = new CustomDosFilter(); @@ -116,8 +118,8 @@ class NodeHttp implements KernelConstants, ArgeoJcrConstants { @Override public Session run() throws Exception { - Collection> srs = bc.getServiceReferences(Repository.class, "(" - + ArgeoJcrConstants.JCR_REPOSITORY_ALIAS + "=" + ArgeoJcrConstants.ALIAS_NODE + ")"); + Collection> srs = bc.getServiceReferences(Repository.class, + "(" + NodeConstants.CN + "=" + NodeConstants.NODE + ")"); Repository repository = bc.getService(srs.iterator().next()); return repository.login(); } @@ -128,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; } } @@ -208,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 { @@ -248,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; }