<?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-19" 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="28"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 42?>

<t>The JMAP base protocol (RFC 8620) 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 FileNode data type and methods 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 52?>

<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 section="2" sectionFormat="of" target="JMAP-CORE"/>.</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 data type.  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>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 recognize.</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 recognize (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.  If false, creating
  a node with a null parentId, or moving one there, fails with
  "forbidden": the request is valid, but not allowed.  (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": "/<>:\"\\|?*",
    "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 <spanx style="verb">urn:ietf:params:jmap:filenode</spanx> capability selects the
FileNode data type and the methods defined below.</t>

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

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

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

<t>As in <xref section="5.3" sectionFormat="of" target="JMAP-CORE"/>, setting a property that has a
default value to null, on create or update, sets it to that
default, unless the property's description says otherwise.</t>

<t>FileNode/get has additional rules for these properties (see
"FileNode/get" below).  In particular, for a node the user can
discover but not read, it returns null for most properties, even
those whose type does not otherwise allow null (see "Access
Control").</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 recognize,
  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> with an
  "invalidProperties" error.  It <bcp14>MAY</bcp14> also reject other names it
  cannot store, such as "." and "..", in the same way.  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, except on a Direct HTTP Write
  (see "Direct HTTP Write").  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>
</list></t>

</section>
<section anchor="container-properties"><name>Container Properties</name>

<t>The following properties are defined for every FileNode whose
<spanx style="verb">@type</spanx> permits children; of the types defined in this document,
only "Directory" does.  They do not appear on other nodes, whose
rights come from their parent (see "Access Control").</t>

<t><list style="symbols">
  <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.  Setting it changes only the
  current user's value, and requires no rights beyond being able
  to discover the node.</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 all properties and
the blob content of this node.  Without it, some properties
are still visible (see "Access Control").</t>
      <t>mayAddChildren: <spanx style="verb">Boolean</spanx> The user may create child nodes
in this directory, or move nodes into it.</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.
  This is the access control list set on this node only; rights
  inherited from ancestors do not appear in it (see "Access
  Control").  The owner of the node <bcp14>MUST NOT</bcp14> be in this set.
  This is <spanx style="verb">null</spanx> if the user requesting the object does not have
  <spanx style="verb">myRights.mayShare</spanx>, or if the node is not shared with anyone.</t>
</list></t>

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

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

<t><list style="symbols">
  <t>blobId: "Id"  <vspace blankLines='1'/>
The blobId for the content of this file.  This <bcp14>MUST</bcp14> be
  provided on creation, including for zero byte files.
  Setting blobId to null is an "invalidProperties" error.
  Updating the blobId replaces the file's content; the server
  <bcp14>MUST</bcp14> update <spanx style="verb">size</spanx> to match the new blob.  A blob referenced
  by a FileNode <bcp14>MUST NOT</bcp14> be expired or garbage collected by the
  server while the FileNode exists.</t>
  <t>size: "UnsignedInt" (server-set)  <vspace blankLines='1'/>
The size in bytes of the associated blob data.  Size is
  optional on create and update, but if provided it <bcp14>MUST</bcp14> match
  the size of the provided blobId.  If the client updates
  <spanx style="verb">blobId</spanx> without providing <spanx style="verb">size</spanx>, the server sets <spanx style="verb">size</spanx>
  from the new blob and returns the size in the "updated"
  response.</t>
  <t>mediaType: "String" (default: "application/octet-stream")  <vspace blankLines='1'/>
The media type of the file.  If not provided on creation,
  or if set to null, the server sets it to
  "application/octet-stream".  Valid values are found in the
  IANA media-types registry.  Servers <bcp14>MUST NOT</bcp14> reject media
  types that are not recognized.  Servers <bcp14>MUST</bcp14> reject media
  types if the value does not conform to the ABNF of
  <xref section="4.2" sectionFormat="of" target="MEDIATYPE"/>.</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 unrecognized 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>
  <t>For a node the user can discover but not read, the server
returns null for most properties (see "Access Control").</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 rejected
with an "invalidProperties" error.</t>

<t>Within a single FileNode/set, the server <bcp14>MUST</bcp14> check the uniqueness
of sibling names against the result of all its creates, updates
and destroys together, so that a client can destroy a node and
create its replacement in the same method.</t>

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

<t><list style="symbols">
  <t>onDestroyRemoveChildren: "Boolean" (default: false)  <vspace blankLines='1'/>
If false, an attempt to destroy a FileNode that has children is
  rejected with a "nodeHasChildren" error.  If all the children
  are destroyed in the same method, the server <bcp14>MUST NOT</bcp14> return
  this error: it either destroys children before their parents,
  or checks this constraint only against the final state.  <vspace blankLines='1'/>
If true, destroying a node also destroys all its descendants,
  and the server <bcp14>MUST</bcp14> include the ids of all of them in the
  "destroyed" list of the response.</t>
  <t>onExists: "String|null" (default: null)  <vspace blankLines='1'/>
Controls what happens when a create or update would give a
  FileNode the same name as an existing sibling.  <vspace blankLines='1'/>
If null, the server rejects the create or update with an
  "alreadyExists" error.  <vspace blankLines='1'/>
If "replace", the server destroys the existing node, and <bcp14>MUST</bcp14>
  include its id in the "destroyed" list of the response.  A node
  of any <spanx style="verb">@type</spanx> may replace a node of any other <spanx style="verb">@type</spanx>.  <vspace blankLines='1'/>
If "rename", the server changes the "name" property so that it
  does not clash, using an algorithm of its choice, and <bcp14>MUST</bcp14>
  include the new name in the "created" or "updated" entry for
  that id.  <vspace blankLines='1'/>
Any other value is rejected with an "invalidArguments" error.  <vspace blankLines='1'/>
"replace" destroys whichever node holds the name when the method
  runs.  To replace only the node it expects, a client instead
  destroys that node and creates the new one in the same
  FileNode/set, with an "ifUnchangedBy" precondition
  (<xref target="JMAP-CONDITIONAL"/>) on the node it destroys.  <vspace blankLines='1'/>
For "replace", the server makes these checks in order, and
  stops at the first that fails:  <list style="numbers" type="1">
      <t>If the existing node is not discoverable by the user (see
"Access Control"), the operation fails with "forbidden", and
the server <bcp14>MUST NOT</bcp14> destroy that node or reveal its id.
Servers may also return "forbidden" for other reasons, such
as a file name policy, so the error does not confirm that the
name is taken.</t>
      <t>If the user does not have <spanx style="verb">mayDelete</spanx> on the existing node,
the operation fails with "forbidden".</t>
      <t>If the existing node has children, the operation fails with
"nodeHasChildren" if onDestroyRemoveChildren is false, or
with "forbidden" if replacing it would remove nodes the user
cannot discover (see "Access Control").</t>
    </list>
"rename" applies whether or not the user can discover the
  existing node.</t>
  <t>compareCaseInsensitively: "Boolean" (default: false)  <vspace blankLines='1'/>
If true, name collision checks (including <spanx style="verb">onExists</spanx> handling)
  treat names as case-insensitive for this request.  This has no
  effect if the server already has <spanx style="verb">caseInsensitiveNames</spanx> set to
  true in its capability.  This allows clients syncing to
  case-insensitive platforms to prevent name collisions that
  would be problematic on those platforms.</t>
</list></t>

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

<t><list style="symbols">
  <t>"alreadyExists" — a create or update would cause a name collision
with a discoverable sibling FileNode, and onExists did not
resolve it.  The SetError object <bcp14>MUST</bcp14> include an <spanx style="verb">existingId</spanx>
property with the id of the existing FileNode.</t>
  <t>"forbidden" — among other cases: a name collision with a sibling
the user cannot discover; an onExists replacement without the
required rights on the existing node (see onExists above); a
destroy that would remove nodes the user cannot discover; a
rename, move or destroy without the rights it needs, or of a
Directory with a role; or a create or move to the top level
without <spanx style="verb">mayCreateTopLevelFileNode</spanx> (see "Access Control").</t>
  <t>"invalidProperties" — among other cases: an attempt 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 or onExists replacement of a
FileNode that has children, with onDestroyRemoveChildren false.</t>
</list></t>

</section>
<section anchor="filenodecopy"><name>FileNode/copy</name>

<t>This is a standard Foo/copy method with the same additional
top-level arguments as FileNode/set (onDestroyRemoveChildren,
onExists, and compareCaseInsensitively), with the same behavior.</t>

<t>The response has one additional property:</t>

<t><list style="symbols">
  <t>destroyed: "Id[]|null"  <vspace blankLines='1'/>
The ids of the FileNodes in the destination account that were
  destroyed because onExists replaced them, including any
  descendants removed with onDestroyRemoveChildren.  This is
  null if no FileNodes were destroyed.</t>
</list></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 is one additional request argument:</t>

<t><list style="symbols">
  <t>depth: "UnsignedInt|null" (default: null)  <vspace blankLines='1'/>
The maximum depth in the tree, counted from the top level, at
  which a node can match: nodes with a null parentId are at depth
  0, their children at depth 1, and so on.  This applies whatever
  the filter; conditions such as <spanx style="verb">parentId</spanx> and <spanx style="verb">ancestorId</spanx> only
  select among the nodes within it, and depth is never counted
  from them.  So <spanx style="verb">ancestorId</spanx> without <spanx style="verb">depth</spanx> matches the whole
  subtree.  If null, there is no limit.</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 true, 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 letter from "a" to "z"; <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 <xref section="4.4.1" sectionFormat="of" 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'/>
Matches a node if the <em>body</em> condition with this value
  matches, or if its name or mediaType contains this value,
  compared case-insensitively.</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>For a node the user can discover but not read, a condition on a
property that FileNode/get returns as null for that node (see
"Access Control") does not match the node, whatever its value.
The body condition, and the body part of the text condition,
never match such a node.</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.</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), or that FileNode/get
returns as null because the user cannot read the node (see
"Access Control"), 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, which also takes the
<spanx style="verb">depth</spanx> argument of FileNode/query, with the same meaning.</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 400 (Bad Request).  A request for a node that does
not exist, or that the user cannot discover, <bcp14>MUST</bcp14> be rejected with
404 (Not Found).</t>

<t>The user <bcp14>MUST</bcp14> have <spanx style="verb">mayModifyContent</spanx> on the node, which for a File
is in its parent's <spanx style="verb">myRights</spanx> (see "Access Control").  Requests
without it <bcp14>MUST</bcp14> be rejected with 403 (Forbidden).  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 type and subtype of the
Content-Type header field set the <spanx style="verb">mediaType</spanx> of the node; the
server does not store any parameters (such as "charset").  If the
request has no Content-Type header field, 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 set <spanx style="verb">modified</spanx> to the current
server time (a PUT cannot carry a client timestamp; a client that
wants a different one sets it with FileNode/set afterwards).  It
returns 200 (OK) 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, and set <spanx style="verb">modified</spanx> to the current server time,
as for PUT.  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 200 (OK) 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 415 (Unsupported Media Type).</t>

</section>
<section anchor="integrity"><name>Integrity</name>

<t>A PUT or PATCH request <bcp14>MAY</bcp14> carry <spanx style="verb">Repr-Digest</spanx> or <spanx style="verb">Content-Digest</spanx>
header fields <xref target="DIGEST-FIELDS"/> for the data it sends: for PUT, the
new content of the node; for PATCH, the patch.  The server <bcp14>MUST</bcp14>
verify each digest whose algorithm it supports.  If any does not
match, the server <bcp14>MUST</bcp14> respond with 400 (Bad Request) and <bcp14>MUST NOT</bcp14>
change the node.  As <xref target="DIGEST-FIELDS"/> describes, a digest whose algorithm
the server does not support is ignored.  The algorithms a server
supports are those in the <spanx style="verb">supportedDigestAlgorithms</spanx> capability of
<xref target="JMAP-BLOBEXT"/>, which lists them in the server's order of
preference; clients <bcp14>SHOULD</bcp14> use the first one they support.</t>

<t>A client can ask for a digest of the node's new content by sending
<spanx style="verb">Want-Repr-Digest</spanx> <xref target="DIGEST-FIELDS"/>.  On success, for each
algorithm it lists that the server supports, the server <bcp14>SHOULD</bcp14>
include a member named "digest:" followed by the algorithm name
(for example "digest:sha-256") in the JSON response body, holding
the base64-encoded digest of the node's new content, as Blob/get
does in <xref target="JMAP-BLOBEXT"/>.  The digest is in the body because any
digest header fields on the response describe the response body
itself, not the node.  This lets a client confirm the result of a
PATCH, or of a PUT whose digest it did not send, without a further
request.</t>

<figure><sourcecode type="json"><![CDATA[
{
  "blobId": "Bpatched456",
  "size": 49152,
  "mediaType": "text/plain",
  "digest:sha-256": "lu2dEm1cr1Hg2GqVDXMTGP3sgQfFYyp8XUd2ZTgp5Qc="
}
]]></sourcecode></figure>

</section>
</section>
<section anchor="access-control"><name>Access Control</name>

<t>Access control lists are set with <spanx style="verb">shareWith</spanx>, which only nodes
whose <spanx style="verb">@type</spanx> permits children can have.  Rights are inherited
down the tree: a node's <spanx style="verb">myRights</spanx> is the union of the rights
granted to the user by the <spanx style="verb">shareWith</spanx> entries on the node and on
all its ancestors.  Inherited rights are a floor.  A <spanx style="verb">shareWith</spanx>
entry on a descendant can grant a user more rights on that
subtree, but it cannot take away rights granted higher up.</t>

<t>A node whose <spanx style="verb">@type</spanx> does not permit children has no <spanx style="verb">myRights</spanx>.
The user's rights on it are those in its parent's <spanx style="verb">myRights</spanx>;
<spanx style="verb">mayAddChildren</spanx> and <spanx style="verb">mayShare</spanx> do not apply to it.  Such a node
with a null parentId is discoverable only by the account owner,
who has all rights on it.</t>

<t>To rename or move a node the server checks <spanx style="verb">mayRename</spanx>, and to
destroy it <spanx style="verb">mayDelete</spanx>, in the rights of the node itself; for a
node with no <spanx style="verb">myRights</spanx>, these are its parent's rights.  Moving a
node also requires <spanx style="verb">mayAddChildren</spanx> on the new parent, or
<spanx style="verb">mayCreateTopLevelFileNode</spanx> to move it to the top level.  Without
these rights, the operation fails with "forbidden".</t>

<t>A Directory with a role cannot be destroyed, renamed or moved; the
server rejects any attempt with "forbidden".  This does not change
the rights it reports in <spanx style="verb">myRights</spanx>, which its children with no
<spanx style="verb">myRights</spanx> of their own take as theirs: files in a directory with
the "trash" role, for example, can still be destroyed.</t>

<t>A change to <spanx style="verb">shareWith</spanx> on a node is a change to every node in
its subtree: the server <bcp14>MUST</bcp14> report all of them as changed in
FileNode/changes, including nodes that have no <spanx style="verb">myRights</spanx> of their
own and take their rights from their parent.  A client therefore
learns the new rights of everything below a node whose sharing
changed from FileNode/changes alone, without working out which
nodes are affected itself.</t>

<t>Nodes which are not "discoverable" <bcp14>MUST</bcp14> be reported in <spanx style="verb">notFound</spanx>
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 or a descendant of the node has a <spanx style="verb">shareWith</spanx>
entry that grants the user any right.</t>
</list></t>

<t>When a node stops being discoverable by the user, for example
because a <spanx style="verb">shareWith</spanx> entry was removed, the server reports it as
destroyed in FileNode/changes.</t>

<t>A node that is discoverable only through the second rule has
mayRead false.  It is visible so that the user can use the
rights granted on it, and can see the full path to the nodes
they have access to.  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>For a node that is discoverable but does not have <spanx style="verb">mayRead</spanx>,
FileNode/get returns the real values of <spanx style="verb">id</spanx>, <spanx style="verb">@type</spanx>, <spanx style="verb">name</spanx>,
<spanx style="verb">parentId</spanx>, <spanx style="verb">myRights</spanx>, <spanx style="verb">isSubscribed</spanx>, and <spanx style="verb">shareWith</spanx> (which
follows its own rule for <spanx style="verb">mayShare</spanx>).  It returns null for every
other property defined for the node's <spanx style="verb">@type</spanx>, including
<spanx style="verb">created</spanx>, <spanx style="verb">changed</spanx>, and <spanx style="verb">role</spanx>, even where that property's type
does not otherwise allow null.  A change to a property the user
sees as null is not visible to the user, so the server <bcp14>SHOULD NOT</bcp14>
report the node as updated in FileNode/changes because of it, but
<bcp14>MAY</bcp14> do so if it cannot efficiently determine whether any property
visible to the user changed.</t>

<t>Such a node can have descendants the user cannot discover.  A
destroy that would remove any of them, either through
onDestroyRemoveChildren or as part of a node replaced through
onExists, <bcp14>MUST</bcp14> be rejected with "forbidden", and the server <bcp14>MUST
NOT</bcp14> destroy any node in that subtree.  Without
onDestroyRemoveChildren, destroying such a node while it has
children fails with "nodeHasChildren" whether or not the user can
discover those children.</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 home directory layout where Alice has shared
her "forBob" directory, Bob might see:</t>

<figure><sourcecode type="artwork"><![CDATA[
/home
  /alice
    /shared
      /forBob
        file1.jpg
        file2.txt
        ...
  /bob
    bobfile.txt
    ...
]]></sourcecode></figure>

<t>Alice sees many more files and directories under "/home".</t>

<t>Sharing can make large changes to the set of nodes a user can see:
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 FileNode
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:blob2</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"  <vspace blankLines='1'/>
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 user's rights on the
  FileNode (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)  <vspace blankLines='1'/>
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")  <vspace blankLines='1'/>
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 "notFound" SetError.</t>

<section anchor="examples"><name>Examples</name>

<t>To archive an entire directory tree rooted at FileNode
"dirabc" into a zip file:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "account1",
  "create": {
    "myarchive": {
      "archive": {
        "type": "application/zip",
        "entries": [{
          "nodeId": "dirabc",
          "name": "/",
          "recurse": true
        }]
      }
    }
  }
}, "R1"]]
]]></sourcecode></figure>

