From: Mathieu Baudier Date: Fri, 5 Jun 2020 04:39:28 +0000 (+0200) Subject: Use whiteboard for the files servlet. X-Git-Tag: argeo-commons-2.1.89~132 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=43a797b3947a43d4fe41502b0a2b20adf8acaf2a;p=lgpl%2Fargeo-commons.git Use whiteboard for the files servlet. --- diff --git a/org.argeo.cms/OSGI-INF/filesServlet.xml b/org.argeo.cms/OSGI-INF/filesServlet.xml new file mode 100644 index 000000000..498d09749 --- /dev/null +++ b/org.argeo.cms/OSGI-INF/filesServlet.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/org.argeo.cms/OSGI-INF/filesServletContext.xml b/org.argeo.cms/OSGI-INF/filesServletContext.xml new file mode 100644 index 000000000..a9993a355 --- /dev/null +++ b/org.argeo.cms/OSGI-INF/filesServletContext.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/org.argeo.cms/bnd.bnd b/org.argeo.cms/bnd.bnd index e89451e3a..4eae650a3 100644 --- a/org.argeo.cms/bnd.bnd +++ b/org.argeo.cms/bnd.bnd @@ -10,6 +10,8 @@ org.apache.commons.httpclient.cookie;resolution:=optional,\ org.osgi.*;version=0.0.0,\ * -Service-Component: OSGI-INF/cmsUserManager.xml +Service-Component: OSGI-INF/cmsUserManager.xml,\ +OSGI-INF/filesServletContext.xml,\ +OSGI-INF/filesServlet.xml Provide-Capability: cms.datamodel;name=argeo;cnd=/org/argeo/cms/argeo.cnd;abstract=true diff --git a/org.argeo.cms/build.properties b/org.argeo.cms/build.properties index 03b14d434..55f4d9ae5 100644 --- a/org.argeo.cms/build.properties +++ b/org.argeo.cms/build.properties @@ -1,9 +1,8 @@ output.. = bin/ bin.includes = META-INF/,\ .,\ - OSGI-INF/,\ bin/,\ - OSGI-INF/cmsUserManager.xml + OSGI-INF/ source.. = src/,\ ext/test/ additional.bundles = org.apache.jackrabbit.data,\ diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/CmsWebDavServlet.java b/org.argeo.cms/src/org/argeo/cms/internal/http/CmsWebDavServlet.java new file mode 100644 index 000000000..f60e3b604 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/http/CmsWebDavServlet.java @@ -0,0 +1,26 @@ +package org.argeo.cms.internal.http; + +import java.util.Map; + +import javax.jcr.Repository; + +import org.apache.jackrabbit.webdav.simple.SimpleWebdavServlet; +import org.argeo.api.NodeConstants; + +public class CmsWebDavServlet extends SimpleWebdavServlet { + private static final long serialVersionUID = 7485800288686328063L; + private Repository repository; + + @Override + public Repository getRepository() { + return repository; + } + + public void setRepository(Repository repository, Map properties) { + this.repository = repository; + String alias = properties.get(NodeConstants.CN); + if (alias != null) + setSessionProvider(new CmsSessionProvider(alias)); + } + +} diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/PrivateServletContextHelper.java b/org.argeo.cms/src/org/argeo/cms/internal/http/PrivateServletContextHelper.java new file mode 100644 index 000000000..62e74c34f --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/http/PrivateServletContextHelper.java @@ -0,0 +1,77 @@ +package org.argeo.cms.internal.http; + +import java.io.IOException; +import java.net.URL; +import java.util.Map; + +import javax.security.auth.login.LoginContext; +import javax.security.auth.login.LoginException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.api.NodeConstants; +import org.argeo.cms.auth.HttpRequestCallbackHandler; +import org.osgi.framework.Bundle; +import org.osgi.framework.FrameworkUtil; +import org.osgi.service.http.context.ServletContextHelper; + +public class PrivateServletContextHelper extends ServletContextHelper { + private final static Log log = LogFactory.getLog(PrivateServletContextHelper.class); + + // TODO make it configurable + private final String httpAuthRealm = "Argeo"; + private final boolean forceBasic = false; + + // use CMS bundle for resources + private Bundle bundle = FrameworkUtil.getBundle(getClass()); + + public void init(Map properties) { + + } + + public void destroy() { + + } + + @Override + public boolean handleSecurity(HttpServletRequest request, HttpServletResponse response) throws IOException { + if (log.isTraceEnabled()) + HttpUtils.logRequestHeaders(log, request); + LoginContext lc; + try { + lc = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER, new HttpRequestCallbackHandler(request, response)); + lc.login(); + } catch (LoginException e) { + askForWwwAuth(request, response); + return false; + } + return true; + } + + protected void askForWwwAuth(HttpServletRequest request, HttpServletResponse response) { + response.setStatus(401); + // response.setHeader(HttpUtils.HEADER_WWW_AUTHENTICATE, "basic + // realm=\"" + httpAuthRealm + "\""); + if (org.argeo.cms.internal.kernel.Activator.getAcceptorCredentials() != null && !forceBasic)// SPNEGO + response.setHeader(HttpUtils.HEADER_WWW_AUTHENTICATE, "Negotiate"); + else + response.setHeader(HttpUtils.HEADER_WWW_AUTHENTICATE, "Basic realm=\"" + httpAuthRealm + "\""); + + // response.setDateHeader("Date", System.currentTimeMillis()); + // response.setDateHeader("Expires", System.currentTimeMillis() + (24 * + // 60 * 60 * 1000)); + // response.setHeader("Accept-Ranges", "bytes"); + // response.setHeader("Connection", "Keep-Alive"); + // response.setHeader("Keep-Alive", "timeout=5, max=97"); + // response.setContentType("text/html; charset=UTF-8"); + + } + + @Override + public URL getResource(String name) { + return bundle.getResource(name); + } + +}