| This documents highlights the current WebDAV ACL specification and | |
| should start to identify how Subversion can implement the requisite | |
| functionality to become compliant. Note that some of these items may | |
| require work in Apache HTTP Server and/or its included mod_dav to succeed. | |
| Current WebDAV ACL draft: | |
| http://www.webdav.org/acl/protocol/draft-ietf-webdav-acl-09.htm | |
| ===Open questions=== | |
| * Are WebDAV ACLs version independent, version dependent, or up to impl? | |
| Justin: Seems up to impl. I'd believe that ACLs are properties of the | |
| resource and should be versioned. | |
| Brane: ACLs should be version-specific with history, but that's not the | |
| same as versioned, as you should be able to change the access | |
| permissions for a path in an old (i.e., non-HEAD) revision. | |
| * What inheritance model should Subversion support? If so, how? | |
| Justin: WebDAV ACLs indicate inheritance via DAV:inherited property and | |
| DAV:inherited-acl property (for ACE and ACLs, respectively). So, the | |
| inheritance is directly known and explicit (i.e. X inherits from Y). | |
| I believe a similar model would work fine within Subversion. | |
| Brane: Agreed. This is very similar to the NTFS inheritance model (no | |
| surprise there :-) I'd add the restriction that ACLs and ACEs | |
| can only be inherited from "..", i.e., not from anywhere | |
| in the repos. | |
| * Should ACLs themselves be versioned? | |
| Justin: See above, yes, I think they should. (Those that aren't derived.) | |
| * What sub/superset of WebDAV privileges should Subversion have, and how | |
| should they map to WebDAV's privilege model? | |
| Brane: We should at least have a create-child privilege (subsumed in DAV:write, | |
| and never inherited -- ouch!) that can be applied to tags dirs | |
| so that tags can be created there, but not modified (e.g., | |
| set DAV:read and SVN:create-child on the dir, and make all ACLs | |
| inherited by default (unless overriden)) | |
| * What other types of access control mechanisms are we going to require? | |
| Justin: Bill has mentioned that we might want to control who can change | |
| the log. Indeed, there seems to be a separate class of repository | |
| specific attributes. Could we key them off of the Subversion root? | |
| These would seem to be an extension of the WebDAV ACL model, but | |
| necessary ones for uses. | |
| * What are the real semantics of DAV:owner? Could it be the person who | |
| create this file? The site admin? What? | |
| Brane: The owner=creator variant seems most common, although on Windows | |
| I've seen setups where the creator doesn't have the "Object | |
| Ownership" privilege, and the ownership reverts to the creator | |
| of the enclosing composite entity (directory, that is). | |
| This makes sense in a role-based authz system, which is | |
| probably the way Subversion wants to go... | |
| * What to do about inherited and protected ACEs on MOVEs? (up to impl.) | |
| * What ACLs would be required for deletion? (up to impl.) | |
| Brane: There are three options: DAV:write on containing directory (that's | |
| the Unix way, and consistent with our directory structuring), | |
| DAV:write on the object (that's close to the Windows way), | |
| or DAV:owner on the object. | |
| * Can the repository structure be itself unchanged with only modifications | |
| contained within ra_dav and mod_dav_svn? | |
| Justin says: Just might be possible. If Subversion implemented the ACLs | |
| and related items as simple properties on the file, this | |
| approach may work as mod_dav/mod_dav_svn handles enforcement. | |
| Brane says: Even if it's possible, it's evil. Access control must be part | |
| of the FS semantics in order to behave the same across all | |
| RA layers. | |
| ===Answered questions=== | |
| * Can Subversion handle the principal data model? That is, can it enumerate | |
| what users it recognizes. Similarly, can we represent the groups in a | |
| controlled fashion? | |
| Justin: Isn't the concept of a user foreign to Subversion? Indeed, Greg says | |
| it is. So, mod_dav would have to introduce a model to map backend | |
| authentication models and present a unified principal model. Still, | |
| work would have to be done in Apache httpd to achieve this. But, | |
| storage of users doesn't occur with SVN. All SVN would receive is an | |
| authenticated username. | |
| Brane: Agreed. But note that there must be a mapping between WebDAV | |
| principals and Subversion users that is compatible for different | |
| access methods. Note also that the concept of groups is important | |
| for generating sane ACLs, yet the FS must also know the actual | |
| user. It seems that a user->list-of-groups mapping has to be | |
| available to the FS somehow. | |
| * Given Subversion does not know about users, what sorts of ACLs could be | |
| placed on other non-DAV access to the repository (say ra_local)? | |
| Justin: Greg hints that ra_local doesn't use ACLs as it would be possible | |
| to just bypass SVN and edit the BDB backend directly. ACLs are | |
| therefore only desired for ra_dav access. | |
| Brane: Nonsense. What if I, as an admin, want to administer the database | |
| (and modify ACLs) using ra_local? (E.g., while Apache is down | |
| for database recovery/upgrade/etc.) | |
| ===Required to-do items=== | |
| - Contemplate the nature of ACLs | |
| - Construct a mapping of WebDAV ACL properties and values to potential SVN | |
| counterparts. | |
| - Define extensions to the mod_dav provider API that allows ACLs to be | |
| implemented in a provider-neutral fashion. mod_dav should be able to | |
| handle most of the protocol logic, but it will have to retrieve certain | |
| items from the provider to achieve this. | |
| - Allow mod_dav to handle principal URLs via authentication rewrite. | |
| - mod_dav can be written to use these backends and expose provider URLs and | |
| handle the DAV methods on them. | |
| ===Completed items=== | |
| - Apache httpd authentication switched to a provider model for post-2.0.42 | |
| releases. | |
| ===30,000ft summary of WebDAV ACL draft=== | |
| **** | |
| Note: You are encouraged to read the draft in its entirety, but this is | |
| just a rough sketch so that I can remember what is in it. | |
| **** | |
| Principal: | |
| - Single URL which identifies a person | |
| - Certain DAV methods must be implemented on these URLs | |
| Privileges: | |
| - DAV:read | |
| - Controls: GET/PROPFIND | |
| - MAY control: OPTIONS | |
| - DAV:write | |
| - Controls: PUT/PROPPATCH | |
| - Locking interacts with it | |
| - Includes DAV:write-properties and DAV:write-content (3.10) | |
| - DAV:write-properties | |
| - Controls: PROPPATCH. | |
| - Modify dead properties, but (optionally) live ones | |
| - DAV:write-content | |
| - Controls: PUT/DELETE | |
| - DAV:unlock | |
| - Controls: UNLOCK | |
| - DAV:read-acl | |
| - Controls: PROPFIND (on DAV:acl) | |
| - DAV:read-current-user-privilege-set | |
| - Controls: PROPFIND (on DAV:current-user-privilege-set) | |
| - DAV:write-acl | |
| - Modify ACLs | |
| - DAV:all | |
| - Everything | |
| Principal properties: | |
| - DAV:alternate-URI-set | |
| - Required | |
| - HREF | |
| - More knowledge about principal | |
| - DAV:principal-URL | |
| - Required | |
| - Definitive singular URL | |
| - DAV:group-member-set (group principals) | |
| - Direct members of group | |
| - DAV:group-membership | |
| - Required | |
| - What groups a principal belongs to | |
| ACL properties: | |
| - DAV:owner | |
| - Protected | |
| - DAV:supported-privilege-set | |
| - Protected | |
| - What properties are allowed | |
| - DAV:current-user-privilege-set | |
| - Protected | |
| - Computed effective access for current principal | |
| - DAV:acl | |
| - Collection of ACEs (see below) | |
| - DAV:acl-semantics | |
| - Protected | |
| - Describes current behavior of implementing access checks | |
| - DAV:inherited-acl-set | |
| - Indicates which entities that this ACL inherits from | |
| - DAV:principal-collection-set | |
| - Collection of principals for this server | |
| ACE properties: | |
| - DAV:ace | |
| - Invert | |
| - DAV:principal | |
| - href to a principal URL | |
| - DAV:All | |
| - All users | |
| - DAV:Authenticated | |
| - DAV:Unauthenticated | |
| - DAV:Property | |
| - If specified property value matches what we know, success. | |
| - DAV:Owner matching (?) | |
| - DAV:Self | |
| - Only for principal URLs if authenticated as that principal | |
| - grant or deny privilege: | |
| - See above for ACE privileges | |
| - DAV:protected | |
| - Any attempt to remove this MUST fail | |
| - DAV:inherited | |
| - This ACE comes from resource in href | |
| ACE combinations: | |
| - Describes how ACEs are evaluated | |
| - DAV:first-match | |
| - DAV:all-grant-before-any-deny | |
| - DAV:specific-deny-overrides-grant | |
| ACE ordering: | |
| - DAV:deny-before-grant | |
| Allowed ACE: | |
| - DAV:principal-only-one-ace | |
| - A principal may only appearing in one ACE per ACL | |
| - DAV:grant-only | |
| - DAV:no-invert | |
| Required principals | |
| - DAV:required-principal | |
| - Defines that a principal must be defined for this property ACE | |
| - Usually for DAV:owner (?) | |
| DAV methods changes: | |
| - OPTIONS | |
| - Must return literal "access-control" | |
| - MOVE | |
| - Must move non-inherited and non-protected ACEs from DAV:acl | |
| - COPY | |
| - Permissions must not be copied. Default ACL may apply. | |
| - If wish to preserve ACL, retrieve before COPY, then reapply ACLs. | |
| - DELETE | |
| - LOCK | |
| - Only lock owner may modify ACEs | |
| Access control methods: | |
| - ACL | |
| - Allows updating of ACLs | |
| Reporting: | |
| - REPORT | |
| - Must support DAV:expand-property | |
| - DAV:acl-principal-prop-set | |
| - Required | |
| - Returns property requested for all principals | |
| - Client access? | |
| - DAV:principal-match | |
| - Required | |
| - Lists which ACEs you are the principal on | |
| - DAV:principal-property-search | |
| - Required | |
| - Does a search for principals who match the criteria | |
| - DAV:principal-search-property-set | |
| - Required | |
| - Returns what properties may be searched on DAV:principal-property-search |