<t>To archive specific files from different locations along with
a full subdirectory:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "account1",
  "create": {
    "selective": {
      "archive": {
        "type": "application/zip",
        "entries": [
          {
            "nodeId": "filenode1",
            "name": "README.txt"
          },
          {
            "nodeId": "dirnode2",
            "name": "docs/",
            "recurse": true
          }
        ]
      }
    }
  }
}, "R1"]]
]]></sourcecode></figure>

</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"  <vspace blankLines='1'/>
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")  <vspace blankLines='1'/>
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)  <vspace blankLines='1'/>
Controls the behavior 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 "alreadyExists" SetError,
  "replace" destroys the existing node, and "rename" gives the new
  node a server-chosen name.</t>
</list></t>

<t>When <spanx style="verb">parentNodeId</spanx> is set, each ArchiveEntry in the response
<spanx style="verb">entries</spanx> array includes an additional <spanx style="verb">nodeId</spanx> property
containing the id of the FileNode that was created for that
entry, 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 ("notFound",
"invalidProperties", or "forbidden").</t>

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

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

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "account1",
  "create": {
    "e1": {
      "extract": {
        "blobId": "Barchive123",
        "type": "application/zip",
        "parentNodeId": "dir456"
      }
    }
  }
}, "R1"]]
]]></sourcecode></figure>

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

