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>