<?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-20" 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="November" day="02"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 45?>

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

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

<t>Where this document compares names case-insensitively, the comparison
uses the "i;unicode-casemap" collation <xref target="UNICODE-CASEMAP"/>.</t>

</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 number of levels in the FileNode hierarchy, or null
  for no limit.  A FileNode may have at most one fewer ancestors
  than this value, so 1 allows only top-level nodes.</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 Directory 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 node 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.</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.  The server never updates it
  automatically.</t>
  <t>modified: "UTCDate" (default: current server time)  <vspace blankLines='1'/>
The date the content of the node was last modified.  The
  server updates it automatically only on a Direct HTTP Write.
  See "Modification Timestamps" for usage guidance.</t>
  <t>accessed: "UTCDate" (default: current server time)  <vspace blankLines='1'/>
The date the node was last accessed.  The server never updates
  it automatically.  Clients <bcp14>SHOULD</bcp14> provide an updated value when appropriate (see
  "Access Time Updates").</t>
  <t>changed: "UTCDate" (server-set)  <vspace blankLines='1'/>
The date the server last recorded a change to a property of
  this node that has the same value for every user.  The server
  <bcp14>MUST</bcp14> automatically update this value whenever such a property
  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>, <spanx style="verb">metadata</spanx>, and the other mutable
  properties that are not per-user.  This is not settable by
  clients.  <vspace blankLines='1'/>
