<?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-15" category="std" consensus="true" submissionType="IETF" updates="8620" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="JMAP FileNode">JMAP File Storage extension</title>

    <author initials="B." surname="Gondwana" fullname="Bron Gondwana">
      <organization>Fastmail</organization>
      <address>
        <email>brong@fastmailteam.com</email>
      </address>
    </author>

    <date year="2026" month="October" day="16"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 41?>

<t>The JMAP base protocol (RFC8620) provides the ability to upload and download
arbitrary binary data.  This binary data is called a "blob", and can be used
in all other JMAP extensions.</t>

<t>This extension adds a method to expose blobs as a filesystem along with the
types of metadata that are provided by other remote filesystem protocols.</t>



    </abstract>



  </front>

  <middle>


<?line 50?>

<section anchor="introduction"><name>Introduction</name>

<t>JMAP (<xref target="JMAP-CORE"/> — JSON Meta Application Protocol) is a generic
protocol for synchronizing data between a client and a server.
It is optimized for mobile and web environments, and aims to
provide a consistent interface to different data types.</t>

<t>In the same way that JMAP Calendars (<xref target="JMAP-CALENDARS"/>) replaces
CalDAV (<xref target="CALDAV"/>) and JMAP Contacts (<xref target="JMAP-CONTACTS"/>) replaces
CardDAV (<xref target="CARDDAV"/>), this document replaces the use of WebDAV (<xref target="WEBDAV"/>)
for remote filesystem access.</t>

<section anchor="conventions-used-in-this-document"><name>Conventions Used in This Document</name>

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

<?line -18?>

</section>
</section>
<section anchor="addition-to-the-capabilities-object"><name>Addition to the Capabilities Object</name>

<t>The capabilities object is returned as part of the JMAP Session
object; see <xref target="JMAP-CORE"/>, Section 2.</t>

<t>This document defines an additional capability URI.</t>

<section anchor="urnietfparamsjmapfilenode"><name>urn:ietf:params:jmap:filenode</name>

<t>The capability <spanx style="verb">urn:ietf:params:jmap:filenode</spanx> being present in the
"accountCapabilities" property of an account represents support
for the FileNode datatype.  Servers that include the capability
in one or more "accountCapabilities" properties <bcp14>MUST</bcp14> also include
the property in the "capabilities" property.</t>

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

<t>The value of this property in an account's "accountCapabilities"
property is an object that <bcp14>MUST</bcp14> contain the following information
on server capabilities and permissions for that account:</t>

<t><list style="symbols">
  <t>maxFileNodeDepth: "UnsignedInt|null"  <vspace blankLines='1'/>
The maximum depth of the FileNode hierarchy (that is, one more than
  the maximum number of ancestors a FileNode may have), or null for
  no limit.</t>
  <t>maxSizeFileNodeName: "UnsignedInt"  <vspace blankLines='1'/>
The maximum length, in (UTF-8) octets, allowed for the name of a
  FileNode.  This <bcp14>MUST</bcp14> be at least 100, although it is recommended
  servers allow more.</t>
  <t>forbiddenNameChars: "String|null"  <vspace blankLines='1'/>
A string where each character is forbidden in FileNode names.
  If null, the server does not restrict name characters beyond
  the requirement that names be non-empty Net-Unicode strings.
  The server <bcp14>MUST</bcp14> reject names containing any of these
  characters with an "invalidProperties" error.</t>
  <t>forbiddenNodeNames: "String[]|null"  <vspace blankLines='1'/>
An array of complete names that the server will not accept
  as FileNode names, compared case-insensitively.  For
  example, <spanx style="verb">[".", "..", "CON", "PRN", "AUX", "NUL"]</spanx> would
  forbid common path-traversal names and Windows reserved
  device names.  If null, the server does not forbid any
  specific names.</t>
  <t>supportedNodeTypes: "String[]"  <vspace blankLines='1'/>
