<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.31 (Ruby 3.2.3) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-ietf-jmap-filenode-04" category="std" consensus="true" submissionType="IETF" updates="8620" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="JMAP FileNode">JMAP File Storage extension</title>

    <author initials="B." surname="Gondwana" fullname="Bron Gondwana">
      <organization>Fastmail</organization>
      <address>
        <email>brong@fastmailteam.com</email>
      </address>
    </author>

    <date year="2026" month="February" day="15"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 35?>

<t>The JMAP base protocol (RFC8620) provides the ability to upload and download
arbitrary binary data.  This binary data is called a "blob", and can be used
in all other JMAP extensions.</t>

<t>This extension adds a method to expose blobs as a filesystem along with the
types of metadata that are provided by other remote filesystem protocols.</t>



    </abstract>



  </front>

  <middle>


<?line 44?>

<section anchor="introduction"><name>Introduction</name>

<t>JMAP (<xref target="JMAP-CORE"/> — JSON Meta Application Protocol) is a generic
protocol for synchronizing data between a client and a server.
It is optimized for mobile and web environments, and aims to
provide a consistent interface to different data types.</t>

<t>In the same way that JMAP Calendars (<xref target="JMAP-CALENDARS"/>) replaces
CalDAV (<xref target="CALDAV"/>) and JMAP Contacts (<xref target="JMAP-CONTACTS"/>) replaces
CardDAV (<xref target="CARDDAV"/>), this document replaces the use of WebDAV (<xref target="WEBDAV"/>)
for remote filesystem access.</t>

</section>
<section anchor="addition-to-the-capabilities-object"><name>Addition to the Capabilities Object</name>

<t>The capabilities object is returned as part of the JMAP Session
object; see <xref target="JMAP-CORE"/>, Section 2.</t>

<t>This document defines an additional capability URI.</t>

<section anchor="urnietfparamsjmapfilenode"><name>urn:ietf:params:jmap:filenode</name>

<t>The capability <spanx style="verb">urn:ietf:params:jmap:filenode</spanx> being present in the
"accountCapabilities" property of an account represents support
for the FileNode datatype.  Servers that include the capability
in one or more "accountCapabilities" properties MUST also include
the property in the "capabilities" property.</t>

<t>The value of this property in the JMAP session "capabilities"
property MUST be an empty object.</t>

<t>The value of this property in an account's "accountCapabilities"
property is an object that MUST contain the following information
on server capabilities and permissions for that account:</t>

<t><list style="symbols">
  <t>maxFileNodeDepth: "UnsignedInt|null"  <vspace blankLines='1'/>
The maximum depth of the FileNode hierarchy (i.e., one more than
  the maximum number of ancestors a FileNode may have), or null for
  no limit.</t>
  <t>maxSizeFileNodeName: "UnsignedInt"  <vspace blankLines='1'/>
The maximum length, in (UTF-8) octets, allowed for the name of a
  FileNode.  This MUST be at least 100, although it is recommended
  servers allow more.</t>
  <t>fileNodeQuerySortOptions: "String[]"  <vspace blankLines='1'/>
A list of all the values the server supports for the "property"
  field of the Comparator object in an "FileNode/query" sort (see
  Section XXX).  This MAY include properties the client does not
  recognise (for example, custom properties specified in a vendor
  extension).  Clients MUST ignore any unknown properties in the
  list.</t>
  <t>mayCreateTopLevelFileNode: "Boolean"  <vspace blankLines='1'/>
If true, the user may create a FileNode (see Section XXX) in this
 account with a null parentId.  (Permission for creating a child of
 an existing FileNode is given by the "myRights" property on that
 FileNode.)</t>
</list></t>

<section anchor="capability-example"><name>Capability Example</name>

<t>TODO</t>

</section>
</section>
</section>
<section anchor="filenode-data-type"><name>FileNode Data Type</name>