A change to a per-user property (<spanx style="verb">isSubscribed</spanx>, or
  <spanx style="verb">privateMetadata</spanx> (see "Extended Attributes and Named
  Streams")), or to the node's rights because of a change to an
  ancestor's <spanx style="verb">shareWith</spanx> or a move (see "Access Control"), need
  not update <spanx style="verb">changed</spanx>.  The server <bcp14>SHOULD</bcp14>
  report a per-user change in FileNode/changes only to the
  users whose value changed.  It <bcp14>MAY</bcp14> instead update <spanx style="verb">changed</spanx>,
  and report the node in FileNode/changes to other users too,
  when it cannot efficiently determine which users are
  affected, such as when the value is held for a group.</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 the user has on 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,
or change its <spanx style="verb">role</spanx>.</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">created</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".  Values are normally those
  registered in the IANA media-types registry, but 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="MEDIA-TYPES"/>.</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).  <vspace blankLines='1'/>
A client may set <spanx style="verb">role</spanx> on create or update, and may set it
  to null to clear it.  Changing <spanx style="verb">role</spanx> on an existing node
  requires <spanx style="verb">mayRename</spanx> on that node.  At most one Directory in
  an account has a given role; setting a role that another
  Directory already has is an "invalidProperties" error.  As
  for sibling names, the server checks this against the result
  of all the creates, updates and destroys in a FileNode/set
  together, so a client can move a role from one Directory to
  another in a single method.  A server <bcp14>MAY</bcp14> reject setting or
  clearing a role for policy reasons with "forbidden": for
  example, a role that it manages itself, such as "root" or
  "trash", or a role that it allows only on a top-level
  Directory or within a limited depth of the tree.</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 root of the tree is the set of
  nodes with a null parentId, not a Directory with the "root"
  role.  A relative target on a node with a null parentId
  resolves from the root, and a ".." element at the root does
  not resolve.  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, as additional entries in the <spanx style="verb">list</spanx> array.
  Each node appears in the list only once.</t>
</list></t>

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

<t>This is a standard Foo/changes method.  A node can be reported as
changed without any change to its own properties: see <spanx style="verb">changed</spanx>
for per-user properties, and "Access Control" for changes to a
node's rights or discoverability.</t>

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

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

<t>An attempt to move a node beneath itself 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, and the ids of any descendants destroyed with
  it, 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.  See "Case Sensitivity" for its use.</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, role change or destroy without the rights it
needs, or a rename, move or destroy of a Directory with a role; a change to a role that server policy
does not allow; 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, to set a property
that is not defined for the node's <spanx style="verb">@type</spanx> to a non-null value,
to give a Directory a role that another Directory in the
account already has, or a create or move that would give the
node, or any of its descendants, more ancestors than
<spanx style="verb">maxFileNodeDepth</spanx> allows.</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.
These arguments apply to the nodes created and replaced in the
destination account.</t>

<t>Each copy is a new node, with a new id and a new <spanx style="verb">changed</spanx> value.
It has the same <spanx style="verb">created</spanx>, <spanx style="verb">modified</spanx> and <spanx style="verb">accessed</spanx> values as its
original, unless the client gives others.  For a File, the server
copies the content of its blob into the destination account; the
blob need not already exist there, and the new <spanx style="verb">blobId</spanx> may
differ.  <spanx style="verb">shareWith</spanx> and <spanx style="verb">role</spanx> are not copied, even within one
account: the copy takes its rights from its new parent, and
<spanx style="verb">isSubscribed</spanx> takes its default value.  <spanx style="verb">metadata</spanx> and
<spanx style="verb">privateMetadata</spanx> are copied as <xref target="JMAP-METADATA"/> describes.</t>

<t>Copying a Directory copies its whole subtree: each descendant is
copied, by the rules above and with the same name, beneath the
copy of its parent.  The copy
of a Directory and all its descendants succeeds or fails as a
whole; if the destination cannot hold any descendant (for example,
a SymLink where "SymLink" is not in <spanx style="verb">supportedNodeTypes</spanx>), the
copy fails.</t>

<t>Copying a node requires <spanx style="verb">mayRead</spanx> on it and <spanx style="verb">mayAddChildren</spanx> on
the destination parent (or <spanx style="verb">mayCreateTopLevelFileNode</spanx>).
The response gives only the id of the new Directory; FileNode/query
with an <spanx style="verb">ancestorId</spanx> condition finds the copied descendants.</t>

<t>If onSuccessDestroyOriginal is true, the implicit FileNode/set
call that destroys the originals (<xref section="5.4" sectionFormat="of" target="JMAP-CORE"/>)
has onDestroyRemoveChildren true.  A client that must not lose a
node added to the tree between the copy and the destroy passes
destroyFromIfInState.</t>

<t>Unlike other Foo/copy methods (<xref section="5.4" sectionFormat="of" target="JMAP-CORE"/>),
FileNode/copy allows <spanx style="verb">accountId</spanx> to be the same as
<spanx style="verb">fromAccountId</spanx>, so a client can copy a node or a tree within one
account.  An attempt to copy a Directory into itself or one of its
descendants is rejected with "invalidProperties".</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>

<t>A request that would take the account over its quota (see
"Quotas") <bcp14>MUST</bcp14> be rejected with 507 (Insufficient Storage)
(<xref section="11.5" sectionFormat="of" target="WEBDAV"/>).  Whenever the server rejects a
request, with this or any other status, it <bcp14>MUST NOT</bcp14> change the
node.</t>

<section anchor="preventing-lost-updates"><name>Preventing Lost Updates</name>

<t>The server assigns a strong entity tag (<xref section="8.8.3" sectionFormat="of" target="HTTP"/>) to a File's content at the write URL, which changes
whenever the content does.  On success, the server <bcp14>MUST</bcp14> include
an ETag header field with the new entity tag in the response to a
PUT or PATCH.  The server can use any value with the properties of
a strong entity tag.  It is <bcp14>RECOMMENDED</bcp14> that the server use the
node's current <spanx style="verb">blobId</spanx> as the opaque value (for example,
<spanx style="verb">"Bfa61c0"</spanx> for a node with <spanx style="verb">blobId</spanx> "Bfa61c0"), so that clients
can form it from FileNode/get.</t>

<t>The server <bcp14>MUST</bcp14> support If-Match (<xref section="13.1.1" sectionFormat="of" target="HTTP"/>) on
PUT and PATCH.  If the condition is false, the server <bcp14>MUST</bcp14> respond
with 412 (Precondition Failed).  A client
<bcp14>SHOULD</bcp14> send If-Match on every PATCH, and on a PUT unless it intends
to overwrite whatever content the node has.</t>

</section>
<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".  If the Content-Type
header field does not conform to the ABNF of <xref section="8.3" sectionFormat="of" target="HTTP"/>, the server <bcp14>MUST</bcp14> respond with 400 (Bad Request).</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>Errors in applying a patch are handled as described in
<xref section="2.2" sectionFormat="of" target="HTTP-PATCH"/>.  In particular, the server <bcp14>MUST</bcp14>
respond with 415 (Unsupported Media Type) for a patch format it
does not support, 400 (Bad Request) for a malformed patch, and 409
(Conflict) for a patch that cannot be applied to the node's current
content.</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).  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.</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>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>A node that is discoverable only through the second rule has
mayRead false.  A query with that node as the parent returns only
those of its children that are themselves discoverable.</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>To rename or move a node, or change its role, 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.  A client
that needs to destroy, rename or move such a Directory first clears
its role (see "role" in "Directory Properties").</t>