<figure><sourcecode type="json"><![CDATA[
[["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"]]
]]></sourcecode></figure>

</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 the attribute's value.  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> normalize 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 attribute value whose bytes are valid UTF-8 <bcp14>MAY</bcp14> be a String holding that
text.  Any other value <bcp14>MUST</bcp14> be a Binary value as defined in <xref target="JMAP-METADATA"/>
(for example "com.apple.FinderInfo", a binary plist, or a resource fork).
The server returns a value in the form the client stored it.</t>

<t>Attribute values are ordinary metadata: they count against the size limits
and quota of <xref target="JMAP-METADATA"/>, and are copied, shared and protected by the
rules there like any other namespace value.  A server rejects an attribute
too large for its limits with the errors <xref target="JMAP-METADATA"/> defines, so a
large named stream such as a resource fork can only be stored where the
server's limits allow it.</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 textual attribute and a binary one:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "metadata": {
    "xattr": {
      "user.comment": "draft copy",
      "com.apple.FinderInfo": {
        "@type": "Binary",
        "base64": "VEVYVHR0eHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
      }
    }
  }
}
]]></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":
        "[ZoneTransfer]\r\nZoneId=3\r\n"
    }
  }
}, "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 changing
the content of 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>Renaming or moving a node does not change its <spanx style="verb">modified</spanx> time, as
on common local filesystems.  The server <bcp14>MUST NOT</bcp14> change <spanx style="verb">modified</spanx>
for an update that does not include it, and a client <bcp14>SHOULD NOT</bcp14>
include <spanx style="verb">modified</spanx> in an update that only renames or moves a node
unless it intends to change it (for example by setting it to null).</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 (<xref section="1.4" sectionFormat="of" target="JMAP-CORE"/>) 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>

