draft-ietf-webdav-bind-00.txt | draft-ietf-webdav-bind-01.txt | |||
---|---|---|---|---|
INTERNET-DRAFT G. Clemm | INTERNET-DRAFT G. Clemm | |||
draft-ietf-webdav-bind-00 Rational Software | draft-ietf-webdav-bind-01 Rational Software | |||
J. Crawford | J. Crawford | |||
IBM Research | IBM Research | |||
J. Reschke | J. Reschke | |||
Greenbytes | Greenbytes | |||
J. Slein | J. Slein | |||
Xerox | Xerox | |||
E.J. Whitehead | E.J. Whitehead | |||
U.C. Santa Cruz | U.C. Santa Cruz | |||
Expires April 2, 2002 October 2, 2001 | Expires August 7, 2003 February 7, 2003 | |||
Binding Extensions to WebDAV | Binding Extensions to WebDAV | |||
Status of this Memo | Status of this Memo | |||
This document is an Internet-Draft and is in full conformance with all | This document is an Internet-Draft and is in full conformance with all | |||
provisions of RFC 2026, Section 10. | provisions of RFC 2026, Section 10. | |||
Internet-Drafts are working documents of the Internet Engineering Task | Internet-Drafts are working documents of the Internet Engineering Task | |||
Force (IETF), its areas, and its working groups. Note that other groups | Force (IETF), its areas, and its working groups. Note that other groups | |||
may also distribute working documents as Internet-Drafts. | may also distribute working documents as Internet-Drafts. | |||
skipping to change at line 46 | skipping to change at line 46 | |||
Abstract | Abstract | |||
This specification defines bindings, and the BIND method for creating | This specification defines bindings, and the BIND method for creating | |||
multiple bindings to the same resource. Creating a new binding to a | multiple bindings to the same resource. Creating a new binding to a | |||
resource causes at least one new URI to be mapped to that resource. | resource causes at least one new URI to be mapped to that resource. | |||
Servers are required to insure the integrity of any bindings that they | Servers are required to insure the integrity of any bindings that they | |||
allow to be created. | allow to be created. | |||
Clemm, et al. [Page 1] | Clemm, et al. [Page 1] | |||
Table of Contents | Table of Contents | |||
1 INTRODUCTION...........................................3 | 1 INTRODUCTION............................................3 | |||
1.1 Terminology...........................................4 | 1.1 Terminology...........................................4 | |||
1.2 Rationale for Distinguishing Bindings from URI Mappings6 | 1.2 Rationale for Distinguishing Bindings from URI Mappings | |||
......................................................6 | ||||
2 OVERVIEW OF BINDINGS...................................6 | 2 OVERVIEW OF BINDINGS....................................6 | |||
2.1 Bindings to Collections...............................7 | 2.1 Bindings to Collections...............................7 | |||
2.2 URI Mappings Created by a new Binding.................7 | 2.2 URI Mappings Created by a new Binding.................7 | |||
2.3 DELETE and Bindings...................................8 | 2.3 DELETE and Bindings...................................8 | |||
2.4 COPY and Bindings.....................................9 | 2.4 COPY and Bindings.....................................9 | |||
2.5 MOVE and Bindings....................................10 | 2.5 MOVE and Bindings.....................................9 | |||
2.6 Determining Whether Two Bindings Are to the Same Resource..........10 | 2.6 Determining Whether Two Bindings Are to the Same Resource | |||
.....................................................10 | ||||
2.7 Discovering the Bindings to a Resource...............11 | 2.7 Discovering the Bindings to a Resource...............11 | |||
3 PROPERTIES............................................11 | 3 PROPERTIES.............................................11 | |||
3.1 DAV:resource-id Property.............................11 | 3.1 DAV:resource-id Property.............................12 | |||
3.2 DAV:parent-set Property..............................12 | 3.2 DAV:parent-set Property..............................12 | |||
4 BIND METHOD...........................................12 | 4 BIND METHOD............................................12 | |||
4.1 Example: BIND........................................13 | 4.1 Example: BIND........................................14 | |||
5 ADDITIONAL STATUS CODES...............................14 | 5 ADDITIONAL STATUS CODES................................14 | |||
5.1 506 Loop Detected....................................14 | 5.1 506 Loop Detected....................................14 | |||
6 SECURITY CONSIDERATIONS...............................15 | 6 SECURITY CONSIDERATIONS................................16 | |||
6.1 Privacy Concerns.....................................15 | 6.1 Privacy Concerns.....................................16 | |||
6.2 Redirect Loops.......................................15 | 6.2 Redirect Loops.......................................16 | |||
6.3 Bindings, and Denial of Service......................16 | 6.3 Bindings, and Denial of Service......................16 | |||
6.4 Private Locations May Be Revealed....................16 | 6.4 Private Locations May Be Revealed....................16 | |||
6.5 DAV:parent-set and Denial of Service.................16 | 6.5 DAV:parent-set and Denial of Service.................17 | |||
7 INTERNATIONALIZATION CONSIDERATIONS...................16 | 7 INTERNATIONALIZATION CONSIDERATIONS....................17 | |||
8 IANA CONSIDERATIONS...................................16 | 8 IANA CONSIDERATIONS....................................17 | |||
9 INTELLECTUAL PROPERTY.................................16 | 9 INTELLECTUAL PROPERTY..................................17 | |||
10 ACKNOWLEDGEMENTS.....................................17 | 10 ACKNOWLEDGEMENTS.....................................17 | |||
11 REFERENCES...........................................17 | 11 REFERENCES...........................................18 | |||
12 AUTHORS' ADDRESSES...................................18 | 12 AUTHORS' ADDRESSES...................................18 | |||
Clemm, et al. [Page 2] | Clemm, et al. [Page 2] | |||
1 INTRODUCTION | 1 INTRODUCTION | |||
This specification extends the WebDAV Distributed Authoring | This specification extends the WebDAV Distributed Authoring | |||
Protocol to enable clients to create new access paths to existing | Protocol to enable clients to create new access paths to existing | |||
resources. This capability is useful for several reasons: | resources. This capability is useful for several reasons: | |||
skipping to change at line 189 | skipping to change at line 191 | |||
Binding | Binding | |||
A relation between a single path segment (in a collection) and a | A relation between a single path segment (in a collection) and a | |||
resource. A binding is part of the state of a collection. If two | resource. A binding is part of the state of a collection. If two | |||
different collections contain a binding between the same path | different collections contain a binding between the same path | |||
segment and the same resource, these are two distinct bindings. So | segment and the same resource, these are two distinct bindings. So | |||
for a collection C, a path segment S, and a resource R, the binding | for a collection C, a path segment S, and a resource R, the binding | |||
can be thought of as C:(S -> R). Bindings create URI mappings, and | can be thought of as C:(S -> R). Bindings create URI mappings, and | |||
hence allow requests to be sent to a single resource from multiple | hence allow requests to be sent to a single resource from multiple | |||
locations in a URI namespace. For example, given a collection C | locations in a URI namespace. For example, given a collection C | |||
(accessible through the URI http://www.srv.com/coll/), a path | (accessible through the URI http://www.example.com/coll/), a path | |||
segment S (equal to "foo.html"), and a resource R, then creating | segment S (equal to "foo.html"), and a resource R, then creating | |||
the binding C: (S -> R) makes it possible to use the URI | the binding C: (S -> R) makes it possible to use the URI | |||
http://www.srv.com/coll/foo.html to access R. | http://www.example.com/coll/foo.html to access R. | |||
Clemm, et al. [Page 4] | Clemm, et al. [Page 4] | |||
Collection | Collection | |||
A resource that contains, as part of its state, a set of bindings | A resource that contains, as part of its state, a set of bindings | |||
that identify internal member resources. | that identify internal member resources. | |||
Clemm, et al. [Page 5] | Clemm, et al. [Page 5] | |||
Internal Member URI | Internal Member URI | |||
skipping to change at line 218 | skipping to change at line 220 | |||
1.2 Rationale for Distinguishing Bindings from URI Mappings | 1.2 Rationale for Distinguishing Bindings from URI Mappings | |||
In [RFC2518], the state of a collection is defined as containing a | In [RFC2518], the state of a collection is defined as containing a | |||
list of internal member URIs. If there are multiple mappings to a | list of internal member URIs. If there are multiple mappings to a | |||
collection, then the state of the collection is different when you | collection, then the state of the collection is different when you | |||
refer to it via a different URI. This is undesirable, since ideally | refer to it via a different URI. This is undesirable, since ideally | |||
a collection's membership should remain the same, independent of | a collection's membership should remain the same, independent of | |||
which URI was used to reference it. | which URI was used to reference it. | |||
The notion of binding is introduced to separate the final segment | The notion of binding is introduced to separate the final segment | |||
of a URI from its parent collection’s contribution. This done, a | of a URI from its parent collection's contribution. This done, a | |||
collection can be defined as containing a set of bindings, thus | collection can be defined as containing a set of bindings, thus | |||
permitting new mappings to a collection without modifying its | permitting new mappings to a collection without modifying its | |||
membership. The authors of this specification anticipate and | membership. The authors of this specification anticipate and | |||
recommend that future revisions of [RFC2518] will update the | recommend that future revisions of [RFC2518] will update the | |||
definition of the state of a collection to correspond to the | definition of the state of a collection to correspond to the | |||
definition in this document. | definition in this document. | |||
2 OVERVIEW OF BINDINGS | 2 OVERVIEW OF BINDINGS | |||
Bindings are part of the state of a collection. They define the | Bindings are part of the state of a collection. They define the | |||
skipping to change at line 261 | skipping to change at line 263 | |||
binding. | binding. | |||
Clemm, et al. [Page 6] | Clemm, et al. [Page 6] | |||
2.1 Bindings to Collections | 2.1 Bindings to Collections | |||
Bindings to collections can result in loops, which servers MUST | Bindings to collections can result in loops, which servers MUST | |||
detect when processing "Depth: infinity" requests. It is sometimes | detect when processing "Depth: infinity" requests. It is sometimes | |||
possible to complete an operation in spite of the presence of a | possible to complete an operation in spite of the presence of a | |||
loop. However, the 506 (Loop Detected) status code is defined in | loop. However, the 506 (Loop Detected) status code is defined in | |||
Section 5 for use in contexts where an operation is terminated | Section 5 for use in contexts where an operation is terminated | |||
because a loop was encountered. Servers MUST allow loops to be | because a loop was encountered. | |||
created. | ||||
Creating a new binding to a collection makes each resource | Creating a new binding to a collection makes each resource | |||
associated with a binding in that collection accessible via a new | associated with a binding in that collection accessible via a new | |||
URI, and thus creates new URI mappings to those resources but no | URI, and thus creates new URI mappings to those resources but no | |||
new bindings. | new bindings. | |||
For example, suppose a new binding CollY is created for collection | For example, suppose a new binding CollY is created for collection | |||
C1 in the figure below. It immediately becomes possible to access | C1 in the figure below. It immediately becomes possible to access | |||
resource R1 using the URI /CollY/x.gif and to access resource R2 | resource R1 using the URI /CollY/x.gif and to access resource R2 | |||
using the URI /CollY/y.jpg, but no new bindings for these child | using the URI /CollY/y.jpg, but no new bindings for these child | |||
skipping to change at line 306 | skipping to change at line 307 | |||
| \ | | \ | |||
+-------------+ +-------------+ | +-------------+ +-------------+ | |||
| Resource R1 | | Resource R2 | | | Resource R1 | | Resource R2 | | |||
+-------------+ +-------------+ | +-------------+ +-------------+ | |||
2.2 URI Mappings Created by a new Binding | 2.2 URI Mappings Created by a new Binding | |||
Suppose a binding from "Binding-Name" to resource R to be added to | Suppose a binding from "Binding-Name" to resource R to be added to | |||
a collection, C. Then if C-MAP is the set of URI's that were | a collection, C. Then if C-MAP is the set of URI's that were | |||
mapped to C before the BIND request, then for each URI "C-URI" in | mapped to C before the BIND request, then for each URI "C-URI" in | |||
Clemm, et al. [Page 7] | ||||
C-MAP, the URI "C-URI/Binding-Name" is mapped to resource R | C-MAP, the URI "C-URI/Binding-Name" is mapped to resource R | |||
following the BIND request. | following the BIND request. | |||
Clemm, et al. [Page 7] | ||||
For example, if a binding from "foo.html" to R is added to a | For example, if a binding from "foo.html" to R is added to a | |||
collection C, and if the following URI's are mapped to C: | collection C, and if the following URI's are mapped to C: | |||
http://www.fuzz.com/A/1/ | http://www.example.com/A/1/ | |||
http://fuzz.com/A/one/ | http://example.com/A/one/ | |||
then the following new mappings to R are introduced: | then the following new mappings to R are introduced: | |||
http://www.fuzz.com/A/1/foo.html | http://www.example.com/A/1/foo.html | |||
http://fuzz.com/A/one/foo.html | http://example.com/A/one/foo.html | |||
Note that if R is a collection, additional URI mappings are created | Note that if R is a collection, additional URI mappings are created | |||
to the descendents of R. Also, note that if a binding is made in | to the descendents of R. Also, note that if a binding is made in | |||
collection C to C itself (or to a parent of C), an infinite number | collection C to C itself (or to a parent of C), an infinite number | |||
of mappings are introduced. | of mappings are introduced. | |||
For example, if a binding from "myself" to C is then added to C, | For example, if a binding from "myself" to C is then added to C, | |||
the following infinite number of additional mappings to C are | the following infinite number of additional mappings to C are | |||
introduced: | introduced: | |||
http://www.fuzz.com/A/1/myself | http://www.example.com/A/1/myself | |||
http://www.fuzz.com/A/1/myself/myself | http://www.example.com/A/1/myself/myself | |||
... | ... | |||
and the following infinite number of additional mappings to R are | and the following infinite number of additional mappings to R are | |||
introduced: | introduced: | |||
http://www.fuzz.com/A/1/myself/foo.html | http://www.example.com/A/1/myself/foo.html | |||
http://www.fuzz.com/A/1/myself/myself/foo.html | http://www.example.com/A/1/myself/myself/foo.html | |||
... | ... | |||
2.3 DELETE and Bindings | 2.3 DELETE and Bindings | |||
The DELETE method was originally defined in [RFC2616]. This section | The DELETE method was originally defined in [RFC2616]. This section | |||
redefines the behavior of DELETE in terms of bindings, an | redefines the behavior of DELETE in terms of bindings, an | |||
abstraction not available when writing [RFC2616]. [RFC2616] states | abstraction not available when writing [RFC2616]. [RFC2616] states | |||
that "the DELETE method requests that the origin server delete the | that "the DELETE method requests that the origin server delete the | |||
resource identified by the Request-URI." Because [RFC2616] did not | resource identified by the Request-URI." Because [RFC2616] did not | |||
distinguish between bindings and resources, the intent of its | distinguish between bindings and resources, the intent of its | |||
skipping to change at line 362 | skipping to change at line 362 | |||
The DELETE method requests that the server remove the binding | The DELETE method requests that the server remove the binding | |||
between the resource identified by the Request-URI and the binding | between the resource identified by the Request-URI and the binding | |||
name, the last path segment of the Request-URI. The binding MUST be | name, the last path segment of the Request-URI. The binding MUST be | |||
removed from its parent collection, identified by the Request-URI | removed from its parent collection, identified by the Request-URI | |||
minus its trailing slash (if present) and final segment. | minus its trailing slash (if present) and final segment. | |||
Once a resource is unreachable by any URI mapping, the server MAY | Once a resource is unreachable by any URI mapping, the server MAY | |||
reclaim system resources associated with that resource. If DELETE | reclaim system resources associated with that resource. If DELETE | |||
removes a binding to a resource, but there remain URI mappings to | removes a binding to a resource, but there remain URI mappings to | |||
Clemm, et al. [Page 8] | ||||
that resource, the server MUST NOT reclaim system resources | that resource, the server MUST NOT reclaim system resources | |||
associated with the resource. | associated with the resource. | |||
Clemm, et al. [Page 8] | ||||
Although [RFC2518] allows a DELETE to be a non-atomic operation, | Although [RFC2518] allows a DELETE to be a non-atomic operation, | |||
the DELETE operation defined here is atomic. In particular, a | the DELETE operation defined here is atomic. In particular, a | |||
DELETE on a hierarchy of resources is simply the removal of a | DELETE on a hierarchy of resources is simply the removal of a | |||
binding to the collection identified by the Request-URI, and so is | binding to the collection identified by the Request-URI, and so is | |||
a single (and therefore atomic) operation. | a single (and therefore atomic) operation. | |||
Section 8.6.1 of [RFC2518] states that during DELETE processing, a | Section 8.6.1 of [RFC2518] states that during DELETE processing, a | |||
server "MUST remove any URI for the resource identified by the | server "MUST remove any URI for the resource identified by the | |||
Request-URI from collections which contain it as a member." | Request-URI from collections which contain it as a member." | |||
Servers that support bindings MUST NOT follow this requirement. | Servers that support bindings MUST NOT follow this requirement. | |||
skipping to change at line 413 | skipping to change at line 412 | |||
+---------------------+ +------------------------+ | +---------------------+ +------------------------+ | |||
It might be thought that a COPY request with "Depth: 0" on a | It might be thought that a COPY request with "Depth: 0" on a | |||
collection would duplicate its bindings, since bindings are part of | collection would duplicate its bindings, since bindings are part of | |||
the collection's state. This is not the case, however. The | the collection's state. This is not the case, however. The | |||
definition of Depth in [RFC2518] makes it clear that a "Depth: 0" | definition of Depth in [RFC2518] makes it clear that a "Depth: 0" | |||
request does not apply to a collection's members. Consequently, a | request does not apply to a collection's members. Consequently, a | |||
COPY with "Depth: 0" does not duplicate the bindings contained by | COPY with "Depth: 0" does not duplicate the bindings contained by | |||
the collection. | the collection. | |||
Clemm, et al. [Page 9] | ||||
2.5 MOVE and Bindings | 2.5 MOVE and Bindings | |||
The MOVE method has the effect of creating a new binding to a | The MOVE method has the effect of creating a new binding to a | |||
resource (at the Destination), and removing an existing binding (at | resource (at the Destination), and removing an existing binding (at | |||
the Request-URI). The name of the new binding is the last path | the Request-URI). The name of the new binding is the last path | |||
segment of the Destination header, and the new binding is added to | segment of the Destination header, and the new binding is added to | |||
Clemm, et al. [Page 9] | ||||
its parent collection, identified by the Destination header minus | its parent collection, identified by the Destination header minus | |||
its trailing slash (if present) and final segment. | its trailing slash (if present) and final segment. | |||
As an example, suppose that a MOVE is issued to URI 3 for resource | As an example, suppose that a MOVE is issued to URI 3 for resource | |||
R below (which is also mapped to URI 1 and URI 2), with the | R below (which is also mapped to URI 1 and URI 2), with the | |||
Destination header set to URIX. After successful completion of the | Destination header set to URIX. After successful completion of the | |||
MOVE operation, a new binding has been created which creates at | MOVE operation, a new binding has been created which creates at | |||
least the URI mapping between URIX and resource R (although other | least the URI mapping between URIX and resource R (although other | |||
URI mappings may also have been created). The binding | URI mappings may also have been created). The binding | |||
corresponding to the final segment of URI 3 has been removed, which | corresponding to the final segment of URI 3 has been removed, which | |||
skipping to change at line 460 | skipping to change at line 460 | |||
+---------------------+ | +---------------------+ | |||
Although [RFC2518] allows a MOVE on a collection to be a non-atomic | Although [RFC2518] allows a MOVE on a collection to be a non-atomic | |||
operation, the MOVE operation defined here MUST be atomic. Even | operation, the MOVE operation defined here MUST be atomic. Even | |||
when the Request-URI identifies a collection, the MOVE operation | when the Request-URI identifies a collection, the MOVE operation | |||
involves only removing one binding to that collection and adding | involves only removing one binding to that collection and adding | |||
another. There are no operations on bindings to any of its | another. There are no operations on bindings to any of its | |||
children, so the case of MOVE on a collection is the same as the | children, so the case of MOVE on a collection is the same as the | |||
case of MOVE on a non-collection resource. Both are atomic. | case of MOVE on a non-collection resource. Both are atomic. | |||
2.5.1Additional MOVE Semantics | ||||
Additional Preconditions: | ||||
(DAV:cycle-allowed): If the request-URL identifies a collection, | ||||
and the parent of the Destination is that collection or is a member | ||||
of that collection, the server MUST support cycles in the URL | ||||
namespace. | ||||
Clemm, et al. [Page 10] | ||||
2.6 Determining Whether Two Bindings Are to the Same Resource | 2.6 Determining Whether Two Bindings Are to the Same Resource | |||
It is useful to have some way of determining whether two bindings | It is useful to have some way of determining whether two bindings | |||
are to the same resource. Two resources might have identical | are to the same resource. Two resources might have identical | |||
contents and properties, but not be the same resource (e.g. an | contents and properties, but not be the same resource (e.g. an | |||
update to one resource does not affect the other resource). | update to one resource does not affect the other resource). | |||
Clemm, et al. [Page 10] | ||||
The REQUIRED DAV:resource-id property defined in Section 3.1 is a | The REQUIRED DAV:resource-id property defined in Section 3.1 is a | |||
resource identifier, which MUST be unique across all resources for | resource identifier, which MUST be unique across all resources for | |||
all time. If the values of DAV:resource-id returned by PROPFIND | all time. If the values of DAV:resource-id returned by PROPFIND | |||
requests through two bindings are identical, the client can be | requests through two bindings are identical, the client can be | |||
assured that the two bindings are to the same resource. | assured that the two bindings are to the same resource. | |||
The DAV:resource-id property is created, and its value assigned, | The DAV:resource-id property is created, and its value assigned, | |||
when the resource is created. The value of DAV:resource-id MUST | when the resource is created. The value of DAV:resource-id MUST | |||
NOT be changed. Even after the resource is no longer accessible | NOT be changed. Even after the resource is no longer accessible | |||
through any URI, that value MUST NOT be reassigned to another | through any URI, that value MUST NOT be reassigned to another | |||
skipping to change at line 512 | skipping to change at line 521 | |||
whether to support the DAV:parent-set property, server implementers | whether to support the DAV:parent-set property, server implementers | |||
/ administrators should balance the benefits it provides against | / administrators should balance the benefits it provides against | |||
the cost of maintaining the property and the security risks | the cost of maintaining the property and the security risks | |||
enumerated in Sections 6.4 and 6.5. | enumerated in Sections 6.4 and 6.5. | |||
3 PROPERTIES | 3 PROPERTIES | |||
The bind feature introduces the following properties for a | The bind feature introduces the following properties for a | |||
resource. | resource. | |||
Clemm, et al. [Page 11] | ||||
3.1 DAV:resource-id Property | 3.1 DAV:resource-id Property | |||
The DAV:resource-id property is a REQUIRED property that enables | The DAV:resource-id property is a REQUIRED property that enables | |||
clients to determine whether two bindings are to the same resource. | clients to determine whether two bindings are to the same resource. | |||
The value of DAV:resource-id is a URI, and may use any registered | The value of DAV:resource-id is a URI, and may use any registered | |||
URI scheme that guarantees the uniqueness of the value across all | URI scheme that guarantees the uniqueness of the value across all | |||
Clemm, et al. [Page 11] | ||||
resources for all time (e.g. the opaquelocktoken: scheme defined in | resources for all time (e.g. the opaquelocktoken: scheme defined in | |||
[RFC2518]). | [RFC2518]). | |||
<!ELEMENT resource-id (href)> | <!ELEMENT resource-id (href)> | |||
3.2 DAV:parent-set Property | 3.2 DAV:parent-set Property | |||
The DAV:parent-set property is an OPTIONAL property that enables | The DAV:parent-set property is an OPTIONAL property that enables | |||
clients to discover what collections contain a binding to this | clients to discover what collections contain a binding to this | |||
resource (i.e. what collections have that resource as an internal | resource (i.e. what collections have that resource as an internal | |||
skipping to change at line 568 | skipping to change at line 576 | |||
request MUST fail. Note that it is especially difficult to | request MUST fail. Note that it is especially difficult to | |||
maintain the integrity of cross-server bindings. Unless the server | maintain the integrity of cross-server bindings. Unless the server | |||
where the resource resides knows about all bindings on all servers | where the resource resides knows about all bindings on all servers | |||
to that resource, it may unwittingly destroy the resource or make | to that resource, it may unwittingly destroy the resource or make | |||
it inaccessible without notifying another server that manages a | it inaccessible without notifying another server that manages a | |||
binding to the resource. For example, if server A permits creation | binding to the resource. For example, if server A permits creation | |||
of a binding to a resource on server B, server A must notify server | of a binding to a resource on server B, server A must notify server | |||
B about its binding and must have an agreement with B that B will | B about its binding and must have an agreement with B that B will | |||
not destroy the resource while A's binding exists. Otherwise | not destroy the resource while A's binding exists. Otherwise | |||
server B may receive a DELETE request that it thinks removes the | server B may receive a DELETE request that it thinks removes the | |||
Clemm, et al. [Page 12] | ||||
last binding to the resource and destroy the resource while A's | last binding to the resource and destroy the resource while A's | |||
binding still exists. Status code 507 (Cross-server Binding | binding still exists. Status code 507 (Cross-server Binding | |||
Forbidden) is defined in Section 5.1 for cases where servers fail | Forbidden) is defined in Section 5.1 for cases where servers fail | |||
cross-server BIND requests because they cannot guarantee the | cross-server BIND requests because they cannot guarantee the | |||
integrity of cross-server bindings. | integrity of cross-server bindings. | |||
Clemm, et al. [Page 12] | ||||
By default, if there already is a binding for the specified segment | By default, if there already is a binding for the specified segment | |||
in the collection, the new binding replaces the existing binding. | in the collection, the new binding replaces the existing binding. | |||
This default binding replacement behavior can be overridden using | This default binding replacement behavior can be overridden using | |||
the Overwrite header defined in Section 9.6 of [RFC2518]. | the Overwrite header defined in Section 9.6 of [RFC2518]. | |||
Marshalling: | Marshalling: | |||
The request MAY include an Overwrite header. | The request MAY include an Overwrite header. | |||
The request body MUST be a DAV:bind XML element. | The request body MUST be a DAV:bind XML element. | |||
<!ELEMENT bind ANY> | <!ELEMENT bind ANY> | |||
<!ELEMENT bind (segment, href)> | <!ELEMENT bind (segment, href)> | |||
If the request succeeds, the server MUST return 201 (Created) when | ||||
a new binding was created and 204 (No Content) when an existing | ||||
binding was replaced. | ||||
If a response body for a successful request is included, it MUST be | If a response body for a successful request is included, it MUST be | |||
a DAV:bind-response XML element. Note that this document does not | a DAV:bind-response XML element. Note that this document does not | |||
define any elements for the BIND response body, but the DAV:bind- | define any elements for the BIND response body, but the DAV:bind- | |||
response element is defined to ensure interoperability between | response element is defined to ensure interoperability between | |||
future extensions that do define elements for the BIND response | future extensions that do define elements for the BIND response | |||
body. | body. | |||
<!ELEMENT bind-response ANY> | <!ELEMENT bind-response ANY> | |||
Preconditions: | Preconditions: | |||
(DAV:bind-into-collection): The Request-URL MUST identify a | (DAV:bind-into-collection): The Request-URL MUST identify a | |||
collection. | collection. | |||
(DAV:bind-source-exists): The DAV:href element MUST identify a | ||||
resource. | ||||
(DAV:binding-allowed): The resource identified by the DAV:href | ||||
supports multiple bindings to it. | ||||
(DAV:cross-server-binding): If the resource identified by the | (DAV:cross-server-binding): If the resource identified by the | |||
DAV:href element in the request body is on another server from the | DAV:href element in the request body is on another server from the | |||
collection identified by the request-URL, the server MUST support | collection identified by the request-URL, the server MUST support | |||
cross-server bindings. | cross-server bindings. | |||
(DAV:name-allowed): The name specified by the DAV:segment is | ||||
available for use as a new binding name. | ||||
(DAV:can-overwrite): If the collection already contains a binding | (DAV:can-overwrite): If the collection already contains a binding | |||
with the specified path segment, and if an Overwrite header is | with the specified path segment, and if an Overwrite header is | |||
included, the value of the Overwrite header MUST be "T". | included, the value of the Overwrite header MUST be "T". | |||
Clemm, et al. [Page 13] | ||||
(DAV:cycle-allowed): If the DAV:href element identifies a | ||||
collection, and if the request-URL identifies a collection that is | ||||
a member of that collection, the server MUST support cycles in the | ||||
URL namespace. | ||||
Postconditions: | Postconditions: | |||
(DAV:new-binding): The collection MUST have a binding that maps the | (DAV:new-binding): The collection MUST have a binding that maps the | |||
segment specified in the DAV:segment element in the request body, | segment specified in the DAV:segment element in the request body, | |||
to the resource identified by the DAV:href element in the request | to the resource identified by the DAV:href element in the request | |||
body. | body. | |||
4.1 Example: BIND | 4.1 Example: BIND | |||
>> Request: | >> Request: | |||
BIND /coll HTTP/1.1 | BIND /coll HTTP/1.1 | |||
Host: www.somehost.com | Host: www.example.com | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Content-Length: xxx | Content-Length: xxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
Clemm, et al. [Page 13] | ||||
<D:bind xmlns:D="DAV:"> | <D:bind xmlns:D="DAV:"> | |||
<D:segment>bar.html</D:segment> | <D:segment>bar.html</D:segment> | |||
<D:href>http://www.somehost.com/coll</D:href> | <D:href>http://www.example.com/coll/foo.html</D:href> | |||
</D:bind> | </D:bind> | |||
>> Response: | >> Response: | |||
HTTP/1.1 201 Created | HTTP/1.1 200 OK | |||
The server added a new binding to the collection, | The server added a new binding to the collection, | |||
"http://www.somehost.com/coll", associating "bar.html" with the | "http://www.example.com/coll", associating "bar.html" with the | |||
resource identified by the URL | resource identified by the URL | |||
"http://www.somehost.com/coll/foo.html". Clients can now use the | "http://www.example.com/coll/foo.html". Clients can now use the | |||
URL "http://www.somehost.com/coll/bar.html", to submit requests to | URL "http://www.example.com/coll/bar.html", to submit requests to | |||
that resource. | that resource. | |||
5 ADDITIONAL STATUS CODES | 5 ADDITIONAL STATUS CODES | |||
5.1 506 Loop Detected | 5.1 506 Loop Detected | |||
The 506 (Loop Detected) status code indicates that the server | The 506 (Loop Detected) status code indicates that the server | |||
terminated an operation because it encountered an infinite loop | terminated an operation because it encountered an infinite loop | |||
while processing a request with "Depth: infinity". | while processing a request with "Depth: infinity". | |||
When this status code is the top-level status code for the | When this status code is the top-level status code for the | |||
operation, it indicates that the entire operation failed. | operation, it indicates that the entire operation failed. | |||
Clemm, et al. [Page 14] | ||||
When this status code occurs inside a multi-status response, it | When this status code occurs inside a multi-status response, it | |||
indicates only that a loop is being terminated, but does not | indicates only that a loop is being terminated, but does not | |||
indicate failure of the operation as a whole. | indicate failure of the operation as a whole. | |||
For example, consider a PROPFIND request on /Coll (bound to | For example, consider a PROPFIND request on /Coll (bound to | |||
collection C), where the members of /Coll are /Coll/Foo (bound to | collection C), where the members of /Coll are /Coll/Foo (bound to | |||
resource R) and /Coll/Bar (bound to collection C). | resource R) and /Coll/Bar (bound to collection C). | |||
>> Request: | >> Request: | |||
PROPFIND /Coll/ HTTP/1.1 | PROPFIND /Coll/ HTTP/1.1 | |||
Host: www.somehost.com | Host: www.example.com | |||
Depth: infinity | Depth: infinity | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Content-Length: xxx | Content-Length: xxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:propfind xmlns:D="DAV:"> | <D:propfind xmlns:D="DAV:"> | |||
<D:prop> <D:displayname/> </D:prop> | <D:prop> <D:displayname/> </D:prop> | |||
</D:propfind> | </D:propfind> | |||
>> Response: | >> Response: | |||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: text/xml; charset="utf-8" | |||
Clemm, et al. [Page 14] | ||||
Content-Length: xxx | Content-Length: xxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:multistatus xmlns:D="DAV:"> | <D:multistatus xmlns:D="DAV:"> | |||
<D:response> | <D:response> | |||
<D:href>http://www.somehost.com/Coll/</D:href> | <D:href>http://www.example.com/Coll/</D:href> | |||
<D:propstat> | <D:propstat> | |||
<D:prop> | <D:prop> | |||
<D:displayname>Loop Demo</D:displayname> | <D:displayname>Loop Demo</D:displayname> | |||
</D:prop> | </D:prop> | |||
<D:status>HTTP/1.1 200 OK</D:status> | <D:status>HTTP/1.1 200 OK</D:status> | |||
</D:propstat> | </D:propstat> | |||
</D:response> | </D:response> | |||
<D:response> | <D:response> | |||
<D:href>http://www.somehost.com/Coll/Foo</D:href> | <D:href>http://www.example.com/Coll/Foo</D:href> | |||
<D:propstat> | <D:propstat> | |||
<D:prop> | <D:prop> | |||
<D:displayname>Bird Inventory</D:displayname> | <D:displayname>Bird Inventory</D:displayname> | |||
</D:prop> | </D:prop> | |||
<D:status>HTTP/1.1 200 OK</D:status> | <D:status>HTTP/1.1 200 OK</D:status> | |||
</D:propstat> | </D:propstat> | |||
</D:response> | </D:response> | |||
<D:response> | <D:response> | |||
<D:href>http://www.somehost.com/Coll/Bar</D:href> | <D:href>http://www.example.com/Coll/Bar</D:href> | |||
<D:status>HTTP/1.1 506 Loop Detected</D:status> | <D:status>HTTP/1.1 506 Loop Detected</D:status> | |||
</D:response> | </D:response> | |||
</D:multistatus> | </D:multistatus> | |||
Clemm, et al. [Page 15] | ||||
6 SECURITY CONSIDERATIONS | 6 SECURITY CONSIDERATIONS | |||
This section is provided to make WebDAV applications aware of the | This section is provided to make WebDAV applications aware of the | |||
security implications of this protocol. | security implications of this protocol. | |||
All of the security considerations of HTTP/1.1 and the WebDAV | All of the security considerations of HTTP/1.1 and the WebDAV | |||
Distributed Authoring Protocol specification also apply to this | Distributed Authoring Protocol specification also apply to this | |||
protocol specification. In addition, bindings introduce several | protocol specification. In addition, bindings introduce several | |||
new security concerns and increase the risk of some existing | new security concerns and increase the risk of some existing | |||
threats. These issues are detailed below. | threats. These issues are detailed below. | |||
skipping to change at line 736 | skipping to change at line 762 | |||
bindings on a trusted server may make it possible for a hostile | bindings on a trusted server may make it possible for a hostile | |||
agent to induce users to send private information to a target on a | agent to induce users to send private information to a target on a | |||
different server. | different server. | |||
6.2 Redirect Loops | 6.2 Redirect Loops | |||
Although redirect loops were already possible in HTTP 1.1, the | Although redirect loops were already possible in HTTP 1.1, the | |||
introduction of the BIND method creates a new avenue for clients to | introduction of the BIND method creates a new avenue for clients to | |||
create loops accidentally or maliciously. If the binding and its | create loops accidentally or maliciously. If the binding and its | |||
target are on the same server, the server may be able to detect | target are on the same server, the server may be able to detect | |||
Clemm, et al. [Page 15] | ||||
BIND requests that would create loops. Servers are required to | BIND requests that would create loops. Servers are required to | |||
detect loops that are caused by bindings to collections during the | detect loops that are caused by bindings to collections during the | |||
processing of any requests with "Depth: infinity". | processing of any requests with "Depth: infinity". | |||
6.3 Bindings, and Denial of Service | 6.3 Bindings, and Denial of Service | |||
Denial of service attacks were already possible by posting URLs | Denial of service attacks were already possible by posting URLs | |||
that were intended for limited use at heavily used Web sites. The | that were intended for limited use at heavily used Web sites. The | |||
introduction of BIND creates a new avenue for similar denial of | introduction of BIND creates a new avenue for similar denial of | |||
service attacks. If cross-server bindings are supported, clients | service attacks. If cross-server bindings are supported, clients | |||
skipping to change at line 760 | skipping to change at line 784 | |||
6.4 Private Locations May Be Revealed | 6.4 Private Locations May Be Revealed | |||
If the DAV:parent-set property is maintained on a resource, the | If the DAV:parent-set property is maintained on a resource, the | |||
owners of the bindings risk revealing private locations. The | owners of the bindings risk revealing private locations. The | |||
directory structures where bindings are located are available to | directory structures where bindings are located are available to | |||
anyone who has access to the DAV:parent-set property on the | anyone who has access to the DAV:parent-set property on the | |||
resource. Moving a binding may reveal its new location to anyone | resource. Moving a binding may reveal its new location to anyone | |||
with access to DAV:parent-set on its resource. | with access to DAV:parent-set on its resource. | |||
Clemm, et al. [Page 16] | ||||
6.5 DAV:parent-set and Denial of Service | 6.5 DAV:parent-set and Denial of Service | |||
If the server maintains the DAV:parent-set property in response to | If the server maintains the DAV:parent-set property in response to | |||
bindings created in other administrative domains, it is exposed to | bindings created in other administrative domains, it is exposed to | |||
hostile attempts to make it devote resources to adding bindings to | hostile attempts to make it devote resources to adding bindings to | |||
the list. | the list. | |||
7 INTERNATIONALIZATION CONSIDERATIONS | 7 INTERNATIONALIZATION CONSIDERATIONS | |||
All internationalization considerations mentioned in [RFC2518] also | All internationalization considerations mentioned in [RFC2518] also | |||
skipping to change at line 786 | skipping to change at line 811 | |||
9 INTELLECTUAL PROPERTY | 9 INTELLECTUAL PROPERTY | |||
The following notice is copied from RFC 2026, Section 10.4, and | The following notice is copied from RFC 2026, Section 10.4, and | |||
describes the position of the IETF concerning intellectual property | describes the position of the IETF concerning intellectual property | |||
claims made against this document. | claims made against this document. | |||
The IETF takes no position regarding the validity or scope of any | The IETF takes no position regarding the validity or scope of any | |||
intellectual property or other rights that might be claimed to | intellectual property or other rights that might be claimed to | |||
pertain to the implementation or use other technology described in | pertain to the implementation or use other technology described in | |||
Clemm, et al. [Page 16] | ||||
this document or the extent to which any license under such rights | this document or the extent to which any license under such rights | |||
might or might not be available; neither does it represent that it | might or might not be available; neither does it represent that it | |||
has made any effort to identify any such rights. Information on | has made any effort to identify any such rights. Information on | |||
the procedures of the IETF with respect to rights in standards- | the procedures of the IETF with respect to rights in standards- | |||
track and standards-related documentation can be found in BCP-11. | track and standards-related documentation can be found in BCP-11. | |||
Copies of claims of rights made available for publication and any | Copies of claims of rights made available for publication and any | |||
assurances of licenses to be made available, or the result of an | assurances of licenses to be made available, or the result of an | |||
attempt made to obtain a general license or permission for the use | attempt made to obtain a general license or permission for the use | |||
of such proprietary rights by implementers or users of this | of such proprietary rights by implementers or users of this | |||
specification can be obtained from the IETF Secretariat. | specification can be obtained from the IETF Secretariat. | |||
skipping to change at line 812 | skipping to change at line 835 | |||
this standard. Please address the information to the IETF | this standard. Please address the information to the IETF | |||
Executive Director. | Executive Director. | |||
10 ACKNOWLEDGEMENTS | 10 ACKNOWLEDGEMENTS | |||
This draft is the collaborative product of the authors and Tyson | This draft is the collaborative product of the authors and Tyson | |||
Chihaya, Jim Davis, and Chuck Fay. This draft has benefited from | Chihaya, Jim Davis, and Chuck Fay. This draft has benefited from | |||
thoughtful discussion by Jim Amsden, Peter Carlson, Steve Carter, | thoughtful discussion by Jim Amsden, Peter Carlson, Steve Carter, | |||
Ken Coar, Ellis Cohen, Dan Connolly, Bruce Cragun, Spencer Dawkins, | Ken Coar, Ellis Cohen, Dan Connolly, Bruce Cragun, Spencer Dawkins, | |||
Mark Day, Rajiv Dulepet, David Durand, Roy Fielding, Yaron Goland, | Mark Day, Rajiv Dulepet, David Durand, Roy Fielding, Yaron Goland, | |||
Clemm, et al. [Page 17] | ||||
Fred Hitt, Alex Hopmann, James Hunt, Marcus Jager, Chris Kaler, | Fred Hitt, Alex Hopmann, James Hunt, Marcus Jager, Chris Kaler, | |||
Manoj Kasichainula, Rohit Khare, Daniel LaLiberte, Steve Martin, | Manoj Kasichainula, Rohit Khare, Daniel LaLiberte, Steve Martin, | |||
Larry Masinter, Jeff McAffer, Surendra Koduru Reddy, Max Rible, Sam | Larry Masinter, Jeff McAffer, Surendra Koduru Reddy, Max Rible, Sam | |||
Ruby, Bradley Sergeant, Nick Shelness, John Stracke, John Tigue, | Ruby, Bradley Sergeant, Nick Shelness, John Stracke, John Tigue, | |||
John Turner, Kevin Wiggen, and other members of the WebDAV working | John Turner, Kevin Wiggen, and other members of the WebDAV working | |||
group. | group. | |||
11 REFERENCES | 11 REFERENCES | |||
[RFC2026] S.Bradner, "The Internet Standards Process", RFC 2026, | [RFC2026] S.Bradner, "The Internet Standards Process", RFC 2026, | |||
skipping to change at line 841 | skipping to change at line 866 | |||
Resource Identifiers (URI): Generic Syntax." RFC 2396, August 1998. | Resource Identifiers (URI): Generic Syntax." RFC 2396, August 1998. | |||
[RFC2518] Y.Goland, E.Whitehead, A.Faizi, S.R.Carter, D.Jensen, | [RFC2518] Y.Goland, E.Whitehead, A.Faizi, S.R.Carter, D.Jensen, | |||
"HTTP Extensions for Distributed Authoring - WEBDAV", RFC 2518, | "HTTP Extensions for Distributed Authoring - WEBDAV", RFC 2518, | |||
February 1999. | February 1999. | |||
[RFC2616] R.Fielding, J.Gettys, J.C.Mogul, H.Frystyk, L.Masinter, | [RFC2616] R.Fielding, J.Gettys, J.C.Mogul, H.Frystyk, L.Masinter, | |||
P.Leach, and T.Berners-Lee, "Hypertext Transfer Protocol -- | P.Leach, and T.Berners-Lee, "Hypertext Transfer Protocol -- | |||
HTTP/1.1", RFC 2616, June 1999. | HTTP/1.1", RFC 2616, June 1999. | |||
Clemm, et al. [Page 17] | ||||
[XML] T. Bray, J. Paoli, C.M. Sperberg-McQueen, "Extensible Markup | [XML] T. Bray, J. Paoli, C.M. Sperberg-McQueen, "Extensible Markup | |||
Language (XML)." World Wide Web Consortium Recommendation REC-xml- | Language (XML) 1.0 (Second Edition)" W3C Recommendation 6 October | |||
19980210. http://www.w3.org/TR/1998/REC-xml-19980210. | 2000. http://www.w3.org/TR/2000/REC-xml-20001006. | |||
12 AUTHORS' ADDRESSES | 12 AUTHORS' ADDRESSES | |||
Geoffrey Clemm | Geoffrey Clemm | |||
Rational Software Corporation | Rational Software Corporation | |||
20 Maguire Road | 20 Maguire Road | |||
Lexington, MA 02173-3104 | Lexington, MA 02173-3104 | |||
Email: geoffrey.clemm@rational.com | Email: geoffrey.clemm@rational.com | |||
Jason Crawford | Jason Crawford | |||
skipping to change at line 866 | skipping to change at line 890 | |||
P.O. Box 704 | P.O. Box 704 | |||
Yorktown Heights, NY 10598 | Yorktown Heights, NY 10598 | |||
Email: ccjason@us.ibm.com | Email: ccjason@us.ibm.com | |||
Julian F. Reschke | Julian F. Reschke | |||
greenbytes GmbH | greenbytes GmbH | |||
Salzmannstrasse 152 | Salzmannstrasse 152 | |||
Muenster, NW 48159, Germany | Muenster, NW 48159, Germany | |||
Email: julian.reschke@greenbytes.de | Email: julian.reschke@greenbytes.de | |||
Clemm, et al. [Page 18] | ||||
Judy Slein | Judy Slein | |||
Xerox Corporation | Xerox Corporation | |||
800 Phillips Road, 105-50C | 800 Phillips Road, 105-50C | |||
Webster, NY 14580 | Webster, NY 14580 | |||
Email: jslein@crt.xerox.com | Email: jslein@crt.xerox.com | |||
Jim Whitehead | Jim Whitehead | |||
UC Santa Cruz, Dept. of Computer Science | UC Santa Cruz, Dept. of Computer Science | |||
1156 High Street, Santa Cruz, CA 95064 | 1156 High Street, Santa Cruz, CA 95064 | |||
Email: ejw@cse.ucsc.edu | Email: ejw@cse.ucsc.edu | |||
Clemm, et al. [Page 18] | Clemm, et al. [Page 19] | |||
End of changes. | ||||
This html diff was produced by rfcdiff 1.23, available from http://www.levkowetz.com/ietf/tools/rfcdiff/ |