<?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-17" 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="18"/>

    
    
    <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>As in <xref target="JMAP-CORE"/> Section 5.3, setting a property that has a
default value to null, on create or update, sets it to that
default, unless the property's description says otherwise.</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,
  or if set to null, the server sets it to
  "application/octet-stream".  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-17</strong></t>

<t><list style="symbols">
  <t>Setting a property with a default to null resets it to that
default (as in RFC 8620), for example <spanx style="verb">created</spanx> to the current
server time and <spanx style="verb">isSubscribed</spanx> to true.</t>
  <t>Setting <spanx style="verb">mediaType</spanx> to null now resets it to
"application/octet-stream" rather than being an error.
(Thanks to Mark Atwood.)</t>
</list></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>Mark Atwood, Ben Bucksch, Mauro De Gennaro, Seph Gentle, Arnt Gulbradson, Neil Jenkins, Mehdi Kouhen, 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="17" month="October" year="2026"/>
      <abstract>
	 <t>   This document defines an extension to the JSON Meta Application
   Protocol (JMAP) that lets clients and servers attach metadata to
   objects of existing JMAP data types.  Each data type the server lists
   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-03"/>
   
</reference>

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

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




    </references>

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



<reference anchor="CALDAV">
  <front>
    <title>Calendaring Extensions to WebDAV (CalDAV)</title>
    <author fullname="C. Daboo" initials="C." surname="Daboo"/>
    <author fullname="B. Desruisseaux" initials="B." surname="Desruisseaux"/>
    <author fullname="L. Dusseault" initials="L." surname="Dusseault"/>
    <date month="March" year="2007"/>
    <abstract>
      <t>This document defines extensions to the Web Distributed Authoring and Versioning (WebDAV) protocol to specify a standard way of accessing, managing, and sharing calendaring and scheduling information based on the iCalendar format. This document defines the "calendar-access" feature of CalDAV. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4791"/>
  <seriesInfo name="DOI" value="10.17487/RFC4791"/>
</reference>

<reference anchor="CARDDAV">
  <front>
    <title>CardDAV: vCard Extensions to Web Distributed Authoring and Versioning (WebDAV)</title>
    <author fullname="C. Daboo" initials="C." surname="Daboo"/>
    <date month="August" year="2011"/>
    <abstract>
      <t>This document defines extensions to the Web Distributed Authoring and Versioning (WebDAV) protocol to specify a standard way of accessing, managing, and sharing contact information based on the vCard format. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6352"/>
  <seriesInfo name="DOI" value="10.17487/RFC6352"/>
</reference>

<reference anchor="JMAP-MAIL">
  <front>
    <title>The JSON Meta Application Protocol (JMAP) for Mail</title>
    <author fullname="N. Jenkins" initials="N." surname="Jenkins"/>
    <author fullname="C. Newman" initials="C." surname="Newman"/>
    <date month="August" year="2019"/>
    <abstract>
      <t>This document specifies a data model for synchronising email data with a server using the JSON Meta Application Protocol (JMAP). Clients can use this to efficiently search, access, organise, and send messages, and to get push notifications for fast resynchronisation when new messages are delivered or a change is made in another client.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8621"/>
  <seriesInfo name="DOI" value="10.17487/RFC8621"/>
</reference>


<reference anchor="JMAP-CALENDARS">
   <front>
      <title>JSON Meta Application Protocol (JMAP) for Calendars</title>
      <author fullname="Neil Jenkins" initials="N." surname="Jenkins">
         <organization>Fastmail</organization>
      </author>
      <author fullname="Michael Douglass" initials="M." surname="Douglass">
         <organization>Spherical Cow Group</organization>
      </author>
      <date day="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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
8p+j/w/1EJck6vEAAA==

-->

</rfc>