<t>A server <bcp14>MAY</bcp14> store timestamps with less precision than a client
sends, down to whole seconds.  It then truncates the value it
stores, and returns the stored value in FileNode/get, so a client
can learn the precision in use.  Clients comparing a local time
with a server timestamp (for example to recognize their own
changes) need to allow for this.  Comparisons the server makes
between timestamps use the stored precision.</t>

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

<t>Servers should set <spanx style="verb">forbiddenNameChars</spanx> to include characters
that are problematic for their storage backend and for the
broadest set of clients, and may reject names that are
problematic (see "name" in "Common Properties").</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 reject the
names <spanx style="verb">.</spanx> and <spanx style="verb">..</spanx>.  Clients that sync to platforms with further
restrictions, such as the Windows reserved names, need to handle
those names locally, since other clients may create them.</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 reject the names <spanx style="verb">.</spanx> and <spanx style="verb">..</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>A user who can destroy a node, but cannot discover all of its
descendants, can still learn that the node has children: the
destroy fails with "nodeHasChildren", or with "forbidden" when
onDestroyRemoveChildren is true.  Any failure reveals this.
The alternatives would be to reveal the ids of the hidden nodes,
or to destroy data the user cannot see, and both are worse.</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 its descendants
undiscoverable to the affected users, unless a descendant is
also shared with them directly, which may be surprising if
those users had been actively working with the shared files.</t>

