<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<?rfc toc="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<?rfc-ext parse-xml-in-artwork="yes"?>
<?rfc-ext allow-markup-in-artwork="yes"?>
<?rfc-ext authors-section="end" ?>
<?rfc-ext sec-no-trailing-dots="yes" ?>
<?rfc-ext include-references-in-index="yes" ?>

<!DOCTYPE rfc [
  <!ENTITY MAY "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>MAY</bcp14>">
  <!ENTITY MUST "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>MUST</bcp14>">
  <!ENTITY MUST-NOT "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>MUST NOT</bcp14>">
  <!ENTITY OPTIONAL "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>OPTIONAL</bcp14>">
  <!ENTITY RECOMMENDED "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>RECOMMENDED</bcp14>">
  <!ENTITY REQUIRED "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>REQUIRED</bcp14>">
  <!ENTITY SHALL "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>SHALL</bcp14>">
  <!ENTITY SHALL-NOT "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>SHALL NOT</bcp14>">
  <!ENTITY SHOULD "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>SHOULD</bcp14>">
  <!ENTITY SHOULD-NOT "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>SHOULD NOT</bcp14>">
  
  <!ENTITY boxh "&#x2500;">
  <!ENTITY boxv "&#x2502;">
  <!ENTITY boxur "&#x2514;">
  <!ENTITY boxvr "&#x251c;">
]>
<rfc number="3744" category="std" xmlns:x='http://purl.org/net/xml2rfc/ext' xmlns:grddl='http://www.w3.org/2003/g/data-view#' grddl:transformation='rfc2629grddl.xslt'>
  <front>
    <title abbrev="WebDAV Access Control Protocol">Web Distributed Authoring and Versioning (WebDAV) Access&#160;Control&#160;Protocol</title>
    <author initials="G." surname="Clemm" fullname="Geoffrey 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="Eric 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="Jim 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="May" year="2004"/>
	
    <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>

    </abstract>
  </front>

	<middle>

<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>

<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 <xref target="METHOD_options"/>.  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 document uses the terms defined in HTTP <xref target="RFC2616"/> and WebDAV 
         <xref target="RFC2518"/>.  In addition, the following terms are defined:
</t>
<t>
  <iref item="principal" primary="true"/>
  <x:dfn>principal</x:dfn>
  <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>
  <iref item="group" primary="true"/>
  <x:dfn>group</x:dfn>
  <list><t>A "group" is a principal that represents a set of other 
         principals.</t></list>
</t>
<t>
  <iref item="privilege" primary="true"/>
  <x:dfn>privilege</x:dfn>
  <list><t>A "privilege" controls access to a particular set of HTTP 
         operations on a resource.</t></list>
</t>
<t>
  <iref item="aggregate privilege" primary="true"/>
  <x:dfn>aggregate privilege</x:dfn>
  <list><t>An "aggregate privilege" is a privilege that contains a set of 
         other privileges.</t></list>
</t>
<t>
  <iref item="abstract" primary="true"/>
  <x:dfn>abstract privilege</x:dfn>
  <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>
  <iref item="access control list" primary="true"/>
  <iref item="ACL" primary="true"/>
  <x:dfn>access control list</x:dfn> (<x:dfn>ACL</x:dfn>)
  <list><t>An "ACL" is a list of access control elements that define access 
         control to a particular resource.</t></list>
</t>
<t>
  <iref item="access control element" primary="true"/>
  <iref item="ACE" primary="true"/>
  <x:dfn>access control element</x:dfn> (<x:dfn>ACE</x:dfn>)
  <list><t>An "ACE" either grants or denies a particular set of (non-abstract)
         privileges for a particular principal.</t></list>
</t>
<t>
  <iref item="inherited ACE" primary="true"/>
  <x:dfn>inherited ACE</x:dfn>
  <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>
  <iref item="protected property" primary="true"/>
  <x:dfn>protected property</x:dfn>
  <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 <xref target="RFC2616" x:fmt="of" x:sec="2.1"/>.  Because this 
         augmented BNF uses the basic production rules provided in <xref target="RFC2616" x:fmt="of" x:sec="2.2"/>,
         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" x:fmt="," x:sec="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 - 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 type="application/xml-dtd">
&lt;!ELEMENT read EMPTY&gt; 
</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"/>

<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 
         <xref target="RFC2518" x:fmt="of" x:sec="5.3"/>), 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 type="application/xml-dtd">
&lt;!ELEMENT write EMPTY&gt; 
</artwork></figure>
</section>

<section title="DAV:write-properties Privilege" anchor="PRIVILEGE_write-properties">

<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 - 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 type="application/xml-dtd">
&lt;!ELEMENT write-properties EMPTY&gt; 
</artwork></figure>
</section>

<section title="DAV:write-content Privilege" anchor="PRIVILEGE_write-content">

<iref item="DAV:write-content privilege" primary="true"/>
<iref item="Privileges" subitem="DAV:write-content" primary="true"/>

<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>

<figure><artwork type="application/xml-dtd">
&lt;!ELEMENT write-content EMPTY&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT unlock EMPTY&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT read-acl EMPTY&gt; 
</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 
         writable. 
</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 type="application/xml-dtd">
&lt;!ELEMENT read-current-user-privilege-set EMPTY&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT write-acl EMPTY&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT bind EMPTY&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT unbind EMPTY&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT all EMPTY&gt; 
</artwork></figure>
</section>

<section title="Aggregation of Predefined Privileges" anchor="aggregation.of.predefined.privileges"> 

<t>
         Server implementations are free to aggregate the predefined 
         privileges (defined above in Sections 
         <xref target="PRIVILEGE_read" format="counter"/>-<xref target="PRIVILEGE_unbind" format="counter"/>) 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 DAV:bind, DAV:unbind, 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 <xref target="RFC2518" x:fmt="of" x:sec="13.2"/>), 
         and a DAV:resourcetype property (defined in  
         <xref target="RFC2518" x:fmt="of" x:sec="13.9"/>).  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 type="application/xml-dtd">
&lt;!ELEMENT principal EMPTY&gt; 
</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 <xref target="RFC2518" x:fmt="of" x:sec="12.14.1"/>).  
</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"/>

<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 
         <xref target="RFC2251"/> 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 type="application/xml-dtd">
&lt;!ELEMENT alternate-URI-set (href*)&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT principal-URL (href)&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT group-member-set (href*)&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT group-membership (href*)&gt; 
</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
         <xref target="RFC2518" x:fmt="of" x:sec="12.14.1"/>) &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 <xref target="RFC2518" x:fmt="of" x:sec="3"/>) &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"/>
<t>
         This  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>
<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>
<figure><artwork type="application/xml-dtd">
&lt;!ELEMENT owner (href?)&gt; 
</artwork></figure>


<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>

<figure><preamble>
&gt;&gt; Request &lt;&lt; 
</preamble><artwork type='message/http; msgtype="request"'>
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" ?&gt; 
&lt;D:propfind xmlns:D="DAV:"&gt; 
  &lt;D:prop&gt; 
    &lt;D:owner/&gt; 
  &lt;/D:prop&gt; 
&lt;/D:propfind&gt; 
</artwork></figure>

<figure><preamble>
&gt;&gt; Response &lt;&lt; 
</preamble><artwork type='message/http; msgtype="response"'>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?&gt; 
&lt;D:multistatus xmlns:D="DAV:"&gt;  
  &lt;D:response&gt;  
    &lt;D:href&gt;http://www.example.com/papers/&lt;/D:href&gt; 
    &lt;D:propstat&gt; 
      &lt;D:prop&gt; 
        &lt;D:owner&gt; 
          &lt;D:href&gt;http://www.example.com/acl/users/gstein&lt;/D:href&gt;        
        &lt;/D:owner&gt; 
      &lt;/D:prop&gt; 
      &lt;D:status&gt;HTTP/1.1 200 OK&lt;/D:status&gt; 
    &lt;/D:propstat&gt; 
  &lt;/D:response&gt; 
&lt;/D:multistatus&gt; 
</artwork></figure>
</section>
         
<section title="Example: An Attempt to Set DAV:owner">
<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&gt;.  Since DAV:owner is a protected property 
         on this particular server, it responds with a 207 (Multi-Status) response 
         that contains a 403 (Forbidden) status code for the act of setting 
         DAV:owner.  <xref target="RFC2518" x:fmt="of" x:sec="8.2.1"/> describes PROPPATCH status 
         code information, <xref target="RFC2518" x:fmt="of" x:sec="11"/> describes the
         Multi-Status response 
         and Sections <xref target="RFC3253" x:fmt="number" x:sec="1.6"/> and <xref target="RFC3253" x:fmt="number" x:sec="3.12"/> of <xref target="RFC3253"/> describe
         additional error marshaling for PROPPATCH attempts on protected properties. 