The <spanx style="verb">@type</spanx> values that the server allows clients to create
  in this account (see "FileNode objects" below).  This <bcp14>MUST</bcp14>
  include "Directory" and "File".  It <bcp14>MAY</bcp14> include "SymLink" and
  any other value registered in the "JMAP FileNode Types"
  registry.  Clients <bcp14>MUST</bcp14> ignore values they do not recognise.</t>
  <t>fileNodeQuerySortOptions: "String[]"  <vspace blankLines='1'/>
A list of all the values the server supports for the "property"
  field of the Comparator object in a "FileNode/query" sort (see
  "FileNode/query" below).  This <bcp14>MAY</bcp14> include properties the client does not
  recognise (for example, custom properties specified in a vendor
  extension).  Clients <bcp14>MUST</bcp14> ignore any unknown properties in the
  list.</t>
  <t>mayCreateTopLevelFileNode: "Boolean"  <vspace blankLines='1'/>
If true, the user may create a FileNode (see "FileNode/set" below) in this
 account with a null parentId.  (Permission for creating a child of
 an existing FileNode is given by the "myRights" property on that
 FileNode.)</t>
  <t>webTrashUrl: "String|null"  <vspace blankLines='1'/>
The URL at which the folder with the "trash" role can be viewed
  on the web.  If null, there is no web URL available.</t>
  <t>caseInsensitiveNames: "Boolean"  <vspace blankLines='1'/>
If true, the server treats file names as case-insensitive for
  all name collision checks, including the sibling uniqueness
  constraint and <spanx style="verb">onExists</spanx> handling.  The server preserves the
  original case as provided by the client.</t>
  <t>webUrlTemplate: "String|null"  <vspace blankLines='1'/>
A template by which any node can be viewed on the web, in URI
  Template (level 1) format <xref target="URI-TEMPLATE"/>.  The available
  variable is <spanx style="verb">{id}</spanx>, which is the FileNode id.  If null, there
  is no web URL available.</t>
  <t>webWriteUrlTemplate: "String|null"  <vspace blankLines='1'/>
A URI Template (level 1) <xref target="URI-TEMPLATE"/> for writing content
  to a FileNode with <spanx style="verb">@type</spanx> "File".  The available variable is <spanx style="verb">{id}</spanx>, which is
  the FileNode id.  If null, direct HTTP writes are not
  supported and clients must use FileNode/set to update content.
  See "Direct HTTP Write" below for the HTTP semantics.</t>
</list></t>

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

<figure><sourcecode type="json"><![CDATA[
{
  "urn:ietf:params:jmap:filenode": {
    "maxFileNodeDepth": 50,
    "maxSizeFileNodeName": 255,
    "fileNodeQuerySortOptions": [
      "name", "mediaType", "size", "created", "modified",
      "nodeType", "tree"
    ],
    "supportedNodeTypes": ["Directory", "File", "SymLink"],
    "forbiddenNameChars": "/<>:\"\\|?*",
    "forbiddenNodeNames": [".", "..", "CON", "PRN", "AUX",
      "NUL", "COM0", "COM1", "COM2", "COM3", "COM4", "COM5",
      "COM6", "COM7", "COM8", "COM9", "LPT0", "LPT1", "LPT2",
      "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9"
    ],
    "caseInsensitiveNames": false,
    "mayCreateTopLevelFileNode": false,
    "webTrashUrl": "https://files.example.com/trash",
    "webUrlTemplate": "https://files.example.com/view/{id}",
    "webWriteUrlTemplate": "https://files.example.com/write/{id}"
  }
}
]]></sourcecode></figure>

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

<t>A FileNode is a set of metadata which behaves similarly to an inode in
a filesystem.  In <xref target="WEBDAV"/> terminology a Directory corresponds to
a collection and a File to a resource.</t>

<t>The following JMAP Methods are selected by the
<spanx style="verb">urn:ietf:params:jmap:filenode</spanx> capability.</t>

