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 re...@apache.org on 2001/03/18 22:50:59 UTC

cvs commit: jakarta-slide/src/webdav/server/org/apache/slide/webdav/method OptionsMethod.java PropFindMethod.java WebdavMethod.java

remm        01/03/18 13:50:59

  Modified:    src/webdav/server/org/apache/slide/webdav/method
                        OptionsMethod.java PropFindMethod.java
                        WebdavMethod.java
  Log:
  - Add support for the WebDAV ACL acl property.
  
  Revision  Changes    Path
  1.4       +4 -4      jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/OptionsMethod.java
  
  Index: OptionsMethod.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/OptionsMethod.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- OptionsMethod.java	2001/01/20 19:59:39	1.3
  +++ OptionsMethod.java	2001/03/18 21:50:58	1.4
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/OptionsMethod.java,v 1.3 2001/01/20 19:59:39 remm Exp $
  - * $Revision: 1.3 $
  - * $Date: 2001/01/20 19:59:39 $
  + * $Header: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/OptionsMethod.java,v 1.4 2001/03/18 21:50:58 remm Exp $
  + * $Revision: 1.4 $
  + * $Date: 2001/03/18 21:50:58 $
    *
    * ====================================================================
    *
  @@ -99,7 +99,7 @@
       
       protected void executeRequest() 
   	throws WebdavException {
  -	resp.addHeader("DAV", "1,2");
  +	resp.addHeader("DAV", "1, 2, slide, access-control");
           
   	String resourceUri = requestUri;
   	if (resourceUri == null) {
  
  
  
  1.11      +318 -6    jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/PropFindMethod.java
  
  Index: PropFindMethod.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/PropFindMethod.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- PropFindMethod.java	2001/03/16 11:52:51	1.10
  +++ PropFindMethod.java	2001/03/18 21:50:58	1.11
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/PropFindMethod.java,v 1.10 2001/03/16 11:52:51 juergen Exp $
  - * $Revision: 1.10 $
  - * $Date: 2001/03/16 11:52:51 $
  + * $Header: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/PropFindMethod.java,v 1.11 2001/03/18 21:50:58 remm Exp $
  + * $Revision: 1.11 $
  + * $Date: 2001/03/18 21:50:58 $
    *
    * ====================================================================
    *
  @@ -68,6 +68,7 @@
   import java.util.*;
   import javax.servlet.*;
   import javax.servlet.http.*;
  +import javax.xml.parsers.DocumentBuilder;
   import org.w3c.dom.*;
   import org.xml.sax.InputSource;
   import org.apache.util.XMLPrinter;
  @@ -79,7 +80,7 @@
   import org.apache.slide.structure.*;
   import org.apache.slide.lock.*;
   import org.apache.slide.content.*;
  -import javax.xml.parsers.DocumentBuilder;
  +import org.apache.slide.security.NodePermission;
   
   /**
    * PROPFIND method.
  @@ -176,6 +177,48 @@
           "current-user-privilege-set";
       
       
  +    /**
  +     * ACL.
  +     */
  +    private static final String ACL = "acl";
  +    
  +    
  +    /**
  +     * ACE.
  +     */
  +    private static final String ACE = "ace";
  +    
  +    
  +    /**
  +     * GRANT.
  +     */
  +    private static final String GRANT = "grant";
  +    
  +    
  +    /**
  +     * DENY.
  +     */
  +    private static final String DENY = "deny";
  +    
  +    
  +    /**
  +     * PRINCIPAL.
  +     */
  +    private static final String PRINCIPAL = "principal";
  +    
  +    
  +    /**
  +     * PRIVILEGE.
  +     */
  +    private static final String PRIVILEGE = "privilege";
  +    
  +    
  +    /**
  +     * INHERITED.
  +     */
  +    private static final String INHERITED = "inherited";
  +    
  +    
       // ----------------------------------------------------- Instance Variables
       
       
  @@ -402,11 +445,13 @@
                       } catch (StructureException e) {
                           e.printStackTrace();
                           resp.setStatus(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  -                        throw new WebdavException(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  +                        throw new WebdavException
  +                            (WebdavStatus.SC_INTERNAL_SERVER_ERROR);
                       } catch (ServiceAccessException e) {
                           e.printStackTrace();
                           resp.setStatus(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  -                        throw new WebdavException(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  +                        throw new WebdavException
  +                            (WebdavStatus.SC_INTERNAL_SERVER_ERROR);
                       }
                       
                       while (enum.hasMoreElements()) {
  @@ -1112,8 +1157,275 @@
       private void showAcl(ObjectNode object, XMLPrinter generatedXML)
           throws WebdavException {
           
  +        generatedXML.writeElement(null, ACL, XMLPrinter.OPENING);
  +        
  +        NamespaceConfig config = token.getNamespaceConfig();
  +        
  +        // read
  +        String readObjectUri = config.getReadObjectAction().getUri();
  +        String readRevisionMetadataUri = 
  +            config.getReadRevisionMetadataAction().getUri();
  +        String readRevisionContentUri =
  +            config.getReadRevisionContentAction().getUri();
  +        
  +        // write
  +        String createObjectUri = config.getCreateObjectAction().getUri();
  +        String removeObjectUri = config.getRemoveObjectAction().getUri();
  +        String lockObjectUri = config.getLockObjectAction().getUri();
  +        String readLocksUri = config.getReadLocksAction().getUri();
  +        String createRevisionMetadataUri = 
  +            config.getCreateRevisionMetadataAction().getUri();
  +        String modifyRevisionMetadataUri = 
  +            config.getModifyRevisionMetadataAction().getUri();
  +        String removeRevisionMetadataUri = 
  +            config.getRemoveRevisionMetadataAction().getUri();
  +        String createRevisionContentUri = 
  +            config.getCreateRevisionContentAction().getUri();
  +        String modifyRevisionContentUri = 
  +            config.getModifyRevisionContentAction().getUri();
  +        String removeRevisionContentUri = 
  +            config.getRemoveRevisionContentAction().getUri();
  +        
  +        // read-acl
  +        String readPermissionsUri = config.getReadPermissionsAction().getUri();
  +        
  +        // write-acl
  +        String grantPermissionUri = config.getGrantPermissionAction().getUri();
  +        String revokePermissionUri = 
  +            config.getRevokePermissionAction().getUri();
  +        
  +        ObjectNode current = object;
  +        boolean inheritedPermissions = false;
  +        
  +        while (current != null) {
  +            
  +            try {
  +                
  +                Enumeration aclList = security.enumeratePermissions
  +                    (slideToken, current);
  +                
  +                while (aclList.hasMoreElements()) {
  +                    
  +                    NodePermission permission = (NodePermission)
  +                        aclList.nextElement();
  +                    
  +                    String principal = permission.getSubjectUri();
  +                    
  +                    String action = permission.getActionUri();
  +                    
  +                    // read
  +                    boolean isReadObject = readObjectUri.startsWith(action);
  +                    boolean isReadRevisionMetadata = 
  +                        readRevisionMetadataUri.startsWith(action);
  +                    boolean isReadRevisionContent = 
  +                        readRevisionContentUri.startsWith(action);
  +                    
  +                    boolean isRead = isReadObject && isReadRevisionMetadata
  +                        && isReadRevisionContent;
  +                    
  +                    // write
  +                    boolean isCreateObject = 
  +                        createObjectUri.startsWith(action);
  +                    boolean isRemoveObject = 
  +                        removeObjectUri.startsWith(action);
  +                    boolean isLockObject = lockObjectUri.startsWith(action);
  +                    boolean isReadLocks = readLocksUri.startsWith(action);
  +                    boolean isCreateRevisionMetadata =
  +                        createRevisionMetadataUri.startsWith(action);
  +                    boolean isModifyRevisionMetadata =
  +                        modifyRevisionMetadataUri.startsWith(action);
  +                    boolean isRemoveRevisionMetadata =
  +                        removeRevisionMetadataUri.startsWith(action);
  +                    boolean isCreateRevisionContent =
  +                        createRevisionContentUri.startsWith(action);
  +                    boolean isModifyRevisionContent =
  +                        modifyRevisionContentUri.startsWith(action);
  +                    boolean isRemoveRevisionContent =
  +                        removeRevisionContentUri.startsWith(action);
  +                    
  +                    boolean isWrite = isCreateObject && isRemoveObject
  +                        && isLockObject && isReadLocks 
  +                        && isCreateRevisionMetadata
  +                        && isModifyRevisionMetadata && isRemoveRevisionMetadata
  +                        && isCreateRevisionContent && isModifyRevisionContent 
  +                        && isRemoveRevisionContent;
  +                    
  +                    //read-acl
  +                    boolean isReadPermissions = 
  +                        readPermissionsUri.startsWith(action);
  +                    
  +                    boolean isReadAcl = isReadPermissions;
  +                    
  +                    // write-acl
  +                    boolean isGrantPermission = 
  +                        grantPermissionUri.startsWith(action);
  +                    boolean isRevokePermission =
  +                        revokePermissionUri.startsWith(action);
  +                    
  +                    boolean isWriteAcl = 
  +                        isGrantPermission && isRevokePermission;
  +                    
  +                    boolean isAll = isRead && isWrite && isReadAcl 
  +                        && isWriteAcl;
  +                    
  +                    generatedXML.writeElement(null, ACE, XMLPrinter.OPENING);
  +                    
  +                    writePrincipal(generatedXML, principal);
  +                    
  +                    if (permission.isNegative()) {
  +                        generatedXML.writeElement(null, DENY, 
  +                                                  XMLPrinter.OPENING);
  +                    } else {
  +                        generatedXML.writeElement(null, GRANT, 
  +                                                  XMLPrinter.OPENING);
  +                    }
  +                    
  +                    if (isAll) {
  +                        writePrivilege(generatedXML, "all", true);
  +                    } else {
  +                        if (isRead) {
  +                            writePrivilege(generatedXML, "read", true);
  +                        } else {
  +                            if (isReadObject)
  +                                writePrivilege(generatedXML, 
  +                                               "read-object", false);
  +                            if (isReadRevisionMetadata)
  +                                writePrivilege(generatedXML, 
  +                                               "read-revision-metadata", 
  +                                               false);
  +                            if (isReadRevisionContent)
  +                                writePrivilege(generatedXML, 
  +                                               "read-revision-content", false);
  +                        }
  +                        if (isWrite) {
  +                            writePrivilege(generatedXML, "write", true);
  +                        } else {
  +                            if (isCreateObject)
  +                                writePrivilege(generatedXML, 
  +                                               "create-object", false);
  +                            if (isRemoveObject)
  +                                writePrivilege(generatedXML, 
  +                                               "remove-object", false);
  +                            if (isLockObject)
  +                                writePrivilege(generatedXML, 
  +                                               "lock-object", false);
  +                            if (isReadLocks)
  +                                writePrivilege(generatedXML, 
  +                                               "read-locks", false);
  +                            if (isCreateRevisionMetadata)
  +                                writePrivilege(generatedXML, 
  +                                               "create-revision-metadata", 
  +                                               false);
  +                            if (isModifyRevisionMetadata)
  +                                writePrivilege(generatedXML, 
  +                                               "modify-revision-metadata", 
  +                                               false);
  +                            if (isRemoveRevisionMetadata)
  +                                writePrivilege(generatedXML, 
  +                                               "remove-revision-metadata", 
  +                                               false);
  +                            if (isCreateRevisionContent)
  +                                writePrivilege(generatedXML, 
  +                                               "create-revision-content", 
  +                                               false);
  +                            if (isModifyRevisionContent)
  +                                writePrivilege(generatedXML, 
  +                                               "modify-revision-content", 
  +                                               false);
  +                            if (isRemoveRevisionContent)
  +                                writePrivilege(generatedXML, 
  +                                               "remove-revision-content", 
  +                                               false);
  +                        }
  +                        if (isReadAcl) {
  +                            writePrivilege(generatedXML, "read-acl", true);
  +                        }
  +                        if (isWriteAcl) {
  +                            writePrivilege(generatedXML, "write-acl", true);
  +                        } else {
  +                            if (isGrantPermission)
  +                                writePrivilege(generatedXML, 
  +                                               "grant-permission", false);
  +                            if (isRevokePermission)
  +                                writePrivilege(generatedXML, 
  +                                               "revoke-permission", false);
  +                        }
  +                    }
  +                    
  +                    if (permission.isNegative()) {
  +                        generatedXML.writeElement(null, DENY, 
  +                                                  XMLPrinter.CLOSING);
  +                    } else {
  +                        generatedXML.writeElement(null, GRANT, 
  +                                                  XMLPrinter.CLOSING);
  +                    }
  +                    
  +                    if (inheritedPermissions) {
  +                        generatedXML.writeElement(null, INHERITED, 
  +                                                  XMLPrinter.OPENING);
  +                        generatedXML.writeElement(null, "href", 
  +                                                  XMLPrinter.OPENING);
  +                        generatedXML.writeText(URLEncode(current.getUri()));
  +                        generatedXML.writeElement(null, "href", 
  +                                                  XMLPrinter.CLOSING);
  +                        generatedXML.writeElement(null, INHERITED, 
  +                                                  XMLPrinter.CLOSING);
  +                    }
  +                    
  +                    generatedXML.writeElement(null, ACE, XMLPrinter.CLOSING);
  +                }
  +                
  +            } catch (SlideException e) {
  +            }
  +            
  +            inheritedPermissions = true;
  +            try {
  +                current = structure.getParent(slideToken, current);
  +            } catch (SlideException e) {
  +                break;
  +            }
  +            
  +        }
           
  +        generatedXML.writeElement(null, ACL, XMLPrinter.CLOSING);
           
  +    }
  +    
  +    
  +    /**
  +     * Write principal.
  +     */
  +    private void writePrincipal(XMLPrinter generatedXML, String principal) {
  +        generatedXML.writeElement(null, PRINCIPAL, XMLPrinter.OPENING);
  +        // FIXME: Apparently, there are or will be some other cases, but it 
  +        // isn't very clear in the spec
  +        if (principal.equals("~")) {
  +            generatedXML.writeElement(null, "self", XMLPrinter.NO_CONTENT);
  +        } if (pricipal.equals("nobody") {
  +            generatedXML.writeElement(null, "unauthenticated", 
  +                                      XMLPrinter.NO_CONTENT);
  +        } else {
  +            generatedXML.writeElement(null, "href", XMLPrinter.OPENING);
  +            generatedXML.writeText(URLEncode(principal));
  +            generatedXML.writeElement(null, "href", XMLPrinter.CLOSING);
  +        }
  +        generatedXML.writeElement(null, PRINCIPAL, XMLPrinter.CLOSING);
  +    }
  +    
  +    
  +    /**
  +     * Write grant / deny.
  +     */
  +    private void writePrivilege(XMLPrinter generatedXML, String name,
  +                                boolean standard) {
  +        generatedXML.writeElement(null, PRIVILEGE, XMLPrinter.OPENING);
  +        if (standard) {
  +            generatedXML.writeElement(null, name, XMLPrinter.NO_CONTENT);
  +        } else {
  +            generatedXML.writeElement(SLIDE_NAMESPACE_ABBREV, name, 
  +                                      XMLPrinter.NO_CONTENT);
  +        }
  +        generatedXML.writeElement(null, PRIVILEGE, XMLPrinter.CLOSING);
       }
       
       
  
  
  
  1.15      +7 -3      jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/WebdavMethod.java
  
  Index: WebdavMethod.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/WebdavMethod.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- WebdavMethod.java	2001/03/09 14:47:11	1.14
  +++ WebdavMethod.java	2001/03/18 21:50:58	1.15
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/WebdavMethod.java,v 1.14 2001/03/09 14:47:11 juergen Exp $
  - * $Revision: 1.14 $
  - * $Date: 2001/03/09 14:47:11 $
  + * $Header: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/WebdavMethod.java,v 1.15 2001/03/18 21:50:58 remm Exp $
  + * $Revision: 1.15 $
  + * $Date: 2001/03/18 21:50:58 $
    *
    * ====================================================================
    *
  @@ -98,6 +98,9 @@
       
       
       public static final String LOCK_TOKEN = "opaquelocktoken:";
  +    public static final String SLIDE_NAMESPACE = 
  +        "http://jakarta.apache.org/slide/";
  +    public static final String SLIDE_NAMESPACE_ABBREV = "S";
       
       
       // ----------------------------------------------------- Instance Variables
  @@ -424,6 +427,7 @@
       protected void readRequestContent() {
           
           namespaces = new Hashtable();
  +        namespaces.put(SLIDE_NAMESPACE_ABBREV, SLIDE_NAMESPACE);
           
           if (req.getContentLength() == 0)
               return;