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;