Author: handyande
Date: Wed Jan 31 08:41:49 2007
New Revision: 501891

URL: http://svn.apache.org/viewvc?view=rev&rev=501891
Log:
Organise the webdav servlets better, idisk extends the standard repos.

Added:
    
maven/sandbox/enterprise/enterprise-web/src/main/java/org/apache/maven/enterprise/web/EnterpriseIDiskWebDavServlet.java
    
maven/sandbox/enterprise/enterprise-web/src/main/java/org/apache/maven/enterprise/web/EnterpriseWebDavServlet.java
Removed:
    
maven/sandbox/enterprise/enterprise-web/src/main/java/org/apache/maven/enterprise/web/WebdavServlet.java
Modified:
    maven/sandbox/enterprise/enterprise-web/src/main/webapp/WEB-INF/web.xml

Added: 
maven/sandbox/enterprise/enterprise-web/src/main/java/org/apache/maven/enterprise/web/EnterpriseIDiskWebDavServlet.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/enterprise/enterprise-web/src/main/java/org/apache/maven/enterprise/web/EnterpriseIDiskWebDavServlet.java?view=auto&rev=501891
==============================================================================
--- 
maven/sandbox/enterprise/enterprise-web/src/main/java/org/apache/maven/enterprise/web/EnterpriseIDiskWebDavServlet.java
 (added)
+++ 
maven/sandbox/enterprise/enterprise-web/src/main/java/org/apache/maven/enterprise/web/EnterpriseIDiskWebDavServlet.java
 Wed Jan 31 08:41:49 2007