</t>

<figure><preamble>
&gt;&gt; Request &lt;&lt; 
</preamble><artwork type='message/http; msgtype="request"'>
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" ?&gt; 
&lt;D:propertyupdate xmlns:D="DAV:"&gt; 
  &lt;D:set&gt; 
    &lt;D:prop&gt; 
      &lt;D:owner&gt; 
        &lt;D:href&gt;http://www.example.com/acl/users/jim&lt;/D:href&gt; 
      &lt;/D:owner&gt; 
    &lt;/D:prop&gt; 
  &lt;/D:set&gt; 
&lt;/D:propertyupdate&gt; 
</artwork></figure>



<figure><preamble>
&gt;&gt; Response &lt;&lt; 
</preamble><artwork type='message/http; msgtype="response"'>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?&gt; 
&lt;D:multistatus xmlns:D="DAV:"&gt;  
  &lt;D:response&gt;  
    &lt;D:href&gt;http://www.example.com/papers/&lt;/D:href&gt; 
    &lt;D:propstat&gt; 
      &lt;D:prop&gt;&lt;D:owner/&gt;&lt;/D:prop&gt; 
      &lt;D:status&gt;HTTP/1.1 403 Forbidden&lt;/D:status&gt; 
      &lt;D:responsedescription&gt;
        &lt;D:error&gt;&lt;D:cannot-modify-protected-property/&gt;&lt;/D:error&gt;
        Failure to set protected property (DAV:owner) 
      &lt;/D:responsedescription&gt; 
    &lt;/D:propstat&gt; 
  &lt;/D:response&gt; 
&lt;/D:multistatus&gt; 
</artwork></figure>

</section>
</section>


<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 type="application/xml-dtd">
&lt;!ELEMENT group (href?)&gt; 
</artwork></figure>
</section>


<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 type="application/xml-dtd">
&lt;!ELEMENT supported-privilege-set (supported-privilege*)&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT supported-privilege 
 (privilege, abstract?, description, supported-privilege*)&gt; 
