<?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-16" 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="October" day="16"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 41?>

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

<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 (that is, 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>supportedNodeTypes: "String[]"  <vspace blankLines='1'/>
The <spanx style="verb">@type</spanx> values that the server allows clients to create
  in this account (see "FileNode objects" below).  This <bcp14>MUST</bcp14>
  include "Directory" and "File".  It <bcp14>MAY</bcp14> include "SymLink" and
  any other value registered in the "JMAP FileNode Types"
  registry.  Clients <bcp14>MUST</bcp14> ignore values they do not recognise.</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 FileNode with <spanx style="verb">@type</spanx> "File".  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", "mediaType", "size", "created", "modified",
      "nodeType", "tree"
    ],
    "supportedNodeTypes": ["Directory", "File", "SymLink"],
    "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 Directory corresponds to
a collection and a File to 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>Every FileNode has a type, given by its <spanx style="verb">@type</spanx> property.  This
document defines three types: "File", "Directory", and "SymLink".
Each type has its own set of properties in addition to the
properties common to all FileNodes.</t>

<t>Properties that this document defines for one type <bcp14>MUST NOT</bcp14>
appear on a FileNode of another type; they are omitted rather
than set to null.  An attempt to create or update a FileNode
that sets a property not defined for its <spanx style="verb">@type</spanx> to a non-null
value is an "invalidProperties" error.  The server <bcp14>MUST</bcp14> ignore a
null value for such a property, both on create and on update.
This lets a client send the same set of properties for nodes of
any type.</t>

<t>FileNode/get has additional rules for these properties (see
"FileNode/get" below).</t>

<section anchor="common-properties"><name>Common properties</name>

<t>The following properties are defined for every FileNode,
regardless of its type:</t>

<t><list style="symbols">
  <t>@type: "String" (immutable)  <vspace blankLines='1'/>
The type of the node.  Values are registered in the "JMAP
  FileNode Types" registry (see IANA Considerations).  This
  document defines the values "File", "Directory", and
  "SymLink".  This <bcp14>MUST</bcp14> be provided on creation.  Attempting to
  change <spanx style="verb">@type</spanx> after creation is an "invalidProperties"
  error.  A server <bcp14>MUST</bcp14> reject the creation of a node with an
  <spanx style="verb">@type</spanx> that is not in the <spanx style="verb">supportedNodeTypes</spanx> capability
  with an "invalidProperties" error.  Clients <bcp14>MUST</bcp14> be prepared to receive nodes with
  <spanx style="verb">@type</spanx> values they do not recognise, and <bcp14>SHOULD NOT</bcp14>
  interpret any of their properties other than the common
  properties.</t>
  <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.  The parent <bcp14>MUST</bcp14> be a node whose <spanx style="verb">@type</spanx> permits
  children; of the types defined in this document, only
  "Directory" does.  Setting parentId to any other node is an
  "invalidProperties" error.</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>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>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, for example 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.  This is always false for nodes whose
<spanx style="verb">@type</spanx> does not permit children.</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">mediaType</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>
</list></t>

</section>
<section anchor="file-properties"><name>File properties</name>

<t>A FileNode with <spanx style="verb">@type</spanx> "File" is a regular file with blob
content.  In addition to the common properties, it has the
following properties:</t>

<t><list style="symbols">
  <t>blobId: "Id"  <vspace blankLines='1'/>
The blobId for the content of this file.  This <bcp14>MUST</bcp14> be
  provided on creation, including for zero byte files.
  Setting blobId to null is an "invalidProperties" error.
  Updating the blobId replaces the file'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>size: "UnsignedInt" (server-set)  <vspace blankLines='1'/>
The size in bytes of the associated blob data.  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>mediaType: "String" (default: "application/octet-stream")  <vspace blankLines='1'/>
The media type of the file.  If not provided on creation,
  the server sets it to "application/octet-stream".  Setting
  mediaType to null is an "invalidProperties" error.  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>executable: "Boolean" (default: false)  <vspace blankLines='1'/>
If true, the file should be treated as an executable by
  operating systems that support this flag.</t>
</list></t>

</section>
<section anchor="directory-properties"><name>Directory properties</name>

