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>