<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<?rfc toc="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<?rfc-ext parse-xml-in-artwork="yes"?>
<rfc xmlns:x='http://purl.org/net/xml2rfc/ext' xmlns:ed="http://greenbytes.de/2002/rfcedit" ipr="full2026" docName="draft-ietf-webdav-acl-13" category="std" ed:entered-by="julian.reschke@greenbytes.de">
  <x:link rel="up" href="http://greenbytes.de/tech/webdav/#draft-ietf-webdav-acl"/>
  <x:link rel="prev" href="http://greenbytes.de/tech/webdav/draft-ietf-webdav-acl-12.htm"/>
  <x:link rel="Bookmark" title="IETF WEBDAV Working Group" href="http://ftp.ics.uci.edu/pub/ietf/webdav/"/>
  <x:link rel="Alternate" title="(latest)" href="http://greenbytes.de/tech/webdav/draft-ietf-webdav-acl-latest.html"/>
  <x:link rel="Alternate" title="draft 12 (RFC submission)" href="http://greenbytes.de/tech/webdav/draft-ietf-webdav-acl-12.htm"/>
  <x:link rel="Alternate" title="RFC3744" href="http://greenbytes.de/tech/webdav/rfc3744.html"/>
  <front>
    <title>WebDAV Access Control Protocol</title>
    <author initials="G." surname="Clemm" fullname="G. Clemm">
      <organization>IBM</organization>
      <address>
        <postal>
          <street>20 Maguire Road</street>
          <city>Lexington</city>
          <region>MA</region>
          <code>02421</code>
        </postal>
        <email>geoffrey.clemm@us.ibm.com</email>
      </address>
    </author>
    <author initials="J. F." surname="Reschke" fullname="Julian F. Reschke">
      <organization abbrev="greenbytes">greenbytes GmbH</organization>
      <address>
        <postal>
          <street>Salzmannstrasse 152</street>
          <city>Muenster</city><region>NW</region><code>48159</code>
          <country>Germany</country>
        </postal>
        <email>julian.reschke@greenbytes.de</email>
      </address>
    </author>
    <author initials="E." surname="Sedlar" fullname="E. Sedlar">
      <organization>Oracle Corporation</organization>
      <address>
        <postal>
          <street>500 Oracle Parkway</street>
          <city>Redwood Shores</city>
          <region>CA</region>
          <code>94065</code>
        </postal>
        <email>eric.sedlar@oracle.com</email>
      </address>
    </author>
    <author initials="J." surname="Whitehead" fullname="J. Whitehead">
      <organization abbrev="U.C. Santa Cruz">U.C. Santa Cruz, Dept. of Computer Science</organization>
      <address>
        <postal>
          <street>1156 High Street</street>
          <city>Santa Cruz</city>
          <region>CA</region>
          <code>95064</code>
        </postal>
        <email>ejw@cse.ucsc.edu</email>
      </address>
    </author>
    <date month="December" year="2003" day="23"/>
	
    <abstract>
      <t>
        This document specifies a set of methods, headers, message bodies,
        properties, and reports that define Access Control extensions to the
        WebDAV Distributed Authoring Protocol. This protocol permits a client to
        read and modify access control lists that instruct a server whether to
        allow or deny operations upon a resource (such as HyperText Transfer
        Protocol (HTTP) method invocations) by a given principal. A lightweight
        representation of principals as Web resources supports integration of a
        wide range of user management repositories. Search operations allow
        discovery and manipulation of principals using human names.
      </t>
      <t>
        This document is a product of the Web Distributed Authoring and
        Versioning (WebDAV) working group of the Internet Engineering Task Force.
        Comments on this draft are welcomed, and should be addressed to the
        <eref target="mailto:acl@webdav.org">acl@webdav.org</eref> mailing list.
        Other related documents can be found at
        <eref target="http://www.example.com/acl/" />, and
        <eref target="http://www.ics.uci.edu/pub/ietf/webdav/"/>.
      </t>
    </abstract>
  </front>

	<middle>

<ed:issue name="ED_references_names" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001711.html">
  <ed:item date="2003-11-03" entered-by="julian.reschke@greenbytes.de">
    Replace "Informative References" by "Informational References".
  </ed:item>
  <ed:resolution datetime="2003-11-06">
    Section title renamed from "Informative References" to "Informational References" (no change tracking).
  </ed:resolution>
</ed:issue>
<ed:issue name="ED_RFC2386" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001711.html">
  <ed:item date="2003-11-03" entered-by="julian.reschke@greenbytes.de">
    RFC2386 is listed, but not mentioned in the spec.
  </ed:item>
  <ed:resolution datetime="2003-11-06">
    Entry RFC2386 removed from references (no change tracking).
  </ed:resolution>
</ed:issue>
<ed:issue name="ED_example_host_names" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001719.html">
  <ed:item date="2003-11-06" entered-by="julian.reschke@greenbytes.de">
    When changing the host names, we forgot to also update user names that 
    appear in "Authorization" headers (such as "gclemm@webdav.org"). I'd 
    recommend to just replace "@webdav.org" with "@example.com". 
    Also fix broken realms (always say "users@example.com").
  </ed:item>
  <ed:resolution datetime="2003-11-06">
    All realms changed to "users@example.com".
  </ed:resolution>
</ed:issue>
<ed:issue name="ED_authors_list" type="edit" status="closed">
  <ed:item date="2003-11-06" entered-by="geoffrey.clemm@us.ibm.com">
    Remove Anne Hopkins from authors list (keep her name in the Acknowledgements section).
  </ed:item>
  <ed:item date="2003-12-20" entered-by="geoffrey.clemm@us.ibm.com">
    Add Julian Reschke to authors list.
  </ed:item>
  <ed:resolution datetime="2003-12-20">
    Removed Anne Hopkins from authors list (both in front page and in "authors"
    section). Added Julian Reschke to authors list.
  </ed:resolution>
</ed:issue>
<ed:issue name="ED_non_ASCII" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001712.html">
  <ed:item date="2003-11-03" entered-by="julian.reschke@greenbytes.de">
    some non-ASCII characters (long dashes and quotes) are present
  </ed:item>
  <ed:resolution datetime="2003-11-04">
    Fixed in Sections 3.1, 3.3, 3.4, 6, 7.1.1.
  </ed:resolution>
</ed:issue>
<ed:issue name="ED_artwork_line_width" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001712.html">
  <ed:item date="2003-11-03" entered-by="julian.reschke@greenbytes.de">
    In request/responses/DTDs, the line width sometimes exceeds what's 
    allowed in an RFC (I think 72 characters).
  </ed:item>
  <ed:resolution datetime="2003-11-04">
    Added line breaks and/or changed indention in some of the figures (no change tracking).
  </ed:resolution>
</ed:issue>
<ed:issue name="ED_xml_typos" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001712.html">
  <ed:item date="2003-11-03" entered-by="julian.reschke@greenbytes.de">
    There were a few typos in the XML examples
  </ed:item>
  <ed:resolution datetime="2003-11-04">
    Several XML message bodies fixed (no change tracking).
  </ed:resolution>
</ed:issue>

<section title="Introduction">
<t>
         The goal of the WebDAV access control extensions is to provide an 
         interoperable mechanism for handling discretionary access control 
         for content and metadata managed by WebDAV servers.  WebDAV access 
         control can be implemented on content repositories with security 
         as simple as that of a UNIX file system, as well as more 
         sophisticated models.  The underlying principle of access control 
         is that who you are determines what operations you can perform on 
         a resource. The "who you are" is defined by a "principal" 
         identifier; users, client software, servers, and groups of the 
         previous have principal identifiers. The "operations you can 
         perform" are determined by a single "access control list" (ACL) 
         associated with a resource.  An ACL contains a set of "access 
         control entries" (ACEs), where each ACE specifies a principal and 
         a set of privileges that are either granted or denied to that 
         principal. When a principal submits an operation (such as an HTTP 
         or WebDAV method) to a resource for execution, the server 
         evaluates the ACEs in the ACL to determine if the principal has 
         permission for that operation.
</t>
<t>
         Since every ACE contains the identifier of a principal, client 
         software operated by a human must provide a mechanism for 
         selecting this principal. This specification uses http(s) scheme 
         URLs to 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, 
         http://www.example.com/u/256432 and 
         http://www.example.com/people/Greg.Stein are both valid URLs that 
         could 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. 
</t>
<t>
         Since a principal can be identified by multiple URLs, it raises 
         the problem of determining exactly which principal is being 
         referenced in a given ACE. It is impossible for a client to 
         determine that an ACE granting the read privilege to 
         http://www.example.com/people/Greg.Stein also affects the 
         principal at http://www.example.com/u/256432. That is, a client 
         has no mechanism for determining that two URLs identify the same 
         principal resource.  As a result, this specification requires 
         clients to use just one of the many possible URLs for a principal 
         when creating ACEs. A client can discover which URL to use by 
         retrieving the DAV:principal-URL property (<xref target="PROPERTY_principal-URL"/>) from a 
         principal resource. No matter which of the principal's URLs is 
         used with PROPFIND, the property always returns the same URL. 
</t>
<t>
         With a system having hundreds to thousands of principals, the 
         problem arises of how to allow a human operator of client software 
         to select just one of these principals. One approach is to use 
         broad collection hierarchies to spread the principals over a large 
         number of 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, creating collections /a/a/, /a/b/, ..., /a/z/, such 
         that a principal with last name "Stein" would appear at 
         /s/t/Stein. In effect, this pre-computes a common query, search on 
         last name, and encodes it into a hierarchy. The drawback with this 
         scheme is that it handles only a small set of predefined queries, 
         and drilling down through the collection hierarchy adds 
         unnecessary steps (navigate down/up) when the user already knows 
         the principal's name. While organizing principal URLs into a 
         hierarchy is a valid namespace organization, users should not be 
         forced to navigate this hierarchy to select a principal. 
</t>
<t>
         This specification provides the capability to perform substring 
         searches over a small set of properties on the resources 
         representing principals. This permits searches based on last name, 
         first name, user name, job title, etc. Two separate searches are 
         supported, both via the REPORT method, one to search principal 
         resources (DAV:principal-property-search, <xref target="REPORT_principal-property-search"/>), the other 
         to determine which properties may be searched at all 
         (DAV:principal-search-property-set, <xref target="REPORT_principal-search-property-set"/>).  
</t>
<t>
         Once a principal has been identified in an ACE, a server 
         evaluating that ACE must know the identity of the principal making 
         a protocol request, and must validate that that principal is who 
         they claim to be, a process known as authentication. This 
         specification intentionally omits discussion of authentication, as 
         the HTTP protocol already has a number of authentication 
         mechanisms <xref target="RFC2617"/>.  Some authentication mechanism (such as HTTP 
         Digest Authentication, which all WebDAV compliant implementations 
         are required to support) must be available to validate the 
         identity of a principal.
</t>
<t>
         The following issues are out of scope for this document:
  <list style="symbols">
          <t>Access control that applies only to a particular property on 
              a resource (excepting the access control properties DAV:acl 
              and DAV:current-user-privilege-set), rather than the entire 
              resource,</t>
          <t>Role-based security (where a role can be seen as a 
              dynamically defined group of principals),</t> 
          <t>Specification of the ways an ACL on a resource is 
              initialized,</t>
          <t>Specification of an ACL that applies globally to all 
              resources, rather than to a particular resource. </t>
          <t>Creation and maintenance of resources representing people or 
              computational agents (principals), and groups of these.</t>
  </list>
</t>
<ed:issue name="1_ref_options" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001718.html">
  <ed:item date="2003-11-04" entered-by="julian.reschke@greenbytes.de">
    "Client discovery of access control capability using OPTIONS is 
    described in Section 7.1." The reference should be to "7.2".
  </ed:item>
  <ed:resolution datetime="2003-11-04">
    Replaced "7.1" with "7.2"
  </ed:resolution>
</ed:issue>
<t>
         This specification is organized as follows. <xref target="terms"/> defines 
         key concepts used throughout the specification, and is followed by 
         a more in-depth discussion of principals (<xref target="principals"/>), and 
         privileges (<xref target="privileges"/>). Properties defined on principals are 
         specified in <xref target="principal.properties"/>, and access control properties for content 
         resources are specified in <xref target="access.control.properties"/>. The ways ACLs are to be 
         evaluated is described in <xref target="acl.evaluation"/>. Client discovery of access 
         control capability using OPTIONS is described in <ed:replace datetime="2003-11-04" ed:resolves="1_ref_options"><ed:del>Section 7.1</ed:del><ed:ins><xref target="METHOD_options"/></ed:ins></ed:replace>. 
         Interactions between access control functionality and existing 
         HTTP and WebDAV methods are described in the remainder of <xref target="access.control.and.existing.methods"/>.
         The access control setting method, ACL, is specified in <xref target="access.control.methods"/>.
         Four reports that provide limited server-side searching 
         capabilities are described in <xref target="access.control.reports"/>. Sections on XML 
         processing (<xref target="xml.processing"/>), Internationalization considerations 
         (<xref target="internationalization.considerations"/>), security considerations (<xref target="security.considerations"/>), and 
         authentication (<xref target="authentication"/>) round out the specification. An 
         appendix (<xref target="webdav.xml.document.type.definition.addendum"/>) provides an XML Document Type Definition 
         (DTD) for the XML elements defined in the specification.
</t>

<section title="Terms" anchor="terms">
<t>
         This draft uses the terms defined in HTTP <xref target="RFC2616"/> and WebDAV 
         <xref target="RFC2518"/>.  In addition, the following terms are defined:
</t>
<t>
  principal
  <list><t>A "principal" is a distinct human or computational actor that 
         initiates access to network resources.  In this protocol, a 
         principal is an HTTP resource that represents such an actor.</t></list>
</t>
<t>
  group
  <list><t>A "group" is a principal that represents a set of other 
         principals.</t></list>
</t>
<t>
  privilege
  <list><t>A "privilege" controls access to a particular set of HTTP 
         operations on a resource.</t></list>
</t>
<t>
  aggregate privilege
  <list><t>An "aggregate privilege" is a privilege that contains a set of 
         other privileges.</t></list>
</t>
<t>
  abstract privilege
  <list><t>The modifier "abstract", when applied to a privilege on a 
         resource, means the privilege cannot be set in an access control 
         element (ACE) on that resource.</t></list>
</t>
<t>
  access control list (ACL)
  <list><t>An "ACL" is a list of access control elements that define access 
         control to a particular resource.</t></list>
</t>
<t>
  access control element (ACE)
  <list><t>An "ACE" either grants or denies a particular set of (non-abstract)
         privileges for a particular principal.</t></list>
</t>
<t>
  inherited ACE
  <list><t>An "inherited ACE" is an ACE that is dynamically shared from the 
         ACL of another resource. When a shared ACE changes on the primary 
         resource, it is also changed on inheriting resources.</t></list>
</t>
<t>
  protected property
  <list><t>A "protected property" is one whose value cannot be updated except 
         by a method explicitly defined as updating that specific property.  
         In particular, a protected property cannot be updated with a 
         PROPPATCH request.</t></list>
</t>
</section>

<section title="Notational Conventions">
<t>
         The augmented BNF used by this document to describe protocol 
         elements is described in Section 2.1 of <xref target="RFC2616"/>. Because this 
         augmented BNF uses the basic production rules provided in Section 
         2.2 of <xref target="RFC2616"/>, those rules apply to this document as well. 
</t>
<t>
         The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL 
         NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" 
         in this document are to be interpreted as described in <xref target="RFC2119"/>. 
</t>
<t>
         Definitions of XML elements in this document use XML element type 
         declarations (as found in XML Document Type Declarations), 
         described in Section 3.2 of <xref target="REC-XML"/>. When an XML element type in 
         the "DAV:" namespace is referenced in this document outside of the 
         context of an XML fragment, the string "DAV:" will be prefixed to 
         the element name. 
</t>
</section>
</section>

<section title="Principals" anchor="principals">
<t>
         A principal is a network resource that represents a distinct human 
         or computational actor that initiates access to network resources. 
         Users and groups are represented as principals in many 
         implementations; other types of principals are also possible. A 
         URI of any scheme MAY be used to identify a principal resource. 
         However, servers implementing this specification MUST expose 
         principal resources at an http(s) URL, which is a privileged 
         scheme that points to resources that have additional properties, 
         as described in <xref target="principal.properties"/>. So, a principal resource can have 
         multiple URIs, one of which has to be an http(s) scheme URL. 
         Although an implementation SHOULD support PROPFIND and MAY support 
         PROPPATCH to access and modify information about a principal, it 
         is not required to do so.   
</t>
<t>
         A principal resource may be a group, where a group is a principal 
         that represents a set of other principals, called the members of 
         the group.  If a person or computational agent matches a principal 
         resource that is a member of a group, they also match the group. 
         Membership in a group is recursive, so if a principal is a member 
         of group GRPA, and GRPA is a member of group GRPB, then the 
         principal is also a member of GRPB. 
</t>
</section>

<section title="Privileges" anchor="privileges">
<t>
         Ability to perform a given method on a resource MUST be controlled 
         by one or more privileges.  Authors of protocol extensions that 
         define new HTTP methods SHOULD specify which privileges (by 
         defining new privileges, or mapping to ones below) are required to 
         perform the method.  A principal with no privileges to a resource 
         MUST 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 
         <xref target="ace.principal"/>).  Servers MUST report a 403 "Forbidden" error if 
         access is denied, except in the case where the privilege restricts 
         the ability to know the resource exists, in which case 404 "Not 
         Found" may be returned. 
</t>
<t>
         Privileges may be containers of other privileges, in which case 
         they are termed "aggregate privileges".  If a principal is granted 
         or 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 a 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. 
</t>
<t>
         Privileges may be declared to be "abstract" for a given resource, 
         in which case they cannot be set in an ACE on that resource. 
         Aggregate and non-aggregate privileges are both capable of being 
         abstract. Abstract privileges are useful for modeling privileges 
         that otherwise would not be exposed via the protocol. Abstract 
         privileges also provide server implementations with flexibility in 
         implementing the privileges defined in this specification.  For 
         example, if a server is incapable of separating the read resource 
         capability from the read ACL capability, it can still model the 
         DAV:read and DAV:read-acl privileges defined in this specification 
         by declaring them abstract, and containing them within 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; therefore, a privilege MUST NOT contain itself. For 
         example, DAV:read cannot contain DAV:read. 
</t>
<t>
         The set of privileges that apply to a particular resource may vary 
         with the DAV:resourcetype of the resource, as well as between 
         different server implementations.  To promote interoperability, 
         however, this specification defines a set of well-known privileges 
         (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 to classify the other privileges defined on a particular 
         resource. The access permissions on null resources (defined in 
         <xref target="RFC2518"/>, Section 3) are solely those they inherit (if any), and 
         they are not discoverable (i.e., the access control properties 
         specified in <xref target="access.control.properties"/> are not defined on null resources). On the 
         transition from null to stateful resource, the initial access 
         control list is set by the server's default ACL value policy (if 
         any). 
</t>
<t>
         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 use a namespace that they control, such as an http scheme 
         URL. 
</t>

<section title="DAV:read Privilege" anchor="PRIVILEGE_read">
<iref item="DAV:read privilege" primary="true"/>
<iref item="Privileges" subitem="DAV:read" primary="true"/>
<t>
         The read privilege controls methods that return information about 
         the state of the resource, including the resource's properties. 
         Affected methods include GET and PROPFIND.  Any implementation-defined
         privilege that also controls access to GET and PROPFIND 
         must be aggregated under DAV:read<ed:replace datetime="2003-11-04" ed:resolves="ED_non_ASCII"><ed:del></ed:del><ed:ins> - </ed:ins></ed:replace>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 MUST control the OPTIONS method. 
</t>
<figure><artwork>
&lt;!ELEMENT read EMPTY> 
</artwork></figure>
</section>

<section title="DAV:write Privilege" anchor="PRIVILEGE_write">
<iref item="DAV:write privilege" primary="true"/>
<iref item="Privileges" subitem="DAV:write" primary="true"/>
<ed:issue name="3.2_ED_RFC2518" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001711.html">
  <ed:item date="2003-11-03" entered-by="julian.reschke@greenbytes.de">
    Fix references ("[WEBDAV]") to RFC2518.
  </ed:item>
  <ed:resolution datetime="2003-11-05">
    Replaced "[WEBDAV]" by "[RFC2518]".
  </ed:resolution>
</ed:issue>
<t>
         The write privilege controls methods that lock a resource or 
         modify the content, dead properties, or (in the case of a 
         collection) membership of the resource, such as PUT and PROPPATCH.  
         Note that state modification is also controlled via locking (see 
         section 5.3 of <ed:replace datetime="2003-11-04" ed:resolves="3.2_ED_RFC2518"><ed:del>[WEBDAV]</ed:del><ed:ins><xref target="RFC2518"/></ed:ins></ed:replace>), 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.
</t>
<figure><artwork>
&lt;!ELEMENT write EMPTY> 
</artwork></figure>
</section>

<section title="DAV:write-properties Privilege" anchor="PRIVILEGE_write-properties">
<ed:issue name="3.3_ED_priv_section_titles" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001741.html">
  <ed:item date="2003-11-07" entered-by="julian.reschke@greenbytes.de">
    Section titles for DAV:write-properties, DAV:write-content and DAV:unlock
    missing word "Privilege".
  </ed:item>
  <ed:resolution datetime="2003-11-07">
    Added "Privilege" to the section titles (no change tracking).
  </ed:resolution>
</ed:issue>
<iref item="DAV:write-properties privilege" primary="true"/>
<iref item="Privileges" subitem="DAV:write-properties" primary="true"/>
<t>
         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<ed:replace datetime="2003-11-04" ed:resolves="ED_non_ASCII"><ed:del>&#x2014;</ed:del><ed:ins> - </ed:ins></ed:replace>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. 
</t>
<figure><artwork>
&lt;!ELEMENT write-properties EMPTY> 
</artwork></figure>
</section>

<section title="DAV:write-content Privilege" anchor="PRIVILEGE_write-content">
<ed:issue name="3.4_write-content-description" type="change" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001757.html">
  <ed:item date="2003-11-18" entered-by="csharp@mac.com">
    If DAV:write-content is just an aggregate of DAV:bind and DAV:unbind 
    why doesn't it state that "the client can safely expect that no other 
    privilege needs to be granted to have access to MKCOL,PUT, DELETE,MOVE, 
    COPY"? If it is not an aggregate why does it exist?
  </ed:item>
  <ed:resolution datetime="2003-11-18">
    Update description of DAV:write-content so that it doesn't refer to
    collection membership; clarify the distinction between PUT to an existing
    reource (modifying content) and PUT on an unmapped URI (creating a new
    resource, requiring privileges on the parent collection).
    Define aggregation of DAV:bind and DAV:unbind in
    3.12.
  </ed:resolution>