<section anchor="filenode-objects"><name>FileNode objects</name>

<t>Every FileNode has a type, given by its <spanx style="verb">@type</spanx> property.  This
document defines three types: "File", "Directory", and "SymLink".
Each type has its own set of properties in addition to the
properties common to all FileNodes.</t>

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

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

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

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

<t><list style="symbols">
  <t>@type: "String" (immutable)  <vspace blankLines='1'/>
The type of the node.  Values are registered in the "JMAP
  FileNode Types" registry (see IANA Considerations).  This
  document defines the values "File", "Directory", and
  "SymLink".  This <bcp14>MUST</bcp14> be provided on creation.  Attempting to
  change <spanx style="verb">@type</spanx> after creation is an "invalidProperties"
  error.  A server <bcp14>MUST</bcp14> reject the creation of a node with an
  <spanx style="verb">@type</spanx> that is not in the <spanx style="verb">supportedNodeTypes</spanx> capability
  with an "invalidProperties" error.  Clients <bcp14>MUST</bcp14> be prepared to receive nodes with
  <spanx style="verb">@type</spanx> values they do not recognise, and <bcp14>SHOULD NOT</bcp14>
  interpret any of their properties other than the common
  properties.</t>
  <t>id: "Id" (immutable; server-set)  <vspace blankLines='1'/>
The Id of the FileNode.</t>
  <t>parentId: "Id|null"  <vspace blankLines='1'/>
The Id of the parent node, or null if this is a top level
  node.  The parent <bcp14>MUST</bcp14> be a node whose <spanx style="verb">@type</spanx> permits
  children; of the types defined in this document, only
  "Directory" does.  Setting parentId to any other node is an
  "invalidProperties" error.</t>
  <t>name: "String"  <vspace blankLines='1'/>
User-visible name for the FileNode.  This <bcp14>MUST</bcp14> be a
  Net-Unicode string <xref target="UNICODE"/> of at least 1 character in length,
  subject to the maximum size given in the capability object.  There
  <bcp14>MUST NOT</bcp14> be two sibling FileNodes with both the same parent and
  the same name.  The server <bcp14>MUST</bcp14> reject names containing any
  character listed in <spanx style="verb">forbiddenNameChars</spanx>, or matching any
  entry in <spanx style="verb">forbiddenNodeNames</spanx> (case-insensitively), with an
  "invalidProperties" error.  See Implementation Considerations
  for guidance on which characters and names to forbid.</t>
  <t>created: "UTCDate" (default: current server time)  <vspace blankLines='1'/>
The date the node was created.</t>
  <t>modified: "UTCDate|null" (default: current server time)  <vspace blankLines='1'/>
The date the node was last updated.  The server does not
  automatically update this value.  If the client does not
  include <spanx style="verb">modified</spanx> in an update, the server <bcp14>MUST</bcp14> leave it
  unchanged.  If the client sets <spanx style="verb">modified</spanx> to null, the
  server <bcp14>MUST</bcp14> set it to the current server time.  See
  Implementation Considerations for usage guidance.</t>
  <t>accessed: "UTCDate|null" (default: current server time)  <vspace blankLines='1'/>
The date the node was last accessed.  As with <spanx style="verb">modified</spanx>,
  the server does not automatically update this value; clients
  <bcp14>SHOULD</bcp14> provide an updated value when appropriate.  If not
  included in an update, the server <bcp14>MUST</bcp14> leave it unchanged.
  If set to null, the server <bcp14>MUST</bcp14> set it to the current server
  time.</t>
  <t>changed: "UTCDate" (server-set)  <vspace blankLines='1'/>
The date the server last recorded a change to any property
  of this node.  The server <bcp14>MUST</bcp14> automatically update this
  value whenever any property of the node is modified,
  including <spanx style="verb">blobId</spanx>, <spanx style="verb">name</spanx>, <spanx style="verb">parentId</spanx>, <spanx style="verb">shareWith</spanx>,
  <spanx style="verb">executable</spanx>, and all other mutable properties.  This is
  not settable by clients.</t>
  <t>isSubscribed: "Boolean" (default: true)  <vspace blankLines='1'/>