<t>A FileNode with <spanx style="verb">@type</spanx> "Directory" is a collection that may
contain child nodes.  In addition to the common properties, it
has the following property:</t>

<t><list style="symbols">
  <t>role: "String|null" (default: null)  <vspace blankLines='1'/>
An indication that this directory has a special role.  A
  directory 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="symlink-properties"><name>SymLink properties</name>

<t>A FileNode with <spanx style="verb">@type</spanx> "SymLink" is a symbolic link to another
path in the tree.  In addition to the common properties, it has
the following property:</t>

<t><list style="symbols">
  <t>target: "String[]"  <vspace blankLines='1'/>
The target path of the symlink, as an array of path
  elements.  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.  This <bcp14>MUST</bcp14> be provided on creation.  Setting
  target to null is an "invalidProperties" error.</t>
</list></t>

</section>
<section anchor="filenode-examples"><name>FileNode Examples</name>

<t>A directory, a file inside it, and a symlink pointing to the
file.  Common properties other than <spanx style="verb">@type</spanx>, <spanx style="verb">id</spanx>, <spanx style="verb">parentId</spanx>,
and <spanx style="verb">name</spanx> are omitted for brevity:</t>

<figure><sourcecode type="json"><![CDATA[
[
  {
    "@type": "Directory",
    "id": "n1",
    "parentId": null,
    "name": "Documents",
    "role": "documents"
  },
  {
    "@type": "File",
    "id": "n3",
    "parentId": "n1",
    "name": "report.pdf",
    "blobId": "Bfa61c0",
    "size": 48576,
    "mediaType": "application/pdf",
    "executable": false
  },
  {
    "@type": "SymLink",
    "id": "n7",
    "parentId": null,
    "name": "latest-report",
    "target": ["Documents", "report.pdf"]
  }
]
]]></sourcecode></figure>

</section>
</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 differences:</t>

<t><list style="symbols">
  <t>The <spanx style="verb">@type</spanx> property is always returned, even if it is not
included in the <spanx style="verb">properties</spanx> argument.</t>
  <t>If the <spanx style="verb">properties</spanx> argument includes a property that is
defined for some FileNode type but not for a node's <spanx style="verb">@type</spanx>,
the server omits that property from that node in the response.
It does not return the property with a null value.</t>
</list></t>

<t>There is one 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 uniqueness of sibling names 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'/>
Replacement does not depend on the <spanx style="verb">@type</spanx> of either node; a
 node of any type may replace a node of any other type.  <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.  <vspace blankLines='1'/>
If "unchanged", the operation proceeds as with "replace", but
 only if a precondition on the colliding node is satisfied.  The
 client supplies this precondition in the "ifUnchangedBy" argument
 (<xref target="JMAP-CONDITIONAL"/>).  The server matches it against the node
 that occupies the contested name at the start of the method,
 found by that node's current id: the server evaluates the
 "ifUnchangedBy" entry whose key is that id.  If "ifUnchangedBy"
 contains no entry for the occupant's id, or that entry's
 precondition is not satisfied, the server <bcp14>MUST NOT</bcp14> replace the
 node.  It rejects the operation as with null, and returns an
 "alreadyExists" error with the <spanx style="verb">existingId</spanx> of the surviving
 node.  This binds the replacement to the one node the client
 expected.  If a concurrent change has moved a different node into
 the contested name, its id does not match the supplied
 precondition.  The server then refuses the replacement, and does
 not destroy a node the client never saw.  As with "replace", if
 the node to replace is a Directory with children, the server <bcp14>MUST</bcp14>
 return a "nodeHasChildren" error unless onDestroyRemoveChildren
 is true; it <bcp14>MUST</bcp14> also include the id of the replaced node in the
 destroyed response list.  A server that does not support
 <xref target="JMAP-CONDITIONAL"/> <bcp14>MUST</bcp14> reject "unchanged" with an
 "invalidArguments" error.  <vspace blankLines='1'/>
