Author: cziegeler
Date: Tue Aug 2 13:49:45 2011
New Revision: 1153126
URL: http://svn.apache.org/viewvc?rev=1153126&view=rev
Log:
SLING-2167 : Use Sling authenticator
Added:
sling/trunk/bundles/jcr/davex/src/main/java/org/apache/sling/jcr/davex/impl/servlets/AuthHttpContext.java
(with props)
Modified:
sling/trunk/bundles/jcr/davex/pom.xml
sling/trunk/bundles/jcr/davex/src/main/java/org/apache/sling/jcr/davex/impl/servlets/SlingDavExServlet.java
Modified: sling/trunk/bundles/jcr/davex/pom.xml
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/davex/pom.xml?rev=1153126&r1=1153125&r2=1153126&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/davex/pom.xml (original)
+++ sling/trunk/bundles/jcr/davex/pom.xml Tue Aug 2 13:49:45 2011
@@ -100,6 +100,19 @@
</dependency>
<dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.api</artifactId>
+ <version>2.2.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.auth.core</artifactId>
+ <version>1.0.6</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
<groupId>javax.jcr</groupId>
<artifactId>jcr</artifactId>
<version>2.0</version>
Added:
sling/trunk/bundles/jcr/davex/src/main/java/org/apache/sling/jcr/davex/impl/servlets/AuthHttpContext.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/davex/src/main/java/org/apache/sling/jcr/davex/impl/servlets/AuthHttpContext.java?rev=1153126&view=auto
==============================================================================
---
sling/trunk/bundles/jcr/davex/src/main/java/org/apache/sling/jcr/davex/impl/servlets/AuthHttpContext.java
(added)
+++
sling/trunk/bundles/jcr/davex/src/main/java/org/apache/sling/jcr/davex/impl/servlets/AuthHttpContext.java
Tue Aug 2 13:49:45 2011
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
under
+ * the License.
+ */
+package org.apache.sling.jcr.davex.impl.servlets;
+
+import java.io.IOException;
+import java.net.URL;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.sling.auth.core.AuthenticationSupport;
+import org.osgi.service.http.HttpContext;
+
+class AuthHttpContext implements HttpContext {
+
+ /**
+ * Handles security
+ *
+ * @see #handleSecurity(HttpServletRequest, HttpServletResponse)
+ */
+ private AuthenticationSupport authenticator;
+
+ public void setAuthenticationSupport(final AuthenticationSupport auth) {
+ this.authenticator = auth;
+ }
+
+ // ---------- HttpContext interface
----------------------------------------
+
+ /**
+ * Returns the MIME type as resolved by the <code>MimeTypeService</code> or
+ * <code>null</code> if the service is not available.
+ */
+ public String getMimeType(String name) {
+ return null;
+ }
+
+ /**
+ * Always returns <code>null</code> because resources are all provided
+ * through the {@link MainServlet}.
+ */
+ public URL getResource(String name) {
+ return null;
+ }
+
+ /**
+ * Tries to authenticate the request using the
+ * <code>SlingAuthenticator</code>. If the authenticator or the Repository
+ * is missing this method returns <code>false</code> and sends a
503/SERVICE
+ * UNAVAILABLE status back to the client.
+ */
+ public boolean handleSecurity(final HttpServletRequest request,
+ final HttpServletResponse response)
+ throws IOException {
+ final AuthenticationSupport localAuthenticator = this.authenticator;
+ if ( localAuthenticator != null ) {
+ return localAuthenticator.handleSecurity(request, response);
+ }
+ // send 503/SERVICE UNAVAILABLE, flush to ensure delivery
+ response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
+ response.flushBuffer();
+
+ // terminate this request now
+ return false;
+ }
+}
Propchange:
sling/trunk/bundles/jcr/davex/src/main/java/org/apache/sling/jcr/davex/impl/servlets/AuthHttpContext.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
sling/trunk/bundles/jcr/davex/src/main/java/org/apache/sling/jcr/davex/impl/servlets/AuthHttpContext.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url
Propchange:
sling/trunk/bundles/jcr/davex/src/main/java/org/apache/sling/jcr/davex/impl/servlets/AuthHttpContext.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
sling/trunk/bundles/jcr/davex/src/main/java/org/apache/sling/jcr/davex/impl/servlets/SlingDavExServlet.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/davex/src/main/java/org/apache/sling/jcr/davex/impl/servlets/SlingDavExServlet.java?rev=1153126&r1=1153125&r2=1153126&view=diff
==============================================================================
---
sling/trunk/bundles/jcr/davex/src/main/java/org/apache/sling/jcr/davex/impl/servlets/SlingDavExServlet.java
(original)
+++
sling/trunk/bundles/jcr/davex/src/main/java/org/apache/sling/jcr/davex/impl/servlets/SlingDavExServlet.java
Tue Aug 2 13:49:45 2011
@@ -16,15 +16,30 @@
*/
package org.apache.sling.jcr.davex.impl.servlets;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Map;
+
+import javax.jcr.LoginException;
import javax.jcr.Repository;
-import javax.servlet.Servlet;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
+import org.apache.jackrabbit.server.SessionProvider;
import org.apache.jackrabbit.server.remoting.davex.JcrRemotingServlet;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.auth.core.AuthenticationSupport;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.http.HttpService;
/**
* DavEx WebDav servlet which acquires a Repository instance via the OSGi
@@ -32,7 +47,6 @@ import org.apache.jackrabbit.server.remo
*
*/
@Component(label = "%dav.name", description = "%dav.description")
-@Service(Servlet.class)
@Properties( { @Property(name = "alias", value = "/server"),
@Property(name = "init.resource-path-prefix", value = "/server"),
@Property(name = "init.missing-auth-mapping", value = ""),
@@ -40,12 +54,73 @@ import org.apache.jackrabbit.server.remo
@Property(name = "service.vendor", value = "The Apache Software
Foundation") })
public class SlingDavExServlet extends JcrRemotingServlet {
+ private static final String INIT_KEY_PREFIX = "init.";
+
@Reference
private Repository repository;
+ @Reference
+ private HttpService httpService;
+
+ @Reference
+ private AuthenticationSupport authentiator;
+
+ @Activate
+ protected void activate(final ComponentContext ctx)
+ throws Exception {
+ final AuthHttpContext context = new AuthHttpContext();
+ context.setAuthenticationSupport(authentiator);
+
+ final String alias = (String)ctx.getProperties().get("alias");
+ final Dictionary<String, String> initProps = new Hashtable<String,
String>();
+ @SuppressWarnings("unchecked")
+ final Enumeration<String> keyEnum = ctx.getProperties().keys();
+ while ( keyEnum.hasMoreElements() ) {
+ final String key = keyEnum.nextElement();
+ if ( key.startsWith(INIT_KEY_PREFIX) ) {
+ final String paramKey =
key.substring(INIT_KEY_PREFIX.length());
+ final Object paramValue = ctx.getProperties().get(key);
+
+ if (paramValue != null) {
+ initProps.put(paramKey, paramValue.toString());
+ }
+ }
+ }
+
+ this.httpService.registerServlet(alias, this, initProps, context);
+ }
+
+ @Deactivate
+ protected void deactivate(final Map<String, Object> props) {
+ final String alias = (String)props.get("alias");
+ this.httpService.unregister(alias);
+ }
+
@Override
protected Repository getRepository() {
return repository;
}
+ @Override
+ protected SessionProvider getSessionProvider() {
+ return new SessionProvider() {
+
+ public Session getSession(final HttpServletRequest req,
+ final Repository paramRepository,
+ final String paramString)
+ throws LoginException, ServletException, RepositoryException {
+ final ResourceResolver resolver = (ResourceResolver)
req.getAttribute(AuthenticationSupport.REQUEST_ATTRIBUTE_RESOLVER);
+ if ( resolver != null ) {
+ return resolver.adaptTo(Session.class);
+ }
+ return null;
+ }
+
+ public void releaseSession(Session paramSession) {
+ // nothing to do
+
+ }
+ };
+ }
+
}