This property is stored per user, and if true, the node should
  be displayed to the current user.  Some servers may not allow
  this field to be changed for some or all nodes, for example only for
  directories, or only for nodes on which the shareWith ACL is
  actually set for this user, not nodes which inherit their ACL
  from a parent.</t>
  <t>myRights: "FilesRights" (server-set)  <vspace blankLines='1'/>
The set of rights (ACLs) the user has in relation to this
  node.  A <strong>FilesRights</strong> object has the following properties:  <list style="symbols">
      <t>mayRead: <spanx style="verb">Boolean</spanx> The user may read the properties and
blob content of this node.</t>
      <t>mayAddChildren: <spanx style="verb">Boolean</spanx> The user may create child nodes
in this directory.  This is always false for nodes whose
<spanx style="verb">@type</spanx> does not permit children.</t>
      <t>mayRename: <spanx style="verb">Boolean</spanx> The user may rename or move this node.</t>
      <t>mayDelete: <spanx style="verb">Boolean</spanx> The user may destroy this node.</t>
      <t>mayModifyContent: <spanx style="verb">Boolean</spanx> The user may update the
content-related properties of this node (<spanx style="verb">blobId</spanx>, <spanx style="verb">mediaType</spanx>,
<spanx style="verb">target</spanx>, <spanx style="verb">modified</spanx>, <spanx style="verb">accessed</spanx>, <spanx style="verb">executable</spanx>).</t>
      <t>mayShare: <spanx style="verb">Boolean</spanx> The user may change the sharing of this
node (see <xref target="JMAP-SHARING"/>).</t>
    </list></t>
  <t>shareWith: "Id[FilesRights]|null"  <vspace blankLines='1'/>
A map of userId to rights for users this node is shared with.
  The owner of the node <bcp14>MUST NOT</bcp14> be in this set.  This is <spanx style="verb">null</spanx>
  if the user requesting the object does not have
  <spanx style="verb">myRights.mayShare</spanx>, or if the node is not shared with anyone.</t>
</list></t>

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

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

<t><list style="symbols">
  <t>blobId: "Id"  <vspace blankLines='1'/>
The blobId for the content of this file.  This <bcp14>MUST</bcp14> be
  provided on creation, including for zero byte files.
  Setting blobId to null is an "invalidProperties" error.
  Updating the blobId replaces the file's content; the server
  <bcp14>MUST</bcp14> update <spanx style="verb">size</spanx> to match the new blob.  A blob referenced
  by a FileNode <bcp14>MUST NOT</bcp14> be expired or garbage collected by the
  server while the FileNode exists.</t>
  <t>size: "UnsignedInt" (server-set)  <vspace blankLines='1'/>
The size in bytes of the associated blob data.  Size is
  optional on create and update, but if provided it <bcp14>MUST</bcp14> match
  the size of the provided blobId.  If the client updates
  <spanx style="verb">blobId</spanx> without providing <spanx style="verb">size</spanx>, the server sets <spanx style="verb">size</spanx>
  from the new blob and returns the size in the "updated"
  response.</t>
  <t>mediaType: "String" (default: "application/octet-stream")  <vspace blankLines='1'/>
The media type of the file.  If not provided on creation,
  the server sets it to "application/octet-stream".  Setting
  mediaType to null is an "invalidProperties" error.  Valid values are found in the IANA media-types
  registry.  Servers <bcp14>MUST NOT</bcp14> reject media types that are not
  recognised.  Servers <bcp14>MUST</bcp14> reject media types if the value
  does not conform to the ABNF of <xref target="MEDIATYPE"/> Section 4.2.</t>
  <t>executable: "Boolean" (default: false)  <vspace blankLines='1'/>