</ed:issue>
<iref item="DAV:write-content privilege" primary="true"/>
<iref item="Privileges" subitem="DAV:write-content" primary="true"/>
<ed:replace datetime="2003-11-18" ed:resolves="3.4_write-content-description"><ed:del>
<t>
         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<ed:replace datetime="2003-11-04" ed:resolves="ED_non_ASCII"><ed:del>&#x2014;</ed:del><ed:ins> - </ed:ins></ed:replace>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. 
</t>
</ed:del><ed:ins>
<t>
         The DAV:write-content privilege controls methods that modify the
         content of an existing resource, such as PUT.  Any
         implementation-defined privilege that also controls access to content
         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. Note that PUT -
         when applied to an unmapped URI - creates a new resource and therefore
         is controlled by the DAV:bind privilege on the parent collection.
</t>
</ed:ins></ed:replace>
<figure><artwork>
&lt;!ELEMENT write-content EMPTY> 
</artwork></figure>
</section>

<section title="DAV:unlock Privilege" anchor="PRIVILEGE_unlock"> 
<iref item="DAV:unlock privilege" primary="true"/>
<iref item="Privileges" subitem="DAV:unlock" primary="true"/>
<t>
         The DAV:unlock privilege controls the use of the UNLOCK method by 
         a principal other than the lock owner (the principal that created 
         a lock can always perform an UNLOCK).  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 by non-lock owners to UNLOCK MUST be aggregated 
         under DAV:unlock. 
</t>
<t>
         A lock owner can always remove a lock by issuing an UNLOCK with 
         the correct lock token and authentication credentials. That is, 
         even if a principal does not have DAV:unlock privilege, they can 
         still remove locks they own. Principals other than the lock owner 
         can remove a lock only if they have DAV:unlock privilege and they 
         issue an UNLOCK with the correct lock token. Lock timeout is not 
         affected by the DAV:unlock privilege. 
</t>
<figure><artwork>
&lt;!ELEMENT unlock EMPTY> 
</artwork></figure>
</section>

<section title="DAV:read-acl Privilege" anchor="PRIVILEGE_read-acl">
<iref item="DAV:read-acl privilege" primary="true"/>
<iref item="Privileges" subitem="DAV:read-acl" primary="true"/>
<t>
         The DAV:read-acl privilege controls the use of PROPFIND to 
         retrieve the DAV:acl property of the resource. 
</t>
<figure><artwork>
&lt;!ELEMENT read-acl EMPTY> 
</artwork></figure>
</section>

<section title="DAV:read-current-user-privilege-set Privilege" anchor="PRIVILEGE_read-current-user-privilege-set"> 
<iref item="DAV:read-current-user-privilege-set privilege" primary="true"/>
<iref item="Privileges" subitem="DAV:read-current-user-privilege-set" primary="true"/>
<t>
         The DAV:read-current-user-privilege-set privilege controls the use 
         of PROPFIND to retrieve the DAV:current-user-privilege-set 
         property of the resource.  
</t>
<t>
         Clients are intended to use this property to visually indicate in 
         their UI items that are dependent on the permissions of a 
         resource, for example, by graying out resources that are not 
         writeable. 
</t>
<t>
         This privilege is separate from DAV:read-acl because there is a 
         need to allow most users access to the privileges permitted the 
         current user (due to its use in creating the UI), while the full 
         ACL contains information that may not be appropriate for the 
         current authenticated user. As a result, the set of users who can 
         view the full ACL is expected to be much smaller than those who 
         can read the current user privilege set, and hence distinct 
         privileges are needed for each. 
</t>
<figure><artwork>
&lt;!ELEMENT read-current-user-privilege-set EMPTY> 
</artwork></figure>
</section>

<section title="DAV:write-acl Privilege" anchor="PRIVILEGE_write-acl">
<iref item="DAV:write-acl privilege" primary="true"/>
<iref item="Privileges" subitem="DAV:write-acl" primary="true"/>
<t>
         The DAV:write-acl privilege controls use of the ACL method to 
         modify the DAV:acl property of the resource. 
</t>
<figure><artwork>
&lt;!ELEMENT write-acl EMPTY> 
</artwork></figure>
</section>

<section title="DAV:bind Privilege" anchor="PRIVILEGE_bind">
<iref item="DAV:bind privilege" primary="true"/>
<iref item="Privileges" subitem="DAV:bind" primary="true"/>
<t>
         The DAV:bind privilege allows a method to add a new member URL to 
         the specified collection (for example via PUT or MKCOL).  It is 
         ignored for resources that are not collections.   
</t>
<figure><artwork>
&lt;!ELEMENT bind EMPTY> 
</artwork></figure>
</section>

<section title="DAV:unbind Privilege" anchor="PRIVILEGE_unbind">
<iref item="DAV:unbind privilege" primary="true"/>
<iref item="Privileges" subitem="DAV:unbind" primary="true"/>
<t>
         The DAV:unbind privilege allows a method to remove a member URL 
         from the specified collection (for example via DELETE or MOVE).  
         It is ignored for resources that are not collections.   
</t>
<figure><artwork>
&lt;!ELEMENT unbind EMPTY> 
</artwork></figure>
</section>

<section title="DAV:all Privilege" anchor="PRIVILEGE_all">
<iref item="DAV:all privilege" primary="true"/>
<iref item="Privileges" subitem="DAV:all" primary="true"/>
<t>
         DAV:all is an aggregate privilege that contains the entire set of 
         privileges that can be applied to the resource. 
</t>
<figure><artwork>
&lt;!ELEMENT all EMPTY> 
</artwork></figure>
</section>

<section title="Aggregation of Predefined Privileges" anchor="aggregation.of.predefined.privileges"> 
<ed:issue name="3.12_ED_bad_reference" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001712.html">
  <ed:item date="2003-11-03" entered-by="julian.reschke@greenbytes.de">
    section 3.12 talks about "defined above in Sections 3.1-3.9". I think 
    this should be "defined above in Sections 3.1-3.11" or simply "defined 
    in above sections"
  </ed:item>
  <ed:item date="2003-11-06" entered-by="geoffrey.clemm@us.ibm.com">
    For the section 3.12 issue, I'd prefer to change it to say "Sections 3.1-3.10"
    (the DAV:all privilege from section 3.11 should not be included in
    another privilege). 
  </ed:item>
  <ed:resolution datetime="2003-11-06">
    Replace "Sections 3.1-3.9" by "Sections 3.1-3.10".
  </ed:resolution>
</ed:issue>
<t>
         Server implementations are free to aggregate the predefined 
         privileges (defined above in Sections <ed:replace ed:resolves="3.12_ED_bad_reference" datetime="2003-11-06"><ed:del>3.1-3.9</ed:del>
         <ed:ins><xref target="PRIVILEGE_read" format="counter"/>-<xref target="PRIVILEGE_unbind" format="counter"/></ed:ins></ed:replace>) subject to the 
         following limitations: 
</t>
<t>
         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. 
</t>
<t>
         DAV:write-acl MUST NOT contain DAV:write, DAV:read, DAV:read-acl, 
         or DAV:read-current-user-privilege-set. 
</t>
<t>
         DAV:read-current-user-privilege-set MUST NOT contain DAV:write, 
         DAV:read, DAV:read-acl, or DAV:write-acl. 
</t>
<t>
         DAV:write MUST NOT contain DAV:read, DAV:read-acl, or DAV:read-current-user-privilege-set. 
</t>
<t>
         DAV:read MUST NOT contain DAV:write, DAV:write-acl, DAV:write-properties,
         or DAV:write-content. 
</t>
<t>
         DAV:write MUST contain <ed:replace datetime="2003-11-18" ed:resolves="3.4_write-content-description"><ed:ins>DAV:bind, DAV:unbind, </ed:ins></ed:replace>DAV:write-properties and DAV:write-content. 
</t>
</section>

</section>

<section title="Principal Properties" anchor="principal.properties">
<t>
         Principals are manifested to clients as a WebDAV resource, 
         identified by a URL.  A principal MUST have a non-empty 
         DAV:displayname property (defined in Section 13.2 of <xref target="RFC2518"/>), 
         and a DAV:resourcetype property (defined in Section 13.9 of 
         <xref target="RFC2518"/>).  Additionally, a principal MUST report the 
         DAV:principal XML element in the value of the DAV:resourcetype 
         property.  The element type declaration for DAV:principal is:
</t>
<iref item="DAV:principal resource type" primary="true"/>
<iref item="Resource Types" subitem="DAV:principal" primary="true"/>
<figure><artwork>
&lt;!ELEMENT principal EMPTY> 
</artwork></figure>
<t>
         This protocol defines the following additional properties for a 
         principal. Since it can be expensive for a server to retrieve 
         access control information, the name and value of these properties 
         SHOULD NOT be returned by a PROPFIND allprop request (as defined 
         in Section 12.14.1 of <xref target="RFC2518"/>).  
</t>

