<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version  (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-03" 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="2025" month="October" day="17"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


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


<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.</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.</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></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.</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: "String[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, except for some things:</t>

<t>An additional top level argument:</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 the other nodes are also been 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>
</list></t>

<t>Further, 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>

</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">
  <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-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='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'>



<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='8' month='October' 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-25'/>
   
</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>



  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA71b63IbN5b+30+BYn5YUpGU7TiZhPmxS0vyjDK27NFlnNRM
agmyQRJxs8FpNCUzWaf2IfYJ90n2fOcA6G7qYns3M6lUWewGDg7O/daDwSCr
bV2Ykfr+1fiNemELoy5qV+mFUeZ9bUpvXZnp6bQy1601Zy43We5mpV7R1rzS
83pgTT0f/LzS68GcVpS0YvD4y8xvpivrAeVyu6a1pyeXL7KZrs3CVduR8nWe
bdY5/fYj9c3XTx9nbupdYfA7s+tqpOpq4+unjx9/+/hp9s5sb1yVE5SyNlVp
6sExjs58rcv8P3ThSjpha3y2tiP1t9rN+sq7qq7M3NNf2xX++CnL9KZeumqU
qUGm6D9b0tnPh+qPrsxvdKn5odzseeXK7nNXLUbqhfb1StuCnxj8NVJTWrr4
93l4Uxu9Gs7cKstKV610ba/NiFeDhIOj1+cnI3X+4ohvnB5f/Gl8fnr2R37z
7dd/kDevTo5Px5c/vpENX3/z5TdZZst5F+rR+OXx+K+84quvnn0Vnp0fx4df
f/nV0+acV+PTl/H4Jy2sxi9Pzo7H5xdE38HxsOHnTBM/c1359g3OLsdHlxcB
1yeC69uT5/HEZ98++YafXZ2dHr0+Fuy/evItYT8YDJSe+rrSszrLLpdG5Gqq
vVHryhHbXKH2AnX28eja5sarmlbqqS1svVW1U5t14XSuiPMqdzclfmS6mlqC
W23V1Jb4hyRLD5W6XFrffqToJ92qMLRf9aaFm/b6DGmmSzU1auNNTlRWtEQ5
OrcSFJNG+CEQJyDpidJ57gnYypBs5cDPvF87uhGA0wu8g174ra/NSkFWF+rG
1ktcK6tJN7xyc2zXjGC91LXSlYnXz9V0G1CpzMrVpg0tUg1ogborm+eFybIv
oCiVyzezGmqc8SX2fv01CeGHD+p//uu/1fcXr8/UKzpajdfrwpJ64kZvAtR9
UEurhSlNZWdZYhHJIClVOVuS5NtfLN2HMZ+a+sYYIoiaFdaUNdNVK2+qa1MN
s9Ma4Ny6tiv7C10LUFZuCsODhTdmqkx5bQnmijZ7YYu2K+K/ywIxAJuYYOny
BN/CGMz1zIDquZ3PTYXHQkYQlqhyWrL4eNJqdaO3Ql4mx1EU7oYwUQ8+fNgn
Yq8LAu0zWkeyjUWibHgJ1ASIK2uS5haMoB87IKo8wWDlpNd9woUIQsZ0gwun
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

-->

</rfc>