<t>A FileNode is a set of metadata which behaves similar to an inode in
a filesystem.  In <xref target="WEBDAV"/> terminology a FileNode can refer to either
a collection or a resource.</t>

<t>The following JMAP Methods are selected by the
<spanx style="verb">urn:ietf:params:jmap:filenode</spanx> capability.</t>

<section anchor="filenode-objects"><name>FileNode objects</name>

<t>The filenode object has the following keys:</t>

<t><list style="symbols">
  <t>id: "Id" (immutable; server-set)  <vspace blankLines='1'/>
The Id of the FileNode.</t>
  <t>parentId: "Id|null"  <vspace blankLines='1'/>
The Id of the parent node, or null if this is the root node.</t>
  <t>blobId: "Id|null"  <vspace blankLines='1'/>
The blobId for the content of this node, or null if this node is a collection.  NOTE the
  zero byte file MUST have a non-null blobId.  The blobId is immutable after creation.</t>
  <t>size: "UnsignedInt|null" (server-set)  <vspace blankLines='1'/>
The size in bytes of the associated blob data.  This must be null if, and only if, the blobId is null.
  The size is immutable after creation.</t>
  <t>name: "String"  <vspace blankLines='1'/>
User-visible name for the FileNode.  This MUST be a
  Net-Unicode string <xref target="UNICODE"/> of at least 1 character in length,
  subject to the maximum size given in the capability object.  There
  MUST NOT be two sibling Mailboxes with both the same parent and
  the same name.  Servers MAY reject names that violate server
  policy (e.g., names containing control characters).  Further:  <list style="symbols">
      <t>The name MUST NOT be "." or ".."</t>
      <t>The name MUST NOT contain a "/"</t>
    </list>
A server MUST order creation and deletion operations within a single FileNode/set such that
  the sibling constraint is retained at the end of the transaction, but replacing an existing
  file can be done atomically.</t>
  <t>type: "String|null"  <vspace blankLines='1'/>
The media type of the FileNode. This MUST be <spanx style="verb">null</spanx> if, and only if, the node does not have a <spanx style="verb">blobId</spanx>.  <vspace blankLines='1'/>
Valid values are found in the IANA media-types registry.  <vspace blankLines='1'/>
Servers MUST NOT reject media types that are not recognised.  <vspace blankLines='1'/>
Servers MUST reject media types if the value does not conform to the ABNF of <xref target="MEDIATYPE"/> Section 4.2.  <vspace blankLines='1'/>
The type is immutable after creation.</t>
  <t>created: "UTCDate" (default: current server time)  <vspace blankLines='1'/>
The date the node was created.</t>
  <t>modified: "UTCDate" (default: current server time)  <vspace blankLines='1'/>
The date the node was last updated.
  NOTE: this is not updated by the server, clients must store a new value when making changes.</t>
  <t>accessed: "UTCDate" (default: current server time)  <vspace blankLines='1'/>
The date the node was last accessed.
  NOTE: this is not updated by the server, clients must store a new value.  See Implementation Considerations
  for comments on the use of this field.</t>
  <t>executable: "Boolean" (default: false)  <vspace blankLines='1'/>
If true, the node is should be treated as an executable by operating systems that support this flag.</t>
  <t>isSubscribed: "Boolean" (default: true)  <vspace blankLines='1'/>
This property is stored per user, and if true, the node should be displayed to the current user.
  Some servers may not allow this field to be changed for some or all nodes, e.g. only for directories,
  or only for nodes on which the shareWith ACL is actually set for this user, not nodes which
  inheret their ACL from a parent.</t>
  <t>myRights: "FilesRights" (server-set)  <vspace blankLines='1'/>