@@ -0,0 +1,126 @@
+package org.apache.maven.enterprise.web;
+
+import org.codehaus.plexus.webdav.servlet.DavServerRequest;
+import org.codehaus.plexus.webdav.util.WebdavMethodUtil;
+import org.codehaus.plexus.security.authentication.AuthenticationException;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @uthor: Andrew Williams
+ * @since: 31-Jan-2007
+ * @version: $Id$
+ */
+public class EnterpriseIDiskWebDavServlet
+    extends EnterpriseWebDavServlet
+{
+    private boolean publicIDisk = false;
+
+    public File getRootDirectory( ServletConfig config )
+        throws ServletException
+    {
+        File serverRoot = new File( enterpriseDavRoot, "idisk" );
+
+        if ( serverRoot.exists() )
+        {
+            if ( !serverRoot.isDirectory() )
+            {
+                throw new ServletException( "Unable to create webdav server, " 
+ serverRoot.getAbsolutePath() +
+                    " is not a directory ");
+            }
+        }
+        else
+        {
+            serverRoot.mkdirs();
+        }
+
+        return serverRoot;
+    }
+
+    public boolean isAuthenticated( DavServerRequest davRequest, 
HttpServletResponse response )
+        throws ServletException, IOException
+    {
+        boolean authenticated = super.isAuthenticated( davRequest, response );
+
+        if ( authenticated )
+        {
+            if ( httpAuth.getSessionUser() != null )
+            {
+                String user = httpAuth.getSessionUser().getUsername();
+
+                HttpServletRequest request = davRequest.getRequest();
+                if ( request.getPathInfo().equals( "/" + user ) ||
+                    request.getPathInfo().startsWith( "/" + user + "/" ) )
+                {
+                    File userHome = new File( new File( enterpriseDavRoot, 
"idisk" ), user );
+
+                    if ( !userHome.exists() )
+                    {
+                        userHome.mkdir();
+                    }
+                }
+            }
+        }
+
+        return authenticated;
+    }
+
+    public boolean isAuthorized( DavServerRequest davRequest, 
HttpServletResponse response )
+        throws ServletException, IOException
+    {
+        HttpServletRequest request = davRequest.getRequest();
+
+        /* we don't always need to authenticate read requests */
+        if ( isAnonRequest( davRequest ) )
+        {
+            return true;
+        }
+
+        String resource = davRequest.getLogicalResource();
+        String user = httpAuth.getSessionUser().getUsername();
+
+        if ( resource.equals( "" ) || resource.equals( "/" ) ) {
+            return true;
+        }
+
+        if ( resource.equals( "/" + user ) || resource.startsWith( "/" + user 
+ "/" ) )
+        {
+            return true;
+        }
+
+        httpAuth.challenge( request, response, "Enterprise Repository",
+                            new AuthenticationException( "Access denied." ) );
+        return false;
+    }
+
+    /**
+     * Tell if the passed request can be treated anonymously (no 
authentication needed).
+     * Only read requests can be anonymous, clearly!
+     *
+     * @param davRequest the request to check
+     * @return true if the request is a read request and the area we are 
requesting is publicly visible
+     */
+    protected boolean isAnonRequest( DavServerRequest davRequest )
+    {
+        HttpServletRequest request = davRequest.getRequest();
+        boolean isRead = WebdavMethodUtil.isReadMethod( request.getMethod() );
+
+        if ( isRead )
+        {
+            /* if the repositories are public we do not require authentication 
for non-idisk requests */
+            if ( publicIDisk )
+            {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}

Added: 
maven/sandbox/enterprise/enterprise-web/src/main/java/org/apache/maven/enterprise/web/EnterpriseWebDavServlet.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/enterprise/enterprise-web/src/main/java/org/apache/maven/enterprise/web/EnterpriseWebDavServlet.java?view=auto&rev=501891
==============================================================================
--- 
maven/sandbox/enterprise/enterprise-web/src/main/java/org/apache/maven/enterprise/web/EnterpriseWebDavServlet.java
 (added)
+++ 
maven/sandbox/enterprise/enterprise-web/src/main/java/org/apache/maven/enterprise/web/EnterpriseWebDavServlet.java
 Wed Jan 31 08:41:49 2007
@@ -0,0 +1,164 @@
+package org.apache.maven.enterprise.web;
+
+import org.codehaus.plexus.webdav.servlet.basic.BasicWebDavServlet;
+import org.codehaus.plexus.webdav.servlet.DavServerRequest;
+import org.codehaus.plexus.webdav.util.WebdavMethodUtil;
+import org.codehaus.plexus.security.authentication.AuthenticationResult;
+import org.codehaus.plexus.security.authentication.AuthenticationException;
+import org.codehaus.plexus.security.policy.AccountLockedException;
+import org.codehaus.plexus.security.policy.MustChangePasswordException;
+import 
org.codehaus.plexus.security.ui.web.filter.authentication.HttpAuthenticator;
+import org.codehaus.plexus.util.StringUtils;
+
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.ServletException;
+import javax.servlet.ServletConfig;
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @uthor: Andrew Williams
+ * @since: 31-Jan-2007
+ * @version: $Id$
+ */
+public class  EnterpriseWebDavServlet
+    extends BasicWebDavServlet
+{
+    protected HttpAuthenticator httpAuth;
+
+    protected File enterpriseDavRoot;
+
+    private boolean publicRepositories = true;
+
+    public File getRootDirectory( ServletConfig config )
+        throws ServletException
+    {
+        String davName = config.getInitParameter( INIT_ROOT_DIRECTORY );
+
+        if ( StringUtils.isEmpty( davName ) )
+        {
+            throw new ServletException( "Init Parameter '" + 
INIT_ROOT_DIRECTORY + "' is empty." );
+        }
+
+        File serverRoot = new File( enterpriseDavRoot, davName );
+
+        if ( serverRoot.exists() )
+        {
+            if ( !serverRoot.isDirectory() )
+            {
+                throw new ServletException( "Unable to create webdav server, " 
+ serverRoot.getAbsolutePath() +
+                    " is not a directory ");
+            }
+        }
+        else
+        {
+            serverRoot.mkdirs();
+        }
+
+        return serverRoot;
+    }
+
+    public void initComponents()
+        throws ServletException
+    {
+        setDebug(false); // TODO perhaps debug should be off by default?
+        super.initComponents();
+
+        httpAuth = (HttpAuthenticator) lookup( HttpAuthenticator.ROLE, "basic" 
);
+
+        String plexusHome = "";
+
+        try
+        {
+            plexusHome = (String) (new InitialContext()).lookup( 
"java:comp/env/enterprise/dataDir" );
+        }
+        catch ( NamingException e )
+        {
+            /* default to the current directory */
+        }
+
+        enterpriseDavRoot = new File( plexusHome, "webdav" );
+    }
+
+    public boolean isAuthenticated( DavServerRequest davRequest, 
HttpServletResponse response )
+        throws ServletException, IOException
+    {
+        HttpServletRequest request = davRequest.getRequest();
+
+        /* we don't always need to authenticate read requests */
+        if ( isAnonRequest( davRequest ) )
+        {
+            return true;
+        }
+
+        try
+        {
+            AuthenticationResult result = httpAuth.getAuthenticationResult( 
request, response );
+
+            if ( ( result == null ) || !result.isAuthenticated() )
+            {
+                httpAuth.challenge( request, response, "Enterprise Repository",
+                                    new AuthenticationException( "User 
credentials are invalid" ) );
+                return false;
+            }
+
+        }
+        catch ( AuthenticationException e )
+        {
+            log( "Fatal Http Authentication Error.", e );
+            throw new ServletException( "Fatal Http Authentication Error.", e 
);
+        }
+        catch ( AccountLockedException e )
+        {
+            httpAuth.challenge( request, response, "Enterprise Repository",
+                                new AuthenticationException( "User account is 
locked" ) );
+        }
+        catch ( MustChangePasswordException e )
+        {
+            httpAuth.challenge( request, response, "Enterprise Repository",
+                                new AuthenticationException( "User account 
password expired" ) );
+        }
+        return true;
+    }
+
+    public boolean isAuthorized( DavServerRequest davRequest, 
HttpServletResponse response )
+        throws ServletException, IOException
+    {
+        /* we don't always need to authenticate read requests */
+        if ( isAnonRequest( davRequest ) )
+        {
+            return true;
+        }
+
+        return true;
+    }
+
+    /**
+     * Tell if the passed request can be treated anonymously (no 
authentication needed).
+     * Only read requests can be anonymous, clearly!
+     *
+     * @param davRequest the request to check
+     * @return true if the request is a read request and the area we are 
requesting is publicly visible
+     */
+    protected boolean isAnonRequest( DavServerRequest davRequest )
+    {
+        HttpServletRequest request = davRequest.getRequest();
+        boolean isRead = WebdavMethodUtil.isReadMethod( request.getMethod() );
+
+        if ( isRead )
+        {
+            /* if the repositories are public we do not require authentication 
for non-idisk requests */
+            if ( publicRepositories )
+            {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}

Modified: 
maven/sandbox/enterprise/enterprise-web/src/main/webapp/WEB-INF/web.xml
URL: 
http://svn.apache.org/viewvc/maven/sandbox/enterprise/enterprise-web/src/main/webapp/WEB-INF/web.xml?view=diff&rev=501891&r1=501890&r2=501891
==============================================================================
--- maven/sandbox/enterprise/enterprise-web/src/main/webapp/WEB-INF/web.xml 
(original)
+++ maven/sandbox/enterprise/enterprise-web/src/main/webapp/WEB-INF/web.xml Wed 
Jan 31 08:41:49 2007
@@ -13,13 +13,41 @@
 
 
   <servlet>
-    <servlet-name>webdav</servlet-name>
-    
<servlet-class>org.apache.maven.enterprise.web.WebdavServlet</servlet-class>
+    <servlet-name>repository</servlet-name>
+    
<servlet-class>org.apache.maven.enterprise.web.EnterpriseWebDavServlet</servlet-class>
+    <init-param>
+      <param-name>dav.root</param-name>
+      <param-value>repository</param-value>
+    </init-param>
   </servlet>
 
+  <servlet>
+    <servlet-name>snapshot</servlet-name>
+    
<servlet-class>org.apache.maven.enterprise.web.EnterpriseWebDavServlet</servlet-class>
+    <init-param>
+      <param-name>dav.root</param-name>
+      <param-value>snapshot</param-value>
+    </init-param>
+  </servlet>
+
+  <servlet>
+    <servlet-name>idisk</servlet-name>
+    
<servlet-class>org.apache.maven.enterprise.web.EnterpriseIDiskWebDavServlet</servlet-class>
+  </servlet>
+
+  <servlet-mapping>
+    <servlet-name>repository</servlet-name>
+    <url-pattern>/repository/*</url-pattern>
+  </servlet-mapping>
+
+  <servlet-mapping>
+    <servlet-name>snapshot</servlet-name>
+    <url-pattern>/snapshot/*</url-pattern>
+  </servlet-mapping>
+
   <servlet-mapping>
-    <servlet-name>webdav</servlet-name>
-    <url-pattern>/webdav/*</url-pattern>
+    <servlet-name>idisk</servlet-name>
+    <url-pattern>/idisk/*</url-pattern>
   </servlet-mapping>
 
 </web-app>


Reply via email to