If true, the file should be treated as an executable by
  operating systems that support this flag.</t>
</list></t>

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

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

<t><list style="symbols">
  <t>role: "String|null" (default: null)  <vspace blankLines='1'/>
An indication that this directory has a special role.  A
  directory with the "root" role should have a null parentId.
  Clients <bcp14>MUST</bcp14> ignore unrecognised role values.  Values are
  registered in the "JMAP FileNode Roles" registry (see IANA
  Considerations).</t>
</list></t>

</section>
<section anchor="symlink-properties"><name>SymLink properties</name>

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

<t><list style="symbols">
  <t>target: "String[]"  <vspace blankLines='1'/>
The target path of the symlink, as an array of path
  elements.  Each element is a node name in the path.  An
  empty string as the first element indicates an absolute
  path from the root of the tree; otherwise the path is
  relative to the symlink's parent.  An element of ".." refers
  to the parent directory.  The target is not required to
  resolve to an existing node (symlinks may dangle).  The
  target is mutable; updating it changes where the symlink
  points.  This <bcp14>MUST</bcp14> be provided on creation.  Setting
  target to null is an "invalidProperties" error.</t>
</list></t>

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

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

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

</section>
</section>
<section anchor="filenode-methods"><name>FileNode Methods</name>

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

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

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

<t>There is one additional request argument:</t>

<t><list style="symbols">
  <t>fetchParents: "Boolean" (default: false)  <vspace blankLines='1'/>
If true, the server returns all ancestor nodes of the
  requested ids in addition to the requested nodes themselves.
  This allows a client to reconstruct the full path to each
  requested node in a single call.  Ancestor nodes that have
  already been included (either because they were explicitly
  requested or because they are ancestors of multiple requested
  nodes) are not duplicated.  The ancestors are returned as
  additional entries in the <spanx style="verb">list</spanx> array.</t>
</list></t>

</section>
<section anchor="filenodechanges"><name>FileNode/changes</name>

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

</section>
<section anchor="filenodeset"><name>FileNode/set</name>

<t>This is a standard Foo/set method, with the following differences:</t>

<t>Since parentId creates a tree structure, an attempt to move a node
to a parent for which this node is also an ancestor is an error,
and an <spanx style="verb">invalidProperties</spanx> error will be returned.</t>

<t>A server <bcp14>MUST</bcp14> order creation and deletion operations within a
single FileNode/set such that the uniqueness of sibling names is
retained at the end of the transaction, but
replacing an existing file can be done atomically.</t>

<t>There are these additional top level arguments:</t>

<t><list style="symbols">
  <t>onDestroyRemoveChildren: "Boolean" (default: <spanx style="verb">false</spanx>)  <vspace blankLines='1'/>
If false, an attempt to destroy a FileNode which is the parentId
 of another FileNode will be rejected with a <spanx style="verb">nodeHasChildren</spanx>
 error.  NOTE: if all the child nodes are being destroyed in the
 same operation, then the server <bcp14>MUST NOT</bcp14> return this error.
 Servers <bcp14>MUST</bcp14> either sort the destroys children before parents,
 or only check this constraint on the final state, remembering
 that JMAP <spanx style="verb">set</spanx> operations must be atomic.  <vspace blankLines='1'/>
If true, then all child nodes will also be destroyed when a
 node is destroyed.  When deleting child nodes, the server <bcp14>MUST</bcp14>
 include the ids of all deleted nodes in the method response.</t>
  <t>onExists: "String|null" (default: null)  <vspace blankLines='1'/>
If null, an attempt to create or update a FileNode which would
 cause a name collision will be rejected by the server with an
 "alreadyExists" error.  <vspace blankLines='1'/>
If "replace", the existing item will be destroyed.  In this
 case, the server <bcp14>MUST</bcp14> include the id of the replaced item in
 the destroyed response list.  NOTE: if the replaced item is a
 Directory which has children, then the server <bcp14>MUST</bcp14> respond with
 a nodeHasChildren error to this action unless
 onDestroyRemoveChildren is true.  <vspace blankLines='1'/>