<section title="DAV:alternate-URI-set" anchor="PROPERTY_alternate-URI-set">
<iref item="DAV:alternate-URI-set property" primary="true"/>
<iref item="Properties" subitem="DAV:alternate-URI-set" primary="true"/>
<ed:issue name="4.1_ED_RFC2589" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001711.html">
  <ed:item date="2003-11-03" entered-by="julian.reschke@greenbytes.de">
    text quotes RFC2589 ("Lightweight Directory Access Protocol (v3): 
    Extensions for Dynamic Directory Services"), but references section has 
    RFC2251 ("Lightweight Directory Access Protocol (v3)")
  </ed:item>
  <ed:item date="2003-11-06" entered-by="geoffrey.clemm@us.ibm.com">
    The LDAP reference should be RFC2251 (not RFC2589). 
  </ed:item>
  <ed:resolution datetime="2003-11-06">
    Replaced "[RFC2589]" by "[RFC2251]". 
  </ed:resolution>
</ed:issue>
<t>
         This protected property, if non-empty, contains the URIs of 
         network resources with additional descriptive information about 
         the principal. This property identifies additional network 
         resources (i.e., it contains one or more URIs) that may be 
         consulted by a client to gain additional knowledge concerning a 
         principal. One expected use for this property is the storage of an 
         LDAP <xref target="RFC2255"/> scheme URL. A user-agent encountering an LDAP URL 
         could use LDAP <ed:replace ed:resolves="4.1_ED_RFC2589" datetime="2003-11-06"><ed:del>[RFC2589]</ed:del>
         <ed:ins><xref target="RFC2251"/></ed:ins></ed:replace> to retrieve additional machine-readable 
         directory information about the principal, and display that 
         information in its user interface. Support for this property is 
         REQUIRED, and the value is empty if no alternate URI exists for 
         the principal. 
</t>
<figure><artwork>
&lt;!ELEMENT alternate-URI-set (href*)> 
</artwork></figure>
</section>

<section title="DAV:principal-URL" anchor="PROPERTY_principal-URL">
<iref item="DAV:principal-URL property" primary="true"/>
<iref item="Properties" subitem="DAV:principal-URL" primary="true"/>
<t>
         A principal may have many URLs, but there must be one "principal 
         URL" that clients can use to uniquely identify a principal.  This 
         protected property contains the URL that MUST be used to identify 
         this principal in an ACL request. Support for this property is 
         REQUIRED. 
</t>
<figure><artwork>
&lt;!ELEMENT principal-URL (href)> 
</artwork></figure>
</section>

<section title="DAV:group-member-set">
<iref item="DAV:group-member-set property" primary="true"/>
<iref item="Properties" subitem="DAV:group-member-set" primary="true"/>
<t>
         This property of a group principal identifies the principals that 
         are direct members of this group. Since a group may be a member of 
         another group, a group may also have indirect members (i.e. the 
         members of its direct members).  A URL in the DAV:group-member-set 
         for a principal MUST be the DAV:principal-URL of that principal.  
</t>
<figure><artwork>
&lt;!ELEMENT group-member-set (href*)> 
</artwork></figure>
</section>

<section title="DAV:group-membership">
<iref item="DAV:group-membership property" primary="true"/>
<iref item="Properties" subitem="DAV:group-membership" primary="true"/>
<t>
         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. Support for this property is REQUIRED. 
</t>
<figure><artwork>
&lt;!ELEMENT group-membership (href*)> 
</artwork></figure>
</section>
</section>

<section title="Access Control Properties" anchor="access.control.properties">
<t>
         This specification defines a number of new properties for WebDAV 
         resources.  Access control properties may be retrieved just like 
         other WebDAV properties, using the PROPFIND method.  Since it is 
         expensive, for many servers, to retrieve access control 
         information, a PROPFIND allprop request (as defined in Section 
         12.14.1 of <xref target="RFC2518"/>) SHOULD NOT return the names and values of 
         the properties defined in this section.
</t>
<t>
         Access control properties (especially DAV:acl and DAV:inherited-acl-set)
         are defined on the resource identified by the Request-URI 
         of a PROPFIND request. A direct consequence is that if the 
         resource is accessible via multiple URI, the value of access 
         control properties is the same across these URI. 
</t>
<t>
         HTTP resources that support the WebDAV Access Control Protocol 
         MUST contain the following properties. Null resources (described 
         in Section 3 of <xref target="RFC2518"/>) MUST NOT contain the following 
         properties. 
</t>

<section title="DAV:owner" anchor="PROPERTY_owner">
<iref item="DAV:owner property" primary="true"/>
<iref item="Properties" subitem="DAV:owner" primary="true"/>
<ed:issue name="5.1_owner_group_details" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001737.html">
  <ed:item date="2003-11-07" entered-by="julian.reschke@greenbytes.de">
    State that DAV:owner and DAV:group MAY be protected. Also state that
    they MAY be empty if the server can't provide the information.
  </ed:item>
  <ed:resolution datetime="2003-11-08">
    Added paragraphs stating both for both properties.
  </ed:resolution>
</ed:issue>
<t>
         This <ed:replace ed:resolves="5.1_owner_group_details" datetime="2003-11-08"><ed:del>protected </ed:del></ed:replace> property identifies a particular principal as being 
         the "owner" of the resource. Since the owner of a resource often 
         has special access control capabilities (e.g., the owner 
         frequently has permanent DAV:write-acl privilege), clients might 
         display the resource owner in their user interface. 
</t>
<ed:replace ed:resolves="5.1_owner_group_details" datetime="2003-11-08"><ed:ins>
<t>
         Servers MAY implement DAV:owner as protected property and MAY return
         an empty DAV:owner element as property value in case no owner information
         is available.
</t>
</ed:ins></ed:replace>
<ed:issue name="5.1_owner_href_optional" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001728.html">
  <ed:item date="2003-11-06" entered-by="julian.reschke@greenbytes.de">
    href element should be optional in case the server doesn't have owner information.
  </ed:item>
  <ed:resolution datetime="2003-11-06">
    Updated DTD fragment.
  </ed:resolution>
</ed:issue>
<ed:replace datetime="2003-11-06" ed:resolves="5.1_owner_href_optional"><ed:del>
<figure><artwork>
&lt;!ELEMENT owner (href)> 
</artwork></figure>
</ed:del><ed:ins>
<figure><artwork>
&lt;!ELEMENT owner (href?)> 
</artwork></figure>
</ed:ins></ed:replace>

<section title="Example: Retrieving DAV:owner">
<t>
         This example shows a client request for the value of the DAV:owner 
         property from a collection resource with URL 
         http://www.example.com/papers/. The principal making the request 
         is authenticated using Digest authentication. The value of 
         DAV:owner is the URL http://www.example.com/acl/users/gstein, 
         wrapped in the DAV:href XML element. 
</t>
<ed:replace ed:resolves="ED_example_host_names" datetime="2003-11-06"><ed:del>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
PROPFIND /papers/ HTTP/1.1 
Host: www.example.com 
Content-type: text/xml; charset="utf-8"  
Content-Length: xxx 
Depth: 0 
Authorization: Digest username="jim",  
  realm="jim@webdav.org", nonce="...", 
  uri="/papers/", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:propfind xmlns:D="DAV:"> 
  &lt;D:prop> 
    &lt;D:owner/> 
  &lt;/D:prop> 
&lt;/D:propfind> 
</artwork></figure>
</ed:del><ed:ins>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
PROPFIND /papers/ HTTP/1.1 
Host: www.example.com 
Content-type: text/xml; charset="utf-8"  
Content-Length: xxx 
Depth: 0 
Authorization: Digest username="jim",  
  realm="users@example.com", nonce="...", 
  uri="/papers/", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:propfind xmlns:D="DAV:"> 
  &lt;D:prop> 
    &lt;D:owner/> 
  &lt;/D:prop> 
&lt;/D:propfind> 
</artwork></figure>
</ed:ins></ed:replace>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:multistatus xmlns:D="DAV:">  
  &lt;D:response>  
    &lt;D:href>http://www.example.com/papers/&lt;/D:href> 
    &lt;D:propstat> 
      &lt;D:prop> 
        &lt;D:owner> 
          &lt;D:href>http://www.example.com/acl/users/gstein&lt;/D:href>        
        &lt;/D:owner> 
      &lt;/D:prop> 
      &lt;D:status>HTTP/1.1 200 OK&lt;/D:status> 
    &lt;/D:propstat> 
  &lt;/D:response> 
&lt;/D:multistatus> 
</artwork></figure>
</section>
         
<section title="Example: An Attempt to Set DAV:owner">
<ed:issue name="5.1.2_responsedescription" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001737.html">
  <ed:item date="2003-11-07" entered-by="julian.reschke@greenbytes.de">
    Add DAV:error element to DAV:responsedescription in example and
    update explanation.
  </ed:item>
  <ed:resolution datetime="2003-11-08">
    DAV:error subelement added to DAV:responsedescription in response.
  </ed:resolution>
</ed:issue>
<t>
         The following example shows a client request to modify the value 
         of the DAV:owner property on the resource with URL 
         &lt;http://www.example.com/papers>. Since DAV:owner is a protected 
         property <ed:replace ed:resolves="5.1_owner_group_details" datetime="2003-11-08">
         <ed:del>, the server</ed:del>
         <ed:ins>on this particular server, it</ed:ins></ed:replace> responds with a 207 (Multi-Status) response 
         that contains a 403 (Forbidden) status code for the act of setting 
         DAV:owner. Section 8.2.1 of <xref target="RFC2518"/> describes PROPPATCH status 
         code information, <ed:replace ed:resolves="5.1.2_responsedescription" datetime="2003-11-08"><ed:del>and</ed:del></ed:replace> Section 11 of <xref target="RFC2518"/> describes the
         Multi-Status response <ed:replace ed:resolves="5.1.2_responsedescription" datetime="2003-11-08">
         <ed:ins>and Sections 1.6 and 3.12 of <xref target="RFC3253"/> describe
         additional error marshalling for PROPPATCH attempts on protected properties</ed:ins></ed:replace>. 
</t>
<ed:replace ed:resolves="ED_example_host_names" datetime="2003-11-06"><ed:del>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
PROPPATCH /papers/ HTTP/1.1 
Host: www.example.com 
Content-type: text/xml; charset="utf-8"  
Content-Length: xxx 
Depth: 0 
Authorization: Digest username="jim",  
  realm="jim@webdav.org", nonce="...", 
  uri="/papers/", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:propertyupdate xmlns:D="DAV:"> 
  &lt;D:set> 
    &lt;D:prop> 
      &lt;D:owner> 
        &lt;D:href>http://www.example.com/acl/users/jim&lt;/D:href> 
      &lt;/D:owner> 
    &lt;/D:prop> 
  &lt;/D:set> 
&lt;/D:propertyupdate> 
</artwork></figure>
</ed:del><ed:ins>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
PROPPATCH /papers/ HTTP/1.1 
Host: www.example.com 
Content-type: text/xml; charset="utf-8"  
Content-Length: xxx 
Depth: 0 
Authorization: Digest username="jim",  
  realm="users@example.com", nonce="...", 
  uri="/papers/", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:propertyupdate xmlns:D="DAV:"> 
  &lt;D:set> 
    &lt;D:prop> 
      &lt;D:owner> 
        &lt;D:href>http://www.example.com/acl/users/jim&lt;/D:href> 
      &lt;/D:owner> 
    &lt;/D:prop> 
  &lt;/D:set> 
&lt;/D:propertyupdate> 
</artwork></figure>
</ed:ins></ed:replace>
<ed:replace ed:resolves="5.1.2_responsedescription" datetime="2003-11-08">
<ed:del>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:multistatus xmlns:D="DAV:">  
  &lt;D:response>  
    &lt;D:href>http://www.example.com/papers/&lt;/D:href> 
    &lt;D:propstat> 
      &lt;D:prop>&lt;D:owner/>&lt;/D:prop> 
      &lt;D:status>HTTP/1.1 403 Forbidden&lt;/D:status> 
      &lt;D:responsedescription> 
        Failure to set protected property (DAV:owner) 
      &lt;/D:responsedescription> 
    &lt;/D:propstat> 
  &lt;/D:response> 
&lt;/D:multistatus> 
</artwork></figure>
</ed:del><ed:ins>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:multistatus xmlns:D="DAV:">  
  &lt;D:response>  
    &lt;D:href>http://www.example.com/papers/&lt;/D:href> 
    &lt;D:propstat> 
      &lt;D:prop>&lt;D:owner/>&lt;/D:prop> 
      &lt;D:status>HTTP/1.1 403 Forbidden&lt;/D:status> 
      &lt;D:responsedescription>
        &lt;D:error>&lt;D:cannot-modify-protected-property/>&lt;/D:error>
        Failure to set protected property (DAV:owner) 
      &lt;/D:responsedescription> 
    &lt;/D:propstat> 
  &lt;/D:response> 
&lt;/D:multistatus> 
</artwork></figure>
</ed:ins></ed:replace>
</section>
</section>

<ed:replace ed:resolves="6_group_property" datetime="2003-11-06"><ed:ins>
<section title="DAV:group" anchor="PROPERTY_group">
<iref item="DAV:group property" primary="true"/>
<iref item="Properties" subitem="DAV:group" primary="true"/>
<t>
         This property identifies a particular principal as being the
         "group" of the resource. This property is commonly found on
          repositories that implement the Unix privileges model. 
</t>
<t>
         Servers MAY implement DAV:group as protected property and MAY return
         an empty DAV:group element as property value in case no group information
         is available.
</t>
<figure><artwork>
&lt;!ELEMENT group (href?)> 
</artwork></figure>
</section>
</ed:ins></ed:replace>

<section title="DAV:supported-privilege-set" anchor="PROPERTY_supported-privilege-set">
<iref item="DAV:supported-privilege-set property" primary="true"/>
<iref item="Properties" subitem="DAV:supported-privilege-set" primary="true"/>
<t>
         This is a protected property that identifies the privileges 
         defined for the resource.
</t>
<figure><artwork>
&lt;!ELEMENT supported-privilege-set (supported-privilege*)> 
</artwork></figure>
<t>
         Each privilege appears as an XML element, where aggregate 
         privileges list as sub-elements all of the privileges that they 
         aggregate. 
</t>
<figure><artwork>
&lt;!ELEMENT supported-privilege 
 (privilege, abstract?, description, supported-privilege*)> 
&lt;!ELEMENT privilege ANY> 
</artwork></figure>
<t>
         An abstract privilege MUST NOT be used in an ACE for that 
         resource. Servers MUST fail an attempt to set an abstract 
         privilege. 
</t>
<figure><artwork>
&lt;!ELEMENT abstract EMPTY> 
</artwork></figure>
<t>
         A description is a human-readable description of what this 
         privilege controls access to. Servers MUST indicate the human 
         language of the description using the xml:lang attribute and 
         SHOULD consider the HTTP Accept-Language request header when 
         selecting one of multiple available languages. 
</t>
<figure><artwork>
&lt;!ELEMENT description #PCDATA> 
</artwork></figure>
<t>
         It is envisioned that a WebDAV ACL-aware administrative client 
         would list the supported privileges in a dialog box, and allow the 
         user to choose non-abstract privileges to apply in an ACE.  The 
         privileges tree is useful programmatically to map well-known 
         privileges (defined by WebDAV or other standards groups) into 
         privileges that are supported by any particular server 
         implementation.  The privilege tree also serves to hide complexity 
         in implementations allowing large number of privileges to be 
         defined by displaying aggregates to the user. 
</t>

<section title="Example: Retrieving a List of Privileges Supported on a Resource" anchor="example.retrieving.a.list.of.privileges.supported.on.a.resource">
<t>
         This example shows a client request for the DAV:supported-privilege-set
         property on the resource 
         http://www.example.com/papers/. The value of the DAV:supported-privilege-set
         property is a tree of supported privileges (using 
         "[XML Namespace , localname]" to identify each privilege):
</t>
<figure><artwork>
  [DAV:, all] (aggregate, abstract) 
     | 
     +-- [DAV:, read] (aggregate) 
            | 
            +-- [DAV:, read-acl] (abstract) 
            +-- [DAV:, read-current-user-privilege-set] (abstract) 
     | 
     +-- [DAV:, write] (aggregate) 
            | 
            +-- [DAV:, write-acl] (abstract) 
            +-- [DAV:, write-properties] 
            +-- [DAV:, write-content] 
     | 
     +-- [DAV:, unlock]  
</artwork></figure>
<t>
         This privilege tree is not normative (except that it reflects the 
         normative aggregation rules given in <xref target="aggregation.of.predefined.privileges"/>), and many 
         possible privilege trees are possible. 
</t>
<ed:replace ed:resolves="ED_example_host_names" datetime="2003-11-06"><ed:del>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
PROPFIND /papers/ HTTP/1.1 
Host: www.example.com 
Content-type: text/xml; charset="utf-8"  
Content-Length: xxx 
Depth: 0 
Authorization: Digest username="gclemm",  
  realm="gclemm@webdav.org", nonce="...", 
  uri="/papers/", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:propfind xmlns:D="DAV:"> 
  &lt;D:prop> 
    &lt;D:supported-privilege-set/> 
  &lt;/D:prop> 
&lt;/D:propfind> 
</artwork></figure>
</ed:del><ed:ins>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
PROPFIND /papers/ HTTP/1.1 
Host: www.example.com 
Content-type: text/xml; charset="utf-8"  
Content-Length: xxx 
Depth: 0 
Authorization: Digest username="gclemm",  
  realm="users@example.com", nonce="...", 
  uri="/papers/", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:propfind xmlns:D="DAV:"> 
  &lt;D:prop> 
    &lt;D:supported-privilege-set/> 
  &lt;/D:prop> 
&lt;/D:propfind> 
</artwork></figure>
</ed:ins></ed:replace>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?>
&lt;D:multistatus xmlns:D="DAV:"> 
  &lt;D:response> 
    &lt;D:href>http://www.example.com/papers/&lt;/D:href>
    &lt;D:propstat>
      &lt;D:prop>
        &lt;D:supported-privilege-set>
          &lt;D:supported-privilege>
            &lt;D:privilege>&lt;D:all/>&lt;/D:privilege>
           &lt;D:abstract/>
            &lt;D:description xml:lang="en">
              Any operation
            &lt;/D:description>
            &lt;D:supported-privilege>
              &lt;D:privilege>&lt;D:read/>&lt;/D:privilege>
              &lt;D:description xml:lang="en">
                Read any object
              &lt;/D:description>
              &lt;D:supported-privilege>
                &lt;D:privilege>&lt;D:read-acl/>&lt;/D:privilege>
                &lt;D:abstract/>
                &lt;D:description xml:lang="en">Read ACL&lt;/D:description>
              &lt;/D:supported-privilege>
              &lt;D:supported-privilege>
                &lt;D:privilege> 
                  &lt;D:read-current-user-privilege-set/>
                &lt;/D:privilege>
                &lt;D:abstract/>
                &lt;D:description xml:lang="en">
                  Read current user privilege set property
                &lt;/D:description>
              &lt;/D:supported-privilege>
            &lt;/D:supported-privilege>
            &lt;D:supported-privilege>
              &lt;D:privilege>&lt;D:write/>&lt;/D:privilege>
              &lt;D:description xml:lang="en">
                Write any object
              &lt;/D:description>
              &lt;D:supported-privilege>
                &lt;D:privilege>&lt;D:write-acl/>&lt;/D:privilege>
                &lt;D:description xml:lang="en">
                  Write ACL
                &lt;/D:description>
                &lt;D:abstract/>
              &lt;/D:supported-privilege>
              &lt;D:supported-privilege>
                &lt;D:privilege>&lt;D:write-properties/>&lt;/D:privilege>
                &lt;D:description xml:lang="en">
                  Write properties
                &lt;/D:description>
              &lt;/D:supported-privilege>
              &lt;D:supported-privilege>
                &lt;D:privilege>&lt;D:write-content/>&lt;/D:privilege>
                &lt;D:description xml:lang="en">
                  Write resource content
                &lt;/D:description>
              &lt;/D:supported-privilege>
            &lt;/D:supported-privilege>
            &lt;D:supported-privilege>
              &lt;D:privilege>&lt;D:unlock/>&lt;/D:privilege>
              &lt;D:description xml:lang="en">
                Unlock resource
              &lt;/D:description>
            &lt;/D:supported-privilege>
          &lt;/D:supported-privilege>
        &lt;/D:supported-privilege-set>
      &lt;/D:prop>
      &lt;D:status>HTTP/1.1 200 OK&lt;/D:status>
    &lt;/D:propstat>
  &lt;/D:response>
&lt;/D:multistatus>
</artwork></figure>
</section>
</section>

<section title="DAV:current-user-privilege-set" anchor="PROPERTY_current-user-privilege-set">
<iref item="DAV:current-user-privilege-set property" primary="true"/>
<iref item="Properties" subitem="DAV:current-user-privilege-set" primary="true"/>
<t>
         DAV:current-user-privilege-set is a protected property containing 
         the exact set of privileges (as computed by the server) granted to 
         the currently authenticated HTTP user. Aggregate privileges and 
         their contained privileges are listed. A user-agent can use the 
         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 the current principal does not have permission. This 
         property is also useful for determining what operations the 
         current principal can perform, without having to actually execute 
         an operation. 
</t>
<figure><artwork>
&lt;!ELEMENT current-user-privilege-set (privilege*)> 
&lt;!ELEMENT privilege ANY> 
</artwork></figure>
<t>
         If the current user is granted a specific privilege, that 
         privilege must belong to the set of privileges that may be set on 
         this resource. Therefore, each element in the DAV:current-user-privilege-set
         property MUST identify a non-abstract privilege from 
         the DAV:supported-privilege-set property. 
</t>

<section title="Example: Retrieving the User's Current Set of Assigned Privileges" anchor="example.retrieving.the.users.current.set.of.assigned.privileges">
<t>
         Continuing the example from <xref target="example.retrieving.a.list.of.privileges.supported.on.a.resource"/>, this example shows a 
         client requesting the DAV:current-user-privilege-set property from 
         the resource with URL http://www.example.com/papers/. The username 
         of the principal making the request is "khare", and Digest 
         authentication is used in the request. The principal with username 
         "khare" has been granted the DAV:read privilege. Since the 
         DAV:read privilege contains the DAV:read-acl and DAV:read-current-user-privilege-set
         privileges (see <xref target="example.retrieving.a.list.of.privileges.supported.on.a.resource"/>), the principal 
         with username "khare" can read the ACL property, and the 
         DAV:current-user-privilege-set property. However, the DAV:all, 
         DAV:read-acl, DAV:write-acl and DAV:read-current-user-privilege-set
         privileges are not listed in the value of DAV:current-user-privilege-set,
         since (for this example) they are abstract 
         privileges. DAV:write is not listed since the principal with 
         username "khare" is not listed in an ACE granting that principal 
         write permission. 
</t>
<ed:replace ed:resolves="ED_example_host_names" datetime="2003-11-06"><ed:del>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
PROPFIND /papers/ HTTP/1.1 
Host: www.example.com 
Content-type: text/xml; charset="utf-8"  
Content-Length: xxx 
Depth: 0 
Authorization: Digest username="khare",  
  realm="khare@webdav.org", nonce="...", 
  uri="/papers/", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:propfind xmlns:D="DAV:"> 
  &lt;D:prop> 
    &lt;D:current-user-privilege-set/> 
  &lt;/D:prop> 
&lt;/D:propfind> 
</artwork></figure>
</ed:del><ed:ins>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
PROPFIND /papers/ HTTP/1.1 
Host: www.example.com 
Content-type: text/xml; charset="utf-8"  
Content-Length: xxx 
Depth: 0 
Authorization: Digest username="khare",  
  realm="users@example.com", nonce="...", 
  uri="/papers/", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:propfind xmlns:D="DAV:"> 
  &lt;D:prop> 
    &lt;D:current-user-privilege-set/> 
  &lt;/D:prop> 
&lt;/D:propfind> 
</artwork></figure>
</ed:ins></ed:replace>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:multistatus xmlns:D="DAV:">  
  &lt;D:response>  
  &lt;D:href>http://www.example.com/papers/&lt;/D:href> 
  &lt;D:propstat> 
    &lt;D:prop> 
      &lt;D:current-user-privilege-set> 
        &lt;D:privilege>&lt;D:read/>&lt;/D:privilege> 
      &lt;/D:current-user-privilege-set> 
    &lt;/D:prop> 
    &lt;D:status>HTTP/1.1 200 OK&lt;/D:status> 
  &lt;/D:propstat> 
  &lt;/D:response> 
&lt;/D:multistatus> 
</artwork></figure>
</section>
</section>


<section title="DAV:acl" anchor="PROPERTY_acl">
<iref item="DAV:acl property" primary="true"/>
<iref item="Properties" subitem="DAV:acl" primary="true"/>
<t>
         This is a protected property that specifies the list of access 
         control entries (ACEs), which define what principals are to get 
         what privileges for this resource. 
</t>
<figure><artwork>
&lt;!ELEMENT acl (ace*) > 
</artwork></figure>
<t>
         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 empty, no principal is granted any privilege. 
</t>
<figure><artwork>
&lt;!ELEMENT ace ((principal | invert), (grant|deny), protected?,
               inherited?)> 
</artwork></figure>


<section title="ACE Principal" anchor="ace.principal"> 
<t>
         The DAV:principal element identifies the principal to which this 
         ACE applies. 
</t>
<figure><artwork>
&lt;!ELEMENT principal (href | all | authenticated | unauthenticated 
 | property | self)> 
</artwork></figure>
<t>
         The current user matches DAV:href only if that user is 
         authenticated as being (or being a member of) the principal 
         identified by the URL contained by that DAV:href.  
</t>
<t>
         The current user always matches DAV:all.  
</t>
<figure><artwork>
&lt;!ELEMENT all EMPTY> 
</artwork></figure>
<t>
         The current user matches DAV:authenticated only if authenticated. 
</t>
<figure><artwork>
&lt;!ELEMENT authenticated EMPTY> 
</artwork></figure>
<t>
         The current user matches DAV:unauthenticated only if not 
         authenticated. 
</t>
<figure><artwork>
&lt;!ELEMENT unauthenticated EMPTY> 
</artwork></figure>
<t>
         DAV:all is the union of DAV:authenticated, and 
         DAV:unauthenticated. For a given request, the user matches either 
         DAV:authenticated, or DAV:unauthenticated, but not both (that is, 
         DAV:authenticated and DAV:unauthenticated are disjoint sets). 
</t>
<t>
         The current user matches a DAV:property principal in a DAV:acl 
         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 value of DAV:href identifies a principal, and the 
         current user is authenticated as being (or being a member of) that 
         principal.  For example, if the DAV:property element contained 
         &lt;DAV:owner/>, the current user would match the DAV:property 
         principal only if the current user is authenticated as matching 
         the principal identified by the DAV:owner property of the 
         resource. 
</t>
<figure><artwork>
&lt;!ELEMENT property ANY> 
</artwork></figure>
<t>
         The current user matches DAV:self in a DAV:acl property of the 
         resource only if that resource is a principal and that principal 
         matches the current user or, if the principal is a group, a member 
         of that group matches the current user. 
</t>
<figure><artwork>
&lt;!ELEMENT self EMPTY> 
</artwork></figure>
<t>
         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.  
</t>
<figure><artwork>
&lt;!ELEMENT invert principal> 
</artwork></figure>
</section>

<section title="ACE Grant and Deny">
<t>
         Each DAV:grant or DAV:deny element specifies the set of privileges 
         to be either granted or denied to the specified principal.  A 
         DAV:grant or DAV:deny element of the DAV:acl of a resource MUST 
         only contain non-abstract elements specified in the DAV:supported-privilege-set
         of that resource. 
</t>
<figure><artwork>
&lt;!ELEMENT grant (privilege+)> 
&lt;!ELEMENT deny (privilege+)> 
&lt;!ELEMENT privilege ANY> 
</artwork></figure>
</section>

<section title="ACE Protection" anchor="ace.protection">
<t>
         A server indicates an ACE is protected by including the 
         DAV:protected element in the ACE. If the ACL of a resource 
         contains an ACE with a DAV:protected element, an attempt to remove 
         that ACE from the ACL MUST fail. 
</t>
<figure><artwork>
&lt;!ELEMENT protected EMPTY> 
</artwork></figure>
</section>

<section title="ACE Inheritance">
<t>
         The presence of a DAV:inherited element indicates that this ACE is 
         inherited from another resource that is identified by the URL 
         contained in a DAV:href element.  An inherited ACE cannot be 
         modified directly, but instead the ACL on the resource from which 
         it is inherited must be modified. 
</t>
<t>
         Note that ACE inheritance is not the same as ACL initialization.  
         ACL initialization defines the ACL that a newly created resource 
         will use (if not specified).  ACE inheritance refers to an ACE 
         that is logically shared - where an update to the resource 
         containing an ACE will affect the ACE of each resource that 
         inherits that ACE.  The method by which ACLs are initialized or by 
         which ACEs are inherited is not defined by this document. 
</t>
<figure><artwork>
&lt;!ELEMENT inherited (href)> 
</artwork></figure>
</section>

<section title="Example: Retrieving a Resource's Access Control List">
<t>
         Continuing the example from Sections <xref target="example.retrieving.a.list.of.privileges.supported.on.a.resource" format="counter"/>
         and <xref target="example.retrieving.the.users.current.set.of.assigned.privileges" format="counter"/>, this example 
         shows a client requesting the DAV:acl property from the resource 
         with URL http://www.example.com/papers/. There are two ACEs 
         defined in this ACL: 
</t>
<t>
         ACE #1: The group identified by URL 
         http://www.example.com/acl/groups/maintainers (the group of site 
         maintainers) is granted DAV:write privilege. Since (for this 
         example) DAV:write contains the DAV:write-acl privilege (see 
         <xref target="example.retrieving.a.list.of.privileges.supported.on.a.resource"/>), this means the "maintainers" group can also modify 
         the access control list. 
</t>
<t>
         ACE #2: All principals (DAV:all) are granted the DAV:read 
         privilege. Since (for this example) DAV:read contains DAV:read-acl 
         and DAV:read-current-user-privilege-set, this means all users 
         (including all members of the "maintainers" group) can read the 
         DAV:acl property and the DAV:current-user-privilege-set property. 
</t>
<ed:replace ed:resolves="ED_example_host_names" datetime="2003-11-06"><ed:del>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
PROPFIND /papers/ HTTP/1.1 
Host: www.example.com 
Content-type: text/xml; charset="utf-8"  
Content-Length: xxx 
Depth: 0 
Authorization: Digest username="masinter",  
  realm="webdav.org", nonce="...", 
  uri="/papers/", response="...", opaque="..." 

&lt;D:propfind xmlns:D="DAV:"> 
  &lt;D:prop> 
    &lt;D:acl/> 
  &lt;/D:prop> 
&lt;/D:propfind> 
</artwork></figure>
</ed:del><ed:ins>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
PROPFIND /papers/ HTTP/1.1 
Host: www.example.com 
Content-type: text/xml; charset="utf-8"  
Content-Length: xxx 
Depth: 0 
Authorization: Digest username="masinter",  
  realm="users@example.com", nonce="...", 
  uri="/papers/", response="...", opaque="..." 

&lt;D:propfind xmlns:D="DAV:"> 
  &lt;D:prop> 
    &lt;D:acl/> 
  &lt;/D:prop> 
&lt;/D:propfind> 
</artwork></figure>
</ed:ins></ed:replace>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;D:multistatus xmlns:D="DAV:">  
  &lt;D:response>  
    &lt;D:href>http://www.example.com/papers/&lt;/D:href> 
    &lt;D:propstat> 
      &lt;D:prop> 
        &lt;D:acl> 
        &lt;D:ace> 
          &lt;D:principal> 
            &lt;D:href
            >http://www.example.com/acl/groups/maintainers&lt;/D:href> 
          &lt;/D:principal>  
          &lt;D:grant> 
            &lt;D:privilege>&lt;D:write/>&lt;/D:privilege> 
          &lt;/D:grant> 
        &lt;/D:ace> 
        &lt;D:ace> 
          &lt;D:principal> 
            &lt;D:all/> 
          &lt;/D:principal> 
          &lt;D:grant> 
            &lt;D:privilege>&lt;D:read/>&lt;/D:privilege>  
          &lt;/D:grant> 
        &lt;/D:ace> 
      &lt;/D:acl> 
      &lt;/D:prop> 
      &lt;D:status>HTTP/1.1 200 OK&lt;/D:status> 
    &lt;/D:propstat> 
  &lt;/D:response> 
&lt;/D:multistatus>
</artwork></figure>
</section>
</section>

<section title="DAV:acl-restrictions" anchor="PROPERTY_acl-restrictions">
<iref item="DAV:acl-restrictions property" primary="true"/>
<iref item="Properties" subitem="DAV:acl-restrictions" primary="true"/>
<t>
         This protected property defines the types of ACLs supported by 
         this server, to avoid clients needlessly getting errors.  When a 
         client tries to set an ACL via the ACL method, the server may 
         reject the attempt to set the ACL as specified.  The following 
         properties indicate the restrictions the client must observe 
         before setting an ACL: 
  <list style="hanging">
    <t hangText="&lt;grant-only>">Deny ACEs are not supported</t>
    <t hangText="&lt;no-invert>">Inverted ACEs are not supported </t>
    <t hangText="&lt;deny-before-grant>">All deny ACEs must occur before any grant ACEs</t>
    <t hangText="&lt;required-principal>">Indicates which principals are required to be present</t>
  </list>
</t>
<figure><artwork>
&lt;!ELEMENT acl-restrictions (grant-only?, no-invert?, 
                            deny-before-grant?,
                            required-principal?)> 
</artwork></figure>


<section title="DAV:grant-only" anchor="RESTRICTIONS_grant-only">
<t>
         This element indicates that ACEs with deny clauses are not 
         allowed. 
</t>
<figure><artwork>
&lt;!ELEMENT grant-only EMPTY> 
</artwork></figure>
</section>

<section title="DAV:no-invert ACE Constraint" anchor="CONSTRAINT_no-invert">
<t>
         This element indicates that ACEs with the &lt;invert> element are not 
         allowed. 
</t>
<figure><artwork>
&lt;!ELEMENT no-invert EMPTY> 
</artwork></figure>
</section>
         
<section title="DAV:deny-before-grant">
<t>
         This element indicates that all deny ACEs must precede all grant 
         ACEs. 
</t>
<figure><artwork>
&lt;!ELEMENT deny-before-grant EMPTY> 
</artwork></figure>
</section>

<section title="Required Principals">
<t>
         The required principal elements identify which principals must 
         have an ACE defined in the ACL.   
</t>
<figure><artwork>
&lt;!ELEMENT required-principal 
  (all? | authenticated? | unauthenticated? | self? | href* |
   property*)> 
</artwork></figure>
<t>
         For example, the following element requires that the ACL contain a 
         DAV:owner property ACE:
</t>
<figure><artwork>
&lt;D:required-principal xmlns:D="DAV:"> 
  &lt;D:property>&lt;D:owner/>&lt;/D:property> 
&lt;/D:required-principal> 
</artwork></figure>
</section>


<section title="Example: Retrieving DAV:acl-restrictions"> 
<ed:issue name="5.5.5_ED_section_numbering" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001712.html">
  <ed:item date="2003-11-03" entered-by="julian.reschke@greenbytes.de">
    missing section numbering for "Example: Retrieving DAV:acl-restrictions"
  </ed:item>
  <ed:resolution datetime="2003-11-04">
    Added section number (no change tracking).
  </ed:resolution>
</ed:issue>
<t>
         In this example, the client requests the value of the DAV:acl-restrictions
         property. Digest authentication provides credentials 
         for the principal operating the client. 