<t>A node's rights can change without any change to the node
itself: through a change to <spanx style="verb">shareWith</spanx> on an ancestor, or when
the node or an ancestor moves to a parent whose inherited rights
differ.  The server <bcp14>MUST</bcp14> report every node whose rights for a user
changed as changed in FileNode/changes for that user, including
nodes that have no <spanx style="verb">myRights</spanx> of their own and take their rights
from their parent.</t>

<t>Otherwise, moving or renaming a node changes only that node.  Its
descendants keep all their properties (their path is not a
property), so the server does not report them in FileNode/changes
unless their rights changed.</t>

<t>When a node stops being discoverable by the user, for example
because a <spanx style="verb">shareWith</spanx> entry was removed or the node was moved out
of a shared Directory, the server reports it as destroyed in
FileNode/changes.</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>, <spanx style="verb">name</spanx>, <spanx style="verb">created</spanx>, and <spanx style="verb">modified</spanx> are taken
  from the FileNode.  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 descendant's
  <spanx style="verb">name</spanx> is the <spanx style="verb">name</spanx> of the referencing entry followed by
  its 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": "project/",
          "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 FileNode's <spanx style="verb">created</spanx> and <spanx style="verb">modified</spanx> are taken
  from the archive entry's, when it has them.  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 server splits each entry's name on "/" into
  path components.  It treats every name as relative to
  <spanx style="verb">parentNodeId</spanx>: it ignores any
  leading "/" and the trailing "/" of a directory entry, and
  drops any "." component, so "/docs/", "./docs/" and "docs/" all
  name the same directory.  An entry is also unsupported if its
  name contains a ".." component or an empty component (as in
  "docs//readme.txt"), or would produce a name or depth that the
  server would reject in FileNode/set.  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.  <vspace blankLines='1'/>
A directory entry that collides with an existing Directory
  the user can discover does not use <spanx style="verb">onExists</spanx>: the server
  merges the entry into the existing Directory.  It creates no new node for that entry,
  leaves the existing Directory's properties unchanged, and
  extracts the entries beneath it into the existing Directory,
  where their own collisions are handled in the same way.
  Adding a node to an existing Directory requires
  <spanx style="verb">mayAddChildren</spanx> on it, as for FileNode/set.  <vspace blankLines='1'/>
<spanx style="verb">onExists</spanx> applies to every other collision: a file or symlink
  entry with any existing node, or a directory entry with an
  existing node that is not a Directory.  When "rename" renames
  a directory entry, the entries beneath it are extracted into
  the renamed Directory.  The extraction has no equivalent of
  onDestroyRemoveChildren, so "replace" of an existing node
  that has children fails with "nodeHasChildren".</t>
</list></t>

<t>If extraction fails for any reason, the server rejects the
Blob/convert creation with the SetError for that failure (for
example "alreadyExists", "forbidden", "nodeHasChildren", or
"unsupportedEntry"), and <bcp14>MUST NOT</bcp14> create, destroy or change any
FileNode.  An extraction either succeeds as a whole or has no
effect.</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, the id of the existing Directory for a directory entry
that was merged into it, 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, on FileNodes of every <spanx style="verb">@type</spanx>.</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.  A client <bcp14>SHOULD NOT</bcp14> include
<spanx style="verb">modified</spanx> in an update that only renames or moves a node.</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.  When extracting
an archive into FileNodes, the server builds the tree itself, so
it resolves every entry name relative to <spanx style="verb">parentNodeId</spanx>, even one
with a leading "/", and treats entry names that could escape it as
unsupported entries (see "Extracting Archives into FileNodes").</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> or copying a Directory with
FileNode/copy, can be expensive; servers <bcp14>SHOULD</bcp14> impose limits on
the size of subtrees that can be destroyed or copied 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, and so does moving a node to a parent that is shared
differently.  Removing sharing from a parent node, or moving a
subtree out of a shared Directory, makes those nodes
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-20</strong></t>