Replacement does not depend on the <spanx style="verb">@type</spanx> of either node; a
 node of any type may replace a node of any other type.  <vspace blankLines='1'/>
If "rename", the server will change the "name" field to not
 clash, using an algorithm of its choice.  If the server changes
 the name, it <bcp14>MUST</bcp14> include the new "name" value in the created
 or updated response field for this id.  <vspace blankLines='1'/>
If "newest", the server compares the <spanx style="verb">modified</spanx> timestamp of
 the incoming item with that of the existing FileNode.  If the
 incoming item has a strictly later <spanx style="verb">modified</spanx> value, the
 existing node is destroyed and the operation proceeds as with
 "replace".  Otherwise the operation is rejected as with null,
 returning an "alreadyExists" error with the <spanx style="verb">existingId</spanx> of the
 surviving node.  <vspace blankLines='1'/>
If "unchanged", the operation proceeds as with "replace", but
 only if a precondition on the colliding node is satisfied.  The
 client supplies this precondition in the "ifUnchangedBy" argument
 (<xref target="JMAP-CONDITIONAL"/>).  The server matches it against the node
 that occupies the contested name at the start of the method,
 found by that node's current id: the server evaluates the
 "ifUnchangedBy" entry whose key is that id.  If "ifUnchangedBy"
 contains no entry for the occupant's id, or that entry's
 precondition is not satisfied, the server <bcp14>MUST NOT</bcp14> replace the
 node.  It rejects the operation as with null, and returns an
 "alreadyExists" error with the <spanx style="verb">existingId</spanx> of the surviving
 node.  This binds the replacement to the one node the client
 expected.  If a concurrent change has moved a different node into
 the contested name, its id does not match the supplied
 precondition.  The server then refuses the replacement, and does
 not destroy a node the client never saw.  As with "replace", if
 the node to replace is a Directory with children, the server <bcp14>MUST</bcp14>
 return a "nodeHasChildren" error unless onDestroyRemoveChildren
 is true; it <bcp14>MUST</bcp14> also include the id of the replaced node in the
 destroyed response list.  A server that does not support
 <xref target="JMAP-CONDITIONAL"/> <bcp14>MUST</bcp14> reject "unchanged" with an
 "invalidArguments" error.</t>
  <t>compareCaseInsensitively: "Boolean" (default: false)  <vspace blankLines='1'/>
If true, name collision checks (including <spanx style="verb">onExists</spanx> handling)
 treat names as case-insensitive for this request.  This has no
 effect if the server already has <spanx style="verb">caseInsensitiveNames</spanx> set to
 true in its capability.  This allows clients syncing to
 case-insensitive platforms to prevent name collisions that
 would be problematic on those platforms.</t>
</list></t>

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

<t><list style="symbols">
  <t>"alreadyExists" — a create or update would cause a name collision
with an existing sibling FileNode, and onExists is null.  The
SetError object <bcp14>MUST</bcp14> include an <spanx style="verb">existingId</spanx> property with the id
of the existing FileNode.</t>
  <t>"invalidProperties" — an attempt was made to move a node to a
descendant of itself, creating a cycle in the tree, 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-15</strong></t>

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

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

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

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

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

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

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

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

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

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

<t><list style="symbols">
  <t>Added ExtractRecipe parentNodeId extension for extracting
archives directly into FileNode trees.</t>
</list></t>

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

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

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

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

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

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

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

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

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

<t><list style="symbols">
  <t>Renamed onDuplicate to onExists for name alignment</t>
  <t>added "role" for directories</t>
  <t>added a "TODO" for putting more restrictions on node names</t>
  <t>changed hasParentId to isTopLevel with reversed boolean meaning</t>
</list></t>

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