</t>
<ed:replace ed:resolves="ED_example_host_names" datetime="2003-11-06"><ed:del>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
PROPFIND /papers/ HTTP/1.1 
Host: www.example.com 
Content-type: text/xml; charset="utf-8"  
Content-Length: xxx 
Depth: 0 
Authorization: Digest username="srcarter",  
  realm="srcarter@webdav.org", nonce="...", 
  uri="/papers/", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:propfind xmlns:D="DAV:"> 
  &lt;D:prop> 
    &lt;D:acl-restrictions/> 
  &lt;/D:prop> 
&lt;/D:propfind> 
</artwork></figure>
</ed:del><ed:ins>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
PROPFIND /papers/ HTTP/1.1 
Host: www.example.com 
Content-type: text/xml; charset="utf-8"  
Content-Length: xxx 
Depth: 0 
Authorization: Digest username="srcarter",  
  realm="users@example.com", nonce="...", 
  uri="/papers/", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:propfind xmlns:D="DAV:"> 
  &lt;D:prop> 
    &lt;D:acl-restrictions/> 
  &lt;/D:prop> 
&lt;/D:propfind> 
</artwork></figure>
</ed:ins></ed:replace>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:multistatus xmlns:D="DAV:">  
  &lt;D:response>  
    &lt;D:href>http://www.example.com/papers/&lt;/D:href> 
    &lt;D:propstat> 
      &lt;D:prop> 
        &lt;D:acl-restrictions> 
          &lt;D:grant-only/> 
          &lt;D:required-principal> 
            &lt;D:all/> 
          &lt;/D:required-principal> 
        &lt;/D:acl-restrictions> 
      &lt;/D:prop> 
      &lt;D:status>HTTP/1.1 200 OK&lt;/D:status> 
    &lt;/D:propstat> 
  &lt;/D:response> 
&lt;/D:multistatus>
</artwork></figure>
</section>
</section>


<section title="DAV:inherited-acl-set" anchor="PROPERTY_inherited-acl-set">
<iref item="DAV:inherited-acl-set property" primary="true"/>
<iref item="Properties" subitem="DAV:inherited-acl-set" primary="true"/>
<t>
         This protected property contains a set of URLs that identify other 
         resources that also control the access to this resource.  To have 
         a privilege on a resource, not only must the ACL on that resource 
         (specified in the DAV:acl property of that resource) grant the 
         privilege, but so must the ACL of each resource identified in the 
         DAV:inherited-acl-set property of that resource.  Effectively, the 
         privileges granted by the current ACL are ANDed with the 
         privileges granted by each inherited ACL.
</t>
<figure><artwork>
&lt;!ELEMENT inherited-acl-set (href*)> 
</artwork></figure>
</section>


<section title="DAV:principal-collection-set" anchor="PROPERTY_principal-collection-set">
<iref item="DAV:principal-collection-set property" primary="true"/>
<iref item="Properties" subitem="DAV:principal-collection-set" primary="true"/>
<t>
         This protected property of a resource contains a set of URLs that 
         identify the root collections that contain the principals that are 
         available on the server that implements this resource.  A WebDAV 
         Access Control Protocol user agent could use the contents of 
         DAV:principal-collection-set to retrieve the DAV:displayname 
         property (specified in Section 13.2 of <xref target="RFC2518"/>) of all 
         principals on that server, thereby yielding human-readable names 
         for each principal that could be displayed in a user interface.
</t>
<figure><artwork>
&lt;!ELEMENT principal-collection-set (href*)> 
</artwork></figure>
<t>
         Since different servers can control different parts of the URL 
         namespace, different resources on the same host MAY have different 
         DAV:principal-collection-set values. The collections specified in 
         the DAV:principal-collection-set MAY be located on different hosts 
         from the resource. The URLs in DAV:principal-collection-set SHOULD 
         be http or https scheme URLs. For security and scalability 
         reasons, a server MAY report only a subset of the entire set of 
         known principal collections, and therefore clients should not 
         assume they have retrieved an exhaustive listing. Additionally, a 
         server MAY elect to report none of the principal collections it 
         knows about, in which case the property value would be empty.  
</t>
<t>
         The value of DAV:principal-collection-set gives the scope of the 
         DAV:principal-property-search REPORT (defined in <xref target="REPORT_principal-property-search"/>). 
         Clients use the DAV:principal-property-search REPORT to populate 
         their user interface with a list of principals. Therefore, servers 
         that limit a client's ability to obtain principal information will 
         interfere with the client's ability to manipulate access control 
         lists, due to the difficulty of getting the URL of a principal for 
         use in an ACE.
</t>

<section title="Example: Retrieving DAV:principal-collection-set">
<t>
         In this example, the client requests the value of the 
         DAV:principal-collection-set property on the collection resource 
         identified by URL http://www.example.com/papers/. The property 
         contains the two URLs, http://www.example.com/acl/users/ and 
         http://www.example.com/acl/groups/, both wrapped in DAV:href XML 
         elements. Digest authentication provides credentials for the 
         principal operating the client. 
</t>
<t>         The client might reasonably follow this request with two separate 
         PROPFIND requests to retrieve the DAV:displayname property of the 
         members of the two collections (/acl/users and /acl/groups). This 
         information could be used when displaying a user interface for 
         creating access control entries. 
</t>
<ed:replace ed:resolves="ED_example_host_names" datetime="2003-11-06"><ed:del>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
PROPFIND /papers/ HTTP/1.1 
Host: www.example.com 
Content-type: text/xml; charset="utf-8"  
Content-Length: xxx 
Depth: 0 
Authorization: Digest username="yarong",  
  realm="yarong@webdav.org", nonce="...", 
  uri="/papers/", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:propfind xmlns:D="DAV:"> 
  &lt;D:prop> 
    &lt;D:principal-collection-set/> 
  &lt;/D:prop> 
&lt;/D:propfind> 
</artwork></figure>
</ed:del><ed:ins>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
PROPFIND /papers/ HTTP/1.1 
Host: www.example.com 
Content-type: text/xml; charset="utf-8"  
Content-Length: xxx 
Depth: 0 
Authorization: Digest username="yarong",  
  realm="users@example.com", nonce="...", 
  uri="/papers/", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:propfind xmlns:D="DAV:"> 
  &lt;D:prop> 
    &lt;D:principal-collection-set/> 
  &lt;/D:prop> 
&lt;/D:propfind> 
</artwork></figure>
</ed:ins></ed:replace>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:multistatus xmlns:D="DAV:">  
  &lt;D:response>  
    &lt;D:href>http://www.example.com/papers/&lt;/D:href> 
    &lt;D:propstat> 
      &lt;D:prop> 
        &lt;D:principal-collection-set> 
          &lt;D:href>http://www.example.com/acl/users/&lt;/D:href> 
          &lt;D:href>http://www.example.com/acl/groups/&lt;/D:href> 
        &lt;/D:principal-collection-set> 
      &lt;/D:prop> 
    &lt;D:status>HTTP/1.1 200 OK&lt;/D:status> 
    &lt;/D:propstat> 
  &lt;/D:response> 
&lt;/D:multistatus> 
</artwork></figure>
</section>
</section>


<section title="Example: PROPFIND to retrieve access control properties">
<t>
         The following example shows how access control information can be 
         retrieved by using the PROPFIND method to fetch the values of the 
         DAV:owner, DAV:supported-privilege-set, DAV:current-user-privilege-set,
         and DAV:acl properties.  
</t>
<ed:replace ed:resolves="ED_example_host_names" datetime="2003-11-06"><ed:del>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
PROPFIND /top/container/ HTTP/1.1 
Host: www.example.com 
Content-type: text/xml; charset="utf-8"  
Content-Length: xxx 
Depth: 0 
Authorization: Digest username="ejw",  
  realm="users@foo.org", nonce="...", 
  uri="/top/container/", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:propfind xmlns:D="DAV:"> 
  &lt;D:prop> 
    &lt;D:owner/> 
    &lt;D:supported-privilege-set/> 
    &lt;D:current-user-privilege-set/> 
    &lt;D:acl/> 
  &lt;/D:prop> 
&lt;/D:propfind> 
</artwork></figure>
</ed:del><ed:ins>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
PROPFIND /top/container/ HTTP/1.1 
Host: www.example.com 
Content-type: text/xml; charset="utf-8"  
Content-Length: xxx 
Depth: 0 
Authorization: Digest username="ejw",  
  realm="users@example.com", nonce="...", 
  uri="/top/container/", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:propfind xmlns:D="DAV:"> 
  &lt;D:prop> 
    &lt;D:owner/> 
    &lt;D:supported-privilege-set/> 
    &lt;D:current-user-privilege-set/> 
    &lt;D:acl/> 
  &lt;/D:prop> 
&lt;/D:propfind> 
</artwork></figure>
</ed:ins></ed:replace>
<ed:replace ed:resolves="5.8_unbind" datetime="2003-11-04">
<ed:del>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:multistatus xmlns:D="DAV:" 
               xmlns:A="http://www.example.com/acl/">
  &lt;D:response>  
    &lt;D:href>http://www.example.com/top/container/&lt;/D:href> 
    &lt;D:propstat> 
      &lt;D:prop> 
        &lt;D:owner> 
          &lt;D:href>http://www.example.com/users/gclemm&lt;/D:href> 
        &lt;/D:owner> 
        &lt;D:supported-privilege-set> 
          &lt;D:supported-privilege> 
            &lt;D:privilege>&lt;D:all/>&lt;/D:privilege> 
            &lt;D:abstract/> 
            &lt;D:description xml:lang="en">
              Any operation
            &lt;/D:description> 
            &lt;D:supported-privilege> 
              &lt;D:privilege>&lt;D:read/>&lt;/D:privilege> 
              &lt;D:description xml:lang="en">
                Read any object
              &lt;/D:description> 
            &lt;/D:supported-privilege> 
            &lt;D:supported-privilege> 
              &lt;D:privilege>&lt;D:write/>&lt;/D:privilege> 
              &lt;D:abstract/> 
              &lt;D:description xml:lang="en">
                Write any object
              &lt;/D:description> 
              &lt;D:supported-privilege> 
                &lt;D:privilege>&lt;A:create/>&lt;/D:privilege> 
                &lt;D:description xml:lang="en">
                  Create an object
                &lt;/D:description> 
              &lt;/D:supported-privilege> 
              &lt;D:supported-privilege> 
                &lt;D:privilege>&lt;A:update/>&lt;/D:privilege> 
                &lt;D:description xml:lang="en">
                  Update an object
                &lt;/D:description> 
              &lt;/D:supported-privilege> 
              &lt;D:supported-privilege> 
              &lt;D:privilege>&lt;A:unbind/>&lt;/D:privilege> 
                &lt;D:description xml:lang="en">
                  Remove binding to an object
                &lt;/D:description> 
              &lt;/D:supported-privilege> 
            &lt;/D:supported-privilege> 
            &lt;D:supported-privilege> 
              &lt;D:privilege>&lt;D:read-acl/>&lt;/D:privilege> 
              &lt;D:description xml:lang="en">
                Read the ACL
              &lt;/D:description> 
            &lt;/D:supported-privilege> 
            &lt;D:supported-privilege> 
              &lt;D:privilege>&lt;D:write-acl/>&lt;/D:privilege> 
              &lt;D:description xml:lang="en">
                Write the ACL
              &lt;/D:description> 
            &lt;/D:supported-privilege> 
          &lt;/D:supported-privilege> 
        &lt;/D:supported-privilege-set> 
        &lt;D:current-user-privilege-set> 
          &lt;D:privilege>&lt;D:read/>&lt;/D:privilege> 
          &lt;D:privilege>&lt;D:read-acl/>&lt;/D:privilege> 
        &lt;/D:current-user-privilege-set> 
        &lt;D:acl> 
          &lt;D:ace> 
            &lt;D:principal> 
              &lt;D:href>http://www.example.com/users/esedlar&lt;/D:href> 
            &lt;/D:principal>  
            &lt;D:grant> 
              &lt;D:privilege>&lt;D:read/>&lt;/D:privilege> 
              &lt;D:privilege>&lt;D:write/>&lt;/D:privilege> 
              &lt;D:privilege>&lt;D:read-acl/>&lt;/D:privilege>
            &lt;/D:grant> 
          &lt;/D:ace> 
          &lt;D:ace> 
            &lt;D:principal> 
              &lt;D:href>http://www.example.com/groups/marketing&lt;/D:href> 
            &lt;/D:principal> 
            &lt;D:deny> 
              &lt;D:privilege>&lt;D:read/>&lt;/D:privilege>
            &lt;/D:deny> 
          &lt;/D:ace> 
          &lt;D:ace> 
            &lt;D:principal> 
              &lt;D:property>&lt;D:owner/>&lt;/D:property>
            &lt;/D:principal> 
            &lt;D:grant> 
              &lt;D:privilege>&lt;D:read-acl/>&lt;/D:privilege> 
              &lt;D:privilege>&lt;D:write-acl/>&lt;/D:privilege>
            &lt;/D:grant> 
          &lt;/D:ace> 
          &lt;D:ace> 
            &lt;D:principal>&lt;D:all/>&lt;/D:principal> 
            &lt;D:grant> 
              &lt;D:privilege>&lt;D:read/>&lt;/D:privilege>
            &lt;/D:grant> 
            &lt;D:inherited> 
              &lt;D:href>http://www.example.com/top&lt;/D:href> 
            &lt;/D:inherited> 
          &lt;/D:ace>
        &lt;/D:acl> 
      &lt;/D:prop> 
      &lt;D:status>HTTP/1.1 200 OK&lt;/D:status> 
    &lt;/D:propstat>
  &lt;/D:response>
&lt;/D:multistatus> 
</artwork></figure>
</ed:del>
<ed:ins>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:multistatus xmlns:D="DAV:" 
               xmlns:A="http://www.example.com/acl/">
  &lt;D:response>  
    &lt;D:href>http://www.example.com/top/container/&lt;/D:href> 
    &lt;D:propstat> 
      &lt;D:prop> 
        &lt;D:owner> 
          &lt;D:href>http://www.example.com/users/gclemm&lt;/D:href> 
        &lt;/D:owner> 
        &lt;D:supported-privilege-set> 
          &lt;D:supported-privilege> 
            &lt;D:privilege>&lt;D:all/>&lt;/D:privilege> 
            &lt;D:abstract/> 
            &lt;D:description xml:lang="en">
              Any operation
            &lt;/D:description> 
            &lt;D:supported-privilege> 
              &lt;D:privilege>&lt;D:read/>&lt;/D:privilege> 
              &lt;D:description xml:lang="en">
                Read any object
              &lt;/D:description> 
            &lt;/D:supported-privilege> 
            &lt;D:supported-privilege> 
              &lt;D:privilege>&lt;D:write/>&lt;/D:privilege> 
              &lt;D:abstract/> 
              &lt;D:description xml:lang="en">
                Write any object
              &lt;/D:description> 
              &lt;D:supported-privilege> 
                &lt;D:privilege>&lt;A:create/>&lt;/D:privilege> 
                &lt;D:description xml:lang="en">
                  Create an object
                &lt;/D:description> 
              &lt;/D:supported-privilege> 
              &lt;D:supported-privilege> 
                &lt;D:privilege>&lt;A:update/>&lt;/D:privilege> 
                &lt;D:description xml:lang="en">
                  Update an object
                &lt;/D:description> 
              &lt;/D:supported-privilege> 
            &lt;/D:supported-privilege> 
            &lt;D:supported-privilege>
              &lt;D:privilege>&lt;A:delete/>&lt;/D:privilege>
              &lt;D:description xml:lang="en">
                Delete an object
              &lt;/D:description>
            &lt;/D:supported-privilege>
            &lt;D:supported-privilege> 
              &lt;D:privilege>&lt;D:read-acl/>&lt;/D:privilege> 
              &lt;D:description xml:lang="en">
                Read the ACL
              &lt;/D:description> 
            &lt;/D:supported-privilege> 
            &lt;D:supported-privilege> 
              &lt;D:privilege>&lt;D:write-acl/>&lt;/D:privilege> 
              &lt;D:description xml:lang="en">
                Write the ACL
              &lt;/D:description> 
            &lt;/D:supported-privilege> 
          &lt;/D:supported-privilege> 
        &lt;/D:supported-privilege-set> 
        &lt;D:current-user-privilege-set> 
          &lt;D:privilege>&lt;D:read/>&lt;/D:privilege> 
          &lt;D:privilege>&lt;D:read-acl/>&lt;/D:privilege> 
        &lt;/D:current-user-privilege-set> 
        &lt;D:acl> 
          &lt;D:ace> 
            &lt;D:principal> 
              &lt;D:href>http://www.example.com/users/esedlar&lt;/D:href> 
            &lt;/D:principal>  
            &lt;D:grant> 
              &lt;D:privilege>&lt;D:read/>&lt;/D:privilege> 
              &lt;D:privilege>&lt;D:write/>&lt;/D:privilege> 
              &lt;D:privilege>&lt;D:read-acl/>&lt;/D:privilege>
            &lt;/D:grant> 
          &lt;/D:ace> 
          &lt;D:ace> 
            &lt;D:principal> 
              &lt;D:href>http://www.example.com/groups/marketing&lt;/D:href> 
            &lt;/D:principal> 
            &lt;D:deny> 
              &lt;D:privilege>&lt;D:read/>&lt;/D:privilege>
            &lt;/D:deny> 
          &lt;/D:ace> 
          &lt;D:ace> 
            &lt;D:principal> 
              &lt;D:property>&lt;D:owner/>&lt;/D:property>
            &lt;/D:principal> 
            &lt;D:grant> 
              &lt;D:privilege>&lt;D:read-acl/>&lt;/D:privilege> 
              &lt;D:privilege>&lt;D:write-acl/>&lt;/D:privilege>
            &lt;/D:grant> 
          &lt;/D:ace> 
          &lt;D:ace> 
            &lt;D:principal>&lt;D:all/>&lt;/D:principal> 
            &lt;D:grant> 
              &lt;D:privilege>&lt;D:read/>&lt;/D:privilege>
            &lt;/D:grant> 
            &lt;D:inherited> 
              &lt;D:href>http://www.example.com/top&lt;/D:href> 
            &lt;/D:inherited> 
          &lt;/D:ace>
        &lt;/D:acl> 
      &lt;/D:prop> 
      &lt;D:status>HTTP/1.1 200 OK&lt;/D:status> 
    &lt;/D:propstat>
  &lt;/D:response>
&lt;/D:multistatus> 
</artwork></figure>
</ed:ins></ed:replace>
<t>
         The value of the DAV:owner property is a single DAV:href XML 
         element containing the URL of the principal that owns this 
         resource. 
</t>
<t>         The value of the DAV:supported-privilege-set property is a tree of 
         supported privileges (using "[XML Namespace , localname]" to 
         identify each privilege): 
</t>
<ed:issue name="5.8_unbind" type="change" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001714.html">
  <ed:item date="2003-11-03" entered-by="julian.reschke@greenbytes.de">
    A:unbind: mismatch between XML response and privilege tree in figure.
  </ed:item>
  <ed:item date="2003-11-04" entered-by="eric.sedlar@oracle.com">
    The change in the XML response should be rolled back.  "delete" is a
    custom privilege in the example.
  </ed:item>
  <ed:resolution datetime="2003-11-04">
    Changed example response back to use A:delete.
  </ed:resolution>