&lt;!ELEMENT privilege ANY&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT abstract EMPTY&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT description #PCDATA&gt; 
</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 type="drawing">
[DAV:, all] (aggregate, abstract) 
   &boxv;
   &boxur;&boxh;&boxh; [DAV:, read] (aggregate) 
          &boxv; 
          &boxvr;&boxh;&boxh; [DAV:, read-acl] (abstract) 
          &boxur;&boxh;&boxh; [DAV:, read-current-user-privilege-set] (abstract) 
   &boxv; 
   &boxur;&boxh;&boxh; [DAV:, write] (aggregate) 
          &boxv; 
          &boxvr;&boxh;&boxh; [DAV:, write-acl] (abstract) 
          &boxvr;&boxh;&boxh; [DAV:, write-properties] 
          &boxur;&boxh;&boxh; [DAV:, write-content] 
   &boxv;
   &boxur;&boxh;&boxh; [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>

<figure><preamble>
&gt;&gt; Request &lt;&lt; 
</preamble><artwork type='message/http; msgtype="request"'>
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" ?&gt; 
&lt;D:propfind xmlns:D="DAV:"&gt; 
  &lt;D:prop&gt; 
    &lt;D:supported-privilege-set/&gt; 
  &lt;/D:prop&gt; 
&lt;/D:propfind&gt; 
</artwork></figure>

<figure><preamble>
&gt;&gt; Response &lt;&lt; 
</preamble><artwork type='message/http; msgtype="response"'>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;D:multistatus xmlns:D="DAV:"&gt; 
  &lt;D:response&gt; 
    &lt;D:href&gt;http://www.example.com/papers/&lt;/D:href&gt;
    &lt;D:propstat&gt;
      &lt;D:prop&gt;
        &lt;D:supported-privilege-set&gt;
          &lt;D:supported-privilege&gt;
            &lt;D:privilege&gt;&lt;D:all/&gt;&lt;/D:privilege&gt;
           &lt;D:abstract/&gt;
            &lt;D:description xml:lang="en"&gt;
              Any operation
            &lt;/D:description&gt;
            &lt;D:supported-privilege&gt;
              &lt;D:privilege&gt;&lt;D:read/&gt;&lt;/D:privilege&gt;
              &lt;D:description xml:lang="en"&gt;
                Read any object
              &lt;/D:description&gt;
              &lt;D:supported-privilege&gt;
                &lt;D:privilege&gt;&lt;D:read-acl/&gt;&lt;/D:privilege&gt;
                &lt;D:abstract/&gt;
                &lt;D:description xml:lang="en"&gt;Read ACL&lt;/D:description&gt;
              &lt;/D:supported-privilege&gt;
              &lt;D:supported-privilege&gt;
                &lt;D:privilege&gt; 
                  &lt;D:read-current-user-privilege-set/&gt;
                &lt;/D:privilege&gt;
                &lt;D:abstract/&gt;
                &lt;D:description xml:lang="en"&gt;
                  Read current user privilege set property
                &lt;/D:description&gt;
              &lt;/D:supported-privilege&gt;
            &lt;/D:supported-privilege&gt;
            &lt;D:supported-privilege&gt;
              &lt;D:privilege&gt;&lt;D:write/&gt;&lt;/D:privilege&gt;
              &lt;D:description xml:lang="en"&gt;
                Write any object
              &lt;/D:description&gt;
              &lt;D:supported-privilege&gt;
                &lt;D:privilege&gt;&lt;D:write-acl/&gt;&lt;/D:privilege&gt;
                &lt;D:description xml:lang="en"&gt;
                  Write ACL
                &lt;/D:description&gt;
                &lt;D:abstract/&gt;
              &lt;/D:supported-privilege&gt;
              &lt;D:supported-privilege&gt;
                &lt;D:privilege&gt;&lt;D:write-properties/&gt;&lt;/D:privilege&gt;
                &lt;D:description xml:lang="en"&gt;
                  Write properties
                &lt;/D:description&gt;
              &lt;/D:supported-privilege&gt;
              &lt;D:supported-privilege&gt;
                &lt;D:privilege&gt;&lt;D:write-content/&gt;&lt;/D:privilege&gt;
                &lt;D:description xml:lang="en"&gt;
                  Write resource content
                &lt;/D:description&gt;
              &lt;/D:supported-privilege&gt;
            &lt;/D:supported-privilege&gt;
            &lt;D:supported-privilege&gt;
              &lt;D:privilege&gt;&lt;D:unlock/&gt;&lt;/D:privilege&gt;
              &lt;D:description xml:lang="en"&gt;
                Unlock resource
              &lt;/D:description&gt;
            &lt;/D:supported-privilege&gt;
          &lt;/D:supported-privilege&gt;
        &lt;/D:supported-privilege-set&gt;
      &lt;/D:prop&gt;
      &lt;D:status&gt;HTTP/1.1 200 OK&lt;/D:status&gt;
    &lt;/D:propstat&gt;
  &lt;/D:response&gt;
&lt;/D:multistatus&gt;
</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 type="application/xml-dtd">
&lt;!ELEMENT current-user-privilege-set (privilege*)&gt; 
&lt;!ELEMENT privilege ANY&gt; 
</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>

<figure><preamble>
&gt;&gt; Request &lt;&lt; 
</preamble><artwork type='message/http; msgtype="request"'>
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" ?&gt; 
&lt;D:propfind xmlns:D="DAV:"&gt; 
  &lt;D:prop&gt; 
    &lt;D:current-user-privilege-set/&gt; 
  &lt;/D:prop&gt; 
&lt;/D:propfind&gt; 
</artwork></figure>

<figure><preamble>
&gt;&gt; Response &lt;&lt; 
</preamble><artwork type='message/http; msgtype="response"'>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?&gt; 
&lt;D:multistatus xmlns:D="DAV:"&gt;  
  &lt;D:response&gt;  
  &lt;D:href&gt;http://www.example.com/papers/&lt;/D:href&gt; 
  &lt;D:propstat&gt; 
    &lt;D:prop&gt; 
      &lt;D:current-user-privilege-set&gt; 
        &lt;D:privilege&gt;&lt;D:read/&gt;&lt;/D:privilege&gt; 
      &lt;/D:current-user-privilege-set&gt; 
    &lt;/D:prop&gt; 
    &lt;D:status&gt;HTTP/1.1 200 OK&lt;/D:status&gt; 
  &lt;/D:propstat&gt; 
  &lt;/D:response&gt; 
&lt;/D:multistatus&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT acl (ace*) &gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT ace ((principal | invert), (grant|deny), protected?,
               inherited?)&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT principal (href | all | authenticated | unauthenticated 
 | property | self)&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT all EMPTY&gt; 
</artwork></figure>
<t>
         The current user matches DAV:authenticated only if authenticated. 
</t>
<figure><artwork type="application/xml-dtd">
&lt;!ELEMENT authenticated EMPTY&gt; 
</artwork></figure>
<t>
         The current user matches DAV:unauthenticated only if not 
         authenticated. 
</t>
<figure><artwork type="application/xml-dtd">
&lt;!ELEMENT unauthenticated EMPTY&gt; 
</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/&gt;, 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 type="application/xml-dtd">
&lt;!ELEMENT property ANY&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT self EMPTY&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT invert principal&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT grant (privilege+)&gt; 
&lt;!ELEMENT deny (privilege+)&gt; 
&lt;!ELEMENT privilege ANY&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT protected EMPTY&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT inherited (href)&gt; 
</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>

<figure><preamble>
&gt;&gt; Request &lt;&lt; 
</preamble><artwork type='message/http; msgtype="request"'>
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:"&gt; 
  &lt;D:prop&gt; 
    &lt;D:acl/&gt; 
  &lt;/D:prop&gt; 
&lt;/D:propfind&gt; 
</artwork></figure>

<figure><preamble>
&gt;&gt; Response &lt;&lt; 
</preamble><artwork type='message/http; msgtype="response"'>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;D:multistatus xmlns:D="DAV:"&gt;  
  &lt;D:response&gt;  
    &lt;D:href&gt;http://www.example.com/papers/&lt;/D:href&gt; 
    &lt;D:propstat&gt; 
      &lt;D:prop&gt; 
        &lt;D:acl&gt; 
        &lt;D:ace&gt; 
          &lt;D:principal&gt; 
            &lt;D:href
            &gt;http://www.example.com/acl/groups/maintainers&lt;/D:href&gt; 
          &lt;/D:principal&gt;  
          &lt;D:grant&gt; 
            &lt;D:privilege&gt;&lt;D:write/&gt;&lt;/D:privilege&gt; 
          &lt;/D:grant&gt; 
        &lt;/D:ace&gt; 
        &lt;D:ace&gt; 
          &lt;D:principal&gt; 
            &lt;D:all/&gt; 
          &lt;/D:principal&gt; 
          &lt;D:grant&gt; 
            &lt;D:privilege&gt;&lt;D:read/&gt;&lt;/D:privilege&gt;  
          &lt;/D:grant&gt; 
        &lt;/D:ace&gt; 
      &lt;/D:acl&gt; 
      &lt;/D:prop&gt; 
      &lt;D:status&gt;HTTP/1.1 200 OK&lt;/D:status&gt; 
    &lt;/D:propstat&gt; 
  &lt;/D:response&gt; 
&lt;/D:multistatus&gt;
</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&gt;">Deny ACEs are not supported</t>
    <t hangText="&lt;no-invert&gt;">Inverted ACEs are not supported </t>
    <t hangText="&lt;deny-before-grant&gt;">All deny ACEs must occur before any grant ACEs</t>
    <t hangText="&lt;required-principal&gt;">Indicates which principals are required to be present</t>
  </list>
</t>
<figure><artwork type="application/xml-dtd">
&lt;!ELEMENT acl-restrictions (grant-only?, no-invert?, 
                            deny-before-grant?,
                            required-principal?)&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT grant-only EMPTY&gt; 
</artwork></figure>
</section>

<section title="DAV:no-invert ACE Constraint" anchor="CONSTRAINT_no-invert">
<t>
         This element indicates that ACEs with the &lt;invert&gt; element are not 
         allowed. 
</t>
<figure><artwork type="application/xml-dtd">
&lt;!ELEMENT no-invert EMPTY&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT deny-before-grant EMPTY&gt; 
</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 type="application/xml-dtd">
&lt;!ELEMENT required-principal 
  (all? | authenticated? | unauthenticated? | self? | href* |
   property*)&gt; 
</artwork></figure>
<t>
         For example, the following element requires that the ACL contain a 
         DAV:owner property ACE:
</t>
<figure><artwork type="application/xml-dtd">
&lt;D:required-principal xmlns:D="DAV:"&gt; 
  &lt;D:property&gt;&lt;D:owner/&gt;&lt;/D:property&gt; 
&lt;/D:required-principal&gt; 
</artwork></figure>
</section>


<section title="Example: Retrieving DAV:acl-restrictions"> 
<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>

<figure><preamble>
&gt;&gt; Request &lt;&lt; 
</preamble><artwork type='message/http; msgtype="request"'>
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" ?&gt; 
&lt;D:propfind xmlns:D="DAV:"&gt; 
  &lt;D:prop&gt; 
    &lt;D:acl-restrictions/&gt; 
  &lt;/D:prop&gt; 
&lt;/D:propfind&gt; 
</artwork></figure>

<figure><preamble>
&gt;&gt; Response &lt;&lt; 
</preamble><artwork type='message/http; msgtype="response"'>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?&gt; 
&lt;D:multistatus xmlns:D="DAV:"&gt;  
  &lt;D:response&gt;  
    &lt;D:href&gt;http://www.example.com/papers/&lt;/D:href&gt; 
    &lt;D:propstat&gt; 
      &lt;D:prop&gt; 
        &lt;D:acl-restrictions&gt; 
          &lt;D:grant-only/&gt; 
          &lt;D:required-principal&gt; 
            &lt;D:all/&gt; 
          &lt;/D:required-principal&gt; 
        &lt;/D:acl-restrictions&gt; 
      &lt;/D:prop&gt; 
      &lt;D:status&gt;HTTP/1.1 200 OK&lt;/D:status&gt; 
    &lt;/D:propstat&gt; 
  &lt;/D:response&gt; 
&lt;/D:multistatus&gt;
</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 type="application/xml-dtd">
&lt;!ELEMENT inherited-acl-set (href*)&gt; 
</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 <xref target="RFC2518" x:fmt="of" x:sec="13.2"/>) 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 type="application/xml-dtd">
&lt;!ELEMENT principal-collection-set (href*)&gt; 
</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>

<figure><preamble>
&gt;&gt; Request &lt;&lt; 
</preamble><artwork type='message/http; msgtype="request"'>
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" ?&gt; 
&lt;D:propfind xmlns:D="DAV:"&gt; 
  &lt;D:prop&gt; 
    &lt;D:principal-collection-set/&gt; 
  &lt;/D:prop&gt; 
&lt;/D:propfind&gt; 
</artwork></figure>

<figure><preamble>
&gt;&gt; Response &lt;&lt; 
</preamble><artwork type='message/http; msgtype="response"'>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?&gt; 
&lt;D:multistatus xmlns:D="DAV:"&gt;  
  &lt;D:response&gt;  
    &lt;D:href&gt;http://www.example.com/papers/&lt;/D:href&gt; 
    &lt;D:propstat&gt; 
      &lt;D:prop&gt; 
        &lt;D:principal-collection-set&gt; 
          &lt;D:href&gt;http://www.example.com/acl/users/&lt;/D:href&gt; 
          &lt;D:href&gt;http://www.example.com/acl/groups/&lt;/D:href&gt; 
        &lt;/D:principal-collection-set&gt; 
      &lt;/D:prop&gt; 
    &lt;D:status&gt;HTTP/1.1 200 OK&lt;/D:status&gt; 
    &lt;/D:propstat&gt; 
  &lt;/D:response&gt; 
&lt;/D:multistatus&gt; 
</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>

<figure><preamble>
&gt;&gt; Request &lt;&lt; 
</preamble><artwork type='message/http; msgtype="request"'>
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" ?&gt; 
&lt;D:propfind xmlns:D="DAV:"&gt; 
  &lt;D:prop&gt; 
    &lt;D:owner/&gt; 
    &lt;D:supported-privilege-set/&gt; 
    &lt;D:current-user-privilege-set/&gt; 
    &lt;D:acl/&gt; 
  &lt;/D:prop&gt; 
