<?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.32 (Ruby 3.3.0) -->


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

]>


<rfc ipr="trust200902" docName="draft-ietf-jmap-filenode-09" 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="March" day="27"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 39?>

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

<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 anchor="conventions-used-in-this-document"><name>Conventions Used in This Document</name>

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

<?line -18?>

</section>
</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 <bcp14>MUST</bcp14> also include
the property in the "capabilities" property.</t>

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

<t>The value of this property in an account's "accountCapabilities"
property is an object that <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14> 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 a "FileNode/query" sort (see
  "FileNode/query" below).  This <bcp14>MAY</bcp14> include properties the client does not
  recognise (for example, custom properties specified in a vendor
  extension).  Clients <bcp14>MUST</bcp14> ignore any unknown properties in the
  list.</t>
  <t>mayCreateTopLevelFileNode: "Boolean"  <vspace blankLines='1'/>
If true, the user may create a FileNode (see "FileNode/set" below) 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>
  <t>webTrashUrl: "String|null"  <vspace blankLines='1'/>
The URL at which the folder with the "trash" role can be viewed
  on the web.  If null, there is no web URL available.</t>
  <t>webUrlTemplate: "String|null"  <vspace blankLines='1'/>
A template by which any node can be viewed on the web, in URI
  Template (level 1) format <xref target="URI-TEMPLATE"/>.  The available
  variable is <spanx style="verb">{id}</spanx>, which is the FileNode id.  If null, there
  is no web URL available.</t>
  <t>webWriteUrlTemplate: "String|null"  <vspace blankLines='1'/>
A URI Template (level 1) <xref target="URI-TEMPLATE"/> for writing content
  to a file node.  The available variable is <spanx style="verb">{id}</spanx>, which is
  the FileNode id.  If null, direct HTTP writes are not
  supported and clients must use FileNode/set to update content.
  See "Direct HTTP Write" below for the HTTP semantics.</t>
</list></t>

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

<figure><sourcecode type="json"><![CDATA[
{
  "urn:ietf:params:jmap:filenode": {
    "maxFileNodeDepth": 50,
    "maxSizeFileNodeName": 255,
    "fileNodeQuerySortOptions": [
      "name", "type", "size", "created", "modified",
      "isDirectory", "tree"
    ],
    "mayCreateTopLevelFileNode": false,
    "webTrashUrl": "https://files.example.com/trash",
    "webUrlTemplate": "https://files.example.com/view/{id}",
    "webWriteUrlTemplate": "https://files.example.com/write/{id}"
  }
}
]]></sourcecode></figure>

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

<t>A FileNode is a set of metadata which behaves similarly 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 a top level 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.  <bcp14>MUST</bcp14> be non-null for file nodes (including
  zero byte files).  Creating or updating a file node to have a
  null blobId is an "invalidProperties" error.  Updating the
  blobId replaces the node's content; the server <bcp14>MUST</bcp14> update
  <spanx style="verb">size</spanx> to match the new blob.  A directory node (null blobId)
  cannot be changed to a file node or vice versa; attempting to
  do so is an "invalidProperties" error.  A blob referenced by
  a FileNode <bcp14>MUST NOT</bcp14> be expired or garbage collected by the
  server while the FileNode exists.</t>
  <t>size: "UnsignedInt|null" (server-set)  <vspace blankLines='1'/>
The size in bytes of the associated blob data.  This <bcp14>MUST</bcp14> be
  null if, and only if, the blobId is null.  Size is optional on
  create and update, but if provided it <bcp14>MUST</bcp14> match the size of
  the provided blobId, or be null if the node is a directory.
  If the client updates <spanx style="verb">blobId</spanx> without providing <spanx style="verb">size</spanx>, the
  server sets <spanx style="verb">size</spanx> from the new blob and returns the size in
  the "updated" response.</t>
  <t>name: "String"  <vspace blankLines='1'/>
User-visible name for the FileNode.  This <bcp14>MUST</bcp14> 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
  <bcp14>MUST NOT</bcp14> be two sibling FileNodes with both the same parent and
  the same name.  Servers <bcp14>MAY</bcp14> reject names that violate server
  policy (e.g., names containing control characters).  Further:  <list style="symbols">
      <t>The name <bcp14>MUST NOT</bcp14> be "." or ".."</t>
      <t>The name <bcp14>MUST NOT</bcp14> contain a "/"</t>
    </list>