<t><list style="symbols">
  <t>Documented that blobId, size, and type are immutable after creation.</t>
  <t>Documented that creating a file and deleting the old copy of the file within a transaction is legal.</t>
  <t>Added onDuplicate top-level option for FileNode/set, giving both "rename" and "replace" options.</t>
  <t>Updated the definition of shareWith to say that the keys of the hash are Ids, not arbitrary strings</t>
</list></t>

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

<t><list style="symbols">
  <t>Added 'text' and 'body' searches (added JMAP-MAIL reference as additional information for body search)</t>
  <t>Updated JMAP-CONTACTS and JMAP-SHARING references to published RFC numbers rather than draft names</t>
  <t>Noted that the server <bcp14>MUST</bcp14> included the nodeids of deleted child nodes.</t>
  <t>Added isSubscribed</t>
  <t>Renamed mayAdmin to mayShare to align with other specs</t>
  <t>Described the inheritance of ACLs</t>
</list></t>

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

<t><list style="symbols">
  <t>Convert to Kramdown-RFC format (no intentional changes)</t>
</list></t>

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

<t><list style="symbols">
  <t>Refreshing draft only</t>
</list></t>

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

<t><list style="symbols">
  <t>upload as a working group document</t>
</list></t>

<t><strong>draft-gondwana-jmap-filenode-01</strong></t>

<t><list style="symbols">
  <t>require a blobId for the zero-byte file</t>
  <t>make size also null for collections</t>
  <t>add more to the TODO section</t>
  <t>bikeshed; FileNode</t>
  <t>correct UTCDate, UnsignedInt, and normalised UTF-8.</t>
  <t>add some fields to the capabilities object</t>
</list></t>

<t><strong>draft-gondwana-jmap-filenode-00</strong></t>

<t><list style="symbols">
  <t>initial proposal</t>
</list></t>

</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>Ben Bucksch, Mauro De Gennaro, Seph Gentle, Arnt Gulbradson, Neil Jenkins, Ricardo Signes, and members of the JMAP Working Group at IETF.</t>

<t>{backmatter}</t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="JMAP-CORE">
  <front>
    <title>The JSON Meta Application Protocol (JMAP)</title>
    <author fullname="N. Jenkins" initials="N." surname="Jenkins"/>
    <author fullname="C. Newman" initials="C." surname="Newman"/>
    <date month="July" year="2019"/>
    <abstract>
      <t>This document specifies a protocol for clients to efficiently query, fetch, and modify JSON-based data objects, with support for push notification of changes and fast resynchronisation and for out-of- band binary data upload/download.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8620"/>
  <seriesInfo name="DOI" value="10.17487/RFC8620"/>
</reference>

<reference anchor="JMAP-SHARING">
  <front>
    <title>JSON Meta Application Protocol (JMAP) Sharing</title>
    <author fullname="N. Jenkins" initials="N." role="editor" surname="Jenkins"/>
    <date month="November" year="2024"/>
    <abstract>
      <t>This document specifies a data model for sharing data between users using the JSON Meta Application Protocol (JMAP). Future documents can reference this document when defining data types to support a consistent model of sharing.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9670"/>
  <seriesInfo name="DOI" value="10.17487/RFC9670"/>
</reference>

<reference anchor="MEDIATYPE">
  <front>
    <title>Media Type Specifications and Registration Procedures</title>
    <author fullname="N. Freed" initials="N." surname="Freed"/>
    <author fullname="J. Klensin" initials="J." surname="Klensin"/>
    <author fullname="T. Hansen" initials="T." surname="Hansen"/>
    <date month="January" year="2013"/>
    <abstract>
      <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="13"/>
  <seriesInfo name="RFC" value="6838"/>
  <seriesInfo name="DOI" value="10.17487/RFC6838"/>
</reference>

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

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


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

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

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

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