<t><list style="symbols">
  <t><spanx style="verb">created</spanx> and <spanx style="verb">modified</spanx> map to the ArchiveEntry properties of the
same names in both directions.</t>
  <t>A create or move that would place a node, or any of its
descendants, deeper than <spanx style="verb">maxFileNodeDepth</spanx> fails with
"invalidProperties".  (Thanks to Mark Atwood.)</t>
  <t>Case-insensitive name comparisons use the "i;unicode-casemap"
collation <xref target="UNICODE-CASEMAP"/>.  (Thanks to Mark Atwood.)</t>
  <t>The root of the tree for SymLink targets is the set of top-level
nodes, not a Directory with the "root" role.  A relative target on
a top-level node resolves from the root, and ".." at the root does
not resolve.  (Thanks to Mark Atwood.)</t>
  <t>Archive entries reached by <spanx style="verb">recurse</spanx> are named with the referencing
entry's <spanx style="verb">name</spanx> as a prefix, and the example no longer uses "/" as an
entry name.  (Thanks to Mark Atwood.)</t>
  <t>When extracting into FileNodes, an entry whose name has a ".." or
empty component, or would produce a name or depth that FileNode/set
rejects, is an unsupported entry.  Entry names are relative to
<spanx style="verb">parentNodeId</spanx>: a leading "/", the trailing "/" of a directory,
and "." components are ignored.  (Thanks to Mark Atwood.)</t>
  <t><spanx style="verb">changed</spanx> must be updated for properties that have the same value
for every user.  A change to a per-user property, or to <spanx style="verb">myRights</spanx>
through an ancestor's <spanx style="verb">shareWith</spanx>, need not update it, and should
be reported in FileNode/changes only to affected users, but a
server that cannot tell which users are affected may report it to
others.  (Thanks to Mark Atwood.)</t>
  <t>A client can set or clear a Directory's <spanx style="verb">role</spanx> with <spanx style="verb">mayRename</spanx>.
At most one Directory in an account has a given role.  A server
may refuse a role change for policy reasons, such as a role it
manages itself or one allowed only at the top level.  Clearing a role
lifts the restrictions on destroying, renaming and moving the
Directory.  (Thanks to Mark Atwood.)</t>
  <t>FileNode/copy of a Directory copies its whole subtree without
loss, as a whole or not at all, much as if archived and extracted
into the new Directory.  File content is copied into the
destination account; <spanx style="verb">shareWith</spanx> and <spanx style="verb">role</spanx> are not copied;
<spanx style="verb">isSubscribed</spanx> takes its default; and <spanx style="verb">metadata</spanx> and
<spanx style="verb">privateMetadata</spanx> are copied as <xref target="JMAP-METADATA"/> describes.
Copying requires <spanx style="verb">mayRead</spanx> on the original and <spanx style="verb">mayAddChildren</spanx>
on the destination parent.  The implicit destroy for onSuccessDestroyOriginal
removes the descendants too; destroyFromIfInState guards against
changes in between.  FileNode/copy may copy within one account,
relaxing the RFC 8620 rule that the accounts differ.  (Thanks to
Mark Atwood.)</t>
  <t>Moving a node reports its descendants in FileNode/changes only
when their inherited rights change, under the same rule as a
<spanx style="verb">shareWith</spanx> change on an ancestor.</t>
  <t><spanx style="verb">maxFileNodeDepth</spanx> is defined in terms of ancestors, and its
relation to the query <spanx style="verb">depth</spanx> argument (which counts from 0) is
stated.</t>
  <t><spanx style="verb">mayRename</spanx> covers changing a Directory's <spanx style="verb">role</spanx>.</t>
  <t><spanx style="verb">created</spanx> follows the same rules as <spanx style="verb">modified</spanx>, and is settable
with <spanx style="verb">mayModifyContent</spanx>.</t>
  <t>"replace" through onExists lists destroyed descendants in
"destroyed".</t>
  <t><spanx style="verb">modified</spanx> and <spanx style="verb">accessed</spanx> have type "UTCDate", like <spanx style="verb">created</spanx>;
setting them to null still sets the current server time.</t>
  <t>Editorial: Access Control defines discoverability before the rules