&lt;/D:propfind&gt; 
</artwork></figure>
<figure><preamble>
&gt;&gt; Response &lt;&lt; 
</preamble>
<artwork type='message/http; msgtype="response"'>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?&gt; 
&lt;D:multistatus xmlns:D="DAV:" 
               xmlns:A="http://www.example.com/acl/"&gt;
  &lt;D:response&gt;  
    &lt;D:href&gt;http://www.example.com/top/container/&lt;/D:href&gt; 
    &lt;D:propstat&gt; 
      &lt;D:prop&gt; 
        &lt;D:owner&gt; 
          &lt;D:href&gt;http://www.example.com/users/gclemm&lt;/D:href&gt; 
        &lt;/D:owner&gt; 
        &lt;D:supported-privilege-set&gt; 
          &lt;D:supported-privilege&gt; 
            &lt;D:privilege&gt;&lt;D:all/&gt;&lt;/D:privilege&gt; 
            &lt;D:abstract/&gt; 
            &lt;D:description xml:lang="en"&gt;
              Any operation
            &lt;/D:description&gt; 
            &lt;D:supported-privilege&gt; 
              &lt;D:privilege&gt;&lt;D:read/&gt;&lt;/D:privilege&gt; 
              &lt;D:description xml:lang="en"&gt;
                Read any object
              &lt;/D:description&gt; 
            &lt;/D:supported-privilege&gt; 
            &lt;D:supported-privilege&gt; 
              &lt;D:privilege&gt;&lt;D:write/&gt;&lt;/D:privilege&gt; 
              &lt;D:abstract/&gt; 
              &lt;D:description xml:lang="en"&gt;
                Write any object
              &lt;/D:description&gt; 
              &lt;D:supported-privilege&gt; 
                &lt;D:privilege&gt;&lt;A:create/&gt;&lt;/D:privilege&gt; 
                &lt;D:description xml:lang="en"&gt;
                  Create an object
                &lt;/D:description&gt; 
              &lt;/D:supported-privilege&gt; 
              &lt;D:supported-privilege&gt; 
                &lt;D:privilege&gt;&lt;A:update/&gt;&lt;/D:privilege&gt; 
                &lt;D:description xml:lang="en"&gt;
                  Update an object
                &lt;/D:description&gt; 
              &lt;/D:supported-privilege&gt; 
            &lt;/D:supported-privilege&gt; 
            &lt;D:supported-privilege&gt;
              &lt;D:privilege&gt;&lt;A:delete/&gt;&lt;/D:privilege&gt;
              &lt;D:description xml:lang="en"&gt;
                Delete an object
              &lt;/D:description&gt;
            &lt;/D:supported-privilege&gt;
            &lt;D:supported-privilege&gt; 
              &lt;D:privilege&gt;&lt;D:read-acl/&gt;&lt;/D:privilege&gt; 
              &lt;D:description xml:lang="en"&gt;
                Read the ACL
              &lt;/D:description&gt; 
            &lt;/D:supported-privilege&gt; 
            &lt;D:supported-privilege&gt; 
              &lt;D:privilege&gt;&lt;D:write-acl/&gt;&lt;/D:privilege&gt; 
              &lt;D:description xml:lang="en"&gt;
                Write the ACL
              &lt;/D:description&gt; 
            &lt;/D:supported-privilege&gt; 
          &lt;/D:supported-privilege&gt; 
        &lt;/D:supported-privilege-set&gt; 
        &lt;D:current-user-privilege-set&gt; 
          &lt;D:privilege&gt;&lt;D:read/&gt;&lt;/D:privilege&gt; 
          &lt;D:privilege&gt;&lt;D:read-acl/&gt;&lt;/D:privilege&gt; 
        &lt;/D:current-user-privilege-set&gt; 
        &lt;D:acl&gt; 
          &lt;D:ace&gt; 
            &lt;D:principal&gt; 
              &lt;D:href&gt;http://www.example.com/users/esedlar&lt;/D:href&gt; 
            &lt;/D:principal&gt;  
            &lt;D:grant&gt; 
              &lt;D:privilege&gt;&lt;D:read/&gt;&lt;/D:privilege&gt; 
              &lt;D:privilege&gt;&lt;D:write/&gt;&lt;/D:privilege&gt; 
              &lt;D:privilege&gt;&lt;D:read-acl/&gt;&lt;/D:privilege&gt;
            &lt;/D:grant&gt; 
          &lt;/D:ace&gt; 
          &lt;D:ace&gt; 
            &lt;D:principal&gt; 
              &lt;D:href&gt;http://www.example.com/groups/mrktng&lt;/D:href&gt; 
            &lt;/D:principal&gt; 
            &lt;D:deny&gt; 
              &lt;D:privilege&gt;&lt;D:read/&gt;&lt;/D:privilege&gt;
            &lt;/D:deny&gt; 
          &lt;/D:ace&gt; 
          &lt;D:ace&gt; 
            &lt;D:principal&gt; 
              &lt;D:property&gt;&lt;D:owner/&gt;&lt;/D:property&gt;
            &lt;/D:principal&gt; 
            &lt;D:grant&gt; 
              &lt;D:privilege&gt;&lt;D:read-acl/&gt;&lt;/D:privilege&gt; 
              &lt;D:privilege&gt;&lt;D:write-acl/&gt;&lt;/D:privilege&gt;
            &lt;/D:grant&gt; 
          &lt;/D:ace&gt; 
          &lt;D:ace&gt; 
            &lt;D:principal&gt;&lt;D:all/&gt;&lt;/D:principal&gt; 
            &lt;D:grant&gt; 
              &lt;D:privilege&gt;&lt;D:read/&gt;&lt;/D:privilege&gt;
            &lt;/D:grant&gt; 
            &lt;D:inherited&gt; 
              &lt;D:href&gt;http://www.example.com/top&lt;/D:href&gt; 
            &lt;/D:inherited&gt; 
          &lt;/D:ace&gt;
        &lt;/D:acl&gt; 
      &lt;/D:prop&gt; 
      &lt;D:status&gt;HTTP/1.1 200 OK&lt;/D:status&gt; 
    &lt;/D:propstat&gt;
  &lt;/D:response&gt;
&lt;/D:multistatus&gt; 
</artwork>


</figure>

<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>

