draft-ietf-webdav-acl-07.txt | draft-ietf-webdav-acl-08.txt | |||
---|---|---|---|---|
INTERNET-DRAFT Geoffrey Clemm, Rational Software | INTERNET-DRAFT Geoffrey Clemm, Rational Software | |||
draft-ietf-webdav-acl-07 Anne Hopkins, Microsoft Corporation | draft-ietf-webdav-acl-08 Anne Hopkins, Microsoft Corporation | |||
Eric Sedlar, Oracle Corporation | Eric Sedlar, Oracle Corporation | |||
Jim Whitehead, U.C. Santa Cruz | Jim Whitehead, U.C. Santa Cruz | |||
Expires May 9, 2001 November 9, 2001 | Expires November 7, 2002 May 7, 2002 | |||
WebDAV Access Control Protocol | WebDAV Access Control Protocol | |||
Status of this Memo | Status of this Memo | |||
This document is an Internet-Draft and is in full conformance with all | This document is an Internet-Draft and is in full conformance with | |||
provisions of Section 10 of RFC2026. | all provisions of Section 10 of RFC2026. | |||
Internet-Drafts are working documents of the Internet Engineering Task | ||||
Force (IETF), its areas, and its working groups. Note that other groups | ||||
may also distribute working documents as Internet-Drafts. | ||||
Internet-Drafts are working documents of the Internet Engineering | ||||
Task Force (IETF), its areas, and its working groups. Note that other | ||||
groups may also distribute working documents as Internet-Drafts. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet- Drafts as reference material | time. It is inappropriate to use Internet- Drafts as reference | |||
or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
The list of current Internet-Drafts can be accessed at | The list of current Internet-Drafts can be accessed at | |||
http://www.ietf.org/ietf/1id-abstracts.txt | http://www.ietf.org/ietf/1id-abstracts.txt | |||
The list of Internet-Draft Shadow Directories can be accessed at | The list of Internet-Draft Shadow Directories can be accessed at | |||
http://www.ietf.org/shadow.html. | http://www.ietf.org/shadow.html. | |||
Abstract | Abstract | |||
This document specifies a set of methods, headers, and message bodies | This document specifies a set of methods, headers, and message bodies | |||
that define Access Control extensions to the WebDAV Distributed | that define Access Control extensions to the WebDAV Distributed | |||
Authoring Protocol. This protocol permits a client to read and modify | Authoring Protocol. This protocol permits a client to read and modify | |||
access control lists that instruct a server whether to allow or deny | access control lists that instruct a server whether to allow or deny | |||
operations upon a resource (such as HTTP method invocations) by a given | operations upon a resource (such as HTTP method invocations) by a | |||
principal. | given principal. | |||
This document is a product of the Web Distributed Authoring and | This document is a product of the Web Distributed Authoring and | |||
Versioning (WebDAV) working group of the Internet Engineering Task | Versioning (WebDAV) working group of the Internet Engineering Task | |||
Force. Comments on this draft are welcomed, and should be addressed to | Force. Comments on this draft are welcomed, and should be addressed | |||
the acl@webdav.org mailing list. Other related documents can be found at | to the acl@webdav.org mailing list. Other related documents can be | |||
http://www.webdav.org/acl/, and http://www.ics.uci.edu/pub/ietf/webdav/. | found at http://www.webdav.org/acl/, and | |||
http://www.ics.uci.edu/pub/ietf/webdav/. | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 1] | Clemm, Hopkins, Sedlar, Whitehead [Page 1] | |||
Table of Contents | Table of Contents | |||
1 INTRODUCTION.......................................................5 | 1 INTRODUCTION...................................................4 | |||
1.1 Terms............................................................7 | 1.1 Terms........................................................7 | |||
1.2 Notational Conventions...........................................8 | 1.2 Notational Conventions.......................................8 | |||
2 PRINCIPALS.........................................................8 | 2 PRINCIPALS.....................................................8 | |||
3 PRIVILEGES.........................................................9 | 3 PRIVILEGES.....................................................9 | |||
3.1 DAV:read Privilege..............................................11 | 3.1 DAV:read Privilege...........................................10 | |||
3.2 DAV:write Privilege.............................................11 | 3.2 DAV:write Privilege..........................................10 | |||
3.3 DAV:read-acl Privilege..........................................11 | 3.3 DAV:write-properties.........................................11 | |||
3.4 DAV:read-current-user-privilege-set Privilege...................11 | 3.4 DAV:write-content............................................11 | |||
3.5 DAV:write-acl Privilege.........................................12 | 3.5 DAV:unlock...................................................11 | |||
3.6 DAV:all Privilege...............................................12 | 3.6 DAV:read-acl Privilege.......................................12 | |||
3.7 Aggregation of Predefined Privileges............................12 | 3.7 DAV:read-current-user-privilege-set Privilege................12 | |||
3.8 DAV:write-acl Privilege......................................12 | ||||
3.9 DAV:all Privilege............................................12 | ||||
3.10 Aggregation of Predefined Privileges........................12 | ||||
4 PRINCIPAL PROPERTIES..............................................12 | 4 PRINCIPAL PROPERTIES...........................................13 | |||
4.1 DAV:alternate-URI-set...........................................13 | 4.1 DAV:alternate-URI-set........................................13 | |||
4.2 DAV:principal-URL............................................14 | ||||
4.3 DAV:group-membership.........................................14 | ||||
5 ACCESS CONTROL PROPERTIES.........................................13 | 5 ACCESS CONTROL PROPERTIES......................................14 | |||
5.1 DAV:owner.......................................................13 | 5.1 DAV:owner....................................................14 | |||
5.1.1 Example: Retrieving DAV:owner................................14 | 5.1.1 Example: Retrieving DAV:owner............................15 | |||
5.1.2 Example: An Attempt to Set DAV:owner.........................15 | 5.1.2 Example: An Attempt to Set DAV:owner.....................16 | |||
5.2 DAV:supported-privilege-set.....................................16 | 5.2 DAV:supported-privilege-set..................................17 | |||
5.2.1 Example: Retrieving a List of Privileges Supported on a | 5.2.1 Example: Retrieving a List of Privileges Supported on a | |||
Resource.....................................................16 | Resource.......................................................18 | |||
5.3 DAV:current-user-privilege-set..................................18 | 5.3 DAV:current-user-privilege-set...............................20 | |||
5.3.1 Example: Retrieving the User's Current Set of Assigned | 5.3.1 Example: Retrieving the User's Current Set of Assigned | |||
Privileges.........................................................19 | Privileges.....................................................21 | |||
5.4 DAV:acl.........................................................20 | 5.4 DAV:acl......................................................22 | |||
5.4.1 ACE Principal................................................20 | 5.4.1 ACE Principal............................................22 | |||
5.4.2 ACE Grant and Deny...........................................21 | 5.4.2 ACE Grant and Deny.......................................23 | |||
5.4.3 ACE Protection...............................................21 | 5.4.3 ACE Protection...........................................24 | |||
5.4.4 ACE Inheritance..............................................22 | 5.4.4 ACE Inheritance..........................................24 | |||
5.4.5 Example: Retrieving a Resource's Access Control List......22 | 5.4.5 Example: Retrieving a Resource's Access Control List.....24 | |||
5.5 DAV:acl-semantics...............................................23 | 5.5 DAV:inherited-acl............................................26 | |||
5.5.1 Example: Retrieving DAV:acl-semantics........................24 | 5.6 DAV:acl-semantics............................................26 | |||
5.6 DAV:principal-collection-set....................................25 | 5.6.1 Example: Retrieving DAV:acl-semantics....................26 | |||
5.6.1 Example: Retrieving DAV:principal-collection-set.............26 | 5.7 DAV:principal-collection-set.................................28 | |||
5.7 Example: PROPFIND to retrieve access control properties.........27 | 5.7.1 Example: Retrieving DAV:principal-collection-set.........29 | |||
5.8 Example: PROPFIND to retrieve access control properties......30 | ||||
6 ACL SEMANTICS.....................................................30 | ||||
6.1 ACE Combination.................................................31 | ||||
6.1.1 DAV:first-match ACE Combination..............................31 | ||||
6.1.2 DAV:all-grant-before-any-deny ACE Combination................31 | ||||
6.1.3 DAV:specific-deny-overrides-grant ACE Combination............31 | ||||
6.2 ACE Ordering....................................................31 | ||||
6.2.1 DAV:deny-before-grant ACE Ordering...........................32 | ||||
6.3 Allowed ACE.....................................................32 | ||||
6.3.1 DAV:principal-only-one-ace ACE Constraint....................32 | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 2] | Clemm, Hopkins, Sedlar, Whitehead [Page 2] | |||
6.3.2 DAV:grant-only ACE Constraint................................32 | 6 ACL SEMANTICS.................................................34 | |||
6.4 Required Principals.............................................32 | 6.1 ACE Combination.............................................34 | |||
6.1.1 DAV:first-match ACE Combination.........................34 | ||||
6.1.2 DAV:all-grant-before-any-deny ACE Combination...........34 | ||||
6.1.3 DAV:specific-deny-overrides-grant ACE Combination.......34 | ||||
6.2 ACE Ordering................................................35 | ||||
6.2.1 DAV:deny-before-grant ACE Ordering......................35 | ||||
6.3 Allowed ACE.................................................35 | ||||
6.3.1 DAV:principal-only-one-ace ACE Constraint...............35 | ||||
6.3.2 DAV:grant-only ACE Constraint...........................35 | ||||
6.3.3 DAV:no-invert ACE Constraint............................35 | ||||
6.3.4 DAV:no-acl-inherit ACE Constraint.......................36 | ||||
6.4 Required Principals.........................................36 | ||||
7 ACCESS CONTROL AND EXISTING METHODS...............................32 | 7 ACCESS CONTROL AND EXISTING METHODS...........................36 | |||
7.1 OPTIONS.........................................................33 | 7.1 OPTIONS.....................................................36 | |||
7.1.1 Example - OPTIONS............................................33 | 7.1.1 Example - OPTIONS.......................................36 | |||
7.2 MOVE............................................................33 | 7.2 MOVE........................................................37 | |||
7.3 COPY............................................................33 | 7.3 COPY........................................................37 | |||
7.4 DELETE..........................................................33 | 7.4 DELETE......................................................37 | |||
7.5 LOCK............................................................34 | 7.5 LOCK........................................................37 | |||
8 ACCESS CONTROL METHODS............................................34 | 8 ACCESS CONTROL METHODS........................................37 | |||
8.1 ACL.............................................................34 | 8.1 ACL.........................................................37 | |||
8.1.1 ACL Preconditions............................................34 | 8.1.1 ACL Preconditions.......................................38 | |||
8.1.2 Example: the ACL method......................................36 | 8.1.2 Example: the ACL method.................................40 | |||
8.1.3 Example: ACL method failure due to protected ACE conflict....37 | 8.1.3 Example: ACL method failure due to protected ACE conflict | |||
8.1.4 Example: ACL method failure due to an inherited ACE conflict 38 | .....41 | |||
8.1.4 Example: ACL method failure due to an inherited ACE conflict | ||||
.....42 | ||||
8.1.5 Example: ACL method failure due to an attempt to set grant | 8.1.5 Example: ACL method failure due to an attempt to set grant | |||
and deny in a single ACE.....................................39 | and deny in a single ACE......................................43 | |||
9 ACCESS CONTROL REPORTS............................................40 | 9 ACCESS CONTROL REPORTS........................................44 | |||
9.1 REPORT Method...................................................40 | 9.1 REPORT Method...............................................44 | |||
9.2 DAV:acl-principal-props Report..................................40 | 9.2 DAV:acl-principal-prop-set Report...........................44 | |||
9.2.1 Example: DAV:acl-principal-props Report......................40 | 9.2.1 Example: DAV:acl-principal-prop-set Report..............45 | |||
9.3 DAV:principal-match REPORT......................................42 | 9.3 DAV:principal-match REPORT..................................46 | |||
9.3.1 Example: DAV:principal-match REPORT..........................43 | 9.3.1 Example: DAV:principal-match REPORT.....................47 | |||
9.4 DAV:principal-property-search REPORT............................44 | 9.4 DAV:principal-property-search REPORT........................48 | |||
9.4.1 Matching.....................................................45 | 9.4.1 Matching................................................50 | |||
9.4.2 Example: successful DAV:principal-property-search REPORT.....46 | 9.4.2 Example: successful DAV:principal-property-search REPORT | |||
9.4.3 Example: Unsuccessful DAV:principal-property-search REPORT...48 | .....51 | |||
9.5 DAV:principal-search-property-set REPORT........................49 | 9.4.3 Example: Unsuccessful DAV:principal-property-search REPORT | |||
9.5.1 Example: DAV:principal-search-property-set REPORT............50 | .....53 | |||
9.5 DAV:principal-search-property-set REPORT....................54 | ||||
9.5.1 Example: DAV:principal-search-property-set REPORT.......55 | ||||
10 XML PROCESSING..................................................51 | 10 XML PROCESSING..............................................56 | |||
11 INTERNATIONALIZATION CONSIDERATIONS.............................51 | 11 INTERNATIONALIZATION CONSIDERATIONS.........................56 | |||
12 SECURITY CONSIDERATIONS.........................................52 | Clemm, Hopkins, Sedlar, Whitehead [Page 3] | |||
12.1 Increased Risk of Compromised Users...........................52 | 12 SECURITY CONSIDERATIONS......................................57 | |||
12.1 Increased Risk of Compromised Users.........................57 | ||||
12.2 Risks of the DAV:read-acl and DAV:current-user-privilege-set | 12.2 Risks of the DAV:read-acl and DAV:current-user-privilege-set | |||
Privileges....................................................52 | Privileges.......................................................57 | |||
12.3 No Foreknowledge of Initial ACL...............................53 | 12.3 No Foreknowledge of Initial ACL.............................58 | |||
13 AUTHENTICATION..................................................53 | ||||
14 IANA CONSIDERATIONS.............................................53 | ||||
15 INTELLECTUAL PROPERTY...........................................54 | ||||
16 ACKNOWLEDGEMENTS................................................54 | 13 AUTHENTICATION...............................................58 | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 3] | 14 IANA CONSIDERATIONS..........................................59 | |||
17 REFERENCES......................................................55 | 15 INTELLECTUAL PROPERTY........................................59 | |||
17.1 Normative References..........................................55 | ||||
17.2 Informational References......................................56 | ||||
18 AUTHORS' ADDRESSES..............................................56 | 16 ACKNOWLEDGEMENTS.............................................59 | |||
19 APPENDICIES.....................................................57 | 17 REFERENCES...................................................60 | |||
19.1 XML Document Type Definition..................................57 | 17.1 Normative References........................................60 | |||
17.2 Informational References....................................61 | ||||
20 NOTE TO RFC EDITOR..............................................59 | 18 AUTHORS' ADDRESSES...........................................61 | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 4] | 19 APPENDICES...................................................62 | |||
19.1 WebDAV XML Document Type Definition Addendum................62 | ||||
1 INTRODUCTION | 1 INTRODUCTION | |||
The goal of the WebDAV access control extensions is to provide an | The goal of the WebDAV access control extensions is to provide an | |||
interoperable mechanism for handling discretionary access control for | interoperable mechanism for handling discretionary access control | |||
content and metadata managed by WebDAV servers. WebDAV access | for content and metadata managed by WebDAV servers. WebDAV access | |||
control can be implemented on content repositories with security as | control can be implemented on content repositories with security as | |||
simple as that of a UNIX file system, as well as more sophisticated | simple as that of a UNIX file system, as well as more sophisticated | |||
models. The underlying principle of access control is that who you | models. The underlying principle of access control is that who you | |||
are determines what operations you can perform on a resource. The | are determines what operations you can perform on a resource. The | |||
"who you are" is defined by a "principal" identifier; users, client | "who you are" is defined by a "principal" identifier; users, client | |||
software, servers, and groups of the previous have principal | software, servers, and groups of the previous have principal | |||
identifiers. The "operations you can perform" is determined by a | identifiers. The "operations you can perform" are determined by a | |||
single "access control list" (ACL) associated with a resource. An | single "access control list" (ACL) associated with a resource. An | |||
ACL contains a set of "access control entries" (ACEs), where each ACE | ACL contains a set of "access control entries" (ACEs), where each | |||
specifies a principal and a set of privileges that are either granted | ACE specifies a principal and a set of privileges that are either | |||
or denied to that principal. When a principal submits an operation | granted or denied to that principal. When a principal submits an | |||
(such as an HTTP or WebDAV method) to a resource for execution, the | operation (such as an HTTP or WebDAV method) to a resource for | |||
server evaluates the ACEs in the ACL to determine if the principal | execution, the server evaluates the ACEs in the ACL to determine if | |||
has permission for that operation. | the principal has permission for that operation. | |||
Since every ACE contains the identifier of a principal, client | Since every ACE contains the identifier of a principal, client | |||
software operated by a human must provide a mechanism for selecting | software operated by a human must provide a mechanism for selecting | |||
this principal. This specification uses http(s) scheme URLs to | this principal. This specification uses http(s) scheme URLs to | |||
identify principals, which are represented as WebDAV-capable | identify principals, which are represented as WebDAV-capable | |||
resources. There is no guarantee that the URLs identifying principals | ||||
will be meaningful to a human. For example, | Clemm, Hopkins, Sedlar, Whitehead [Page 4] | |||
http://www.dav.org/u/256432 and http://www.dav.org/people/Greg.Stein | resources. There is no guarantee that the URLs identifying | |||
are both valid URLs that could be used to identify the same | principals will be meaningful to a human. For example, | |||
principal. To remedy this, every principal resource has the | http://www.dav.org/u/256432 and | |||
DAV:displayname property containing a human-readable name for the | http://www.dav.org/people/Greg.Stein are both valid URLs that could | |||
principal. | be used to identify the same principal. To remedy this, every | |||
principal resource has the DAV:displayname property containing a | ||||
human-readable name for the principal. | ||||
Since a principal can be identified by multiple URLs, it raises the | Since a principal can be identified by multiple URLs, it raises the | |||
problem of determining exactly which principal's operations are being | problem of determining exactly which principal's operations are | |||
described in a given ACE. It is impossible for a client to determine | being described in a given ACE. It is impossible for a client to | |||
that an ACE granting the read privilege to | determine that an ACE granting the read privilege to | |||
http://www.dav.org/people/Greg.Stein also affects the principal at | http://www.dav.org/people/Greg.Stein also affects the principal at | |||
http://www.dav.org/u/256432. That is, a client has no mechanism for | http://www.dav.org/u/256432. That is, a client has no mechanism for | |||
determining that two URLs identify the same principal resource. As a | determining that two URLs identify the same principal resource. As | |||
result, this specification requires clients to use just one of the | a result, this specification requires clients to use just one of | |||
many possible URLs for a principal when creating ACEs. A client can | the many possible URLs for a principal when creating ACEs. A client | |||
discover this URL by retrieving the DAV:principal-URL property | can discover which URL to use by retrieving the DAV:principal-URL | |||
(Section 4.2) from a principal resource. No matter which of the | property (Section 4.2) from a principal resource. No matter which | |||
principal's URLs is used with PROPFIND, the property always returns | of the principal's URLs is used with PROPFIND, the property always | |||
the same URL. | returns the same URL. | |||
Once a system has hundreds to thousands of principals, the problem | Once a system has hundreds to thousands of principals, the problem | |||
arises of how to allow a human operator of client software to select | arises of how to allow a human operator of client software to | |||
just one of these principals. One approach is to use broad collection | select just one of these principals. One approach is to use broad | |||
collection hierarchies to spread the principals over a large number | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 5] | of collections, yielding few principals per collection. An example | |||
hierarchies to spread the principals over a large number of | of this is a two level hierarchy with the first level containing 36 | |||
collections, yielding few principals per collection. An example of | ||||
this is a two level hierarchy with the first level containing 36 | ||||
collections (a-z, 0-9), and the second level being another 36, | collections (a-z, 0-9), and the second level being another 36, | |||
creating collections /a/a/, /a/b/, à, /a/z/, such that a principal | creating collections /a/a/, /a/b/, ..., /a/z/, such that a | |||
with last name "Stein" would appear at /s/t/Stein. In effect, this | principal with last name "Stein" would appear at /s/t/Stein. In | |||
pre-computes a common query, search on last name, and encodes it into | effect, this pre-computes a common query, search on last name, and | |||
a hierarchy. The drawback with this scheme is that it handles only a | encodes it into a hierarchy. The drawback with this scheme is that | |||
small set of predefined queries, and drilling down through the | it handles only a small set of predefined queries, and drilling | |||
collection hierarchy adds unnecessary steps (navigate down/up) when | down through the collection hierarchy adds unnecessary steps | |||
the user already knows the principal's name. While organizing | (navigate down/up) when the user already knows the principal's | |||
principal URLs into a hierarchy is a valid namespace organization, | name. While organizing principal URLs into a hierarchy is a valid | |||
users should not be forced to navigate this hierarchy to select a | namespace organization, users should not be forced to navigate this | |||
principal. | hierarchy to select a principal. | |||
This specification provides the capability to perform substring | This specification provides the capability to perform substring | |||
searches on a small set of properties on the resources representing | searches on a small set of properties on the resources representing | |||
principals. This permits searches based on last name, first name, | principals. This permits searches based on last name, first name, | |||
user name, job title, etc. Two separate searches are supported, via | user name, job title, etc. Two separate searches are supported, | |||
the REPORT method, one to search principal resources, the other to | both via the REPORT method, one to search principal resources, the | |||
determine which properties may be searched at all. | other to determine which properties may be searched at all. | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 5] | ||||
Once a principal has been identified in an ACE, a server evaluating | Once a principal has been identified in an ACE, a server evaluating | |||
that ACE must know the identity of the principal making a protocol | that ACE must know the identity of the principal making a protocol | |||
request, and must validate that that principal is who they claim to | request, and must validate that that principal is who they claim to | |||
be, a process known as authentication. This specification | be, a process known as authentication. This specification | |||
intentionally omits discussion of authentication, as the HTTP | intentionally omits discussion of authentication, as the HTTP | |||
protocol already has a number of authentication mechanisms [RFC2617]. | protocol already has a number of authentication mechanisms | |||
Some authentication mechanism (such as HTTP Digest Authentication, | [RFC2617]. Some authentication mechanism (such as HTTP Digest | |||
which all WebDAV compliant implementations are required to support) | Authentication, which all WebDAV compliant implementations are | |||
must be available to validate the identity of a principal. | required to support) must be available to validate the identity of | |||
a principal. | ||||
The following issues are out of scope for this document: | The following issues are out of scope for this document: | |||
* Access control that applies only to a particular property on a | * Access control that applies only to a particular property | |||
resource (excepting the access control properties DAV:acl and | on a resource (excepting the access control properties | |||
DAV:current-user-privilege-set), rather than the entire | DAV:acl and DAV:current-user-privilege-set), rather than | |||
resource, | the entire resource, | |||
* Role-based security (where a role can be seen as a dynamically | * Role-based security (where a role can be seen as a | |||
defined collection of principals), | dynamically defined group of principals), | |||
* Specification of the ways an ACL on a resource is initialized, | * Specification of the ways an ACL on a resource is | |||
initialized, | ||||
* Specification of an ACL that applies globally to all | * Specification of an ACL that applies globally to all | |||
resources, rather than to a particular resource. | resources, rather than to a particular resource. | |||
* Creation and maintenance of resources representing people or | * Creation and maintenance of resources representing people | |||
computational agents (principals), and groups of these. | or computational agents (principals), and groups of these. | |||
This specification is organized as follows. Section 1.1 defines key | This specification is organized as follows. Section 1.1 defines key | |||
concepts used throughout the specification, and is followed by a more | concepts used throughout the specification, and is followed by a | |||
more in-depth discussion of principals (Section 2), and privileges | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 6] | ||||
in-depth discussion of principals (Section 2), and privileges | ||||
(Section 3). Properties defined on principals are specified in | (Section 3). Properties defined on principals are specified in | |||
Section 4, and access control properties for content resources are | Section 4, and access control properties for content resources are | |||
specified in Section 5. The semantics of access control lists are | specified in Section 5. The semantics of access control lists are | |||
described in Section 6, including sections on ACE combination | described in Section 6, including sections on ACE combination | |||
(Section 6.1), ACE ordering (Section 6.2), and principals required to | (Section 6.1), ACE ordering (Section 6.2), and principals required | |||
be present in an ACE (Section 6.4). Client discovery of access | to be present in an ACE (Section 6.3.2). Client discovery of access | |||
control capability using OPTIONS is described in Section 7.1. | control capability using OPTIONS is described in Section 7.1. | |||
Interactions between access control functionality and existing HTTP | Interactions between access control functionality and existing HTTP | |||
and WebDAV methods are described in the remainder of Section 7. The | and WebDAV methods are described in the remainder of Section 7. The | |||
access control setting method, ACL, is specified in Section 8. Four | access control setting method, ACL, is specified in Section 8. Four | |||
reports that provide limited server-side searching capabilities are | reports that provide limited server-side searching capabilities are | |||
described in Section 9. A note on XML processing (Section 10), | described in Section 9. Sections on XML processing (Section 10), | |||
Internationalization considerations (Section 11), security | Internationalization considerations (Section 11), security | |||
considerations (Section 12), and a note on authentication (Section | considerations (Section 12), and authentication (Section 13) round | |||
13) round out the specification. An appendix (Section 19.1) provides | out the specification. An appendix (Section 19.1) provides an XML | |||
an XML Document Type Definition (DTD) for the XML elements defined in | ||||
the specification. | Clemm, Hopkins, Sedlar, Whitehead [Page 6] | |||
Document Type Definition (DTD) for the XML elements defined in the | ||||
specification. | ||||
1.1 Terms | 1.1 Terms | |||
This draft uses the terms defined in HTTP [RFC2616] and WebDAV | This draft uses the terms defined in HTTP [RFC2616] and WebDAV | |||
[RFC2518]. In addition, the following terms are defined: | [RFC2518]. In addition, the following terms are defined: | |||
principal | principal | |||
A "principal" is a distinct human or computational actor that | A "principal" is a distinct human or computational actor that | |||
initiates access to network resources. In this protocol, a | initiates access to network resources. In this protocol, a | |||
principal is an HTTP resource that represents such an actor. | principal is an HTTP resource that represents such an actor. | |||
principal collection | group | |||
A "group" is a principal that represents a set of other principals. | ||||
A "principal collection" is a group of principals, and is | ||||
represented in this protocol by a WebDAV collection containing HTTP | ||||
resources that represent principals, and principal collections. | ||||
privilege | privilege | |||
A "privilege" controls access to a particular set of HTTP | A "privilege" controls access to a particular set of HTTP | |||
operations on a resource. | operations on a resource. | |||
aggregate privilege | aggregate privilege | |||
An "aggregate privilege" is a privilege that contains a set of | An "aggregate privilege" is a privilege that contains a set of | |||
other privileges. | other privileges. | |||
abstract privilege | abstract privilege | |||
The modifier "abstract", when applied to a privilege, means the | The modifier "abstract", when applied to a privilege, means the | |||
privilege cannot be set in an access control element (ACE). | privilege cannot be set in an access control element (ACE). | |||
access control list (ACL) | access control list (ACL) | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 7] | ||||
An "ACL" is a list of access control elements that define access | An "ACL" is a list of access control elements that define access | |||
control to a particular resource. | control to a particular resource. | |||
access control element (ACE) | access control element (ACE) | |||
An "ACE" either grants or denies a particular set of (non-abstract) | An "ACE" either grants or denies a particular set of (non-abstract) | |||
privileges for a particular principal. | privileges for a particular principal. | |||
inherited ACE | inherited ACE | |||
An "inherited ACE" is an ACE that is dynamically shared from the | An "inherited ACE" is an ACE that is dynamically shared from the | |||
ACL of another resource. When a shared ACE changes on the primary | ACL of another resource. When a shared ACE changes on the primary | |||
resource, it is also changed on inheriting resources. | resource, it is also changed on inheriting resources. | |||
protected property | protected property | |||
A "protected property" is one whose value cannot be updated except | A "protected property" is one whose value cannot be updated except | |||
by a method explicitly defined as updating that specific property. | by a method explicitly defined as updating that specific property. | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 7] | ||||
In particular, a protected property cannot be updated with a | In particular, a protected property cannot be updated with a | |||
PROPPATCH request. | PROPPATCH request. | |||
1.2 Notational Conventions | 1.2 Notational Conventions | |||
The augmented BNF used by this document to describe protocol elements | The augmented BNF used by this document to describe protocol | |||
is described in Section 2.1 of [RFC2616]. Because this augmented BNF | elements is described in Section 2.1 of [RFC2616]. Because this | |||
uses the basic production rules provided in Section 2.2 of [RFC2616], | augmented BNF uses the basic production rules provided in Section | |||
those rules apply to this document as well. | 2.2 of [RFC2616], those rules apply to this document as well. | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in | |||
document are to be interpreted as described in [RFC2119]. | this document are to be interpreted as described in [RFC2119]. | |||
Definitions of XML elements in this document use XML element type | Definitions of XML elements in this document use XML element type | |||
declarations (as found in XML Document Type Declarations), described | declarations (as found in XML Document Type Declarations), | |||
in Section 3.2 of [REC-XML]. When an XML element type in the "DAV:" | described in Section 3.2 of [REC-XML]. When an XML element type in | |||
namespace is referenced in this document outside of the context of an | the "DAV:" namespace is referenced in this document outside of the | |||
XML fragment, the string "DAV:" will be prefixed to the element type. | context of an XML fragment, the string "DAV:" will be prefixed to | |||
the element type. | ||||
2 PRINCIPALS | 2 PRINCIPALS | |||
A principal is a network resource that represents a distinct human or | A principal is a network resource that represents a distinct human | |||
computational actor that initiates access to network resources. Users | or computational actor that initiates access to network resources. | |||
and groups are represented as principals in many implementations; | Users and groups are represented as principals in many | |||
other types of principals are also possible. A URI of any scheme MAY | implementations; other types of principals are also possible. A URI | |||
be used to identify a principal resource. However, servers | of any scheme MAY be used to identify a principal resource. | |||
implementing this specification MUST expose principal resources at an | However, servers implementing this specification MUST expose | |||
http(s) URL, which is a privileged scheme that points to resources | principal resources at an http(s) URL, which is a privileged scheme | |||
that have additional properties, as described in Section 4. So, a | that points to resources that have additional properties, as | |||
principal resource can have multiple URIs, one of which has to be an | described in Section 4. So, a principal resource can have multiple | |||
http(s) scheme URL. Although an implementation SHOULD support | URIs, one of which has to be an http(s) scheme URL. Although an | |||
implementation SHOULD support PROPFIND and MAY support PROPPATCH to | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 8] | access and modify information about a principal, it is not required | |||
PROPFIND and MAY support PROPPATCH to access and modify information | to do so. | |||
about a principal, it is not required to do so. | ||||
A principal resource may or may not be a collection. If a person or | A principal resource may be a group. A group is represented as a | |||
computational agent matches a principal resource that is contained by | WebDAV collection, where the members of the group are members of | |||
a collection principal, they also match the collection principal. | the WebDAV collection. If a person or computational agent matches | |||
This definition is recursive, and hence if a person or computational | a principal resource that is a member of a group, they also match | |||
agent matches a collection principal that is the child of another | the group. Membership in a group is recursive, so if a principal is | |||
collection principal, they also match the parent collection | a member of group GRPA, and GRPA is a member of group GRPB, then | |||
principal. Membership in a collection principal is also recursive, so | the principal is also a member of GRPB. | |||
a principal in a collection principal GRPA contained by collection | ||||
principal GRPB is a member of both GRPA and GRPB. Implementations not | ||||
supporting recursive membership in principal collections can return | ||||
an error if the client attempts to bind collection principals into | ||||
other collection principals. | ||||
Servers that support aggregation of principals (e.g. groups of users | Implementer's Note: It is possible for the collection that | |||
or other groups) MUST manifest them as collection principals. At | represents a group to have non-principals as collection members. | |||
minimum, principals and collection principals MUST support the | When enumerating the membership of a group, it is necessary to | |||
OPTIONS and PROPFIND methods. | ||||
Implementer's Note: Collection principals are first and foremost | Clemm, Hopkins, Sedlar, Whitehead [Page 8] | |||
WebDAV collections. Therefore they contain resources as members. | retrieve the DAV:resourcetype property of a collection member, | |||
Since there is no requirement that all members of a collection | and check it for the DAV:principal XML element (described in | |||
principal need be principals, it is possible for a collection | Section 4). If the DAV:principal XML element is not present, the | |||
principal to have non-principals as members. When enumerating the | resource is not a principal and may be ignored for the purposes | |||
principals-only membership of a collection principal, it is | of determining group membership. | |||
necessary to retrieve the DAV:resourcetype property and check it | ||||
for the DAV:principal XML element (described in Section 4). If the | ||||
DAV:principal XML element is not present, the resource is not a | ||||
principal and may be ignored for the purposes of determining the | ||||
principals-only membership of the collection principal. | ||||
For example, the collection principal /FOO/ has two members, Bar | For example, the collection /FOO/, representing a group, has two | |||
and Baz. Bar is a principal but Baz is not. Therefore when | members, Bar and Baz. Bar is a principal but Baz is not. | |||
determining which principals belong to the collection principal | Therefore when determining which principals belong to the group, | |||
/FOO/, a client would enumerate the membership using PROPFIND | a client would enumerate the membership using PROPFIND while | |||
while asking for the DAV:resourcetype property, and see that only | asking for the DAV:resourcetype property, and see that only Bar | |||
Bar has the DAV:principal XML element. Therefore, only Bar is the | has the DAV:principal XML element. Therefore, Bar is the only | |||
only principal that is a member of the collection principal /FOO/. | principal that is a member of the group represented by /FOO/. | |||
3 PRIVILEGES | 3 PRIVILEGES | |||
Ability to perform a given method on a resource SHOULD be controlled | Ability to perform a given method on a resource SHOULD be | |||
by one or more privileges. Authors of protocol extensions that | controlled by one or more privileges. Authors of protocol | |||
define new HTTP methods SHOULD specify which privileges (by defining | extensions that define new HTTP methods SHOULD specify which | |||
new privileges, or mapping to ones below) are required to perform the | privileges (by defining new privileges, or mapping to ones below) | |||
method. A principal with no privileges to a resource SHOULD be | are required to perform the method. A principal with no privileges | |||
denied any HTTP access to that resource, unless the principal matches | to a resource SHOULD be denied any HTTP access to that resource, | |||
unless the principal matches an ACE constructed using the DAV:all, | ||||
DAV:authenticated, or DAV:unauthenticated pseudo-principals (see | ||||
Section 5.4.1). | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 9] | Privileges may be containers of other privileges, in which case | |||
an ACE constructed using the DAV:all, DAV:authenticated, or | they are termed aggregate privileges. If a principal is granted or | |||
DAV:unauthenticated pseudo-principals (see Section 5.4.1). | denied an aggregate privilege, it is semantically equivalent to | |||
granting or denying each of the aggregated privileges individually. | ||||
For example, an implementation may define add-member and remove- | ||||
member privileges that control the ability to add and remove an | ||||
internal member of a group. Since these privileges control the | ||||
ability to update the state of a group, these privileges would be | ||||
aggregated by the DAV:write privilege on a group, and granting the | ||||
DAV:write privilege on a group would also grant the add-member and | ||||
remove-member privileges. | ||||
Privileges may be containers of other privileges, in which case they | Privileges may have the quality of being abstract, in which case | |||
are termed aggregate privileges. If a principal is granted or denied | they cannot be set in an ACE. Aggregate and non-aggregate | |||
an aggregate privilege, it is semantically equivalent to granting or | privileges are both capable of being abstract. Abstract privileges | |||
denying each of the aggregated privileges individually. For example, | are useful for modeling privileges that otherwise would not be | |||
an implementation may define add-member and remove-member privileges | exposed via the protocol. Abstract privileges also provide server | |||
that control the ability to add and remove an internal member of a | implementations with flexibility in implementing the privileges | |||
collection. Since these privileges control the ability to update the | defined in this specification. For example, if a server is | |||
state of a collection, these privileges would be aggregated by the | incapable of separating the read resource capability from the read | |||
DAV:write privilege on a collection, and granting the DAV:write | ACL capability, it can still model the DAV:read and DAV:read-acl | |||
privilege on a collection would also grant the add-member and remove- | privileges defined in this specification by declaring them | |||
member privileges. | ||||
Privileges may have the quality of being abstract, in which case they | Clemm, Hopkins, Sedlar, Whitehead [Page 9] | |||
cannot be set in an ACE. Aggregate and non-aggregate privileges are | abstract, and containing them within a non-abstract aggregate | |||
both capable of being abstract. Abstract privileges are useful for | privilege (say, read-all) that holds DAV:read, and DAV:read-acl. In | |||
modeling privileges that otherwise would not be exposed via the | this way, it is possible to set the aggregate privilege, read-all, | |||
protocol. Abstract privileges also provide server implementations | thus coupling the setting of DAV:read and DAV:read-acl, but it is | |||
with flexibility in implementing the privileges defined in this | not possible to set DAV:read, or DAV:read-acl individually. Since | |||
specification. For example, if a server is incapable of separating | aggregate privileges can be abstract, it is also possible to use | |||
the read resource capability from the read ACL capability, it can | abstract privileges to group or organize non-abstract privileges. | |||
still model the DAV:read and DAV:read-acl privileges defined in this | Privilege containment loops are not allowed, hence a privilege MUST | |||
specification by declaring them abstract, and containing them within | NOT contain itself. For example, DAV:read cannot contain DAV:read. | |||
a non-abstract aggregate privilege (say, read-all) that holds | ||||
DAV:read, and DAV:read-acl. In this way, it is possible to set the | ||||
aggregate privilege, read-all, thus coupling the setting of DAV:read | ||||
and DAV:read-acl, but it is not possible to set DAV:read, or | ||||
DAV:read-acl individually. Since aggregate privileges can be | ||||
abstract, it is also possible to use abstract privileges to group or | ||||
organize non-abstract privileges. Privilege containment loops are not | ||||
allowed, hence a privilege MUST NOT contain itself. For example, | ||||
DAV:read cannot contain DAV:read. | ||||
The set of privileges that apply to a particular resource may vary | The set of privileges that apply to a particular resource may vary | |||
with the DAV:resourcetype of the resource, as well as between | with the DAV:resourcetype of the resource, as well as between | |||
different server implementations. To promote interoperability, | different server implementations. To promote interoperability, | |||
however, this specification defines a set of well-known privileges | however, this specification defines a set of well-known privileges | |||
(e.g. DAV:read, DAV:write, DAV:read-acl, DAV:write-acl, DAV:read- | (e.g. DAV:read, DAV:write, DAV:read-acl, DAV:write-acl, DAV:read- | |||
current-user-privilege-set, and DAV:all), which can at least be used | current-user-privilege-set, and DAV:all), which can at least be | |||
to classify the other privileges defined on a particular resource. | used to classify the other privileges defined on a particular | |||
The access permissions on null resources (defined in [RFC2518], | resource. The access permissions on null resources (defined in | |||
Section 3) are solely those they inherit (if any), and they are not | [RFC2518], Section 3) are solely those they inherit (if any), and | |||
discoverable (i.e., the access control properties specified in | they are not discoverable (i.e., the access control properties | |||
Section 5 are not defined on null resources). On the transition from | specified in Section 5 are not defined on null resources). On the | |||
null to stateful resource, the initial access control list is set by | transition from null to stateful resource, the initial access | |||
the server's default ACL value policy (if any). | control list is set by the server's default ACL value policy (if | |||
any). | ||||
Server implementations MAY define new privileges beyond those defined | ||||
in this specification. Privileges defined by individual | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 10] | Server implementations MAY define new privileges beyond those | |||
defined in this specification. Privileges defined by individual | ||||
implementations MUST NOT use the DAV: namespace, and instead should | implementations MUST NOT use the DAV: namespace, and instead should | |||
use a namespace that they control, such as an http scheme URL. | use a namespace that they control, such as an http scheme URL. | |||
3.1 DAV:read Privilege | 3.1 DAV:read Privilege | |||
The read privilege controls methods that return information about the | The read privilege controls methods that return information about | |||
state of the resource, including the resource's properties. Affected | the state of the resource, including the resource's properties. | |||
methods include GET and PROPFIND. Additionally, the read privilege | Affected methods include GET and PROPFIND. Any implementation- | |||
MAY control the OPTIONS method. | defined privilege that also controls access to GET and PROPFIND | |||
must be aggregated under dav:readùif an ACL grants access to | ||||
dav:read, the client may expect that no other privilege needs to be | ||||
granted to have access to GET and PROPFIND. Additionally, the read | ||||
privilege MAY control the OPTIONS method. | ||||
<!ELEMENT read EMPTY> | <!ELEMENT read EMPTY> | |||
3.2 DAV:write Privilege | 3.2 DAV:write Privilege | |||
The write privilege controls methods that modify the content, dead | The write privilege controls methods that lock a resource or modify | |||
properties, or (in the case of a collection) membership of the | the content, dead properties, or (in the case of a collection) | |||
resource, such as PUT and PROPPATCH. Note that state modification is | membership of the resource, such as PUT and PROPPATCH. Note that | |||
also controlled via locking (see section 5.3 of [WEBDAV]), so | ||||
effective write access requires that both write privileges and write | Clemm, Hopkins, Sedlar, Whitehead [Page 10] | |||
locking requirements are satisfied. | state modification is also controlled via locking (see section 5.3 | |||
of [WEBDAV]), so effective write access requires that both write | ||||
privileges and write locking requirements are satisfied. Any | ||||
implementation-defined privilege that also controls access to | ||||
methods modifying content, dead properties or collection membership | ||||
must be aggregated under dav:write, e.g. if an ACL grants access to | ||||
dav:write, the client may expect that no other privilege needs to | ||||
be granted to have access to PUT and PROPPATCH. | ||||
<!ELEMENT write EMPTY> | <!ELEMENT write EMPTY> | |||
3.3 DAV:read-acl Privilege | 3.3 DAV:write-properties | |||
The DAV:write-properties privilege controls methods that modify the | ||||
dead properties of the resource, such as PROPPATCH. Whether this | ||||
privilege may be used to control access to any live properties is | ||||
determined by the implementation. Any implementation-defined | ||||
privilege that also controls access to methods modifying dead | ||||
properties must be aggregated under dav:write-propertiesùe.g. if an | ||||
ACL grants access to dav:write-properties, the client can safely | ||||
expect that no other privilege needs to be granted to have access | ||||
to PROPPATCH. | ||||
<!ELEMENT write-properties EMPTY> | ||||
3.4 DAV:write-content | ||||
The DAV:write-content privilege controls methods that modify the | ||||
content or (in the case of a collection) membership of the | ||||
resource, such as PUT and DELETE. Any implementation-defined | ||||
privilege that also controls access to content or alteration of | ||||
collection membership must be aggregated under dav:write-contentù | ||||
e.g. if an ACL grants access to dav:write-content, the client can | ||||
safely expect that no other privilege needs to be granted to have | ||||
access to PUT or DELETE. | ||||
<!ELEMENT write-content EMPTY> | ||||
3.5 DAV:unlock | ||||
The dav:unlock privilege controls the use of the UNLOCK method to | ||||
unlock a resource. (Note that while the set of users who may lock | ||||
a resource is most commonly the same set of users who may modify a | ||||
resource, servers may allow various kinds of administrators to | ||||
unlock resources locked by others.) Any privilege controlling | ||||
access to UNLOCK must be aggregated under dav:unlock. | ||||
<!ELEMENT unlock EMPTY> | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 11] | ||||
3.6 DAV:read-acl Privilege | ||||
The DAV:read-acl privilege controls the use of PROPFIND to retrieve | The DAV:read-acl privilege controls the use of PROPFIND to retrieve | |||
the DAV:acl property of the resource. | the DAV:acl property of the resource. | |||
<!ELEMENT read-acl EMPTY> | <!ELEMENT read-acl EMPTY> | |||
3.4 DAV:read-current-user-privilege-set Privilege | 3.7 DAV:read-current-user-privilege-set Privilege | |||
The DAV:read-current-user-privilege-set privilege controls the use of | The DAV:read-current-user-privilege-set privilege controls the use | |||
PROPFIND to retrieve the DAV:current-user-privilege-set property of | of PROPFIND to retrieve the DAV:current-user-privilege-set property | |||
the resource. | of the resource. | |||
Clients are intended to use this property to visually indicate in | Clients are intended to use this property to visually indicate in | |||
their UI items that are dependent on the permissions of a resource, | their UI items that are dependent on the permissions of a resource, | |||
for example, by graying out resources that are not writeable. | for example, by graying out resources that are not writeable. | |||
This privilege is separate from DAV:read-acl because there is a need | This privilege is separate from DAV:read-acl because there is a | |||
to allow most users access to the privileges permitted the current | need to allow most users access to the privileges permitted the | |||
user (due to its use in creating the UI), while the full ACL contains | current user (due to its use in creating the UI), while the full | |||
information that may not be appropriate for the current authenticated | ACL contains information that may not be appropriate for the | |||
user. As a result, the set of users who can view the full ACL is | current authenticated user. As a result, the set of users who can | |||
expected to be much smaller than those who can read the current user | view the full ACL is expected to be much smaller than those who can | |||
privilege set, and hence distinct privileges are needed for each. | read the current user privilege set, and hence distinct privileges | |||
are needed for each. | ||||
<!ELEMENT read-current-user-privilege-set EMPTY> | <!ELEMENT read-current-user-privilege-set EMPTY> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 11] | 3.8 DAV:write-acl Privilege | |||
3.5 DAV:write-acl Privilege | ||||
The DAV:write-acl privilege controls use of the ACL method to modify | The DAV:write-acl privilege controls use of the ACL method to | |||
the DAV:acl property of the resource. | modify the DAV:acl property of the resource. | |||
<!ELEMENT write-acl EMPTY> | <!ELEMENT write-acl EMPTY> | |||
3.6 DAV:all Privilege | 3.9 DAV:all Privilege | |||
DAV:all is an aggregate privilege that contains the entire set of | DAV:all is an aggregate privilege that contains the entire set of | |||
privileges that can be applied to the resource. | privileges that can be applied to the resource. | |||
<!ELEMENT all EMPTY> | <!ELEMENT all EMPTY> | |||
3.7 Aggregation of Predefined Privileges | 3.10Aggregation of Predefined Privileges | |||
Server implementations are free to aggregate the predefined | Server implementations are free to aggregate the predefined | |||
privileges (defined above in Sections 3.1-3.6) subject to the | privileges (defined above in Sections 3.1-3.9) subject to the | |||
following limitations: | following limitations: | |||
DAV:read-acl MUST NOT contain DAV:read, DAV:write, DAV:write-acl, or | Clemm, Hopkins, Sedlar, Whitehead [Page 12] | |||
DAV:read-current-user-privilege-set. | DAV:read-acl MUST NOT contain DAV:read, DAV:write, DAV:write-acl, | |||
DAV:write-properties, DAV:write-content, or DAV:read-current-user- | ||||
privilege-set. | ||||
DAV:write-acl MUST NOT contain DAV:write, DAV:read, DAV:read-acl, or | DAV:write-acl MUST NOT contain DAV:write, DAV:read, DAV:read-acl, | |||
DAV:read-current-user-privilege-set. | or DAV:read-current-user-privilege-set. | |||
DAV:read-current-user-privilege-set MUST NOT contain DAV:write, | DAV:read-current-user-privilege-set MUST NOT contain DAV:write, | |||
DAV:read, DAV:read-acl, or DAV:write-acl. | DAV:read, DAV:read-acl, or DAV:write-acl. | |||
DAV:write MUST NOT contain DAV:read, DAV:read-acl, or DAV:read- | DAV:write MUST NOT contain DAV:read, DAV:read-acl, or DAV:read- | |||
current-user-privilege-set. | current-user-privilege-set. | |||
DAV:read MUST NOT contain DAV:write, or DAV:write-acl. | DAV:read MUST NOT contain DAV:write, DAV:write-acl, DAV:write- | |||
properties, or DAV:write-content. | ||||
DAV:write MUST contain DAV:write-properties and DAV:write-content. | ||||
4 PRINCIPAL PROPERTIES | 4 PRINCIPAL PROPERTIES | |||
Principals are manifested to clients as a WebDAV resource, identified | Principals are manifested to clients as a WebDAV resource, | |||
by a URL. A principal MUST have a DAV:displayname property (defined | identified by a URL. A principal MUST have a DAV:displayname | |||
in Section 13.2 of [RFC2518]), and a DAV:resourcetype property | property (defined in Section 13.2 of [RFC2518]), and a | |||
(defined in Section 13.9 of [RFC2518]). Additionally, a principal | DAV:resourcetype property (defined in Section 13.9 of [RFC2518]). | |||
MUST report the DAV:principal empty XML element in the value of the | Additionally, a principal MUST report the DAV:principal empty XML | |||
DAV:resourcetype property in addition to all other reported elements. | element in the value of the DAV:resourcetype property in addition | |||
For example, a collection principal would report DAV:collection and | to all other reported elements. For example, a group would report | |||
DAV:principal elements. The element type declaration for | DAV:collection and DAV:principal elements. The element type | |||
DAV:principal is: | declaration for DAV:principal is: | |||
<!ELEMENT principal EMPTY> | <!ELEMENT principal EMPTY> | |||
This protocol defines the following additional property for a | This protocol defines the following additional property for a | |||
principal. Since it is expensive, for many servers, to retrieve | principal. Since it is expensive, for many servers, to retrieve | |||
access control information, the name and value of this property | access control information, the name and value of this property | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 12] | ||||
SHOULD NOT be returned by a PROPFIND allprop request (as defined in | SHOULD NOT be returned by a PROPFIND allprop request (as defined in | |||
Section 12.14.1 of [RFC2518]). | Section 12.14.1 of [RFC2518]). | |||
4.1 DAV:alternate-URI-set | 4.1 DAV:alternate-URI-set | |||
This protected property, if non-empty, contains the URIs of network | This protected property, if non-empty, contains the URIs of network | |||
resources with additional descriptive information about the | resources with additional descriptive information about the | |||
principal. This property identifies additional network resources | principal. This property identifies additional network resources | |||
(i.e., it contains one or more URIs) that may be consulted by a | (i.e., it contains one or more URIs) that may be consulted by a | |||
client to gain additional knowledge concerning a principal. One | client to gain additional knowledge concerning a principal. One | |||
expected use for this property is the storage of an ldap [RFC2255] | expected use for this property is the storage of an ldap [RFC2255] | |||
scheme URL. A user-agent encountering an ldap URL could use LDAP | scheme URL. A user-agent encountering an ldap URL could use LDAP | |||
[RFC2589] to retrieve additional machine-readable directory | [RFC2589] to retrieve additional machine-readable directory | |||
information about the principal, and display that information in its | information about the principal, and display that information in | |||
user interface. Support for this property is REQUIRED, and the value | ||||
is empty if no alternate URI exists for the principal. | Clemm, Hopkins, Sedlar, Whitehead [Page 13] | |||
its user interface. Support for this property is REQUIRED, and the | ||||
value is empty if no alternate URI exists for the principal. | ||||
<!ELEMENT alternate-URI-set (href*)> | <!ELEMENT alternate-URI-set (href*)> | |||
4.2 DAV:principal-URL | 4.2 DAV:principal-URL | |||
This protected property contains the URL that MUST be used to | A principal may have many URLs, but there must be one primary URL | |||
identify this principal in an ACL request. | that clients can use to uniquely identify a principalùthe | |||
principal-URL. This protected property contains the URL that MUST | ||||
be used to identify this principal in an ACL request. | ||||
<!ELEMENT principal-URL (href)> | <!ELEMENT principal-URL (href)> | |||
4.3 DAV:group-membership | ||||
This protected property identifies the groups in which the | ||||
principal is directly a member. Note that a server may allow a | ||||
group to be a member of another group, in which case the DAV:group- | ||||
membership of those other groups would need to be queried in order | ||||
to determine the groups in which the principal is indirectly a | ||||
member. | ||||
<!ELEMENT group-membership (href*)> | ||||
5 ACCESS CONTROL PROPERTIES | 5 ACCESS CONTROL PROPERTIES | |||
This specification defines a number of new properties for WebDAV | This specification defines a number of new properties for WebDAV | |||
resources. Access control properties may be retrieved just like | resources. Access control properties may be retrieved just like | |||
other WebDAV properties, using the PROPFIND method. Since it is | other WebDAV properties, using the PROPFIND method. Since it is | |||
expensive, for many servers, to retrieve access control information, | expensive, for many servers, to retrieve access control | |||
a PROPFIND allprop request (as defined in Section 12.14.1 of | information, a PROPFIND allprop request (as defined in Section | |||
[RFC2518]) SHOULD NOT return the names and values of the properties | 12.14.1 of [RFC2518]) SHOULD NOT return the names and values of the | |||
defined in this section. | properties defined in this section. | |||
HTTP resources that support the WebDAV Access Control Protocol MUST | HTTP resources that support the WebDAV Access Control Protocol MUST | |||
contain the following properties. Null resources (described in | contain the following properties. Null resources (described in | |||
Section 3 of [RFC2518]) MUST NOT contain the following properties: | Section 3 of [RFC2518]) MUST NOT contain the following properties: | |||
5.1 DAV:owner | 5.1 DAV:owner | |||
This protected property identifies a particular principal as being | This protected property identifies a particular principal as being | |||
the "owner" of the resource. Since the owner of a resource often has | the "owner" of the resource. Since the owner of a resource often | |||
special access control capabilities (e.g., the owner frequently has | has special access control capabilities (e.g., the owner frequently | |||
permanent DAV:write-acl privilege), clients might display the | has permanent DAV:write-acl privilege), clients might display the | |||
resource owner in their user interface. | resource owner in their user interface. | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 14] | ||||
<!ELEMENT owner (href)> | <!ELEMENT owner (href)> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 13] | ||||
5.1.1 Example: Retrieving DAV:owner | 5.1.1 Example: Retrieving DAV:owner | |||
This example shows a client request for the value of the DAV:owner | This example shows a client request for the value of the DAV:owner | |||
property from a collection resource with URL | property from a collection resource with URL | |||
http://www.webdav.org/papers/. The principal making the request is | http://www.webdav.org/papers/. The principal making the request is | |||
authenticated using Digest authentication. The value of DAV:owner is | authenticated using Digest authentication. The value of DAV:owner | |||
the URL http://www.webdav.org/_acl/users/gstein, wrapped in the | is the URL http://www.webdav.org/_acl/users/gstein, wrapped in the | |||
DAV:href XML element. | DAV:href XML element. | |||
>> Request << | >> Request << | |||
PROPFIND /papers/ HTTP/1.1 | PROPFIND /papers/ HTTP/1.1 | |||
Host: www.webdav.org | Host: www.webdav.org | |||
Content-type: text/xml; charset="utf-8" | Content-type: text/xml; charset="utf-8" | |||
Content-Length: xxx | Content-Length: xxx | |||
Depth: 0 | Depth: 0 | |||
Authorization: Digest username="jim", | Authorization: Digest username="jim", | |||
skipping to change at line 683 | skipping to change at line 734 | |||
<D:response> | <D:response> | |||
<D:href>http://www.webdav.org/papers/</D:href> | <D:href>http://www.webdav.org/papers/</D:href> | |||
<D:propstat> | <D:propstat> | |||
<D:prop> | <D:prop> | |||
<D:owner> | <D:owner> | |||
<D:href>http://www.webdav.org/_acl/users/gstein</D:href> | <D:href>http://www.webdav.org/_acl/users/gstein</D:href> | |||
</D:owner> | </D:owner> | |||
</D:prop> | </D:prop> | |||
<D:status>HTTP/1.1 200 OK</D:status> | <D:status>HTTP/1.1 200 OK</D:status> | |||
</D:propstat> | </D:propstat> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 15] | ||||
</D:response> | </D:response> | |||
</D:multistatus> | </D:multistatus> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 14] | ||||
5.1.2 Example: An Attempt to Set DAV:owner | 5.1.2 Example: An Attempt to Set DAV:owner | |||
The following example shows a client request to modify the value of | The following example shows a client request to modify the value of | |||
the DAV:owner property on the resource with URL | the DAV:owner property on the resource with URL | |||
http://www.webdav.org/papers/. Since DAV:owner is a protected | <http://www.webdav.org/papers>. Since DAV:owner is a protected | |||
property, the server responds with a 207 (Multi-Status) response that | property, the server responds with a 207 (Multi-Status) response | |||
contains a 403 (Forbidden) status code for the act of setting | that contains a 403 (Forbidden) status code for the act of setting | |||
DAV:owner. Section 8.2.1 of [RFC2518] describes PROPPATCH status code | DAV:owner. Section 8.2.1 of [RFC2518] describes PROPPATCH status | |||
information, and Section 11 of [RFC2518] describes the Multi-Status | code information, and Section 11 of [RFC2518] describes the Multi- | |||
response. | Status response. | |||
>> Request << | >> Request << | |||
PROPPATCH /papers/ HTTP/1.1 | PROPPATCH /papers/ HTTP/1.1 | |||
Host: www.webdav.org | Host: www.webdav.org | |||
Content-type: text/xml; charset="utf-8" | Content-type: text/xml; charset="utf-8" | |||
Content-Length: xxx | Content-Length: xxx | |||
Depth: 0 | Depth: 0 | |||
Authorization: Digest username="jim", | Authorization: Digest username="jim", | |||
realm="jim@webdav.org", nonce="...", | realm="jim@webdav.org", nonce="...", | |||
skipping to change at line 731 | skipping to change at line 783 | |||
>> Response << | >> Response << | |||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Content-Length: xxx | Content-Length: xxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:multistatus xmlns:D="DAV:"> | <D:multistatus xmlns:D="DAV:"> | |||
<D:response> | <D:response> | |||
<D:href>http://www.webdav.org/papers/</D:href> | <D:href>http://www.webdav.org/papers/</D:href> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 16] | ||||
<D:propstat> | <D:propstat> | |||
<D:prop><D:owner/></D:prop> | <D:prop><D:owner/></D:prop> | |||
<D:status>HTTP/1.1 403 Forbidden</D:status> | <D:status>HTTP/1.1 403 Forbidden</D:status> | |||
<D:responsedescription>Failure to set protected property | <D:responsedescription> | |||
(DAV:owner) | Failure to set protected property (DAV:owner) | |||
</D:responsedescription> | </D:responsedescription> | |||
</D:propstat> | </D:propstat> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 15] | ||||
</D:response> | </D:response> | |||
</D:multistatus> | </D:multistatus> | |||
5.2 DAV:supported-privilege-set | 5.2 DAV:supported-privilege-set | |||
This is a protected property that identifies the privileges defined | This is a protected property that identifies the privileges | |||
for the resource. | defined for the resource. | |||
<!ELEMENT supported-privilege-set (supported-privilege*)> | <!ELEMENT supported-privilege-set (supported-privilege*)> | |||
Each privilege appears as an XML element, where aggregate | Each privilege appears as an XML element, where aggregate | |||
privileges list as sub-elements all of the privileges that they | privileges list as sub-elements all of the privileges that they | |||
aggregate. | aggregate. | |||
<!ELEMENT supported-privilege (privilege, abstract?, description, | <!ELEMENT supported-privilege | |||
supported-privilege*)> | (privilege, abstract?, description, supported-privilege*)> | |||
<!ELEMENT privilege ANY> | <!ELEMENT privilege ANY> | |||
An abstract privilege MUST NOT be used in an ACE for that resource. | An abstract privilege MUST NOT be used in an ACE for that resource. | |||
Servers MUST fail an attempt to set an abstract privilege. | Servers MUST fail an attempt to set an abstract privilege. | |||
<!ELEMENT abstract EMPTY> | <!ELEMENT abstract EMPTY> | |||
A description is a human-readable description of what this privilege | A description is a human-readable description of what this | |||
controls access to. Servers MUST indicate the human language of the | privilege controls access to. Servers MUST indicate the human | |||
description using the xml:lang attribute and SHOULD consider the HTTP | language of the description using the xml:lang attribute and SHOULD | |||
Accept-Language request header when selecting one of multiple | consider the HTTP Accept-Language request header when selecting one | |||
available languages. | of multiple available languages. | |||
<!ELEMENT description #PCDATA> | <!ELEMENT description #PCDATA> | |||
It is envisioned that a WebDAV ACL-aware administrative client would | It is envisioned that a WebDAV ACL-aware administrative client | |||
list the supported privileges in a dialog box, and allow the user to | would list the supported privileges in a dialog box, and allow the | |||
choose non-abstract privileges to apply in an ACE. The privileges | user to choose non-abstract privileges to apply in an ACE. The | |||
tree is useful programmatically to map well-known privileges (defined | privileges tree is useful programmatically to map well-known | |||
by WebDAV or other standards groups) into privileges that are | privileges (defined by WebDAV or other standards groups) into | |||
supported by any particular server implementation. The privilege | privileges that are supported by any particular server | |||
tree also serves to hide complexity in implementations allowing large | implementation. The privilege tree also serves to hide complexity | |||
number of privileges to be defined by displaying aggregates to the | in implementations allowing large number of privileges to be | |||
user. | defined by displaying aggregates to the user. | |||
5.2.1 Example: Retrieving a List of Privileges Supported on a Resource | Clemm, Hopkins, Sedlar, Whitehead [Page 17] | |||
5.2.1 Example: Retrieving a List of Privileges Supported on a | ||||
Resource | ||||
This example shows a client request for the DAV:supported-privilege- | This example shows a client request for the DAV:supported- | |||
set property on the resource http://www.webdav.org/papers/. The value | privilege-set property on the resource | |||
of the DAV:supported-privilege-set property is a tree of supported | http://www.webdav.org/papers/. The value of the DAV:supported- | |||
privileges: | privilege-set property is a tree of supported privileges (using | |||
"[XML Namespace , localname]" to identify each privilege): | ||||
DAV:all (aggregate, abstract) | [DAV:, all] (aggregate, abstract) | |||
| | | | |||
+-- DAV:read (aggregate) | +-- [DAV:, read] (aggregate) | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 16] | ||||
| | | | |||
+-- DAV:read-acl (abstract) | +-- [DAV:, read-acl] (abstract) | |||
+-- DAV:read-current-user-privilege-set (abstract) | +-- [DAV:, read-current-user-privilege-set] | |||
+-- DAV:write (aggregate) | (abstract) | |||
| | | | |||
+-- DAV:write-acl (abstract) | +-- [DAV:, write] (aggregate) | |||
| | ||||
+-- [DAV:, write-acl] (abstract) | ||||
+-- [DAV:, write-properties] | ||||
+-- [DAV:, write-content] | ||||
| | ||||
+-- [DAV:, unlock] | ||||
This privilege tree is not normative, and many possible privilege | This privilege tree is not normative (except that it reflects the | |||
trees are possible. | normative aggregation rules given in Section 3.10), and many | |||
possible privilege trees are possible. | ||||
>> Request << | >> Request << | |||
PROPFIND /papers/ HTTP/1.1 | PROPFIND /papers/ HTTP/1.1 | |||
Host: www.webdav.org | Host: www.webdav.org | |||
Content-type: text/xml; charset="utf-8" | Content-type: text/xml; charset="utf-8" | |||
Content-Length: xxx | Content-Length: xxx | |||
Depth: 0 | Depth: 0 | |||
Authorization: Digest username="gclemm", | Authorization: Digest username="gclemm", | |||
realm="gclemm@webdav.org", nonce="...", | realm="gclemm@webdav.org", nonce="...", | |||
uri="/papers/", response="...", opaque="..." | uri="/papers/", response="...", opaque="..." | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:propfind xmlns:D="DAV:"> | <D:propfind xmlns:D="DAV:"> | |||
<D:prop> | <D:prop> | |||
<D:supported-privilege-set/> | <D:supported-privilege-set/> | |||
</D:prop> | </D:prop> | |||
</D:propfind> | </D:propfind> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 18] | ||||
>> Response << | >> Response << | |||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Content-Length: xxx | Content-Length: xxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:multistatus xmlns:D="DAV:"> | <D:multistatus xmlns:D="DAV:"> | |||
<D:response> | <D:response> | |||
<D:href>http://www.webdav.org/papers/</D:href> | <D:href>http://www.webdav.org/papers/</D:href> | |||
<D:propstat> | <D:propstat> | |||
<D:prop> | <D:prop> | |||
<D:supported-privilege-set> | <D:supported-privilege-set> | |||
<D:supported-privilege> | <D:supported-privilege> | |||
<D:privilege> <D:all/> </D:privilege> | <D:privilege> <D:all/> </D:privilege> | |||
<D:abstract/> | <D:abstract/> | |||
<D:description xml:lang="en">Any | <D:description xml:lang="en">Any | |||
operation</D:description> | operation</D:description> | |||
<D:supported-privilege> | <D:supported-privilege> | |||
<D:privilege> <D:read/> </D:privilege> | <D:privilege> <D:read/> </D:privilege> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 17] | ||||
<D:description xml:lang="en">Read any | <D:description xml:lang="en">Read any | |||
object</D:description> | object</D:description> | |||
<D:supported-privilege> | <D:supported-privilege> | |||
<D:privilege> <D:read-acl/> </D:privilege> | <D:privilege> <D:read-acl/> </D:privilege> | |||
<D:abstract/> | <D:abstract/> | |||
<D:description xml:lang="en">Read | <D:description xml:lang="en">Read | |||
ACL</D:description> | ACL</D:description> | |||
</D:supported-privilege> | </D:supported-privilege> | |||
</D:supported-privilege> | ||||
<D:supported-privilege> | <D:supported-privilege> | |||
<D:privilege> | <D:privilege> | |||
<D:read-current-user-privilege-set/> | <D:read-current-user-privilege-set/> | |||
</D:privilege> | </D:privilege> | |||
<D:abstract/> | <D:abstract/> | |||
<D:description xml:lang="en">Read current user | <D:description xml:lang="en">Read current user | |||
privilege set property</D:description> | privilege set property</D:description> | |||
</D:supported-privilege> | </D:supported-privilege> | |||
</D:supported-privilege> | ||||
<D:supported-privilege> | <D:supported-privilege> | |||
<D:privilege> <D:write/> </D:privilege> | <D:privilege> <D:write/> </D:privilege> | |||
<D:description xml:lang="en">Write any | <D:description xml:lang="en">Write any | |||
object</D:description> | object</D:description> | |||
<D:supported-privilege> | <D:supported-privilege> | |||
<D:privilege> <D:write-acl/> </D:privilege> | <D:privilege> <D:write-acl/> </D:privilege> | |||
<D:description xml:lang="en">Write | <D:description xml:lang="en">Write | |||
ACL</D:description> | ACL</D:description> | |||
<D:abstract/> | <D:abstract/> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 19] | ||||
</D:supported-privilege> | </D:supported-privilege> | |||
<D:supported-privilege> | ||||
<D:privilege> <D:write-properties/> | ||||
</D:privilege> | ||||
<D:description xml:lang="en">Write | ||||
properties</D:description> | ||||
</D:supported-privilege> | ||||
<D:supported-privilege> | ||||
<D:privilege> <D:write-content/> </D:privilege> | ||||
<D:description xml:lang="en">Write resource | ||||
content</D:description> | ||||
</D:supported-privilege> | ||||
</D:supported-privilege> | ||||
<D:supported-privilege> | ||||
<D:privilege> <D:unlock/> </D:privilege> | ||||
<D:description xml:lang="en">Unlock | ||||
resource</D:description> | ||||
</D:supported-privilege> | </D:supported-privilege> | |||
</D:supported-privilege> | </D:supported-privilege> | |||
</D:supported-privilege-set> | </D:supported-privilege-set> | |||
</D:prop> | </D:prop> | |||
<D:status>HTTP/1.1 200 OK</D:status> | <D:status>HTTP/1.1 200 OK</D:status> | |||
</D:propstat> | </D:propstat> | |||
</D:response> | </D:response> | |||
</D:multistatus> | </D:multistatus> | |||
5.3 DAV:current-user-privilege-set | 5.3 DAV:current-user-privilege-set | |||
DAV:current-user-privilege-set is a protected property containing the | DAV:current-user-privilege-set is a protected property containing | |||
exact set of privileges (as computed by the server) granted to the | the exact set of privileges (as computed by the server) granted to | |||
currently authenticated HTTP user. Aggregate privileges and their | the currently authenticated HTTP user. Aggregate privileges and | |||
contained privileges are listed. A user-agent can use the value of | their contained privileges are listed. A user-agent can use the | |||
this property to adjust its user interface to make actions | value of this property to adjust its user interface to make actions | |||
inaccessible (e.g., by graying out a menu item or button) for which | inaccessible (e.g., by graying out a menu item or button) for which | |||
the current principal does not have permission. This is particularly | the current principal does not have permission. This is | |||
useful for an access control user interface, which can be constructed | particularly useful for an access control user interface, which can | |||
without knowing the ACE combining semantics of the server. This | be constructed without knowing the ACE combining semantics of the | |||
property is also useful for determining what operations the current | server. This property is also useful for determining what | |||
principal can perform, without having to actually execute an | operations the current principal can perform, without having to | |||
operation. | actually execute an operation. | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 18] | ||||
<!ELEMENT current-user-privilege-set (privilege*)> | <!ELEMENT current-user-privilege-set (privilege*)> | |||
<!ELEMENT privilege ANY> | <!ELEMENT privilege ANY> | |||
If the current user is granted a specific privilege, that privilege | If the current user is granted a specific privilege, that privilege | |||
must belong to the set of privileges that may be set on this | must belong to the set of privileges that may be set on this | |||
resource. Therefore, each element in the DAV:current-user-privilege- | resource. Therefore, each element in the DAV:current-user- | |||
set property MUST identify a non-abstract privilege from the | ||||
DAV:supported-privilege-set property. | ||||
5.3.1 Example: Retrieving the UserÆs Current Set of Assigned Privileges | Clemm, Hopkins, Sedlar, Whitehead [Page 20] | |||
privilege-set property MUST identify a non-abstract privilege from | ||||
the DAV:supported-privilege-set property. | ||||
5.3.1 Example: Retrieving the User's Current Set of Assigned | ||||
Privileges | ||||
Continuing the example from Section 5.2.1, this example shows a | Continuing the example from Section 5.2.1, this example shows a | |||
client requesting the DAV:current-user-privilege-set property from | client requesting the DAV:current-user-privilege-set property from | |||
the resource with URL http://www.webdav.org/papers/. The username of | the resource with URL http://www.webdav.org/papers/. The username | |||
the principal making the request is ôkhare", and Digest | of the principal making the request is "khare", and Digest | |||
authentication is used in the request. The principal with username | authentication is used in the request. The principal with username | |||
ôkhare" has been granted the DAV:read privilege. Since the DAV:read | "khare" has been granted the DAV:read privilege. Since the DAV:read | |||
privilege contains the DAV:read-acl and DAV:read-current-user- | privilege contains the DAV:read-acl and DAV:read-current-user- | |||
privilege-set privileges (see Section 5.2.1), the principal with | privilege-set privileges (see Section 5.2.1), the principal with | |||
username ôkhare" can read the ACL property, and the DAV:current-user- | username "khare" can read the ACL property, and the DAV:current- | |||
privilege-set property. However, the DAV:all, DAV:read-acl, | user-privilege-set property. However, the DAV:all, DAV:read-acl, | |||
DAV:write-acl and DAV:read-current-user-privilege-set privileges are | DAV:write-acl and DAV:read-current-user-privilege-set privileges | |||
not listed in the value of DAV:current-user-privilege-set, since (for | are not listed in the value of DAV:current-user-privilege-set, | |||
this example) they are abstract privileges. DAV:write is not listed | since (for this example) they are abstract privileges. DAV:write is | |||
since the principal with username ôkhare" is not listed in an ACE | not listed since the principal with username "khare" is not listed | |||
granting that principal write permission. | in an ACE granting that principal write permission. | |||
>> Request << | >> Request << | |||
PROPFIND /papers/ HTTP/1.1 | PROPFIND /papers/ HTTP/1.1 | |||
Host: www.webdav.org | Host: www.webdav.org | |||
Content-type: text/xml; charset="utf-8" | Content-type: text/xml; charset="utf-8" | |||
Content-Length: xxx | Content-Length: xxx | |||
Depth: 0 | Depth: 0 | |||
Authorization: Digest username="khare", | Authorization: Digest username="khare", | |||
realm="khare@webdav.org", nonce="...", | realm="khare@webdav.org", nonce="...", | |||
skipping to change at line 944 | skipping to change at line 1023 | |||
<D:current-user-privilege-set/> | <D:current-user-privilege-set/> | |||
</D:prop> | </D:prop> | |||
</D:propfind> | </D:propfind> | |||
>> Response << | >> Response << | |||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Content-Length: xxx | Content-Length: xxx | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 19] | ||||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 21] | ||||
<D:multistatus xmlns:D="DAV:"> | <D:multistatus xmlns:D="DAV:"> | |||
<D:response> | <D:response> | |||
<D:href>http://www.webdav.org/papers/</D:href> | <D:href>http://www.webdav.org/papers/</D:href> | |||
<D:propstat> | <D:propstat> | |||
<D:prop> | <D:prop> | |||
<D:current-user-privilege-set> | <D:current-user-privilege-set> | |||
<D:privilege> <D:read/> </D:privilege> | <D:privilege> <D:read/> </D:privilege> | |||
</D:current-user-privilege-set> | </D:current-user-privilege-set> | |||
</D:prop> | </D:prop> | |||
<D:status>HTTP/1.1 200 OK</D:status> | <D:status>HTTP/1.1 200 OK</D:status> | |||
</D:propstat> | </D:propstat> | |||
</D:response> | </D:response> | |||
</D:multistatus> | </D:multistatus> | |||
5.4 DAV:acl | 5.4 DAV:acl | |||
This is a protected property that specifies the list of access | This is a protected property that specifies the list of access | |||
control entries (ACEs), which define what principals are to get what | control entries (ACEs), which define what principals are to get | |||
privileges for this resource. | what privileges for this resource. | |||
<!ELEMENT acl (ace*)> | <!ELEMENT acl (ace | inherited-acl)* > | |||
Each DAV:ace element specifies the set of privileges to be either | Each DAV:ace element specifies the set of privileges to be either | |||
granted or denied to a single principal. If the DAV:acl property is | granted or denied to a single principal. If the DAV:acl property | |||
empty, no principal is granted any privilege. | is empty, no principal is granted any privilege. | |||
<!ELEMENT ace (principal, (grant|deny), protected?, inherited?)> | <!ELEMENT ace (invert | principal, (grant|deny), protected?, | |||
inherited?)> | ||||
5.4.1 ACE Principal | 5.4.1 ACE Principal | |||
The DAV:principal element identifies the principal to which this ACE | The DAV:principal element identifies the principal to which this | |||
applies. | ACE applies. | |||
<!ELEMENT principal ((href) | <!ELEMENT principal ((href) | |||
| all | authenticated | unauthenticated | | all | authenticated | unauthenticated | |||
| property | self)> | | property | self)> | |||
The current user matches DAV:href only if that user is authenticated | The current user matches DAV:href only if that user is | |||
as being (or being a member of) the principal identified by the URL | authenticated as being (or being a member of) the principal | |||
contained by that DAV:href. | identified by the URL contained by that DAV:href. | |||
The current user always matches DAV:all. | The current user always matches DAV:all. | |||
<!ELEMENT all EMPTY> | <!ELEMENT all EMPTY> | |||
The current user matches DAV:authenticated only if authenticated. | The current user matches DAV:authenticated only if authenticated. | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 22] | ||||
<!ELEMENT authenticated EMPTY> | <!ELEMENT authenticated EMPTY> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 20] | ||||
The current user matches DAV:unauthenticated only if not | The current user matches DAV:unauthenticated only if not | |||
authenticated. | authenticated. | |||
<!ELEMENT unauthenticated EMPTY> | <!ELEMENT unauthenticated EMPTY> | |||
DAV:all is the union of DAV:authenticated, and DAV:unauthenticated. | DAV:all is the union of DAV:authenticated, and DAV:unauthenticated. | |||
For a given request, the user matches either DAV:authenticated, or | For a given request, the user matches either DAV:authenticated, or | |||
DAV:unauthenticated, but not both (that is, DAV:authenticated and | DAV:unauthenticated, but not both (that is, DAV:authenticated and | |||
DAV:unauthenticated are disjoint sets). | DAV:unauthenticated are disjoint sets). | |||
The current user matches a DAV:property principal in a DAV:acl | The current user matches a DAV:property principal in a DAV:acl | |||
property of a resource only if the value of the identified property | property of a resource only if the value of the identified property | |||
of that resource contains at most one DAV:href XML element, the URI | of that resource contains at most one DAV:href XML element, the URI | |||
value of DAV:href identifies a principal, and the current user is | value of DAV:href identifies a principal, and the current user is | |||
authenticated as being (or being a member of) that principal. For | authenticated as being (or being a member of) that principal. For | |||
example, if the DAV:property element contained <DAV:owner/>, the | example, if the DAV:property element contained <DAV:owner/>, the | |||
current user would match the DAV:property principal only if the | current user would match the DAV:property principal only if the | |||
current user is authenticated as matching the principal identified by | current user is authenticated as matching the principal identified | |||
the DAV:owner property of the resource. | by the DAV:owner property of the resource. | |||
<!ELEMENT property ANY> | <!ELEMENT property ANY> | |||
Alternately, some servers may support ACEs applying to those users | ||||
NOT matching the current principal, e.g. all users not in a | ||||
particular group. This can be done by wrapping the dav:principal | ||||
element with dav:invert. | ||||
<!ELEMENT invert principal> | ||||
The current user matches DAV:self in a DAV:acl property of the | The current user matches DAV:self in a DAV:acl property of the | |||
resource only if that resource is a principal object and the current | resource only if that resource is a principal and that principal | |||
user is authenticated as being that principal or a member of that | matches the current user or, if the principal is a group, a member | |||
principal collection. | of that group matches the current user. | |||
<!ELEMENT self EMPTY> | <!ELEMENT self EMPTY> | |||
5.4.2 ACE Grant and Deny | 5.4.2 ACE Grant and Deny | |||
Each DAV:grant or DAV:deny element specifies the set of privileges to | Each DAV:grant or DAV:deny element specifies the set of privileges | |||
be either granted or denied to the specified principal. A DAV:grant | to be either granted or denied to the specified principal. A | |||
or DAV:deny element of the DAV:acl of a resource MUST only contain | DAV:grant or DAV:deny element of the DAV:acl of a resource MUST | |||
non-abstract elements specified in the DAV:supported-privilege-set of | only contain non-abstract elements specified in the DAV:supported- | |||
that resource. | privilege-set of that resource. | |||
<!ELEMENT grant (privilege+)> | <!ELEMENT grant (privilege+)> | |||
<!ELEMENT deny (privilege+)> | <!ELEMENT deny (privilege+)> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 23] | ||||
<!ELEMENT privilege ANY> | <!ELEMENT privilege ANY> | |||
5.4.3 ACE Protection | 5.4.3 ACE Protection | |||
A server indicates an ACE is protected by including the DAV:protected | A server indicates an ACE is protected by including the | |||
element in the ACE. If the ACL of a resource contains an ACE with a | DAV:protected element in the ACE. If the ACL of a resource contains | |||
DAV:protected element, an attempt to remove that ACE from the ACL | an ACE with a DAV:protected element, an attempt to remove that ACE | |||
MUST fail.. | from the ACL MUST fail. | |||
<!ELEMENT protected EMPTY> | <!ELEMENT protected EMPTY> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 21] | ||||
5.4.4 ACE Inheritance | 5.4.4 ACE Inheritance | |||
The presence of a DAV:inherited element indicates that this ACE is | The presence of a DAV:inherited element indicates that this ACE is | |||
inherited from another resource that is identified by the URL | inherited from another resource that is identified by the URL | |||
contained in a DAV:href element. An inherited ACE cannot be modified | contained in a DAV:href element. An inherited ACE cannot be | |||
directly, but instead the ACL on the resource from which it is | modified directly, but instead the ACL on the resource from which | |||
inherited must be modified. | it is inherited must be modified. | |||
Note that ACE inheritance is not the same as ACL initialization. ACL | Note that ACE inheritance is not the same as ACL initialization. | |||
initialization defines the ACL that a newly created resource will use | ACL initialization defines the ACL that a newly created resource | |||
(if not specified). ACE inheritance refers to an ACE that is | will use (if not specified). ACE inheritance refers to an ACE that | |||
logically shared - where an update to the resource containing an ACE | is logically shared - where an update to the resource containing an | |||
will affect the ACE of each resource that inherits that ACE. The | ACE will affect the ACE of each resource that inherits that ACE. | |||
method by which ACLs are initialized or by which ACEs are inherited | The method by which ACLs are initialized or by which ACEs are | |||
is not defined by this document. | inherited is not defined by this document. | |||
<!ELEMENT inherited (href)> | <!ELEMENT inherited (href)> | |||
5.4.5 Example: Retrieving a ResourceÆs Access Control List | 5.4.5 Example: Retrieving a Resource's Access Control List | |||
Continuing the example from Sections 5.2.1 and 5.3.1, this example | Continuing the example from Sections 5.2.1 and 5.3.1, this example | |||
shows a client requesting the DAV:acl property from the resource with | shows a client requesting the DAV:acl property from the resource | |||
URL http://www.webdav.org/papers/. There are two ACEs defined in this | with URL http://www.webdav.org/papers/. There are two ACEs defined | |||
ACL: | in this ACL: | |||
ACE #1: The principal collection identified by URL | ACE #1: The group identified by URL | |||
http://www.webdav.org/_acl/groups/maintainers/ (the group of site | http://www.webdav.org/_acl/groups/maintainers/ (the group of site | |||
maintainers) is granted DAV:write privilege. Since (for this example) | maintainers) is granted DAV:write privilege. Since (for this | |||
DAV:write contains the DAV:write-acl privilege (see Section 5.2.1), | example) DAV:write contains the DAV:write-acl privilege (see | |||
this means the ômaintainers" group can also modify the access control | Section 5.2.1), this means the "maintainers" group can also modify | |||
list. | the access control list. | |||
ACE #2: All principals (DAV:all) are granted the DAV:read privilege. | ACE #2: All principals (DAV:all) are granted the DAV:read | |||
Since (for this example) DAV:read contains DAV:read-acl and DAV:read- | privilege. Since (for this example) DAV:read contains DAV:read-acl | |||
current-user-privilege-set, this means all users (including all | and DAV:read-current-user-privilege-set, this means all users | |||
members of the ômaintainers" group) can read the DAV:acl property and | (including all members of the "maintainers" group) can read the | |||
the DAV:current-user-privilege-set property. | DAV:acl property and the DAV:current-user-privilege-set property. | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 24] | ||||
>> Request << | >> Request << | |||
PROPFIND /papers/ HTTP/1.1 | PROPFIND /papers/ HTTP/1.1 | |||
Host: www.webdav.org | Host: www.webdav.org | |||
Content-type: text/xml; charset="utf-8" | Content-type: text/xml; charset="utf-8" | |||
Content-Length: xxx | Content-Length: xxx | |||
Depth: 0 | Depth: 0 | |||
Authorization: Digest username="masinter", | Authorization: Digest username="masinter", | |||
realm="masinter@webdav.org", nonce="...", | realm="masinter@webdav.org", nonce="...", | |||
uri="/papers/", response="...", opaque="..." | uri="/papers/", response="...", opaque="..." | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 22] | ||||
<D:propfind xmlns:D="DAV:"> | <D:propfind xmlns:D="DAV:"> | |||
<D:prop> | <D:prop> | |||
<D:acl/> | <D:acl/> | |||
</D:prop> | </D:prop> | |||
</D:propfind> | </D:propfind> | |||
>> Response << | >> Response << | |||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
skipping to change at line 1135 | skipping to change at line 1221 | |||
</D:principal> | </D:principal> | |||
<D:grant> | <D:grant> | |||
<D:privilege> <D:write/> </D:privilege> | <D:privilege> <D:write/> </D:privilege> | |||
</D:grant> | </D:grant> | |||
</D:ace> | </D:ace> | |||
<D:ace> | <D:ace> | |||
<D:principal> | <D:principal> | |||
<D:all/> | <D:all/> | |||
</D:principal> | </D:principal> | |||
<D:grant> | <D:grant> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 25] | ||||
<D:privilege> <D:read/> </D:privilege> | <D:privilege> <D:read/> </D:privilege> | |||
</D:grant> | </D:grant> | |||
</D:ace> | </D:ace> | |||
</D:acl> | </D:acl> | |||
</D:prop> | </D:prop> | |||
<D:status>HTTP/1.1 200 OK</D:status> | <D:status>HTTP/1.1 200 OK</D:status> | |||
</D:propstat> | </D:propstat> | |||
</D:response> | </D:response> | |||
</D:multistatus> | </D:multistatus> | |||
5.5 DAV:acl-semantics | 5.5 DAV:inherited-acl | |||
This is a protected property that lists a set of other resources | ||||
whose ACLs also control the access to this resource. To have a | ||||
privilege on a resource, not only must the ACEs defined in the ACL | ||||
on that resource grant the privilege, but so must each ACL in a | ||||
dav:inherited-acl tag. Effectively, the privileges granted by the | ||||
current ACL are ANDÆed with the privileges granted by each | ||||
inherited ACL. The order in which the inherited-acl tag appears in | ||||
an ACL is relevant, regardless of the ACL semantics (see below). | ||||
<!ELEMENT inherited-acl (href)> | ||||
5.6 DAV:acl-semantics | ||||
This is a protected property that defines the ACL semantics. These | This is a protected property that defines the ACL semantics. These | |||
semantics define how multiple ACEs that match the current user are | semantics define how multiple ACEs that match the current user are | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 23] | ||||
combined, what are the constraints on how ACEs can be ordered, and | combined, what are the constraints on how ACEs can be ordered, and | |||
which principals must have an ACE. A client user interface could use | which principals must have an ACE. A client user interface could | |||
the value of this property to provide feedback to a human operator | use the value of this property to provide feedback to a human | |||
concerning the impact of proposed changes to an ACL. Alternately, a | operator concerning the impact of proposed changes to an ACL. | |||
client can use this property to help it determine, before submitting | Alternately, a client can use this property to help it determine, | |||
an ACL method invocation, what ACL changes it needs to make to | before submitting an ACL method invocation, what ACL changes it | |||
accomplish a specific goal (or whether that goal is even achievable | needs to make to accomplish a specific goal (or whether that goal | |||
on this server). | is even achievable on this server). | |||
Since it is not practical to require all implementations to use the | Since it is not practical to require all implementations to use the | |||
same ACL semantics, the DAV:acl-semantics property is used to | same ACL semantics, the DAV:acl-semantics property is used to | |||
identify the ACL semantics for a particular resource. The DAV:acl- | identify the ACL semantics for a particular resource. The DAV:acl- | |||
semantics element is defined in Section 6. | semantics element is defined in Section 6. | |||
5.5.1 Example: Retrieving DAV:acl-semantics | 5.6.1 Example: Retrieving DAV:acl-semantics | |||
In this example, the client requests the value of the DAV:acl- | In this example, the client requests the value of the DAV:acl- | |||
semantics property. Digest authentication provides credentials for | semantics property. Digest authentication provides credentials for | |||
the principal operating the client. In this example, the ACE | the principal operating the client. In this example, the ACE | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 26] | ||||
combination semantics are DAV:first-match, described in Section | combination semantics are DAV:first-match, described in Section | |||
6.1.1, the ACE ordering semantics are not specified (some value other | 6.1.1, the ACE ordering semantics are not specified (some value | |||
than DAV:deny-before-grant, described in Section 6.2.1), the | other than DAV:deny-before-grant, described in Section 6.2.1), the | |||
DAV:allowed-ace element states that only one ACE is permitted for | DAV:allowed-ace element states that only one ACE is permitted for | |||
each principal, and an ACE describing the privileges granted the | each principal, and an ACE describing the privileges granted the | |||
DAV:all principal must exist in every ACL. | DAV:all principal must exist in every ACL. | |||
>> Request << | >> Request << | |||
PROPFIND /papers/ HTTP/1.1 | PROPFIND /papers/ HTTP/1.1 | |||
Host: www.webdav.org | Host: www.webdav.org | |||
Content-type: text/xml; charset="utf-8" | Content-type: text/xml; charset="utf-8" | |||
Content-Length: xxx | Content-Length: xxx | |||
skipping to change at line 1199 | skipping to change at line 1300 | |||
<D:propfind xmlns:D="DAV:"> | <D:propfind xmlns:D="DAV:"> | |||
<D:prop> | <D:prop> | |||
<D:acl-semantics/> | <D:acl-semantics/> | |||
</D:prop> | </D:prop> | |||
</D:propfind> | </D:propfind> | |||
>> Response << | >> Response << | |||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 24] | ||||
Content-Length: xxx | Content-Length: xxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:multistatus xmlns:D="DAV:"> | <D:multistatus xmlns:D="DAV:"> | |||
<D:response> | <D:response> | |||
<D:href>http://www.webdav.org/papers/</D:href> | <D:href>http://www.webdav.org/papers/</D:href> | |||
<D:propstat> | <D:propstat> | |||
<D:prop> | <D:prop> | |||
<D:acl-semantics> | <D:acl-semantics> | |||
<D:ace-combination> | <D:ace-combination> | |||
<D:first-match/> | <D:first-match/> | |||
</D:ace-combination> | </D:ace-combination> | |||
<D:ace-ordering/> | <D:ace-ordering/> | |||
<D:allowed-ace> | <D:allowed-ace> | |||
<D:principal-only-one-ace/> | <D:principal-only-one-ace/> | |||
</D:allowed-ace> | </D:allowed-ace> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 27] | ||||
<D:required-principal> | <D:required-principal> | |||
<D:all/> | <D:all/> | |||
</D:required-principal> | </D:required-principal> | |||
</D:acl-semantics> | </D:acl-semantics> | |||
</D:prop> | </D:prop> | |||
<D:status>HTTP/1.1 200 OK</D:status> | <D:status>HTTP/1.1 200 OK</D:status> | |||
</D:propstat> | </D:propstat> | |||
<D:response> | <D:response> | |||
</D:multistatus> | </D:multistatus> | |||
5.6 DAV:principal-collection-set | 5.7 DAV:principal-collection-set | |||
This protected property contains zero, one, or more URLs that | This protected property of a resource contains a set of URLs that | |||
identify a collection principal. It is expected that implementations | identify the root collections that contain the principals that are | |||
of this protocol will typically use a relatively small number of | available on the server that implements this resource. An access | |||
locations in the URL namespace for principals, and collection | control protocol user agent could use the contents of | |||
principals. In cases where this assumption holds, the DAV:principal- | DAV:principal-collection-set to retrieve the DAV:displayname | |||
collection-set property will contain a small set of URLs identifying | property (specified in Section 13.2 of [RFC2518]) of all principals | |||
the top of a collection hierarchy containing multiple principals and | on that server, thereby yielding human-readable names for each | |||
collection principals. An access control protocol user agent could | principal that could be displayed in a user interface. | |||
use the contents of DAV:principal-collection-set to retrieve the | ||||
DAV:displayname property (specified in Section 13.2 of [RFC2518]) of | ||||
all principals on that server, thereby yielding human-readable names | ||||
for each principal that could be displayed in a user interface. | ||||
<!ELEMENT principal-collection-set (href*)> | <!ELEMENT principal-collection-set (href*)> | |||
Since different servers can control different parts of the URL | Since different servers can control different parts of the URL | |||
namespace, different resources on the same host MAY have different | namespace, different resources on the same host MAY have different | |||
DAV:principal-collection-set values. The collections specified in the | DAV:principal-collection-set values. The collections specified in | |||
DAV:principal-collection-set MAY be located on different hosts from | the DAV:principal-collection-set MAY be located on different hosts | |||
the resource. The URLs in DAV:principal-collection-set SHOULD be http | from the resource. The URLs in DAV:principal-collection-set SHOULD | |||
or https scheme URLs. For security and scalability reasons, a server | be http or https scheme URLs. For security and scalability reasons, | |||
MAY report only a subset of the entire set of known collection | a server MAY report only a subset of the entire set of known | |||
principal collections, and therefore clients should not assume they | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 25] | have retrieved an exhaustive listing. Additionally, a server MAY | |||
principals, and therefore clients should not assume they have | elect to report none of the principal collections it knows about, | |||
retrieved an exhaustive listing. Additionally, a server MAY elect to | in which case the property value would be empty. | |||
report none of the collection principals it knows about, in which | ||||
case the property value would be empty. | ||||
The value of DAV:principal-collection-set gives the scope of the | The value of DAV:principal-collection-set gives the scope of the | |||
DAV:principal-property-search REPORT (defined in Section 9.4). | DAV:principal-property-search REPORT (defined in Section 9.4). | |||
Clients use the DAV:principal-property-search REPORT to populate | Clients use the DAV:principal-property-search REPORT to populate | |||
their user interface with a list of principals. Therefore, servers | their user interface with a list of principals. Therefore, servers | |||
that limit a client's ability to obtain principal information will | that limit a client's ability to obtain principal information will | |||
interfere with the client's ability to manipulate access control | interfere with the client's ability to manipulate access control | |||
lists, due to the difficulty of getting the URL of a principal for | lists, due to the difficulty of getting the URL of a principal for | |||
use in an ACE. | use in an ACE. | |||
5.6.1 Example: Retrieving DAV:principal-collection-set | Clemm, Hopkins, Sedlar, Whitehead [Page 28] | |||
5.7.1 Example: Retrieving DAV:principal-collection-set | ||||
In this example, the client requests the value of the DAV:principal- | In this example, the client requests the value of the | |||
collection-set property on the collection resource identified by URL | DAV:principal-collection-set property on the collection resource | |||
http://www.webdav.org/papers/. The property contains the two URLs, | identified by URL http://www.webdav.org/papers/. The property | |||
http://www.webdav.org/_acl/users/ and | contains the two URLs, http://www.webdav.org/_acl/users/ and | |||
http://www.webdav.org/_acl/groups/, both wrapped in <DAV:href> XML | http://www.webdav.org/_acl/groups/, both wrapped in <DAV:href> XML | |||
elements. Digest authentication provides credentials for the | elements. Digest authentication provides credentials for the | |||
principal operating the client. | principal operating the client. | |||
The client might reasonably follow this request with two separate | The client might reasonably follow this request with two separate | |||
PROPFIND requests to retrieve the DAV:displayname property of the | PROPFIND requests to retrieve the DAV:displayname property of the | |||
members of the two collections (/_acl/users/ and /_acl_groups/). This | members of the two collections (/_acl/users/ and /_acl_groups/). | |||
information could be used when displaying a user interface for | This information could be used when displaying a user interface for | |||
creating access control entries. | creating access control entries. | |||
>> Request << | >> Request << | |||
PROPFIND /papers/ HTTP/1.1 | PROPFIND /papers/ HTTP/1.1 | |||
Host: www.webdav.org | Host: www.webdav.org | |||
Content-type: text/xml; charset="utf-8" | Content-type: text/xml; charset="utf-8" | |||
Content-Length: xxx | Content-Length: xxx | |||
Depth: 0 | Depth: 0 | |||
Authorization: Digest username="yarong", | Authorization: Digest username="yarong", | |||
skipping to change at line 1302 | skipping to change at line 1398 | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:propfind xmlns:D="DAV:"> | <D:propfind xmlns:D="DAV:"> | |||
<D:prop> | <D:prop> | |||
<D:principal-collection-set/> | <D:principal-collection-set/> | |||
</D:prop> | </D:prop> | |||
</D:propfind> | </D:propfind> | |||
>> Response << | >> Response << | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 26] | ||||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Content-Length: xxx | Content-Length: xxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:multistatus xmlns:D="DAV:"> | <D:multistatus xmlns:D="DAV:"> | |||
<D:response> | <D:response> | |||
<D:href>http://www.webdav.org/papers/</D:href> | <D:href>http://www.webdav.org/papers/</D:href> | |||
<D:propstat> | <D:propstat> | |||
<D:prop> | <D:prop> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 29] | ||||
<D:principal-collection-set> | <D:principal-collection-set> | |||
<D:href> | <D:href> | |||
http://www.webdav.org/_acl/users/ | http://www.webdav.org/_acl/users/ | |||
</D:href> | </D:href> | |||
<D:href> | <D:href> | |||
http://www.webdav.org/_acl/groups/ | http://www.webdav.org/_acl/groups/ | |||
</D:href> | </D:href> | |||
</D:principal-collection-set> | </D:principal-collection-set> | |||
</D:prop> | </D:prop> | |||
<D:status>HTTP/1.1 200 OK</D:status> | <D:status>HTTP/1.1 200 OK</D:status> | |||
</D:propstat> | </D:propstat> | |||
</D:response> | </D:response> | |||
</D:multistatus> | </D:multistatus> | |||
5.7 Example: PROPFIND to retrieve access control properties | 5.8 Example: PROPFIND to retrieve access control properties | |||
The following example shows how access control information can be | The following example shows how access control information can be | |||
retrieved by using the PROPFIND method to fetch the values of the | retrieved by using the PROPFIND method to fetch the values of the | |||
DAV:owner, DAV:supported-privilege-set, DAV:current-user-privilege- | DAV:owner, DAV:supported-privilege-set, DAV:current-user-privilege- | |||
set, and DAV:acl properties. | set, and DAV:acl properties. | |||
>> Request << | >> Request << | |||
PROPFIND /top/container/ HTTP/1.1 | PROPFIND /top/container/ HTTP/1.1 | |||
Host: www.foo.org | Host: www.foo.org | |||
skipping to change at line 1353 | skipping to change at line 1450 | |||
uri="/top/container/", response="...", opaque="..." | uri="/top/container/", response="...", opaque="..." | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:propfind xmlns:D="DAV:"> | <D:propfind xmlns:D="DAV:"> | |||
<D:prop> | <D:prop> | |||
<D:owner/> | <D:owner/> | |||
<D:supported-privilege-set/> | <D:supported-privilege-set/> | |||
<D:current-user-privilege-set/> | <D:current-user-privilege-set/> | |||
<D:acl/> | <D:acl/> | |||
</D:prop> | </D:prop> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 27] | ||||
</D:propfind> | </D:propfind> | |||
>> Response << | >> Response << | |||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Content-Length: xxx | Content-Length: xxx | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 30] | ||||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:multistatus | <D:multistatus | |||
xmlns:D="DAV:" | xmlns:D="DAV:" | |||
xmlns:A="http://www.webdav.org/acl/"> <D:response> | xmlns:A="http://www.webdav.org/acl/"> <D:response> | |||
<D:href>http://www.foo.org/top/container/</D:href> | <D:href>http://www.foo.org/top/container/</D:href> | |||
<D:propstat> | <D:propstat> | |||
<D:prop> | <D:prop> | |||
<D:owner> | <D:owner> | |||
<D:href>http://www.foo.org/users/gclemm</D:href> </D:owner> | <D:href>http://www.foo.org/users/gclemm</D:href> | |||
</D:owner> | ||||
<D:supported-privilege-set> | <D:supported-privilege-set> | |||
<D:supported-privilege> | <D:supported-privilege> | |||
<D:privilege> <D:all/> </D:privilege> | <D:privilege> <D:all/> </D:privilege> | |||
<D:abstract/> | <D:abstract/> | |||
<D:description xml:lang="en">Any operation</D:description> | <D:description xml:lang="en">Any | |||
operation</D:description> | ||||
<D:supported-privilege> | <D:supported-privilege> | |||
<D:privilege> <D:read/> </D:privilege> | <D:privilege> <D:read/> </D:privilege> | |||
<D:description xml:lang="en">Read any | <D:description xml:lang="en">Read any | |||
object</D:description> | object</D:description> | |||
</D:supported-privilege> | </D:supported-privilege> | |||
<D:supported-privilege> | <D:supported-privilege> | |||
<D:privilege> <D:write/> </D:privilege> | <D:privilege> <D:write/> </D:privilege> | |||
<D:abstract/> | <D:abstract/> | |||
<D:description xml:lang="en">Write any | <D:description xml:lang="en">Write any | |||
object</D:description> | object</D:description> | |||
skipping to change at line 1405 | skipping to change at line 1503 | |||
object</D:description> | object</D:description> | |||
</D:supported-privilege> | </D:supported-privilege> | |||
<D:supported-privilege> | <D:supported-privilege> | |||
<D:privilege> <A:delete/> </D:privilege> | <D:privilege> <A:delete/> </D:privilege> | |||
<D:description xml:lang="en">Delete an | <D:description xml:lang="en">Delete an | |||
object</D:description> | object</D:description> | |||
</D:supported-privilege> | </D:supported-privilege> | |||
</D:supported-privilege> | </D:supported-privilege> | |||
<D:supported-privilege> | <D:supported-privilege> | |||
<D:privilege> <D:read-acl/> </D:privilege> | <D:privilege> <D:read-acl/> </D:privilege> | |||
<D:description xml:lang="en">Read the ACL</D:description> | <D:description xml:lang="en">Read the | |||
ACL</D:description> | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 28] | ||||
</D:supported-privilege> | </D:supported-privilege> | |||
<D:supported-privilege> | <D:supported-privilege> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 31] | ||||
<D:privilege> <D:write-acl/> </D:privilege> | <D:privilege> <D:write-acl/> </D:privilege> | |||
<D:description xml:lang="en">Write the | <D:description xml:lang="en">Write the | |||
ACL</D:description> | ACL</D:description> | |||
</D:supported-privilege> | </D:supported-privilege> | |||
</D:supported-privilege> | </D:supported-privilege> | |||
</D:supported-privilege-set> | </D:supported-privilege-set> | |||
<D:current-user-privilege-set> | <D:current-user-privilege-set> | |||
<D:privilege> <D:read/> </D:privilege> | <D:privilege> <D:read/> </D:privilege> | |||
<D:privilege> <D:read-acl/> </D:privilege> | <D:privilege> <D:read-acl/> </D:privilege> | |||
</D:current-user-privilege-set> | </D:current-user-privilege-set> | |||
skipping to change at line 1449 | skipping to change at line 1548 | |||
<D:property> <D:owner/> </D:property> </D:principal> | <D:property> <D:owner/> </D:property> </D:principal> | |||
<D:grant> | <D:grant> | |||
<D:privilege> <D:read-acl/> </D:privilege> | <D:privilege> <D:read-acl/> </D:privilege> | |||
<D:privilege> <D:write-acl/> </D:privilege> </D:grant> | <D:privilege> <D:write-acl/> </D:privilege> </D:grant> | |||
</D:ace> | </D:ace> | |||
<D:ace> | <D:ace> | |||
<D:principal> <D:all/> </D:principal> | <D:principal> <D:all/> </D:principal> | |||
<D:grant> | <D:grant> | |||
<D:privilege> <D:read/> </D:privilege></D:grant> | <D:privilege> <D:read/> </D:privilege></D:grant> | |||
<D:inherited> | <D:inherited> | |||
<D:href>http://www.foo.org/top/</D:href> </D:inherited> | <D:href>http://www.foo.org/top/</D:href> | |||
</D:inherited> | ||||
</D:ace> </D:acl> | </D:ace> </D:acl> | |||
</D:prop> | </D:prop> | |||
<D:status>HTTP/1.1 200 OK</D:status> | <D:status>HTTP/1.1 200 OK</D:status> | |||
</D:propstat> </D:response> </D:multistatus> | </D:propstat> </D:response> </D:multistatus> | |||
The value of the DAV:owner property is a single DAV:href XML element | Clemm, Hopkins, Sedlar, Whitehead [Page 32] | |||
containing the URL of the principal that owns this resource. | The value of the DAV:owner property is a single DAV:href XML | |||
element containing the URL of the principal that owns this | ||||
resource. | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 29] | ||||
The value of the DAV:supported-privilege-set property is a tree of | The value of the DAV:supported-privilege-set property is a tree of | |||
supported privileges: | supported privileges (using "[XML Namespace , localname]" to | |||
identify each privilege): | ||||
DAV:all (aggregate, abstract) | [DAV:, all] (aggregate, abstract) | |||
| | | | |||
+-- DAV:read | +-- [DAV:, read] | |||
+-- DAV:write (aggregate, abstract) | +-- [DAV:, write] (aggregate, abstract) | |||
| | | | |||
+-- http://www.webdav.org/acl/create | +-- [http://www.webdav.org/acl/, create] | |||
+-- http://www.webdav.org/acl/update | +-- [http://www.webdav.org/acl/, update] | |||
+-- http://www.webdav.org/acl/delete | +-- [http://www.webdav.org/acl/, delete] | |||
+-- DAV:read-acl | +-- [DAV:, read-acl] | |||
+-- DAV:write-acl | +-- [DAV:, write-acl] | |||
The DAV:current-user-privilege-set property contains two privileges, | The DAV:current-user-privilege-set property contains two | |||
DAV:read, and DAV:read-acl. This indicates that the current | privileges, DAV:read, and DAV:read-acl. This indicates that the | |||
authenticated user only has the ability to read the resource, and | current authenticated user only has the ability to read the | |||
read the DAV:acl property on the resource. | resource, and read the DAV:acl property on the resource. | |||
The DAV:acl property contains a set of four ACEs: | The DAV:acl property contains a set of four ACEs: | |||
ACE #1: The principal identified by the URL | ACE #1: The principal identified by the URL | |||
http://www.foo.org/users/esedlar is granted the DAV:read, DAV:write, | http://www.foo.org/users/esedlar is granted the DAV:read, | |||
and DAV:read-acl privileges. | DAV:write, and DAV:read-acl privileges. | |||
ACE #2: The principals identified by the URL | ACE #2: The principals identified by the URL | |||
http://www.foo.org/groups/marketing/ are denied the DAV:read | http://www.foo.org/groups/marketing/ are denied the DAV:read | |||
privilege. In this example, the principal URL identifies a group, | privilege. In this example, the principal URL identifies a group. | |||
which is represented by a collection principal. | ||||
ACE #3: In this ACE, the principal is a property principal, | ACE #3: In this ACE, the principal is a property principal, | |||
specifically the DAV:owner property. When evaluating this ACE, the | specifically the DAV:owner property. When evaluating this ACE, the | |||
value of the DAV:owner property is retrieved, and is examined to see | value of the DAV:owner property is retrieved, and is examined to | |||
if it contains a DAV:href XML element. If so, the URL within the | see if it contains a DAV:href XML element. If so, the URL within | |||
DAV:href element is read, and identifies a principal. In this ACE, | the DAV:href element is read, and identifies a principal. In this | |||
the owner is granted DAV:read-acl, and DAV:write-acl privileges. | ACE, the owner is granted DAV:read-acl, and DAV:write-acl | |||
privileges. | ||||
ACE #4: This ACE grants the DAV:all principal (all users) the | ACE #4: This ACE grants the DAV:all principal (all users) the | |||
DAV:read privilege. This ACE is inherited from the resource | DAV:read privilege. This ACE is inherited from the resource | |||
http://www.foo.org/top/, the parent collection of this resource. | http://www.foo.org/top/, the parent collection of this resource. | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 33] | ||||
6 ACL SEMANTICS | 6 ACL SEMANTICS | |||
The ACL semantics define how multiple ACEs that match the current | The ACL semantics define how multiple ACEs that match the current | |||
user are combined, what are the constraints on how ACEs can be | user are combined, what are the constraints on how ACEs can be | |||
ordered, and which principals must have an ACE. | ordered, and which principals must have an ACE. | |||
<!ELEMENT acl-semantics (ace-combination?, ace-ordering?, allowed- | <!ELEMENT acl-semantics (ace-combination?, ace-ordering?, | |||
ace?, required-principal?)> | allowed-ace?, required-principal?)> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 30] | ||||
6.1 ACE Combination | 6.1 ACE Combination | |||
The DAV:ace-combination element defines how privileges from multiple | The DAV:ace-combination element defines how privileges from | |||
ACEs that match the current user will be combined to determine the | multiple ACEs that match the current user will be combined to | |||
access privileges for that user. Multiple ACEs may match the same | determine the access privileges for that user. Multiple ACEs may | |||
user because the same principal can appear in multiple ACEs, because | match the same user because the same principal can appear in | |||
multiple principals can identify the same user, and because one | multiple ACEs, because multiple principals can identify the same | |||
principal can be a member of another principal. | user, and because one principal can be a member of another | |||
principal. | ||||
<!ELEMENT ace-combination | <!ELEMENT ace-combination | |||
(first-match | all-grant-before-any-deny | specific-deny- | (first-match | all-grant-before-any-deny | specific-deny- | |||
overrides-grant)> | overrides-grant)> | |||
6.1.1 DAV:first-match ACE Combination | 6.1.1 DAV:first-match ACE Combination | |||
The ACEs are evaluated in the order in which they appear in the ACL. | The ACEs are evaluated in the order in which they appear in the | |||
If the first ACE that matches the current user does not grant all the | ACL. If the first ACE that matches the current user does not grant | |||
privileges needed for the request, the request MUST fail. | all the privileges needed for the request, the request MUST fail. | |||
<!ELEMENT first-match EMPTY> | <!ELEMENT first-match EMPTY> | |||
6.1.2 DAV:all-grant-before-any-deny ACE Combination | 6.1.2 DAV:all-grant-before-any-deny ACE Combination | |||
The ACEs are evaluated in the order in which they appear in the ACL. | The ACEs are evaluated in the order in which they appear in the | |||
If an evaluated ACE denies a privilege needed for the request, the | ACL. If an evaluated ACE denies a privilege needed for the | |||
request MUST fail. If all ACEs have been evaluated without the user | request, the request MUST fail. If all ACEs have been evaluated | |||
being granted all privileges needed for the request, the request MUST | without the user being granted all privileges needed for the | |||
fail. | request, the request MUST fail. | |||
<!ELEMENT all-grant-before-any-deny EMPTY> | <!ELEMENT all-grant-before-any-deny EMPTY> | |||
6.1.3 DAV:specific-deny-overrides-grant ACE Combination | 6.1.3 DAV:specific-deny-overrides-grant ACE Combination | |||
All ACEs in the ACL are evaluated. An "individual ACE" is one whose | All ACEs in the ACL are evaluated. An "individual ACE" is one | |||
principal identifies the current user. A "group ACE" is one whose | whose principal matches the current user. A "group ACE" is one | |||
principal is a collection that contains a principal that identifies | whose principal is a group that has a member that matches the | |||
the current user. A privilege is granted if it is granted by an | current user. A privilege is granted if it is granted by an | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 34] | ||||
individual ACE and not denied by an individual ACE, or if it is | individual ACE and not denied by an individual ACE, or if it is | |||
granted by a group ACE and not denied by an individual or group ACE. | granted by a group ACE and not denied by an individual or group | |||
A request MUST fail if any of its needed privileges are not granted. | ACE. A request MUST fail if any of its needed privileges are not | |||
granted. | ||||
<!ELEMENT specific-deny-overrides-grant EMPTY> | <!ELEMENT specific-deny-overrides-grant EMPTY> | |||
6.2 ACE Ordering | 6.2 ACE Ordering | |||
The DAV:ace-ordering element defines a constraint on how the ACEs can | The DAV:ace-ordering element defines a constraint on how the ACEs | |||
be ordered in the ACL. | can be ordered in the ACL. | |||
<!ELEMENT ace-ordering (deny-before-grant)? > | <!ELEMENT ace-ordering (deny-before-grant)? > | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 31] | ||||
6.2.1 DAV:deny-before-grant ACE Ordering | 6.2.1 DAV:deny-before-grant ACE Ordering | |||
This element indicates that all deny ACEs must precede all grant | This element indicates that all deny ACEs must precede all grant | |||
ACEs. | ACEs. | |||
<!ELEMENT deny-before-grant EMPTY> | <!ELEMENT deny-before-grant EMPTY> | |||
6.3 Allowed ACE | 6.3 Allowed ACE | |||
The DAV:allowed-ace XML element specifies constraints on what kinds | The DAV:allowed-ace XML element specifies constraints on what kinds | |||
of ACEs are allowed in an ACL. | of ACEs are allowed in an ACL. | |||
<!ELEMENT allowed-ace (principal-only-one-ace | grant-only)*> | <!ELEMENT allowed-ace (principal-only-one-ace | grant-only | | |||
no-invert | no-acl-inherit)*> | ||||
6.3.1 DAV:principal-only-one-ace ACE Constraint | 6.3.1 DAV:principal-only-one-ace ACE Constraint | |||
This element indicates that a principal can appear in only one ACE | This element indicates that a principal can appear in only one ACE | |||
per resource. | per resource. | |||
<!ELEMENT principal-only-one-ace EMPTY> | <!ELEMENT principal-only-one-ace EMPTY> | |||
6.3.2 DAV:grant-only ACE Constraint | 6.3.2 DAV:grant-only ACE Constraint | |||
This element indicates that ACEs with deny clauses are not allowed. | This element indicates that ACEs with deny clauses are not allowed. | |||
<!ELEMENT grant-only EMPTY> | <!ELEMENT grant-only EMPTY> | |||
6.3.3 DAV:no-invert ACE Constraint | ||||
This element indicates that ACEs with the <invert> element are not | ||||
allowed. | ||||
<!ELEMENT no-invert EMPTY> | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 35] | ||||
6.3.4 DAV:no-acl-inherit ACE Constraint | ||||
This element indicates that ACLs with the <inherited-acl> element | ||||
are not allowed. | ||||
<!ELEMENT no-acl-inherit EMPTY> | ||||
6.4 Required Principals | 6.4 Required Principals | |||
The required principal elements identify which principals must have | The required principal elements identify which principals must have | |||
an ACE defined in the ACL. | an ACE defined in the ACL. | |||
<!ELEMENT required-principal | <!ELEMENT required-principal | |||
(all? | authenticated? | unauthenticated? | self? | href* | | (all? | authenticated? | unauthenticated? | self? | href* | | |||
property*)> | property*)> | |||
For example, the following element requires that the ACL contain a | For example, the following element requires that the ACL contain a | |||
skipping to change at line 1611 | skipping to change at line 1730 | |||
<D:required-principal xmlns:D="DAV:"> | <D:required-principal xmlns:D="DAV:"> | |||
<D:property> <D:owner/> </D:property> | <D:property> <D:owner/> </D:property> | |||
</D:required-principal> | </D:required-principal> | |||
7 ACCESS CONTROL AND EXISTING METHODS | 7 ACCESS CONTROL AND EXISTING METHODS | |||
This section defines the impact of access control functionality on | This section defines the impact of access control functionality on | |||
existing methods. | existing methods. | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 32] | ||||
7.1 OPTIONS | 7.1 OPTIONS | |||
If the server supports access control, it MUST return "access- | If the server supports access control, it MUST return "access- | |||
control" as a field in the DAV response header from an OPTIONS | control" as a field in the DAV response header from an OPTIONS | |||
request on any resource implemented by that server. | request on any resource implemented by that server. | |||
7.1.1 Example - OPTIONS | 7.1.1 Example - OPTIONS | |||
>> Request << | >> Request << | |||
OPTIONS /foo.html HTTP/1.1 | OPTIONS /foo.html HTTP/1.1 | |||
Host: www.webdav.org | Host: www.webdav.org | |||
Content-Length: 0 | Content-Length: 0 | |||
>> Response << | >> Response << | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
DAV: 1, 2, access-control | DAV: 1, 2, access-control | |||
Allow: OPTIONS, GET, PUT, PROPFIND, PROPPATCH, ACL | Allow: OPTIONS, GET, PUT, PROPFIND, PROPPATCH, ACL | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 36] | ||||
In this example, the OPTIONS response indicates that the server | In this example, the OPTIONS response indicates that the server | |||
supports access control and that /foo.html can have its access | supports access control and that /foo.html can have its access | |||
control list modified by the ACL method. | control list modified by the ACL method. | |||
7.2 MOVE | 7.2 MOVE | |||
When a resource is moved from one location to another due to a MOVE | When a resource is moved from one location to another due to a MOVE | |||
request, the non-inherited and non-protected ACEs in the DAV:acl | request, the non-inherited and non-protected ACEs in the DAV:acl | |||
property of the resource MUST NOT be modified, or the MOVE request | property of the resource MUST NOT be modified, or the MOVE request | |||
fails. Handling of inherited and protected ACEs is intentionally | fails. Handling of inherited and protected ACEs is intentionally | |||
undefined to give server implementations flexibility in how they | undefined to give server implementations flexibility in how they | |||
implement ACE inheritance and protection. | implement ACE inheritance and protection. | |||
7.3 COPY | 7.3 COPY | |||
The DAV:acl property on the resource at the destination of a COPY | The DAV:acl property on the resource at the destination of a COPY | |||
MUST be the same as if the resource was created by an individual | MUST be the same as if the resource was created by an individual | |||
resource creation request (e.g. MKCOL, PUT). Clients wishing to | resource creation request (e.g. MKCOL, PUT). Clients wishing to | |||
preserve the DAV:acl property across a copy need to read the DAV:acl | preserve the DAV:acl property across a copy need to read the | |||
property prior to the COPY, then perform an ACL operation on the new | DAV:acl property prior to the COPY, then perform an ACL operation | |||
resource at the destination to restore, insofar as this is possible, | on the new resource at the destination to restore, insofar as this | |||
the original access control list. | is possible, the original access control list. | |||
7.4 DELETE | 7.4 DELETE | |||
The precise combination of privileges and resources necessary to | The precise combination of privileges and resources necessary to | |||
permit the DELETE method is intentionally left to the discretion of | permit the DELETE method is intentionally left to the discretion of | |||
each server implementation. It is envisioned that on some servers, | each server implementation. It is envisioned that on some servers, | |||
DELETE will require write permission on the collection containing the | DELETE will require write permission on the collection containing | |||
resource to be deleted. On other servers, it might also require | the resource to be deleted. On other servers, it might also | |||
write permission on the resource being deleted. | require write permission on the resource being deleted. | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 33] | ||||
7.5 LOCK | 7.5 LOCK | |||
A lock on a resource ensures that only the lock owner can modify ACEs | A lock on a resource ensures that only the lock owner can modify | |||
that are not inherited and not protected (these are the only ACEs | ACEs that are not inherited and not protected (these are the only | |||
that a client can modify with an ACL request). A lock does not | ACEs that a client can modify with an ACL request). A lock does not | |||
protect inherited or protected ACEs, since a client cannot modify | protect inherited or protected ACEs, since a client cannot modify | |||
them with an ACL request on that resource. | them with an ACL request on that resource. | |||
8 ACCESS CONTROL METHODS | 8 ACCESS CONTROL METHODS | |||
8.1 ACL | 8.1 ACL | |||
The ACL method modifies the access control list (which can be read | The ACL method modifies the access control list (which can be read | |||
via the DAV:acl property) of a resource. Specifically, the ACL | via the DAV:acl property) of a resource. Specifically, the ACL | |||
method only permits modification to ACEs that are not inherited, and | method only permits modification to ACEs that are not inherited, | |||
are not protected. An ACL method invocation modifies all non- | and are not protected. An ACL method invocation modifies all non- | |||
inherited and non-protected ACEs in a resourceÆs access control list | ||||
to exactly match the ACEs contained within in the DAV:acl XML element | Clemm, Hopkins, Sedlar, Whitehead [Page 37] | |||
(specified in Section 5.4) of the request body. An ACL request body | inherited and non-protected ACEs in a resource's access control | |||
MUST contain only one DAV:acl XML element. Unless the non-inherited | list to exactly match the ACEs contained within in the DAV:acl XML | |||
and non-protected ACEs of the DAV:acl property of the resource can be | element (specified in Section 5.4) of the request body. An ACL | |||
updated to be exactly the value specified in the ACL request, the ACL | request body MUST contain only one DAV:acl XML element. Unless the | |||
request MUST fail. | non-inherited and non-protected ACEs of the DAV:acl property of the | |||
resource can be updated to be exactly the value specified in the | ||||
ACL request, the ACL request MUST fail. | ||||
It is possible that the ACEs visible to the current user in the | It is possible that the ACEs visible to the current user in the | |||
DAV:acl property may only be a portion of the complete set of ACEs on | DAV:acl property may only be a portion of the complete set of ACEs | |||
that resource. If this is the case, an ACL request only modifies the | on that resource. If this is the case, an ACL request only modifies | |||
set of ACEs visible to the current user, and does not affect any non- | the set of ACEs visible to the current user, and does not affect | |||
visible ACE. | any non-visible ACE. | |||
In order to avoid overwriting DAV:acl changes by another client, a | In order to avoid overwriting DAV:acl changes by another client, a | |||
client SHOULD acquire a WebDAV lock on the resource before retrieving | client SHOULD acquire a WebDAV lock on the resource before | |||
the DAV:acl property of a resource that it intends on updating. | retrieving the DAV:acl property of a resource that it intends on | |||
updating. | ||||
Implementation Note: Two common operations are to add or remove an | Implementation Note: Two common operations are to add or remove | |||
ACE from an existing access control list. To accomplish this, a | an ACE from an existing access control list. To accomplish this, | |||
client uses the PROPFIND method to retrieve the value of the | a client uses the PROPFIND method to retrieve the value of the | |||
DAV:acl property, then parses the returned access control list to | DAV:acl property, then parses the returned access control list | |||
remove all inherited and protected ACEs (these ACEs are tagged | to remove all inherited and protected ACEs (these ACEs are | |||
with the DAV:inherited and DAV:protected XML elements). In the | tagged with the DAV:inherited and DAV:protected XML elements). | |||
remaining set of non-inherited, non-protected ACEs, the client can | In the remaining set of non-inherited, non-protected ACEs, the | |||
add or remove one or more ACEs before submitting the final ACE set | client can add or remove one or more ACEs before submitting the | |||
in the request body of the ACL method. | final ACE set in the request body of the ACL method. | |||
8.1.1 ACL Preconditions | 8.1.1 ACL Preconditions | |||
An implementation MAY enforce one or more of the following | An implementation MAY enforce one or more of the following | |||
constraints on an ACL request. If the constraint is violated, a 403 | constraints on an ACL request. If the constraint is violated, a | |||
(Forbidden) response MUST be returned and the indicated XML element | 403 (Forbidden) or 409 (Conflict) response MUST be returned and the | |||
MUST be returned as the top level element in an XML response body. | indicated XML element MUST be returned as a child of a top level | |||
DAV:error element in an XML response body. | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 34] | (DAV:no-ace-conflict): The ACEs submitted in the ACL request MUST | |||
<DAV:ace-conflict/>: A conflict exists between two or more ACEs | NOT conflict with each other. What is considered a conflict | |||
submitted in the ACL request. | depends on the ACL semantics of that resource. | |||
<DAV:protected-ace-conflict/>: A conflict exists between an ACE in | (DAV:no-protected-ace-conflict): The ACEs submitted in the ACL | |||
the ACL request and a protected ACE on the resource. For example, if | request MUST NOT conflict with the protected ACEs on the resource. | |||
the resource has a protected ACE granting DAV:write to a given | For example, if the resource has a protected ACE granting DAV:write | |||
principal, then it would be a protected ACE conflict if the ACL | to a given principal, then it would not be consistent if the ACL | |||
request submitted an ACE denying DAV:write to the same principal. | request submitted an ACE denying DAV:write to the same principal. | |||
<DAV:inherited-ace-conflict/>: A conflict exists between an ACE in | (DAV:no-inherited-ace-conflict): The ACEs submitted in the ACL | |||
the ACL request and an inherited ACE on the resource. For example, if | request MUST NOT conflict with the inherited ACEs on the resource. | |||
the resource inherits an ACE from its parent collection granting | ||||
DAV:write to a given principal, then it would be an inherited ACE | ||||
conflict if the ACL request submitted an ACE denying DAV:write to the | ||||
same principal. Note that reporting of this error will be | ||||
implementation-dependent. Implementations have the choice to either | ||||
report this error, or to allow the ACE to be set, and then let normal | ||||
ACE evaluation rules determine whether the new ACE has any impact on | ||||
the privileges available to a specific principal. | ||||
<DAV:too-many-aces/>: An implementation MAY limit the number of ACEs | Clemm, Hopkins, Sedlar, Whitehead [Page 38] | |||
in an ACL. However, ACL-compliant servers MUST support at least one | For example, if the resource inherits an ACE from its parent | |||
collection granting DAV:write to a given principal, then it would | ||||
not be consistent if the ACL request submitted an ACE denying | ||||
DAV:write to the same principal. Note that reporting of this error | ||||
will be implementation-dependent. Implementations have the choice | ||||
to either report this error, or to allow the ACE to be set, and | ||||
then let normal ACE evaluation rules determine whether the new ACE | ||||
has any impact on the privileges available to a specific principal. | ||||
(DAV:limited-number-of-aces): The number of ACEs submitted in the | ||||
ACL request MUST NOT exceed the number of ACEs allowed on that | ||||
resource. However, ACL-compliant servers MUST support at least one | ||||
ACE granting privileges to a single principal, and one ACE granting | ACE granting privileges to a single principal, and one ACE granting | |||
privileges to a collection principal. | privileges to a group. | |||
<DAV:deny-before-grant/>: All non-inherited deny ACEs MUST precede | (DAV:deny-before-grant): All non-inherited deny ACEs MUST precede | |||
all non-inherited grant ACEs. | all non-inherited grant ACEs. | |||
<DAV:principal-only-one-ace/>: For implementations that have the | (DAV:principal-only-one-ace): The ACL request MUST NOT result in | |||
DAV:principal-only-one-ace constraint (defined in Section 6.3.1), | more than one ACE for a given principal. This precondition applies | |||
this XML element indicates that fulfilling the ACL request would | only when the ACL semantics of the resource includes the | |||
result in multiple ACEs for one or more principals. | DAV:principal-only-one-ace constraint (defined in Section 6.3.1). | |||
<DAV:grant-only/>: For implementations that have the DAV:grant-only | (DAV:grant-only): The ACEs submitted in the ACL request MUST NOT | |||
constraint (defined in Section 6.3.2), this XML element indicates the | include a deny ACE. This precondition applies only when the ACL | |||
request contained one or more deny ACEs. | semantics of the resource includes the DAV:grant-only constraint | |||
(defined in Section 6.3.2). | ||||
<DAV:no-abstract/>: The ACL request attempts to set an abstract | (DAV:no-invert): The ACL request MUST NOT include a <dav:invert> | |||
privilege in an ACE (see Section 5.2). | element. This precondition applies only when the ACL semantics of | |||
the resource includes the DAV:no-invert constraint (defined in | ||||
Section 6.3.4). | ||||
<DAV:supported-privilege/>: One or more of the privileges in the ACL | (DAV:no-acl-inherit): The ACL request MUST NOT include a | |||
request is not supported by the resource. | <dav:inherited-acl> element. This precondition applies only when | |||
the ACL semantics of the resource includes the DAV:no-acl-inherit | ||||
constraint (defined in Section 6.3.4). | ||||
<DAV:required-principal/>: One or more required principals (see | (DAV:no-abstract): The ACL request MUST NOT attempt to grant or | |||
Section 6.4) would not be present in the access control list after | deny an abstract privilege (see Section 5.2). | |||
processing the ACL request. The DAV:required-principal XML element | ||||
MUST contain a list of the missing principal(s), following the syntax | ||||
specified in Section 6.4. | ||||
<DAV:recognized-principal/>: One or more of the principal URLs in the | (DAV:not-supported-privilege): The ACEs submitted in the ACL | |||
ACL request does not identify a principal resource. | request MUST be supported by the resource. | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 35] | (DAV:missing-required-principal): The result of the ACL request | |||
<DAV:allowed-principal/>: One or more of the principal URLs in the | MUST have at least one ACE for each principal identified in a | |||
ACL request is not allowed in an ACE. For example, a server where | DAV:required-principal XML element in the ACL semantics of that | |||
only authenticated principals can access resources would not allow | resource (see Section 6.3.2). | |||
the DAV:all or DAV:unauthenticated principals to be used in an ACE, | ||||
since these would allow unauthenticated access to resources. | Clemm, Hopkins, Sedlar, Whitehead [Page 39] | |||
(DAV:recognized-principal): Every principal URL in the ACL request | ||||
MUST identify a principal resource. | ||||
(DAV:allowed-principal): The principals specified in the ACEs | ||||
submitted in the ACL request MUST be allowed as principals for the | ||||
resource. For example, a server where only authenticated principals | ||||
can access resources would not allow the DAV:all or | ||||
DAV:unauthenticated principals to be used in an ACE, since these | ||||
would allow unauthenticated access to resources. | ||||
8.1.2 Example: the ACL method | 8.1.2 Example: the ACL method | |||
In the following example, user "fielding", authenticated by | In the following example, user "fielding", authenticated by | |||
information in the Authorization header, grants the principal | information in the Authorization header, grants the principal | |||
identified by the URL http://www.foo.org/users/esedlar (i.e., the | identified by the URL http://www.foo.org/users/esedlar (i.e., the | |||
user "esedlar") read and write privileges, grants the owner of the | user "esedlar") read and write privileges, grants the owner of the | |||
resource read-acl and write-acl privileges, and grants everyone read | resource read-acl and write-acl privileges, and grants everyone | |||
privileges. | read privileges. | |||
>> Request << | >> Request << | |||
ACL /top/container/ HTTP/1.1 | ACL /top/container/ HTTP/1.1 | |||
Host: www.foo.org | Host: www.foo.org | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
Authorization: Digest username="fielding", | Authorization: Digest username="fielding", | |||
realm="users@foo.org", nonce="...", | realm="users@foo.org", nonce="...", | |||
uri="/top/container/", response="...", opaque="..." | uri="/top/container/", response="...", opaque="..." | |||
skipping to change at line 1816 | skipping to change at line 1950 | |||
</D:grant> | </D:grant> | |||
</D:ace> | </D:ace> | |||
<D:ace> | <D:ace> | |||
<D:principal> | <D:principal> | |||
<D:property> <D:owner/> </D:property> | <D:property> <D:owner/> </D:property> | |||
</D:principal> | </D:principal> | |||
<D:grant> | <D:grant> | |||
<D:privilege> <D:read-acl/> </D:privilege> | <D:privilege> <D:read-acl/> </D:privilege> | |||
<D:privilege> <D:write-acl/> </D:privilege> | <D:privilege> <D:write-acl/> </D:privilege> | |||
</D:grant> | </D:grant> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 40] | ||||
</D:ace> | </D:ace> | |||
<D:ace> | <D:ace> | |||
<D:principal> <D:all/> </D:principal> | <D:principal> <D:all/> </D:principal> | |||
<D:grant> | <D:grant> | |||
<D:privilege> <D:read/> </D:privilege> | <D:privilege> <D:read/> </D:privilege> | |||
</D:grant> | </D:grant> | |||
</D:ace> | </D:ace> </D:acl> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 36] | ||||
</D:acl> | ||||
>> Response << | >> Response << | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
8.1.3 Example: ACL method failure due to protected ACE conflict | 8.1.3 Example: ACL method failure due to protected ACE conflict | |||
In the following request, user "fielding", authenticated by | In the following request, user "fielding", authenticated by | |||
information in the Authorization header, attempts to deny the | information in the Authorization header, attempts to deny the | |||
principal identified by the URL http://www.foo.org/users/esedlar | principal identified by the URL http://www.foo.org/users/esedlar | |||
(i.e., the user "esedlar") write privileges. Prior to the request, | (i.e., the user "esedlar") write privileges. Prior to the request, | |||
the DAV:acl property on the resource contained a protected ACE (see | the DAV:acl property on the resource contained a protected ACE (see | |||
Section 5.4.3) granting DAV:owner the DAV:read and DAV:write | Section 5.4.3) granting DAV:owner the DAV:read and DAV:write | |||
privileges. The principal identified by URL | privileges. The principal identified by URL | |||
http://www.foo.org/users/esedlar is the owner of the resource. The | http://www.foo.org/users/esedlar is the owner of the resource. The | |||
ACL method invocation fails because the submitted ACE conflicts with | ACL method invocation fails because the submitted ACE conflicts | |||
the protected ACE, thus violating the semantics of ACE protection. | with the protected ACE, thus violating the semantics of ACE | |||
protection. | ||||
>> Request << | >> Request << | |||
ACL /top/container/ HTTP/1.1 | ACL /top/container/ HTTP/1.1 | |||
Host: www.foo.org | Host: www.foo.org | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
Authorization: Digest username="fielding", | Authorization: Digest username="fielding", | |||
realm="users@foo.org", nonce="...", | realm="users@foo.org", nonce="...", | |||
uri="/top/container/", response="...", opaque="..." | uri="/top/container/", response="...", opaque="..." | |||
skipping to change at line 1866 | skipping to change at line 2000 | |||
<D:ace> | <D:ace> | |||
<D:principal> | <D:principal> | |||
<D:href>http://www.foo.org/users/esedlar</D:href> | <D:href>http://www.foo.org/users/esedlar</D:href> | |||
</D:principal> | </D:principal> | |||
<D:deny> | <D:deny> | |||
<D:privilege> <D:write/> </D:privilege> | <D:privilege> <D:write/> </D:privilege> | |||
</D:deny> | </D:deny> | |||
</D:ace> | </D:ace> | |||
</D:acl> | </D:acl> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 41] | ||||
>> Response << | >> Response << | |||
HTTP/1.1 403 Forbidden | HTTP/1.1 403 Forbidden | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Content-Length: xxx | Content-Length: xxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:protected-ace-conflict xmlns:D="DAV:"/> | <D:error xmlns:D="DAV:"> | |||
<D:no-protected-ace-conflict/> | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 37] | </D:error> | |||
8.1.4 Example: ACL method failure due to an inherited ACE conflict | 8.1.4 Example: ACL method failure due to an inherited ACE conflict | |||
In the following request, user "ejw", authenticated by information in | In the following request, user "ejw", authenticated by information | |||
the Authorization header, tries to change the access control list on | in the Authorization header, tries to change the access control | |||
the resource http://www.foo.org/top/index.html. This resource has two | list on the resource http://www.foo.org/top/index.html. This | |||
inherited ACEs. | resource has two inherited ACEs. | |||
Inherited ACE #1 grants the principal identified by URL | Inherited ACE #1 grants the principal identified by URL | |||
http://www.foo.org/users/ejw (i.e., the user "ejw") | http://www.foo.org/users/ejw (i.e., the user "ejw") | |||
http://www.foo.org/privs/write-all and DAV:read-acl privileges. On | http://www.foo.org/privs/write-all and DAV:read-acl privileges. On | |||
this server, http://www.foo.org/privs/write-all is an aggregate | this server, http://www.foo.org/privs/write-all is an aggregate | |||
privilege containing DAV:write, and DAV:write-acl. | privilege containing DAV:write, and DAV:write-acl. | |||
Inherited ACE #2 grants principal DAV:all the DAV:read privilege. | Inherited ACE #2 grants principal DAV:all the DAV:read privilege. | |||
The request attempts to set a (non-inherited) ACE, denying the | The request attempts to set a (non-inherited) ACE, denying the | |||
principal identified by the URL http://www.foo.org/users/ejw (i.e., | principal identified by the URL http://www.foo.org/users/ejw (i.e., | |||
the user ôejw") DAV:write permission. This conflicts with inherited | the user "ejw") DAV:write permission. This conflicts with inherited | |||
ACE #1. Note that the decision to report an inherited ACE conflict is | ACE #1. Note that the decision to report an inherited ACE conflict | |||
specific to this server implementation. Another server implementation | is specific to this server implementation. Another server | |||
could have allowed the new ACE to be set, and then used normal ACE | implementation could have allowed the new ACE to be set, and then | |||
evaluation rules to determine whether the new ACE has any impact on | used normal ACE evaluation rules to determine whether the new ACE | |||
the privileges available to a principal. | has any impact on the privileges available to a principal. | |||
>> Request << | >> Request << | |||
ACL /top/index.html HTTP/1.1 | ACL /top/index.html HTTP/1.1 | |||
Host: www.foo.org | Host: www.foo.org | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
Authorization: Digest username="ejw", | Authorization: Digest username="ejw", | |||
realm="users@foo.org", nonce="...", | realm="users@foo.org", nonce="...", | |||
uri="/top/index.html", response="...", opaque="..." | uri="/top/index.html", response="...", opaque="..." | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:acl xmlns:D="DAV:" xmlns:F="http://www.foo.org/privs/"> | <D:acl xmlns:D="DAV:" xmlns:F="http://www.foo.org/privs/"> | |||
<D:ace> | <D:ace> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 42] | ||||
<D:principal> | <D:principal> | |||
<D:href>http://www.foo.org/users/ejw</D:href> | <D:href>http://www.foo.org/users/ejw</D:href> | |||
</D:principal> | </D:principal> | |||
<D:grant><D:write/></D:grant> | <D:grant><D:write/></D:grant> | |||
</D:ace> | </D:ace> | |||
</D:acl> | </D:acl> | |||
>> Response << | >> Response << | |||
HTTP/1.1 403 Forbidden | HTTP/1.1 403 Forbidden | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Content-Length: xxx | Content-Length: xxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:error xmlns:D="DAV:"> | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 38] | <D:no-inherited-ace-conflict xmlns:D="DAV:"/> | |||
<D:inherited-ace-conflict xmlns:D="DAV:"/> | </D:error> | |||
8.1.5 Example: ACL method failure due to an attempt to set grant and | 8.1.5 Example: ACL method failure due to an attempt to set grant and | |||
deny in a single ACE. | deny in a single ACE. | |||
In this example, user "ygoland", authenticated by information in the | In this example, user "ygoland", authenticated by information in | |||
Authorization header, tries to change the access control list on the | the Authorization header, tries to change the access control list | |||
resource http://www.foo.org/diamond/engagement-ring.gif. The ACL | on the resource http://www.foo.org/diamond/engagement-ring.gif. The | |||
request includes a single, syntactically and semantically incorrect | ACL request includes a single, syntactically and semantically | |||
ACE, which attempts to grant the collection principal identified by | incorrect ACE, which attempts to grant the group identified by the | |||
the URL http://www.foo.org/users/friends/ DAV:read privilege and deny | URL http://www.foo.org/users/friends/ DAV:read privilege and deny | |||
the principal identified by URL http://www.foo.org/users/ygoland-so | the principal identified by URL http://www.foo.org/users/ygoland-so | |||
(i.e., the user "ygoland-so") DAV:read privilege. However, it is | (i.e., the user "ygoland-so") DAV:read privilege. However, it is | |||
illegal to have multiple principal elements, as well as both a grant | illegal to have multiple principal elements, as well as both a | |||
and deny element in the same ACE, so the request fails due to poor | grant and deny element in the same ACE, so the request fails due to | |||
syntax. | poor syntax. | |||
>> Request << | >> Request << | |||
ACL /diamond/engagement-ring.gif HTTP/1.1 | ACL /diamond/engagement-ring.gif HTTP/1.1 | |||
Host: www.foo.org | Host: www.foo.org | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
Authorization: Digest username="ygoland", | Authorization: Digest username="ygoland", | |||
realm="users@foo.org", nonce="...", | realm="users@foo.org", nonce="...", | |||
uri="/diamond/engagement-ring.gif", response="...", opaque="..." | uri="/diamond/engagement-ring.gif", response="...", | |||
opaque="..." | ||||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:acl xmlns:D="DAV:"> | <D:acl xmlns:D="DAV:"> | |||
<D:ace> | <D:ace> | |||
<D:principal> | <D:principal> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 43] | ||||
<D:href>http://www.foo.org/users/friends/</D:href> | <D:href>http://www.foo.org/users/friends/</D:href> | |||
</D:principal> | </D:principal> | |||
<D:grant><D:read/></D:grant> | <D:grant><D:read/></D:grant> | |||
<D:principal> | <D:principal> | |||
<D:href>http://www.foo.org/users/ygoland-so</D:href> | <D:href>http://www.foo.org/users/ygoland-so</D:href> | |||
</D:principal> | </D:principal> | |||
<D:deny><D:read/></D:deny> | <D:deny><D:read/></D:deny> | |||
</D:ace> | </D:ace> | |||
</D:acl> | </D:acl> | |||
>> Response << | >> Response << | |||
HTTP/1.1 400 Bad Request | HTTP/1.1 400 Bad Request | |||
Content-Length: 0 | Content-Length: 0 | |||
Note that if the request had been divided into two ACEs, one to | Note that if the request had been divided into two ACEs, one to | |||
grant, and one to deny, the request would have been syntactically | grant, and one to deny, the request would have been syntactically | |||
well formed. | well formed. | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 39] | ||||
9 ACCESS CONTROL REPORTS | 9 ACCESS CONTROL REPORTS | |||
9.1 REPORT Method | 9.1 REPORT Method | |||
The REPORT method (defined in Section 3.6 of [RFCxxxx]) provides an | The REPORT method (defined in Section 3.6 of [RFC3253]) provides an | |||
extensible mechanism for obtaining information about a resource. | extensible mechanism for obtaining information about a resource. | |||
Unlike the PROPFIND method, which returns the value of one or more | Unlike the PROPFIND method, which returns the value of one or more | |||
named properties, the REPORT method can involve more complex | named properties, the REPORT method can involve more complex | |||
processing. REPORT is valuable in cases where the server has access | processing. REPORT is valuable in cases where the server has access | |||
to all of the information needed to perform the complex request (such | to all of the information needed to perform the complex request | |||
as a query), and where it would require multiple requests for the | (such as a query), and where it would require multiple requests for | |||
client to retrieve the information needed to perform the same | the client to retrieve the information needed to perform the same | |||
request. | request. | |||
9.2 DAV:acl-principal-props Report | 9.2 DAV:acl-principal-prop-set Report | |||
The DAV:acl-principle-props report returns, for all principals in the | The DAV:acl-principal-prop-set report returns, for all principals | |||
DAV:acl property that are identified by http(s) URLs, the value of | in the DAV:acl property that are identified by http(s) URLs or by a | |||
the properties specified in the REPORT request body. In the case | DAV:property principal, the value of the properties specified in | |||
where a principal URL appears multiple times, the DAV:acl-principal- | the REPORT request body. In the case where a principal URL appears | |||
props report MUST return the properties for that principal only once. | multiple times, the DAV:acl-principal-prop-set report MUST return | |||
the properties for that principal only once. | ||||
Marshalling | Marshalling | |||
The request body MUST be a DAV:acl-principal-props XML element. | The request body MUST be a DAV:acl-principal-prop-set XML element. | |||
<!ELEMENT acl-principal-props ANY> | <!ELEMENT acl-principal-prop-set ANY> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 44] | ||||
ANY value: a sequence of one or more elements, with at most one | ANY value: a sequence of one or more elements, with at most one | |||
DAV:prop element. | DAV:prop element. | |||
prop: see RFC 2518, Section 12.11 | prop: see RFC 2518, Section 12.11 | |||
The response body for a successful request MUST be a DAV:multistatus | The response body for a successful request MUST be a | |||
XML element (i.e., the response uses the same format as the response | DAV:multistatus XML element (i.e., the response uses the same | |||
for PROPFIND). | format as the response for PROPFIND). | |||
multistatus: see RFC 2518, Section 12.9 | multistatus: see RFC 2518, Section 12.9 | |||
The response body for a successful DAV:acl-principal-props REPORT | The response body for a successful DAV:acl-principal-prop-set | |||
request MUST contain a DAV:response element for each principal | REPORT request MUST contain a DAV:response element for each | |||
identified by an http(s) URL listed in a DAV:principal XML element of | principal identified by an http(s) URL listed in a DAV:principal | |||
an ACE within the DAV:acl property of the resource identified by the | XML element of an ACE within the DAV:acl property of the resource | |||
Request-URI. | identified by the Request-URI. | |||
9.2.1 Example: DAV:acl-principal-props Report | 9.2.1 Example: DAV:acl-principal-prop-set Report | |||
Resource http://www.webdav.org/index.html has an ACL with three ACEs: | Resource http://www.webdav.org/index.html has an ACL with three | |||
ACEs: | ||||
ACE #1: All principals (DAV:all) have DAV:read and DAV:read-current- | ACE #1: All principals (DAV:all) have DAV:read and DAV:read- | |||
user-privilege-set access. | current-user-privilege-set access. | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 40] | ||||
ACE #2: The principal identified by | ACE #2: The principal identified by | |||
http://www.webdav.org/people/gstein (the user ôgstein") is granted | http://www.webdav.org/people/gstein (the user "gstein") is granted | |||
DAV:write, DAV:write-acl, DAV:read-acl privileges. | DAV:write, DAV:write-acl, DAV:read-acl privileges. | |||
ACE #3: The collection principal identified by | ACE #3: The group identified by | |||
http://www.webdav.org/groups/authors/ (the ôauthors" group) is | http://www.webdav.org/groups/authors/ (the "authors" group) is | |||
granted DAV:write and DAV:read-acl privileges. | granted DAV:write and DAV:read-acl privileges. | |||
The following example shows a DAV:acl-principal-props report | The following example shows a DAV:acl-principal-prop-set report | |||
requesting the DAV:displayname property. It returns the value of | requesting the DAV:displayname property. It returns the value of | |||
DAV:displayname for resources http://www.webdav.org/people/gstein and | DAV:displayname for resources http://www.webdav.org/people/gstein | |||
http://www.webdav.org/groups/authors/ , but not for DAV:all, since | and http://www.webdav.org/groups/authors/ , but not for DAV:all, | |||
this is not an http(s) URL. | since this is not an http(s) URL. | |||
>> Request << | >> Request << | |||
REPORT /index.html HTTP/1.1 | REPORT /index.html HTTP/1.1 | |||
Host: www.webdav.org | Host: www.webdav.org | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:acl-principal-props xmlns:D="DAV:"> | <D:acl-principal-prop-set xmlns:D="DAV:"> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 45] | ||||
<D:prop> | <D:prop> | |||
<D:displayname/> | <D:displayname/> | |||
</D:prop> | </D:prop> | |||
</D:acl-principal-props> | </D:acl-principal-prop-set> | |||
>> Response << | >> Response << | |||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:multistatus xmlns:D="DAV:"> | <D:multistatus xmlns:D="DAV:"> | |||
<D:response> | <D:response> | |||
skipping to change at line 2082 | skipping to change at line 2225 | |||
<D:prop> | <D:prop> | |||
<D:displayname>Greg Stein</D:displayname> | <D:displayname>Greg Stein</D:displayname> | |||
</D:prop> | </D:prop> | |||
<D:status>HTTP/1.1 200 OK</D:status> | <D:status>HTTP/1.1 200 OK</D:status> | |||
</D:propstat> | </D:propstat> | |||
</D:response> | </D:response> | |||
<D:response> | <D:response> | |||
<D:href>http://www.webdav.org/groups/authors/</D:href> | <D:href>http://www.webdav.org/groups/authors/</D:href> | |||
<D:propstat> | <D:propstat> | |||
<D:prop> | <D:prop> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 41] | ||||
<D:displayname>Site authors</D:displayname> | <D:displayname>Site authors</D:displayname> | |||
</D:prop> | </D:prop> | |||
<D:status>HTTP/1.1 200 OK</D:status> | <D:status>HTTP/1.1 200 OK</D:status> | |||
</D:propstat> | </D:propstat> | |||
</D:response> | </D:response> | |||
</D:multistatus> | </D:multistatus> | |||
9.3 DAV:principal-match REPORT | 9.3 DAV:principal-match REPORT | |||
The DAV:principal-match REPORT is used to identify all members of a | The DAV:principal-match REPORT is used to identify all members of a | |||
collection that match the current user. In particular, if the | collection that match the current user. In particular, if the | |||
collection contains principals, the report can be used to identify | collection contains principals, the report can be used to identify | |||
all members of the collection that match the current user. | all members of the collection that match the current user. | |||
Alternatively, if the collection contains resources that have a | Alternatively, if the collection contains resources that have a | |||
property that identifies a principal (e.g. DAV:owner), then the | property that identifies a principal (e.g. DAV:owner), then the | |||
report can be used to identify all members of the collection whose | report can be used to identify all members of the collection whose | |||
property identifies a principal that matches the current user. For | property identifies a principal that matches the current user. For | |||
example, this report can return all of the resources in a collection | example, this report can return all of the resources in a | |||
hierarchy that are owned by the current user. | collection hierarchy that are owned by the current user. | |||
The Depth header (defined in Section 9.2 of [RFC2518]), with value | ||||
"infinity", can be used with this report. In this case, the report | ||||
operates on the collection in the Request-URI, as well as all child | ||||
collections, grandchild collections, etc. | ||||
Marshalling: | Marshalling: | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 46] | ||||
The request body MUST be a DAV:principal-match XML element. | The request body MUST be a DAV:principal-match XML element. | |||
<!ELEMENT principal-match ((principal-property | self), prop?)> | <!ELEMENT principal-match ((principal-property | self), prop?)> | |||
<!ELEMENT principal-property ANY> | <!ELEMENT principal-property ANY> | |||
ANY value: an element whose value identifies a property. The | ANY value: an element whose value identifies a property. The | |||
expectation is the value of the named property typically contains | expectation is the value of the named property typically | |||
an href element that contains the URI of a principal | contains an href element that contains the URI of a principal | |||
<!ELEMENT self EMPTY> | <!ELEMENT self EMPTY> | |||
prop: see RFC 2518, Section 12.11 | prop: see RFC 2518, Section 12.11 | |||
The response body for a successful request MUST be a DAV:multistatus | The response body for a successful request MUST be a | |||
XML element. | DAV:multistatus XML element. | |||
multistatus: see RFC 2518, Section 12.9 | multistatus: see RFC 2518, Section 12.9 | |||
The response body for a successful DAV:principal-match REPORT request | The response body for a successful DAV:principal-match REPORT | |||
MUST contain a DAV:response element for each member of the collection | request MUST contain a DAV:response element for each member of the | |||
that matches the current user. When the DAV:principal-property | collection that matches the current user. When the DAV:principal- | |||
element is used, a match occurs if the current user is the same as | property element is used, a match occurs if the current user is | |||
the principal identified by the URI found in the DAV:href element of | matched by the principal identified by the URI found in the | |||
the property identified by the DAV:principal-property element. When | DAV:href element of the property identified by the DAV:principal- | |||
the DAV:self element is used in a DAV:principal-match report issued | property element. When the DAV:self element is used in a | |||
against a collection principal, it matches a child of the collection | DAV:principal-match report issued against a group, it matches a | |||
member of the group if that child (a principal resource) identifies | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 42] | the same principal as the current user. | |||
principal if that child (a principal resource) identifies the same | ||||
principal as the current user. | ||||
If DAV:prop is specified in the request body, the properties | If DAV:prop is specified in the request body, the properties | |||
specified in the DAV:prop element MUST be reported in the | specified in the DAV:prop element MUST be reported in the | |||
DAV:response elements. | DAV:response elements. | |||
9.3.1 Example: DAV:principal-match REPORT | 9.3.1 Example: DAV:principal-match REPORT | |||
The following example identifies the members of the collection | The following example identifies the members of the collection | |||
identified by the URL http://www.webdav.org/doc/ that are owned by | identified by the URL http://www.webdav.org/doc/ that are owned by | |||
the current user. The current user (ôgclemm") is authenticated using | the current user. The current user ("gclemm") is authenticated | |||
Digest authentication. | using Digest authentication. | |||
>> Request << | >> Request << | |||
REPORT /doc/ HTTP/1.1 | REPORT /doc/ HTTP/1.1 | |||
Host: www.webdav.org | Host: www.webdav.org | |||
Authorization: Digest username="gclemm", | Authorization: Digest username="gclemm", | |||
realm="gclemm@webdav.org", nonce="...", | realm="gclemm@webdav.org", nonce="...", | |||
uri="/papers/", response="...", opaque="..." | uri="/papers/", response="...", opaque="..." | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
Depth: infinity | Depth: infinity | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 47] | ||||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:principal-match xmlns:D="DAV:"> | <D:principal-match xmlns:D="DAV:"> | |||
<D:principal-property> | <D:principal-property> | |||
<D:owner/> | <D:owner/> | |||
</D:principal-property> | </D:principal-property> | |||
</D:principal-match> | </D:principal-match> | |||
>> Response << | >> Response << | |||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
skipping to change at line 2186 | skipping to change at line 2322 | |||
<D:response> | <D:response> | |||
<D:href>http://www.webdav.org/doc/foo.html</D:href> | <D:href>http://www.webdav.org/doc/foo.html</D:href> | |||
<D:status>HTTP/1.1 200 OK</D:status> | <D:status>HTTP/1.1 200 OK</D:status> | |||
</D:response> | </D:response> | |||
<D:response> | <D:response> | |||
<D:href>http://www.webdav.org/doc/img/bar.gif</D:href> | <D:href>http://www.webdav.org/doc/img/bar.gif</D:href> | |||
<D:status>HTTP/1.1 200 OK</D:status> | <D:status>HTTP/1.1 200 OK</D:status> | |||
</D:response> | </D:response> | |||
</D:multistatus> | </D:multistatus> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 43] | ||||
9.4 DAV:principal-property-search REPORT | 9.4 DAV:principal-property-search REPORT | |||
The DAV:principal-property-search REPORT performs a substring search | The DAV:principal-property-search REPORT performs a substring | |||
on the character data value of specified properties. The server MUST | search on the character data value of specified properties. The | |||
perform caseless matching of substrings. Only properties defined on | server may perform caseless matching of substrings. Only properties | |||
principal or collection principal resources are searched. For | defined on principal resources are searched. For implementation | |||
implementation efficiency, servers do not typically support substring | efficiency, servers do not typically support substring searching on | |||
searching on all properties. A client can discover the set of | all properties. A client can discover the set of searchable | |||
searchable properties by using the principal-search-property-set | properties by using the DAV:principal-search-property-set REPORT, | |||
REPORT, defined in Section 9.5. | defined in Section 9.5. | |||
Implementation Note: The value of a WebDAV property is a sequence | Implementation Note: The value of a WebDAV property is a | |||
of well-formed XML, and hence can include any character in the | sequence of well-formed XML, and hence can include any character | |||
Unicode/ISO-10646 standard, that is, most known characters in | in the Unicode/ISO-10646 standard, that is, most known | |||
human languages. Due to the idiosyncrasies of case mapping across | characters in human languages. Due to the idiosyncrasies of case | |||
human languages, implementation of caseless matching is non- | mapping across human languages, implementation of caseless | |||
trivial. Implementors are strongly encouraged to consult | matching is non-trivial. Implementors are strongly encouraged to | |||
[CaseMap], especially Section 2.3 ("Caseless Matching"), for | consult [CaseMap], especially Section 2.3 ("Caseless Matching"), | |||
guidance when implementing their caseless matching algorithms. | for guidance when implementing their caseless matching | |||
algorithms. | ||||
Marshalling: | Marshalling: | |||
The DAV:principal-collection-set property of the resource identified | Clemm, Hopkins, Sedlar, Whitehead [Page 48] | |||
by the Request-URI specifies the scope of the DAV:principal-property- | The scope of the DAV:principal-property-search REPORT is all | |||
search REPORT, as follows: | principal resources that are members of a collection identified in | |||
DAV:principal-collection-set. If a group is in the scope of the | ||||
- All principal and collection principal resources identified in | DAV:principal-property-search REPORT, all members of that group are | |||
DAV:principal-collection-set are searched | also in the scope. | |||
- All principal and collection principal resources that are | ||||
descendents of a collection principal resource identified in | ||||
DAV:principal collection-set are searched. | ||||
Servers MUST support the DAV:principal-property-search REPORT on all | Servers MUST support the DAV:principal-property-search REPORT on | |||
principal collections identified in the value of a DAV:principal- | all principal collections identified in the value of a | |||
collection-set property. | DAV:principal-collection-set property. | |||
The request body MUST be a DAV:principal-property-search XML element | The request body MUST be a DAV:principal-property-search XML | |||
containing a search specification and an optional list of properties. | element containing a search specification and an optional list of | |||
For every principal that matches the search specification, the | properties. For every principal that matches the search | |||
response will contain the value of the properties on that principal. | specification, the response will contain the value of the | |||
properties on that principal. | ||||
<!ELEMENT principal-property-search ((property-search+), prop?) > | <!ELEMENT principal-property-search ((property-search+), prop?) > | |||
The DAV:property-search element contains a prop element enumerating | The DAV:property-search element contains a prop element enumerating | |||
the properties to be searched and a caseless-substring element, | the properties to be searched and a substring element, containing | |||
containing the search string. | the search string, and an optional tag indicating whether or not | |||
case-insensitive string matching should be done (the default is | ||||
implementation-dependent). | ||||
<!ELEMENT property-search (prop, caseless-substring) > | <!ELEMENT property-search (prop, substring, caseless?) > | |||
prop: see RFC 2518, Section 12.11 | prop: see RFC 2518, Section 12.11 | |||
<!ELEMENT caseless-substring #PCDATA > | <!ELEMENT substring #PCDATA > | |||
<!ELEMENT caseless EMPTY> | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 44] | ||||
Multiple property-search elements or multiple elements within a | Multiple property-search elements or multiple elements within a | |||
DAV:prop element will be interpreted with a logical AND. An empty | DAV:prop element will be interpreted with a logical AND. An empty | |||
DAV:caseless-substring element will match all properties specified in | DAV:substring element will match all properties specified in its | |||
its parent DAV:property-search element. | parent DAV:property-search element. | |||
The response body for a successful request MUST be a DAV:multistatus | The response body for a successful request MUST be a | |||
XML element. | DAV:multistatus XML element. | |||
multistatus: see RFC 2518, Section 12.9 | multistatus: see RFC 2518, Section 12.9 | |||
The response body for a successful DAV:principal-property-search | The response body for a successful DAV:principal-property-search | |||
REPORT request MUST contain a DAV:response element for each | REPORT request MUST contain a DAV:response element for each | |||
principal whose property values satisfy the search specification | principal whose property values satisfy the search specification | |||
given in DAV:principal-property-search. | given in DAV:principal-property-search. | |||
If DAV:prop is specified in the request body, the properties | If DAV:prop is specified in the request body, the properties | |||
specified in the DAV:prop element MUST be reported in the | specified in the DAV:prop element MUST be reported in the | |||
DAV:response elements. | DAV:response elements. | |||
Errors: | Clemm, Hopkins, Sedlar, Whitehead [Page 49] | |||
Preconditions: | ||||
If a request specifies a search of a property that is not | (DAV:non-searchable-property): All properties specified in the | |||
searchable, a 403 (Forbidden) response MUST be returned and the | DAV:principal-property-search REPORT must be searchable. | |||
response body MUST be a DAV:non-searchable-property element, | ||||
containing the unsearchable properties. | ||||
<!ELEMENT non-searchable-property (prop) > | ||||
9.4.1 Matching | 9.4.1 Matching | |||
There are several cases to consider when matching strings. The | There are several cases to consider when matching strings. The | |||
easiest case is when a property value is "simple" and has only | easiest case is when a property value is "simple" and has only | |||
character information item content (see [REC-XMLINFOSET]). For | character information item content (see [REC-XML-INFOSET]). For | |||
example, the search string "julian" would match the DAV:displayname | example, the search string "julian" would match the DAV:displayname | |||
property with value "Julian Reschke". Note that the on-the-wire | property with value "Julian Reschke". Note that the on-the-wire | |||
marshalling of DAV:displayname in this case is: | marshalling of DAV:displayname in this case is: | |||
<D:displayname xmlns:D="DAV:">Julian Reschke</D:displayname> | <D:displayname xmlns:D="DAV:">Julian Reschke</D:displayname> | |||
The name of the property is encoded into the XML element information | The name of the property is encoded into the XML element | |||
item, and the character information item content of the property is | information item, and the character information item content of the | |||
"Julian Reschke". | property is "Julian Reschke". | |||
The more complicated case occurred when properties have mixed content | The more complicated case occurred when properties have mixed | |||
(that is, compound values consisting of multiple child element items, | content (that is, compound values consisting of multiple child | |||
other types of information items, and character information item | element items, other types of information items, and character | |||
content). Consider the property http://www.webdav.org/props/aprop, | information item content). Consider the property | |||
marshalled as: | http://www.webdav.org/props/aprop, marshalled as: | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 45] | ||||
<W:aprop xmlns:W="http://www.webdav.org/props/"> | <W:aprop xmlns:W="http://www.webdav.org/props/"> | |||
{cdata 0}<W:elem1>{cdata 1}</W:elem1> | {cdata 0}<W:elem1>{cdata 1}</W:elem1> | |||
<W:elem2>{cdata 2}</W:elem2>{cdata 3} | <W:elem2>{cdata 2}</W:elem2>{cdata 3} | |||
</W:aprop> | </W:aprop> | |||
In this case, substring matching is performed on each individual | In this case, substring matching is performed on each individual | |||
contiguous sequence of character information items. In the example | contiguous sequence of character information items. In the example | |||
above, a search string would be compared to the four following | above, a search string would be compared to the four following | |||
strings: | strings: | |||
{cdata 0} | {cdata 0} | |||
{cdata 1} | {cdata 1} | |||
{cdata 2} | {cdata 2} | |||
{cdata 3} | {cdata 3} | |||
That is, four individual caseless substring matches would be | That is, four individual substring matches would be performed, one | |||
performed, one each for {cdata 0}, {cdata 1}, {cdata 2}, and {cdata | each for {cdata 0}, {cdata 1}, {cdata 2}, and {cdata 3}. | |||
3}. | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 50] | ||||
9.4.2 Example: successful DAV:principal-property-search REPORT | 9.4.2 Example: successful DAV:principal-property-search REPORT | |||
In this example, the client requests the principal URLs of all users | In this example, the client requests the principal URLs of all | |||
whose DAV:displayname property contains the substring "doE" and whose | users whose DAV:displayname property contains the substring "doE" | |||
http://BigCorp.com/ns/title property (that is, their professional | and whose http://BigCorp.com/ns/title property (that is, their | |||
title) contains "sales". In addition, the client requests five | professional title) contains "Sales". In addition, the client | |||
properties to be returned with the matching principals: | requests five properties to be returned with the matching | |||
principals: | ||||
In the DAV: namespace: displayname | In the DAV: namespace: displayname | |||
In the http://www.BigCorp.com/ns/ namespace: department, phone, | In the http://www.BigCorp.com/ns/ namespace: department, phone, | |||
office, salary | office, salary | |||
The response shows that two principal resources meet the search | The response shows that two principal resources meet the search | |||
specification, "John Doe" and "Zygdoebert Smith". The property | specification, "John Doe" and "Zygdoebert Smith". The property | |||
"salary" in namespace "http://www.BigCorp.com/ns/" is not returned, | "salary" in namespace "http://www.BigCorp.com/ns/" is not returned, | |||
since the principal making the request does not have sufficient | since the principal making the request does not have sufficient | |||
access permissions to read this property. | access permissions to read this property. | |||
skipping to change at line 2339 | skipping to change at line 2470 | |||
REPORT /users/ HTTP/1.1 | REPORT /users/ HTTP/1.1 | |||
Host: www.BigCorp.com | Host: www.BigCorp.com | |||
Content-Type: text/xml; charset=utf-8 | Content-Type: text/xml; charset=utf-8 | |||
Content-Length: xxxx | Content-Length: xxxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:principal-property-search xmlns:D="DAV:"> | <D:principal-property-search xmlns:D="DAV:"> | |||
<D:property-search> | <D:property-search> | |||
<D:prop> | <D:prop> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 46] | ||||
<D:displayname/> | <D:displayname/> | |||
</D:prop> | </D:prop> | |||
<D:caseless-substring>doE</D:caseless-substring> | <D:substring>doE</D:substring> | |||
<D:caseless/> | ||||
</D:property-search> | </D:property-search> | |||
<D:property-search> | <D:property-search> | |||
<D:prop xmlns:B="http://www.BigCorp.com/ns/"> | <D:prop xmlns:B="http://www.BigCorp.com/ns/"> | |||
<B:title/> | <B:title/> | |||
</D:prop> | </D:prop> | |||
<D:caseless-substring>sales</D:caseless-substring> | <D:substring>Sales</D: substring> | |||
</D:property-search> | </D:property-search> | |||
<D:prop xmlns:B="http://www.BigCorp.com/ns/"> | <D:prop xmlns:B="http://www.BigCorp.com/ns/"> | |||
<D:displayname/> | <D:displayname/> | |||
<B:department/> | <B:department/> | |||
<B:phone/> | <B:phone/> | |||
<B:office/> | <B:office/> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 51] | ||||
<B:salary/> | <B:salary/> | |||
</D:prop> | </D:prop> | |||
</D:principal-property-search> | </D:principal-property-search> | |||
>> Response << | >> Response << | |||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
Content-Type: text/xml; charset=utf-8 | Content-Type: text/xml; charset=utf-8 | |||
Content-Length: xxxx | Content-Length: xxxx | |||
skipping to change at line 2389 | skipping to change at line 2521 | |||
<D:propstat> | <D:propstat> | |||
<D:prop> | <D:prop> | |||
<B:salary/> | <B:salary/> | |||
</D:prop> | </D:prop> | |||
<D:status>HTTP/1.1 403 Forbidden</D:status> | <D:status>HTTP/1.1 403 Forbidden</D:status> | |||
</D:propstat> | </D:propstat> | |||
</D:response> | </D:response> | |||
<D:response> | <D:response> | |||
<D:href>http://www.BigCorp.com/users/zsmith</D:href> | <D:href>http://www.BigCorp.com/users/zsmith</D:href> | |||
<D:propstat> | <D:propstat> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 47] | ||||
<D:prop> | <D:prop> | |||
<D:displayname>Zygdoebert Smith</D:displayname> | <D:displayname>Zygdoebert Smith</D:displayname> | |||
<B:department>Gadget Sales</B:department> | <B:department>Gadget Sales</B:department> | |||
<B:phone>234-7654</B:phone> | <B:phone>234-7654</B:phone> | |||
<B:office>114</B:office> | <B:office>114</B:office> | |||
</D:prop> | </D:prop> | |||
<D:status>HTTP/1.1 200 OK</D:status> | <D:status>HTTP/1.1 200 OK</D:status> | |||
</D:propstat> | </D:propstat> | |||
<D:propstat> | <D:propstat> | |||
<D:prop> | <D:prop> | |||
<B:salary/> | <B:salary/> | |||
</D:prop> | </D:prop> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 52] | ||||
<D:status>HTTP/1.1 403 Forbidden</D:status> | <D:status>HTTP/1.1 403 Forbidden</D:status> | |||
</D:propstat> | </D:propstat> | |||
</D:response> | </D:response> | |||
</D:multistatus> | </D:multistatus> | |||
9.4.3 Example: Unsuccessful DAV:principal-property-search REPORT | 9.4.3 Example: Unsuccessful DAV:principal-property-search REPORT | |||
In this example, the client requests a search on the non-searchable | In this example, the client requests a search on the non-searchable | |||
property "phone" in the namespace "http://www.BigCorp.com/ns/". The | property "phone" in the namespace "http://www.BigCorp.com/ns/". | |||
response is a 403 (Forbidden), with a response body containing the | The response is a 403 (Forbidden), with a response body containing | |||
XML element DAV:non-searchable-property listing the non-searchable | a DAV:non-searchable-property XML element as the value of a | |||
property. | DAV:error XML element. | |||
>> Request << | >> Request << | |||
REPORT /users/ HTTP/1.1 | REPORT /users/ HTTP/1.1 | |||
Host: www.BigCorp.com | Host: www.BigCorp.com | |||
Content-Type: text/xml; charset=utf-8 | Content-Type: text/xml; charset=utf-8 | |||
Content-Length: xxxx | Content-Length: xxxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:principal-property-search xmlns:D="DAV:"> | <D:principal-property-search xmlns:D="DAV:"> | |||
skipping to change at line 2439 | skipping to change at line 2571 | |||
<D:caseless-substring>232</D:caseless-substring> | <D:caseless-substring>232</D:caseless-substring> | |||
</D:property-search> | </D:property-search> | |||
</D:principal-property-search> | </D:principal-property-search> | |||
>> Response << | >> Response << | |||
HTTP/1.1 403 FORBIDDEN | HTTP/1.1 403 FORBIDDEN | |||
Content-Type: text/xml; charset=utf-8 | Content-Type: text/xml; charset=utf-8 | |||
Content-Length: xxxx | Content-Length: xxxx | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 48] | ||||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:non-searchable-property xmlns:D="DAV:"> | <D:error xmlns:D="DAV:"> | |||
<D:non-searchable-property> | ||||
<D:prop xmlns:B="http://www.BigCorp.com/ns/"> | <D:prop xmlns:B="http://www.BigCorp.com/ns/"> | |||
<B:phone/> | <B:phone/> | |||
</D:prop> | </D:prop> | |||
</D:non-searchable-property> | </D:non-searchable-property> | |||
</D:error> | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 53] | ||||
9.5 DAV:principal-search-property-set REPORT | 9.5 DAV:principal-search-property-set REPORT | |||
The DAV:principal-search-property-set REPORT identifies those | The DAV:principal-search-property-set REPORT identifies those | |||
properties that may be searched using the DAV:principal-property- | properties that may be searched using the DAV:principal-property- | |||
search REPORT (defined in Section 9.4). The DAV:principal-collection- | search REPORT (defined in Section 9.4). | |||
set property of the resource identified by the Request-URI specifies | ||||
the scope of the DAV:principal-search-property-set REPORT, as | ||||
follows: | ||||
- All principal and collection principal resources identified in | ||||
DAV:principal-collection-set are in scope | ||||
- All principal and collection principal resources that are | ||||
descendents of a collection principal resource identified in | ||||
DAV:principal collection-set are also in scope. | ||||
Principals and collection principals within this scope are examined | ||||
for searchable properties. | ||||
Servers MUST support the DAV:principal-search-property-set REPORT on | Servers MUST support the DAV:principal-search-property-set REPORT | |||
all principal collections identified in the value of a DAV:principal- | on all principal collections identified in the value of a | |||
collection-set property. | DAV:principal-collection-set property. | |||
An access control protocol user agent could use the results of the | An access control protocol user agent could use the results of the | |||
DAV:principal-search-property-set REPORT to present a query interface | DAV:principal-search-property-set REPORT to present a query | |||
to the user for retrieving principals. | interface to the user for retrieving principals. | |||
Marshalling: | Marshalling: | |||
The request body MUST be an empty DAV:principal-search-property-set | The request body MUST be an empty DAV:principal-search-property-set | |||
XML element. | XML element. | |||
The response body MUST be a DAV:principal-search-property-set XML | The response body MUST be a DAV:principal-search-property-set XML | |||
element, containing a DAV:principal-search-property XML element for | element, containing a DAV:principal-search-property XML element for | |||
each property that may be searched with the DAV:principal-property- | each property that may be searched with the DAV:principal-property- | |||
search REPORT. A server MAY limit its response to just a subset of | search REPORT. A server MAY limit its response to just a subset of | |||
the searchable properties, such as those likely to be useful to an | the searchable properties, such as those likely to be useful to an | |||
interactive access control client. | interactive access control client. | |||
<!ELEMENT principal-search-property-set (principal-search- | <!ELEMENT principal-search-property-set (principal-search- | |||
property*) > | property*) > | |||
Each DAV:principal-search-property XML element contains exactly one | Each DAV:principal-search-property XML element contains exactly one | |||
searchable property, and a description of the property. | searchable property, and a description of the property. | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 49] | ||||
<!ELEMENT principal-search-property (prop, description) > | <!ELEMENT principal-search-property (prop, description) > | |||
The DAV:prop element contains one principal property on which the | The DAV:prop element contains one principal property on which the | |||
server is able to perform DAV:principal-property-search REPORTs. | server is able to perform a DAV:principal-property-search REPORT. | |||
prop: see RFC 2518, Section 12.11 | prop: see RFC 2518, Section 12.11 | |||
The description element is a human-readable description of what | The description element is a human-readable description of what | |||
information this property represents. Servers MUST indicate the human | information this property represents. Servers MUST indicate the | |||
language of the description using the xml:lang attribute and SHOULD | human language of the description using the xml:lang attribute and | |||
consider the HTTP Accept-Language request header when selecting one | SHOULD consider the HTTP Accept-Language request header when | |||
of multiple available languages. | selecting one of multiple available languages. | |||
<!ELEMENT description #PCDATA > | <!ELEMENT description #PCDATA > | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 54] | ||||
9.5.1 Example: DAV:principal-search-property-set REPORT | 9.5.1 Example: DAV:principal-search-property-set REPORT | |||
In this example, the client determines the set of searchable | In this example, the client determines the set of searchable | |||
principal properties by requesting the DAV:principal-search-property- | principal properties by requesting the DAV:principal-search- | |||
set REPORT on the root of the serverÆs principal URL collection set, | property-set REPORT on the root of the server's principal URL | |||
identified by http://www.BigCorp.com/users/. | collection set, identified by http://www.BigCorp.com/users/. | |||
>> Request << | >> Request << | |||
REPORT /users/ HTTP/1.1 | REPORT /users/ HTTP/1.1 | |||
Host: www.BigCorp.com | Host: www.BigCorp.com | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Content-Length: xxx | Content-Length: xxx | |||
Accept-Language: en, de | Accept-Language: en, de | |||
Authorization: BASIC d2FubmFtYWs6cGFzc3dvcmQ= | Authorization: BASIC d2FubmFtYWs6cGFzc3dvcmQ= | |||
skipping to change at line 2543 | skipping to change at line 2665 | |||
<D:principal-search-property-set xmlns:D="DAV:"> | <D:principal-search-property-set xmlns:D="DAV:"> | |||
<D:principal-search-property> | <D:principal-search-property> | |||
<D:prop> | <D:prop> | |||
<D:displayname/> | <D:displayname/> | |||
</D:prop> | </D:prop> | |||
<D:description xml:lang="en">Full name</D:description> | <D:description xml:lang="en">Full name</D:description> | |||
</D:principal-search-property> | </D:principal-search-property> | |||
<D:principal-search-property> | <D:principal-search-property> | |||
<D:prop xmlns:B="http://BigCorp.com/ns/"> | <D:prop xmlns:B="http://BigCorp.com/ns/"> | |||
<B:title/> | <B:title/> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 50] | ||||
</D:prop> | </D:prop> | |||
<D:description xml:lang="en">Job title</D:description> | <D:description xml:lang="en">Job title</D:description> | |||
</D:principal-search-property> | </D:principal-search-property> | |||
</D:principal-search-property-set> | </D:principal-search-property-set> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 55] | ||||
10 XML PROCESSING | 10 XML PROCESSING | |||
Implementations of this specification MUST support the XML element | Implementations of this specification MUST support the XML element | |||
ignore rule, as specified in Section 23.3.2 of [RFC2518], and the XML | ignore rule, as specified in Section 23.3.2 of [RFC2518], and the | |||
Namespace Recommendation [REC-XML-NAMES]. | XML Namespacerecommendation [REC-XML-NAMES]. | |||
Note that use of the DAV namespace is reserved for XML elements and | Note that use of the DAV namespace is reserved for XML elements and | |||
property names defined in a standards-track or Experimental IETF RFC. | property names defined in a standards-track or Experimental IETF | |||
RFC. | ||||
11 INTERNATIONALIZATION CONSIDERATIONS | 11 INTERNATIONALIZATION CONSIDERATIONS | |||
In this specification, the only human-readable content can be found | In this specification, the only human-readable content can be found | |||
in the description XML element, found within the DAV:supported- | in the description XML element, found within the DAV:supported- | |||
privilege-set property. This element contains a human-readable | privilege-set property. This element contains a human-readable | |||
description of the capabilities controlled by a privilege. As a | description of the capabilities controlled by a privilege. As a | |||
result, the description element must be capable of representing | result, the description element must be capable of representing | |||
descriptions in multiple character sets. Since the description | descriptions in multiple character sets. Since the description | |||
element is found within a WebDAV property, it is represented on-the- | element is found within a WebDAV property, it is represented on- | |||
wire as XML [REC-XML], and hence can leverage XML's language tagging | the-wire as XML [REC-XML], and hence can leverage XML's language | |||
and character set encoding capabilities. Specifically, XML processors | tagging and character set encoding capabilities. Specifically, XML | |||
must, at minimum, be able to read XML elements encoded using the UTF- | processors must, at minimum, be able to read XML elements encoded | |||
8 [UTF-8] encoding of the ISO 10646 multilingual plane. XML examples | using the UTF-8 [UTF-8] encoding of the ISO 10646 multilingual | |||
in this specification demonstrate use of the charset parameter of the | plane. XML examples in this specification demonstrate use of the | |||
Content-Type header, as defined in [RFC3023], as well as the XML | charset parameter of the Content-Type header, as defined in | |||
"encoding" attribute, which together provide charset identification | [RFC3023], as well as the XML "encoding" attribute, which together | |||
information for MIME and XML processors. Furthermore, this | provide charset identification information for MIME and XML | |||
specification requires server implementations to tag description | processors. Futhermore, this specification requires server | |||
fields with the xml:lang attribute (see Section 2.12 of [REC-XML]), | implementations to tag description fields with the xml:lang | |||
which specifies the human language of the description. Additionally, | attribute (see Section 2.12 of [REC-XML]), which specifies the | |||
server implementations should take into account the value of the | human language of the description. Additionally, server | |||
Accept-Language HTTP header to determine which description string to | implementations should take into account the value of the Accept- | |||
Language HTTP header to determine which description string to | ||||
return. | return. | |||
For XML elements other than the description element, it is expected | For XML elements other than the description element, it is expected | |||
that implementations will treat the property names, privilege names, | that implementations will treat the property names, privilege | |||
and values as tokens, and convert these tokens into human-readable | names, and values as tokens, and convert these tokens into human- | |||
text in the user's language and character set when displayed to a | readable text in the user's language and character set when | |||
person. Only a generic WebDAV property display utility would display | displayed to a person. Only a generic WebDAV property display | |||
these values in their raw form to a human user. | utility would display these values in their raw form to a human | |||
user. | ||||
For error reporting, we follow the convention of HTTP/1.1 status | For error reporting, we follow the convention of HTTP/1.1 status | |||
codes, including with each status code a short, English description | codes, including with each status code a short, English description | |||
of the code (e.g., 200 (OK)). While the possibility exists that a | of the code (e.g., 200 (OK)). While the possibility exists that a | |||
poorly crafted user agent would display this message to a user, | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 51] | Clemm, Hopkins, Sedlar, Whitehead [Page 56] | |||
internationalized applications will ignore this message, and display | poorly crafted user agent would display this message to a user, | |||
an appropriate message in the user's language and character set. | internationalized applications will ignore this message, and | |||
display an appropriate message in the user's language and character | ||||
set. | ||||
Further internationalization considerations for this protocol are | Further internationalization considerations for this protocol are | |||
described in the WebDAV Distributed Authoring protocol specification | described in the WebDAV Distributed Authoring protocol | |||
[RFC2518]. | specification [RFC2518]. | |||
12 SECURITY CONSIDERATIONS | 12 SECURITY CONSIDERATIONS | |||
Applications and users of this access control protocol should be | Applications and users of this access control protocol should be | |||
aware of several security considerations, detailed below. In addition | aware of several security considerations, detailed below. In | |||
to the discussion in this document, the security considerations | addition to the discussion in this document, the security | |||
detailed in the HTTP/1.1 specification [RFC2616], the WebDAV | considerations detailed in the HTTP/1.1 specification [RFC2616], | |||
Distributed Authoring Protocol specification [RFC2518], and the XML | the WebDAV Distributed Authoring Protocol specification [RFC2518], | |||
Media Types specification [RFC3023] should be considered in a | and the XML Media Types specification [RFC3023] should be | |||
security analysis of this protocol. | considered in a security analysis of this protocol. | |||
12.1 Increased Risk of Compromised Users | 12.1 Increased Risk of Compromised Users | |||
In the absence of a mechanism for remotely manipulating access | In the absence of a mechanism for remotely manipulating access | |||
control lists, if a single user's authentication credentials are | control lists, if a single user's authentication credentials are | |||
compromised, only those resources for which the user has access | compromised, only those resources for which the user has access | |||
permission can be read, modified, moved, or deleted. With the | permission can be read, modified, moved, or deleted. With the | |||
introduction of this access control protocol, if a single compromised | introduction of this access control protocol, if a single | |||
user has the ability to change ACLs for a broad range of other users | compromised user has the ability to change ACLs for a broad range | |||
(e.g., a super-user), the number of resources that could be altered | of other users (e.g., a super-user), the number of resources that | |||
by a single compromised user increases. This risk can be mitigated by | could be altered by a single compromised user increases. This risk | |||
limiting the number of people who have write-acl privileges across a | can be mitigated by limiting the number of people who have write- | |||
broad range of resources. | acl privileges across a broad range of resources. | |||
12.2 Risks of the DAV:read-acl and DAV:current-user-privilege-set | 12.2 Risks of the DAV:read-acl and DAV:current-user-privilege-set | |||
Privileges | Privileges | |||
The ability to read the access privileges (stored in the DAV:acl | The ability to read the access privileges (stored in the DAV:acl | |||
property), or the privileges permitted the currently authenticated | property), or the privileges permitted the currently authenticated | |||
user (stored in the DAV:current-user-privilege-set property) on a | user (stored in the DAV:current-user-privilege-set property) on a | |||
resource may seem innocuous, since reading an ACL cannot possibly | resource may seem innocuous, since reading an ACL cannot possibly | |||
affect the resource's state. However, if all resources have world- | affect the resource's state. However, if all resources have world- | |||
readable ACLs, it is possible to perform an exhaustive search for | readable ACLs, it is possible to perform an exhaustive search for | |||
those resources that have inadvertently left themselves in a | those resources that have inadvertently left themselves in a | |||
vulnerable state, such as being world-writeable. In particular, the | vulnerable state, such as being world-writeable. In particular, the | |||
property retrieval method PROPFIND, executed with Depth infinity on | property retrieval method PROPFIND, executed with Depth infinity on | |||
an entire hierarchy, is a very efficient way to retrieve the DAV:acl | an entire hierarchy, is a very efficient way to retrieve the | |||
or DAV:current-user-privilege-set properties. Once found, this | DAV:acl or DAV:current-user-privilege-set properties. Once found, | |||
vulnerability can be exploited by a denial of service attack in which | this vulnerability can be exploited by a denial of service attack | |||
the open resource is repeatedly overwritten. Alternately, writeable | ||||
resources can be modified in undesirable ways. | Clemm, Hopkins, Sedlar, Whitehead [Page 57] | |||
in which the open resource is repeatedly overwritten. Alternately, | ||||
writeable resources can be modified in undesirable ways. | ||||
To reduce this risk, read-acl privileges should not be granted to | To reduce this risk, read-acl privileges should not be granted to | |||
unauthenticated principals, and restrictions on read-acl and read- | unauthenticated principals, and restrictions on read-acl and read- | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 52] | ||||
current-user-privilege-set privileges for authenticated principals | current-user-privilege-set privileges for authenticated principals | |||
should be carefully analyzed when deploying this protocol. Access to | should be carefully analyzed when deploying this protocol. Access | |||
the current-user-privilege-set property will involve a tradeoff of | to the current-user-privilege-set property will involve a tradeoff | |||
usability versus security. When the current-user-privilege-set is | of usability versus security. When the current-user-privilege-set | |||
visible, user interfaces are expected to provide enhanced information | is visible, user interfaces are expected to provide enhanced | |||
concerning permitted and restricted operations, yet this information | information concerning permitted and restricted operations, yet | |||
may also indicate a vulnerability that could be exploited. Deployment | this information may also indicate a vulnerability that could be | |||
of this protocol will need to evaluate this tradeoff in light of the | exploited. Deployment of this protocol will need to evaluate this | |||
requirements of the deployment environment. | tradeoff in light of the requirements of the deployment | |||
environment. | ||||
12.3 No Foreknowledge of Initial ACL | 12.3 No Foreknowledge of Initial ACL | |||
In an effort to reduce protocol complexity, this protocol | In an effort to reduce protocol complexity, this protocol | |||
specification intentionally does not address the issue of how to | specification intentionally does not address the issue of how to | |||
manage or discover the initial ACL that is placed upon a resource | manage or discover the initial ACL that is placed upon a resource | |||
when it is created. The only way to discover the initial ACL is to | when it is created. The only way to discover the initial ACL is to | |||
create a new resource, then retrieve the value of the DAV:acl | create a new resource, then retrieve the value of the DAV:acl | |||
property. This assumes the principal creating the resource also has | property. This assumes the principal creating the resource also has | |||
been granted the DAV:read-acl privilege. | been granted the DAV:read-acl privilege. | |||
As a result, it is possible that a principal could create a resource, | As a result, it is possible that a principal could create a | |||
and then discover that its ACL grants privileges that are | resource, and then discover that its ACL grants privileges that are | |||
undesirable. Furthermore, this protocol makes it possible (though | undesirable. Furthermore, this protocol makes it possible (though | |||
unlikely) that the creating principal could be unable to modify the | unlikely) that the creating principal could be unable to modify the | |||
ACL, or even delete the resource. Even when the ACL can be modified, | ACL, or even delete the resource. Even when the ACL can be | |||
there will be a short period of time when the resource exists with | modified, there will be a short period of time when the resource | |||
the initial ACL before its new ACL can be set. | exists with the initial ACL before its new ACL can be set. | |||
Several factors mitigate this risk. Human principals are often aware | Several factors mitigate this risk. Human principals are often | |||
of the default access permissions in their editing environments and | aware of the default access permissions in their editing | |||
take this into account when writing information. Furthermore, default | environments and take this into account when writing information. | |||
privilege policies are usually very conservative, limiting the | Furthermore, default privilege policies are usually very | |||
privileges granted by the initial ACL. | conservative, limiting the privileges granted by the initial ACL. | |||
13 AUTHENTICATION | 13 AUTHENTICATION | |||
Authentication mechanisms defined for use with HTTP and WebDAV also | Authentication mechanisms defined for use with HTTP and WebDAV | |||
apply to this WebDAV Access Control Protocol, in particular the Basic | also apply to this WebDAV Access Control Protocol, in particular | |||
and Digest authentication mechanisms defined in [RFC2617]. | the Basic and Digest authentication mechanisms defined in | |||
[RFC2617]. | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 58] | ||||
14 IANA CONSIDERATIONS | 14 IANA CONSIDERATIONS | |||
This document uses the namespace defined by [RFC2518] for XML | This document uses the namespace defined by [RFC2518] for XML | |||
elements. All other IANA considerations mentioned in [RFC2518] also | elements. All other IANA considerations mentioned in [RFC2518] | |||
applicable to WebDAV ACL. | also applicable to WebDAV ACL. | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 53] | ||||
15 INTELLECTUAL PROPERTY | 15 INTELLECTUAL PROPERTY | |||
The following notice is copied from RFC 2026, section 10.4, and | The following notice is copied from RFC 2026, section 10.4, and | |||
describes the position of the IETF concerning intellectual property | describes the position of the IETF concerning intellectual property | |||
claims made against this document. | claims made against this document. | |||
The IETF takes no position regarding the validity or scope of any | The IETF takes no position regarding the validity or scope of any | |||
intellectual property or other rights that might be claimed to | intellectual property or other rights that might be claimed to | |||
pertain to the implementation or use other technology described in | pertain to the implementation or use other technology described in | |||
this document or the extent to which any license under such rights | this document or the extent to which any license under such rights | |||
might or might not be available; neither does it represent that it | might or might not be available; neither does it represent that it | |||
has made any effort to identify any such rights. Information on the | has made any effort to identify any such rights. Information on | |||
IETF's procedures with respect to rights in standards-track and | the IETF's procedures with respect to rights in standards-track and | |||
standards-related documentation can be found in BCP-11. Copies of | standards-related documentation can be found in BCP-11. Copies of | |||
claims of rights made available for publication and any assurances of | claims of rights made available for publication and any assurances | |||
licenses to be made available, or the result of an attempt made to | of licenses to be made available, or the result of an attempt made | |||
obtain a general license or permission for the use of such | to obtain a general license or permission for the use of such | |||
proprietary rights by implementers or users of this specification can | proprietary rights by implementers or users of this specification | |||
be obtained from the IETF Secretariat. | can be obtained from the IETF Secretariat. | |||
The IETF invites any interested party to bring to its attention any | The IETF invites any interested party to bring to its attention any | |||
copyrights, patents or patent applications, or other proprietary | copyrights, patents or patent applications, or other proprietary | |||
rights that may cover technology that may be required to practice | rights that may cover technology that may be required to practice | |||
this standard. Please address the information to the IETF Executive | this standard. Please address the information to the IETF | |||
Director. | Executive Director. | |||
16 ACKNOWLEDGEMENTS | 16 ACKNOWLEDGEMENTS | |||
This protocol is the collaborative product of the WebDAV ACL design | This protocol is the collaborative product of the WebDAV ACL design | |||
team: Bernard Chester, Geoff Clemm, Anne Hopkins, Barry Lind, Sean | team: Bernard Chester, Geoff Clemm, Anne Hopkins, Barry Lind, Sean | |||
Lyndersay, Eric Sedlar, Greg Stein, and Jim Whitehead. The authors | Lyndersay, Eric Sedlar, Greg Stein, and Jim Whitehead. The authors | |||
are grateful for the detailed review and comments provided by Jim | are grateful for the detailed review and comments provided by Jim | |||
Amsden, Gino Basso, Murthy Chintalapati, Dennis Hamilton, Laurie | Amsden, Gino Basso, Murthy Chintalapati, Dennis Hamilton, Laurie | |||
Harper, Ron Jacobs, Chris Knight, Remy Maucherat, Larry Masinter, | Harper, Ron Jacobs, Chris Knight, Remy Maucherat, Larry Masinter, | |||
Yaron Goland, Lisa Dusseault, Joe Orton, Stefan Eissing, Julian | Yaron Goland, Lisa Dusseault, Joe Orton, Stefan Eissing, Julian | |||
Reschke, Keith Wannamaker, Tim Ellison, and Dylan Barrell. We thank | Reschke, Keith Wannamaker, Tim Ellison, Peter Raymond, and Dylan | |||
Keith Wannamaker for the initial text of the principal property | Barrell. We thank Keith Wannamaker for the initial text of the | |||
search sections. Prior work on WebDAV access control protocols has | principal property search sections. Prior work on WebDAV access | |||
been performed by Yaron Goland, Paul Leach, Lisa Dusseault, Howard | control protocols has been performed by Yaron Goland, Paul Leach, | |||
Palmer, and Jon Radoff. We would like to acknowledge the foundation | Lisa Dusseault, Howard Palmer, and Jon Radoff. We would like to | |||
laid for us by the authors of the DeltaV, WebDAV and HTTP protocols | acknowledge the foundation laid for us by the authors of the | |||
upon which this protocol is layered, and the invaluable feedback from | ||||
the WebDAV working group. | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 54] | Clemm, Hopkins, Sedlar, Whitehead [Page 59] | |||
DeltaV, WebDAV and HTTP protocols upon which this protocol is | ||||
layered, and the invaluable feedback from the WebDAV working group. | ||||
17 REFERENCES | 17 REFERENCES | |||
17.1 Normative References | 17.1 Normative References | |||
[RFC2119] S.Bradner, "Key words for use in RFCs to Indicate | [RFC2119] S.Bradner, "Key words for use in RFCs to Indicate | |||
Requirement Levels." RFC 2119, BCP 14, Harvard, March, 1997. | Requirement Levels." RFC 2119, BCP 14, March, 1997. | |||
[REC-XML] T. Bray, J. Paoli, C.M. Sperberg-McQueen, "Extensible | [REC-XML] T. Bray, J. Paoli, C.M. Sperberg-McQueen, "Extensible | |||
Markup Language (XML)." World Wide Web Consortium Recommendation REC- | Markup Language (XML)." World Wide Web Consortium Recommendation | |||
xml.http://www.w3.org/TR/REC-xml | REC-xml.http://www.w3.org/TR/REC-xml | |||
[REC-XML-NAMES] T. Bray, D. Hollander, A. Layman, ôName Spaces in | [REC-XML-NAMES] T. Bray, D. Hollander, A. Layman, "Name Spaces in | |||
XML" World Wide Web Consortium Recommendation REC-xml-names. | XML" World Wide Web Consortium Recommendation REC-xml-names. | |||
http://www.w3.org/TR/REC-xml-names/ | http://www.w3.org/TR/REC-xml-names/ | |||
[RFCxxxx] G. Clemm, J. Amsden, T. Ellison, C. Kaler, J. Whitehead, | [RFC3253] G. Clemm, J. Amsden, T. Ellison, C. Kaler, J. Whitehead, | |||
"Versioning Extensions to WebDAV." RFC xxxx. Rational, IBM, | "Versioning Extensions to WebDAV." RFC 3253, March 2002. | |||
Microsoft, U.C. Santa Cruz, 2001. | ||||
[REC-XML-INFOSET] J. Cowan, R. Tobin, "XML Information Set." World | [REC-XML-INFOSET] J. Cowan, R. Tobin, "XML Information Set." World | |||
Wide Web Consortium Recommendation REC-xml-infoset. | Wide Web Consortium Recommendation REC-xml-infoset. | |||
http://www.w3.org/TR/xml-infoset/ | http://www.w3.org/TR/xml-infoset/ | |||
[RFC2616] R. Fielding, J. Gettys, J. C. Mogul, H. Frystyk, L. | [RFC2616] R. Fielding, J. Gettys, J. C. Mogul, H. Frystyk, L. | |||
Masinter, P. Leach, and T. Berners-Lee, "Hypertext Transfer Protocol | Masinter, P. Leach, and T. Berners-Lee, "Hypertext Transfer | |||
-- HTTP/1.1." RFC 2616. U.C. Irvine, Compaq, Xerox, Microsoft, | Protocol -- HTTP/1.1." RFC 2616, June, 1999. | |||
MIT/LCS, June, 1999. | ||||
[RFC2617] J. Franks, P. Hallam-Baker, J. Hostetler, S. Lawrence, P. | [RFC2617] J. Franks, P. Hallam-Baker, J. Hostetler, S. Lawrence, P. | |||
Leach, A. Luotonen, L. Stewart, "HTTP Authentication: Basic and | Leach, A. Luotonen, L. Stewart, "HTTP Authentication: Basic and | |||
Digest Access Authentication." RFC 2617. Northwestern University, | Digest Access Authentication." RFC 2617, June, 1999. | |||
Verisign, AbiSource, Agranat, Microsoft, Netscape, Open Market, June, | ||||
1999. | ||||
[RFC2518] Y. Goland, E. Whitehead, A. Faizi, S. R. Carter, D. Jensen, | [RFC2518] Y. Goland, E. Whitehead, A. Faizi, S. R. Carter, D. | |||
"HTTP Extensions for Distributed Authoring -- WEBDAV." RFC 2518. | Jensen, "HTTP Extensions for Distributed Authoring -- WEBDAV." RFC | |||
Microsoft, U.C. Irvine, Netscape, Novell, February, 1999. | 2518, February, 1999. | |||
[RFC2368] P. Hoffman, L. Masinter, J. Zawinski, "The mailto URL | [RFC2368] P. Hoffman, L. Masinter, J. Zawinski, "The mailto URL | |||
scheme." RFC 2368. Internet Mail Consortium, Xerox, Netscape, July, | scheme." RFC 2368, July, 1998. | |||
1998. | ||||
[RFC3023] M. Murata, S. St.Laurent, D. Kohn, "XML Media Types." RFC | [RFC3023] M. Murata, S. St.Laurent, D. Kohn, "XML Media Types." RFC | |||
3023. IBM Tokyo Research Laboratory, simonstl.com, Skymoon Ventures, | 3023, January, 2001. | |||
January, 2001. | ||||
[UTF-8] F. Yergeau, "UTF-8, a transformation format of Unicode and | [UTF-8] F. Yergeau, "UTF-8, a transformation format of Unicode and | |||
ISO 10646." RFC 2279. Alis Technologies. January, 1998. | ISO 10646." RFC 2279, January, 1998. | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 55] | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 60] | ||||
17.2 Informational References | 17.2 Informational References | |||
[RFC2026] S.Bradner, "The Internet Standards Process û Revision 3." | [RFC2026] S.Bradner, "The Internet Standards Process - Revision 3." | |||
RFC 2026, BCP 9. Harvard, October, 1996. | RFC 2026, BCP 9. Harvard, October, 1996. | |||
[RFC2255] T. Howes, M. Smith, "The LDAP URL Format." RFC 2255. | [RFC2255] T. Howes, M. Smith, "The LDAP URL Format." RFC 2255. | |||
Netscape, December, 1997. | Netscape, December, 1997. | |||
[RFC2251] M. Wahl, T. Howes, S. Kille, "Lightweight Directory Access | [RFC2251] M. Wahl, T. Howes, S. Kille, "Lightweight Directory | |||
Protocol (v3)." RFC 2251. Critical Angle, Netscape, Isode, December, | Access Protocol (v3)." RFC 2251. Critical Angle, Netscape, Isode, | |||
1997. | December, 1997. | |||
[CaseMap] M. Davis, "Case Mappings", Unicode Technical Report #21, | [CaseMap] M. Davis, "Case Mappings", Unicode Standard Annex #21, | |||
<http://www.unicode.org/unicode/reports/tr21> | March 26, 2001. http://www.unicode.org/unicode/reports/tr21 | |||
18 AUTHORS' ADDRESSES | 18 AUTHORS' ADDRESSES | |||
Geoffrey Clemm | Geoffrey Clemm | |||
Rational Software | Rational Software | |||
20 Maguire Road | 20 Maguire Road | |||
Lexington, MA 02421 | Lexington, MA 02421 | |||
Email: geoffrey.clemm@rational.com | Email: geoffrey.clemm@rational.com | |||
Anne Hopkins | Anne Hopkins | |||
skipping to change at line 2836 | skipping to change at line 2955 | |||
Email: esedlar@us.oracle.com | Email: esedlar@us.oracle.com | |||
Jim Whitehead | Jim Whitehead | |||
U.C. Santa Cruz | U.C. Santa Cruz | |||
Dept. of Computer Science | Dept. of Computer Science | |||
Baskin Engineering | Baskin Engineering | |||
1156 High Street | 1156 High Street | |||
Santa Cruz, CA 95064 | Santa Cruz, CA 95064 | |||
Email: ejw@cse.ucsc.edu | Email: ejw@cse.ucsc.edu | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 56] | Clemm, Hopkins, Sedlar, Whitehead [Page 61] | |||
19 APPENDICES | ||||
19 APPENDICIES | ||||
19.1 WebDAV XML Document Type Definition Addendum | 19.1 WebDAV XML Document Type Definition Addendum | |||
All XML elements defined in this Document Type Definition (DTD) | All XML elements defined in this Document Type Definition (DTD) | |||
belong to the DAV namespace. This DTD should be viewed as an addendum | belong to the DAV namespace. This DTD should be viewed as an | |||
to the DTD provided in [RFC2518], section 23.1. | addendum to the DTD provided in [RFC2518], section 23.1. | |||
<!-- Privileges --> | <!-- Privileges --> | |||
<!ELEMENT read EMPTY> | <!ELEMENT read EMPTY> | |||
<!ELEMENT write EMPTY> | <!ELEMENT write EMPTY> | |||
<!ELEMENT write-properties EMPTY> | ||||
<!ELEMENT write-content EMPTY> | ||||
<!ELEMENT unlock EMPTY> | ||||
<!ELEMENT read-acl EMPTY> | <!ELEMENT read-acl EMPTY> | |||
<!ELEMENT read-current-user-privilege-set EMPTY> | <!ELEMENT read-current-user-privilege-set EMPTY> | |||
<!ELEMENT write-acl EMPTY> | <!ELEMENT write-acl EMPTY> | |||
<!ELEMENT all EMPTY> | <!ELEMENT all EMPTY> | |||
<!-- Principal Properties (Section 4) --> | <!-- Principal Properties (Section 4) --> | |||
<!ELEMENT principalEMPTY> | <!ELEMENT principalEMPTY> | |||
<!ELEMENT alternate-URI-set (href*)> | <!ELEMENT alternate-URI-set (href*)> | |||
<!ELEMENT principal-URL (href)> | <!ELEMENT principal-URL (href)> | |||
<!ELEMENT group-membership (href*)> | ||||
<!-- Access Control Properties (Section 5) --> | <!-- Access Control Properties (Section 5) --> | |||
<!-- DAV:owner Property (Section 5.1) --> | <!-- DAV:owner Property (Section 5.1) --> | |||
<!ELEMENT owner (href prop?)> | <!ELEMENT owner (href prop?)> | |||
<!ELEMENT prop (see [RFC2518], section 12.11)> | <!ELEMENT prop (see [RFC2518], section 12.11)> | |||
<!-- DAV:supported-privilege-set Property (Section 5.2) --> | <!-- DAV:supported-privilege-set Property (Section 5.2) --> | |||
<!ELEMENT supported-privilege-set (supported-privilege*)> | <!ELEMENT supported-privilege-set (supported-privilege*)> | |||
<!ELEMENT supported-privilege | <!ELEMENT supported-privilege | |||
(privilege, abstract?, description, supported-privilege*)> | (privilege, abstract?, description, supported-privilege*)> | |||
<!ELEMENT privilege ANY> | <!ELEMENT privilege ANY> | |||
<!ELEMENT abstract EMPTY> | <!ELEMENT abstract EMPTY> | |||
<!ELEMENT description #PCDATA> | <!ELEMENT description #PCDATA> | |||
<!ELEMENT privilege ANY> | <!ELEMENT privilege ANY> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 62] | ||||
<!-- DAV:current-user-privilege-set Property (Section 5.3) --> | <!-- DAV:current-user-privilege-set Property (Section 5.3) --> | |||
<!ELEMENT current-user-privilege-set (privilege*)> | <!ELEMENT current-user-privilege-set (privilege*)> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 57] | ||||
<!-- DAV:acl Property (Section 5.4) --> | <!-- DAV:acl Property (Section 5.4) --> | |||
<!ELEMENT acl (ace*)> | <!ELEMENT acl (ace | inherited-acl)* > | |||
<!ELEMENT inherited-acl (href)> | ||||
<!ELEMENT ace (principal, (grant|deny), protected?, inherited?)> | <!ELEMENT ace (invert | principal, (grant|deny), protected?, | |||
inherited?)> | ||||
<!ELEMENT invert principal> | ||||
<!ELEMENT inherited-acl (href)> | ||||
<!ELEMENT principal ((href, prop?) | <!ELEMENT principal ((href, prop?) | |||
| all | authenticated | unauthenticated | | all | authenticated | unauthenticated | |||
| property | self)> | | property | self)> | |||
<!ELEMENT prop (see [RFC2518], section 12.11)> | <!ELEMENT prop (see [RFC2518], section 12.11)> | |||
<!ELEMENT all EMPTY> | <!ELEMENT all EMPTY> | |||
<!ELEMENT authenticated EMPTY> | <!ELEMENT authenticated EMPTY> | |||
<!ELEMENT unauthenticated EMPTY> | <!ELEMENT unauthenticated EMPTY> | |||
<!ELEMENT property ANY> | <!ELEMENT property ANY> | |||
<!ELEMENT self EMPTY> | <!ELEMENT self EMPTY> | |||
<!ELEMENT grant (privilege+)> | <!ELEMENT grant (privilege+)> | |||
<!ELEMENT deny (privilege+)> | <!ELEMENT deny (privilege+)> | |||
<!ELEMENT privilege ANY> | <!ELEMENT privilege ANY> | |||
<!ELEMENT protected EMPTY> | <!ELEMENT protected EMPTY> | |||
<!ELEMENT inherited (href)> | <!ELEMENT inherited (href)> | |||
<!-- DAV:principal-collection-set Property (Section 5.6) --> | <!-- DAV:principal-collection-set Property (Section 5.7) --> | |||
<!ELEMENT principal-collection-set (href*)> | <!ELEMENT principal-collection-set (href*)> | |||
<!-- DAV:acl-semantics Property (Section 6) --> | <!-- DAV:acl-semantics Property (Section 6) --> | |||
<!ELEMENT acl-semantics (ace-combination?, ace-ordering?, allowed- | <!ELEMENT acl-semantics (ace-combination?, ace-ordering?, | |||
ace?, required-principal?)> | allowed-ace?, required-principal?)> | |||
<!ELEMENT ace-combination | <!ELEMENT ace-combination | |||
(first-match | all-grant-before-any-deny | specific-deny- | (first-match | all-grant-before-any-deny | specific-deny- | |||
overrides-grant)> | overrides-grant)> | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 63] | ||||
<!ELEMENT first-match EMPTY> | <!ELEMENT first-match EMPTY> | |||
<!ELEMENT all-grant-before-any-deny EMPTY> | <!ELEMENT all-grant-before-any-deny EMPTY> | |||
<!ELEMENT specific-deny-overrides-grant EMPTY> | <!ELEMENT specific-deny-overrides-grant EMPTY> | |||
<!ELEMENT ace-ordering (deny-before-grant)? > | <!ELEMENT ace-ordering (deny-before-grant)? > | |||
<!ELEMENT deny-before-grant EMPTY> | <!ELEMENT deny-before-grant EMPTY> | |||
<!ELEMENT allowed-ace (principal-only-one-ace | grant-only)*> | <!ELEMENT allowed-ace (principal-only-one-ace | grant-only | | |||
no-invert | no-acl-inherit)*> | ||||
<!ELEMENT principal-only-one-ace EMPTY> | <!ELEMENT principal-only-one-ace EMPTY> | |||
<!ELEMENT grant-only EMPTY> | <!ELEMENT grant-only EMPTY> | |||
<!ELEMENT no-invert EMPTY> | ||||
<!ELEMENT no-acl-inherit EMPTY> | ||||
<!ELEMENT required-principal | <!ELEMENT required-principal | |||
Clemm, Hopkins, Sedlar, Whitehead [Page 58] | ||||
(all? | authenticated? | unauthenticated? | self? | href* | (all? | authenticated? | unauthenticated? | self? | href* | |||
|property*)> | |property*)> | |||
<!-- ACL method preconditions (Section 8.1.1) --> | <!-- ACL method preconditions (Section 8.1.1) --> | |||
<!ELEMENT ace-conflict EMPTY> | <!ELEMENT no-ace-conflict EMPTY> | |||
<!ELEMENT protected-ace-conflict EMPTY> | <!ELEMENT no-protected-ace-conflict EMPTY> | |||
<!ELEMENT inherited-ace-conflict EMPTY> | <!ELEMENT no-inherited-ace-conflict EMPTY> | |||
<!ELEMENT too-many-aces EMPTY> | <!ELEMENT limited-number-of-aces EMPTY> | |||
<!ELEMENT no-abstract EMPTY> | ||||
<!ELEMENT not-supported-privilege EMPTY> | ||||
<!ELEMENT missing-required-principal EMPTY> | ||||
<!ELEMENT recognized-principal EMPTY> | ||||
<!ELEMENT allowed-principal EMPTY> | ||||
<!-- REPORTs (Section 9) --> | <!-- REPORTs (Section 9) --> | |||
<!ELEMENT acl-principal-props ANY> | <!ELEMENT acl-principal-prop-set ANY> | |||
ANY value: a sequence of one or more elements, with at most one | ANY value: a sequence of one or more elements, with at most one | |||
DAV:prop element. | DAV:prop element. | |||
<!ELEMENT principal-match ((principal-property | self), prop?)> | <!ELEMENT principal-match ((principal-property | self), prop?)> | |||
<!ELEMENT principal-property ANY> | <!ELEMENT principal-property ANY> | |||
ANY value: an element whose value identifies a property. The | ANY value: an element whose value identifies a property. The | |||
expectation is the value of the named property typically contains | expectation is the value of the named property typically | |||
an href element that contains the URI of a principal | contains an href element that contains the URI of a principal | |||
<!ELEMENT self EMPTY> | <!ELEMENT self EMPTY> | |||
<!ELEMENT principal-property-search ((property-search+), prop?) > | <!ELEMENT principal-property-search ((property-search+), prop?) | |||
<!ELEMENT property-search (prop, caseless-substring) > | > | |||
<!ELEMENT caseless-substring #PCDATA > | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 64] | ||||
<!ELEMENT property-search (prop, substring, caseless?) > | ||||
<!ELEMENT substring #PCDATA > | ||||
<!ELEMENT caseless EMPTY> | ||||
<!ELEMENT non-searchable-property (prop) > | <!ELEMENT non-searchable-property (prop) > | |||
<!ELEMENT principal-search-property-set (principal-search- | <!ELEMENT principal-search-property-set (principal-search- | |||
property*) > | property*) > | |||
<!ELEMENT principal-search-property (prop, description) > | <!ELEMENT principal-search-property (prop, description) > | |||
20 NOTE TO RFC EDITOR | Clemm, Hopkins, Sedlar, Whitehead [Page 65] | |||
As of the writing of this specification, the DeltaV protocol, | ||||
described in draft-ietf-deltav-versioning-20, has been approved by | ||||
the IESG, but not yet published as an RFC. Within this specification, | ||||
the DeltaV protocol is referenced as [RFCxxxx]. These references need | ||||
to be replaced with the actual RFC number. As well, the citation in | ||||
Section 17.1 also needs to be updated with the correct RFC number, | ||||
and the month of issue. | ||||
Clemm, Hopkins, Sedlar, Whitehead [Page 59] | ||||
End of changes. | ||||
This html diff was produced by rfcdiff 1.23, available from http://www.levkowetz.com/ietf/tools/rfcdiff/ |