that use it; Direct HTTP Write states once that a rejected request
changes nothing; removed restated requirements; FileNode/changes
points to the rules that report nodes without property changes;
Security Considerations cover moves and recursive copies.</t>
  <t>Direct HTTP Write returns a strong entity tag in ETag (the
<spanx style="verb">blobId</spanx> is recommended), and honors If-Match with 412
(Precondition Failed); clients <bcp14>SHOULD</bcp14> send If-Match on PATCH.  Defined the
responses for an over-quota write (507), an invalid Content-Type
(400), and patch errors (as in <xref target="HTTP-PATCH"/>).  <xref target="WEBDAV"/> is now
a normative reference.  (Thanks to Mark Atwood.)</t>
  <t>Extracting an archive merges a directory entry into an existing
Directory of the same name, rather than applying <spanx style="verb">onExists</spanx>;
entries beneath a renamed directory follow it; and an extraction
either succeeds as a whole or has no effect.  (Thanks to Mark
Atwood.)</t>
</list></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>

</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="MEDIA-TYPES">
  <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="28" 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-05"/>
   
</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="HTTP">
  <front>
    <title>HTTP Semantics</title>
    <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
    <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
    <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
    <date month="June" year="2022"/>
    <abstract>
      <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
      <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="97"/>
  <seriesInfo name="RFC" value="9110"/>
  <seriesInfo name="DOI" value="10.17487/RFC9110"/>
</reference>

<reference anchor="HTTP-PATCH">
  <front>
    <title>PATCH Method for HTTP</title>
    <author fullname="L. Dusseault" initials="L." surname="Dusseault"/>
    <author fullname="J. Snell" initials="J." surname="Snell"/>
    <date month="March" year="2010"/>
    <abstract>
      <t>Several applications extending the Hypertext Transfer Protocol (HTTP) require a feature to do partial resource modification. The existing HTTP PUT method only allows a complete replacement of a document. This proposal adds a new HTTP method, PATCH, to modify an existing HTTP resource. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5789"/>
  <seriesInfo name="DOI" value="10.17487/RFC5789"/>
</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="UNICODE-CASEMAP">
  <front>
    <title>i;unicode-casemap - Simple Unicode Collation Algorithm</title>
    <author fullname="M. Crispin" initials="M." surname="Crispin"/>
    <date month="October" year="2007"/>
    <abstract>
      <t>This document describes "i;unicode-casemap", a simple case-insensitive collation for Unicode strings. It provides equality, substring, and ordering operations. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5051"/>
  <seriesInfo name="DOI" value="10.17487/RFC5051"/>
</reference>

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

<reference anchor="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>




    </references>

</references>



  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA7W9+3rb1rU4+D+eAj/2D0v+UbLk2Gki97SHluREPb7Fkpv2