The set of rights (ACLs) the user has in relation to this folder. A <strong>FilesRights</strong> object has the following properties:  <list style="symbols">
      <t>mayRead: <spanx style="verb">Boolean</spanx> The user may read the contents of this node.</t>
      <t>mayWrite: <spanx style="verb">Boolean</spanx> The user may modify the properties of this node, including renaming or deleting children.</t>
      <t>mayShare: <spanx style="verb">Boolean</spanx> The user may change the sharing of this node (see <xref target="JMAP-SHARING"/>)</t>
    </list></t>
  <t>shareWith: "Id[FilesRights]|null"  <vspace blankLines='1'/>
A map of userId to rights for users this node is shared with. The owner of the node MUST NOT be in this set. This is <spanx style="verb">null</spanx> if the user requesting the object does not have <spanx style="verb">myRights.mayShare</spanx>, or if the node is not shared with anyone.</t>
</list></t>

</section>
<section anchor="filenode-methods"><name>FileNode Methods</name>

<section anchor="filenodeset"><name>FileNode/set</name>

<t>This is a standard Foo/set method, with the following differences:</t>

<t>Since parentId creates a tree structure, an attempt to move a node to a parent for which this node is also an ancestor is an error, and an <spanx style="verb">invalidProperties</spanx> error will be returned.</t>

<t>There are these additional top level arguments:</t>

<t><list style="symbols">
  <t>onDestroyRemoveChildren: "Boolean" (default: <spanx style="verb">false</spanx>)  <vspace blankLines='1'/>
If false, an attempt to destroy a FileNode which is the parentId of another FileNode will be rejected with a <spanx style="verb">nodeHasChildren</spanx> error.  NOTE: if all the child nodes are being destroyed in the same operation, then the server MUST NOT return this error.  Servers must either sort the destroys children before parents, or only check this constraint on the final state, remembering that JMAP <spanx style="verb">set</spanx> operations must be atomic.  <vspace blankLines='1'/>
If true, then all child nodes will also be destroyed when a node is destroyed.  When deleting child nodes, the server MUST include the ids of all deleted nodes in the method response.</t>
  <t>onDuplicate: "String|null" (default: null)  <vspace blankLines='1'/>
If null, an attempt to create or update a FileNode which would cause a name collision will be rejected by the server with a "alreadyExists" error.  <vspace blankLines='1'/>
If "replace", the existing item will destroyed.  In this case, the server MUST include the id of the replaced item in the destroyed response list.  NOTE: if the replaced item is a directory which contains folders, then the server MUST respond with a nodeHasChildren error to this action unless onDestroyRemoveChildren is true.  <vspace blankLines='1'/>
If "rename", the server will change the 'name' field to not clash, using an algorithm of its choice.  If the server changes the name, it MUST include the new 'name' value in the created or updated response field for this id.</t>
</list></t>

</section>
<section anchor="filenodeget"><name>FileNode/get</name>

<t>This is a standard Foo/get method.</t>

</section>
<section anchor="filenodechanges"><name>FileNode/changes</name>

<t>This is a standard Foo/changes method.</t>

</section>
<section anchor="filenodequery"><name>FileNode/query</name>

<t>This is a standard Foo/query method except for the following:</t>

<t>There's one more property to the query:</t>

<t><list style="symbols">
  <t>depth: "UnsignedInt|null"  <vspace blankLines='1'/>
The number of levels of subdiretories to recurse into.  If absent, null, or zero, do not recurse.</t>
</list></t>

<t>The following filter criteria are defined:</t>

<t><list style="symbols">
  <t>hasParentId: "Boolean"  <vspace blankLines='1'/>
If true, the node must have a non-null parentId (i.e. is not a root node).</t>
  <t>parentId: "Id"  <vspace blankLines='1'/>
A FileNode id. A node must have a parentId equal to this to match the condition.</t>
  <t>ancestorId: "Id"  <vspace blankLines='1'/>
A FileNode id. A node must have an ancestor (parent, parent of parent, etc.) with an id equal to this to to match the condition.</t>
  <t>hasType: "Boolean"  <vspace blankLines='1'/>