If the existing node is not discoverable by the user (see
 "Access Control"), every value except "rename" fails with
 "forbidden": the server <bcp14>MUST NOT</bcp14> destroy or compare against
 that node, nor reveal its id.  Servers may return "forbidden"
 for other reasons, such as a file name policy, so it does not
 confirm that the name is taken.  <vspace blankLines='1'/>
"replace", "newest", and "unchanged" also require <spanx style="verb">mayDelete</spanx>
 on the existing node, and fail with "forbidden" without it.</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 a discoverable sibling FileNode, and onExists did not
resolve it.  The SetError object <bcp14>MUST</bcp14> include an <spanx style="verb">existingId</spanx>
property with the id of the existing FileNode.</t>
  <t>"forbidden" — a name collision with a sibling the user cannot
discover, or an onExists replacement without <spanx style="verb">mayDelete</spanx> (see
onExists above).</t>
  <t>"invalidProperties" — an attempt was made to move a node to a
descendant of itself, creating a cycle in the tree, to make a
node the child of a node whose <spanx style="verb">@type</spanx> does not permit
children, to change the <spanx style="verb">@type</spanx> of a node, or to set a
property that is not defined for the node's <spanx style="verb">@type</spanx> to a
non-null value.</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 whose <spanx style="verb">@type</spanx> is precisely
  this value match this condition.  This filter, and the
  <spanx style="verb">nodeType</spanx> sort property below, are named <spanx style="verb">nodeType</spanx> rather
  than <spanx style="verb">@type</spanx>; they operate on the <spanx style="verb">@type</spanx> property.</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 (for example, <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>mediaType: "String"  <vspace blankLines='1'/>
A FileNode must have exactly the same octets in its mediaType
  property to match the condition.</t>
  <t>mediaTypeMatch: "String"  <vspace blankLines='1'/>
Matches the <em>mediaType</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>mediaTypeMatch</em>.</t>
</list></t>

<t>The blobId, isExecutable, minSize, maxSize, mediaType,
mediaTypeMatch, and
body conditions match only nodes whose <spanx style="verb">@type</spanx> is "File".  The
role and hasAnyRole conditions match only nodes whose <spanx style="verb">@type</spanx> is
"Directory".  This applies to both true and false values.  For
example, a hasAnyRole condition of false matches only Directories
without a role, and an isExecutable condition of false matches
only Files that are not executable.</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 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 <spanx style="verb">@type</spanx>.  Directories sort first, then symlinks,
  then files, then nodes of any other <spanx style="verb">@type</spanx> ordered by the
  <spanx style="verb">@type</spanx> value.</t>
</list></t>

<t>When sorting by a property that is not defined for a node's
<spanx style="verb">@type</spanx> (for example <spanx style="verb">size</spanx> on a Directory), nodes without the
property sort before nodes that have it when isAscending is
true.  Nodes that lack the property are ordered among themselves
as if that Comparator were absent from the sort.</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 the content of a File directly via HTTP without using
FileNode/set.  The URL is constructed by expanding the template
with the FileNode id.  This is only valid for nodes with
<spanx style="verb">@type</spanx> "File"; requests targeting any other type of node <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 <spanx style="verb">mediaType</spanx> of the node.  If the request has no Content-Type
header, the server sets <spanx style="verb">mediaType</spanx> to "application/octet-stream".</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">mediaType</spanx> properties, and return an HTTP 200 response with a
JSON body:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "blobId": "Bnewblob123",
  "size": 48576,
  "mediaType": "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"/> (for example,
<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 server <bcp14>MUST NOT</bcp14> change the node's
<spanx style="verb">mediaType</spanx>.  A client that needs to change it uses PUT, or
updates <spanx style="verb">mediaType</spanx> with FileNode/set.  The response is an HTTP
200 with the same JSON body as PUT:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "blobId": "Bpatched456",
  "size": 49152,
  "mediaType": "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>For example, 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,
for a File, the <spanx style="verb">executable</spanx> property inform the <spanx style="verb">mode</spanx> field in the
archive entry (for example, 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's <spanx style="verb">@type</spanx> is "File".</t>
  <t>recurse: "Boolean" (default: false)
Only valid when the referenced FileNode's <spanx style="verb">@type</spanx> is
"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>A FileNode with <spanx style="verb">@type</spanx> "SymLink", whether referenced directly by
<spanx style="verb">nodeId</spanx> or reached by <spanx style="verb">recurse</spanx>, is added to the archive as an
entry with <spanx style="verb">entryType</spanx> "symlink".  The server never follows the
symlink.  The entry's <spanx style="verb">linkTarget</spanx> is the elements of the
SymLink's <spanx style="verb">target</spanx> joined with "/".  An absolute target, whose
first element is the empty string, therefore produces a
<spanx style="verb">linkTarget</spanx> that starts with "/".</t>

<t>Some archive formats cannot hold every node type.  For example,
"application/zip" has no symlink entries.  The ArchiveRecipe
(defined in <xref target="JMAP-BLOBEXT"/>) is extended with one additional
property that controls how the server handles such nodes:</t>

<t><list style="symbols">
  <t>onUnsupportedEntry: "String" (default: "error")
This applies to any node, referenced by <spanx style="verb">nodeId</spanx> or reached by
<spanx style="verb">recurse</spanx>, that the archive format cannot represent.  If
"error", the server rejects the Blob/convert creation with an
"unsupportedEntry" SetError, and creates no archive.  If
"skip", the server leaves such nodes out of the archive.  Any
other value is an "invalidProperties" error.</t>
</list></t>

<t>This property applies only to entries that the server builds
from FileNodes.  An entry that the client gives in full, with an
unsupported <spanx style="verb">entryType</spanx>, is still an "invalidProperties" error as
<xref target="JMAP-BLOBEXT"/> requires.</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"
The id of a FileNode with <spanx style="verb">@type</spanx> "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 FileNodes with
<spanx style="verb">@type</spanx> "Directory".  File entries become FileNodes with
<spanx style="verb">@type</spanx> "File" and 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.  <vspace blankLines='1'/>
Symlink entries become FileNodes with <spanx style="verb">@type</spanx> "SymLink" if
"SymLink" is in the <spanx style="verb">supportedNodeTypes</spanx> capability.  The
server splits the entry's <spanx style="verb">linkTarget</spanx> on "/" to produce the
<spanx style="verb">target</spanx> path elements.  A <spanx style="verb">linkTarget</spanx> that starts with "/"
produces an empty string as the first element, which marks an
absolute path.  The server drops any other empty elements.  <vspace blankLines='1'/>
An entry is unsupported if the server cannot create a FileNode
for it.  These are symlink entries when "SymLink" is not in
<spanx style="verb">supportedNodeTypes</spanx>, and entries of any type that has no
FileNode equivalent ("hardlink", "fifo", "blockDevice", and
"charDevice").  The <spanx style="verb">onUnsupportedEntry</spanx> property controls how
the server handles them.</t>
  <t>onUnsupportedEntry: "String" (default: "error")
If "error", the server rejects the Blob/convert creation with
an "unsupportedEntry" SetError, and creates no FileNodes.  If
"skip", the server does not create a FileNode for an
unsupported entry, and extracts the other entries as usual.  A
skipped entry still appears in the response <spanx style="verb">entries</spanx> array,
with a null <spanx style="verb">nodeId</spanx>.  Any other value is an
"invalidProperties" error.</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, or null if the server skipped the 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 anchor="the-unsupportedentry-error"><name>The unsupportedEntry Error</name>

<t>An "unsupportedEntry" SetError means that an archive or
extraction with <spanx style="verb">onUnsupportedEntry</spanx> set to "error" found one or
more entries that it could not handle.  The SetError object <bcp14>MUST</bcp14>
include an <spanx style="verb">entryNames</spanx> property: a "String[]" that lists the
<spanx style="verb">name</spanx> of each such entry.  For an archive, this is the name that
the entry would have had in the archive.</t>

</section>
</section>
<section anchor="extended-attributes-and-named-streams"><name>Extended Attributes and Named Streams</name>

<t>Operating systems associate named side-channel data with files: POSIX extended
attributes (getxattr/setxattr), macOS extended attributes (including Finder
tags and the quarantine flag) and resource forks, NTFS and SMB2 alternate data
streams, and NFSv4 named attributes.  A FileNode carries these using the JMAP
Object Metadata extension (<xref target="JMAP-METADATA"/>).  A server that supports named
attributes on FileNodes lists "FileNode" in the "dataTypes" of its
<spanx style="verb">urn:ietf:params:jmap:metadata</spanx> capability.  Clients then read and write the
attributes through the "metadata" property, and through the "privateMetadata"
property where the server sets <spanx style="verb">supportsPrivate</spanx>.  That extension adds both
properties to the FileNode object.  They are common properties, available on
FileNodes of every <spanx style="verb">@type</spanx>, because platforms also attach named attributes to
directories and symbolic links.</t>

<section anchor="the-xattr-namespace"><name>The "xattr" namespace</name>

<t>This document defines the "xattr" namespace for the "metadata" and
"privateMetadata" properties.  Its value is an object mapping an attribute name
to an <strong>XattrValue</strong> object.  The attribute name is the platform-native name of
the attribute or stream, stored verbatim (for example "user.comment",
"com.apple.metadata:_kMDItemUserTags", or "Zone.Identifier").  Servers and
clients <bcp14>MUST NOT</bcp14> normalise attribute names across platforms.  The server keeps
an attribute that one platform writes, even where another platform has no
equivalent for it.</t>

<t>An <strong>XattrValue</strong> object has the following properties:</t>

<t><list style="symbols">
  <t>data: "String|null"  <vspace blankLines='1'/>
The attribute value as a UTF-8 string.  Used for small textual attributes.</t>
  <t>blobId: "Id|null"  <vspace blankLines='1'/>
The blobId of a blob holding the attribute value.  Used for large or
  binary attributes (for example a resource fork, or a multi-kilobyte
  stream).  A blob referenced by an XattrValue <bcp14>MUST NOT</bcp14> be expired or garbage
  collected by the server while the FileNode references it, in the same way
  as the content blob of a File.</t>
  <t>type: "String|null" (default: null)  <vspace blankLines='1'/>
An optional media type (<xref target="MEDIATYPE"/>) for the attribute value.</t>
</list></t>

<t>An XattrValue <bcp14>MUST</bcp14> contain exactly one of "data" or "blobId"; providing both,
or neither, is an "invalidProperties" error.  Binary attributes small enough to
carry inline are still referenced by "blobId" rather than base64-encoded in
"data".</t>

<t>The value nests one object level below the namespace value (attribute name to
XattrValue).  A server that supports the "xattr" namespace <bcp14>MUST</bcp14> advertise a
"maxDepth" for FileNode of at least 1, or null (no limit).</t>

<t>Attributes shared with every reader of the node (for example a quarantine flag)
are stored under "metadata".  Attributes private to the current user (for
example that user's own tags) are stored under "privateMetadata" where the
server supports it.</t>

<t>Example — a small textual attribute and a large binary one:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "metadata": {
    "xattr": {
      "user.comment": { "data": "draft copy" },
      "com.apple.ResourceFork": {
        "blobId": "G_fork_9c2",
        "type": "application/octet-stream"
      }
    }
  }
}
]]></sourcecode></figure>

<t>To set or remove a single attribute without disturbing the others, a client
patches the path directly.  RFC 6901 escaping applies to any "/" or "~" in the
attribute name ("/" as "~1", "~" as "~0"):</t>

<figure><sourcecode type="json"><![CDATA[
[["FileNode/set", {
  "accountId": "u1",
  "update": {
    "f42": {
      "metadata/xattr/Zone.Identifier": { "data": "ZoneId=3" }
    }
  }
}, "0"]]
]]></sourcecode></figure>

<t>Setting an attribute's path to null removes it, following the "metadata" patch
semantics of <xref target="JMAP-METADATA"/>.</t>

</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 they send 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 (for example, "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">mediaType</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-error-codes-registration-for-unsupportedentry"><name>JMAP Error Codes registration for "unsupportedEntry"</name>

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

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

<t>Intended use: common</t>

<t>Change Controller: IETF</t>

<t>Description: An archive or extraction found entries that the archive format or the server cannot represent, and the client asked for an error rather than for the entries to be skipped.</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"/>).
A registration <bcp14>MUST</bcp14> reference a specification that defines the
properties specific to the type and whether nodes of the type
may have children.</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 anchor="jmap-metadata-namespace-registration-for-xattr"><name>JMAP Metadata Namespace Registration for "xattr"</name>

<t>IANA is requested to register the "xattr" namespace in the "JMAP Metadata
Namespaces" registry established by <xref target="JMAP-METADATA"/>:</t>

<t>Namespace Identifier: xattr</t>

<t>Value Type: <spanx style="verb">String[XattrValue]</spanx> — an object mapping an attribute name to an
XattrValue object, as defined in "Extended Attributes and Named Streams" of
this document.</t>

<t>Applicable Properties: metadata, privateMetadata</t>

<t>Applicable Data Types: FileNode</t>

<t>Reference: this document</t>

<t>Intended Usage: common</t>

<t>Change Controller: IETF</t>

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

<t><list style="symbols">
  <t>A name collision with an undiscoverable node returns "forbidden"
without <spanx style="verb">existingId</spanx>; only onExists "rename" proceeds.  (Thanks to
Mehdi Kouhen.)</t>
  <t>onExists replacement requires <spanx style="verb">mayDelete</spanx> on the existing node.</t>
</list></t>

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

<t><list style="symbols">
  <t>Replaced <spanx style="verb">nodeType</spanx> with an <spanx style="verb">@type</spanx> property
(File, Directory, SymLink).  Each type defines only the
properties relevant to it; properties of other types are
omitted rather than null.  <spanx style="verb">@type</spanx> is now required on
creation instead of being inferred.</t>
  <t>Moved <spanx style="verb">blobId</spanx>, <spanx style="verb">size</spanx>, <spanx style="verb">type</spanx>, and <spanx style="verb">executable</spanx> to File,
<spanx style="verb">role</spanx> to Directory, and <spanx style="verb">target</spanx> to SymLink.</t>
  <t>Renamed the File <spanx style="verb">type</spanx> property to <spanx style="verb">mediaType</spanx>, with a default
of "application/octet-stream", so that it is not confused with
<spanx style="verb">@type</spanx>.  Renamed the <spanx style="verb">type</spanx> and <spanx style="verb">typeMatch</spanx> filters to
<spanx style="verb">mediaType</spanx> and <spanx style="verb">mediaTypeMatch</spanx>, and the <spanx style="verb">type</spanx> sort property
to <spanx style="verb">mediaType</spanx>.</t>
  <t>Added the <spanx style="verb">supportedNodeTypes</spanx> capability.</t>
  <t>Removed the <spanx style="verb">X-FileNode-Type</spanx> header field.  A Direct HTTP Write
PATCH no longer changes <spanx style="verb">mediaType</spanx>; clients use PUT or FileNode/set.</t>
  <t>Defined how SymLinks are archived (as symlink entries, never
followed) and extracted (created as SymLinks if supported).</t>
  <t>Added <spanx style="verb">onUnsupportedEntry</spanx> ("error", the default, or "skip") to the
archive and extract recipes, for entries the archive format or the
server cannot represent, and the "unsupportedEntry" SetError.</t>
  <t>Defined the order among nodes that lack a sort property.</t>
  <t>Breaking change: the node type values changed from "file",
"directory", and "symlink" to "File", "Directory", and "SymLink".
Clients <bcp14>MUST</bcp14> now provide <spanx style="verb">@type</spanx> on creation.</t>
  <t>FileNode/get always returns <spanx style="verb">@type</spanx>, and omits requested
properties that are not defined for a node's <spanx style="verb">@type</spanx>.</t>
  <t>Query filters on type-specific properties now match only nodes
of that type, for both true and false values.  For example,
<spanx style="verb">hasAnyRole: false</spanx> no longer matches Files or SymLinks, and
<spanx style="verb">isExecutable: false</spanx> no longer matches Directories or SymLinks.</t>
  <t>Added "unchanged" value for <spanx style="verb">onExists</spanx>, replacing a colliding node only
when a precondition on that node, supplied via "ifUnchangedBy"
(<xref target="JMAP-CONDITIONAL"/>), is satisfied.  The precondition binds to the current
id of the node that occupies the contested name, so a client can only
replace the one node it expected.</t>
  <t>Added Extended Attributes and Named Streams: file nodes carry POSIX xattrs,
macOS extended attributes, NTFS/SMB alternate data streams, and NFSv4 named
attributes via the JMAP Object Metadata extension (<xref target="JMAP-METADATA"/>),
defining the "xattr" namespace (attribute name to an XattrValue holding
either inline "data" or a "blobId" for large/binary values).  Registered
the "xattr" namespace with IANA.</t>
  <t>Escaped bracket characters in "String[]" type signatures.</t>
  <t>Editorial: applied a subset of ASD-STE100 Simplified Technical English —
removed "e.g."/"i.e.", split over-long sentences (notably <spanx style="verb">onExists</spanx>
"unchanged"), and reworded noun clusters and idioms.  No normative change.</t>
</list></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="JMAP-CONDITIONAL">
   <front>
      <title>JMAP Conditional Set</title>
      <author fullname="Bron Gondwana" initials="B." surname="Gondwana">
         <organization>Fastmail</organization>
      </author>
      <date day="20" month="June" year="2026"/>
      <abstract>
	 <t>   The JMAP base protocol ([JMAP-CORE]) provides the Foo/set method for
   creating, updating, and destroying objects.  It offers a single
   concurrency control, the &quot;ifInState&quot; argument, which guards an entire
   object type: if any object of that type has changed, the whole method
   is rejected.

   This extension adds a finer, per-object conditional mechanism.  A
   client may require that an individual update or destroy proceed only
   if the target object still matches a set of expected property values,
   expressed using the JMAP PatchObject already defined for updates.
   This provides optimistic concurrency control scoped to a single
   object — the equivalent of an HTTP &quot;If-Match&quot; precondition — for any
   JMAP data type.

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


<reference anchor="JMAP-METADATA">
   <front>
      <title>JMAP Object Metadata</title>
      <author fullname="Mauro De Gennaro" initials="M." surname="De Gennaro">
         <organization>Stalwart Labs LLC</organization>
      </author>
      <date day="27" month="May" year="2026"/>
      <abstract>
	 <t>   This document defines an extension to the JSON Meta Application
   Protocol (JMAP) that lets clients and servers attach metadata to
   existing JMAP data types.  Each opted-in data type gains two new
   properties, metadata and privateMetadata, whose values are objects
   keyed by _namespace identifier_. A namespace identifier is either a
   name registered with IANA or a domain name controlled by the vendor
   providing the namespace; the latter allows vendors and applications
   to extend the metadata schema without prior coordination.  Because
   metadata is carried as a property on the related object, clients use
   the existing /get, /set, /changes, and /query methods to read,
   modify, and synchronize it.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-jmap-metadata-02"/>
   
</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="13" month="October" year="2026"/>
      <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-33"/>
   
</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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
AQIJKa70NmAZ3Jxkdigx/Sl73SWKdHhxPLi4PNnf24svcrjW3D36Elt9op0g
PimuUYVDXYtwiRl0L9u53unt9vKdbAdlEixRRfHiAyoAiByC06i2gIjB5V6Z
u0jB/e66bmtHqjvkDmi4WwJRnaGvUFzFcFNLSuk7KzkFkMLk+P0HJOBnIv4z
jdBaLusIxAMDPVVRWpvvces7urVA7LVaPgoPu5hCwq05wm55CxIMMDL7mxcH
ezGVoiiUdYDWOKfSlR2ZhghDuRhwdpOoXF6qDQMUVBWTQvcEPl//3RDMSRhI
SHq4bVdFdZk2xBxGtjVkK/zwATge2ANR4UnEh0PXU9ILy1tTUkZ8TT2USPi1
bX9JnMlBpBIJS3SDcD0c6qkZ1ELb3rHqUV7jRnbz2tua/xZwV4qGQCFF5Gxd
Lt0yaiOIiCGF1A+V7mIo6opPkhYclqJhcrliQR2z70Xho1+Douv+7LohZhon
3gooC8ozvjLXF4uRcWodUbrKxMCzHIUChEEWEbG2pEwStn22hYv0uXszWpy1
gKBwvcxT6q9EapwP3e/biEZhB1ON2rfrfADR9hnRriQdhuQa7kQgInDMujpQ
qKBK5fYD4+5ZBA7eDApRGmY0Na5NYh6JltV0FcaD+prkZ3hge3svlR6xfgdS
GN0bxlRSugmZmQAYhIYTpL6g+qheATcMWf79MNRpGHdAoQI1EvWVleqpnzVJ
aVygghpbU0dM7aa863RNg8DYAukDgQt1qms2ChkYoADtH/cxOKepWVurDdL9
APtGAcYXIJ/PUejUQBCHVkjOtMdzTZ2ciaAgbNHYqEIzSlcoT2uSUV45X5Ym
YKGo0tYpeTtrOp9ayovQSw0TAP10l5skxpKkTl2snAxm4KQG+763svfZNN53
tmzekdig8XjNAMI19KKqixOPFtnWy2cHzx8A89cM5kQ3eomuCdgo+zizsd2z
Cry2hCwbZt0IBiyadIZ9+Nz3rjvDCbfXkpXXAXrU0lrLt7YBBg1DTPNPGZ1t
qfkn2YyC47lXl5vk9dGHeP8ZqEXwfsXdYeFlABzatdEkuClO5olnAXSP0Ai7
hmlhDQA5uawDpNsERLcx1r9+AlIR/EHimYaX72qYuK+4dygawAD+pjh4mhBt
aWyeQfVdSqJy7C/Q2WBsqQXAwddJXkh2DjlsQTrM5AWzZGV5Qd+8EOIiArmK
hKpu+S6C8giMfFclVDWOJMmZeNGpfAkA253Ko9raKEKgchbUzvPkmcHDRJsF
USqkvH0/notd+dgDIcAuGikFxQQ+TJ257iZIJMnujFj3MVvV98/4PKT4ZXG8
ZBMhXSRnR1baC/oVaAHkL1CI9RAJe4a+cCt2/Rp0F0RQfmCx5GxYSlsIxIOy
MPHniDgiG8DmmKKfpsx/LsvFW9obQRjjRitqeMQtTCgqFvnhvZt+1gEzwXID
hUabiRB2ZH1T5BPWPNMexmXFsKtYDm3GiVCkLVNxzIW2h/HhCxQwDLejqCVg
iXq2XSczT0vDA9Jz5nIPnSqYfczA1UIM3o1ABilX35LfJXKtYo2YACkQgLrG
mwuFVzwx/QcQxXQjN+gwRnCdIoegkoogOzbsjSZ18gFsfGrFoK8wX/8rWu1X
2CH1K7h2KOSgcMW4xdr48PStDZupbWy5CSgWI1S6kmG2zYbVvnI5PLrkQlL0
ycUfhuenZ9/a+h2Y07BU7yNyLw22ty4GzvlXVD4rHWqYuDLbWyZ15pg8JWCm
4m43QSceBfL6AtTsSZWPQdP3V5cUgHlOzRS0MyUZG/DGSrsRWiIK4TUJWzJI
zJkpnsii/n709oGzEp3rSCr0wkz/AcobSggDhIsYfLEcBSW9yIEIPX6ADu4r
VZoCkSAZkEFKpqd73xRBGu4IJhxSWRsNgL4GYr8w/k4dZr0H0C1CPENSwubU
J87+lFXlgFJAKf38CUd3U24A5URSiigLuRpWJGRR0rZYUCH2rQzlSTzOP5II
8Mr7bIEalhVJbpKN3Y+vCrTGZOmpmsxdEaOUy/jsyEw1xpaQa6O+TzJ6EBgC
V40NQiW4pOQqzGXA5nrAka5Z/Y2i18CCXy8nH+vJTT9+lyyrEpAt/jYriqQq
MQB4cYN/NaiDDyuQbr9dzsYViJVYN/Usy2fxv2cFnBkQkXMgdVVaxhe4XZEy
55nLb3FWu+/kkL+lQwbEQxc1SJU/Y8ozh3F/jv4/tCQ3sPPvAAA=

-->

</rfc>