</section>
<section anchor="extended-attributes"><name>Extended Attributes</name>

<t>Some extended attributes carry security meaning on the platform that
reads them.  On Linux, "security.capability" grants capabilities to an
executable, "security.selinux" sets its security label, and attributes
under "trusted." and "system." (such as "system.posix_acl_access") change
privileges or access control.  Anyone with write access to a node can set
these values, so a client that restores them lets that user change
privileges on the client's machine.  Clients <bcp14>MUST NOT</bcp14> apply attributes
whose names begin with "security.", "trusted." or "system." to local files
unless explicitly configured to by the local administrator.</t>

<t>Other attributes mark files as downloaded from an untrusted source, such
as "com.apple.quarantine" on macOS and the "Zone.Identifier" stream on
Windows, and the platform warns before such a file is opened.  A client
that drops these markers when it syncs a file lets the file bypass that
warning, so clients <bcp14>SHOULD</bcp14> preserve them.  A client <bcp14>SHOULD NOT</bcp14> treat the
absence of a marker as evidence that a file is safe: any user with write
access to the node can remove it.</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: A FileNode could not be destroyed or replaced because it has children, and the client did not ask for them to be destroyed too.</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'>Children</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>File</c>
      <c>A regular file with blob content</c>
      <c>No</c>
      <c>this document</c>
      <c>Directory</c>
      <c>A collection that may contain child nodes</c>
      <c>Yes</c>
      <c>this document</c>
      <c>SymLink</c>
      <c>A symbolic link to another path in the tree</c>
      <c>No</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"/>).  The Designated Expert