JJlDkIQk1CTAAqBlNnG/eYh5gHmWeZR5kln3vTZASnaaydevpkhgX9Zee90v
e3t7SVu08/wo/fOL0ev0WTHP0/O2qrOrPM0/tHnZFFWZZJNJnb93z7ysZnky
q6ZltoBXZ3V22e4VeXu59/dFtty7hCdKeGLv4UHSrCaLosFRLtZLePbs9OJZ
Ms3a/Kqq10dp086S1XIGfzdH6VdfwgvVpKnmOf6dFMv6KG3rVdM+PDj4+uBh
8i5f31T1DEYp27wu83bvBKdOmjYrZ/+TzasSZljnTbIsjtIf2mo6TJuqbuv8
soFP6wV++ClJslV7XdVHSbqXpPBfUcLcT/fTb6pydpOVGX3JO3taV2X8fVVf
HaXPsqZdZMWcvsnx01E6gUev/vNSfmnzbLE/rRZJUlb1ImuL9/kRPY0g3Dt+
9eb0KH3z7Jh2bF+ffzt6c/byG/rl6y9/z7+8OD05G+1d/O316Tn98OVXX3xF
P7x9c7Z3cfri9fPRBQ/25WN55Wz0crT3zduzk9PnZy/lta8OH34ZZnr6/NXT
079eACD3TvbDwU3m1QROPTz34vRidDK6GHUfXORtBoeWuSdHZ891S4fh6+/e
vroY8Qq+fvTwMf1wcvbN6fnF3rOz0+cn8tPjL3jl315cvOZvDg/DN3uvRxfH
39L3j3//1de8+5dnx69OeOOPD7/+yn+5dzw6P4XZ+ceDx7ye70+fnoz+Qt89
+vrwqyQpysv4bI5Hz+2J3399KN+9OdEvv/zi8UN3iKPnpy9PRm/Ou8CZZoD+
s6xu/IG/PDm7OHv1cvS89zRgV9HC/cjm0fMXo+MLgc6XAItkb28vzSZNW2fT
NkkurnO+jZOsydNlXQGyV/N0Bx6na7SL370vZnmTtvBoNinmRbtO2ypdLedV
NkvhwqSz6qbEP5KsnhQwcL1OJ0WJ/+DZ7qfpxXXR+K9S+BN2N8/h/XSA2DIY
0kjTrEwnebpq8hmANYVH0grmrXmNRkiafVw5DGLfpNls1sBgSlR4mhZIBY0L
eHZdwQOw7vzDsoKt4qTwAvwvQTLTrJs2X8Ai4O5fpTdFe037xQGatLpMFVHh
26xNszpXuMzSyVrWWOeLqs3dcAZPXC/CfVHMZvM8SX6HhKeuZqspHliS0O52
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
9t9n5l/N1hun7JqbyZJpSfYkCwwpjpctBIDXIfQGHr+PA9+Pq/g+2n+0f2hW
G2xSahX+LciGrwI5lAEF2nx6LQWzqeskNdwEgGVYh/ByBVQPvguqLFVkIKUN
I+Fz7OAEz3F9CKvfSdDhtCxqcbXGAoHiE6s0GztoipphB9Jokb/3PtSbTHrk
NDnjES5m2/GJNi2GV4FOMBYGOZ8kHH8XtLyF0jlydSkeaFnGxr08FDGMfDCz
Df3rRNlkcW4YiWhD5UdDZQnDMNkwiVGV5XjcilfPGc2rW1QH39wgIUEVxwnS
8meNlrh0nq41Ac19VAATpUicgyTmkGr8rKoTl5K5aQWIrvyWkiZai86JOZEW
9k5CtyQ/lRFYbxmPS2dRzZg0StUPUi+Wlf68bInMTwhInsRZI1GRastRcPkU
If6LC1N3feJ9zSJXz5oYcAhdRVonZIuwJPib6HvftJBudHgwYYsMTyOlAiVc
6KzlwDNrpRSZ2bxdzeuVWmSFvDd8R7HXAzlrKLmStSikMQ1+Kf4ZSWsI1lyJ
2eOgzwVdjBZ1Q15A6K4Cz6/qhtzerv2s1VoUHkIrlGSJuFiA6vXScsCXvwOk
W64McGN0OIwpdVbKqUfNCCLdP963xtCmHq15SRTDSPpZqel8EsFNX9H48rOl
tfSCczlKMi6vEhVj3qdGnCVNSSVn1hsSnXqBB5rLZNXrvNSiZWNcuVE4NamK
2L0DSfcOqBXb3zW9XYHbbr4bQ2cz0EAZF2yMICfdJHH8hQQLjM+jeoLNiAxN
xKEa9ca8DE/PM873CLea8iAFyGbqXDQ5JcNmUsUD3nSNxMh2n02ovaYxUFze
RpP38R3ZQv6hkEDDdmS8o61GzyZqK7XcNsCYeK5ukICwe2qV2iscK5gTvOVw
79/jNW+I6Y43dA0ZD629DZbND5XLvLgjPTc4yxWu9fsik9Y5cqwkaiXeY7Af
elpZRsVKywrlH5ZZac2etINSYjuNTYgKZeIN5P2R3pOKWElcouqJug4ayfC1
voKtNprATRHWUqg6ZXB5L9Ojg4N05ylg9xseaFdysNkhEbUcyCRjmplUgfRB
L1X3vih7GlqOcjRr8ujgUbrzEh58Vq3KmSTo8Qj0ggXsRkXoLG5XWQ6i2aXF
TiSFCeNsWMXIJC0btjXKK9WdB4ZetJuXDcD6It15puGCBKoV0sBWyHtoCCwI
jGElRbPAq+hasRM+wUWXbG7MqlaAuzAmvDo0lrreKmWv/1hVbSZU6Dv83ABn
3rzixwe/T3fOymalFUrTcyAC2VW+mzin6uHh/mNqya2NuLG4otbpdVdMs1Sy
RNY7dAKsRlnRPjFraMXVGyzIPISeJcLJgdy8xihzzhJ/jsmcUviYEUJvdoOm
CaY9NRI5fAEZRHblXcNf7X9F7UIShC+G/FufrVBxTGP0qUcQXtlhKPRNhO7G
b1tfkqKmr0oOr2iafqKW9vkF2ez0AtZ1DRwDNWBq52i3HQML3OI7ObWc1vj6
7QXC8vXo4vjbWEtCwU81JCmmrANHVRaTDYDiyrhwTK6Hdri7WsG7CceDMJN6
pRYXJBFR1TKD05clxEEiY0tKH3viwSVDdBh7ZjckFgplTnCPVGKqEPbk+fV+
hBYEdy3qdHa5x+qrR+sv9g9Z8VSMgCuK4EU5SeGrVdBMbg4B9t0zlmZNTLwf
HT5Md1675JP0WQZLne26CIpEqoEDs52FFcKjXIyXlqCB0AAqXJrEimEqOeLe
rEnQwAePM8aamK2oaUIJKDFyo95eIEXBwZSqRCX4ECfqjUXeVTOTt0hEL0KO
Tih5iIdgzaPQzRnqqyVCq/dIS41uQSNKuCv36WfnkLVux14q1EsYT42ucjL4
7FidHLQCYcPOXTtJWz6H56db19Or55b4haHF6raibmfaoTWMnkS7vaNmWurp
lqNaW7FuG7tOktvIkhNyNFY3lF3lUn5cV8NtvZuJTXWyQtBjXPtYDwwL7Kc7
jMMiBEyzmgJ9NZpIS/o/cd9h2yW2p2SWZM3Fr7TCHm07DtBAQ/sNSKANnXqQ
4h8icF79l3p60z+fv3rJhq5OU0FXQgMQG/86fMj1OHpFNOISGqikPoC7VJQD
ayv3O77HdOfwQ4jmEGtExl2cQB9d+BYHUY32RGltfMki5DVjnPR/tTJCpBIQ
aeF2mso1rLOj/7GRjGu0plj7DgqoC8F7r/H5Xo8exlqy4T19/urp6V8vPn7s
kn9/ZT7s1Xike7N8TsX3Oz9OGvwV8G9MUP2wR3/uxizPLDpkbJxj07qNYKNI
V/gJcHe2muY9mvVrbwmHlbJK+Vn3wjeegCvGpX7hcmxotxLLRraCcCP3kzgk
j1IuXDB/QSXFGxx+GLJ0oiGS3jXSyk4qexTd+2NiLF6jhJhBRnPccpsI0fLZ
o8dfxrfp68PHDz/pNkkeU1FyGJb0eSP0RbSlxC2O5dXIXULfQEwfcvFJJKZ7
dB3J1NzppNY5/yQmsYeP0523Zbg9L6ioJi56V2Qaf58wCyZwK35p2KfT8uYi
m+NreicZkR4dfJ3swFW/hNvRxnOwbMT0dCKmpBB5GctpSUB2IEpn8PmqxtZa
IgyoTGkEBGvdMY0ev8mX9d5JAQJwy74ZJTzyXcTaMI765Oyb0/OLvWdnp89P
zqXVLd1R7CtZtCTxNEeK9BwB7O5jzPcvdWl8MrTz/j1J4APoghJ4TesSo3DI
0C7sCBopw4ARzXI6yYJB/pkMliog9ndskeNDYl0blxNm6qEI3jeuiandZuw1
bkNKb5mJM9DsXj81PqKRvd0h2UmXZKvGM6cwzTaUWJBJ7zVsUsJ3l+b5eWK2
E5Fp1UzG2c7Sv3yt2yOl1kXTZs07wWsBlUOAe40n1Wg0adgKloy/B9FgL0LO
3kF09DJiR4AhSYQUutdY3VHoRighPUoswRC0eHKicyjSgJd/NOjZe8N85JSO
bJL6VnOd7T0E2rirECcJxUgw0tghReLj5slKnjX5l4/24AAqDLi+C3ZUQ+gp
kGMybhLKkSMuRgDBNxmssHBfIvFqAUXntDwR3/2qo7PqPYi/xbESzXHTjGDR
+n9z5kE/dkCMFcdWD2eni8Npffjt1cNv/vGXk7++uPjm9RfN1XeXz/62Xn71
17ezh/99cbV8/N30P4I4l8YWIsDjfr19vo/I/1mx9c2H+HIFx1WysXleCI/F
24HmLjREcVoMjm3l+uEUb0IY75Er5BUsW6KjrUrxM9FJcOn/qzqjqF9hGGRh
E4T1eT1abMoXSWC1NNEkE0uSI3aqzQTqsOQsvZxX0j7SjZ1wmQtScF1uCW6b
Fgdfc0sG1PN89itoBhJBK+XOjRGSZSy7wQoh/Lzu8hr+pFZdRH7uTo4MpyDK
YgDqvlkkXYkpzknxpHiLsfFJ0sta0VQW7l3g2i5wuhulO58HP1eyMdyaSje7
rGpCMyVAaibE3gxDRDsOCYT3/foBNBIrz1Z68ToO/LgDZ00UIQiTe+A5steO
k+KSi6SpmTFyLGpdFK28r4XycAxn6kpi67+5Oihexm+S8y0IsW8qdNqjIy9U
07AMDRdv62MjEAiSVsQ+lSR52H+5k54bvZ1F+JymUrmF2AmhngsOQIGDwB1Q
UP1Y/ZNrr+tqdSWiNlmSKGmMCt7qkjntEy8VZxmIbG7FVKRNMSdAqSZMYfCM
pFa0RpN81NfsPEV+ZV2n84a1423s19agvK1hstHHzLwhm2uKJAYoc31PK/fJ
jd0SV/DT3ScsBxp3TKPr5CjYDqGz9NYIDcEJnJeSFsZXj40G/VqCZJNL2Hxt
DrbbE55dWkviM0St2ZhLmNQMSanr6iot3uO+xsmtXZf3e13lgptUCnk0eR48
meI31bZHjv5boZVI4KGGt92WaDCYdi/c1B3NNZTDhApAiwR1CiBtMAPXw7yj
QRoXDSHrniacb1ixdXdLEkchjXNGmUTbPFFU1X57mYTQ3Hcx1LJqcjuTbely
eEsai2GwVEZLe9K3NUN6s4emW6anp5z6+jwW8l3IRQ45JtIMa9tqo5ptLp5C
Gp1Ile1pSDYPVW96+e63FHtJXLGXqgnl7/bFgzwHIsHlG7lND241V+/oJfM6
pG/U+BdTda5Mal8nHBvO4lhbDTX2hZ7KOTn+mY9fpFKKb8viA8jUi9z1M5hn
a/Tz8V0cgdbNdJ4bByW4NTyVp9Vk4Msdw9/pAukRrpmNIHD2N1X9LnmAEwBn
eJDhYBTo8EBGS+m/BzyeFtuhAIrD/b8vr6JvHu63H1r7Zn8f40sfTOQ1+JcK
KOsj+DOJrLwBuv0LRBCSpChCg3OcXGwHMG/cHC2XsgmrboMxrQQR9xXjACeH
mVxeJ3GNDAR5Q0nFovUll6wqnMoiPqaY9AS2A0iCKWFeJJDR9A3Xi4ykLh4Q
bsCL6j3ZiyRFlWtTucTiThKx2Qg1C6eqk9uqhGhVj8J6OFsGnbt+vEhe06cV
5yJBYWNxFGf4sZzGoRzYTE9sFvlNzEMLeKA5qb0JJc4geCjooBN3OkUrkh8p
h/4QWGqMJAo5q8RpJNYnnZQXEtcb/gaNQoSadDnjFiO0Aml2ICgXxSMjwedu
fh4i3t8Wm0flkWEXx4X8BZizDYM6PDSJ4rsEDFCRb1ztYFOfGKqINVKxQJtZ
YvowX57NpXEV80VDPjJB0BfDibqwll68pduJjupkm/yL2xQyK5LhjWgsseIW
qjx0jdIiCrCj0mlSrnEdK25WBZgqmfDHTcKChReyDBIEp244VHTrY0wiCiNh
EfCV7KHXNhSt/SpCUTEibuPBaODKDnSadIYmLGed3Ox3eb7Uiq5FHRWc1nkl
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
AQA=

-->

</rfc>