If <spanx style="verb">true</spanx>, the FileNode must be a file/resource, not a directory/collection.</t>
  <t>blobId: "Id"  <vspace blankLines='1'/>
A FileNode must have a blobId equal to this to match the condition.</t>
  <t>isExecutable: "Boolean"  <vspace blankLines='1'/>
If <spanx style="verb">true</spanx>, the FileNode must have a true executable value.</t>
  <t>createdBefore: "UTCDate"  <vspace blankLines='1'/>
The creation date of the node (as returned on the FileNode object) must be before this date to match the condition.</t>
  <t>createdAfter: "UTCDate"  <vspace blankLines='1'/>
The creation date of the node (as returned on the FileNode object) must be on or after this date to match the condition.</t>
  <t>modifiedBefore: "UTCDate"  <vspace blankLines='1'/>
The modified date of the node (as returned on the FileNode object) must be before this date to match the condition.</t>
  <t>modifiedAfter: "UTCDate"  <vspace blankLines='1'/>
The modified date of the node (as returned on the FileNode object) must be on or after this date to match the condition.</t>
  <t>accessedBefore: "UTCDate"  <vspace blankLines='1'/>
The accessed date of the node (as returned on the FileNode object) must be before this date to match the condition.</t>
  <t>accessedAfter: "UTCDate"  <vspace blankLines='1'/>
The accessed date of the node (as returned on the FileNode object) must be on or after this date to match the condition.</t>
  <t>minSize: "UnsignedInt"  <vspace blankLines='1'/>
The size of the node in bytes (as returned on the FileNode object) must be equal to or greater than this number to match the condition.</t>
  <t>maxSize: "UnsignedInt"  <vspace blankLines='1'/>
The size of the node in bytes (as returned on the FileNode object) must be less than this number to match the condition.</t>
  <t>name: "String"  <vspace blankLines='1'/>
A FileNode must have exactly the same octets in its name property to match the condition.</t>
  <t>nameMatch: "String"  <vspace blankLines='1'/>
Does a glob match of the specified name against the <em>name</em> property of the node.</t>
  <t>type: "String"  <vspace blankLines='1'/>
A FileNode must have exactly the same octets in its type property to match the condition</t>
  <t>typeMatch: "String"  <vspace blankLines='1'/>
Does a glob match of the specified type against the <em>type</em> property of the node.</t>
  <t>body: "String"  <vspace blankLines='1'/>
Match the content of the referenced blob, see the definition of <em>body</em> in section
  4.4.1 of <xref target="JMAP-MAIL"/>.  The server may use any technology to extract meaningful
  text from the blob for searching, or interpret the string in any way, to choose
  the nodes that it believes the user wants to see.</t>
  <t>text: "String"  <vspace blankLines='1'/>
Is equivalent to <em>body</em> OR <em>nameMatch</em> OR <em>typeMatch</em>.</t>
</list></t>

<t>It also supports the following additional sort properties:</t>

<t><list style="symbols">
  <t>tree:  <vspace blankLines='1'/>
Sort by tree; which means by name, but any directory/collection node is immediately followed by the recursive application of the same sort to its child nodes.  This is similar to the output of the <spanx style="verb">find</spanx> command on a filesystem with the depth parameter provided above.</t>
  <t>hasType:  <vspace blankLines='1'/>
Sort directories before files (false sorts before true)</t>
  <t>type:  <vspace blankLines='1'/>
Sorts directories first, and sorts by media type for files</t>
</list></t>

</section>
<section anchor="filenodequerychanges"><name>FileNode/queryChanges</name>

<t>This is a standard Foo/queryChanges method.</t>

</section>
</section>
</section>
<section anchor="access-control"><name>Access Control</name>

<t>Since nodes create a tree, ACLs created by shareWith automatically apply
to children as well, so if <spanx style="verb">mayRead</spanx> is set on a node, all its child nodes
are also readable.</t>