checks that a new role is not already covered by an existing one,
and that its description says which directory a client should
give it.</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[String|Binary]</spanx> — an object mapping an attribute name to
its value, 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="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-19</strong></t>

<t><list style="symbols">
  <t>The query <spanx style="verb">depth</spanx> argument is counted from the top level of the
account (top-level nodes are at depth 0), whatever the filter, and
absent or null now means no limit rather than "do not recurse".
FileNode/queryChanges takes it too.</t>
  <t>Renaming, moving or destroying a node checks <spanx style="verb">mayRename</spanx> or
<spanx style="verb">mayDelete</spanx> on the node itself, which for a node without
<spanx style="verb">myRights</spanx> are its parent's rights.  Moving also needs
<spanx style="verb">mayAddChildren</spanx> on the new parent.  A Directory with a role
cannot be destroyed, renamed or moved, without changing the
rights it reports.</t>
  <t>A node that stops being discoverable is reported as destroyed in
FileNode/changes.</t>
  <t><spanx style="verb">isSubscribed</spanx> is per user, and setting it needs no rights beyond
discovering the node.</t>
  <t>A <spanx style="verb">shareWith</spanx> change <bcp14>MUST</bcp14> be reported as a change to every node in
the subtree, including nodes without <spanx style="verb">myRights</spanx>, so clients need
not work out which nodes it affects.</t>
  <t>Removed the <spanx style="verb">forbiddenNodeNames</spanx> capability: it could not
