remm        01/06/08 17:17:59

  Modified:    src/webdav/client/src/org/apache/webdav/cmd Slide.java
  Log:
  - some aliases
  - new error messages
  - clarified error messages
  - new command: acl [path]               Displays the ACL of path
  - new command: grant [<namespace>] <permission> [on <path>] to <principal>
  
  for example: grant all to /users/dirk
  
  This patch allows to easily view ACEs, using commands like (note : this example
  uses the default configuration) :
  
  [ Slide ] $ open http://127.0.0.1:8080/slide
  [127.0.0.1] /slide/ $ ls
  files
  [127.0.0.1] /slide/ $ ls
  files
  [127.0.0.1] /slide/ $ acl
  
  ACL for /slide/:
  ------------------------------------------------------------
  granted to /slide/admin    (not protected)   (not inherited)
     DAV:all
  granted to /slide/user    (not protected)   (not inherited)
     DAV:read
     http://jakarta.apache.org/slide/read-locks
  granted to all    (not protected)   (not inherited)
     DAV:read
     http://jakarta.apache.org/slide/read-locks
  ------------------------------------------------------------
  [127.0.0.1] /slide/ $ cd files
  [127.0.0.1] /slide/files/ $ acl
  
  ACL for /slide/files/:
  ------------------------------------------------------------
  granted to /slide/users/john    (not protected)   (not inherited)
     DAV:read-acl
     DAV:write-acl
  granted to /slide/%2B/users/groupA    (not protected)   (not inherited)
     http://jakarta.apache.org/slide/create-object
     http://jakarta.apache.org/slide/remove-object
     http://jakarta.apache.org/slide/lock-object
     http://jakarta.apache.org/slide/create-revision-metadata
     http://jakarta.apache.org/slide/modify-revision-metadata
     http://jakarta.apache.org/slide/remove-revision-metadata
     http://jakarta.apache.org/slide/create-revision-content
     http://jakarta.apache.org/slide/modify-revision-content
     http://jakarta.apache.org/slide/remove-revision-content
  granted to all    (not protected)   (not inherited)
     DAV:read
     http://jakarta.apache.org/slide/read-locks
  granted to /slide/admin    (protected)   (inherited from '/slide/')
     DAV:all
  granted to /slide/user    (protected)   (inherited from '/slide/')
     DAV:read
     http://jakarta.apache.org/slide/read-locks
  granted to all    (protected)   (inherited from '/slide/')
     DAV:read
     http://jakarta.apache.org/slide/read-locks
  ------------------------------------------------------------
  
  Patch submitted by Dirk Verbeeck <dirk.verbeeck at the-ecorp.com>
  
  Revision  Changes    Path
  1.29      +218 -8    
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.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- Slide.java        2001/05/17 00:34:01     1.28
  +++ Slide.java        2001/06/09 00:17:59     1.29
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-slide/src/webdav/client/src/org/apache/webdav/cmd/Slide.java,v 1.28 
2001/05/17 00:34:01 jericho Exp $
  - * $Revision: 1.28 $
  - * $Date: 2001/05/17 00:34:01 $
  + * $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 $
    *
    * ====================================================================
    *
  @@ -86,6 +86,9 @@
   
   import org.apache.webdav.lib.WebdavResource;
   import org.apache.webdav.lib.methods.*;
  +import org.apache.webdav.lib.properties.AclProperty;
  +import org.apache.webdav.lib.Ace;
  +import org.apache.webdav.lib.Privilege;
   
   /**
    * The Slide client, the command line version for WebDAV client.
  @@ -93,6 +96,7 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Park, Sung-Gu</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Remy Maucherat</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Dave Bryson</a>
  + * @author Dirk Verbeeck
    */
   public class Slide {
   
  @@ -382,10 +386,12 @@
                   } else
                   if (todo.equalsIgnoreCase("exit") ||
                       todo.equalsIgnoreCase("quit") ||
  +                    todo.equalsIgnoreCase("q") ||
                       todo.equalsIgnoreCase("bye")) {
                       break;
                   } else
                   if (todo.equalsIgnoreCase("help") ||
  +                    todo.equalsIgnoreCase("h") ||
                       todo.equalsIgnoreCase("?")) {
                       printSlideClientUsage();
                   } else
  @@ -813,12 +819,89 @@
                           } // end of switch
                       }
                   } else
  -                if (todo.equalsIgnoreCase("propget") ||
  +                if (todo.equalsIgnoreCase("grant")) {
  +                                 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) { // grant <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) { // grant <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) { // grant <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) { // grant <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: grant 
<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;
  +                                             }
  +                                     }
  +                                     grant(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");
  +                        continue;
  +                    }
  +                                     if (count==1) {
  +                                             path=checkUri((String)params.pop());
  +                                     }
  +                                     else {
  +                                             path=webdavResource.getPath();
  +                                     }
  +                                     acl = webdavResource.aclfindMethod(path);
  +
  +                                     if (acl==null)
  +                                     {
  +                                         System.out.print("Error: PropFind didn't 
return an AclProperty!");
  +                        continue;
  +                                     }
  +                                     System.out.println();
  +                                     showAces(path, acl.getAces());
  +                } else
  +                     if (todo.equalsIgnoreCase("propget") ||
                       todo.equalsIgnoreCase("propfind")) {
                       // FIXME: some work is still needed.
                       int count = params.size();
  -                    if (count <= 1)
  +                    if (count <= 1) {
  +                        System.out.print("Propget/propfind requires at least 2 
arguments");
                           continue;
  +                    }
   
                       Vector properties = new Vector();
                       for (int i = 0; i < count-1; i++) {
  @@ -874,6 +957,8 @@
                               System.err.println("Error: Check! " +
                                   e.getMessage());
                           }
  +                    } else {
  +                        System.out.print("Propput/proppatch requires 3 arguments");
                       }
                   } else
                   // TODO: more than 2, the mput command is easy to use.
  @@ -1121,7 +1206,7 @@
                                   debugLevel = Integer.MAX_VALUE;
                                   webdavResource.setDebug(debugLevel);
                                   System.out.println
  -                                    ("The debug flag is on(level=all).");
  +                                    ("The debug flag is on (level=all).");
                               } else if (value.equalsIgnoreCase("off") ||
                                          (value.equalsIgnoreCase("0"))) {
                                   webdavResource.setDebug(debugLevel = 0);
  @@ -1131,7 +1216,7 @@
                                       debugLevel = Integer.parseInt(value);
                                       webdavResource.setDebug(debugLevel);
                                       System.out.println
  -                                        ("The debug flag is on(level=" +
  +                                        ("The debug flag is on (level=" +
                                            debugLevel + ").");
                                   } catch (NumberFormatException nfe) {
                                       System.err.println
  @@ -1143,7 +1228,7 @@
                               System.err.println("Invalid option.");
                           }
                       } else {
  -                        System.err.println("Error: 'set' needs 2 parameters");
  +                        System.err.println("Error: 'set' needs at least 2 
parameters");
                       }
                   } else {
                       System.err.println("Invalid Command.");
  @@ -1366,6 +1451,9 @@
               "Set URL encoding flag, default: on");
           System.out.println("  set debug {on|off|<level>}    " +
               "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
               ("Aliases: help=?, open=connect, ls=dir, pwc=pwd, cc=cd, " +
                "lls=ldir, copy=cp,\n move=mv, delete=del=rm, mkcol=mkdir, " +
  @@ -1386,4 +1474,126 @@
           } catch( InterruptedException ex ) {
           }
       }
  +
  +     private String resolveNamespace(String permission)
  +     {
  +             String DEFAULT_NAMESPACE = "DAV:";
  +             String SLIDE_NAMESPACE = "http://jakarta.apache.org/slide/";;
  +             String namespace=null;
  +
  +             if (permission==null)
  +                     return null;
  +             
  +             if ((permission.equalsIgnoreCase("all")) ||
  +                 (permission.equalsIgnoreCase("read")) ||
  +                 (permission.equalsIgnoreCase("write")) ||
  +                 (permission.equalsIgnoreCase("read-acl")) ||
  +                 (permission.equalsIgnoreCase("write-acl")))
  +         {
  +                 namespace=DEFAULT_NAMESPACE;
  +             }
  +             
  +             if ((permission.equalsIgnoreCase("read-object")) ||
  +                 (permission.equalsIgnoreCase("read-revision-metadata")) ||
  +                 (permission.equalsIgnoreCase("read-revision-content")) ||
  +                 (permission.equalsIgnoreCase("create-object")) ||
  +                 (permission.equalsIgnoreCase("remove-object")) ||
  +                 (permission.equalsIgnoreCase("lock-object")) ||
  +                 (permission.equalsIgnoreCase("read-locks")) ||
  +                 (permission.equalsIgnoreCase("create-revision-metadata")) ||
  +                 (permission.equalsIgnoreCase("modify-revision-metadata")) ||
  +                 (permission.equalsIgnoreCase("remove-revision-metadata")) ||
  +                 (permission.equalsIgnoreCase("create-revision-content")) ||
  +                 (permission.equalsIgnoreCase("modify-revision-content")) ||
  +                 (permission.equalsIgnoreCase("remove-revision-content")) ||
  +                 (permission.equalsIgnoreCase("grant-permission")) ||
  +                 (permission.equalsIgnoreCase("revoke-permission")))
  +             {
  +                     namespace=SLIDE_NAMESPACE;
  +             }
  +             
  +             return namespace;
  +     }
  +
  +     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);
  +
  +             AclProperty acl = webdavResource.aclfindMethod(path);
  +             if (acl==null)
  +             {
  +                     System.out.print("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);
  +             }
  +             
  +             Ace ace=null;
  +             for (int i=0; i<aces.length && (ace==null); i++)
  +             {
  +                     if (!aces[i].isNegative() && !aces[i].isProtected() 
  +                         && !aces[i].isInherited() && 
aces[i].getPrincipal().equals(principal))
  +                     {
  +                             System.out.println("found ace");
  +                             ace=aces[i];
  +                     }
  +             }
  +             if (ace==null)
  +             {
  +                     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);
  +                     aces[oldAces.length]=ace;
  +             }
  +             
  +             Privilege privilege=new Privilege(namespace, permission, null);
  +             ace.addPrivilege(privilege);
  +             
  +             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) {
  +             System.out.println();
  +             System.out.println("ACL from server after update");
  +            showAces(path, aces);
  +        }
  +                     
  +             return success;
  +     }
  +     
  +     private void showAces(String path, Ace[] aces)
  +     {
  +             System.out.println("ACL for " + path + ":");
  +             
System.out.println("------------------------------------------------------------");
  +             for (int i=0; i<aces.length ; i++) 
  +             {
  +                     Ace ace=aces[i];
  +                     System.out.println((!ace.isNegative()?"granted":"denied") + 
  +                             " to " + ace.getPrincipal() + " " + 
  +                             "   (" + (ace.isProtected()?"protected":"not 
protected") + ")" +
  +                             "   (" + (ace.isInherited()? ("inherited from '" + 
ace.getInheritedFrom() + "'"): "not inherited") +")");
  +             
  +                     Enumeration privileges=ace.enumeratePrivileges();
  +                     while (privileges.hasMoreElements())
  +                     {
  +                             Privilege priv=(Privilege)privileges.nextElement();
  +                             System.out.println("   " + priv.getNamespace() + 
priv.getName() + "   " + (priv.getParameter()==null?"":("("+priv.getParameter()+")")));
  +                     }
  +             }
  +             
System.out.println("------------------------------------------------------------");
  +     }
   }
  
  
  

Reply via email to