<?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-10" 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 a pair of brackets 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 anchor="extracting-archives-into-filenodes"><name>Extracting Archives into FileNodes</name>

<t>When both capabilities are present, the UnArchiveRecipe
(defined in <xref target="JMAP-BLOBEXT"/>) is extended with the following
additional properties:</t>

<t><list style="symbols">
  <t>parentNodeId: "Id|null"
A FileNode id of a directory.  When present, the server
extracts the archive contents into this directory, creating
FileNode objects for each entry.  Subdirectories in the
archive are created as directory FileNodes.  File entries
become file FileNodes with their <spanx style="verb">blobId</spanx> set to the
extracted content.  The <spanx style="verb">created</spanx> and <spanx style="verb">modified</spanx> timestamps
are taken from the archive entry metadata.  If the archive
entry includes a <spanx style="verb">mode</spanx> field, the server <bcp14>SHOULD</bcp14> use it to
set the <spanx style="verb">executable</spanx> property on the created FileNode.</t>
  <t>onExists: "String|null" (default: null)
Controls the behaviour when an extracted entry would collide
with an existing FileNode name under the same parent.  The
values and semantics are the same as for FileNode/set (see
above): null rejects with an <spanx style="verb">alreadyExists</spanx> SetError,
"replace" destroys the existing node, and "rename" gives the
new node a server-chosen name.</t>
</list></t>

<t>When <spanx style="verb">parentNodeId</spanx> is set, each ArchiveEntry in the response
<spanx style="verb">entries</spanx> array includes an additional <spanx style="verb">nodeId</spanx> property
containing the id of the FileNode that was created for that
entry.</t>

<t>If <spanx style="verb">parentNodeId</spanx> references a FileNode that does not exist,
is not a directory, or for which the user does not have
<spanx style="verb">mayWrite</spanx> permission, the server <bcp14>MUST</bcp14> reject the Blob/convert
creation with an appropriate SetError (<spanx style="verb">notFound</spanx>,
<spanx style="verb">invalidProperties</spanx>, or <spanx style="verb">forbidden</spanx>).</t>

<section anchor="example"><name>Example</name>

<t>Extracting a zip file into a directory:</t>

<t><spanx style="verb">json
[["Blob/convert", {
  "accountId": "account1",
  "create": {
    "extract": {
      "unArchive": {
        "blobId": "Barchive123",
        "type": "application/zip",
        "parentNodeId": "dir456"
      }
    }
  }
}, "R1"]]
</spanx></t>

<t>The response includes a <spanx style="verb">nodeId</spanx> for each created entry:</t>

<t><spanx style="verb">json
[["Blob/convert", {
  "accountId": "account1",
  "created": {
    "extract": {
      "id": "Barchive123",
      "type": "application/zip",
      "size": 104857,
      "entries": [
        {
          "name": "docs/",
          "entryType": "directory",
          "nodeId": "node001"
        },
        {
          "name": "docs/readme.txt",
          "blobId": "Bdd001",
          "entryType": "file",
          "modified": "2026-03-01T12:00:00Z",
          "mode": "0644",
          "nodeId": "node002"
        },
        {
          "name": "docs/logo.png",
          "blobId": "Bdd002",
          "entryType": "file",
          "modified": "2026-02-15T09:30:00Z",
          "mode": "0644",
          "nodeId": "node003"
        }
      ]
    }
  },
  "notCreated": {}
}, "R1"]]
</spanx></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.  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-10</strong></t>

<t><list style="symbols">
  <t>Added UnArchiveRecipe parentNodeId extension for extracting
archives directly into FileNode trees.</t>
</list></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:
H4sIAAAAAAAAA7V96XbkxrHmfzwFbvmHSJ7iqm4tbB972CRl07c3N9nW1Ug9
U6hCFgmrCqgLoEiWpfaZh5gHmGeZR5knmfhiyUygiuyWrKvj42ZhyYyMjIw9
Aru7u0lbtDN3nP7l5cmb9Jti5tLLtqqza5e6+9aVTVGVSTYe1+42euZVlbsk
ryZlNqdX8zqbtruFa6e7f59ni90pPVHSE7uHB0mzHM+LBqNcrRb07MX51TfJ
JGvddVWvjtOmzZPlIqffzXH61RdHB0k1bqqZw++kWNTHaVsvm/bo4ODrg6Pk
R7e6q+qcRilbV5eu3T3D1EnTZmX+P7NZVdIMK9cki+I4/b6tJsO0qeq2dtOG
/lrN8cf7JMmW7U1VHyfpbpLSf0VJcz/fS/9UlfldVmZ8UVb2vK7K7vWqvj5O
v8madp4VM77i8NdxOqZHr//bVO+0LpvvTap5kpRVPc/a4tYd89NA4e7p67fn
x+nbb055xf7y5Z9P3l68+hPf+fqLL+XOy/Ozi5Or797IC1989flXfPnd24vd
q/OXb16cXOmdp/rCxcmrk90/vbs4O39x8er8UuY5PPoizPP8xevn5/9xRWjc
PduTzbvWNcoGjmfVmHY/SYpy2gX/9OTF2cnfeMwnX359qNfentnFLz5/ehQm
enly8cLWeRgt/+TF+auzk7eXAkEgnElGhJNndROj6tXVyenVpSLlMELXX9+9
vjrRG0+OnvKNb8+fe/i+PlRUvbo4fX0mWHp6+PVXSbK7u5tm46atswkt8urG
CWWPs8ali7oiwqlm6ZbuzzYu3Ra5a9KWnszGxaxoV2lbpcvFrMrylGgvzau7
Ej+SrB4XNG69SsdFiX+ItrO9NL26KZr4Uko/abkzR++nAyB8MOSRJlmZjl26
bFxO6E/pkbSieWsB0Z/JZg+A0yD+SprleUODzR1Rdw743P2iohVhcLqBeziZ
zapp3TzFablO74r2BstKWjqdTVpN8XrGALY3WZtmtbPl5+l4paDUbl61Lh7N
sAawgN15keczlyS/w1Gtq3w5acFIEl7E1k8/+WPw4UP6//7X/07/cvn6VfqS
pk5PFotZQQwCK3qjo24DW1l67UpXF5PEbxERJx3rcnJDZ6/4R0HrYcjHrr1z
jhCSTmaFK1vGa5Y2rr519V5y0WK4atEW8+IftCyMMq/GYH148M6NU1feFjTm
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
wUGLAAA=

-->

</rfc>