express the names that matter (such as "CON.txt"), clients did
not use it, and a server can reject names it cannot store
regardless.</t>
  <t>Removed the "newest" and "unchanged" values of <spanx style="verb">onExists</spanx>.
"newest" compared client clocks and was easily mistaken for a
content precondition.  "unchanged" duplicated, and conflicted
with, <xref target="JMAP-CONDITIONAL"/>: to replace a node only if it is the
one expected, a client destroys it and creates the replacement in
one FileNode/set, with an "ifUnchangedBy" precondition on the
destroy.  <xref target="JMAP-CONDITIONAL"/> is now an informative reference.</t>
  <t>Creating or moving a node to the top level without
<spanx style="verb">mayCreateTopLevelFileNode</spanx> fails with "forbidden".</t>
  <t>Direct HTTP Write PUT and PATCH set <spanx style="verb">modified</spanx> to the current
server time.</t>
  <t>Direct HTTP Write accepts <spanx style="verb">Repr-Digest</spanx> and <spanx style="verb">Content-Digest</spanx>
<xref target="DIGEST-FIELDS"/> on PUT and PATCH, rejecting a mismatch, and
returns digests of the new content requested with
<spanx style="verb">Want-Repr-Digest</spanx>.</t>
  <t>Fixed the blob capability name in the ArchiveEntry text to
<spanx style="verb">urn:ietf:params:jmap:blob2</spanx>, matching <xref target="JMAP-BLOBEXT"/>.</t>
  <t>Renaming or moving a node does not change its <spanx style="verb">modified</spanx> time;
the guidance to update <spanx style="verb">modified</spanx> now applies to content changes.</t>
  <t>A server may store timestamps with less precision than clients
send, down to whole seconds, truncating and returning the stored
value.</t>
  <t>Direct HTTP Write digests use the algorithms listed in the
<spanx style="verb">supportedDigestAlgorithms</spanx> capability of <xref target="JMAP-BLOBEXT"/>, and
clients use the first one they support.</t>
  <t>The "xattr" namespace maps an attribute name directly to its
value: a String for UTF-8 text, or a <xref target="JMAP-METADATA"/> Binary
value.  Removed XattrValue and its "blobId", so attribute values
are ordinary metadata and the metadata quota, copy and access
rules apply to them.  Removed the <spanx style="verb">maxDepth</spanx> requirement, which
was wrong under <xref target="JMAP-METADATA"/>'s depth rules.</t>
  <t>Added security considerations for extended attributes that grant
privileges and for download markers.</t>
  <t>Direct HTTP Write returns 404 for a node that does not exist or
is not discoverable, and <spanx style="verb">mayModifyContent</spanx> for a File is its
parent's.  The <spanx style="verb">modified</spanx> definition notes that Direct HTTP Write
sets it.</t>
  <t>Direct HTTP Write PUT sets <spanx style="verb">mediaType</spanx> from the type and subtype
of Content-Type only, without parameters.</t>
  <t>The <spanx style="verb">text</spanx> query condition matches name and mediaType by
substring rather than as a glob.</t>
  <t>Added a children column to the "JMAP FileNode Types" registry,
and guidance for the Designated Expert of the "JMAP FileNode
Roles" registry.</t>
  <t><xref target="JMAP-BLOBEXT"/> and <xref target="JMAP-CONDITIONAL"/> now reference the
working group drafts.  <xref target="JMAP-MAIL"/>, <xref target="JMAP-QUOTAS"/> and
<xref target="UNICODE"/> are normative references.</t>
  <t>Removed the TODO section, and made editorial fixes throughout:
American spelling, error codes and section references written
consistently, heading case, and list formatting.</t>
</list></t>

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

<t><list style="symbols">
  <t><spanx style="verb">isSubscribed</spanx>, <spanx style="verb">myRights</spanx>, and <spanx style="verb">shareWith</spanx> are defined only for
nodes whose <spanx style="verb">@type</spanx> permits children.  Other nodes take their
rights from their parent, so a sharing change no longer marks
every descendant File as changed.</t>
  <t><spanx style="verb">shareWith</spanx> is the access control list on that node only;
<spanx style="verb">myRights</spanx> is the union of the lists on the node and its
ancestors, so a descendant cannot narrow inherited rights.</t>
  <t>A node with a <spanx style="verb">shareWith</spanx> entry for the user, or with such a