<figure><artwork type="drawing">
[DAV:, all] (aggregate, abstract) 
   &boxv;
   &boxvr;&boxh;&boxh; [DAV:, read] 
   &boxur;&boxh;&boxh; [DAV:, write] (aggregate, abstract) 
          &boxv;
          &boxvr;&boxh;&boxh; [http://www.example.com/acl, create] 
          &boxvr;&boxh;&boxh; [http://www.example.com/acl, update] 
          &boxur;&boxh;&boxh; [http://www.example.com/acl, delete] 
   &boxvr;&boxh;&boxh; [DAV:, read-acl] 
   &boxur;&boxh;&boxh; [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/mrktng 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">
<t>
         WebDAV ACLs are evaluated in similar manner as ACLs on Windows NT 
         and in NFSv4 <xref target="RFC3530"/>).  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&gt; 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's group and for the world.  An ACL for UNIX permissions of 
         "r--rw-r--" might be constructed like: 
</t>
<figure><artwork type="drawing">
&lt;D:acl&gt; 
  &lt;D:ace&gt; 
    &lt;D:principal&gt;
      &lt;D:property&gt;&lt;D:owner/&gt;&lt;/D:property&gt;
    &lt;/D:principal&gt; 
    &lt;D:grant&gt;
      &lt;D:privilege&gt;&lt;D:read/&gt;&lt;/D:privilege&gt;
    &lt;/D:grant&gt; 
  &lt;/D:ace&gt; 
  &lt;D:ace&gt; 
    &lt;D:principal&gt;
      &lt;D:property&gt;&lt;D:owner/&gt;&lt;/D:property&gt;
    &lt;/D:principal&gt; 
    &lt;D:deny&gt;
      &lt;D:privilege&gt;&lt;D:all/&gt;&lt;/D:privilege&gt;
    &lt;/D:deny&gt; 
  &lt;/D:ace&gt; 
  &lt;D:ace&gt; 
    &lt;D:principal&gt;
      &lt;D:property&gt;&lt;D:group/&gt;&lt;/D:property&gt;
    &lt;/D:principal&gt; 
    &lt;D:grant&gt;
      &lt;D:privilege&gt;&lt;D:read/&gt;&lt;/D:privilege&gt; 
      &lt;D:privilege&gt;&lt;D:write/&gt;&lt;/D:privilege&gt;
    &lt;/D:grant&gt; 
  &lt;/D:ace&gt; 
  &lt;D:ace&gt; 
    &lt;D:principal&gt;
      &lt;D:property&gt;&lt;D:group/&gt;&lt;/D:property&gt;
    &lt;/D:principal&gt; 
    &lt;D:deny&gt;
      &lt;D:privilege&gt;&lt;D:all/&gt;&lt;/D:privilege&gt;
    &lt;/D:deny&gt; 
  &lt;/D:ace&gt; 
  &lt;D:ace&gt; 
    &lt;D:principal&gt;&lt;D:all&gt;&lt;/D:principal&gt; 
    &lt;D:grant&gt;
      &lt;D:privilege&gt;&lt;D:read/&gt;&lt;/D:privilege&gt;
    &lt;/D:grant&gt; 
  &lt;/D:ace&gt; 
&lt;/D:acl&gt; 
</artwork></figure>
<t>
         and the &lt;acl-restrictions&gt; would be defined as: 
</t>
<figure><artwork type="example">
&lt;D:no-invert/&gt;
&lt;D:required-principal&gt; 
  &lt;D:all/&gt; 
  &lt;D:property&gt;&lt;D:owner/&gt;&lt;/D:property&gt; 
  &lt;D:property&gt;&lt;D:group/&gt;&lt;D:group/&gt; 
&lt;/D:required-principal&gt; 
</artwork></figure>
<t>
         Note that the client can still get errors from a UNIX server in 
         spite of obeying the &lt;acl-restrictions&gt;, including &lt;D:allowed-principal&gt;
         (adding an ACE specifying a principal other than the 
         ones in the ACL above) or &lt;D:ace-conflict&gt; (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"> 
<iref item="DAV:need-privileges precondition" primary="true"/>
<iref item="Condition Names" subitem="DAV:need-privileges (pre)" primary="true"/>
<t>
         The WebDAV ACL mechanism requires the usage of HTTP method 
         "preconditions" as described in section <xref target="RFC3253" format="none" x:sec="1.6" x:fmt="number"/> 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&gt; element, which in turn contains 
         the &lt;DAV:need-privileges&gt; element, which contains one or more 
         &lt;DAV:resource&gt; elements indicating which resource had insufficient 
         privileges, and what the lacking privileges were: 
</t>
<figure><artwork type="application/xml-dtd">
&lt;!ELEMENT need-privileges (resource)* &gt; 
&lt;!ELEMENT resource ( href , privilege ) &gt; 
</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 - for
         implementation reasons, some servers may only report the first 
         privilege violation.  For example: 
</t>
<figure><preamble>
&gt;&gt; Request &lt;&lt; 
</preamble><artwork type='message/http; msgtype="request"'>
MOVE /a/b/ HTTP/1.1 
Host: www.example.com 
Destination: http://www.example.com/c/d 
</artwork></figure>
<figure><preamble>
&gt;&gt; Response &lt;&lt; 
</preamble><artwork type='message/http; msgtype="response"'>
HTTP/1.1 403 Forbidden 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;D:error xmlns:D="DAV:"&gt; 
  &lt;D:need-privileges&gt; 
    &lt;D:resource&gt; 
      &lt;D:href&gt;/a&lt;/D:href&gt; 
      &lt;D:privilege&gt;&lt;D:unbind/&gt;&lt;/D:privilege&gt; 
    &lt;/D:resource&gt; 
    &lt;D:resource&gt; 
      &lt;D:href&gt;/c&lt;/D:href&gt; 
      &lt;D:privilege&gt;&lt;D:bind/&gt;&lt;/D:privilege&gt; 
    &lt;/D:resource&gt; 
  &lt;/D:need-privileges&gt; 
&lt;/D:error&gt; 
</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>
&gt;&gt; Request &lt;&lt; 
</preamble><artwork type='message/http; msgtype="request"'>
OPTIONS /foo.html HTTP/1.1  
Host: www.example.com 
Content-Length: 0 
</artwork></figure>
<figure><preamble>
&gt;&gt; Response &lt;&lt; 
</preamble><artwork type='message/http; msgtype="response"'>
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" anchor="METHOD_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>
           <x:h>Implementation Note:</x:h> 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>

<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 
         <xref target="CONSTRAINT_no-invert"/>). 
</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>

<figure><preamble>
&gt;&gt; Request &lt;&lt; 
</preamble><artwork type='message/http; msgtype="request"'>
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" ?&gt; 
&lt;D:acl xmlns:D="DAV:"&gt; 
  &lt;D:ace&gt; 
    &lt;D:principal&gt; 
      &lt;D:href&gt;http://www.example.com/users/esedlar&lt;/D:href&gt; 
    &lt;/D:principal&gt; 
    &lt;D:grant&gt; 
      &lt;D:privilege&gt;&lt;D:read/&gt;&lt;/D:privilege&gt; 
      &lt;D:privilege&gt;&lt;D:write/&gt;&lt;/D:privilege&gt;  
    &lt;/D:grant&gt; 
  &lt;/D:ace&gt; 
  &lt;D:ace&gt; 
    &lt;D:principal&gt; 
      &lt;D:property&gt;&lt;D:owner/&gt;&lt;/D:property&gt;  
    &lt;/D:principal&gt; 
    &lt;D:grant&gt; 
      &lt;D:privilege&gt;&lt;D:read-acl/&gt;&lt;/D:privilege&gt; 
      &lt;D:privilege&gt;&lt;D:write-acl/&gt;&lt;/D:privilege&gt;  
    &lt;/D:grant&gt; 
  &lt;/D:ace&gt; 
  &lt;D:ace&gt; 
    &lt;D:principal&gt;&lt;D:all/&gt;&lt;/D:principal&gt; 
    &lt;D:grant&gt; 
      &lt;D:privilege&gt;&lt;D:read/&gt;&lt;/D:privilege&gt; 
    &lt;/D:grant&gt; 
  &lt;/D:ace&gt;
&lt;/D:acl&gt; 
</artwork></figure>

<figure><preamble>
&gt;&gt; Response &lt;&lt; 
</preamble><artwork type='message/http; msgtype="response"'>
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>

<figure><preamble>
&gt;&gt; Request &lt;&lt; 
</preamble><artwork type='message/http; msgtype="request"'>
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" ?&gt; 
&lt;D:acl xmlns:D="DAV:"&gt; 
  &lt;D:ace&gt; 
    &lt;D:principal&gt; 
      &lt;D:href&gt;http://www.example.com/users/esedlar&lt;/D:href&gt; 
    &lt;/D:principal&gt; 
    &lt;D:deny&gt;  
      &lt;D:privilege&gt;&lt;D:write/&gt;&lt;/D:privilege&gt;  
    &lt;/D:deny&gt; 
  &lt;/D:ace&gt; 
&lt;/D:acl&gt; 
</artwork></figure>

<figure><preamble>
&gt;&gt; Response &lt;&lt; 
</preamble><artwork type='message/http; msgtype="response"'>
HTTP/1.1 403 Forbidden 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?&gt; 
&lt;D:error xmlns:D="DAV:"&gt; 
  &lt;D:no-protected-ace-conflict/&gt; 
&lt;/D:error&gt; 
</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>

<figure><preamble>
&gt;&gt; Request &lt;&lt; 
</preamble><artwork type='message/http; msgtype="request"'>
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" ?&gt; 
&lt;D:acl xmlns:D="DAV:" xmlns:F="http://www.example.com/privs/"&gt; 
  &lt;D:ace&gt; 
    &lt;D:principal&gt; 
       &lt;D:href&gt;http://www.example.com/users/ejw&lt;/D:href&gt; 
    &lt;/D:principal&gt; 
    &lt;D:grant&gt;&lt;D:write/&gt;&lt;/D:grant&gt; 
  &lt;/D:ace&gt; 
&lt;/D:acl&gt; 
</artwork></figure>

<figure><preamble>
&gt;&gt; Response &lt;&lt; 
</preamble>
<artwork type='message/http; msgtype="response"'>
HTTP/1.1 403 Forbidden 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?&gt; 
&lt;D:error xmlns:D="DAV:"&gt; 
  &lt;D:no-inherited-ace-conflict/&gt; 
&lt;/D:error&gt; 
</artwork>


</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>

<figure><preamble>
&gt;&gt; Request &lt;&lt; 
</preamble><artwork type='message/http; msgtype="request"'>
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" ?&gt; 
&lt;D:acl xmlns:D="DAV:"&gt; 
  &lt;D:ace&gt; 
    &lt;D:principal&gt; 
      &lt;D:href&gt;http://www.example.com/users/friends&lt;/D:href&gt; 
    &lt;/D:principal&gt; 
    &lt;D:grant&gt;&lt;D:read/&gt;&lt;/D:grant&gt; 
    &lt;D:principal&gt; 
      &lt;D:href&gt;http://www.example.com/users/ygoland-so&lt;/D:href&gt; 
    &lt;/D:principal&gt; 
    &lt;D:deny&gt;&lt;D:read/&gt;&lt;/D:deny&gt; 
  &lt;/D:ace&gt; 
&lt;/D:acl&gt; 
</artwork></figure>

<figure><preamble>
&gt;&gt; Response &lt;&lt; 
</preamble><artwork type='message/http; msgtype="response"'>
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 <xref target="RFC3253" x:fmt="of" x:sec="3.6"/>) 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 
         <xref target="RFC3253" x:fmt="of" x:sec="3.8"/>). 
</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>
       <x:h>Marshalling</x:h>
  <list><t>
         The request body &MUST; be a DAV:acl-principal-prop-set XML element. 
<figure><artwork type="application/xml-dtd">
   &lt;!ELEMENT acl-principal-prop-set ANY&gt; 
   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" x:fmt="," x:sec="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 type="application/xml-dtd">
   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>
       <x:h>Postconditions:</x:h>
       <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>
&gt;&gt; Request &lt;&lt; 
</preamble><artwork type='message/http; msgtype="request"'>
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" ?&gt; 
&lt;D:acl-principal-prop-set xmlns:D="DAV:"&gt; 
  &lt;D:prop&gt; 
    &lt;D:displayname/&gt; 
  &lt;/D:prop&gt; 
&lt;/D:acl-principal-prop-set&gt; 
</artwork></figure>
<figure><preamble>
&gt;&gt; Response &lt;&lt; 
</preamble><artwork type='message/http; msgtype="response"'>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxxx 

&lt;?xml version="1.0" encoding="utf-8" ?&gt; 
&lt;D:multistatus xmlns:D="DAV:"&gt; 
  &lt;D:response&gt; 
    &lt;D:href&gt;http://www.example.com/people/gstein&lt;/D:href&gt; 
    &lt;D:propstat&gt; 
      &lt;D:prop&gt; 
        &lt;D:displayname&gt;Greg Stein&lt;/D:displayname&gt; 
      &lt;/D:prop&gt; 
      &lt;D:status&gt;HTTP/1.1 200 OK&lt;/D:status&gt; 
    &lt;/D:propstat&gt; 
  &lt;/D:response&gt; 
  &lt;D:response&gt; 
    &lt;D:href&gt;http://www.example.com/groups/authors&lt;/D:href&gt; 
    &lt;D:propstat&gt; 
      &lt;D:prop&gt; 
        &lt;D:displayname&gt;Site authors&lt;/D:displayname&gt; 
      &lt;/D:prop&gt; 
      &lt;D:status&gt;HTTP/1.1 200 OK&lt;/D:status&gt;  
    &lt;/D:propstat&gt; 
  &lt;/D:response&gt; 
&lt;/D:multistatus&gt; 
</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>
       <x:h>Marshalling:</x:h> 
  <list>
    <t>
         The request body &MUST; be a DAV:principal-match XML element. 
<figure><artwork type="application/xml-dtd">
   &lt;!ELEMENT principal-match ((principal-property | self), prop?)&gt; 
   &lt;!ELEMENT principal-property ANY&gt; 
   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&gt; 
   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" x:fmt="," x:sec="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 type="application/xml-dtd">
   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>

<figure><preamble>
&gt;&gt; Request &lt;&lt; 
</preamble><artwork type='message/http; msgtype="request"'>
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" ?&gt; 
&lt;D:principal-match xmlns:D="DAV:"&gt; 
  &lt;D:principal-property&gt; 
    &lt;D:owner/&gt; 
  &lt;/D:principal-property&gt; 
&lt;/D:principal-match&gt; 
</artwork></figure>

<figure><preamble>
&gt;&gt; Response &lt;&lt; 
</preamble><artwork type='message/http; msgtype="response"'>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxxx 

&lt;?xml version="1.0" encoding="utf-8" ?&gt; 
&lt;D:multistatus xmlns:D="DAV:"&gt; 
  &lt;D:response&gt; 
    &lt;D:href&gt;http://www.example.com/doc/foo.html&lt;/D:href&gt; 
    &lt;D:status&gt;HTTP/1.1 200 OK&lt;/D:status&gt; 
  &lt;/D:response&gt; 
  &lt;D:response&gt; 
    &lt;D:href&gt;http://www.example.com/doc/img/bar.gif&lt;/D:href&gt; 
    &lt;D:status&gt;HTTP/1.1 200 OK&lt;/D:status&gt; 
  &lt;/D:response&gt; 
&lt;/D:multistatus&gt; 
</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>

<t><list><t>
           <x:h>Implementation Note:</x:h> 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 
           "The Unicode Standard" <xref target="UNICODE4"/>, especially 
           Section 5.18, Subsection "Caseless 
           Matching", for guidance when implementing their case-insensitive
           matching algorithms. 
      </t>
      <t>
           <x:h>Implementation Note:</x:h> 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>
       <x:h>Marshalling:</x:h> 
  <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 type="application/xml-dtd">
   &lt;!ELEMENT principal-property-search 
    ((property-search+), prop?, apply-to-principal-collection-set?) &gt; 
</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:principal-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 type="application/xml-dtd">
   &lt;!ELEMENT property-search (prop, match) &gt; 
   prop: see RFC 2518, Section 12.11 

   &lt;!ELEMENT match #PCDATA &gt; 
</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" x:fmt="," x:sec="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 type="application/xml-dtd">
   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>
         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>
       <x:h>Preconditions:</x:h> 
  <list><t>
           None 
  </t></list>
</t>
<t>
       <x:h>Postconditions:</x:h> 
  <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 marshaling of DAV:displayname in this case is: 
</t>
<figure><artwork type="example">
&lt;D:displayname xmlns:D="DAV:"&gt;Julian Reschke&lt;/D:displayname&gt; 
</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/", marshaled as: 
</t>
<figure><artwork type="example">
&lt;W:aprop xmlns:W="http://www.example.com/props/"&gt; 
  {cdata 0}&lt;W:elem1&gt;{cdata 1}&lt;/W:elem1&gt; 
  &lt;W:elem2&gt;{cdata 2}&lt;/W:elem2&gt;{cdata 3} 
&lt;/W:aprop&gt; 
</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 type="example">
{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>
&gt;&gt; Request &lt;&lt; 
</preamble><artwork type='message/http; msgtype="request"'>
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" ?&gt; 
&lt;D:principal-property-search xmlns:D="DAV:"&gt; 
  &lt;D:property-search&gt; 
    &lt;D:prop&gt; 
      &lt;D:displayname/&gt; 
    &lt;/D:prop&gt; 
    &lt;D:match&gt;doE&lt;/D:match&gt; 
  &lt;/D:property-search&gt; 
  &lt;D:property-search&gt; 
    &lt;D:prop xmlns:B="http://www.example.com/ns/"&gt; 
      &lt;B:title/&gt; 
    &lt;/D:prop&gt; 
    &lt;D:match&gt;Sales&lt;/D:match&gt; 
  &lt;/D:property-search&gt; 
  &lt;D:prop xmlns:B="http://www.example.com/ns/"&gt; 
    &lt;D:displayname/&gt; 
    &lt;B:department/&gt; 
    &lt;B:phone/&gt; 
    &lt;B:office/&gt; 
    &lt;B:salary/&gt; 
  &lt;/D:prop&gt; 
&lt;/D:principal-property-search&gt; 
</artwork></figure>
<figure><preamble>
&gt;&gt; Response &lt;&lt; 
</preamble><artwork type='message/http; msgtype="response"'>
HTTP/1.1 207 Multi-Status 
Content-Type: text/xml; charset=utf-8 
Content-Length: xxxx 

&lt;?xml version="1.0" encoding="utf-8" ?&gt; 
&lt;D:multistatus xmlns:D="DAV:" xmlns:B="http://BigCorp.com/ns/"&gt; 
  &lt;D:response&gt; 
    &lt;D:href&gt;http://www.example.com/users/jdoe&lt;/D:href&gt; 
    &lt;D:propstat&gt; 
      &lt;D:prop&gt; 
        &lt;D:displayname&gt;John Doe&lt;/D:displayname&gt; 
        &lt;B:department&gt;Widget Sales&lt;/B:department&gt; 
        &lt;B:phone&gt;234-4567&lt;/B:phone&gt; 
        &lt;B:office&gt;209&lt;/B:office&gt; 
      &lt;/D:prop&gt; 
      &lt;D:status&gt;HTTP/1.1 200 OK&lt;/D:status&gt; 
    &lt;/D:propstat&gt; 
    &lt;D:propstat&gt; 
      &lt;D:prop&gt; 
        &lt;B:salary/&gt; 
      &lt;/D:prop&gt; 
      &lt;D:status&gt;HTTP/1.1 403 Forbidden&lt;/D:status&gt; 
    &lt;/D:propstat&gt; 
  &lt;/D:response&gt; 
  &lt;D:response&gt; 
    &lt;D:href&gt;http://www.example.com/users/zsmith&lt;/D:href&gt; 
    &lt;D:propstat&gt; 
      &lt;D:prop&gt; 
        &lt;D:displayname&gt;Zygdoebert Smith&lt;/D:displayname&gt; 
        &lt;B:department&gt;Gadget Sales&lt;/B:department&gt; 
        &lt;B:phone&gt;234-7654&lt;/B:phone&gt; 
        &lt;B:office&gt;114&lt;/B:office&gt; 
      &lt;/D:prop&gt; 
      &lt;D:status&gt;HTTP/1.1 200 OK&lt;/D:status&gt; 
    &lt;/D:propstat&gt; 
    &lt;D:propstat&gt; 
      &lt;D:prop&gt; 
        &lt;B:salary/&gt; 
      &lt;/D:prop&gt; 
      &lt;D:status&gt;HTTP/1.1 403 Forbidden&lt;/D:status&gt; 
    &lt;/D:propstat&gt; 
  &lt;/D:response&gt; 
&lt;/D:multistatus&gt; 
</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>
           <x:h>Implementation Note:</x:h> 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>
       <x:h>Marshalling:</x:h>
  <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" x:fmt="," x:sec="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 type="application/xml-dtd">
   &lt;!ELEMENT principal-search-property-set
    (principal-search-property*) &gt; 
</artwork></figure>
    </t>
    <t>
         Each DAV:principal-search-property XML element contains exactly 
         one searchable property, and a description of the property. 
<figure><artwork type="application/xml-dtd">
   &lt;!ELEMENT principal-search-property (prop, description) &gt; 
</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 type="application/xml-dtd">
   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 type="application/xml-dtd">
   &lt;!ELEMENT description #PCDATA &gt; 
</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>
&gt;&gt; Request &lt;&lt; 
</preamble><artwork type='message/http; msgtype="request"'>
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" ?&gt; 
&lt;D:principal-search-property-set xmlns:D="DAV:"/&gt; 
</artwork></figure>
<figure><preamble>
&gt;&gt; Response &lt;&lt; 
</preamble><artwork type='message/http; msgtype="response"'>
HTTP/1.1 200 OK 
Content-Type: text/xml; charset="utf-8" 
Content-Length: xxx 

&lt;?xml version="1.0" encoding="utf-8" ?&gt; 
&lt;D:principal-search-property-set xmlns:D="DAV:"&gt; 
  &lt;D:principal-search-property&gt; 
    &lt;D:prop&gt; 
      &lt;D:displayname/&gt; 
    &lt;/D:prop&gt; 
    &lt;D:description xml:lang="en"&gt;Full name&lt;/D:description&gt; 
  &lt;/D:principal-search-property&gt; 
  &lt;D:principal-search-property&gt; 
    &lt;D:prop xmlns:B="http://BigCorp.com/ns/"&gt; 
      &lt;B:title/&gt; 
    &lt;/D:prop&gt; 
    &lt;D:description xml:lang="en"&gt;Job title&lt;/D:description&gt; 
  &lt;/D:principal-search-property&gt; 
&lt;/D:principal-search-property-set&gt; 
</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 <xref target="RFC2518" x:fmt="of" x:sec="23.3.2"/>, 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">

<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 <xref target="RFC3629"/> 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-writable. 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, writable 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, 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/2004/REC-xml-20040204">
  <front>
    <title>Extensible Markup Language (XML) 1.0 (Third Edition)</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>
    <author initials="F." surname="Yergeau" fullname="Francois Yergeau">
      <organization/>
      <address>
        <email>francois@yergeau.com</email>
      </address>
    </author>
    <date day="4" month="February" year="2004"/>
  </front>
  <seriesInfo name="W3C" value="REC-xml-20040204"/>
</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/2004/REC-xml-infoset-20040204/">
  <front>
    <title>XML Information Set (Second Edition)</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="February" day="4" year="2004"/>
  </front>
  <seriesInfo name="W3C REC" value="REC-xml-infoset-20040204"/>
</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>

<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>

</references>

<references title="Informative References">
	
<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>

<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>

</references>

<section title="WebDAV XML Document Type Definition Addendum" anchor="webdav.xml.document.type.definition.addendum">

<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" x:fmt="," x:sec="23.1"/>. 
</t>
<figure><preamble>
&lt;!-- Privileges -- (<xref target="privileges"/>)&gt; 
</preamble><artwork type="application/xml-dtd">
&lt;!ELEMENT read EMPTY&gt; 
&lt;!ELEMENT write EMPTY&gt; 
&lt;!ELEMENT write-properties EMPTY&gt; 
&lt;!ELEMENT write-content EMPTY&gt; 
&lt;!ELEMENT unlock EMPTY&gt; 
&lt;!ELEMENT read-acl EMPTY&gt; 
&lt;!ELEMENT read-current-user-privilege-set EMPTY&gt; 
&lt;!ELEMENT write-acl EMPTY&gt; 
&lt;!ELEMENT bind EMPTY&gt; 
&lt;!ELEMENT unbind EMPTY&gt; 
&lt;!ELEMENT all EMPTY&gt; 
</artwork></figure>

<figure><preamble>
&lt;!-- Principal Properties (<xref target="principal.properties"/>) --&gt; 
</preamble><artwork type="application/xml-dtd">
&lt;!ELEMENT principal EMPTY&gt; 

&lt;!ELEMENT alternate-URI-set (href*)&gt; 
&lt;!ELEMENT principal-URL (href)&gt; 
&lt;!ELEMENT group-member-set (href*)&gt; 
&lt;!ELEMENT group-membership (href*)&gt; 
</artwork></figure>

<t>
&lt;!-- Access Control Properties (<xref target="access.control.properties"/>) --&gt; 
</t>

<figure><preamble>
&lt;!-- DAV:owner Property (<xref target="PROPERTY_owner"/>) --&gt; 
</preamble>
<artwork type="application/xml-dtd">
&lt;!ELEMENT owner (href?)&gt; 
</artwork>

</figure>


<figure><preamble>
&lt;!-- DAV:group Property (<xref target="PROPERTY_group"/>) --&gt; 
</preamble>
<artwork type="application/xml-dtd">
&lt;!ELEMENT group (href?)&gt; 
</artwork>
</figure>


<figure><preamble>
&lt;!-- DAV:supported-privilege-set Property (<xref target="PROPERTY_supported-privilege-set"/>) --&gt;  
</preamble><artwork type="application/xml-dtd">
&lt;!ELEMENT supported-privilege-set (supported-privilege*)&gt; 
&lt;!ELEMENT supported-privilege 
 (privilege, abstract?, description, supported-privilege*)&gt; 

&lt;!ELEMENT privilege ANY&gt; 
&lt;!ELEMENT abstract EMPTY&gt; 
&lt;!ELEMENT description #PCDATA&gt;  
</artwork></figure>

<figure><preamble>
&lt;!-- DAV:current-user-privilege-set Property (<xref target="PROPERTY_current-user-privilege-set"/>) --&gt; 
</preamble><artwork type="application/xml-dtd">
&lt;!ELEMENT current-user-privilege-set (privilege*)&gt; 
</artwork></figure>

<figure><preamble>
&lt;!-- DAV:acl Property (<xref target="PROPERTY_acl"/>) --&gt; 
</preamble><artwork type="application/xml-dtd">
&lt;!ELEMENT acl (ace)* &gt; 
&lt;!ELEMENT ace ((principal | invert), (grant|deny), protected?, 
 inherited?)&gt; 

&lt;!ELEMENT principal (href) 
 | all | authenticated | unauthenticated 
 | property | self)&gt; 

&lt;!ELEMENT all EMPTY&gt; 
&lt;!ELEMENT authenticated EMPTY&gt; 
&lt;!ELEMENT unauthenticated EMPTY&gt; 
&lt;!ELEMENT property ANY&gt; 
&lt;!ELEMENT self EMPTY&gt; 

&lt;!ELEMENT invert principal&gt; 

&lt;!ELEMENT grant (privilege+)&gt; 
&lt;!ELEMENT deny (privilege+)&gt; 
&lt;!ELEMENT privilege ANY&gt; 

&lt;!ELEMENT protected EMPTY&gt; 

&lt;!ELEMENT inherited (href)&gt; 
</artwork></figure>


<figure><preamble>
&lt;!-- DAV:acl-restrictions Property (<xref target="PROPERTY_acl-restrictions"/>) --&gt; 
</preamble><artwork type="application/xml-dtd">
&lt;!ELEMENT acl-restrictions (grant-only?, no-invert?,
 deny-before-grant?, required-principal?)&gt; 

&lt;!ELEMENT grant-only EMPTY&gt; 
&lt;!ELEMENT no-invert EMPTY&gt; 
&lt;!ELEMENT deny-before-grant EMPTY&gt; 

&lt;!ELEMENT required-principal 
 (all? | authenticated? | unauthenticated? | self? | href* 
 |property*)&gt; 
</artwork></figure>


<figure><preamble>
&lt;!-- DAV:inherited-acl-set Property (<xref target="PROPERTY_inherited-acl-set"/>) --&gt; 
</preamble><artwork type="application/xml-dtd">
&lt;!ELEMENT inherited-acl-set (href*)&gt; 
</artwork></figure>

<figure><preamble>
&lt;!-- DAV:principal-collection-set Property (<xref target="PROPERTY_principal-collection-set"/>) --&gt; 
</preamble><artwork type="application/xml-dtd">
&lt;!ELEMENT principal-collection-set (href*)&gt; 
</artwork></figure>


<figure><preamble>
&lt;!-- Access Control and Existing Methods (<xref target="access.control.and.existing.methods"/>) --&gt; 
</preamble><artwork type="application/xml-dtd">
&lt;!ELEMENT need-privileges (resource)* &gt;
&lt;!ELEMENT resource ( href, privilege )
</artwork></figure>


<figure><preamble>
&lt;!-- ACL method preconditions (<xref target="acl.preconditions"/>) --&gt; 
</preamble><artwork type="application/xml-dtd">
&lt;!ELEMENT no-ace-conflict EMPTY&gt; 
&lt;!ELEMENT no-protected-ace-conflict EMPTY&gt; 
&lt;!ELEMENT no-inherited-ace-conflict EMPTY&gt; 
&lt;!ELEMENT limited-number-of-aces EMPTY&gt; 
&lt;!ELEMENT grant-only EMPTY&gt; 
&lt;!ELEMENT no-invert EMPTY&gt; 
&lt;!ELEMENT deny-before-grant EMPTY&gt; 
&lt;!ELEMENT no-abstract EMPTY&gt; 
&lt;!ELEMENT not-supported-privilege EMPTY&gt; 
&lt;!ELEMENT missing-required-principal EMPTY&gt; 
&lt;!ELEMENT recognized-principal EMPTY&gt; 
&lt;!ELEMENT allowed-principal EMPTY&gt; 
</artwork></figure>

<figure><preamble>
&lt;!-- REPORTs (<xref target="access.control.reports"/>) --&gt; 
</preamble><artwork type="application/xml-dtd">
&lt;!ELEMENT acl-principal-prop-set ANY&gt; 
ANY value: a sequence of one or more elements, with at most one 
DAV:prop element. 

&lt;!ELEMENT principal-match ((principal-property | self), prop?)&gt; 
&lt;!ELEMENT principal-property ANY&gt; 
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&gt; 

&lt;!ELEMENT principal-property-search ((property-search+), prop?) &gt; 
&lt;!ELEMENT property-search (prop, match) &gt; 
&lt;!ELEMENT match #PCDATA &gt; 

&lt;!ELEMENT principal-search-property-set (
 principal-search-property*) &gt; 
&lt;!ELEMENT principal-search-property (prop, description) &gt; 
&lt;!ELEMENT description #PCDATA &gt; 
</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&gt;</xref></c>  
  <c>HEAD</c>               <c><xref target="PRIVILEGE_read" format="none">&lt;D:read&gt;</xref></c>  
  <c>OPTIONS</c>            <c><xref target="PRIVILEGE_read" format="none">&lt;D:read&gt;</xref></c>  
  <c>PUT (target exists)</c>     <c><xref target="PRIVILEGE_write-content" format="none">&lt;D:write-content&gt;</xref> on target resource</c> 
  <c>PUT (no target exists)</c>  <c><xref target="PRIVILEGE_bind" format="none">&lt;D:bind&gt;</xref> on parent collection of target</c> 
  <c>PROPPATCH</c>          <c><xref target="PRIVILEGE_write-properties" format="none">&lt;D:write-properties&gt;</xref></c>  
  <c>ACL</c>                <c><xref target="PRIVILEGE_write-acl" format="none">&lt;D:write-acl&gt;</xref></c>  
  <c>PROPFIND</c>           <c><xref target="PRIVILEGE_read" format="none">&lt;D:read&gt;</xref> (plus <xref target="PRIVILEGE_read-acl" format="none">&lt;D:read-acl&gt;</xref> and  
                        <xref target="PRIVILEGE_read-current-user-privilege-set" format="none">&lt;D:read-current-user-privilege-set&gt;</xref> as needed)</c>
  <c>COPY (target exists)</c>    <c><xref target="PRIVILEGE_read" format="none">&lt;D:read&gt;</xref>, <xref target="PRIVILEGE_write-content" format="none">&lt;D:write-content&gt;</xref> and <xref target="PRIVILEGE_write-properties" format="none">&lt;D:write-properties&gt;</xref> on target resource</c>  
  <c>COPY (no target exists)</c> <c><xref target="PRIVILEGE_read" format="none">&lt;D:read&gt;</xref>, <xref target="PRIVILEGE_bind" format="none">&lt;D:bind&gt;</xref> on target collection</c>  
  <c>MOVE (no target exists)</c> <c><xref target="PRIVILEGE_unbind" format="none">&lt;D:unbind&gt;</xref> on source collection and <xref target="PRIVILEGE_bind" format="none">&lt;D:bind&gt;</xref> 
    on target collection</c> 
  <c>MOVE (target exists)</c>    <c>As above, plus <xref target="PRIVILEGE_unbind" format="none">&lt;D:unbind&gt;</xref> on the target 
    collection</c> 
  <c>DELETE</c>             <c><xref target="PRIVILEGE_unbind" format="none">&lt;D:unbind&gt;</xref> on parent collection</c>  
  <c>LOCK (target exists)</c>    <c><xref target="PRIVILEGE_write-content" format="none">&lt;D:write-content&gt;</xref></c>  
  <c>LOCK (no target exists)</c> <c><xref target="PRIVILEGE_bind" format="none">&lt;D:bind&gt;</xref> on parent collection</c> 
  <c>MKCOL</c>              <c><xref target="PRIVILEGE_bind" format="none">&lt;D:bind&gt;</xref> on parent collection</c>  
  <c>UNLOCK</c>             <c><xref target="PRIVILEGE_unlock" format="none">&lt;D:unlock&gt;</xref></c>
  <c>CHECKOUT</c>           <c><xref target="PRIVILEGE_write-properties" format="none">&lt;D:write-properties&gt;</xref></c>  
  <c>CHECKIN</c>            <c><xref target="PRIVILEGE_write-properties" format="none">&lt;D:write-properties&gt;</xref></c>
  <c>REPORT</c>             <c><xref target="PRIVILEGE_read" format="none">&lt;D:read&gt;</xref> (on all referenced resources)</c>  
  <c>VERSION-CONTROL</c>    <c><xref target="PRIVILEGE_write-properties" format="none">&lt;D:write-properties&gt;</xref></c> 
  <c>MERGE</c>              <c><xref target="PRIVILEGE_write-content" format="none">&lt;D:write-content&gt;</xref></c>
  <c>MKWORKSPACE</c>        <c><xref target="PRIVILEGE_write-content" format="none">&lt;D:write-content&gt;</xref> on parent collection</c>
  <c>BASELINE-CONTROL</c>   <c><xref target="PRIVILEGE_write-properties" format="none">&lt;D:write-properties&gt;</xref> and <xref target="PRIVILEGE_write-content" format="none">&lt;D:write-content&gt;</xref></c>
  <c>MKACTIVITY</c>         <c><xref target="PRIVILEGE_write-content" format="none">&lt;D:write-content&gt;</xref> on parent collection</c>
</texttable>
</section>
</back>
</rfc>