</ed:issue>
<figure><artwork>
[DAV:, all] (aggregate, abstract) 
   | 
   +-- [DAV:, read] 
   +-- [DAV:, write] (aggregate, abstract) 
          | 
          +-- [http://www.example.com/acl, create] 
          +-- [http://www.example.com/acl, update] 
          +-- [http://www.example.com/acl, delete] 
   +-- [DAV:, read-acl] 
   +-- [DAV:, write-acl] 
</artwork></figure>
<t>
         The DAV:current-user-privilege-set property contains two 
         privileges, DAV:read, and DAV:read-acl. This indicates that the 
         current authenticated user only has the ability to read the 
         resource, and read the DAV:acl property on the resource. 
         The DAV:acl property contains a set of four ACEs: 
</t>
<t>
         ACE #1: The principal identified by the URL 
         http://www.example.com/users/esedlar is granted the DAV:read, 
         DAV:write, and DAV:read-acl privileges. 
</t>
<t>
         ACE #2: The principals identified by the URL 
         http://www.example.com/groups/marketing are denied the DAV:read 
         privilege.  In this example, the principal URL identifies a group. 
</t>
<t>
         ACE #3: In this ACE, the principal is a property principal, 
         specifically the DAV:owner property. When evaluating this ACE, the 
         value of the DAV:owner property is retrieved, and is examined to 
         see if it contains a DAV:href XML element. If so, the URL within 
         the DAV:href element is read, and identifies a principal. In this 
         ACE, the owner is granted DAV:read-acl, and DAV:write-acl 
         privileges. 
</t>
<t>
         ACE #4: This ACE grants the DAV:all principal (all users) the 
         DAV:read privilege. This ACE is inherited from the resource 
         http://www.example.com/top, the parent collection of this 
         resource. 
</t>
</section>
</section>

<section title="ACL Evaluation" anchor="acl.evaluation">
<ed:issue name="6_ED_RFC3010" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001711.html">
  <ed:item date="2003-11-03" entered-by="julian.reschke@greenbytes.de">
    Fix references ("[NFSV4]") to RFC3010.
  </ed:item>
  <ed:resolution datetime="2003-11-11">
    Replaced "[NVSV4]" by "[RFC3530]" (which obsoletes RFC3010).
  </ed:resolution>
</ed:issue>
<t>
         WebDAV ACLs are evaluated in similar manner as ACLs on Windows NT 
         and in NFSv4 <ed:replace ed:resolves="6_ED_RFC3010" datetime="2003-11-01"><ed:del>[NFSV4]</ed:del><ed:ins><xref target="RFC3530"/></ed:ins></ed:replace>).  An ACL is evaluated to determine whether 
         or not access will be granted for a WebDAV request.  ACEs are 
         maintained in a particular order, and are evaluated until all of 
         the permissions required by the current request have been granted, 
         at which point the ACL evaluation is terminated and access is 
         granted.  If, during ACL evaluation, a &lt;deny> ACE (matching the 
         current user) is encountered for a privilege which has not yet 
         been granted, the ACL evaluation is terminated and access is 
         denied.  Failure to have all required privileges granted results 
         in access being denied. 
</t>
<t>
         Note that the semantics of many other existing ACL systems may be 
         represented via this mechanism, by mixing deny and grant ACEs.  
         For example, consider the standard "rwx" privilege scheme used by 
         UNIX.  In this scheme, if the current user is the owner of the 
         file, access is granted if the corresponding privilege bit is set 
         and denied if not set, regardless of the permissions set on the 
         file<ed:replace datetime="2003-11-04" ed:resolves="ED_non_ASCII"><ed:del>&#x2019;</ed:del><ed:ins>'</ed:ins></ed:replace>s group and for the world.  An ACL for UNIX permissions of 
         "r--rw-r--" might be constructed like: 
</t>
<ed:issue name="6_group_property" type="change" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001713.html">
  <ed:item date="2003-11-03" entered-by="julian.reschke@greenbytes.de">
    in section 6 the following example is used...:
        
    &lt;D:principal>&lt;D:property>&lt;D:group/>&lt;/D:property>&lt;/D:principal>
    
    However, there is no such thing as a DAV:group property. I'm not sure 
    what the best fix for this would be... If the "group" thing is 
    essential, this may mean that an important live property is missing? If 
    it's not essential, can this example rewritten without that property? 
    (Or with a non-DAV: property from an example namespace?)
  </ed:item>
  <ed:item date="2003-11-06" entered-by="geoffry.clemm@us.ibm.com">
    Proposal to add DAV:group property.
  </ed:item>
  <ed:item date="2003-11-06" entered-by="eric.sedlar@oracle.com">
    I have a problem with adding this property.  If a particular vendor wants to
    add &lt;vendor:group> that's great, but I think we are going to have minimal
    interoperability with this.  We discussed this before and weren't able to
    find anyone who actually wanted to use this.
  </ed:item>
  <ed:resolution datetime="2003-11-06">
    Added section 5.2 ("DAV:group"). Subsequent sections renumbered.
  </ed:resolution>
</ed:issue>
<figure><artwork>
&lt;D:acl> 
  &lt;D:ace> 
    &lt;D:principal>
      &lt;D:property>&lt;D:owner/>&lt;/D:property>
    &lt;/D:principal> 
    &lt;D:grant>
      &lt;D:privilege>&lt;D:read/>&lt;/D:privilege>
    &lt;/D:grant> 
  &lt;/D:ace> 
  &lt;D:ace> 
    &lt;D:principal>
      &lt;D:property>&lt;D:owner/>&lt;/D:property>
    &lt;/D:principal> 
    &lt;D:deny>
      &lt;D:privilege>&lt;D:all/>&lt;/D:privilege>
    &lt;/D:deny> 
  &lt;/D:ace> 
  &lt;D:ace> 
    &lt;D:principal>
      &lt;D:property>&lt;D:group/>&lt;/D:property>
    &lt;/D:principal> 
    &lt;D:grant>
      &lt;D:privilege>&lt;D:read/>&lt;/D:privilege> 
      &lt;D:privilege>&lt;D:write/>&lt;/D:privilege>
    &lt;/D:grant> 
  &lt;/D:ace> 
  &lt;D:ace> 
    &lt;D:principal>
      &lt;D:property>&lt;D:group/>&lt;/D:property>
    &lt;/D:principal> 
    &lt;D:deny>
      &lt;D:privilege>&lt;D:all/>&lt;/D:privilege>
    &lt;/D:deny> 
  &lt;/D:ace> 
  &lt;D:ace> 
    &lt;D:principal>&lt;D:all>&lt;/D:principal> 
    &lt;D:grant>
      &lt;D:privilege>&lt;D:read/>&lt;/D:privilege>
    &lt;/D:grant> 
  &lt;/D:ace> 
&lt;/D:acl> 
</artwork></figure>
<t>
         and the &lt;acl-restrictions> would be defined as: 
</t>
<figure><artwork>
&lt;D:no-invert/>
&lt;D:required-principal> 
  &lt;D:all/> 
  &lt;D:property>&lt;D:owner/>&lt;/D:property> 
  &lt;D:property>&lt;D:group/>&lt;D:group/> 
&lt;/D:required-principal> 
</artwork></figure>
<t>
         Note that the client can still get errors from a UNIX server in 
         spite of obeying the &lt;acl-restrictions>, including &lt;D:allowed-principal>
         (adding an ACE specifying a principal other than the 
         ones in the ACL above) or &lt;D:ace-conflict> (by trying to reorder 
         the ACEs in the example above), as these particular implementation 
         semantics are too complex to be captured with the simple (but 
         general) declarative restrictions. 
</t>
 </section>


<section title="Access Control and existing methods"  anchor="access.control.and.existing.methods">
<t>
         This section defines the impact of access control functionality on 
         existing methods. 
</t>

<section title="Any HTTP method"> 

<section title="Error Handling"> 
<t>
         The WebDAV ACL mechanism requires the usage of HTTP method 
         "preconditions" as described in section 1.6 of RFC3253 for ALL 
         HTTP methods.  All HTTP methods have an additional precondition 
         called DAV:need-privileges.  If an HTTP method fails due to 
         insufficient privileges, the response body to the "403 Forbidden" 
         error MUST contain the &lt;DAV:error> element, which in turn contains 
         the &lt;DAV:need-privileges> element, which contains one or more 
         &lt;DAV:resource> elements indicating which resource had insufficient 
         privileges, and what the lacking privileges were: 
</t>
<figure><artwork>
&lt;!ELEMENT need-privileges (resource)* > 
&lt;!ELEMENT resource ( href , privilege ) > 
</artwork></figure>
<t>
         Since some methods require multiple permissions on multiple 
         resources, this information is needed to resolve any ambiguity.  
         There is no requirement that all privilege violations be reported<ed:replace datetime="2003-11-04" ed:resolves="ED_non_ASCII"><ed:del>&#x2014;</ed:del><ed:ins> - </ed:ins></ed:replace>for
         implementation reasons, some servers may only report the first 
         privilege violation. For example: 
</t>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
MOVE /a/b/ HTTP/1.1 
Host: www.example.com 
Destination: http://www.example.com/c/d 
</artwork></figure>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 403 Forbidden 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;D:error xmlns:D="DAV:"> 
  &lt;D:need-privileges> 
    &lt;D:resource> 
      &lt;D:href>/a&lt;/D:href> 
      &lt;D:privilege>&lt;D:unbind/>&lt;/D:privilege> 
    &lt;/D:resource> 
    &lt;D:resource> 
      &lt;D:href>/c&lt;/D:href> 
      &lt;D:privilege>&lt;D:bind/>&lt;/D:privilege> 
    &lt;/D:resource> 
  &lt;/D:need-privileges> 
&lt;/D:error> 
</artwork></figure>
</section>
</section>

<section title="OPTIONS" anchor="METHOD_options"> 
<iref item="DAV header" subitem="compliance class 'access-control'" primary="true"/>
<t>
         If the server supports access control, it MUST return "access-control"
         as a field in the DAV response header from an OPTIONS 
         request on any resource implemented by that server. A value of 
         "access-control" in the DAV header MUST indicate that the server 
         supports all MUST level requirements and REQUIRED features 
         specified in this document. 
</t>

<section title="Example - OPTIONS"> 
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
OPTIONS /foo.html HTTP/1.1  
Host: www.example.com 
Content-Length: 0 
</artwork></figure>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 200 OK 
DAV: 1, 2, access-control 
Allow: OPTIONS, GET, PUT, PROPFIND, PROPPATCH, ACL 
</artwork></figure>
<t>
         In this example, the OPTIONS response indicates that the server 
         supports access control and that /foo.html can have its access 
         control list modified by the ACL method.
</t>
 </section>
 </section>

<section title="MOVE">
<t>
         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 property of the resource MUST NOT be modified, or the MOVE 
         request fails. Handling of inherited and protected ACEs is 
         intentionally undefined to give server implementations flexibility 
         in how they implement ACE inheritance and protection. 
</t>
</section>


<section title="COPY">
<t>
         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 
         resource creation request (e.g. MKCOL, PUT). Clients wishing to 
         preserve the DAV:acl property across a copy need to read the 
         DAV:acl property prior to the COPY, then perform an ACL operation 
         on the new resource at the destination to restore, insofar as this 
         is possible, the original access control list. 
</t>
</section>

<section title="LOCK"> 
<t>
         A lock on a resource ensures that only the lock owner can modify 
         ACEs that are not inherited and not protected  (these are the only 
         ACEs that a client can modify with an ACL request). A lock does 
         not protect inherited or protected ACEs, since a client cannot 
         modify them with an ACL request on that resource. 
</t>
</section>
</section>

<section title="Access Control Methods" anchor="access.control.methods">

<section title="ACL"> 
<iref item="ACL method" primary="true"/>
<iref item="Methods" subitem="ACL" primary="true"/>
<t>
         The ACL method modifies the access control list (which can be read 
         via the DAV:acl property) of a resource.  Specifically, the ACL 
         method only permits modification to ACEs that are not inherited, 
         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 (specified in <xref target="PROPERTY_acl"/>) of the request body. An ACL 
         request body MUST contain only one DAV:acl XML element. Unless the 
         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.
</t>
<t>
         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 that resource. If this is the case, an ACL request only 
         modifies the set of ACEs visible to the current user, and does not 
         affect any non-visible ACE. 
</t>
<t>
         In order to avoid overwriting DAV:acl changes by another client, a 
         client SHOULD acquire a WebDAV lock on the resource before 
         retrieving the DAV:acl property of a resource that it intends on 
         updating. 
</t>
<t>
  <list><t>
           Implementation Note: Two common operations are to add or remove 
           an ACE from an existing access control list. To accomplish 
           this, a client uses the PROPFIND method to retrieve the value 
           of the DAV:acl property, then parses the returned access 
           control list to remove all inherited and protected ACEs (these 
           ACEs are tagged with the DAV:inherited and DAV:protected XML 
           elements). In the remaining set of non-inherited, non-protected 
           ACEs, the client can add or remove one or more ACEs before 
           submitting the final ACE set in the request body of the ACL 
           method. 
  </t></list>
</t>
<section title="ACL Preconditions" anchor="acl.preconditions"> 
<t>
         An implementation MUST enforce the following constraints on an ACL 
         request.  If the constraint is violated, a 403 (Forbidden) or 409 
         (Conflict) response MUST be returned and the indicated XML element 
         MUST be returned as a child of a top level DAV:error element in an 
         XML response body. 
</t>
<t>
         Though these status elements are generally expressed as empty XML 
         elements (and are defined as EMPTY in the DTD), implementations 
         MAY return additional descriptive XML elements as children of the 
         status element. Clients MUST be able to accept children of these 
         status elements. Clients that do not understand the additional XML 
         elements should ignore them. 
</t>
<t>
  <iref item="DAV:no-ace-conflict precondition" primary="true"/>
  <iref item="Condition Names" subitem="DAV:no-ace-conflict (pre)" primary="true"/>
         (DAV:no-ace-conflict): The ACEs submitted in the ACL request MUST 
         NOT conflict with each other.  This is a catchall error code 
         indicating that an implementation-specific ACL restriction has 
         been violated. 
</t>
<t>
  <iref item="DAV:no-protected-ace-conflict precondition" primary="true"/>
  <iref item="Condition Names" subitem="DAV:no-protected-ace-conflict (pre)" primary="true"/>
         (DAV:no-protected-ace-conflict): The ACEs submitted in the ACL 
         request MUST NOT conflict with the protected ACEs on the resource. 
         For example, if the resource has a protected ACE 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. 
</t>
<t>
  <iref item="DAV:no-inherited-ace-conflict precondition" primary="true"/>
  <iref item="Condition Names" subitem="DAV:no-inherited-ace-conflict (pre)" primary="true"/>
         (DAV:no-inherited-ace-conflict): The ACEs submitted in the ACL 
         request MUST NOT conflict with the inherited ACEs on the resource. 
         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 MUST either 
         report this error or 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. 
</t>
<t>
  <iref item="DAV:limited-number-of-aces precondition" primary="true"/>
  <iref item="Condition Names" subitem="DAV:limited-number-of-aces (pre)" primary="true"/>
         (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 privileges to a group. 
</t>
<t>
  <iref item="DAV:deny-before-grant precondition" primary="true"/>
  <iref item="Condition Names" subitem="DAV:deny-before-grant (pre)" primary="true"/>
         (DAV:deny-before-grant): All non-inherited deny ACEs MUST precede 
         all non-inherited grant ACEs. 
</t>
<t>
  <iref item="DAV:grant-only precondition" primary="true"/>
  <iref item="Condition Names" subitem="DAV:grant-only (pre)" primary="true"/>
         (DAV:grant-only): The ACEs submitted in the ACL request MUST NOT 
         include a deny ACE.  This precondition applies only when the ACL 
         restrictions of the resource include the DAV:grant-only constraint 
         (defined in <xref target="RESTRICTIONS_grant-only"/>). 
</t>
<ed:issue name="5.5.2_TYPO" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-October/001691.html">
  <ed:item date="2003-10-22" entered-by="peter.nevermann@softwareag.com">
    Precondition DAV:no-invert should refer to section 5.5.2 for the
    DAV:no-invert constraint ... not 6.3.4.
  </ed:item>
  <ed:resolution datetime="2003-11-04">
    Reference fixed.
  </ed:resolution>
</ed:issue>
<t>
  <iref item="DAV:no-invert precondition" primary="true"/>
  <iref item="Condition Names" subitem="DAV:no-invert (pre)" primary="true"/>
         (DAV:no-invert):  The ACL request MUST NOT include a DAV:invert 
         element.   This precondition applies only when the ACL semantics 
         of the resource includes the DAV:no-invert constraint (defined in 
         <ed:replace ed:resolves="5.5.2_TYPO" datetime="2003-11-04"><ed:del>Section 6.3.4</ed:del><ed:ins><xref target="CONSTRAINT_no-invert"/></ed:ins></ed:replace>). 
</t>
<t>
  <iref item="DAV:no-abstract precondition" primary="true"/>
  <iref item="Condition Names" subitem="DAV:no-abstract (pre)" primary="true"/>
         (DAV:no-abstract): The ACL request MUST NOT attempt to grant or 
         deny an abstract privilege (see <xref target="PROPERTY_supported-privilege-set"/>). 
</t>
<t>
  <iref item="DAV:not-supported-privilege precondition" primary="true"/>
  <iref item="Condition Names" subitem="DAV:not-supported-privilege (pre)" primary="true"/>
         (DAV:not-supported-privilege): The ACEs submitted in the ACL 
         request MUST be supported by the resource. 
</t>
<t>
  <iref item="DAV:missing-required-principal precondition" primary="true"/>
  <iref item="Condition Names" subitem="DAV:missing-required-principal (pre)" primary="true"/>
         (DAV:missing-required-principal): The result of the ACL request 
         MUST have at least one ACE for each principal identified in a 
         DAV:required-principal XML element in the ACL semantics of that 
         resource (see <xref target="PROPERTY_acl"/>). 
</t>
<t>
  <iref item="DAV:recognized-principal precondition" primary="true"/>
  <iref item="Condition Names" subitem="DAV:recognized-principal (pre)" primary="true"/>
         (DAV:recognized-principal): Every principal URL in the ACL request 
         MUST identify a principal resource. 
</t>
<t>
  <iref item="DAV:allowed-principal precondition" primary="true"/>
  <iref item="Condition Names" subitem="DAV:allowed-principal (pre)" primary="true"/>
         (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. 
</t>
</section>

<section title="Example: the ACL method"> 
<t>
         In the following example, user "fielding", authenticated by 
         information in the Authorization header, grants the principal 
         identified by the URL http://www.example.com/users/esedlar  (i.e., 
         the user "esedlar") read and write privileges, grants the owner of 
         the resource read-acl and write-acl privileges, and grants 
         everyone read privileges.  
</t>
<ed:replace ed:resolves="ED_example_host_names" datetime="2003-11-06"><ed:del>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
ACL /top/container/ HTTP/1.1 
Host: www.example.com 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxxx 
Authorization: Digest username="fielding",  
  realm="users@foo.org", nonce="...", 
  uri="/top/container/", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:acl xmlns:D="DAV:"> 
  &lt;D:ace> 
    &lt;D:principal> 
      &lt;D:href>http://www.example.com/users/esedlar&lt;/D:href> 
    &lt;/D:principal> 
    &lt;D:grant> 
      &lt;D:privilege>&lt;D:read/>&lt;/D:privilege> 
      &lt;D:privilege>&lt;D:write/>&lt;/D:privilege>  
    &lt;/D:grant> 
  &lt;/D:ace> 
  &lt;D:ace> 
    &lt;D:principal> 
      &lt;D:property>&lt;D:owner/>&lt;/D:property>  
    &lt;/D:principal> 
    &lt;D:grant> 
      &lt;D:privilege>&lt;D:read-acl/>&lt;/D:privilege> 
      &lt;D:privilege>&lt;D:write-acl/>&lt;/D:privilege>  
    &lt;/D:grant> 
  &lt;/D:ace> 
  &lt;D:ace> 
    &lt;D:principal>&lt;D:all/>&lt;/D:principal> 
    &lt;D:grant> 
      &lt;D:privilege>&lt;D:read/>&lt;/D:privilege> 
    &lt;/D:grant> 
  &lt;/D:ace>
&lt;/D:acl> 
</artwork></figure>
</ed:del><ed:ins>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
ACL /top/container/ HTTP/1.1 
Host: www.example.com 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxxx 
Authorization: Digest username="fielding",  
  realm="users@example.com", nonce="...", 
  uri="/top/container/", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:acl xmlns:D="DAV:"> 
  &lt;D:ace> 
    &lt;D:principal> 
      &lt;D:href>http://www.example.com/users/esedlar&lt;/D:href> 
    &lt;/D:principal> 
    &lt;D:grant> 
      &lt;D:privilege>&lt;D:read/>&lt;/D:privilege> 
      &lt;D:privilege>&lt;D:write/>&lt;/D:privilege>  
    &lt;/D:grant> 
  &lt;/D:ace> 
  &lt;D:ace> 
    &lt;D:principal> 
      &lt;D:property>&lt;D:owner/>&lt;/D:property>  
    &lt;/D:principal> 
    &lt;D:grant> 
      &lt;D:privilege>&lt;D:read-acl/>&lt;/D:privilege> 
      &lt;D:privilege>&lt;D:write-acl/>&lt;/D:privilege>  
    &lt;/D:grant> 
  &lt;/D:ace> 
  &lt;D:ace> 
    &lt;D:principal>&lt;D:all/>&lt;/D:principal> 
    &lt;D:grant> 
      &lt;D:privilege>&lt;D:read/>&lt;/D:privilege> 
    &lt;/D:grant> 
  &lt;/D:ace>
&lt;/D:acl> 
</artwork></figure>
</ed:ins></ed:replace>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 200 OK 
</artwork></figure>
</section>

<section title="Example: ACL method failure due to protected ACE conflict"> 
<t>
         In the following request, user "fielding", authenticated by 
         information in the Authorization header, attempts to deny the 
         principal identified by the URL 
         http://www.example.com/users/esedlar  (i.e., the user "esedlar") 
         write privileges. Prior to the request, the DAV:acl property on 
         the resource contained a protected ACE (see <xref target="ace.protection"/>) 
         granting DAV:owner the DAV:read and DAV:write privileges. The 
         principal identified by URL http://www.example.com/users/esedlar 
         is the owner of the resource. The ACL method invocation fails 
         because the submitted ACE conflicts with the protected ACE, thus 
         violating the semantics of ACE protection. 
</t>
<ed:replace ed:resolves="ED_example_host_names" datetime="2003-11-06"><ed:del>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
ACL /top/container/ HTTP/1.1 
Host: www.example.com 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxxx 
Authorization: Digest username="fielding",  
  realm="users@foo.org", nonce="...", 
  uri="/top/container/", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:acl xmlns:D="DAV:"> 
  &lt;D:ace> 
    &lt;D:principal> 
      &lt;D:href>http://www.example.com/users/esedlar&lt;/D:href> 
    &lt;/D:principal> 
    &lt;D:deny>  
      &lt;D:privilege>&lt;D:write/>&lt;/D:privilege>  
    &lt;/D:deny> 
  &lt;/D:ace> 
&lt;/D:acl> 
</artwork></figure>
</ed:del><ed:ins>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
ACL /top/container/ HTTP/1.1 
Host: www.example.com 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxxx 
Authorization: Digest username="fielding",  
  realm="users@example.com", nonce="...", 
  uri="/top/container/", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:acl xmlns:D="DAV:"> 
  &lt;D:ace> 
    &lt;D:principal> 
      &lt;D:href>http://www.example.com/users/esedlar&lt;/D:href> 
    &lt;/D:principal> 
    &lt;D:deny>  
      &lt;D:privilege>&lt;D:write/>&lt;/D:privilege>  
    &lt;/D:deny> 
  &lt;/D:ace> 
&lt;/D:acl> 
</artwork></figure>
</ed:ins></ed:replace>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 403 Forbidden 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:error xmlns:D="DAV:"> 
  &lt;D:no-protected-ace-conflict/> 
&lt;/D:error> 
</artwork></figure>
</section>

<section title="Example: ACL method failure due to an inherited ACE conflict"> 
<t>
         In the following request, user "ejw", authenticated by information 
         in the Authorization header, tries to change the access control 
         list on the resource http://www.example.com/top/index.html. This 
         resource has two inherited ACEs.  
</t>
<t>
         Inherited ACE #1 grants the principal identified by URL 
         http://www.example.com/users/ejw (i.e., the user "ejw") 
         http://www.example.com/privs/write-all and DAV:read-acl 
         privileges. On this server, http://www.example.com/privs/write-all 
         is an aggregate privilege containing DAV:write, and DAV:write-acl.  
</t>
<t>
         Inherited ACE #2 grants principal DAV:all the DAV:read privilege. 
</t>
<t>
         The request attempts to set a (non-inherited) ACE, denying the 
         principal identified by the URL http://www.example.com/users/ejw 
         (i.e., the user "ejw") DAV:write permission. This conflicts with 
         inherited ACE #1. Note that the decision to report an inherited 
         ACE conflict is specific to this server implementation. Another 
         server implementation could have allowed the new ACE to be set, 
         and then used normal ACE evaluation rules to determine whether the 
         new ACE has any impact on the privileges available to a principal. 
</t>
<ed:replace ed:resolves="ED_example_host_names" datetime="2003-11-06"><ed:del>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
ACL /top/index.html HTTP/1.1 
Host: www.example.com 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxxx 
Authorization: Digest username="ejw",  
  realm="users@foo.org", nonce="...", 
  uri="/top/index.html", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:acl xmlns:D="DAV:" xmlns:F="http://www.example.com/privs/"> 
  &lt;D:ace> 
    &lt;D:principal> 
       &lt;D:href>http://www.example.com/users/ejw&lt;/D:href> 
    &lt;/D:principal> 
    &lt;D:grant>&lt;D:write/>&lt;/D:grant> 
  &lt;/D:ace> 
&lt;/D:acl> 
</artwork></figure>
</ed:del><ed:ins>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
ACL /top/index.html HTTP/1.1 
Host: www.example.com 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxxx 
Authorization: Digest username="ejw",  
  realm="users@example.com", nonce="...", 
  uri="/top/index.html", response="...", opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:acl xmlns:D="DAV:" xmlns:F="http://www.example.com/privs/"> 
  &lt;D:ace> 
    &lt;D:principal> 
       &lt;D:href>http://www.example.com/users/ejw&lt;/D:href> 
    &lt;/D:principal> 
    &lt;D:grant>&lt;D:write/>&lt;/D:grant> 
  &lt;/D:ace> 
&lt;/D:acl> 
</artwork></figure>
</ed:ins></ed:replace>
<figure><preamble>
>> Response &lt;&lt; 
</preamble>
<ed:replace ed:resolves="ED_xml_typos" datetime="2003-12-22"><ed:del>
<artwork>
HTTP/1.1 403 Forbidden 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:error xmlns:D="DAV:"> 
  &lt;D:no-inherited-ace-conflict xmlns:D="DAV:"/> 
&lt;/D:error> 
</artwork>
</ed:del><ed:ins>
<artwork>
HTTP/1.1 403 Forbidden 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:error xmlns:D="DAV:"> 
  &lt;D:no-inherited-ace-conflict/> 
&lt;/D:error> 
</artwork>
</ed:ins>
</ed:replace>
</figure>
</section>

<section title="Example: ACL method failure due to an attempt to set grant and deny in a single ACE"> 
<t>
         In this example, user "ygoland", authenticated by information in 
         the Authorization header, tries to change the access control list 
         on the resource http://www.example.com/diamond/engagement-ring.gif.
         The ACL request includes a single, syntactically and 
         semantically incorrect ACE, which attempts to grant the group 
         identified by the URL http://www.example.com/users/friends 
         DAV:read privilege and deny the principal identified by URL 
         http://www.example.com/users/ygoland-so (i.e., the user "ygoland-so")
         DAV:read privilege. However, it is illegal to have multiple 
         principal elements, as well as both a grant and deny element in 
         the same ACE, so the request fails due to poor syntax. 
</t>
<ed:replace ed:resolves="ED_example_host_names" datetime="2003-11-06"><ed:del>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
ACL /diamond/engagement-ring.gif HTTP/1.1 
Host: www.example.com 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxxx 
Authorization: Digest username="ygoland",  
  realm="users@foo.org", nonce="...", 
  uri="/diamond/engagement-ring.gif", response="...", 
  opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:acl xmlns:D="DAV:"> 
  &lt;D:ace> 
    &lt;D:principal> 
      &lt;D:href>http://www.example.com/users/friends&lt;/D:href> 
    &lt;/D:principal> 
    &lt;D:grant>&lt;D:read/>&lt;/D:grant> 
    &lt;D:principal> 
      &lt;D:href>http://www.example.com/users/ygoland-so&lt;/D:href> 
    &lt;/D:principal> 
    &lt;D:deny>&lt;D:read/>&lt;/D:deny> 
  &lt;/D:ace> 
&lt;/D:acl> 
</artwork></figure>
</ed:del><ed:ins>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
ACL /diamond/engagement-ring.gif HTTP/1.1 
Host: www.example.com 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxxx 
Authorization: Digest username="ygoland",  
  realm="users@example.com", nonce="...", 
  uri="/diamond/engagement-ring.gif", response="...", 
  opaque="..." 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:acl xmlns:D="DAV:"> 
  &lt;D:ace> 
    &lt;D:principal> 
      &lt;D:href>http://www.example.com/users/friends&lt;/D:href> 
    &lt;/D:principal> 
    &lt;D:grant>&lt;D:read/>&lt;/D:grant> 
    &lt;D:principal> 
      &lt;D:href>http://www.example.com/users/ygoland-so&lt;/D:href> 
    &lt;/D:principal> 
    &lt;D:deny>&lt;D:read/>&lt;/D:deny> 
  &lt;/D:ace> 
&lt;/D:acl> 
</artwork></figure>
</ed:ins></ed:replace>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 400 Bad Request 
Content-Length: 0 
</artwork></figure>
<t>
         Note that if the request had been divided into two ACEs, one to 
         grant, and one to deny, the request would have been syntactically 
         well formed. 
</t>
</section>
</section>
</section>
 
<section title="Access Control Reports" anchor="access.control.reports">

<section title="REPORT Method"> 
<t>
         The REPORT method (defined in Section 3.6 of <xref target="RFC3253"/>) provides 
         an extensible mechanism for obtaining information about a 
         resource.  Unlike the PROPFIND method, which returns the value of 
         one or more named properties, the REPORT method can involve more 
         complex processing. REPORT is valuable in cases where the server 
         has access to all of the information needed to perform the complex 
         request (such as a query), and where it would require multiple 
         requests for the client to retrieve the information needed to 
         perform the same request. 
</t>
<t>
         A server that supports the WebDAV Access Control Protocol MUST 
         support the DAV:expand-property report (defined in Section 3.8 of 
         <xref target="RFC3253"/>). 
</t>
</section>

<section title="DAV:acl-principal-prop-set Report" anchor="REPORT_acl-principal-prop-set">
<iref item="DAV:acl-principal-prop-set report" primary="true"/>
<iref item="Reports" subitem="DAV:acl-principal-prop-set" primary="true"/>
<t>
         The DAV:acl-principal-prop-set report returns, for all principals 
         in the DAV:acl property (of the Request-URI) that are identified 
         by http(s) URLs or by a DAV:property principal, the value of the 
         properties specified in the REPORT request body. In the case where 
         a principal URL appears multiple times, the DAV:acl-principal-prop-set
         report MUST return the properties for that principal only 
         once. Support for this report is REQUIRED. 
 </t>
<t>
         One expected use of this report is to retrieve the human readable 
         name (found in the DAV:displayname property) of each principal 
         found in an ACL. This is useful for constructing user interfaces 
         that show each ACE in a human readable form. 
</t>
<t>
       Marshalling
  <list><t>
         The request body MUST be a DAV:acl-principal-prop-set XML element. 
<figure><artwork>
   &lt;!ELEMENT acl-principal-prop-set ANY> 
   ANY value: a sequence of one or more elements, with at most one
              DAV:prop element. 
   prop: see RFC 2518, Section 12.11 
</artwork></figure>
      </t>
      <t>
         This report is only defined when the Depth header has value "0"; 
         other values result in a 400 (Bad Request) error response. Note 
         that <xref target="RFC3253"/>, Section 3.6, states that if the Depth header is 
         not present, it defaults to a value of "0". 
      </t>
      <t>
         The response body for a successful request MUST be a 
         DAV:multistatus XML element (i.e., the response uses the same 
         format as the response for PROPFIND). In the case where there are 
         no response elements, the returned multistatus XML element is 
         empty. 
<figure><artwork>
   multistatus: see RFC 2518, Section 12.9 
</artwork></figure>
      </t>
      <t>
         The response body for a successful DAV:acl-principal-prop-set 
         REPORT request MUST contain a DAV:response element for each 
         principal identified by an http(s) URL listed in a DAV:principal 
         XML element of an ACE within the DAV:acl property of the resource 
         identified by the Request-URI. 
      </t>
    </list>
</t>
<t>
       Postconditions:
       <list>
        <t>
          <iref item="DAV:number-of-matches-within-limits postcondition" primary="true"/>
          <iref item="Condition Names" subitem="DAV:number-of-matches-within-limits (post)" primary="true"/>
         (DAV:number-of-matches-within-limits): The number of matching 
         principals must fall within server-specific, predefined limits. 
         For example, this condition might be triggered if a search 
         specification would cause the return of an extremely large number 
         of responses. 
        </t>
       </list>
</t>

<section title="Example: DAV:acl-principal-prop-set Report"> 
<t>
         Resource http://www.example.com/index.html has an ACL with three 
         ACEs: 
</t>
<t>
         ACE #1: All principals (DAV:all) have DAV:read and DAV:read-current-user-privilege-set
         access. 
</t>
<t>
         ACE #2: The principal identified by 
         http://www.example.com/people/gstein (the user "gstein") is 
         granted DAV:write,  DAV:write-acl, DAV:read-acl privileges. 
</t>
<t>
         ACE #3: The group identified by 
         http://www.example.com/groups/authors (the "authors" group) is 
         granted DAV:write and DAV:read-acl privileges. 
</t>
<t>
         The following example shows a DAV:acl-principal-prop-set report 
         requesting the DAV:displayname property. It returns the value of 
         DAV:displayname for resources http://www.example.com/people/gstein 
         and http://www.example.com/groups/authors , but not for DAV:all, 
         since this is not an http(s) URL.  
</t>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
REPORT /index.html HTTP/1.1 
Host: www.example.com 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxxx 
Depth: 0  

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:acl-principal-prop-set xmlns:D="DAV:"> 
  &lt;D:prop> 
    &lt;D:displayname/> 
  &lt;/D:prop> 
&lt;/D:acl-principal-prop-set> 
</artwork></figure>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxxx 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:multistatus xmlns:D="DAV:"> 
  &lt;D:response> 
    &lt;D:href>http://www.example.com/people/gstein&lt;/D:href> 
    &lt;D:propstat> 
      &lt;D:prop> 
        &lt;D:displayname>Greg Stein&lt;/D:displayname> 
      &lt;/D:prop> 
      &lt;D:status>HTTP/1.1 200 OK&lt;/D:status> 
    &lt;/D:propstat> 
  &lt;/D:response> 
  &lt;D:response> 
    &lt;D:href>http://www.example.com/groups/authors&lt;/D:href> 
    &lt;D:propstat> 
      &lt;D:prop> 
        &lt;D:displayname>Site authors&lt;/D:displayname> 
      &lt;/D:prop> 
      &lt;D:status>HTTP/1.1 200 OK&lt;/D:status>  
    &lt;/D:propstat> 
  &lt;/D:response> 
&lt;/D:multistatus> 
</artwork></figure>
</section>
</section>

<section title="DAV:principal-match REPORT" anchor="REPORT_principal-match"> 
<iref item="DAV:principal-match report" primary="true"/>
<iref item="Reports" subitem="DAV:principal-match" primary="true"/>
<t>
         The DAV:principal-match REPORT is used to identify all members (at 
         any depth) of the collection identified by the Request-URI that 
         are principals and that match the current user. In particular, if 
         the collection contains principals, the report can be used to 
         identify all members of the collection that match the current 
         user. Alternatively, if the collection contains resources that 
         have a property that identifies a principal (e.g. DAV:owner), the 
         report can be used to identify all members of the collection whose 
         property identifies a principal that matches the current user. For 
         example, this report can return all of the resources in a 
         collection hierarchy that are owned by the current user. Support 
         for this report is REQUIRED. 
</t>
<t>
       Marshalling: 
  <list>
    <t>
         The request body MUST be a DAV:principal-match XML element. 
<figure><artwork>
   &lt;!ELEMENT principal-match ((principal-property | self), prop?)> 
   &lt;!ELEMENT principal-property ANY> 
   ANY value: an element whose value identifies a property. The 
   expectation is the value of the named property typically contains 
   an href element that contains the URI of a principal 
   &lt;!ELEMENT self EMPTY> 
   prop: see RFC 2518, Section 12.11
</artwork></figure>
    </t>
    <t>
         This report is only defined when the Depth header has value "0"; 
         other values result in a 400 (Bad Request) error response. Note 
         that <xref target="RFC3253"/>, Section 3.6, states that if the Depth header is 
         not present, it defaults to a value of "0". 
         The response body for a successful request MUST be a 
         DAV:multistatus XML element. In the case where there are no 
         response elements, the returned multistatus XML element is empty. 
<figure><artwork>
   multistatus: see RFC 2518, Section 12.9 
</artwork></figure>
    </t>
    <t>
         The response body for a successful DAV:principal-match REPORT 
         request MUST contain a DAV:response element for each member of the 
         collection that matches the current user. When the DAV:principal-property
         element is used, a match occurs if the current user is 
         matched by the principal identified by the URI found in the 
         DAV:href element of the property identified by the DAV:principal-property
         element. When the DAV:self element is used in a 
         DAV:principal-match report issued against a group, it matches the 
         group if a member identifies the same principal as the current 
         user. 
    </t>
    <t>
         If DAV:prop is specified in the request body, the properties 
         specified in the DAV:prop element MUST be reported in the 
         DAV:response elements. 
    </t>
  </list>
</t>

<section title="Example: DAV:principal-match REPORT"> 
<t>
         The following example identifies the members of the collection 
         identified by the URL http://www.example.com/doc that are owned by 
         the current user. The current user ("gclemm") is authenticated 
         using Digest authentication. 
</t>
<ed:replace ed:resolves="ED_example_host_names" datetime="2003-11-06"><ed:del>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
REPORT /doc/ HTTP/1.1 
Host: www.example.com 
Authorization: Digest username="gclemm",  
  realm="gclemm@webdav.org", nonce="...", 
  uri="/papers/", response="...", opaque="..." 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxxx 
Depth: 0  

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:principal-match xmlns:D="DAV:"> 
  &lt;D:principal-property> 
    &lt;D:owner/> 
  &lt;/D:principal-property> 
&lt;/D:principal-match> 
</artwork></figure>
</ed:del><ed:ins>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
REPORT /doc/ HTTP/1.1 
Host: www.example.com 
Authorization: Digest username="gclemm",  
  realm="users@example.com", nonce="...", 
  uri="/papers/", response="...", opaque="..." 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxxx 
Depth: 0  

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:principal-match xmlns:D="DAV:"> 
  &lt;D:principal-property> 
    &lt;D:owner/> 
  &lt;/D:principal-property> 
&lt;/D:principal-match> 
</artwork></figure>
</ed:ins></ed:replace>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxxx 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:multistatus xmlns:D="DAV:"> 
  &lt;D:response> 
    &lt;D:href>http://www.example.com/doc/foo.html&lt;/D:href> 
    &lt;D:status>HTTP/1.1 200 OK&lt;/D:status> 
  &lt;/D:response> 
  &lt;D:response> 
    &lt;D:href>http://www.example.com/doc/img/bar.gif&lt;/D:href> 
    &lt;D:status>HTTP/1.1 200 OK&lt;/D:status> 
  &lt;/D:response> 
&lt;/D:multistatus> 
</artwork></figure>
</section>
</section>

<section title="DAV:principal-property-search REPORT" anchor="REPORT_principal-property-search"> 
<iref item="DAV:principal-property-search" primary="true"/>
<iref item="Reports" subitem="DAV:principal-property-search" primary="true"/>
<t>
         The DAV:principal-property-search REPORT performs a search for all 
         principals whose properties contain character data that matches 
         the search criteria specified in the request. One expected use of 
         this report is to discover the URL of a principal associated with 
         a given person or group by searching for them by name. This is 
         done by searching over DAV:displayname, which is defined on all 
         principals. 
</t>
<t>
         The actual search method (exact matching vs. substring matching 
         vs, prefix-matching, case-sensitivity) deliberately is left to the 
         server implementation to allow implementation on a wide set of 
         possible user management systems. In cases where the 
         implementation of DAV:principal-property-search is not constrained 
         by the semantics of an underlying user management repository, 
         preferred default semantics are caseless substring matches. 
</t>
<t>
         For implementation efficiency, servers do not typically support 
         searching on all properties. A search requesting properties that 
         are not searchable for a particular principal will not match that 
         principal.  
</t>
<t>
         Support for the DAV:principal-property-search report is REQUIRED. 
</t>
<ed:issue name="9.4_ED_reference_casemap" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001711.html">
  <ed:item date="2003-11-03" entered-by="julian.reschke@greenbytes.de">
    Update [CaseMap] reference to 
    "[UNICODE4]      The Unicode Consortium, "The Unicode Standard - Version 4.0", Addison-Wesley, August 2003. ISBN 0321185781" (section 5.18). 
  </ed:item>
  <ed:resolution datetime="2003-11-06">
    Removed "[CaseMap]" from references, add "[UNICODE]" to references. Cite
    using '...especially Section 2.3 ("Caseless Matching"), Section 5.18, Subsection "Caseless Matching"...'.
  </ed:resolution>
</ed:issue>
<t><list><t>
           Implementation Note: The value of a WebDAV property is a 
           sequence of well-formed XML, and hence can include any 
           character in the Unicode/ISO-10646 standard, that is, most 
           known characters in human languages. Due to the idiosyncrasies 
           of case mapping across human languages, implementation of case-insensitive
           matching is non-trivial. Implementors of servers 
           that do perform substring matching are strongly encouraged to 
           consult <ed:replace datetime="2003-11-06" ed:resolves="9.4_ED_reference_casemap"><ed:del><xref target="CaseMap"/></ed:del>
           <ed:ins>"The Unicode Standard" <xref target="UNICODE4"/></ed:ins></ed:replace>, especially <ed:replace datetime="2003-11-06" ed:resolves="9.4_ED_reference_casemap">
           <ed:del>Section 2.3 ("Caseless 
           Matching"),</ed:del><ed:ins><eref target="http://www.unicode.org/versions/Unicode4.0.0/ch05.pdf#G21180">Section 5.18, Subsection "Caseless 
           Matching",</eref></ed:ins></ed:replace> for guidance when implementing their case-insensitive
           matching algorithms. 
      </t>
      <t>
           Implementation Note: Some implementations of this protocol will 
           use an LDAP repository for storage of principal metadata. The 
           schema describing each attribute (akin to a WebDAV property) in 
           an LDAP repository specifies whether it supports case-sensitive 
           or caseless searching. One of the benefits of leaving the 
           search method to the discretion of the server implementation is 
           the default LDAP attribute search behavior can be used when 
           implementing the DAV:principal-property-search report.
    </t>
  </list>
</t>
<t>
       Marshalling: 
  <list>
    <t>
         The request body MUST be a DAV:principal-property-search XML 
         element containing a search specification and an optional list of 
         properties. For every principal that matches the search 
         specification, the response will contain the value of the 
         requested properties on that principal. 
<figure><artwork>
   &lt;!ELEMENT principal-property-search 
    ((property-search+), prop?, apply-to-principal-collection-set?) > 
</artwork></figure>
    </t>
    <t>
         By default, the report searches all members (at any depth) of the 
         collection identified by the Request-URI.  If DAV:apply-to-principal-collection-set
         is specified in the request body, the 
         request is applied instead to each collection identified by the 
         DAV:prinicipal-collection-set property of the resource identified 
         by the Request-URI. 
    </t>
    <t>
         The DAV:property-search element contains a prop element 
         enumerating the properties to be searched and a match element, 
         containing the search string. 
<figure><artwork>
   &lt;!ELEMENT property-search (prop, match) > 
   prop: see RFC 2518, Section 12.11 

   &lt;!ELEMENT match #PCDATA > 
</artwork></figure>
    </t>
    <t>
         Multiple property-search elements or multiple elements within a 
         DAV:prop element will be interpreted with a logical AND. 
    </t>
    <t>
         This report is only defined when the Depth header has value "0"; 
         other values result in a 400 (Bad Request) error response. Note 
         that <xref target="RFC3253"/>, Section 3.6, states that if the Depth header is 
         not present, it defaults to a value of "0". 
    </t>
    <t>
         The response body for a successful request MUST be a 
         DAV:multistatus XML element. In the case where there are no 
         response elements, the returned multistatus XML element is empty. 
<figure><artwork>
   multistatus: see RFC 2518, Section 12.9 
</artwork></figure>
    </t>
    <t>
         The response body for a successful DAV:principal-property-search 
         REPORT request MUST contain  a DAV:response element for each 
         principal whose property values satisfy the search specification 
         given in DAV:principal-property-search.  
    </t>
    <t>
         The response body for an unsuccessful DAV:principal-property-search
         REPORT request MUST contain, after the XML element 
         indicating the failed precondition or postcondition, a DAV:prop 
         element containing the property that caused the pre/postcondition 
         to fail. 
    </t>
    <t>
         If DAV:prop is specified in the request body, the properties 
         specified in the DAV:prop element MUST be reported in the 
         DAV:response elements. 
    </t>
  </list>
</t>
<t>
       Preconditions: 
  <list><t>
           None 
  </t></list>
</t>
<t>
       Postconditions: 
  <list><t>
        <iref item="DAV:number-of-matches-within-limits postcondition" primary="true"/>
        <iref item="Condition Names" subitem="DAV:number-of-matches-within-limits (post)" primary="true"/>
         (DAV:number-of-matches-within-limits): The number of matching 
         principals must fall within server-specific, predefined limits. 
         For example, this condition might be triggered if a search 
         specification would cause the return of an extremely large number 
         of responses. 
  </t></list>
</t>

<section title="Matching"> 
<t>
         There are several cases to consider when matching strings. The 
         easiest case is when a property value is "simple" and has only 
         character information item content (see <xref target="REC-XML-INFOSET"/>). For 
         example, the search string "julian" would match the 
         DAV:displayname property with value "Julian Reschke". Note that 
         the on-the-wire marshalling of DAV:displayname in this case is: 
</t>
<figure><artwork>
&lt;D:displayname xmlns:D="DAV:">Julian Reschke&lt;/D:displayname> 
</artwork></figure>
<t>
         The name of the property is encoded into the XML element 
         information item, and the character information item content of 
         the property is "Julian Reschke". 
</t>
<t>
         A more complicated case occurs when properties have mixed content 
         (that is, compound values consisting of multiple child element 
         items, other types of information items, and character information 
         item content). Consider the property "aprop" in the namespace 
         "http://www.example.com/props/", marshalled as: 
</t>
<figure><artwork>
&lt;W:aprop xmlns:W="http://www.example.com/props/"> 
  {cdata 0}&lt;W:elem1>{cdata 1}&lt;/W:elem1> 
  &lt;W:elem2>{cdata 2}&lt;/W:elem2>{cdata 3} 
&lt;/W:aprop> 
</artwork></figure>
<t>
         In this case, matching is performed on each individual contiguous 
         sequence of character information items. In the example above, a 
         search string would be compared to the four following strings: 
</t>
<figure><artwork>
{cdata 0} 
{cdata 1} 
{cdata 2} 
{cdata 3} 
</artwork></figure>
<t>
         That is, four individual matches would be performed, one each for 
         {cdata 0}, {cdata 1}, {cdata 2}, and {cdata 3}. 
</t>
</section>

<section title="Example: successful DAV:principal-property-search REPORT"> 
<t>
         In this example, the client requests the principal URLs of all 
         users whose DAV:displayname property contains the substring "doE" 
         and whose "title" property in the namespace 
         "http://BigCorp.com/ns/" (that is, their professional title) 
         contains "Sales".  In addition, the client requests five 
         properties to be returned with the matching principals: 
</t>
<t>
         In the DAV: namespace: displayname 
</t>
<t>
         In the http://www.example.com/ns/ namespace: department, phone, 
         office, salary 
</t>
<t>
         The response shows that two principal resources meet the search 
         specification, "John Doe" and "Zygdoebert Smith". The property 
         "salary" in namespace "http://www.example.com/ns/" is not 
         returned, since the principal making the request does not have 
         sufficient access permissions to read this property. 
</t>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
REPORT /users/ HTTP/1.1 
Host: www.example.com 
Content-Type: text/xml; charset=utf-8 
Content-Length: xxxx 
Depth: 0 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:principal-property-search xmlns:D="DAV:"> 
  &lt;D:property-search> 
    &lt;D:prop> 
      &lt;D:displayname/> 
    &lt;/D:prop> 
    &lt;D:match>doE&lt;/D:match> 
  &lt;/D:property-search> 
  &lt;D:property-search> 
    &lt;D:prop xmlns:B="http://www.example.com/ns/"> 
      &lt;B:title/> 
    &lt;/D:prop> 
    &lt;D:match>Sales&lt;/D:match> 
  &lt;/D:property-search> 
  &lt;D:prop xmlns:B="http://www.example.com/ns/"> 
    &lt;D:displayname/> 
    &lt;B:department/> 
    &lt;B:phone/> 
    &lt;B:office/> 
    &lt;B:salary/> 
  &lt;/D:prop> 
&lt;/D:principal-property-search> 
</artwork></figure>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset=utf-8 
Content-Length: xxxx 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:multistatus xmlns:D="DAV:" xmlns:B="http://BigCorp.com/ns/"> 
  &lt;D:response> 
    &lt;D:href>http://www.example.com/users/jdoe&lt;/D:href> 
    &lt;D:propstat> 
      &lt;D:prop> 
        &lt;D:displayname>John Doe&lt;/D:displayname> 
        &lt;B:department>Widget Sales&lt;/B:department> 
        &lt;B:phone>234-4567&lt;/B:phone> 
        &lt;B:office>209&lt;/B:office> 
      &lt;/D:prop> 
      &lt;D:status>HTTP/1.1 200 OK&lt;/D:status> 
    &lt;/D:propstat> 
    &lt;D:propstat> 
      &lt;D:prop> 
        &lt;B:salary/> 
      &lt;/D:prop> 
      &lt;D:status>HTTP/1.1 403 Forbidden&lt;/D:status> 
    &lt;/D:propstat> 
  &lt;/D:response> 
  &lt;D:response> 
    &lt;D:href>http://www.example.com/users/zsmith&lt;/D:href> 
    &lt;D:propstat> 
      &lt;D:prop> 
        &lt;D:displayname>Zygdoebert Smith&lt;/D:displayname> 
        &lt;B:department>Gadget Sales&lt;/B:department> 
        &lt;B:phone>234-7654&lt;/B:phone> 
        &lt;B:office>114&lt;/B:office> 
      &lt;/D:prop> 
      &lt;D:status>HTTP/1.1 200 OK&lt;/D:status> 
    &lt;/D:propstat> 
    &lt;D:propstat> 
      &lt;D:prop> 
        &lt;B:salary/> 
      &lt;/D:prop> 
      &lt;D:status>HTTP/1.1 403 Forbidden&lt;/D:status> 
    &lt;/D:propstat> 
  &lt;/D:response> 
&lt;/D:multistatus> 
</artwork></figure>
</section>
</section>

<section title="DAV:principal-search-property-set REPORT" anchor="REPORT_principal-search-property-set"> 
<iref item="DAV:principal-search-property-set" primary="true"/>
<iref item="Reports" subitem="DAV:principal-search-property-set" primary="true"/>
<t>
         The DAV:principal-search-property-set REPORT identifies those 
         properties that may be searched using the DAV:principal-property-search
         REPORT (defined in <xref target="REPORT_principal-property-search"/>).  
</t>
<t>
         Servers MUST support the DAV:principal-search-property-set REPORT 
         on all collections identified in the value of a DAV:principal-collection-set
         property. 
</t>
<t>
         An access control protocol user agent could use the results of the 
         DAV:principal-search-property-set REPORT to present a query 
         interface to the user for retrieving principals. 
</t>
<t>
         Support for this report is REQUIRED. 
</t>
<t>
  <list><t>
           Implementation Note: Some clients will have only limited screen 
           real estate for the display of lists of searchable properties. 
           In this case, a user might appreciate having the most 
           frequently searched properties be displayed on-screen, rather 
           than having to scroll through a long list of searchable 
           properties. One mechanism for signaling the most frequently 
           searched properties is to return them towards the start of a 
           list of properties. A client can then preferentially display 
           the list of properties in order, increasing the likelihood that 
           the most frequently searched properties will appear on-screen, 
           and will not require scrolling for their selection. 
  </t></list>
</t>
<t>
       Marshalling:
  <list>
    <t>
         The request body MUST be an empty DAV:principal-search-property-set
         XML element. 
    </t>
    <t>
         This report is only defined when the Depth header has value "0"; 
         other values result in a 400 (Bad Request) error response. Note 
         that <xref target="RFC3253"/>, Section 3.6, states that if the Depth header is 
         not present, it defaults to a value of "0". 
    </t>
    <t>
         The response body MUST be  a DAV:principal-search-property-set XML 
         element, containing a DAV:principal-search-property XML element 
         for each property that may be searched with the DAV:principal-property-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 interactive access control client. 
<figure><artwork>
   &lt;!ELEMENT principal-search-property-set
    (principal-search-property*) > 
</artwork></figure>
    </t>
    <t>
         Each DAV:principal-search-property XML element contains exactly 
         one searchable property, and a description of the property. 
<figure><artwork>
   &lt;!ELEMENT principal-search-property (prop, description) > 
</artwork></figure>
    </t>
    <t>
         The DAV:prop element contains one principal property on which the 
         server is able to perform a DAV:principal-property-search REPORT.   
<figure><artwork>
   prop: see RFC 2518, Section 12.11 
</artwork></figure>
    </t>
    <t>
         The description element is a human-readable description of what 
         information this property represents. Servers MUST indicate the 
         human language of the description using the xml:lang attribute and 
         SHOULD consider the HTTP Accept-Language request header when 
         selecting one of multiple available languages. 
<figure><artwork>
   &lt;!ELEMENT description #PCDATA > 
</artwork></figure>
    </t>
  </list> 
</t>

<section title="Example: DAV:principal-search-property-set REPORT"> 
<t>
         In this example, the client determines the set of searchable 
         principal properties by requesting the DAV:principal-search-property-set
         REPORT on the root of the server's principal URL 
         collection set, identified by http://www.example.com/users/.  
</t>
<figure><preamble>
>> Request &lt;&lt; 
</preamble><artwork>
REPORT /users/ HTTP/1.1 
Host: www.example.com 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 
Accept-Language: en, de 
Authorization: BASIC d2FubmFtYWs6cGFzc3dvcmQ= 
Depth: 0 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:principal-search-property-set xmlns:D="DAV:"/> 
</artwork></figure>
<figure><preamble>
>> Response &lt;&lt; 
</preamble><artwork>
HTTP/1.1 200 OK 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?> 
&lt;D:principal-search-property-set xmlns:D="DAV:"> 
  &lt;D:principal-search-property> 
    &lt;D:prop> 
      &lt;D:displayname/> 
    &lt;/D:prop> 
    &lt;D:description xml:lang="en">Full name&lt;/D:description> 
  &lt;/D:principal-search-property> 
  &lt;D:principal-search-property> 
    &lt;D:prop xmlns:B="http://BigCorp.com/ns/"> 
      &lt;B:title/> 
    &lt;/D:prop> 
    &lt;D:description xml:lang="en">Job title&lt;/D:description> 
  &lt;/D:principal-search-property> 
&lt;/D:principal-search-property-set> 
</artwork></figure>
</section>
</section>
</section>

<section title="XML Processing" anchor="xml.processing">
<t>         
         Implementations of this specification MUST support the XML element 
         ignore rule, as specified in Section 23.3.2 of <xref target="RFC2518"/>, and the 
         XML Namespace recommendation <xref target="REC-XML-NAMES"/>.
</t>
<t>
         Note that use of the DAV namespace is reserved for XML elements 
         and property names defined in a standards-track or Experimental 
         IETF RFC. 
</t>
</section>

<section title="Internationalization Considerations" anchor="internationalization.considerations">
<ed:issue name="11_ED_RFC2279" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001711.html">
  <ed:item date="2003-11-03" entered-by="julian.reschke@greenbytes.de">
    Replace [UTF-8] by [RFC2279] for consistency.
  </ed:item>
  <ed:resolution datetime="2003-11-11">
    Reference name changed both in text and references section to RFC3629 (update of RFC2279).
  </ed:resolution>
</ed:issue>
<t>
         In this specification, the only human-readable content can be 
         found in the description XML element, found within the 
         DAV:supported-privilege-set property.  This element contains a 
         human-readable description of the capabilities controlled by a 
         privilege.  As a result, the description element must be capable 
         of representing descriptions in multiple character sets.  Since 
         the description element is found within a WebDAV property, it is 
         represented on the wire as XML <xref target="REC-XML"/>, and hence can leverage 
         XML's language tagging and character set encoding capabilities. 
         Specifically, XML processors at minimum must be able to read XML 
         elements encoded using the UTF-8 <ed:replace ed:resolves="11_ED_RFC2279" datetime="2003-11-06"><ed:del><xref target="UTF-8"/></ed:del><ed:ins><xref target="RFC3629"/></ed:ins></ed:replace> encoding of the ISO 10646 
         multilingual plane. XML examples in this specification demonstrate 
         use of the charset parameter of the Content-Type header, as 
         defined in <xref target="RFC3023"/>, as well as the XML "encoding" attribute, 
         which together provide charset identification information for MIME 
         and XML processors. Futhermore, this specification requires server 
         implementations to tag description fields with the xml:lang 
         attribute (see Section 2.12 of <xref target="REC-XML"/>), which specifies the 
         human language of the description. Additionally, server 
         implementations should take into account the value of the Accept-Language
         HTTP header to determine which description string to 
         return. 
</t>
<t>
         For XML elements other than the description element, it is 
         expected that implementations will treat the property names, 
         privilege names, and values as tokens, and convert these tokens 
         into human-readable text in the user's language and character set 
         when displayed to a person.  Only a generic WebDAV property 
         display utility would display these values in their raw form to a 
         human user. 
</t>
<t>
         For error reporting, we follow the convention of HTTP/1.1 status 
         codes, including with each status code a short, English 
         description of the code (e.g., 200 (OK)).  While the possibility 
         exists that a poorly crafted user agent would display this message 
         to a user, internationalized applications will ignore this 
         message, and display an appropriate message in the user's language 
         and character set. 
</t>
<t>
         Further internationalization considerations for this protocol are 
         described in the WebDAV Distributed Authoring protocol 
         specification <xref target="RFC2518"/>. 
</t>
</section>

<section title="Security Considerations" anchor="security.considerations">
<t>
         Applications and users of this access control protocol should be 
         aware of several security considerations, detailed below. In 
         addition to the discussion in this document, the security 
         considerations detailed in the HTTP/1.1 specification <xref target="RFC2616"/>, 
         the WebDAV Distributed Authoring Protocol specification <xref target="RFC2518"/>, 
         and the XML Media Types specification <xref target="RFC3023"/> should be 
         considered in a security analysis of this protocol.  
</t>

<section title="Increased Risk of Compromised Users"> 
<t>
         In the absence of a mechanism for remotely manipulating access 
         control lists, if a single user's authentication credentials are 
         compromised, only those resources for which the user has access 
         permission can be read, modified, moved, or deleted. With the 
         introduction of this access control protocol, if a single 
         compromised user has the ability to change ACLs for a broad range 
         of other users (e.g., a super-user), the number of resources that 
         could be altered by a single compromised user increases. This risk 
         can be mitigated by limiting the number of people who have write-acl
         privileges across a broad range of resources. 
</t>
</section>

<section title="Risks of the DAV:read-acl and DAV:current-user-privilege-set Privileges"> 
<t>
         The ability to read the access privileges (stored in the DAV:acl 
         property), or the privileges permitted the currently authenticated 
         user (stored in the DAV:current-user-privilege-set property) on a 
         resource may seem innocuous, since reading an ACL cannot possibly 
         affect the resource's state. However, if all resources have world-readable
         ACLs, it is possible to perform an exhaustive search for 
         those resources that have inadvertently left themselves in a 
         vulnerable state, such as being world-writeable. In particular, 
         the property retrieval method PROPFIND, executed with Depth 
         infinity on an entire hierarchy, is a very efficient way to 
         retrieve the DAV:acl or DAV:current-user-privilege-set properties. 
         Once found, this vulnerability can be exploited by a denial of 
         service attack in which the open resource is repeatedly 
         overwritten. Alternately, writeable resources can be modified in 
         undesirable ways. 
</t>
<t>
         To reduce this risk, read-acl privileges should not be granted to 
         unauthenticated principals, and restrictions on read-acl and read-current-user-privilege-set
         privileges for authenticated principals 
         should be carefully analyzed when deploying this protocol. Access 
         to the current-user-privilege-set property will involve a tradeoff 
         of usability versus security. When the current-user-privilege-set 
         is visible, user interfaces are expected to provide enhanced 
         information concerning permitted and restricted operations, yet 
         this information may also indicate a vulnerability that could be 
         exploited. Deployment of this protocol will need to evaluate this 
         tradeoff in light of the requirements of the deployment 
         environment. 
</t>
</section>

<section title="No Foreknowledge of Initial ACL"> 
<t>
         In an effort to reduce protocol complexity, this protocol 
         specification intentionally does not address the issue of how to 
         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 
         create a new resource, then retrieve the value of the DAV:acl 
         property. This assumes the principal creating the resource also 
         has been granted the DAV:read-acl privilege. 
</t>
<t>
         As a result, it is possible that a principal could create a 
         resource, and then discover that its ACL grants privileges that 
         are undesirable. Furthermore, this protocol makes it possible 
         (though unlikely) that the creating principal could be unable to 
         modify the ACL, or even delete the resource. Even when the ACL can 
         be modified, there will be a short period of time when the 
         resource exists with the initial ACL before its new ACL can be 
         set. 
</t>
<t>
         Several factors mitigate this risk. Human principals are often 
         aware of the default access permissions in their editing 
         environments and take this into account when writing information. 
         Furthermore, default privilege policies are usually very 
         conservative, limiting the privileges granted by the initial ACL.  
</t>
</section>
</section>

<section title="Authentication" anchor="authentication">
<t>
         Authentication mechanisms defined for use with HTTP and WebDAV 
         also apply to this WebDAV Access Control Protocol, in particular 
         the Basic and Digest authentication mechanisms defined in 
         <xref target="RFC2617"/>.  Implementation of the ACL spec requires that Basic 
         authentication, if used, MUST only be supported over secure 
         transport such as TLS. 
</t>
</section>

<section title="IANA Considerations">
<t>
         This document uses the namespace defined by <xref target="RFC2518"/> for XML 
         elements. That is, this specification uses the "DAV:" URI 
         namespace, previously registered in the URI schemes registry. All 
         other IANA considerations mentioned in <xref target="RFC2518"/> are also 
         applicable to this specification. 
</t>
</section>

<section title="Acknowledgements">
<t>
         This protocol is the collaborative product of the WebDAV ACL 
         design team: Bernard Chester, Geoff Clemm, Anne Hopkins, Barry 
         Lind, Sean Lyndersay, Eric Sedlar, Greg Stein, and Jim Whitehead. 
         The authors are grateful for the detailed review and comments 
         provided by Jim Amsden, Dylan Barrell, Gino Basso, Murthy 
         Chintalapati, Lisa Dusseault, Stefan Eissing, Tim Ellison, Yaron 
         Goland, Dennis Hamilton, Laurie Harper, Eckehard Hermann, Ron 
         Jacobs, Chris Knight, Remy Maucherat, Larry Masinter, Joe Orton, 
         Peter Raymond, Julian Reschke, and Keith Wannamaker. We thank 
         Keith Wannamaker for the initial text of the principal property 
         search sections. Prior work on WebDAV access control protocols has 
         been performed by Yaron Goland, Paul Leach, Lisa Dusseault, Howard 
         Palmer, and Jon Radoff. We would like to acknowledge the 
         foundation laid for us by the authors of the DeltaV, WebDAV and 
         HTTP protocols upon which this protocol is layered, and the 
         invaluable feedback from the WebDAV working group. 
</t>
</section>

  </middle>
	
  <back>

<references title="Normative References">
	
<reference anchor="RFC2119">
  <front>
    <title abbrev="RFC Key Words">Key words for use in RFCs to Indicate Requirement Levels</title>
    <author initials="S." surname="Bradner" fullname="Scott Bradner">
      <organization>Harvard University</organization>
      <address><email>sob@harvard.edu</email></address>
    </author>
    <date month="March" year="1997"/>
    <area>General</area>
    <keyword>keyword</keyword>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
</reference>

<reference anchor="REC-XML" target="http://www.w3.org/TR/2000/REC-xml-20001006">
  <front>
    <title>Extensible Markup Language (XML) 1.0 (2nd ed)</title>
    <author initials="T." surname="Bray" fullname="Tim Bray">
      <organization>Textuality and Netscape</organization>
      <address>
        <email>tbray@textuality.com</email>
      </address>
    </author>
    <author initials="J." surname="Paoli" fullname="Jean Paoli">
      <organization>Microsoft</organization>
      <address>
        <email>jeanpa@microsoft.com</email>
      </address>
    </author>
    <author initials="C.M." surname="Sperberg-McQueen" fullname="C. M. Sperberg-McQueen">
      <organization>University of Illinois at Chicago and Text Encoding Initiative</organization>
      <address>
        <email>cmsmcq@uic.edu</email>
      </address>
    </author>
    <author initials="E." surname="Maler" fullname="Eve Maler">
      <organization>Sun Microsystems</organization>
      <address>
        <email>eve.maler@east.sun.com</email>
      </address>
    </author>
    <date day="6" month="October" year="2000"/>
  </front>
  <seriesInfo name="W3C REC" value="REC-xml-20001006"/>
</reference>

<reference anchor="REC-XML-NAMES" target="http://www.w3.org/TR/1999/REC-xml-names-19990114">
  <front>
    <title>Namespaces in XML</title>
    <author initials="T." surname="Bray">
    	<organization>Textuality</organization>
      <address><email>tbray@textuality.com</email></address>
    </author>
    <author initials="D." surname="Hollander">
    	<organization>Hewlett-Packard Company</organization>
      <address><email>dmh@corp.hp.com</email></address>
    </author>
    <author initials="A." surname="Layman">
    	<organization>Microsoft</organization>
      <address><email>andrewl@microsoft.com</email></address>
    </author>
    <date month="January" year="1999" />
  </front>
  <seriesInfo name="W3C REC" value="REC-xml-names-19990114" />
</reference>

<reference anchor="RFC3253">
  <front>
    <title>Versioning Extensions to WebDAV</title>
    <author initials="G." surname="Clemm" fullname="G. Clemm">
      <organization>Rational Software</organization>
      <address><email>geoffrey.clemm@rational.com</email></address>
    </author>
    <author initials="J." surname="Amsden" fullname="J. Amsden">
      <organization>IBM</organization>
      <address><email>jamsden@us.ibm.com</email></address>
    </author>
    <author initials="T." surname="Ellison" fullname="T. Ellison">
      <organization>IBM</organization>
      <address><email>tim_ellison@uk.ibm.com</email></address>
    </author>
    <author initials="C." surname="Kaler" fullname="C. Kaler">
      <organization>Microsoft</organization>
      <address><email>ckaler@microsoft.com</email></address>
    </author>
    <author initials="J." surname="Whitehead" fullname="J. Whitehead">
      <organization>UC Santa Cruz, Dept. of Computer Science</organization>
      <address><email>ejw@cse.ucsc.edu</email></address>
    </author>
    <date month="March" year="2002"/>
  </front>
  <seriesInfo name="RFC" value="3253"/>
</reference>

<reference anchor='REC-XML-INFOSET' target="http://www.w3.org/TR/2001/REC-xml-infoset-20011024">
  <front>
    <title>XML Information Set</title>
    <author initials='J.' surname='Cowan' fullname='John Cowan'>
      <organization />
      <address><email>jcowan@reutershealth.com</email></address>
    </author>  
    <author initials='R.' surname='Tobin' fullname='Richard Tobin'>
      <organization />
      <address><email>richard@cogsci.ed.ac.uk</email></address>
    </author>
    <date month='October' day='24' year='2001' />
  </front>
  <seriesInfo name='W3C REC' value='REC-xml-infoset-20011024' />
</reference>

<reference anchor="RFC2616">
  <front>
    <title>Hypertext Transfer Protocol -- HTTP/1.1</title>
    <author initials="R." surname="Fielding" fullname="R. Fielding">
      <organization>University of California, Irvine</organization>
      <address><email>fielding@ics.uci.edu</email></address>
    </author>
    <author initials="J." surname="Gettys" fullname="J. Gettys">
      <organization>W3C</organization>
      <address><email>jg@w3.org</email></address>
    </author>
    <author initials="J." surname="Mogul" fullname="J. Mogul">
      <organization>Compaq Computer Corporation</organization>
      <address><email>mogul@wrl.dec.com</email></address>
    </author>
    <author initials="H." surname="Frystyk" fullname="H. Frystyk">
      <organization>MIT Laboratory for Computer Science</organization>
      <address><email>frystyk@w3.org</email></address>
    </author>
    <author initials="L." surname="Masinter" fullname="L. Masinter">
      <organization>Xerox Corporation</organization>
      <address><email>masinter@parc.xerox.com</email></address>
    </author>
    <author initials="P." surname="Leach" fullname="P. Leach">
      <organization>Microsoft Corporation</organization>
      <address><email>paulle@microsoft.com</email></address>
    </author>
    <author initials="T." surname="Berners-Lee" fullname="T. Berners-Lee">
      <organization>W3C</organization>
      <address><email>timbl@w3.org</email></address>
    </author>
    <date month="June" year="1999"/>
  </front>
  <seriesInfo name="RFC" value="2616"/>
</reference>

<reference anchor="RFC2617">
  <front>
  <title abbrev="HTTP Authentication">HTTP Authentication: Basic and Digest Access Authentication</title>
  <author initials="J." surname="Franks" fullname="John Franks">
    <organization>Northwestern University, Department of Mathematics</organization>
    <address>
      <email>john@math.nwu.edu</email>
    </address>
  </author>
  <author initials="P.M." surname="Hallam-Baker" fullname="Phillip M. Hallam-Baker">
    <organization>Verisign Inc.</organization>
    <address>
      <email>pbaker@verisign.com</email>
    </address>
  </author>
  <author initials="J.L." surname="Hostetler" fullname="Jeffery L. Hostetler">
  <organization>AbiSource, Inc.</organization>
    <address>
      <email>jeff@AbiSource.com</email>
    </address>
  </author>
  <author initials="S.D." surname="Lawrence" fullname="Scott D. Lawrence">
    <organization>Agranat Systems, Inc.</organization>
    <address>
      <email>lawrence@agranat.com</email>
    </address>
  </author>
  <author initials="P.J." surname="Leach" fullname="Paul J. Leach">
    <organization>Microsoft Corporation</organization>
    <address>
      <email>paulle@microsoft.com</email>
    </address>
  </author>
  <author initials="A." surname="Luotonen" fullname="Ari Luotonen">
    <organization>Netscape Communications Corporation</organization>
  </author>
  <author initials="L." surname="Stewart" fullname="Lawrence C. Stewart">
    <organization>Open Market, Inc.</organization>
    <address>
      <email>stewart@OpenMarket.com</email>
    </address>
  </author>
  <date month="June" year="1999"/>
  </front>
  <seriesInfo name="RFC" value="2617"/>
</reference>

<reference anchor="RFC2518">

<front>
  <title>HTTP Extensions for Distributed Authoring -- WEBDAV</title>
  <author initials="Y." surname="Goland" fullname="Y. Goland">
    <organization>Microsoft Corporation</organization>
    <address><email>yarong@microsoft.com</email></address>
  </author>
  <author initials="E." surname="Whitehead" fullname="E. J. Whitehead, Jr.">
    <organization abbrev="UC Irvine">Dept. Of Information and Computer Science, University of California, Irvine</organization>
  	<address><email>ejw@ics.uci.edu</email></address>
  </author>
  <author initials="A." surname="Faizi" fullname="A. Faizi">
    <organization abbrev="Netscape">Netscape</organization>
    <address><email>asad@netscape.com</email></address>
  </author>
  <author initials="S.R." surname="Carter" fullname="S. R. Carter">
    <organization abbrev="Novell">Novell</organization>
    <address><email>srcarter@novell.com</email></address>
  </author>
  <author initials="D." surname="Jensen" fullname="D. Jensen">
    <organization abbrev="Novell">Novell</organization>
    <address><email>dcjensen@novell.com</email></address>
  </author>
  <date month="February" year="1999"/></front>
  <seriesInfo name="RFC" value="2518"/>
</reference>

<reference anchor="RFC3023">
  <front>
    <title>XML Media Types</title>
    <author initials="M." surname="Makoto" fullname="Murata Makoto">
      <organization>IBM Tokyo Research Laboratory</organization>
      <address><email>mmurata@trl.ibm.co.jp</email></address>
    </author>
    <author initials="S." surname="St.Laurent" fullname="Simon St.Laurent">
      <organization>simonstl.com</organization>
      <address><email>simonstl@simonstl.com</email></address>
    </author>
    <author initials="D." surname="Kohn" fullname="Dan Kohn">
    <organization>Skymoon Ventures</organization>
    <address><email>dan@dankohn.com</email></address>
    </author>
    <date month="January" year="2001"/>
  </front>
  <seriesInfo name="RFC" value="3023"/>
</reference>

<reference anchor='RFC3530'>
  <front>
    <title>Network File System (NFS) version 4 Protocol</title>
    <author initials='S.' surname='Shepler' fullname='S. Shepler' role="editor">
      <organization>SUN Microsystems, Inc.</organization>
      <address><email>spencer.shepler@sun.com</email></address>
    </author>
    <author initials='B.' surname='Callaghan' fullname='B. Callaghan'>
      <organization>SUN Microsystems, Inc.</organization>
      <address><email>brent.callaghan@sun.com</email></address>
    </author>
    <author initials='D.' surname='Robinson' fullname='D. Robinson'>
      <organization>SUN Microsystems, Inc.</organization>
      <address><email>david.robinson@sun.com</email></address>
    </author>
    <author initials='R.' surname='Thurlow' fullname='R. Thurlow'>
      <organization>SUN Microsystems, Inc.</organization>
      <address><email>robert.thurlow@sun.com</email></address>
    </author>
    <author initials='C.' surname='Beame' fullname='C. Beame'>
      <organization>Hummingbird Ltd.</organization>
      <address><email>beame@bws.com</email></address>
    </author>
    <author initials='M.' surname='Eisler' fullname='M. Eisler'>
      <organization/>
      <address><email>mike@eisler.com</email></address>
    </author>
    <author initials='D.' surname='Noveck' fullname='D. Noveck'>
      <organization>Network Appliance, Inc.</organization>
      <address><email>dnoveck@netapp.com</email></address>
    </author>
    <date month='April' year='2003' />
  </front>
  <seriesInfo name='RFC' value='3530' />
</reference>

<ed:replace ed:resolves="11_ED_RFC2279" datetime="2003-11-06"><ed:del>
<reference anchor='UTF-8'>
<front>
<title abbrev='UTF-8'>UTF-8, a transformation format of ISO 10646</title>
<author initials='F.' surname='Yergeau' fullname='Francois Yergeau'>
<organization>Alis Technologies</organization>
<address>
<postal>
<street>100, boul. Alexis-Nihon</street>
<street>Suite 600</street>
<city>Montreal</city>
<region>Quebec</region>
<code>H4M 2P2</code>
<country>CA</country></postal>
<phone>+1 514 747 2547</phone>
<facsimile>+1 514 747 2561</facsimile>
<email>fyergeau@alis.com</email></address></author>
<date month='January' year='1998' />
</front>
<seriesInfo name='RFC' value='2279' />
</reference>
</ed:del><ed:ins>
<reference anchor="RFC3629">
  <front>
    <title>UTF-8, a transformation format of ISO 10646</title>
    <author initials="F." surname="Yergeau" fullname="F. Yergeau">
      <organization>Alis Technologies</organization>
      <address><email>fyergeau@alis.com</email></address>
    </author>
    <date month="November" year="2003"/>
  </front>
  <seriesInfo name="RFC" value="3629"/>
  <seriesInfo name="STD" value="63"/>
</reference>
</ed:ins></ed:replace>

</references>

<references title="Informative References">
	
<reference anchor='RFC2026'>
  <front>
    <title abbrev='Internet Standards Process'>The Internet Standards Process -- Revision 3</title>
    <author initials='S.' surname='Bradner' fullname='Scott O. Bradner'>
      <organization>Harvard University</organization>
      <address>
       <email>sob@harvard.edu</email>
      </address>
    </author>
    <date month='October' year='1996' />
  </front>
  <seriesInfo name='BCP' value='9' />
  <seriesInfo name='RFC' value='2026' />
</reference>

<reference anchor='RFC2255'>
  <front>
    <title abbrev='LDAP URL Format'>The LDAP URL Format</title>
    <author initials='T.' surname='Howes' fullname='Tim Howes'>
      <organization>Netscape Communications Corp.</organization>
      <address>
        <email>howes@netscape.com</email>
      </address>
    </author>
    <author initials='M.' surname='Smith' fullname='Mark Smith'>
      <organization>Netscape Communications Corp.</organization>
      <address>
        <email>mcs@netscape.com</email>
      </address>
    </author>
    <date month='December' year='1997' />
  </front>  
  <seriesInfo name='RFC' value='2255' />
</reference>

<reference anchor='RFC2251'>
  <front>
    <title abbrev='LDAPv3'>Lightweight Directory Access Protocol (v3)</title>
    <author initials='M.' surname='Wahl' fullname='Mark Wahl'>
      <organization>Critical Angle Inc.</organization>
      <address>
        <email>M.Wahl@critical-angle.com</email>
      </address>
    </author>
    <author initials='T.' surname='Howes' fullname='Tim Howes'>
      <organization>Netscape Communications Corp.</organization>
      <address>
        <email>howes@netscape.com</email>
      </address>
    </author>
    <author initials='S.' surname='Kille' fullname='Steve Kille'>
      <organization>Isode Limited</organization>
      <address>
        <email>S.Kille@isode.com</email>
      </address>
    </author>
    <date month='December' year='1997' />
  </front>
  <seriesInfo name='RFC' value='2251' />
</reference>

<ed:replace datetime="2003-11-06" ed:resolves="9.4_ED_reference_casemap"><ed:del>
<reference anchor="CaseMap" target="http://www.unicode.org/unicode/reports/tr21">
  <front>
    <title>Case Mappings</title>
    <author initials="M." surname="Davis" fullname="M. Davis">
    </author>
    <date month='March' year='2001' day="26" />
  </front>
  <seriesInfo name='Unicode' value='Standard Annex #21' />
</reference>
</ed:del><ed:ins>
<reference anchor="UNICODE4" target="http://www.unicode.org/versions/Unicode4.0.0/">
  <front>
    <title>The Unicode Standard - Version 4.0</title>
    <author>
      <organization>The Unicode Consortium</organization>
    </author>
    <date month="August" year="2003"/>
  </front>
  <seriesInfo name="Addison-Wesley" value=""/>
  <annotation><eref target="urn:isbn:0321185781">ISBN 0321185781</eref>.</annotation>
</reference>
</ed:ins></ed:replace>

</references>

<section title="WebDAV XML Document Type Definition Addendum" anchor="webdav.xml.document.type.definition.addendum">
<ed:issue name="A_ED_appendices" type="edit" status="closed" href="http://mailman.webdav.org/pipermail/acl/2003-November/001712.html">
  <ed:item date="2003-11-03" entered-by="julian.reschke@greenbytes.de">
    Appendices should indeed be appendices, not a regular section (see 
    draft-rfc-editor-rfc2223bis).
  </ed:item>
  <ed:resolution datetime="2003-11-04">
    Moved Section 19.1 to Appendix A and Section 19.2 to Appendix B.
  </ed:resolution>
</ed:issue>
<t>
         All XML elements defined in this Document Type Definition (DTD) 
         belong to the DAV namespace. This DTD should be viewed as an 
         addendum to the DTD provided in <xref target="RFC2518"/>, section 23.1. 
</t>
<figure><preamble>
&lt;!-- Privileges -- (<xref target="privileges"/>)> 
</preamble><artwork>
&lt;!ELEMENT read EMPTY> 
&lt;!ELEMENT write EMPTY> 
&lt;!ELEMENT write-properties EMPTY> 
&lt;!ELEMENT write-content EMPTY> 
&lt;!ELEMENT unlock EMPTY> 
&lt;!ELEMENT read-acl EMPTY> 
&lt;!ELEMENT read-current-user-privilege-set EMPTY> 
&lt;!ELEMENT write-acl EMPTY> 
&lt;!ELEMENT bind EMPTY> 
&lt;!ELEMENT unbind EMPTY> 
&lt;!ELEMENT all EMPTY> 
</artwork></figure>

<figure><preamble>
&lt;!-- Principal Properties (<xref target="principal.properties"/>) --> 
</preamble><artwork>
&lt;!ELEMENT principal EMPTY> 

&lt;!ELEMENT alternate-URI-set (href*)> 
&lt;!ELEMENT principal-URL (href)> 
&lt;!ELEMENT group-member-set (href*)> 
&lt;!ELEMENT group-membership (href*)> 
</artwork></figure>

<t>
&lt;!-- Access Control Properties (<xref target="access.control.properties"/>) --> 
</t>

<figure><preamble>
&lt;!-- DAV:owner Property (<xref target="PROPERTY_owner"/>) --> 
</preamble><ed:replace datetime="2003-11-06" ed:resolves="5.1_owner_href_optional"><ed:del>
<artwork>
&lt;!ELEMENT owner (href)> 
</artwork>
</ed:del><ed:ins>
<artwork>
&lt;!ELEMENT owner (href?)> 
</artwork>
</ed:ins></ed:replace>
</figure>

<ed:replace datetime="2003-11-06" ed:resolves="6_group_property"><ed:ins>
<figure><preamble>
&lt;!-- DAV:group Property (<xref target="PROPERTY_group"/>) --> 
</preamble>
<artwork>
&lt;!ELEMENT group (href?)> 
</artwork>
</figure>
</ed:ins></ed:replace>

<figure><preamble>
&lt;!-- DAV:supported-privilege-set Property (<xref target="PROPERTY_supported-privilege-set"/>) -->  
</preamble><artwork>
&lt;!ELEMENT supported-privilege-set (supported-privilege*)> 
&lt;!ELEMENT supported-privilege 
 (privilege, abstract?, description, supported-privilege*)> 

&lt;!ELEMENT privilege ANY> 
&lt;!ELEMENT abstract EMPTY> 
&lt;!ELEMENT description #PCDATA>  
</artwork></figure>

<figure><preamble>
&lt;!-- DAV:current-user-privilege-set Property (<xref target="PROPERTY_current-user-privilege-set"/>) --> 
</preamble><artwork>
&lt;!ELEMENT current-user-privilege-set (privilege*)> 
</artwork></figure>

<figure><preamble>
&lt;!-- DAV:acl Property (<xref target="PROPERTY_acl"/>) --> 
</preamble><artwork>
&lt;!ELEMENT acl (ace)* > 
&lt;!ELEMENT ace ((principal | invert), (grant|deny), protected?, 
 inherited?)> 

&lt;!ELEMENT principal (href) 
 | all | authenticated | unauthenticated 
 | property | self)> 

&lt;!ELEMENT all EMPTY> 
&lt;!ELEMENT authenticated EMPTY> 
&lt;!ELEMENT unauthenticated EMPTY> 
&lt;!ELEMENT property ANY> 
&lt;!ELEMENT self EMPTY> 

&lt;!ELEMENT invert principal> 

&lt;!ELEMENT grant (privilege+)> 
&lt;!ELEMENT deny (privilege+)> 
&lt;!ELEMENT privilege ANY> 

&lt;!ELEMENT protected EMPTY> 

&lt;!ELEMENT inherited (href)> 
</artwork></figure>


<figure><preamble>
&lt;!-- DAV:acl-restrictions Property (<xref target="PROPERTY_acl-restrictions"/>) --> 
</preamble><artwork>
&lt;!ELEMENT acl-restrictions (grant-only?, no-invert?,
 deny-before-grant?, required-principal?)> 

&lt;!ELEMENT grant-only EMPTY> 
&lt;!ELEMENT no-invert EMPTY> 
&lt;!ELEMENT deny-before-grant EMPTY> 

&lt;!ELEMENT required-principal 
 (all? | authenticated? | unauthenticated? | self? | href* 
 |property*)> 
</artwork></figure>


<figure><preamble>
&lt;!-- DAV:inherited-acl-set Property (<xref target="PROPERTY_inherited-acl-set"/>) --> 
</preamble><artwork>
&lt;!ELEMENT inherited-acl-set (href*)> 
</artwork></figure>

<figure><preamble>
&lt;!-- DAV:principal-collection-set Property (<xref target="PROPERTY_principal-collection-set"/>) --> 
</preamble><artwork>
&lt;!ELEMENT principal-collection-set (href*)> 
</artwork></figure>


<figure><preamble>
&lt;!-- Access Control and Existing Methods (<xref target="access.control.and.existing.methods"/>) --> 
</preamble><artwork>
&lt;!ELEMENT need-privileges (resource)* >
&lt;!ELEMENT resource ( href, privilege )
</artwork></figure>


<figure><preamble>
&lt;!-- ACL method preconditions (<xref target="acl.preconditions"/>) --> 
</preamble><artwork>
&lt;!ELEMENT no-ace-conflict EMPTY> 
&lt;!ELEMENT no-protected-ace-conflict EMPTY> 
&lt;!ELEMENT no-inherited-ace-conflict EMPTY> 
&lt;!ELEMENT limited-number-of-aces EMPTY> 
&lt;!ELEMENT grant-only EMPTY> 
&lt;!ELEMENT no-invert EMPTY> 
&lt;!ELEMENT deny-before-grant EMPTY> 
&lt;!ELEMENT no-abstract EMPTY> 
&lt;!ELEMENT not-supported-privilege EMPTY> 
&lt;!ELEMENT missing-required-principal EMPTY> 
&lt;!ELEMENT recognized-principal EMPTY> 
&lt;!ELEMENT allowed-principal EMPTY> 
</artwork></figure>

<figure><preamble>
&lt;!-- REPORTs (<xref target="access.control.reports"/>) --> 
</preamble><artwork>
&lt;!ELEMENT acl-principal-prop-set ANY> 
ANY value: a sequence of one or more elements, with at most one 
DAV:prop element. 

&lt;!ELEMENT principal-match ((principal-property | self), prop?)> 
&lt;!ELEMENT principal-property ANY> 
ANY value: an element whose value identifies a property. The 
expectation is the value of the named property typically contains 
an href element that contains the URI of a principal 
&lt;!ELEMENT self EMPTY> 

&lt;!ELEMENT principal-property-search ((property-search+), prop?) > 
&lt;!ELEMENT property-search (prop, match) > 
&lt;!ELEMENT match #PCDATA > 

&lt;!ELEMENT principal-search-property-set (
 principal-search-property*) > 
&lt;!ELEMENT principal-search-property (prop, description) > 
&lt;!ELEMENT description #PCDATA > 
</artwork></figure>
</section>

<section title="WebDAV Method Privilege Table (Normative)">
<t>
    The following table of WebDAV methods (as defined in RFC 2518, 2616, 
    and 3253) clarifies which privileges are required for access for each 
    method.  Note that the privileges listed, if denied, MUST cause access 
    to be denied.  However, given that a specific implementation MAY define 
    an additional custom privilege to control access to existing methods, 
    having all of the indicated privileges does not mean that access will 
    be granted.  Note that lack of the indicated privileges does not imply 
    that access will be denied, since a particular implementation may use a 
    sub-privilege aggregated under the indicated privilege to control 
    access.  Privileges required refer to the current resource being 
    processed unless otherwise specified. 
</t>
<texttable>
  <ttcol>METHOD</ttcol><ttcol>PRIVILEGES</ttcol>
  <c>GET</c>                <c><xref target="PRIVILEGE_read" format="none">&lt;D:read></xref></c>  
  <c>HEAD</c>               <c><xref target="PRIVILEGE_read" format="none">&lt;D:read></xref></c>  
  <c>OPTIONS</c>            <c><xref target="PRIVILEGE_read" format="none">&lt;D:read></xref></c>  
  <c>PUT (target exists)</c>     <c><xref target="PRIVILEGE_write-content" format="none">&lt;D:write-content></xref> on target resource</c> 
  <c>PUT (no target exists)</c>  <c><xref target="PRIVILEGE_bind" format="none">&lt;D:bind></xref> on parent collection of target</c> 
  <c>PROPPATCH</c>          <c><xref target="PRIVILEGE_write-properties" format="none">&lt;D:write-properties></xref></c>  
  <c>ACL</c>                <c><xref target="PRIVILEGE_write-acl" format="none">&lt;D:write-acl></xref></c>  
  <c>PROPFIND</c>           <c><xref target="PRIVILEGE_read" format="none">&lt;D:read></xref> (plus <xref target="PRIVILEGE_read-acl" format="none">&lt;D:read-acl></xref> and  
                        <xref target="PRIVILEGE_read-current-user-privilege-set" format="none">&lt;D:read-current-user-privilege-set></xref> as needed)</c>
  <c>COPY (target exists)</c>    <c><xref target="PRIVILEGE_read" format="none">&lt;D:read></xref>, <xref target="PRIVILEGE_write-content" format="none">&lt;D:write-content></xref> and <xref target="PRIVILEGE_write-properties" format="none">&lt;D:write-properties></xref> on target resource</c>  
  <c>COPY (no target exists)</c> <c><xref target="PRIVILEGE_read" format="none">&lt;D:read></xref>, <xref target="PRIVILEGE_bind" format="none">&lt;D:bind></xref> on target collection</c>  
  <c>MOVE (no target exists)</c> <c><xref target="PRIVILEGE_unbind" format="none">&lt;D:unbind></xref> on source collection and <xref target="PRIVILEGE_bind" format="none">&lt;D:bind></xref> 
    on target collection</c> 
  <c>MOVE (target exists)</c>    <c>As above, plus <xref target="PRIVILEGE_unbind" format="none">&lt;D:unbind></xref> on the target 
    collection</c> 
  <c>DELETE</c>             <c><xref target="PRIVILEGE_unbind" format="none">&lt;D:unbind></xref> on parent collection</c>  
  <c>LOCK (target exists)</c>    <c><xref target="PRIVILEGE_write-content" format="none">&lt;D:write-content></xref></c>  
  <c>LOCK (no target exists)</c> <c><xref target="PRIVILEGE_bind" format="none">&lt;D:bind></xref> on parent collection</c> 
  <c>MKCOL</c>              <c><xref target="PRIVILEGE_bind" format="none">&lt;D:bind></xref> on parent collection</c>  
  <c>UNLOCK</c>             <c><xref target="PRIVILEGE_unlock" format="none">&lt;D:unlock></xref></c>
  <c>CHECKOUT</c>           <c><xref target="PRIVILEGE_write-properties" format="none">&lt;D:write-properties></xref></c>  
  <c>CHECKIN</c>            <c><xref target="PRIVILEGE_write-properties" format="none">&lt;D:write-properties></xref></c>
  <c>REPORT</c>             <c><xref target="PRIVILEGE_read" format="none">&lt;D:read></xref> (on all referenced resources)</c>  
  <c>VERSION-CONTROL</c>    <c><xref target="PRIVILEGE_write-properties" format="none">&lt;D:write-properties></xref></c> 
  <c>MERGE</c>              <c><xref target="PRIVILEGE_write-content" format="none">&lt;D:write-content></xref></c>
  <c>MKWORKSPACE</c>        <c><xref target="PRIVILEGE_write-content" format="none">&lt;D:write-content></xref> on parent collection</c>
  <c>BASELINE-CONTROL</c>   <c><xref target="PRIVILEGE_write-properties" format="none">&lt;D:write-properties></xref> and <xref target="PRIVILEGE_write-content" format="none">&lt;D:write-content></xref></c>
  <c>MKACTIVITY</c>         <c><xref target="PRIVILEGE_write-content" format="none">&lt;D:write-content></xref> on parent collection</c>
</texttable>
</section>

</back>
</rfc>
