<?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-14" 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="May" day="15"/>

    
    
    <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>forbiddenNameChars: "String|null"  <vspace blankLines='1'/>
A string where each character is forbidden in FileNode names.
  If null, the server does not restrict name characters beyond
  the requirement that names be non-empty Net-Unicode strings.
  The server <bcp14>MUST</bcp14> reject names containing any of these
  characters with an "invalidProperties" error.</t>
  <t>forbiddenNodeNames: "String[]|null"  <vspace blankLines='1'/>
An array of complete names that the server will not accept
  as FileNode names, compared case-insensitively.  For
  example, <spanx style="verb">[".", "..", "CON", "PRN", "AUX", "NUL"]</spanx> would
  forbid common path-traversal names and Windows reserved
  device names.  If null, the server does not forbid any
  specific names.</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>caseInsensitiveNames: "Boolean"  <vspace blankLines='1'/>
If true, the server treats file names as case-insensitive for
  all name collision checks, including the sibling uniqueness
  constraint and <spanx style="verb">onExists</spanx> handling.  The server preserves the
  original case as provided by the client.</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",
      "nodeType", "tree"
    ],
    "forbiddenNameChars": "/<>:\"\\|?*",
    "forbiddenNodeNames": [".", "..", "CON", "PRN", "AUX",
      "NUL", "COM0", "COM1", "COM2", "COM3", "COM4", "COM5",
      "COM6", "COM7", "COM8", "COM9", "LPT0", "LPT1", "LPT2",
      "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9"
    ],
    "caseInsensitiveNames": false,
    "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>nodeType: "String" (immutable; default: server-inferred)  <vspace blankLines='1'/>
The type of node.  Values are registered in the "JMAP
  FileNode Types" registry (see IANA Considerations).  This
  document defines the following values: "file", "directory",
  and "symlink".  This is immutable after creation.  If not
  provided on creation, the server infers the type: "file" if
  <spanx style="verb">blobId</spanx> is non-null, "symlink" if <spanx style="verb">target</spanx> is non-null,
  "directory" otherwise.  Attempting to change <spanx style="verb">nodeType</spanx> after
  creation is an "invalidProperties" error.</t>
  <t>blobId: "Id|null"  <vspace blankLines='1'/>
The blobId for the content of this node.  <bcp14>MUST</bcp14> be non-null
  for file nodes (including zero byte files).  <bcp14>MUST</bcp14> be null
  for directory and symlink nodes.  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
  blob referenced by a FileNode <bcp14>MUST NOT</bcp14> be expired or garbage
  collected by the server while the FileNode exists.</t>
  <t>target: "String[]|null"  <vspace blankLines='1'/>
The target path for symlink nodes, as an array of path
  elements.  <bcp14>MUST</bcp14> be non-null for symlinks.  <bcp14>MUST</bcp14> be null for
  file and directory nodes.  Each element is a node name in
  the path.  An empty string as the first element indicates
  an absolute path from the root of the tree; otherwise the
  path is relative to the symlink's parent.  An element of
  ".." refers to the parent directory.  The target is not
  required to resolve to an existing node (symlinks may
  dangle).  The target is mutable — updating it changes where
  the symlink points.</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 for directory and symlink nodes, and non-null for file
  nodes.  Size is optional on create and update, but if
  provided it <bcp14>MUST</bcp14> match the size of the provided blobId.
  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.  The server <bcp14>MUST</bcp14> reject names containing any
  character listed in <spanx style="verb">forbiddenNameChars</spanx>, or matching any
  entry in <spanx style="verb">forbiddenNodeNames</spanx> (case-insensitively), with an
  "invalidProperties" error.  See Implementation Considerations
  for guidance on which characters and names to forbid.</t>
  <t>type: "String|null"  <vspace blankLines='1'/>
The media type of the FileNode.  This <bcp14>MUST</bcp14> be <spanx style="verb">null</spanx> for
  directory and symlink nodes, and non-null for file nodes.  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.  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.  See
  Implementation Considerations for usage guidance.</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>changed: "UTCDate" (server-set)  <vspace blankLines='1'/>
The date the server last recorded a change to any property
  of this node.  The server <bcp14>MUST</bcp14> automatically update this
  value whenever any property of the node is modified,
  including <spanx style="verb">blobId</spanx>, <spanx style="verb">name</spanx>, <spanx style="verb">parentId</spanx>, <spanx style="verb">shareWith</spanx>,
  <spanx style="verb">executable</spanx>, and all other mutable properties.  This is
  not settable by clients.</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 properties and
blob content of this node.</t>
      <t>mayAddChildren: <spanx style="verb">Boolean</spanx> The user may create child nodes
in this directory.</t>
      <t>mayRename: <spanx style="verb">Boolean</spanx> The user may rename or move this node.</t>
      <t>mayDelete: <spanx style="verb">Boolean</spanx> The user may destroy this node.</t>
      <t>mayModifyContent: <spanx style="verb">Boolean</spanx> The user may update the