descendant, is discoverable.</t>
  <t>Defined which properties FileNode/get returns for a node that
is discoverable but not readable, and how FileNode/query
filters and sorts treat it; body never matches it.</t>
  <t>A destroy that would remove undiscoverable nodes fails with
"forbidden".</t>
  <t>onExists checks rights before comparing against the existing
node; "newest" and "unchanged" also require <spanx style="verb">mayRead</spanx>.</t>
  <t>FileNode/copy returns a <spanx style="verb">destroyed</spanx> list for nodes replaced
through onExists.</t>
</list></t>

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

<t><list style="symbols">
  <t>Setting a property with a default to null resets it to that
default (as in RFC 8620), for example <spanx style="verb">created</spanx> to the current
server time and <spanx style="verb">isSubscribed</spanx> to true.</t>
  <t>Setting <spanx style="verb">mediaType</spanx> to null now resets it to
"application/octet-stream" rather than being an error.
(Thanks to Mark Atwood.)</t>
</list></t>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<t>{backmatter}</t>

</section>


  </middle>

  <back>


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

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



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

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

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

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

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


<reference anchor="JMAP-BLOBEXT">
   <front>
      <title>JMAP Blob Management</title>
      <author fullname="Bron Gondwana" initials="B." surname="Gondwana">
         <organization>Fastmail</organization>
      </author>
      <date day="14" month="October" year="2026"/>
      <abstract>
	 <t>   The JSON Meta Application Protocol (JMAP) base protocol ([JMAP-CORE])
   provides the ability to upload and download arbitrary binary data via
   HTTP POST and GET on a defined endpoint.  This binary data is called
   a &quot;blob&quot;.

   This extension adds additional ways to create and access blobs by
   making inline method calls within a standard JMAP request.  It also
   adds a reverse lookup mechanism to discover where blobs are
   referenced within other data types, support for large blobs via
   chunked construction with server-side optimisation, and server-side
   blob conversion operations including image format conversion, archive
   creation and extraction, compression and decompression, and delta/
   patch operations.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-jmap-blobext-02"/>
   
</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="19" month="October" year="2026"/>
      <abstract>
	 <t>   This document defines an extension to the JSON Meta Application
   Protocol (JMAP) that lets clients and servers attach metadata to
   objects of existing JMAP data types.  Each data type the server lists
   gains two new properties, metadata and privateMetadata, whose values
   are objects keyed by _namespace identifier_. A namespace identifier
   is either a name registered with IANA or a domain name controlled by
   the vendor providing the namespace; the latter allows vendors and
   applications to extend the metadata schema without prior
   coordination.  Because metadata is carried as a property on the
   related object, clients use the existing /get, /set, /changes, and
   /query methods to read, modify, and synchronize it.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-jmap-metadata-04"/>
   
</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-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="DIGEST-FIELDS">
  <front>
    <title>Digest Fields</title>
    <author fullname="R. Polli" initials="R." surname="Polli"/>
    <author fullname="L. Pardue" initials="L." surname="Pardue"/>
    <date month="February" year="2024"/>
    <abstract>
      <t>This document defines HTTP fields that support integrity digests. The Content-Digest field can be used for the integrity of HTTP message content. The Repr-Digest field can be used for the integrity of HTTP representations. Want-Content-Digest and Want-Repr-Digest can be used to indicate a sender's interest and preferences for receiving the respective Integrity fields.</t>
      <t>This document obsoletes RFC 3230 and the Digest and Want-Digest HTTP fields.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9530"/>
  <seriesInfo name="DOI" value="10.17487/RFC9530"/>
</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>

<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-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-CONDITIONAL">
   <front>
      <title>JMAP Conditional Set</title>
      <author fullname="Bron Gondwana" initials="B." surname="Gondwana">
         <organization>Fastmail</organization>
      </author>
      <date day="26" month="October" 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.

   This extension also defines an optional &quot;atomic&quot; argument that
   applies an entire Foo/set as a single unit: either every change it
   requests takes effect, or none does.  Combined with the per-object
   precondition, this lets a client express a multi-object change that
   is safe only when applied together — such as an atomic rename that
   exchanges two names.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-jmap-conditional-02"/>
   
</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="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>




    </references>

</references>



  </back>

<!-- ##markdown-source:
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
/wOxuQD0byABAA==

-->

</rfc>

