From 510b25d1b95fb5b6fc6516de8b277a7b8497c9ea Mon Sep 17 00:00:00 2001 From: koutsoub Date: Wed, 16 Feb 2011 20:42:44 +0200 Subject: [PATCH] use milton authentication manager, working on windows, need to check loss of auth credentials for mapped drive --- lib/milton/milton-api-1.5.7-SNAPSHOT.jar | Bin 353536 -> 353977 bytes .../server/webdav/milton/GSSResourceFactory.java | 66 +++++-- .../webdav/milton/GssAuthenticationService.java | 167 +++++++++++++--- .../gss/server/webdav/milton/GssFileResource.java | 3 +- .../server/webdav/milton/GssFolderResource.java | 28 +-- .../gss/server/webdav/milton/GssMiltonServlet.java | 16 +- .../server/webdav/milton/GssOtherUserResource.java | 157 +++++++++++++++ .../server/webdav/milton/GssOthersResource.java | 204 ++++++++++++++++++++ .../gss/server/webdav/milton/GssPathResource.java | 28 +++ .../ebs/gss/server/webdav/milton/GssResource.java | 28 +-- .../webdav/milton/GssRootFolderResource.java | 74 ++++--- .../server/webdav/milton/GssSecurityManager.java | 30 ++- webdav/WEB-INF/web.xml | 7 +- 13 files changed, 699 insertions(+), 109 deletions(-) create mode 100644 src/gr/ebs/gss/server/webdav/milton/GssOtherUserResource.java create mode 100644 src/gr/ebs/gss/server/webdav/milton/GssOthersResource.java create mode 100644 src/gr/ebs/gss/server/webdav/milton/GssPathResource.java diff --git a/lib/milton/milton-api-1.5.7-SNAPSHOT.jar b/lib/milton/milton-api-1.5.7-SNAPSHOT.jar index d9458d22f7b3d7a570aec0ce6a15b943519997cd..e9188652e01fd08ec0dbb42827d74230dd46a5e0 100644 GIT binary patch delta 23264 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%0AF3p( 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 U^5Aa}rBl;b<=7;@vj7zU0HlDySO5S3 diff --git a/src/gr/ebs/gss/server/webdav/milton/GSSResourceFactory.java b/src/gr/ebs/gss/server/webdav/milton/GSSResourceFactory.java index 7788225..a01c19c 100644 --- a/src/gr/ebs/gss/server/webdav/milton/GSSResourceFactory.java +++ b/src/gr/ebs/gss/server/webdav/milton/GSSResourceFactory.java @@ -43,6 +43,7 @@ import com.bradmcevoy.http.HttpManager; import com.bradmcevoy.http.Resource; import com.bradmcevoy.http.ResourceFactory; import com.bradmcevoy.http.SecurityManager; +import com.bradmcevoy.http.Request.Method; import com.ettrema.http.fs.LockManager; @@ -69,25 +70,47 @@ public class GSSResourceFactory implements ResourceFactory { url = stripContext(url); if(url==null||url.trim().equals("")||url.equals("/")){ url="/"; - return new GssRootFolderResource(host, this, null); + return new GssRootFolderResource(host, this, null,"/"); } - /*log.info("URL:"+url); + /*//log.info("URL:"+url); if(url.equals("/OthersShared")||url.equals("/OthersShared/")){ - log.info("[returning others]"); + //log.info("[returning others]"); return new GssOthersResource(host, this); } if(url.startsWith("/OthersShared")){ }*/ try { - - Object r = getResourceGss(url); - if(r==null) + UserDTO user =null; + if(HttpManager.request().getAuthorization()!=null && HttpManager.request().getAuthorization().getTag()==null){ + String username = HttpManager.request().getAuthorization().getUser(); + //log.info("username is:"+username); + if(username !=null) + user = getService().getUserByUserName(username); + } + else if(HttpManager.request().getAuthorization()!=null&&HttpManager.request().getAuthorization().getTag()!=null){ + //log.info(HttpManager.request().getAuthorization().getUser()); + user =(UserDTO) HttpManager.request().getAuthorization().getTag();//getService().getUserByUserName("past@ebs.gr"); + } + + if(user==null){ + //if(HttpManager.request().getMethod().equals(Method.PROPFIND)){ + ////log.info("[PROP FIND RETURNING ROOT FOR:]"+url); + return new GssRootFolderResource(host, this, null,url); + //} + ////log.info("[RETURNING NULL FOR:]"+url+" "+HttpManager.request().getMethod()); + //return null; + } + + Object r = getResourceGss(url,user); + if(r==null){ + return null; + } if(r instanceof FolderDTO) - return new GssFolderResource(host, this,r ); + return new GssFolderResource(host, this,r ,user); else - return new GssFileResource(host, this,r); + return new GssFileResource(host, this,r,user); } catch (RpcException e) { e.printStackTrace(); } @@ -96,9 +119,28 @@ public class GSSResourceFactory implements ResourceFactory { public Long maxAgeSeconds(GssResource resource) { return maxAgeSeconds; } - protected Object getResourceGss(String path) throws RpcException{ - UserDTO user = null; - String username = HttpManager.request().getHeaders().get("authorization"); + protected Object getResourceGss(String path, UserDTO user) throws RpcException{ + //log.info(path+" <--> "+HttpManager.request().getAuthorization() + HttpManager.request().getHeaders()); + if(user ==null){ + if(HttpManager.request().getAuthorization()!=null && HttpManager.request().getAuthorization().getTag()==null){ + String username = HttpManager.request().getAuthorization().getUser(); + //log.info("username is:"+username); + if(username !=null) + user = getService().getUserByUserName(username); + } + else if(HttpManager.request().getAuthorization()!=null&&HttpManager.request().getAuthorization().getTag()!=null){ + //log.info(HttpManager.request().getAuthorization().getUser()); + user =(UserDTO) HttpManager.request().getAuthorization().getTag();//getService().getUserByUserName("past@ebs.gr"); + } + } + + if(user==null){ + //log.info("---------------->"+path); + return null; + } + + //UserDTO user =getService().getUserByUserName("past@ebs.gr"); + /*String username = HttpManager.request().getHeaders().get("authorization"); if(username!=null){ @@ -110,7 +152,7 @@ public class GSSResourceFactory implements ResourceFactory { e.printStackTrace(); return null; } - } + }*/ boolean exists = true; Object resource = null; FileHeaderDTO file = null; diff --git a/src/gr/ebs/gss/server/webdav/milton/GssAuthenticationService.java b/src/gr/ebs/gss/server/webdav/milton/GssAuthenticationService.java index 6c56419..d3f24a6 100644 --- a/src/gr/ebs/gss/server/webdav/milton/GssAuthenticationService.java +++ b/src/gr/ebs/gss/server/webdav/milton/GssAuthenticationService.java @@ -23,6 +23,8 @@ import gr.ebs.gss.client.exceptions.RpcException; import gr.ebs.gss.server.ejb.ExternalAPI; import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; import java.util.List; import javax.naming.Context; @@ -36,10 +38,10 @@ import org.slf4j.LoggerFactory; import com.bradmcevoy.http.Auth; import com.bradmcevoy.http.AuthenticationHandler; import com.bradmcevoy.http.AuthenticationService; -import com.bradmcevoy.http.HttpManager; import com.bradmcevoy.http.Request; import com.bradmcevoy.http.Resource; -import com.bradmcevoy.http.AuthenticationService.AuthStatus; +import com.bradmcevoy.http.http11.auth.BasicAuthHandler; +import com.bradmcevoy.http.http11.auth.DigestAuthenticationHandler; /** @@ -47,37 +49,152 @@ import com.bradmcevoy.http.AuthenticationService.AuthStatus; * */ public class GssAuthenticationService extends com.bradmcevoy.http.AuthenticationService{ - private static final Logger log = LoggerFactory.getLogger( GssAuthenticationService.class ); - - public GssAuthenticationService( ) { - super(new ArrayList()); + private static final Logger log = LoggerFactory.getLogger( AuthenticationService.class ); + private List authenticationHandlers; + private List extraHandlers; + private List allHandlers; + private boolean disableBasic; + private boolean disableDigest; + + /** + * Creates a AuthenticationService using the given handlers. Use this if + * you don't want the default of a BasicAuthHandler and a DigestAuthenticationHandler + * + * @param authenticationHandlers + */ + public GssAuthenticationService( List authenticationHandlers ) { + this.authenticationHandlers = authenticationHandlers; + setAllHandlers(); } - + + + /** + * Creates with Basic and Digest handlers + * + */ + public GssAuthenticationService() { + AuthenticationHandler digest = new com.bradmcevoy.http.http11.auth.DigestAuthenticationHandler(); + AuthenticationHandler basic = new BasicAuthHandler(); + authenticationHandlers = new ArrayList(); + authenticationHandlers.add( basic ); + authenticationHandlers.add( digest ); + setAllHandlers(); + } + + public void setDisableBasic( boolean b ) { + if( b ) { + Iterator it = this.authenticationHandlers.iterator(); + while( it.hasNext() ) { + AuthenticationHandler hnd = it.next(); + if( hnd instanceof BasicAuthHandler ) { + it.remove(); + } + } + } + disableBasic = b; + setAllHandlers(); + } + + public boolean isDisableBasic() { + return disableBasic; + } + + public void setDisableDigest( boolean b ) { + if( b ) { + Iterator it = this.authenticationHandlers.iterator(); + while( it.hasNext() ) { + AuthenticationHandler hnd = it.next(); + if( hnd instanceof DigestAuthenticationHandler ) { + it.remove(); + } + } + } + disableDigest = b; + setAllHandlers(); + } + + public boolean isDisableDigest() { + return disableDigest; + } + + + /** + * Generates a list of http authentication challenges, one for each + * supported authentication method, to be sent to the client. + * + * @param resource - the resoruce being requested + * @param request - the current request + * @return - a list of http challenges + */ + public List getChallenges( Resource resource, Request request ) { + List challenges = new ArrayList(); + for( AuthenticationHandler h : allHandlers ) { + if( h.isCompatible( resource ) ) { + log.debug( "challenge for auth: " + h.getClass() ); + String ch = h.getChallenge( resource, request ); + challenges.add( ch ); + } else { + log.debug( "not challenging for auth: " + h.getClass() + " for resource type: " + resource.getClass() ); + } + } + return challenges; + } + + public List getAuthenticationHandlers() { + return allHandlers; + } + + public List getExtraHandlers() { + return extraHandlers; + } + + public void setExtraHandlers( List extraHandlers ) { + this.extraHandlers = extraHandlers; + setAllHandlers(); + } + + /** + * Merge standard and extra handlers into single list + */ + private void setAllHandlers() { + List handlers = new ArrayList(); + if( authenticationHandlers != null ) { + handlers.addAll( authenticationHandlers ); + } + if( extraHandlers != null ) { + handlers.addAll( extraHandlers ); + } + this.allHandlers = Collections.unmodifiableList( handlers ); + } + + public AuthStatus authenticate( Resource resource, Request request ) { + log.trace( "authenticate" ); Auth auth = request.getAuthorization(); boolean preAuthenticated = ( auth != null && auth.getTag() != null ); if( preAuthenticated ) { + log.trace( "request is pre-authenticated" ); return new AuthStatus( auth, false ); } - String username = request.getHeaders().get("authorization"); - if(username!=null){ - username=GSSResourceFactory.getUsernameFromAuthHeader(username); - try { - Object user = getService().getUserByUserName(username); - if( auth == null ) { // some authentication handlers do not require an Auth object - auth = new Auth( Auth.Scheme.FORM, username ,null); - request.setAuthorization( auth ); + for( AuthenticationHandler h : getAuthenticationHandlers() ) { + if( h.supports( resource, request ) ) { + Object loginToken = h.authenticate( resource, request ); + if( loginToken == null ) { + log.warn( "authentication failed by AuthenticationHandler:" + h.getClass() ); + return new AuthStatus( auth, true ); + } else { + if( log.isTraceEnabled() ) { + log.trace( "authentication passed by: " + h.getClass() ); + } + if( auth == null ) { // some authentication handlers do not require an Auth object + auth = new Auth( Auth.Scheme.FORM, null, loginToken ); + request.setAuthorization( auth ); + } + auth.setTag( loginToken ); } - auth.setTag( user ); - - return new AuthStatus( auth, false ); - } catch (RpcException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - return null; - } - } - + return new AuthStatus( auth, false ); + } + } return null; } diff --git a/src/gr/ebs/gss/server/webdav/milton/GssFileResource.java b/src/gr/ebs/gss/server/webdav/milton/GssFileResource.java index 3f8e09b..237a66a 100644 --- a/src/gr/ebs/gss/server/webdav/milton/GssFileResource.java +++ b/src/gr/ebs/gss/server/webdav/milton/GssFileResource.java @@ -70,9 +70,10 @@ public class GssFileResource extends GssResource implements CopyableResource, De * @param factory * @param resource */ - public GssFileResource(String host, GSSResourceFactory factory, Object resource) { + public GssFileResource(String host, GSSResourceFactory factory, Object resource, UserDTO currentUser) { super(host, factory, resource); this.file = (FileHeaderDTO)resource; + this.currentUser=currentUser; } @Override diff --git a/src/gr/ebs/gss/server/webdav/milton/GssFolderResource.java b/src/gr/ebs/gss/server/webdav/milton/GssFolderResource.java index 3516480..52c16b0 100644 --- a/src/gr/ebs/gss/server/webdav/milton/GssFolderResource.java +++ b/src/gr/ebs/gss/server/webdav/milton/GssFolderResource.java @@ -81,9 +81,10 @@ public class GssFolderResource extends GssResource implements MakeCollectionable * @param factory * @param resource */ - public GssFolderResource(String host, GSSResourceFactory factory, Object resource) { + public GssFolderResource(String host, GSSResourceFactory factory, Object resource, UserDTO currentUser) { super(host, factory, resource); folder=(FolderDTO) resource; + this.currentUser=currentUser; } @Override public String checkRedirect(Request request) { @@ -188,6 +189,7 @@ public class GssFolderResource extends GssResource implements MakeCollectionable } @Override public CollectionResource createCollection(final String name) throws NotAuthorizedException, ConflictException, BadRequestException { + ////log.info("CALLING CREATECOLLECTION:"+name); try { final FolderDTO folderParent = folder; FolderDTO created = new TransactionHelper().tryExecute(new Callable() { @@ -197,7 +199,7 @@ public class GssFolderResource extends GssResource implements MakeCollectionable return f; } }); - return new GssFolderResource(host, factory, created); + return new GssFolderResource(host, factory, created, getCurrentUser()); } catch (DuplicateNameException e) { e.printStackTrace(); // XXX If the existing name is a folder we should be returning @@ -222,12 +224,12 @@ public class GssFolderResource extends GssResource implements MakeCollectionable public Resource child(String name) { for(FolderDTO f : folder.getSubfolders()) if(f.getName().equals(name)) - return new GssFolderResource(host, factory, f); + return new GssFolderResource(host, factory, f, getCurrentUser()); try { for(FileHeaderDTO f : factory.getService().getFiles(folder.getOwner().getId(), folder.getId(), true)) if(f.getName().equals(name)) - return new GssFileResource(host, factory, f); + return new GssFileResource(host, factory, f,getCurrentUser()); } catch (ObjectNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -238,7 +240,7 @@ public class GssFolderResource extends GssResource implements MakeCollectionable // TODO Auto-generated catch block e.printStackTrace(); } - + ////log.info("CALLING CHILD return null"); return null; } @Override @@ -258,10 +260,10 @@ public class GssFolderResource extends GssResource implements MakeCollectionable List result = new ArrayList(); for(FolderDTO f : folder.getSubfolders()) if(!f.isDeleted()) - result.add(new GssFolderResource(host, factory, f)); + result.add(new GssFolderResource(host, factory, f, getCurrentUser())); try { for(FileHeaderDTO f : factory.getService().getFiles(getCurrentUser().getId(), folder.getId(), true)) - result.add(new GssFileResource(host, factory, f)); + result.add(new GssFileResource(host, factory, f,getCurrentUser())); } catch (ObjectNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -294,7 +296,7 @@ public class GssFolderResource extends GssResource implements MakeCollectionable if(!pathFolder.endsWith("/")) pathFolder=pathFolder+"/"; String fname = pathFolder+name; - log.info("fname:"+fname+" "+URLDecoder.decode(fname)); + ////log.info("fname:"+fname+" "+URLDecoder.decode(fname)); Object ff2; try{ ff2 = factory.getService().getResourceAtPath(folder.getOwner().getId(), URLDecoder.decode(fname), true); @@ -319,10 +321,12 @@ public class GssFolderResource extends GssResource implements MakeCollectionable return factory.getService().createFile(getCurrentUser().getId(), folder.getId(), name, contentType, uf.length(), uf.getAbsolutePath()); } }); - return new GssFileResource(host, factory, kmfileDTO); + return new GssFileResource(host, factory, kmfileDTO,getCurrentUser()); } catch (ObjectNotFoundException e) { + e.printStackTrace(); throw new BadRequestException(this); } catch (InsufficientPermissionsException e) { + e.printStackTrace(); throw new NotAuthorizedException(this); } catch (DuplicateNameException e) { @@ -331,9 +335,11 @@ public class GssFolderResource extends GssResource implements MakeCollectionable throw new ConflictException(this); } catch(QuotaExceededException e){ + e.printStackTrace(); throw new ConflictException(this); } catch(Exception e){ + e.printStackTrace(); throw new RuntimeException("System Error"); } } @@ -373,10 +379,10 @@ public class GssFolderResource extends GssResource implements MakeCollectionable // TODO Auto-generated catch block e.printStackTrace(); } - log.info("CREATE AND LOCK:"+kmfileDTO.getId()); + ////log.info("CREATE AND LOCK:"+kmfileDTO.getId()); //File dest = new File( this.getFile(), name ); //createEmptyFile( ); - GssFileResource newRes = new GssFileResource( host, factory, kmfileDTO ); + GssFileResource newRes = new GssFileResource( host, factory, kmfileDTO ,getCurrentUser()); LockResult res = newRes.lock( timeout, lockInfo ); return res.getLockToken(); diff --git a/src/gr/ebs/gss/server/webdav/milton/GssMiltonServlet.java b/src/gr/ebs/gss/server/webdav/milton/GssMiltonServlet.java index 7f06eec..6d7e51c 100644 --- a/src/gr/ebs/gss/server/webdav/milton/GssMiltonServlet.java +++ b/src/gr/ebs/gss/server/webdav/milton/GssMiltonServlet.java @@ -18,7 +18,6 @@ */ package gr.ebs.gss.server.webdav.milton; -import java.util.ArrayList; import java.util.Arrays; import javax.servlet.ServletConfig; @@ -31,6 +30,8 @@ import com.bradmcevoy.http.AuthenticationService; import com.bradmcevoy.http.CompressingResponseHandler; import com.bradmcevoy.http.MiltonServlet; import com.bradmcevoy.http.ServletHttpManager; +import com.bradmcevoy.http.http11.auth.PreAuthenticationFilter; +import com.bradmcevoy.http.http11.auth.SimpleMemoryNonceProvider; import com.bradmcevoy.http.webdav.DefaultWebDavResponseHandler; import com.ettrema.console.ConsoleResourceFactory; @@ -47,8 +48,9 @@ public class GssMiltonServlet extends MiltonServlet{ try { this.config = config; GssLockManager lockManager = new GssLockManager(); + SimpleMemoryNonceProvider nonce = new SimpleMemoryNonceProvider( 60*60*24 ); GssSecurityManager securityManager = new GssSecurityManager("Pithos WebDAV"); - AuthenticationService authService = new GssAuthenticationService(); + AuthenticationService authService = new AuthenticationService(nonce); authService.setDisableBasic(true); authService.setDisableDigest(false); DefaultWebDavResponseHandler responseHandler = new DefaultWebDavResponseHandler(authService); @@ -58,7 +60,7 @@ public class GssMiltonServlet extends MiltonServlet{ resourceFactory.setLockManager(lockManager); resourceFactory.setMaxAgeSeconds(3600l); resourceFactory.setContextPath("webdav"); - + PreAuthenticationFilter filter = new PreAuthenticationFilter(compressHandler, securityManager,nonce); ConsoleResourceFactory consoleResourceFactory = new ConsoleResourceFactory(resourceFactory, "/console", "/webdav", Arrays.asList(new com.ettrema.console.LsFactory(), new com.ettrema.console.CdFactory(), new com.ettrema.console.RmFactory(), @@ -66,7 +68,15 @@ public class GssMiltonServlet extends MiltonServlet{ new com.ettrema.console.CpFactory(), new com.ettrema.console.MkFactory(), new com.ettrema.console.MkdirFactory()), "webdav"); + httpManager = new ServletHttpManager(consoleResourceFactory,compressHandler,authService); + /*if(httpManager.getFilters()==null) + httpManager.setFilters(new ArrayList()); + httpManager.getFilters().add(filter);*/ + //List list = new ArrayList(); + //list.add(new DigestAuthenticationHandler(authService)); + // httpManager.addFilter(0, filter); + }catch( Throwable ex ) { log.error( "Exception starting milton servlet", ex ); throw new RuntimeException( ex ); diff --git a/src/gr/ebs/gss/server/webdav/milton/GssOtherUserResource.java b/src/gr/ebs/gss/server/webdav/milton/GssOtherUserResource.java new file mode 100644 index 0000000..9629251 --- /dev/null +++ b/src/gr/ebs/gss/server/webdav/milton/GssOtherUserResource.java @@ -0,0 +1,157 @@ +/* + * Copyright 2011 Electronic Business Systems Ltd. + * + * This file is part of GSS. + * + * GSS is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GSS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GSS. If not, see . + */ +package gr.ebs.gss.server.webdav.milton; + +import gr.ebs.gss.client.rest.resource.OthersResource; +import gr.ebs.gss.server.domain.dto.UserDTO; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.bradmcevoy.http.Auth; +import com.bradmcevoy.http.CollectionResource; +import com.bradmcevoy.http.DigestResource; +import com.bradmcevoy.http.GetableResource; +import com.bradmcevoy.http.PropFindableResource; +import com.bradmcevoy.http.Range; +import com.bradmcevoy.http.Request; +import com.bradmcevoy.http.Resource; +import com.bradmcevoy.http.Request.Method; +import com.bradmcevoy.http.exceptions.BadRequestException; +import com.bradmcevoy.http.exceptions.NotAuthorizedException; +import com.bradmcevoy.http.http11.auth.DigestResponse; + + +/** + * @author kman + * + */ +public class GssOtherUserResource implements PropFindableResource, GetableResource, DigestResource, CollectionResource{ + private static final Logger log = LoggerFactory.getLogger(GssOthersResource.class); + String host; + GSSResourceFactory factory; + UserDTO currentUser; + UserDTO resource; + /** + * + */ + public GssOtherUserResource(String host, GSSResourceFactory factory, UserDTO resource) { + this.host=host; + this.factory=factory; + this.resource=resource; + + } + + @Override + public Date getCreateDate() { + // TODO Auto-generated method stub + return null; + } + + + @Override + public String checkRedirect(Request arg0) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Date getModifiedDate() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getName() { + return resource.getName(); + } + + @Override + public String getUniqueId() { + return "user:"+resource.getId(); + } + + @Override + public Long getContentLength() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getContentType(String arg0) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Long getMaxAgeSeconds(Auth arg0) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void sendContent(OutputStream arg0, Range arg1, Map arg2, String arg3) throws IOException, NotAuthorizedException, BadRequestException { + // TODO Auto-generated method stub + + } + @Override + public Object authenticate(String user, String password) { + return factory.getSecurityManager().authenticate(user, password); + } + @Override + public Object authenticate( DigestResponse digestRequest ) { + return (UserDTO) factory.getSecurityManager().authenticate(digestRequest); + + + } + + @Override + public boolean authorise(Request request, Method method, Auth auth) { + return factory.getSecurityManager().authorise(request, method, auth, this); + } + @Override + public String getRealm() { + return factory.getRealm(this.host); + } + + @Override + public boolean isDigestAllowed() { + // TODO Auto-generated method stub + return true; + } + + @Override + public Resource child(String arg0) { + // TODO Auto-generated method stub + return null; + } + + @Override + public List getChildren() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/src/gr/ebs/gss/server/webdav/milton/GssOthersResource.java b/src/gr/ebs/gss/server/webdav/milton/GssOthersResource.java new file mode 100644 index 0000000..9ea7ed1 --- /dev/null +++ b/src/gr/ebs/gss/server/webdav/milton/GssOthersResource.java @@ -0,0 +1,204 @@ +/* + * Copyright 2011 Electronic Business Systems Ltd. + * + * This file is part of GSS. + * + * GSS is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GSS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GSS. If not, see . + */ +package gr.ebs.gss.server.webdav.milton; + +import gr.ebs.gss.client.exceptions.ObjectNotFoundException; +import gr.ebs.gss.client.exceptions.RpcException; +import gr.ebs.gss.client.rest.resource.OtherUserResource; +import gr.ebs.gss.client.rest.resource.OthersResource; +import gr.ebs.gss.server.domain.dto.UserDTO; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.bradmcevoy.http.Auth; +import com.bradmcevoy.http.CollectionResource; +import com.bradmcevoy.http.DigestResource; +import com.bradmcevoy.http.GetableResource; +import com.bradmcevoy.http.HttpManager; +import com.bradmcevoy.http.LockingCollectionResource; +import com.bradmcevoy.http.PropFindableResource; +import com.bradmcevoy.http.Range; +import com.bradmcevoy.http.Request; +import com.bradmcevoy.http.Resource; +import com.bradmcevoy.http.Request.Method; +import com.bradmcevoy.http.exceptions.BadRequestException; +import com.bradmcevoy.http.exceptions.NotAuthorizedException; +import com.bradmcevoy.http.http11.auth.DigestResponse; + + +/** + * @author kman + * + */ +public class GssOthersResource implements PropFindableResource, GetableResource, DigestResource, CollectionResource{ + private static final Logger log = LoggerFactory.getLogger(GssOthersResource.class); + String host; + GSSResourceFactory factory; + UserDTO currentUser; + + /** + * + */ + public GssOthersResource(String host, GSSResourceFactory factory) { + this.host=host; + this.factory=factory; + + + } + + @Override + public Date getCreateDate() { + // TODO Auto-generated method stub + return null; + } + + + @Override + public String checkRedirect(Request arg0) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Date getModifiedDate() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getName() { + return "OthersShared"; + } + + @Override + public String getUniqueId() { + return "OthersShared"; + } + + @Override + public Long getContentLength() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getContentType(String arg0) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Long getMaxAgeSeconds(Auth arg0) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void sendContent(OutputStream arg0, Range arg1, Map arg2, String arg3) throws IOException, NotAuthorizedException, BadRequestException { + // TODO Auto-generated method stub + + } + @Override + public Object authenticate(String user, String password) { + return factory.getSecurityManager().authenticate(user, password); + } + @Override + public Object authenticate( DigestResponse digestRequest ) { + return factory.getSecurityManager().authenticate(digestRequest); + + + } + + @Override + public boolean authorise(Request request, Method method, Auth auth) { + return factory.getSecurityManager().authorise(request, method, auth, this); + } + @Override + public String getRealm() { + return factory.getRealm(this.host); + } + + @Override + public boolean isDigestAllowed() { + // TODO Auto-generated method stub + return true; + } + + @Override + public Resource child(String arg0) { + for(Resource r : getChildren()){ + if(r.getName().equals(arg0)) + return r; + } + return null; + } + + @Override + public List getChildren() { + List result = new ArrayList(); + List users; + try { + users = factory.getService().getUsersSharingFoldersForUser(getCurrentUser().getId()); + log.info("USERS:"+users); + for(UserDTO u : users){ + result.add(new GssOtherUserResource(host, factory, u)); + } + } catch (ObjectNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (RpcException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + return result; + } + + /** + * Retrieve the currentUser. + * + * @return the currentUser + */ + public UserDTO getCurrentUser() { + if(currentUser!=null) + return currentUser; + String username = HttpManager.request().getHeaders().get("authorization"); + if(username!=null){ + username=GSSResourceFactory.getUsernameFromAuthHeader(username); + try { + currentUser = factory.getService().getUserByUserName(username); + } catch (RpcException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } + } + return currentUser; + } + +} diff --git a/src/gr/ebs/gss/server/webdav/milton/GssPathResource.java b/src/gr/ebs/gss/server/webdav/milton/GssPathResource.java new file mode 100644 index 0000000..df24272 --- /dev/null +++ b/src/gr/ebs/gss/server/webdav/milton/GssPathResource.java @@ -0,0 +1,28 @@ +/* + * Copyright 2011 Electronic Business Systems Ltd. + * + * This file is part of GSS. + * + * GSS is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GSS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GSS. If not, see . + */ +package gr.ebs.gss.server.webdav.milton; + + +/** + * @author kman + * + */ +public class GssPathResource { + +} diff --git a/src/gr/ebs/gss/server/webdav/milton/GssResource.java b/src/gr/ebs/gss/server/webdav/milton/GssResource.java index 9209354..f30ccb9 100644 --- a/src/gr/ebs/gss/server/webdav/milton/GssResource.java +++ b/src/gr/ebs/gss/server/webdav/milton/GssResource.java @@ -117,18 +117,22 @@ public abstract class GssResource implements Resource, MoveableResource, Copyabl public UserDTO getCurrentUser() { if(currentUser!=null) return currentUser; - String username = HttpManager.request().getHeaders().get("authorization"); - if(username!=null){ - username=GSSResourceFactory.getUsernameFromAuthHeader(username); - try { - currentUser = factory.getService().getUserByUserName(username); - } catch (RpcException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - return null; - } - } - return currentUser; + if(HttpManager.request().getAuthorization()!=null && HttpManager.request().getAuthorization().getTag()==null){ + String username = HttpManager.request().getAuthorization().getUser(); + //log.info("username is:"+username); + if(username !=null) + try { + currentUser = factory.getService().getUserByUserName(username); + } catch (RpcException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + else if(HttpManager.request().getAuthorization()!=null&&HttpManager.request().getAuthorization().getTag()!=null){ + //log.info(HttpManager.request().getAuthorization().getUser()); + currentUser =(UserDTO) HttpManager.request().getAuthorization().getTag();//getService().getUserByUserName("past@ebs.gr"); + } + return currentUser; } diff --git a/src/gr/ebs/gss/server/webdav/milton/GssRootFolderResource.java b/src/gr/ebs/gss/server/webdav/milton/GssRootFolderResource.java index 5b998a3..686f3a0 100644 --- a/src/gr/ebs/gss/server/webdav/milton/GssRootFolderResource.java +++ b/src/gr/ebs/gss/server/webdav/milton/GssRootFolderResource.java @@ -28,6 +28,9 @@ import gr.ebs.gss.server.domain.dto.UserDTO; import java.util.ArrayList; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.bradmcevoy.http.Auth; import com.bradmcevoy.http.Request; import com.bradmcevoy.http.Resource; @@ -40,15 +43,23 @@ import com.bradmcevoy.http.http11.auth.DigestResponse; * */ public class GssRootFolderResource extends GssFolderResource{ - + private static final Logger log = LoggerFactory.getLogger(GssFolderResource.class); + String path; /** * @param host * @param factory * @param resource */ - public GssRootFolderResource(String host, GSSResourceFactory factory, Object resource) { - super(host, factory, resource); - + public GssRootFolderResource(String host, GSSResourceFactory factory, Object resource,String path) { + super(host, factory, resource,null); + this.path=path; + try { + this.folder = (FolderDTO) factory.getResourceGss(path,getCurrentUser()); + //log.info("ROOT FOLDER:"+folder); + } catch (RpcException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } @Override @@ -57,13 +68,20 @@ public class GssRootFolderResource extends GssFolderResource{ boolean result = factory.getSecurityManager().authorise(request, method, auth, this); if(result){ UserDTO user = getCurrentUser(); - try { - this.resource = factory.getResourceGss("/");//getService().getFolder(user.getId(), folder.getId()); - } catch (RpcException e) { - return false; - } + if(user==null) + //log.info("AUTH USER NULL"); + if(this.folder==null){ + try { + this.folder= (FolderDTO) factory.getResourceGss(path,getCurrentUser());//getService().getFolder(user.getId(), folder.getId()); + } catch (RpcException e) { + //log.info("*****AUTH1:"+false+" "+getCurrentUser()); + return false; + } + } + //log.info("*****AUTH2:"+true+" "+getCurrentUser()); return true; } + //log.info("*****AUTH3:"+result+" "+getCurrentUser()+" "+method); return result; } @@ -76,37 +94,43 @@ public class GssRootFolderResource extends GssFolderResource{ @Override public String getName() { - return "/"; + return path; } @Override public String getUniqueId() { - return "folder:/"; + if(folder!=null) + return "folder:"+folder.getId().toString(); + return "folder:"+path; } @Override public Resource child(String name) { - try { - this.folder = (FolderDTO) factory.getResourceGss("/"); - } catch (RpcException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + //log.info("CALLING ROOT GET CHILDREN"); + if(this.folder==null) + try { + this.folder = (FolderDTO) factory.getResourceGss(path,getCurrentUser()); + } catch (RpcException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } return super.child(name); } @Override public List getChildren() { - try { - this.folder = (FolderDTO) factory.getResourceGss("/"); - } catch (RpcException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + //log.info("CALLING ROOT GET CHILDREN"); + if(this.folder==null) + try { + this.folder = (FolderDTO) factory.getResourceGss(path,getCurrentUser()); + } catch (RpcException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } List result = new ArrayList(); for(FolderDTO f : folder.getSubfolders()) if(!f.isDeleted()) - result.add(new GssFolderResource(host, factory, f)); + result.add(new GssFolderResource(host, factory, f,getCurrentUser())); try { for(FileHeaderDTO f : factory.getService().getFiles(getCurrentUser().getId(), folder.getId(), true)) - result.add(new GssFileResource(host, factory, f)); + result.add(new GssFileResource(host, factory, f,getCurrentUser())); } catch (ObjectNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); diff --git a/src/gr/ebs/gss/server/webdav/milton/GssSecurityManager.java b/src/gr/ebs/gss/server/webdav/milton/GssSecurityManager.java index 2390edf..cb1add7 100644 --- a/src/gr/ebs/gss/server/webdav/milton/GssSecurityManager.java +++ b/src/gr/ebs/gss/server/webdav/milton/GssSecurityManager.java @@ -40,7 +40,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.bradmcevoy.http.Auth; -import com.bradmcevoy.http.HttpManager; import com.bradmcevoy.http.Request; import com.bradmcevoy.http.Resource; import com.bradmcevoy.http.Request.Method; @@ -73,11 +72,17 @@ public class GssSecurityManager implements com.bradmcevoy.http.SecurityManager{ this.realm = realm; this.digestGenerator = new DigestGenerator(); } - + /* + public Object getUserByName( String name ) { + String actualPassword = nameAndPasswords.get( name ); + if( actualPassword != null ) return name; + return null; + }*/ + public Object authenticate( String user, String password ) { - log.debug( "authenticate: " + user + " - " + password); + //log.info( "authenticate: " + user + " - " + password); // user name will include domain when coming form ftp. we just strip it off if( user.contains( "@")) { user = user.substring( 0, user.indexOf( "@")); @@ -105,7 +110,8 @@ public class GssSecurityManager implements com.bradmcevoy.http.SecurityManager{ } public Object authenticate( DigestResponse digestRequest ) { - /*String actualPassword=null; + //log.info( "DIGEST authenticate: " + digestRequest); + String actualPassword=null; try { actualPassword = getUsersPassword( digestRequest.getUser() ); } catch (Exception e) { @@ -127,19 +133,7 @@ public class GssSecurityManager implements com.bradmcevoy.http.SecurityManager{ } } else { return null; - }*/ - /*String username = HttpManager.request().getHeaders().get("username"); - if(username!=null){ - try { - return getService().getUserByUserName(username); - } catch (RpcException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - return null; - } - } - return null;*/ - return true; + } } @@ -206,4 +200,4 @@ public class GssSecurityManager implements com.bradmcevoy.http.SecurityManager{ -} +} \ No newline at end of file diff --git a/webdav/WEB-INF/web.xml b/webdav/WEB-INF/web.xml index 70fa23f..4d1e165 100644 --- a/webdav/WEB-INF/web.xml +++ b/webdav/WEB-INF/web.xml @@ -28,8 +28,9 @@ /miltonController --> + + GSS GSS WebDAV @@ -57,7 +58,8 @@ - + --> + -- 1.7.10.4