<t>If a server does not support changing access on non-directory nodes, it
can set <spanx style="verb">mayShare</spanx> to false on those nodes, even if the parent directory
has true.</t>

<t>Nodes which are not "discoverable" MUST return notFound errors if
fetched with FileNode/get and MUST NOT be returned in response to
FileNode/query.  Nodes are discoverable in one of two ways:</t>

<t><list style="numbers" type="1">
  <t>If the Node or an ancestor of the Node has mayRead true.</t>
  <t>If the Node is an ancestor of a Node which has mayRead true.</t>
</list></t>

<t>In the second case, the Node itself will have mayRead false, and appears
only to give the full path to the visible Nodes.  This means that
a query with that Node as the parent will only return those of its
children which are otherwise discoverable through the second
discoverability rule.</t>

<t>This leads to a sharee seeing the full path to anything that they have
access to, but nothing else.</t>

<t>E.g. in a unix homedirectory environment where user Alice had shared
the "forBob" folder, one might see, when logged in as Bob:</t>

<figure><sourcecode type="artwork"><![CDATA[
/home
  /alice
    /shared
      /forBob
        file1.jpg
        file2.txt
        ...
  /bob
    bobfile.txt
    ...
]]></sourcecode></figure>

<t>While Alice would see many more files and folders at the home directory level.</t>

<t>This does lead to potentially large changes in the visible Node set, so when
Alice first shared that directory, Bob would have been told of a large number of
"created" Nodes in response to a FileNode/changes query.</t>

</section>
<section anchor="security-considerations"><name>Security considerations</name>

<t>TODO: lots of "filesystems are risky" - I guess look at the referenced
RFCs and what they said.</t>

</section>
<section anchor="iana-considerations"><name>IANA considerations</name>

<section anchor="jmap-capability-registration-for-filenode"><name>JMAP Capability registration for "filenode"</name>

<t>IANA is requested to register the "filenode" JMAP Capability as follows:</t>

<t>Capability Name: urn:ietf:params:jmap:filenode</t>

<t>Specification document: this document</t>

<t>Intended use: common</t>

<t>Change Controller: IETF</t>

<t>Security and privacy considerations: this document, Section XXX</t>

</section>
<section anchor="jmap-error-codes-registration-for-nodehaschildren"><name>JMAP Error Codes registration for "nodeHasChildren"</name>

<t>IANA is requested to register the "nodeHasChildren" JMAP Error Code as follows:</t>

<t>JMAP Error Code: nodeHasChildren</t>

<t>Intended use: common</t>

<t>Change Controller: IETF</t>

<t>Description: The node being destroyed is still referenced by other nodes which have not been destroyed.</t>

<t>Reference: this document</t>

</section>
<section anchor="jmap-data-types-registration-for-filenode"><name>JMAP Data Types registration for "FileNode"</name>

<t>IANA is requested to register the "FileNode" JMAP Data Type as follows:</t>

<t>Type Name: FileNode</t>

<t>Can Reference Blobs: Yes</t>

<t>Can Use For State Change: Yes</t>

<t>Capability: urn:ietf:params:jmap:filenode</t>

<t>Reference: this document</t>

</section>
</section>
<section anchor="todo"><name>TODO</name>

<t><list style="symbols">
  <t>support SYMLINK types (RFC4437)</t>
  <t>design and document the capabilities object</t>
  <t>create real-world clients to test this</t>
  <t>security considerations</t>
  <t>a way to get or query all ancestor nodes</t>
  <t>QUESTION: should all the file-related fields be embedded in a sub-object?  There's lots of "must be NULL if and only-if this other field is also NULL" - we could enforce that more easily with a sub-object.</t>
  <t>We need to address how shareWith and myRights expiration are done; because both a potential <spanx style="verb">fullPath</spanx> and the real <spanx style="verb">myRights</spanx> depend on changes to parent nodes.</t>
</list></t>

</section>
<section anchor="changes"><name>Changes</name>

