You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by di...@apache.org on 2001/07/11 23:21:10 UTC

cvs commit: jakarta-slide/src/webdav/client/src/org/apache/webdav/cmd Slide.java

dirkv       01/07/11 14:21:09

  Modified:    src/webdav/client/src/org/apache/webdav/cmd Slide.java
  Log:
  complete acl support with deny and revoke
  the following acl commands are available:
  grant  [<namespace>] <permission> [on <path>] to <principal>
  deny   [<namespace>] <permission> [on <path>] to <principal>
  revoke [<namespace>] <permission> [on <path>] from <principal>
  
  Revision  Changes    Path
  1.30      +204 -14   jakarta-slide/src/webdav/client/src/org/apache/webdav/cmd/Slide.java
  
  Index: Slide.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/webdav/client/src/org/apache/webdav/cmd/Slide.java,v
  retrieving revision 1.29
  retrieving revision 1.30
  diff -u -r1.29 -r1.30
  --- Slide.java	2001/06/09 00:17:59	1.29
  +++ Slide.java	2001/07/11 21:21:05	1.30
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/webdav/client/src/org/apache/webdav/cmd/Slide.java,v 1.29 2001/06/09 00:17:59 remm Exp $
  - * $Revision: 1.29 $
  - * $Date: 2001/06/09 00:17:59 $
  + * $Header: /home/cvs/jakarta-slide/src/webdav/client/src/org/apache/webdav/cmd/Slide.java,v 1.30 2001/07/11 21:21:05 dirkv Exp $
  + * $Revision: 1.30 $
  + * $Date: 2001/07/11 21:21:05 $
    *
    * ====================================================================
    *
  @@ -868,14 +868,113 @@
   						}
   					}
   					grant(webdavResource, namespace, permission, path, principal);
  -
                   } else
  +                if (todo.equalsIgnoreCase("deny")) {
  +                    int count = params.size();
  +                	String principal=null;
  +                	String to=null;
  +                	String path=null;
  +                	String on=null;
  +                	String permission=null;
  +                	String namespace=null;
  +                	if (count==3) { // deny <permission> to <principal>
  +                		principal=(String)params.pop();
  +                		to=(String)params.pop();
  +                		path=checkUri(webdavResource.getPath());
  +                		on="on";
  +                		permission=(String)params.pop();
  +                		namespace=null;
  +                	} else if (count==4) { // deny <namespace> <permission> to <principal>
  +                		principal=(String)params.pop();
  +                		to=(String)params.pop();
  +                		path=checkUri(webdavResource.getPath());
  +                		on="on";
  +                		permission=(String)params.pop();
  +                		namespace=(String)params.pop();
  +                	} else if (count==5) { // deny <permission> on <path> to <principal>
  +                		principal=(String)params.pop();
  +                		to=(String)params.pop();
  +                		path=checkUri((String)params.pop());
  +                		on=(String)params.pop();
  +                		permission=(String)params.pop();
  +                		namespace=null;
  +                	} else if (count==6) { // deny <namespace> <permission> on <path> to <principal>
  +                		principal=(String)params.pop();
  +                		to=(String)params.pop();
  +                		path=checkUri((String)params.pop());
  +                		on=(String)params.pop();
  +                		permission=(String)params.pop();
  +                		namespace=(String)params.pop();
  +                	} 
  +                	if (!"to".equalsIgnoreCase(to) || !"on".equalsIgnoreCase(on)) {
  +                		System.out.println("Syntax: deny <namespace> <permission> on <path> to <principal>");
  +                		continue;
  +                	}
  +                	if (namespace==null) {
  +                		namespace=resolveNamespace(permission);
  +                		if (namespace==null) {
  +                			System.out.println("Could not resolve namespace for permission " + permission);
  +                			continue;
  +                		}
  +                	}
  +                	deny(webdavResource, namespace, permission, path, principal);
  +                } else
  +                if (todo.equalsIgnoreCase("revoke")) {
  +                    int count = params.size();
  +                	String principal=null;
  +                	String from=null;
  +                	String path=null;
  +                	String on=null;
  +                	String permission=null;
  +                	String namespace=null;
  +                	if (count==3) { // revoke <permission> to <principal>
  +                		principal=(String)params.pop();
  +                		from=(String)params.pop();
  +                		path=checkUri(webdavResource.getPath());
  +                		on="on";
  +                		permission=(String)params.pop();
  +                		namespace=null;
  +                	} else if (count==4) { // revoke <namespace> <permission> from <principal>
  +                		principal=(String)params.pop();
  +                		from=(String)params.pop();
  +                		path=checkUri(webdavResource.getPath());
  +                		on="on";
  +                		permission=(String)params.pop();
  +                		namespace=(String)params.pop();
  +                	} else if (count==5) { // revoke <permission> on <path> from <principal>
  +                		principal=(String)params.pop();
  +                		from=(String)params.pop();
  +                		path=checkUri((String)params.pop());
  +                		on=(String)params.pop();
  +                		permission=(String)params.pop();
  +                		namespace=null;
  +                	} else if (count==6) { // revoke <namespace> <permission> on <path> from <principal>
  +                		principal=(String)params.pop();
  +                		from=(String)params.pop();
  +                		path=checkUri((String)params.pop());
  +                		on=(String)params.pop();
  +                		permission=(String)params.pop();
  +                		namespace=(String)params.pop();
  +                	} 
  +                	if (!"from".equalsIgnoreCase(from) || !"on".equalsIgnoreCase(on)) {
  +                		System.out.println("Syntax: revoke <namespace> <permission> on <path> from <principal>");
  +                		continue;
  +                	}
  +                	if (namespace==null) {
  +                		namespace=resolveNamespace(permission);
  +                		if (namespace==null) {
  +                			System.out.println("Could not resolve namespace for permission " + permission);
  +                			continue;
  +                		}
  +                	}
  +                	revoke(webdavResource, namespace, permission, path, principal);
  +                } else
                   if (todo.equalsIgnoreCase("acl")) {
   				    String path=null;
   					AclProperty acl=null;
                       int count = params.size();
                       if (count>1) {
  -                        System.out.print("acl has a maximum of 1 argument");
  +                        System.out.println("acl has a maximum of 1 argument");
                           continue;
                       }
   					if (count==1) {
  @@ -888,7 +987,7 @@
   
   					if (acl==null)
   					{
  -					    System.out.print("Error: PropFind didn't return an AclProperty!");
  +					    System.out.println("Error: PropFind didn't return an AclProperty!");
                           continue;
   					}
   					System.out.println();
  @@ -1453,7 +1552,9 @@
               "Set debug level, default: off");
           System.out.println("  acl [path]                    " +
               "Displays the ACL of path");
  -        System.out.println("  grant [<namespace>] <permission> [on <path>] to <principal>");
  +        System.out.println("  grant  [<namespace>] <permission> [on <path>] to <principal>");
  +        System.out.println("  deny   [<namespace>] <permission> [on <path>] to <principal>");
  +        System.out.println("  revoke [<namespace>] <permission> [on <path>] from <principal>");
           System.out.println
               ("Aliases: help=?, open=connect, ls=dir, pwc=pwd, cc=cd, " +
                "lls=ldir, copy=cp,\n move=mv, delete=del=rm, mkcol=mkdir, " +
  @@ -1518,11 +1619,28 @@
   	private boolean grant(WebdavResource webdavResource, String namespace, String permission, String path, String principal) throws HttpException, IOException
   	{
   		System.out.println("grant " + namespace + permission + " on " + path + " to " + principal);
  +		return addPermission(webdavResource, namespace, permission, path, principal, false);
  +	}
   
  +	private boolean deny(WebdavResource webdavResource, String namespace, String permission, String path, String principal) throws HttpException, IOException
  +	{
  +		System.out.println("deny " + namespace + permission + " on " + path + " to " + principal);
  +		return addPermission(webdavResource, namespace, permission, path, principal, true);
  +	}
  +
  +	private boolean revoke(WebdavResource webdavResource, String namespace, String permission, String path, String principal) throws HttpException, IOException
  +	{
  +		System.out.println("revoke " + namespace + permission + " on " + path + " from " + principal);
  +		return removePermission(webdavResource, namespace, permission, path, principal);
  +	}
  +
  +	private boolean addPermission(WebdavResource webdavResource, String namespace, String permission, String path, String principal, boolean negative) throws HttpException, IOException
  +	{
  +
   		AclProperty acl = webdavResource.aclfindMethod(path);
   		if (acl==null)
   		{
  -			System.out.print("Error: PropFind didn't return an AclProperty!");
  +			System.out.println("Error: PropFind didn't return an AclProperty!");
   			return false;
   		}
   		Ace[] aces=acl.getAces();
  @@ -1536,10 +1654,11 @@
   		Ace ace=null;
   		for (int i=0; i<aces.length && (ace==null); i++)
   		{
  -			if (!aces[i].isNegative() && !aces[i].isProtected() 
  +			if ((aces[i].isNegative()==negative) && !aces[i].isProtected() 
   			    && !aces[i].isInherited() && aces[i].getPrincipal().equals(principal))
   			{
  -				System.out.println("found ace");
  +				if (debugLevel>5)
  +					System.out.println("found ace");
   				ace=aces[i];
   			}
   		}
  @@ -1548,7 +1667,7 @@
   			Ace[] oldAces=aces;
   			aces=new Ace[oldAces.length+1];
   			System.arraycopy(oldAces,0,aces,0,oldAces.length);
  -			ace=new Ace(principal, false, false, false,null);
  +			ace=new Ace(principal, negative, false, false,null);
   			aces[oldAces.length]=ace;
   		}
   		
  @@ -1567,10 +1686,81 @@
               System.err.println(webdavResource.getStatusMessage());	
   
           if (debugLevel>5) {
  -          	System.out.println();
  -          	System.out.println("ACL from server after update");
  -            showAces(path, aces);
  +	        acl = webdavResource.aclfindMethod(path);
  +	        if (acl==null)
  +	        	System.out.println("Error: PropFind didn't return an AclProperty!");
  +			else 
  +			{	
  +		        aces=acl.getAces();
  +	          	System.out.println();
  +	          	System.out.println("ACL from server after update");
  +	            showAces(path, aces);
  +			}
           }
  +			
  +		return success;
  +	}
  +
  +	private boolean removePermission(WebdavResource webdavResource, String namespace, String permission, String path, String principal) throws HttpException, IOException
  +	{
  +		AclProperty acl = webdavResource.aclfindMethod(path);
  +		if (acl==null)
  +		{
  +			System.out.println("Error: PropFind didn't return an AclProperty!");
  +			return false;
  +		}
  +		Ace[] aces=acl.getAces();
  +
  +		if (debugLevel>5) {
  +	        System.out.println();
  +			System.out.println("ACL from server");
  +		    showAces(path, aces);
  +		}
  +		
  +		boolean found=false;
  +		Privilege privilege=new Privilege(namespace, permission, null);
  +		for (int i=0; i<aces.length; i++)
  +		{
  +			if (!aces[i].isProtected() && !aces[i].isInherited() && aces[i].getPrincipal().equals(principal))
  +			{
  +				if (debugLevel>5)
  +					System.out.println("found ace");
  +				boolean removed = aces[i].removePrivilege(privilege);
  +				found = found || removed;
  +				if ((debugLevel>5) || removed)
  +					System.out.println("privilege removed");
  +			}
  +		}
  +		
  +		if (!found) 
  +		{
  +			System.out.println("Privilege not found");
  +			return false;
  +		}
  +		
  +		if (debugLevel>5) {
  +			System.out.println();
  +			System.out.println("ACL with updated privileges");
  +		    showAces(path, aces);
  +		}
  +
  +		boolean success = webdavResource.aclMethod(path,aces);
  +	
  +		if (!success)
  +	        System.err.println(webdavResource.getStatusMessage());	
  +
  +	    if (debugLevel>5) {
  +		    acl = webdavResource.aclfindMethod(path);
  +		    if (acl==null)
  +		    	System.out.println("Error: PropFind didn't return an AclProperty!");
  +		    else 
  +		    {	
  +		        aces=acl.getAces();
  +		      	System.out.println();
  +		      	System.out.println("ACL from server after update");
  +		        showAces(path, aces);
  +		    }
  +	    }
   			
   		return success;
   	}