content-related properties of this node (<spanx style="verb">blobId</spanx>, <spanx style="verb">type</spanx>,
<spanx style="verb">target</spanx>, <spanx style="verb">modified</spanx>, <spanx style="verb">accessed</spanx>, <spanx style="verb">executable</spanx>).</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="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="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>A server <bcp14>MUST</bcp14> order creation and deletion operations within a
single FileNode/set such that the sibling name uniqueness
constraint is retained at the end of the transaction, but
replacing an existing file can be done atomically.</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.  <vspace blankLines='1'/>
If "newest", the server compares the <spanx style="verb">modified</spanx> timestamp of
 the incoming item with that of the existing FileNode.  If the
 incoming item has a strictly later <spanx style="verb">modified</spanx> value, the
 existing node is destroyed and the operation proceeds as with
 "replace".  Otherwise the operation is rejected as with null,
 returning an "alreadyExists" error with the <spanx style="verb">existingId</spanx> of the
 surviving node.</t>
  <t>compareCaseInsensitively: "Boolean" (default: false)  <vspace blankLines='1'/>
If true, name collision checks (including <spanx style="verb">onExists</spanx> handling)
 treat names as case-insensitive for this request.  This has no
 effect if the server already has <spanx style="verb">caseInsensitiveNames</spanx> set to
 true in its capability.  This allows clients syncing to
 case-insensitive platforms to prevent name collisions that
 would be problematic on those platforms.</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="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>nodeType: "String"  <vspace blankLines='1'/>
A node type value.  Only nodes with precisely this nodeType
  match this condition.</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>nodeType:  <vspace blankLines='1'/>
Sort by node type.  Directories sort first, then symlinks,
  then files.</t>
  <t>type:  <vspace blankLines='1'/>
Sorts directories first, and sorts by media type for files</t>
</list></t>

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

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