<t>EDITOR: please remove this section before publication.</t>

<t>The source of this document exists on github at: https://github.com/brong/draft-gondwana-jmap-filenode/</t>

<t><strong>draft-ietf-jmap-filenode-04</strong></t>

<t><list style="symbols">
  <t>Documented that blobId, size, and type are immutable after creation.</t>
  <t>Documented that creating a file and deleting the old copy of the file within a transaction is legal.</t>
  <t>Added onConflict top-level option for FileNode/set, giving both "rename" and "replace" options.</t>
  <t>Updated the definition of shareWith to say that the keys of the hash are Ids, not arbitrary strings</t>
</list></t>

<t><strong>draft-ietf-jmap-filenode-03</strong></t>

<t><list style="symbols">
  <t>Added 'text' and 'body' searches (added JMAP-MAIL reference as additional information for body search)</t>
  <t>Updated JMAP-CONTACTS and JMAP-SHARING references to published RFC numbers rather than draft names</t>
  <t>Noted that the server MUST included the nodeids of deleted child nodes.</t>
  <t>Added isSubscribed</t>
  <t>Renamed mayAdmin to mayShare to align with other specs</t>
  <t>Described the inheretence of ACLs</t>
</list></t>

<t><strong>draft-ietf-jmap-filenode-02</strong></t>

<t><list style="symbols">
  <t>Convert to Kramdown-RFC format (no intentional changes)</t>
</list></t>

<t><strong>draft-ietf-jmap-filenode-01</strong></t>

<t><list style="symbols">
  <t>Refreshing draft only</t>
</list></t>

<t><strong>draft-ietf-jmap-filenode-00</strong></t>

<t><list style="symbols">
  <t>upload as a working group document</t>
</list></t>

<t><strong>draft-gondwana-jmap-filenode-01</strong></t>

<t><list style="symbols">
  <t>require a blobId for the zero-byte file</t>
  <t>make size also null for collections</t>
  <t>add more to the TODO section</t>
  <t>bikeshed; FileNode</t>
  <t>correct UTCDate, UnsignedInt, and normalised UTF-8.</t>
  <t>add some fields to the capabilities object</t>
</list></t>

<t><strong>draft-gondwana-jmap-filenode-00</strong></t>

<t><list style="symbols">
  <t>initial proposal</t>
</list></t>

</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>Neil Jenkins and the JMAP working group at the IETF.</t>

<t>{backmatter}</t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="JMAP-CORE">
  <front>
    <title>The JSON Meta Application Protocol (JMAP)</title>
    <author fullname="N. Jenkins" initials="N." surname="Jenkins"/>
    <author fullname="C. Newman" initials="C." surname="Newman"/>
    <date month="July" year="2019"/>
    <abstract>
      <t>This document specifies a protocol for clients to efficiently query, fetch, and modify JSON-based data objects, with support for push notification of changes and fast resynchronisation and for out-of- band binary data upload/download.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8620"/>
  <seriesInfo name="DOI" value="10.17487/RFC8620"/>
</reference>

<reference anchor="JMAP-SHARING">
  <front>
    <title>JSON Meta Application Protocol (JMAP) Sharing</title>
    <author fullname="N. Jenkins" initials="N." role="editor" surname="Jenkins"/>
    <date month="November" year="2024"/>
    <abstract>
      <t>This document specifies a data model for sharing data between users using the JSON Meta Application Protocol (JMAP). Future documents can reference this document when defining data types to support a consistent model of sharing.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9670"/>
  <seriesInfo name="DOI" value="10.17487/RFC9670"/>
</reference>

<reference anchor="MEDIATYPE">
  <front>
    <title>Media Type Specifications and Registration Procedures</title>
    <author fullname="N. Freed" initials="N." surname="Freed"/>
    <author fullname="J. Klensin" initials="J." surname="Klensin"/>
    <author fullname="T. Hansen" initials="T." surname="Hansen"/>
    <date month="January" year="2013"/>
    <abstract>
      <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="13"/>
  <seriesInfo name="RFC" value="6838"/>
  <seriesInfo name="DOI" value="10.17487/RFC6838"/>