<reference anchor="JMAP-CONDITIONAL">
   <front>
      <title>JMAP Conditional Set</title>
      <author fullname="Bron Gondwana" initials="B." surname="Gondwana">
         <organization>Fastmail</organization>
      </author>
      <date day="20" month="June" year="2026"/>
      <abstract>
	 <t>   The JMAP base protocol ([JMAP-CORE]) provides the Foo/set method for
   creating, updating, and destroying objects.  It offers a single
   concurrency control, the &quot;ifInState&quot; argument, which guards an entire
   object type: if any object of that type has changed, the whole method
   is rejected.

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

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


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

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-jmap-metadata-02"/>
   
</reference>

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

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




    </references>

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



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

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

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


<reference anchor="JMAP-CALENDARS">
   <front>
      <title>JSON Meta Application Protocol (JMAP) for Calendars</title>
      <author fullname="Neil Jenkins" initials="N." surname="Jenkins">
         <organization>Fastmail</organization>
      </author>
      <author fullname="Michael Douglass" initials="M." surname="Douglass">
         <organization>Spherical Cow Group</organization>
      </author>
      <date day="13" month="October" year="2026"/>
      <abstract>
	 <t>   This document specifies a data model for synchronizing calendar data
   with a server using JMAP.  Clients can use this to efficiently read,
   write, and share calendars and events, receive push notifications for
   changes or event reminders, and keep track of changes made by others
   in a multi-user environment.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-jmap-calendars-33"/>
   
</reference>

<reference anchor="JMAP-CONTACTS">
  <front>
    <title>JSON Meta Application Protocol (JMAP) for Contacts</title>
    <author fullname="N. Jenkins" initials="N." role="editor" surname="Jenkins"/>
    <date month="December" year="2024"/>
    <abstract>
      <t>This document specifies a data model for synchronising contact data with a server using the JSON Meta Application Protocol (JMAP).</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9610"/>
  <seriesInfo name="DOI" value="10.17487/RFC9610"/>
</reference>

<reference anchor="JMAP-QUOTAS">
  <front>
    <title>JSON Meta Application Protocol (JMAP) for Quotas</title>
    <author fullname="R. Cordier" initials="R." role="editor" surname="Cordier"/>
    <date month="June" year="2023"/>
    <abstract>
      <t>This document specifies a data model for handling quotas on accounts with a server using the JSON Meta Application Protocol (JMAP).</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9425"/>
  <seriesInfo name="DOI" value="10.17487/RFC9425"/>
</reference>

<reference anchor="WEBDAV">
  <front>
    <title>HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)</title>
    <author fullname="L. Dusseault" initials="L." role="editor" surname="Dusseault"/>
    <date month="June" year="2007"/>
    <abstract>
      <t>Web Distributed Authoring and Versioning (WebDAV) consists of a set of methods, headers, and content-types ancillary to HTTP/1.1 for the management of resource properties, creation and management of resource collections, URL namespace manipulation, and resource locking (collision avoidance).</t>
      <t>RFC 2518 was published in February 1999, and this specification obsoletes RFC 2518 with minor revisions mostly due to interoperability experience. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4918"/>
  <seriesInfo name="DOI" value="10.17487/RFC4918"/>
</reference>

<reference anchor="UNICODE">
  <front>
    <title>Unicode Format for Network Interchange</title>
    <author fullname="J. Klensin" initials="J." surname="Klensin"/>
    <author fullname="M. Padlipsky" initials="M." surname="Padlipsky"/>
    <date month="March" year="2008"/>
    <abstract>
      <t>The Internet today is in need of a standardized form for the transmission of internationalized "text" information, paralleling the specifications for the use of ASCII that date from the early days of the ARPANET. This document specifies that format, using UTF-8 with normalization and specific line-ending sequences. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5198"/>
  <seriesInfo name="DOI" value="10.17487/RFC5198"/>
</reference>




    </references>

</references>



  </back>

<!-- ##markdown-source:
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
SwtS5c+Y9cuRzJ+j/w808fKSc+wAAA==

-->

</rfc>