Servers <bcp14>MAY</bcp14> reject names containing additional characters that
  are problematic on common platforms (e.g. "\", ":", "*", "?",
  """, "&lt;", "&gt;", "|") with an "invalidProperties" error.  <vspace blankLines='1'/>
A server <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14> be <spanx style="verb">null</spanx> if, and
  only if, the node does not have a <spanx style="verb">blobId</spanx>.  Valid values are
  found in the IANA media-types registry.  Servers <bcp14>MUST NOT</bcp14>
  reject media types that are not recognised.  Servers <bcp14>MUST</bcp14>
  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|null" (default: current server time)  <vspace blankLines='1'/>
The date the node was last updated.  The server does not
  automatically update this value; clients <bcp14>SHOULD</bcp14> provide an
  updated value when modifying the node.  This gives clients
  control over the timestamp, for example when preserving
  original modification times during file synchronization.
  If the client does not include <spanx style="verb">modified</spanx> in an update, the
  server <bcp14>MUST</bcp14> leave it unchanged.  If the client sets <spanx style="verb">modified</spanx>
  to null, the server <bcp14>MUST</bcp14> set it to the current server time.</t>
  <t>accessed: "UTCDate|null" (default: current server time)  <vspace blankLines='1'/>
The date the node was last accessed.  As with <spanx style="verb">modified</spanx>,
  the server does not automatically update this value; clients
  <bcp14>SHOULD</bcp14> provide an updated value when appropriate.  If not
  included in an update, the server <bcp14>MUST</bcp14> leave it unchanged.
  If set to null, the server <bcp14>MUST</bcp14> set it to the current server
  time.</t>
  <t>executable: "Boolean" (default: false)  <vspace blankLines='1'/>
If true, the node 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 inherit 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
  node.  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 <bcp14>MUST NOT</bcp14> 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>
  <t>role: "String|null"  <vspace blankLines='1'/>
An indication that this directory has a special role.  The role
  <bcp14>MUST</bcp14> be null for files.  A node with the "root" role should
  have a null parentId.  Clients <bcp14>MUST</bcp14> ignore unrecognised role
  values.  Values are registered in the "JMAP FileNode Roles"
  registry (see IANA Considerations).</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 <bcp14>MUST NOT</bcp14> return this error.
 Servers <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14>
 include the ids of all deleted nodes in the method response.</t>
  <t>onExists: "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 an
 "alreadyExists" error.  <vspace blankLines='1'/>
If "replace", the existing item will be destroyed.  In this
 case, the server <bcp14>MUST</bcp14> include the id of the replaced item in
 the destroyed response list.  NOTE: if the replaced item is a
 directory which has children, then the server <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14> include the new "name" value in the created
 or updated response field for this id.</t>
</list></t>

<t>Errors (in addition to standard SetError codes from <xref target="JMAP-CORE"/>):</t>

<t><list style="symbols">
  <t>"alreadyExists" — a create or update would cause a name collision
with an existing sibling FileNode, and onExists is null.  The
SetError object <bcp14>MUST</bcp14> include an <spanx style="verb">existingId</spanx> property with the id
of the existing FileNode.</t>
  <t>"invalidProperties" — an attempt was made to move a node to a
descendant of itself, creating a cycle in the tree.</t>
  <t>"nodeHasChildren" — a destroy was attempted on a FileNode that
has children, and onDestroyRemoveChildren is false.</t>
</list></t>

</section>
<section anchor="filenodecopy"><name>FileNode/copy</name>

<t>This is a standard Foo/copy function with the same additional
top-level arguments as FileNode/set, onDestroyRemoveChildren and
onExists, with the same behaviour.</t>

<t>Errors: the same additional errors as FileNode/set apply.</t>

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

<t>This is a standard Foo/get method, with the following additional
request argument:</t>

<t><list style="symbols">
  <t>fetchParents: "Boolean" (default: false)  <vspace blankLines='1'/>
If true, the server returns all ancestor nodes of the
  requested ids in addition to the requested nodes themselves.
  This allows a client to reconstruct the full path to each
  requested node in a single call.  Ancestor nodes that have
  already been included (either because they were explicitly
  requested or because they are ancestors of multiple requested
  nodes) are not duplicated.  The ancestors are returned as
  additional entries in the <spanx style="verb">list</spanx> array.</t>
</list></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 subdirectories 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>isTopLevel: "Boolean"  <vspace blankLines='1'/>
If true, the node must have a null parentId to match the
  condition.</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 match the
  condition.</t>
  <t>descendantId: "Id"  <vspace blankLines='1'/>
A FileNode id.  A node must be an ancestor (parent, parent
  of parent, etc.) of the node with this id to match the
  condition.  This is the inverse of <spanx style="verb">ancestorId</spanx>.</t>
  <t>isFile: "Boolean"  <vspace blankLines='1'/>
If <spanx style="verb">true</spanx>, the FileNode must be a file (has a non-null blobId).
  If <spanx style="verb">false</spanx>, the FileNode must not be a file.</t>
  <t>isDirectory: "Boolean"  <vspace blankLines='1'/>
If <spanx style="verb">true</spanx>, the FileNode must be a directory (has a null blobId).
  If <spanx style="verb">false</spanx>, the FileNode must not be a directory.</t>
  <t>role: "String"  <vspace blankLines='1'/>
A role name.  Only nodes with precisely this role match this
  condition.</t>
  <t>hasAnyRole: "Boolean"  <vspace blankLines='1'/>
If true, any node with a defined role matches this condition.
  If false, any node which has a role does not match this
  condition.</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 must be before this date to
  match the condition.</t>
  <t>createdAfter: "UTCDate"  <vspace blankLines='1'/>
The creation date of the node must be on or after this date
  to match the condition.</t>
  <t>modifiedBefore: "UTCDate"  <vspace blankLines='1'/>
The modified date of the node must be before this date to
  match the condition.</t>
  <t>modifiedAfter: "UTCDate"  <vspace blankLines='1'/>
The modified date of the node must be on or after this date
  to match the condition.</t>
  <t>accessedBefore: "UTCDate"  <vspace blankLines='1'/>
The accessed date of the node must be before this date to
  match the condition.</t>
  <t>accessedAfter: "UTCDate"  <vspace blankLines='1'/>
The accessed date of the node 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 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 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'/>
Matches the <em>name</em> property of the node using glob syntax.
  The following special patterns are defined: <spanx style="verb">*</spanx> matches any
  sequence of characters, <spanx style="verb">?</spanx> matches any single character,
  and <spanx style="verb">[...]</spanx> matches any single character in the bracketed
  set (e.g., <spanx style="verb">[abc]</spanx> matches "a", "b", or "c"; <spanx style="verb">[a-z]</spanx>
  matches any lowercase letter; <spanx style="verb">[!abc]</spanx> or <spanx style="verb">[^abc]</spanx> matches
  any character not in the set).  All other characters match
  literally.  The match is case-insensitive.</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'/>
Matches the <em>type</em> property of the node using the same glob
  syntax as <em>nameMatch</em>.</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>isDirectory:  <vspace blankLines='1'/>
Sort directories before files (true sorts before false)</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 anchor="direct-http-write"><name>Direct HTTP Write</name>

<t>When the server advertises a <spanx style="verb">webWriteUrlTemplate</spanx>, clients can
update a file node's content directly via HTTP without using
FileNode/set.  The URL is constructed by expanding the template
with the FileNode id.  This is only valid for file nodes (those
with a non-null blobId); requests targeting directory nodes <bcp14>MUST</bcp14>
be rejected with an HTTP 400 status.</t>

<t>The client <bcp14>MUST</bcp14> have <spanx style="verb">mayWrite</spanx> permission on the node.
Requests without sufficient permission <bcp14>MUST</bcp14> be rejected with an
HTTP 403 status.  Authentication uses the same mechanism as other
JMAP HTTP endpoints.</t>

<section anchor="put"><name>PUT</name>

<t>A PUT request replaces the entire content of the node.  The
request body is the new content.  The Content-Type header sets
the media type of the node.</t>

<t>On success, the server <bcp14>MUST</bcp14> update the node's <spanx style="verb">blobId</spanx>, <spanx style="verb">size</spanx>,
and <spanx style="verb">type</spanx> properties, and return an HTTP 200 response with a
JSON body:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "blobId": "Bnewblob123",
  "size": 48576,
  "type": "text/plain"
}
]]></sourcecode></figure>

</section>
<section anchor="patch"><name>PATCH</name>

<t>A PATCH request applies a partial modification to the node's
current content.  The Content-Type of the request indicates the
patch format.  The supported patch formats are those listed in
the <spanx style="verb">supportedPatchTypes</spanx> capability of <xref target="JMAP-BLOBEXT"/> (e.g.,
<spanx style="verb">application/x-rdiff-delta</spanx>, <spanx style="verb">application/x-bsdiff</spanx>,
<spanx style="verb">text/x-diff</spanx>).  The server applies the delta to the node's
current blob to produce the new content.</t>

<t>On success, the server <bcp14>MUST</bcp14> update the node's <spanx style="verb">blobId</spanx> and
<spanx style="verb">size</spanx> properties.  The <spanx style="verb">type</spanx> is not changed unless the client
includes an <spanx style="verb">X-FileNode-Type</spanx> header, in which case the server
<bcp14>MUST</bcp14> update the node's <spanx style="verb">type</spanx> to the header value.  The response
is an HTTP 200 with the same JSON body as PUT:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "blobId": "Bpatched456",
  "size": 49152,
  "type": "text/plain"
}
]]></sourcecode></figure>

<t>Servers that do not support a given patch format <bcp14>MUST</bcp14> respond
with HTTP 415 (Unsupported Media Type).</t>

</section>
</section>
</section>
<section anchor="quotas"><name>Quotas</name>

<t>Servers that support JMAP Quotas (<xref target="JMAP-QUOTAS"/>) <bcp14>SHOULD</bcp14>
provide Quota objects with <spanx style="verb">"FileNode"</spanx> in the <spanx style="verb">types</spanx> array.
Both the <spanx style="verb">octets</spanx> resource type (total storage used by file
node blobs) and the <spanx style="verb">count</spanx> resource type (number of FileNode
objects) are applicable.</t>

</section>
<section anchor="integration-with-jmap-blob-extensions"><name>Integration with JMAP Blob Extensions</name>

<t>When a server advertises both <spanx style="verb">urn:ietf:params:jmap:filenode</spanx> and
<spanx style="verb">urn:ietf:params:jmap:blobext</spanx>, the ArchiveEntry object type
(defined in <xref target="JMAP-BLOBEXT"/>) is extended with two additional
properties:</t>

<t><list style="symbols">
  <t>nodeId: "Id|null"
A FileNode id.  When present, the server populates the
archive entry from the referenced FileNode's properties.
The <spanx style="verb">blobId</spanx> and <spanx style="verb">name</spanx> are taken from the FileNode.  The
FileNode's <spanx style="verb">created</spanx> and <spanx style="verb">modified</spanx> timestamps map to the
archive entry's time metadata.  The FileNode's
<spanx style="verb">myRights</spanx> (specifically the <spanx style="verb">mayWrite</spanx> right) and the
<spanx style="verb">executable</spanx> property inform the <spanx style="verb">mode</spanx> field in the
archive entry (e.g., permissions and executable bit).
If the ArchiveEntry also provides explicit values for
any of these properties, the explicit values take
precedence.  Mutually exclusive with providing <spanx style="verb">blobId</spanx>
directly when the FileNode is a file.</t>
  <t>recurse: "Boolean" (default: false)
Only valid when the referenced FileNode is a directory.
When true, the server recursively includes all children
of the directory in the archive.  Each child entry's
<spanx style="verb">name</spanx> is its full path relative to the directory.
Directory names <bcp14>MUST</bcp14> include a trailing <spanx style="verb">/</spanx>.</t>
</list></t>

<t>If <spanx style="verb">nodeId</spanx> references a FileNode that the user does not have
permission to read, or that does not exist, the server <bcp14>MUST</bcp14>
reject the Blob/convert creation with a <spanx style="verb">notFound</spanx> SetError.</t>

<section anchor="examples"><name>Examples</name>

<t>To archive an entire directory tree rooted at FileNode
"dirabc" into a zip file:</t>

<t><spanx style="verb">json
[["Blob/convert", {
  "accountId": "account1",
  "create": {
    "myarchive": {
      "archive": {
        "type": "application/zip",
        "entries": [{
          "nodeId": "dirabc",
          "name": "/",
          "recurse": true
        }]
      }
    }
  }
}, "R1"]]
</spanx></t>

<t>To archive specific files from different locations along with
a full subdirectory:</t>

<t><spanx style="verb">json
[["Blob/convert", {
  "accountId": "account1",
  "create": {
    "selective": {
      "archive": {
        "type": "application/zip",
        "entries": [
          {
            "nodeId": "filenode1",
            "name": "README.txt"
          },
          {
            "nodeId": "dirnode2",
            "name": "docs/",
            "recurse": true
          }
        ]
      }
    }
  }
}, "R1"]]
</spanx></t>

</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.  The <spanx style="verb">myRights</spanx> property on
every node reflects the derived rights for the current user,
taking inheritance into account.</t>

<t>When a <spanx style="verb">shareWith</spanx> change on a node causes the derived <spanx style="verb">myRights</spanx>
to change for any descendant, the server <bcp14>MUST</bcp14> report those
descendants as changed in FileNode/changes responses.  The server
<bcp14>SHOULD NOT</bcp14> report descendants whose derived <spanx style="verb">myRights</spanx> did not
actually change, but <bcp14>MAY</bcp14> do so if it cannot efficiently determine
whether the derived values differ.</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" <bcp14>MUST</bcp14> return notFound errors if
fetched with FileNode/get and <bcp14>MUST NOT</bcp14> 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 new Nodes in response to a
FileNode/changes query.  The server might report these as
"created" or "updated" — it is not always possible for the server
to know whether a node was previously visible to the user.</t>

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

<t>All security considerations from <xref target="JMAP-CORE"/> apply to this document.</t>

<section anchor="path-traversal"><name>Path Traversal</name>

<t>FileNode names <bcp14>MUST NOT</bcp14> contain "/" or be "." or "..".  Servers <bcp14>MUST</bcp14>
enforce these constraints.  Clients that reconstruct filesystem paths
from FileNode hierarchies <bcp14>MUST</bcp14> validate the resulting paths and reject
any that would escape the intended directory tree.</t>

</section>
<section anchor="denial-of-service"><name>Denial of Service</name>

<t>Deep nesting of FileNodes or very large numbers of children under a
single parent can consume significant server resources.  Servers
<bcp14>SHOULD</bcp14> enforce reasonable limits via <spanx style="verb">maxFileNodeDepth</spanx> and <bcp14>MAY</bcp14>
impose additional limits on the number of children per node.
Recursive operations such as destroying a subtree with
<spanx style="verb">onDestroyRemoveChildren</spanx> can be expensive; servers <bcp14>SHOULD</bcp14> impose
limits on the size of subtrees that can be destroyed in a single
operation.</t>

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

<t>The discoverability rules defined in this document mean that ancestor
nodes of shared content are visible (with <spanx style="verb">mayRead</spanx> false) to users
who have access to descendants.  While these ancestor nodes do not
expose file content, their names and structure may reveal information
about the file hierarchy.  Server administrators and users sharing
content should be aware of this.</t>

<t>Changes to the <spanx style="verb">shareWith</spanx> property on a node affect all descendants.
Removing sharing from a parent node will make all descendants
undiscoverable to the affected users, which may be surprising if
those users had been actively working with the shared files.</t>

</section>
<section anchor="content-security"><name>Content Security</name>

<t>Servers that perform content scanning or malware detection <bcp14>SHOULD</bcp14>
scan blobs referenced by FileNode objects.  The <spanx style="verb">type</spanx> property is
client-asserted and <bcp14>MUST NOT</bcp14> be trusted for security decisions;
servers <bcp14>SHOULD</bcp14> independently verify content types where this matters.</t>

</section>
</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, Security Considerations</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 anchor="jmap-filenode-roles-registry"><name>JMAP FileNode Roles Registry</name>

<t>IANA is requested to create a new "JMAP FileNode Roles" registry
with the following initial values.  New registrations are subject
to Expert Review (<xref target="IANA-GUIDELINES"/>).</t>

<texttable>
      <ttcol align='left'>Role</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>root</c>
      <c>The base of a filesystem</c>
      <c>this document</c>
      <c>home</c>
      <c>A user's home directory</c>
      <c>this document</c>
      <c>temp</c>
      <c>Temporary space; may be cleaned up automatically</c>
      <c>this document</c>
      <c>trash</c>
      <c>Deleted data; may be removed automatically or manually</c>
      <c>this document</c>
      <c>documents</c>
      <c>Document storage</c>
      <c>this document</c>
      <c>downloads</c>
      <c>Downloaded files</c>
      <c>this document</c>
      <c>music</c>
      <c>Audio files</c>
      <c>this document</c>
      <c>pictures</c>
      <c>Photos and images</c>
      <c>this document</c>
      <c>videos</c>
      <c>Video files</c>
      <c>this document</c>
</texttable>

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

<t><list style="symbols">
  <t>support SYMLINK types (RFC4437)</t>
  <t>create real-world clients to test this</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-09</strong></t>

<t><list style="symbols">
  <t>Renamed hasType filter to isFile and isDirectory (separate filters).</t>
  <t>Renamed hasRole filter to role for consistency.</t>
  <t>Defined glob matching syntax for nameMatch/typeMatch (*, ?, [...]).</t>
  <t>Added fetchParents argument to FileNode/get.</t>
  <t>Added descendantId filter to FileNode/query.</t>
</list></t>

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

<t><list style="symbols">
  <t>Removed immutability restriction on blobId, size, and type — nodes
can now have their content updated via FileNode/set.</t>
  <t>Added webWriteUrlTemplate capability for direct HTTP PUT/PATCH
writes to file nodes.</t>
  <t>Added documents, downloads, music, pictures, and videos roles.</t>
  <t>Added Quotas section referencing RFC 9425.</t>
</list></t>

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

<t><list style="symbols">
  <t>added webTrashUrl and webUrlTemplate to the capabilities object</t>
  <t>added capability example JSON</t>
  <t>added explicit Errors sections to FileNode/set and FileNode/copy</t>
  <t>fixed typos and spelling errors</t>
  <t>added BCP 14 boilerplate</t>
  <t>fleshed out Security Considerations</t>
  <t>replaced role TODO with IANA registry</t>
  <t>documented webUrlTemplate variables</t>
  <t>clarified modified/accessed semantics: client-managed with null
to reset to server time</t>
  <t>clarified blobId constraints and blob lifetime</t>
  <t>documented myRights inheritance and FileNode/changes behaviour
when shareWith changes</t>
  <t>wrapped long lines throughout</t>
  <t>added Integration with JMAP Blob Extensions section
(ArchiveEntry extension with nodeId and recurse)</t>
</list></t>

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

<t><list style="symbols">
  <t>Documented FileNode/copy and detailed that it has the same new top-level keys</t>
</list></t>

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

<t><list style="symbols">
  <t>Renamed onDuplicate to onExists for name alignment</t>
  <t>added "role" for directories</t>
  <t>added a "TODO" for putting more restrictions on node names</t>
  <t>changed hasParentId to isTopLevel with reversed boolean meaning</t>
</list></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 onDuplicate 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 <bcp14>MUST</bcp14> 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 inheritance 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>

<reference anchor="URI-TEMPLATE">
  <front>
    <title>URI Template</title>
    <author fullname="J. Gregorio" initials="J." surname="Gregorio"/>
    <author fullname="R. Fielding" initials="R." surname="Fielding"/>
    <author fullname="M. Hadley" initials="M." surname="Hadley"/>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <author fullname="D. Orchard" initials="D." surname="Orchard"/>
    <date month="March" year="2012"/>
    <abstract>
      <t>A URI Template is a compact sequence of characters for describing a range of Uniform Resource Identifiers through variable expansion. This specification defines the URI Template syntax and the process for expanding a URI Template into a URI reference, along with guidelines for the use of URI Templates on the Internet. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6570"/>
  <seriesInfo name="DOI" value="10.17487/RFC6570"/>
</reference>

<reference anchor="IANA-GUIDELINES">
  <front>
    <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
    <author fullname="M. Cotton" initials="M." surname="Cotton"/>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <author fullname="T. Narten" initials="T." surname="Narten"/>
    <date month="June" year="2017"/>
    <abstract>
      <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
      <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
      <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="26"/>
  <seriesInfo name="RFC" value="8126"/>
  <seriesInfo name="DOI" value="10.17487/RFC8126"/>
</reference>


<reference anchor="JMAP-BLOBEXT">
   <front>
      <title>JMAP Blob Extensions</title>
      <author fullname="Bron Gondwana" initials="B." surname="Gondwana">
         <organization>Fastmail</organization>
      </author>
      <date day="18" month="March" year="2026"/>
      <abstract>
	 <t>   The JMAP base protocol (RFC8620) provides the ability to upload and
   download arbitrary binary data.  This binary data is called a &quot;blob&quot;,
   and can be used in all other JMAP extensions.

   The JMAP blob extension (RFC9404) added additional ways to create and
   access blobs by making inline method calls within a standard JMAP
   request.

   This extension adds more methods to work with blobs, including
   handling large blobs by processing them in chunks (building on
   RFC9404&#x27;s blob construction support), and providing server-side blob
   conversion operations: image format conversion, archive creation and
   extraction (zip, tar, cpio), compression and decompression, and
   delta/patch operations.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-gondwana-jmap-blobext-03"/>
   
</reference>

<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>

<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>




    </references>

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



<reference anchor="CALDAV">
  <front>
    <title>Calendaring Extensions to WebDAV (CalDAV)</title>
    <author fullname="C. Daboo" initials="C." surname="Daboo"/>
    <author fullname="B. Desruisseaux" initials="B." surname="Desruisseaux"/>
    <author fullname="L. Dusseault" initials="L." surname="Dusseault"/>
    <date month="March" year="2007"/>
    <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 calendaring and scheduling information based on the iCalendar format. This document defines the "calendar-access" feature of CalDAV. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4791"/>
  <seriesInfo name="DOI" value="10.17487/RFC4791"/>
</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="JMAP-QUOTAS">
  <front>
    <title>JSON Meta Application Protocol (JMAP) for Quotas</title>
    <author fullname="R. Cordier" initials="R." role="editor" surname="Cordier"/>
    <date month="June" year="2023"/>
    <abstract>
      <t>This document specifies a data model for handling quotas on accounts with a server using the JSON Meta Application Protocol (JMAP).</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9425"/>
  <seriesInfo name="DOI" value="10.17487/RFC9425"/>
</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:
H4sIAAAAAAAAA7V963bbxrLmfzwFDvMjkhZFWY6di7zXzsiSsqN9fNuWvHOy
HM8QJJoUYhDgAUBJTOK95iHmAeZZ5lHmSaa+ujQaICU7OZn8iEVcqrurq+te
hf39/ajJmtwdxX9/fvwq/i7LXXzRlFUyd7G7bVxRZ2URJZNJ5a6DZ16UqYvS
clokC3o1rZJZs5+5Zrb/8yJZ7s/oiYKe2H/wTVSvJousBpTL9ZKePT+7/C6a
Jo2bl9X6KK6bNFotU/pdH8Vff/nwQVRO6jJ3+B1ly+oobqpV3Tx88OCbBw+j
9259U1YpQSkaVxWu2T/F0FHdJEX6P5K8LGiEtaujZXYUv23K6TCuy6qp3Kym
v9YL/PEuipJVc1VWR1G8H8X0X1bQ2E9H8d/KIr1JioQvysqeVmXRvV5W86P4
u6RuFkmW8xWHv47iCT06/28zvdO4ZDGalosoKspqkTTZtTvip4HC/ZOXr8+O
4tffnfCK/eWL749fn7/4G9/55suv5M7zs9Pz48sfX8kLX379xdd8+c3r8/3L
s+evnh1f6p3H+sL58Yvj/b+9OT89e3b+4uxCxjl8+GU7ztNnL5+e/ccloXH/
dCSbN9c1ygZO8nJCux9FWTHrTv/k+Nnp8T8Z5qOvvjnUa69P7eKXXzx+2A70
/Pj8ma3zMFj+8bOzF6fHry9kBi3hTBMinDSp6hBVLy6PTy4vFCmHAbr+8ebl
5bHeePTwMd/44eypn983h4qqF+cnL08FS48Pv/k6ivb39+NkUjdVMqVFXl45
oexJUrt4WZVEOGUe7+j+7OLSdZa6Om7oyWSS5VmzjpsyXi3zMkljor04LW8K
/IiSapIR3GodT7IC/xBtJ6M4vrzK6vBSTD9pubmj9+MBED4YMqRpUsQTF69q
lxL6Y3okLmncSqboz2Q9wsQJiL8SJ2laE7CFI+pOMT93uyxpRQBON3APJ7Ne
141bxDgt8/gma66wrKih01nH5QyvJzzB5ipp4qRytvw0nqx1KpVblI0LoRnW
MC1gd5Glae6i6DMc1apMV9MGjCTiRez8+qs/Bh8+xP/3f/6v+O8XL1/Ez2no
+Hi5zDNiEFjRK4W6C2wl8dwVrsqmkd8iIk461sX0is5e9ktG6+GZT1xz4xwh
JJ7mmSsaxmsS1666dtUoOm8Arlw22SL7hZYFKItyAtaHB2/cJHbFdUYwF/Ry
LduSZAva/zJSZAA2bUJGiyf4GdjRLJk6YD3NZjNX4bKgEYglrJwXTD418ZX4
JlkLehkdJ0b1LWLsgHz4sEvIXuYEuo7oOaJtPCSnEDcxNQFSFg1RcwBDD04P
RJV6GHxq6faQ5kIIIXa+woL90zxfokNQxQ9uou/JCaPXIuBtkxKSKb2KBX/2
GSZ1TRBBrvEbImhClByEUx1LDh+x9Rh8vY4Hz99cXNJB4H/jFy/579dn/3hz
/vrsFH8Ti3z2zP8R6RMX37988+y0/at98+Tl8+eESnmZrsadS9Hg+fGPeu4G
L19dnr98cfxsgFl2MYJTQDtLx5J3elmRfCKSqCNiCtMqm8jKnp68+j//+/BR
/Ouv/0as4+Hh4TdE3PLj68OvHtGPmytXyGhlka/1J2F5HSXLpUuqWA/8NFlm
TZKD9Oq4viLeEtOxc4TUvbfAzLuj+C+T6fLw0V/1AhbcuWg461xknG1e2XhZ
kLjl0pZhPDY713uY7s73+MfOb8N7cPEv3+ZZ4eL9w6+//WsEJnKcphlzBNoF
UOVJshQ+nBGZvpz87IyPT8MbJd/AYacNW5G+gD2Ll0nVgKQbY/sXjvWTSB5/
QnzCxR0ONaRHmH/FD43retJI3YymStyJ+S9PMsnbaawhqOUw0ASOIOqOaALJ
oj6CxDsyVak3+3U8vvfxMdEi2B1RYi0MiJn4gA5fuSqaED0D8OalqwgmLRrT
lGdwzOVtIrHVckl6Ep9ooMVUPOZgYGAkwC6Ye9bCt7Jimq/oftOZNOQVqWAx
81M6MvdOBxvEpEt0XhrACAD9fGVV8WC6dTkjwdl1kq+c7CftS/9d3uBaNrgH
KPLP8jQm4P6kzC2BKKaEjw7QIvPzevti2zEyJhGlSMYhjzoF29a5zso8L2+w
rV7tAlUWKri6tA0mQpBVt65j2TpIbJnGEfGKeJHc2laeumVzdRQP3pDQmtNJ
ILH802/FKs8HEStJWCk9ni1WC6JpetaOiKeFq8yRXjO9Wsc72ciNhrzVvM80
bsFAmgBIsVpMaNJMcyQRyKaACPfQFiQCr5JrR9KHZo6JYAmiepdxTqIZ+Ocl
XJCUtvdesFoermLL/OmMzJurIbZo583ld/tf78bltHEsyoFilfmYLdR8niMD
sVFMX/OE0RBM0uzjwwcPAIMUrNX8Ks6Ut5CeT7yANCQGUutB4aEYQbyQmcL+
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
bScbMWr4DcyBHZc+EWPT+KqcVsDB+9M+yAlzZlOR4OknK3nzpu5YjFHbCdQg
hzBv2ODdnDMd/pRTaX0VmQwjvlcU1Gv7DiRQWjMQZ56fHCuUJjouIvHMMY4Q
OapUCIcR+eW1bC9xzEjhkdmHLLRLaIc3zHOdSBPVZSJMYGNf5wO6ZKVB3FZY
rZXccXeFmboJqtYXaDU7mov8IqiTsyw0OsP1FBW+oM6B7Rt7XUzOWZpjNos4
09CU9DC1kTW6sPrJp69xYZy6bJoy6vpWkdntD0o4k9gaes7YFrhJuM/P4chU
RKZVJsE2oSeMxlxx4iyfVVv9w+7LYjqHLyf9BI0eAOujjGTFNMh3F3CcfCs5
3exxtJd9/kcaS6vdOmJPKe3mnFWmq16+Iy74Lh6hh15CB5yBm0jOnBn8idRA
xklY1iJz4bF8uUgpiUg02cizuJYe2At5g06Jna1oripuOtkuPmrvi+OoWuXO
GtSSopvW0kOHGQ1ecuZM7qyU+Ae6O8y9SieNOSM9HU0pZxRVOXjKSRrxGQpM
OflzVWS38VUJx6RRe9A+G9p0pVricY4GPle0HVIVx+6wAfGwp+VkoM0Eta0o
uAZmPBRtPC/nyqYIufS0OFGSiqiyeh8dYHQSTwcJBmBpdaAjiAQ7kDG8ZIM4
Phz9vJx3rjyE+PVXRiOozQcTfY3+ZYvCHsFtdrz8wP1+ZGmSCo+Y4AJcedEG
TUB4ssDael/wpFuccRpl217YyRayz62Eiy1jrpnDN29FBWYvGJ2y+srp1sRJ
GW8yLY67WCWiaOE27BDY1HnzrnNeblNK89BEx2udIfD5vbBynICjxEm0IUCM
t4ThTd5XL5G4JK2OfOs6Dpr7VjvIh5cWq1ILDfZDyKhlsSZ+VSzRFND3Mzbp
YGwEDZ8rhzTymmMy8rIecK69hhZzAW0IR2jaqTKMIoTU6+03t9RNxF516fQP
F8PkFc7bZZVwAyvSlLwpFRhkYeMZUsy1UVLQrqbf1cPBCTC18r62SqwOyjV5
x8Pk7rBvP02qjnglG41+fYdmNovNO0qbjsRqlEjjXQ0QcAduDlhjMKEnUguS
pRYdFepX6ppfGqFzBbz2RF1YGk5wdOrckmhNqjUCH1zNbcDAc0PCrCUJRDkp
yUrsf6S5HMqGIcmBgRVisNm8YOdL2/fBvH91i2DTdAzFRKNkiDAv5vbENUf4
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
oScCbjtSAH+dJNP34gX+EP0/5MtiqxOAAAA=

-->

</rfc>