</section>
</section>
</section>
<section anchor="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">mayModifyContent</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 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="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">mayModifyContent</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 ExtractRecipe
(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, "rename" gives the new
node a server-chosen name, and "newest" replaces the existing
node only if the archive entry has a strictly later <spanx style="verb">modified</spanx>
timestamp.</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">mayAddChildren</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": {
    "e1": {
      "extract": {
        "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": {
    "e1": {
      "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="implementation-considerations"><name>Implementation Considerations</name>

<section anchor="modification-timestamps"><name>Modification Timestamps</name>

<t>Clients <bcp14>SHOULD</bcp14> provide an updated <spanx style="verb">modified</spanx> value when modifying
a node.  This gives clients control over the timestamp, for
example when preserving original modification times during file
synchronization.  Clients that do not care about preserving
timestamps can set <spanx style="verb">modified</spanx> to null to have the server use the
current time.</t>

<t>Clients may also choose to update the <spanx style="verb">modified</spanx> timestamp on a
parent directory when moving a child node in or out, to reflect
that the directory's contents have changed.</t>

</section>
<section anchor="timestamp-precision"><name>Timestamp Precision</name>

<t>The UTCDate type (RFC 3339) supports fractional seconds.
Servers <bcp14>SHOULD</bcp14> include sub-second precision in <spanx style="verb">created</spanx>,
<spanx style="verb">modified</spanx>, <spanx style="verb">accessed</spanx>, and <spanx style="verb">changed</spanx> timestamps where their
storage backend supports it.  Clients <bcp14>MUST</bcp14> preserve fractional
seconds when round-tripping timestamps back to the server.</t>

</section>
<section anchor="filename-character-restrictions"><name>Filename Character Restrictions</name>

<t>Servers should set <spanx style="verb">forbiddenNameChars</spanx> and <spanx style="verb">forbiddenNodeNames</spanx>
to include characters and names that are problematic for their
storage backend and for the broadest set of clients.</t>

<t>The following characters are problematic on common platforms:</t>

<t><list style="symbols">
  <t>Windows: <spanx style="verb">&lt;</spanx>, <spanx style="verb">&gt;</spanx>, <spanx style="verb">:</spanx>, <spanx style="verb">"</spanx>, <spanx style="verb">\</spanx>, <spanx style="verb">|</spanx>, <spanx style="verb">?</spanx>, <spanx style="verb">*</spanx>, and
control characters (U+0000-U+001F).  Windows also forbids
trailing dots and spaces in names.</t>
  <t>macOS: <spanx style="verb">:</spanx> (HFS+ legacy; displayed as <spanx style="verb">/</spanx> in Finder).</t>
  <t>Linux: the null byte (U+0000).</t>
</list></t>

<t>The following names are problematic:</t>

<t><list style="symbols">
  <t>All platforms: <spanx style="verb">.</spanx> and <spanx style="verb">..</spanx> (path traversal).</t>
  <t>Windows: reserved device names CON, PRN, AUX, NUL,
COM0-COM9, and LPT0-LPT9.  These are reserved regardless
of file extension (e.g., "CON.txt" is also forbidden).</t>
</list></t>

<t>A server targeting broad client compatibility should include
at least <spanx style="verb">/&lt;&gt;:"\|?*</spanx> in <spanx style="verb">forbiddenNameChars</spanx> and at least
<spanx style="verb">.</spanx>, <spanx style="verb">..</spanx>, and the Windows reserved names in
<spanx style="verb">forbiddenNodeNames</spanx>.</t>

</section>
<section anchor="case-sensitivity"><name>Case Sensitivity</name>

<t>Windows and macOS filesystems are typically case-insensitive
(treating "Foo" and "foo" as the same name), while Linux
filesystems are typically case-sensitive.  Clients syncing to
case-insensitive platforms should use <spanx style="verb">compareCaseInsensitively</spanx>
on FileNode/set requests to prevent creating sibling nodes
whose names differ only in case, as these cannot coexist on
the target platform.</t>

</section>
<section anchor="access-time-updates"><name>Access Time Updates</name>

<t>Updating <spanx style="verb">accessed</spanx> on every file read generates significant
API traffic for little value.  Clients are encouraged to use a
"relatime" strategy similar to modern POSIX filesystems: only
update <spanx style="verb">accessed</spanx> if the current value is older than <spanx style="verb">modified</spanx>,
or if more than 24 hours have elapsed since the last <spanx style="verb">accessed</spanx>
update.  Clients should batch access time updates with their
next JMAP request rather than making a dedicated call.</t>

</section>
</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>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.  Servers <bcp14>SHOULD</bcp14> include <spanx style="verb">/</spanx> in
<spanx style="verb">forbiddenNameChars</spanx> and <spanx style="verb">.</spanx> and <spanx style="verb">..</spanx> in <spanx style="verb">forbiddenNodeNames</spanx> to
prevent path traversal attacks via node names.</t>

</section>
<section anchor="symlink-targets"><name>Symlink Targets</name>

<t>Symlink targets are not validated by the server to point to
existing nodes.  Clients that resolve symlinks <bcp14>MUST</bcp14> guard
against symlink loops (a symlink pointing to an ancestor of
itself) and <bcp14>MUST NOT</bcp14> follow symlinks outside the FileNode tree.
Servers <bcp14>SHOULD</bcp14> impose a limit on the length of <spanx style="verb">target</spanx> values
and <bcp14>MAY</bcp14> reject targets containing ".." path components.</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-types-registry"><name>JMAP FileNode Types Registry</name>

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

<texttable>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>file</c>
      <c>A regular file with blob content</c>
      <c>this document</c>
      <c>directory</c>
      <c>A collection that may contain child nodes</c>
      <c>this document</c>
      <c>symlink</c>
      <c>A symbolic link to another path in the tree</c>
      <c>this document</c>
</texttable>

</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>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-14</strong></t>

<t><list style="symbols">
  <t>Added "newest" value for <spanx style="verb">onExists</spanx>.</t>
</list></t>

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

<t><list style="symbols">
  <t>Reordered methods to get/changes/set/copy/query/queryChanges per
RFC 8620 convention.</t>
  <t>Promoted Direct HTTP Write to top-level section.</t>
  <t>Moved Access Control before Quotas and integrations.</t>
  <t>Added caseInsensitiveNames capability and compareCaseInsensitively
parameter on FileNode/set.</t>
</list></t>

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

<t><list style="symbols">
  <t>Added symlink support: nodeType property (file, directory,
symlink) with IANA registry, and target property (array of
path elements).</t>
  <t>Replaced isFile/isDirectory query filters and sort with
nodeType.</t>
  <t>Expanded myRights: replaced mayWrite with mayAddChildren,
mayRename, mayDelete, mayModifyContent.</t>
  <t>Added forbiddenNameChars and forbiddenNodeNames capabilities;
removed hardcoded name restrictions from spec.</t>
  <t>Added changed (server-set) timestamp.</t>
  <t>Added Implementation Considerations section with guidance on
timestamps, access times, and filename restrictions.</t>
</list></t>

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

<t><list style="symbols">
  <t>Updated for blobext recipe renames (ExtractRecipe).</t>
</list></t>

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

<t><list style="symbols">
  <t>Added ExtractRecipe 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>Ben Bucksch, Mauro De Gennaro, Seph Gentle, Arnt Gulbradson, Neil Jenkins, Ricardo Signes, and members of the JMAP Working Group at 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="7" month="April" 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-06"/>
   
</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:
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
CfEQGiOt8kdkIkuk9XP0/wEShIB8KqwAAA==

-->

</rfc>