</reference>




    </references>

    <references title='Informative References' anchor="sec-informative-references">



<reference anchor="CALDAV">
  <front>
    <title>Internet Calendaring and Scheduling Core Object Specification (iCalendar)</title>
    <author fullname="B. Desruisseaux" initials="B." role="editor" surname="Desruisseaux"/>
    <date month="September" year="2009"/>
    <abstract>
      <t>This document defines the iCalendar data format for representing and exchanging calendaring and scheduling information such as events, to-dos, journal entries, and free/busy information, independent of any particular calendar service or protocol. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5545"/>
  <seriesInfo name="DOI" value="10.17487/RFC5545"/>
</reference>

<reference anchor="CARDDAV">
  <front>
    <title>CardDAV: vCard Extensions to Web Distributed Authoring and Versioning (WebDAV)</title>
    <author fullname="C. Daboo" initials="C." surname="Daboo"/>
    <date month="August" year="2011"/>
    <abstract>
      <t>This document defines extensions to the Web Distributed Authoring and Versioning (WebDAV) protocol to specify a standard way of accessing, managing, and sharing contact information based on the vCard format. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6352"/>
  <seriesInfo name="DOI" value="10.17487/RFC6352"/>
</reference>

<reference anchor="JMAP-MAIL">
  <front>
    <title>The JSON Meta Application Protocol (JMAP) for Mail</title>
    <author fullname="N. Jenkins" initials="N." surname="Jenkins"/>
    <author fullname="C. Newman" initials="C." surname="Newman"/>
    <date month="August" year="2019"/>
    <abstract>
      <t>This document specifies a data model for synchronising email data with a server using the JSON Meta Application Protocol (JMAP). Clients can use this to efficiently search, access, organise, and send messages, and to get push notifications for fast resynchronisation when new messages are delivered or a change is made in another client.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8621"/>
  <seriesInfo name="DOI" value="10.17487/RFC8621"/>
</reference>


<reference anchor="JMAP-CALENDARS">
   <front>
      <title>JSON Meta Application Protocol (JMAP) for Calendars</title>
      <author fullname="Neil Jenkins" initials="N." surname="Jenkins">
         <organization>Fastmail</organization>
      </author>
      <author fullname="Michael Douglass" initials="M." surname="Douglass">
         <organization>Spherical Cow Group</organization>
      </author>
      <date day="4" month="November" year="2025"/>
      <abstract>
	 <t>   This document specifies a data model for synchronizing calendar data
   with a server using JMAP.  Clients can use this to efficiently read,
   write, and share calendars and events, receive push notifications for
   changes or event reminders, and keep track of changes made by others
   in a multi-user environment.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-jmap-calendars-26"/>
   
</reference>

<reference anchor="JMAP-CONTACTS">
  <front>
    <title>JSON Meta Application Protocol (JMAP) for Contacts</title>
    <author fullname="N. Jenkins" initials="N." role="editor" surname="Jenkins"/>
    <date month="December" year="2024"/>
    <abstract>
      <t>This document specifies a data model for synchronising contact data with a server using the JSON Meta Application Protocol (JMAP).</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9610"/>
  <seriesInfo name="DOI" value="10.17487/RFC9610"/>
</reference>

<reference anchor="WEBDAV">
  <front>
    <title>HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)</title>
    <author fullname="L. Dusseault" initials="L." role="editor" surname="Dusseault"/>
    <date month="June" year="2007"/>
    <abstract>
      <t>Web Distributed Authoring and Versioning (WebDAV) consists of a set of methods, headers, and content-types ancillary to HTTP/1.1 for the management of resource properties, creation and management of resource collections, URL namespace manipulation, and resource locking (collision avoidance).</t>
      <t>RFC 2518 was published in February 1999, and this specification obsoletes RFC 2518 with minor revisions mostly due to interoperability experience. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4918"/>
  <seriesInfo name="DOI" value="10.17487/RFC4918"/>
</reference>

<reference anchor="UNICODE">
  <front>
    <title>Unicode Format for Network Interchange</title>
    <author fullname="J. Klensin" initials="J." surname="Klensin"/>
    <author fullname="M. Padlipsky" initials="M." surname="Padlipsky"/>
    <date month="March" year="2008"/>
    <abstract>
      <t>The Internet today is in need of a standardized form for the transmission of internationalized "text" information, paralleling the specifications for the use of ASCII that date from the early days of the ARPANET. This document specifies that format, using UTF-8 with normalization and specific line-ending sequences. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5198"/>
  <seriesInfo name="DOI" value="10.17487/RFC5198"/>
</reference>




    </references>

</references>



  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA71c63IbN5b+30+BYn5YUpGU7TiZhPmxK0vyjDK27NFlnFRm
atlkgyTiZoPTaEpmsk7tQ+wT7pPs+c4B0GhSku3dzKRSFbEbODg491tnMBhk
jWlKPVLfvzp6o16YUqvLxtb5XCv9vtGVM7bK8smk1jfJmnNb6Kyw0ypf0tai
zmfNwOhmNvh5ma8GM1pR0YrB42eZW0+WxgHK1WZFa89Or15k07zRc1tvRso1
RbZeFfTbjdQ3Xz99nNmJs6XG78ys6pFq6rVrnj5+/O3jp9k7vbm1dUFQqkbX
lW4GJzg6c01eFf+Rl7aiEzbaZSszUj81dtpXztZNrWeO/tos8cffsyxfNwtb
jzI1yBT9Yyo6+/lQ/dFWxW1e5fxQbva8tlX3ua3nI/Uid80yNyU/0fhrpCa0
dP7vM/+m0flyOLXLLKtsvcwbc6NHvBokHBy/vjgdqYsXx3zj+PjyT0cXZ+d/
5Dfffv0HefPq9OTs6OrHN7Lh62++/CbLTDXrQj0+enly9Fde8dVXz77yzy5O
wsOvv/zqaXvOq6Ozl+H4JwlWRy9Pz0+OLi6JvoOTYcvPaU78LPLapTc4vzo6
vrr0uD4RXN+ePg8nPvv2yTf87Pr87Pj1iWD/1ZNvCfvBYKDyiWvqfNpk2dVC
i1xNcqfVqrbENluqPU+dfTy6MYV2qqGV+cSUptmoxqr1qrR5oYjzqrC3FX5k
eT0xBLfeqImp8B+SrHyo1NXCuPSRop90q1LTftWblHbS6zOkaV6piVZrpwui
sqIlytK5taAYNcINgTgBiU9UXhSOgC01yVYB/PT7laUbATi9wDvohdu4Ri8V
ZHWubk2zwLWyhnTDKTvD9pwRbBZ5o/Jah+sXarLxqNR6aRudQgtUA1qg7tIU
Ramz7AsoSm2L9bSBGmd8ib1ff41C+OGD+p//+m/1/eXrc/WKjlZHq1VpSD1x
ozce6j6olau5rnRtpllkEckgKVU1XZDkm18M3Ycxn+jmVmsiiJqWRlcN0zVX
Ttc3uh5mZw3A2VVjluYXuhagLO0EhgcLb/VE6erGEMwlbXbCltwsif8288QA
bGKCocsTfANjMMunGlQvzGymazwWMoKwRJWzisXHkVar23wj5GVyHAfhbgkT
9ODDh30i9qok0C6jdSTbWCTKhpdATYDYqiFpTmB4/dgCURcRBisnve4TLkQQ
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
RAAA

-->

</rfc>

