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

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

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

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 41?>

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

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



    </abstract>



  </front>

  <middle>


<?line 50?>

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

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

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

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

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

<?line -18?>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<t><list style="symbols">
  <t>"alreadyExists" — a create or update would cause a name collision
with a discoverable sibling FileNode, and onExists did not
resolve it.  The SetError object <bcp14>MUST</bcp14> include an <spanx style="verb">existingId</spanx>
property with the id of the existing FileNode.</t>
  <t>"forbidden" — a name collision with a sibling the user cannot
discover, an onExists replacement without the required rights on
the existing node (see onExists above), or a destroy that would
remove nodes the user cannot discover (see "Access Control").</t>
  <t>"invalidProperties" — an attempt was made to move a node to a
descendant of itself, creating a cycle in the tree, to make a
node the child of a node whose <spanx style="verb">@type</spanx> does not permit
children, to change the <spanx style="verb">@type</spanx> of a node, or to set a
property that is not defined for the node's <spanx style="verb">@type</spanx> to a
non-null value.</t>
  <t>"nodeHasChildren" — a destroy was attempted on a FileNode that
has children, and onDestroyRemoveChildren is false.</t>
</list></t>

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

<t>This is a standard Foo/copy function with the same additional
top-level arguments as FileNode/set (onDestroyRemoveChildren,
onExists, and compareCaseInsensitively), with the same behaviour.</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's one more property to the query:</t>

<t><list style="symbols">
  <t>depth: "UnsignedInt|null"  <vspace blankLines='1'/>
The number of levels of subdirectories to recurse into.  If
  absent, null, or zero, do not recurse.</t>
</list></t>

<t>The following filter criteria are defined:</t>

<t><list style="symbols">
  <t>isTopLevel: "Boolean"  <vspace blankLines='1'/>
If true, the node must have a null parentId to match the
  condition.</t>
  <t>parentId: "Id"  <vspace blankLines='1'/>
A FileNode id.  A node must have a parentId equal to this to
  match the condition.</t>
  <t>ancestorId: "Id"  <vspace blankLines='1'/>
A FileNode id.  A node must have an ancestor (parent, parent
  of parent, etc.) with an id equal to this to match the
  condition.</t>
  <t>descendantId: "Id"  <vspace blankLines='1'/>
A FileNode id.  A node must be an ancestor (parent, parent
  of parent, etc.) of the node with this id to match the
  condition.  This is the inverse of <spanx style="verb">ancestorId</spanx>.</t>
  <t>nodeType: "String"  <vspace blankLines='1'/>
A node type value.  Only nodes whose <spanx style="verb">@type</spanx> is precisely
  this value match this condition.  This filter, and the
  <spanx style="verb">nodeType</spanx> sort property below, are named <spanx style="verb">nodeType</spanx> rather
  than <spanx style="verb">@type</spanx>; they operate on the <spanx style="verb">@type</spanx> property.</t>
  <t>role: "String"  <vspace blankLines='1'/>
A role name.  Only nodes with precisely this role match this
  condition.</t>
  <t>hasAnyRole: "Boolean"  <vspace blankLines='1'/>
If true, any node with a defined role matches this condition.
  If false, any node which has a role does not match this
  condition.</t>
  <t>blobId: "Id"  <vspace blankLines='1'/>
A FileNode must have a blobId equal to this to match the
  condition.</t>
  <t>isExecutable: "Boolean"  <vspace blankLines='1'/>
If <spanx style="verb">true</spanx>, the FileNode must have a true executable value.</t>
  <t>createdBefore: "UTCDate"  <vspace blankLines='1'/>
The creation date of the node must be before this date to
  match the condition.</t>
  <t>createdAfter: "UTCDate"  <vspace blankLines='1'/>
The creation date of the node must be on or after this date
  to match the condition.</t>
  <t>modifiedBefore: "UTCDate"  <vspace blankLines='1'/>
The modified date of the node must be before this date to
  match the condition.</t>
  <t>modifiedAfter: "UTCDate"  <vspace blankLines='1'/>
The modified date of the node must be on or after this date
  to match the condition.</t>
  <t>accessedBefore: "UTCDate"  <vspace blankLines='1'/>
The accessed date of the node must be before this date to
  match the condition.</t>
  <t>accessedAfter: "UTCDate"  <vspace blankLines='1'/>
The accessed date of the node must be on or after this date
  to match the condition.</t>
  <t>minSize: "UnsignedInt"  <vspace blankLines='1'/>
The size of the node in bytes must be equal to or greater
  than this number to match the condition.</t>
  <t>maxSize: "UnsignedInt"  <vspace blankLines='1'/>
The size of the node in bytes must be less than this number
  to match the condition.</t>
  <t>name: "String"  <vspace blankLines='1'/>
A FileNode must have exactly the same octets in its name
  property to match the condition.</t>
  <t>nameMatch: "String"  <vspace blankLines='1'/>
Matches the <em>name</em> property of the node using glob syntax.
  The following special patterns are defined: <spanx style="verb">*</spanx> matches any
  sequence of characters, <spanx style="verb">?</spanx> matches any single character,
  and a pair of brackets matches any single character in the
  bracketed set (for example, <spanx style="verb">[abc]</spanx> matches "a", "b", or "c";
  <spanx style="verb">[a-z]</spanx> matches any lowercase letter; <spanx style="verb">[!abc]</spanx> or <spanx style="verb">[^abc]</spanx>
  matches any character not in the set).  All other characters match
  literally.  The match is case-insensitive.</t>
  <t>mediaType: "String"  <vspace blankLines='1'/>
A FileNode must have exactly the same octets in its mediaType
  property to match the condition.</t>
  <t>mediaTypeMatch: "String"  <vspace blankLines='1'/>
Matches the <em>mediaType</em> property of the node using the same
  glob syntax as <em>nameMatch</em>.</t>
  <t>body: "String"  <vspace blankLines='1'/>
Match the content of the referenced blob, see the definition
  of <em>body</em> in section 4.4.1 of <xref target="JMAP-MAIL"/>.  The server may
  use any technology to extract meaningful text from the blob
  for searching, or interpret the string in any way, to choose
  the nodes that it believes the user wants to see.</t>
  <t>text: "String"  <vspace blankLines='1'/>
Is equivalent to <em>body</em> OR <em>nameMatch</em> OR <em>mediaTypeMatch</em>.</t>
</list></t>

<t>The blobId, isExecutable, minSize, maxSize, mediaType,
mediaTypeMatch, and
body conditions match only nodes whose <spanx style="verb">@type</spanx> is "File".  The
role and hasAnyRole conditions match only nodes whose <spanx style="verb">@type</spanx> is
"Directory".  This applies to both true and false values.  For
example, a hasAnyRole condition of false matches only Directories
without a role, and an isExecutable condition of false matches
only Files that are not executable.</t>

<t>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 with the depth
  parameter provided above.</t>
  <t>nodeType:  <vspace blankLines='1'/>
Sort by <spanx style="verb">@type</spanx>.  Directories sort first, then symlinks,
  then files, then nodes of any other <spanx style="verb">@type</spanx> ordered by the
  <spanx style="verb">@type</spanx> value.</t>
</list></t>

<t>When sorting by a property that is not defined for a node's
<spanx style="verb">@type</spanx> (for example <spanx style="verb">size</spanx> on a Directory), 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.</t>

</section>
</section>
</section>
<section anchor="direct-http-write"><name>Direct HTTP Write</name>

<t>When the server advertises a <spanx style="verb">webWriteUrlTemplate</spanx>, clients can
update the content of a File directly via HTTP without using
FileNode/set.  The URL is constructed by expanding the template
with the FileNode id.  This is only valid for nodes with
<spanx style="verb">@type</spanx> "File"; requests targeting any other type of node <bcp14>MUST</bcp14>
be rejected with an HTTP 400 status.</t>

<t>The client <bcp14>MUST</bcp14> have <spanx style="verb">mayModifyContent</spanx> permission on the node.
Requests without sufficient permission <bcp14>MUST</bcp14> be rejected with an
HTTP 403 status.  Authentication uses the same mechanism as other
JMAP HTTP endpoints.</t>

<section anchor="put"><name>PUT</name>

<t>A PUT request replaces the entire content of the node.  The
request body is the new content.  The Content-Type header sets
the <spanx style="verb">mediaType</spanx> of the node.  If the request has no Content-Type
header, the server sets <spanx style="verb">mediaType</spanx> to "application/octet-stream".</t>

<t>On success, the server <bcp14>MUST</bcp14> update the node's <spanx style="verb">blobId</spanx>, <spanx style="verb">size</spanx>,
and <spanx style="verb">mediaType</spanx> properties, and return an HTTP 200 response with a
JSON body:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "blobId": "Bnewblob123",
  "size": 48576,
  "mediaType": "text/plain"
}
]]></sourcecode></figure>

</section>
<section anchor="patch"><name>PATCH</name>

<t>A PATCH request applies a partial modification to the node's
current content.  The Content-Type of the request indicates the
patch format.  The supported patch formats are those listed in
the <spanx style="verb">supportedPatchTypes</spanx> capability of <xref target="JMAP-BLOBEXT"/> (for example,
<spanx style="verb">application/x-rdiff-delta</spanx>, <spanx style="verb">application/x-bsdiff</spanx>,
<spanx style="verb">text/x-diff</spanx>).  The server applies the delta to the node's
current blob to produce the new content.</t>

<t>On success, the server <bcp14>MUST</bcp14> update the node's <spanx style="verb">blobId</spanx> and
<spanx style="verb">size</spanx> properties.  The server <bcp14>MUST NOT</bcp14> change the node's
<spanx style="verb">mediaType</spanx>.  A client that needs to change it uses PUT, or
updates <spanx style="verb">mediaType</spanx> with FileNode/set.  The response is an HTTP
200 with the same JSON body as PUT:</t>

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

<t>Servers that do not support a given patch format <bcp14>MUST</bcp14> respond
with HTTP 415 (Unsupported Media Type).</t>

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

<t>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>When a <spanx style="verb">shareWith</spanx> change on a node causes the derived <spanx style="verb">myRights</spanx>
to change for any descendant, the server <bcp14>MUST</bcp14> report those
descendants as changed in FileNode/changes responses.  The server
<bcp14>SHOULD NOT</bcp14> report descendants whose derived <spanx style="verb">myRights</spanx> did not
actually change, but <bcp14>MAY</bcp14> do so if it cannot efficiently determine
whether the derived values differ.</t>

<t>Nodes which are not "discoverable" <bcp14>MUST</bcp14> return notFound errors if
fetched with FileNode/get and <bcp14>MUST NOT</bcp14> be returned in response to
FileNode/query.  Nodes are discoverable in one of two ways:</t>

<t><list style="numbers" type="1">
  <t>If the node or an ancestor of the node has mayRead true.</t>
  <t>If the node 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.  It is visible so that the user can use the
rights granted on it, and can see the full path to the nodes
they have access to.  This means that
a query with that node as the parent will only return those of its
children which are otherwise discoverable through the second
discoverability rule.</t>

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

<t>Such a node can have descendants the user cannot discover.  A
destroy that would remove any of them, either through
onDestroyRemoveChildren or as part of a node replaced through
onExists, <bcp14>MUST</bcp14> be rejected with "forbidden", and the server <bcp14>MUST
NOT</bcp14> destroy any node in that subtree.  Without
onDestroyRemoveChildren, destroying such a node while it has
children fails with "nodeHasChildren" whether or not the user can
discover those children.</t>

<t>This leads to a sharee seeing the full path to anything that they have
access to, but nothing else.</t>

<t>For example, in a unix homedirectory environment where user Alice had shared
the "forBob" folder, one might see, when logged in as Bob:</t>

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

<t>While Alice would see many more files and folders at the home
directory level.</t>

<t>This does lead to potentially large changes in the visible Node
set, so when Alice first shared that directory, Bob would have
been told of a large number of new Nodes in response to a
FileNode/changes query.  The server might report these as
"created" or "updated" — it is not always possible for the server
to know whether a node was previously visible to the user.</t>

</section>
<section anchor="quotas"><name>Quotas</name>

<t>Servers that support JMAP Quotas (<xref target="JMAP-QUOTAS"/>) <bcp14>SHOULD</bcp14>
provide Quota objects with <spanx style="verb">"FileNode"</spanx> in the <spanx style="verb">types</spanx> array.
Both the <spanx style="verb">octets</spanx> resource type (total storage used by file
node blobs) and the <spanx style="verb">count</spanx> resource type (number of FileNode
objects) are applicable.</t>

</section>
<section anchor="integration-with-jmap-blob-extensions"><name>Integration with JMAP Blob Extensions</name>

<t>When a server advertises both <spanx style="verb">urn:ietf:params:jmap:filenode</spanx> and
<spanx style="verb">urn:ietf:params:jmap:blobext</spanx>, the ArchiveEntry object type
(defined in <xref target="JMAP-BLOBEXT"/>) is extended with two additional
properties:</t>

<t><list style="symbols">
  <t>nodeId: "Id|null"
A FileNode id.  When present, the server populates the
archive entry from the referenced FileNode's properties.
The <spanx style="verb">blobId</spanx> and <spanx style="verb">name</spanx> are taken from the FileNode.  The
FileNode's <spanx style="verb">created</spanx> and <spanx style="verb">modified</spanx> timestamps map to the
archive entry's time metadata.  The 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)
Only valid when the referenced FileNode's <spanx style="verb">@type</spanx> is
"Directory".
When true, the server recursively includes all children
of the directory in the archive.  Each child entry's
<spanx style="verb">name</spanx> is its full path relative to the directory.
Directory names <bcp14>MUST</bcp14> include a trailing <spanx style="verb">/</spanx>.</t>
</list></t>

<t>A FileNode with <spanx style="verb">@type</spanx> "SymLink", whether referenced directly by
<spanx style="verb">nodeId</spanx> or reached by <spanx style="verb">recurse</spanx>, is added to the archive as an
entry with <spanx style="verb">entryType</spanx> "symlink".  The server never follows the
symlink.  The entry's <spanx style="verb">linkTarget</spanx> is the elements of the
SymLink's <spanx style="verb">target</spanx> joined with "/".  An absolute target, whose
first element is the empty string, therefore produces a
<spanx style="verb">linkTarget</spanx> that starts with "/".</t>

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

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

<t>This property applies only to entries that the server builds
from FileNodes.  An entry that the client gives in full, with an
unsupported <spanx style="verb">entryType</spanx>, is still an "invalidProperties" error as
<xref target="JMAP-BLOBEXT"/> requires.</t>

<t>If <spanx style="verb">nodeId</spanx> references a FileNode that the user does not have
permission to read, or that does not exist, the server <bcp14>MUST</bcp14>
reject the Blob/convert creation with a <spanx style="verb">notFound</spanx> SetError.</t>

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

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

<t><spanx style="verb">json
[["Blob/convert", {
  "accountId": "account1",
  "create": {
    "myarchive": {
      "archive": {
        "type": "application/zip",
        "entries": [{
          "nodeId": "dirabc",
          "name": "/",
          "recurse": true
        }]
      }
    }
  }
}, "R1"]]
</spanx></t>

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

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

</section>
<section anchor="extracting-archives-into-filenodes"><name>Extracting Archives into FileNodes</name>

<t>When both capabilities are present, the ExtractRecipe
(defined in <xref target="JMAP-BLOBEXT"/>) is extended with the following
additional properties:</t>

<t><list style="symbols">
  <t>parentNodeId: "Id|null"
The id of a FileNode with <spanx style="verb">@type</spanx> "Directory".  When
present, the server extracts the archive contents into this
directory, creating FileNode objects for each entry.
Subdirectories in the archive are created as FileNodes with
<spanx style="verb">@type</spanx> "Directory".  File entries become FileNodes with
<spanx style="verb">@type</spanx> "File" and their <spanx style="verb">blobId</spanx> set to the extracted
content.  The <spanx style="verb">created</spanx> and <spanx style="verb">modified</spanx> timestamps are taken
from the archive entry metadata.  If the archive entry
includes a <spanx style="verb">mode</spanx> field, the server <bcp14>SHOULD</bcp14> use it to set the
<spanx style="verb">executable</spanx> property on the created FileNode.  <vspace blankLines='1'/>
Symlink entries become FileNodes with <spanx style="verb">@type</spanx> "SymLink" if
"SymLink" is in the <spanx style="verb">supportedNodeTypes</spanx> capability.  The
server splits the entry's <spanx style="verb">linkTarget</spanx> on "/" to produce the
<spanx style="verb">target</spanx> path elements.  A <spanx style="verb">linkTarget</spanx> that starts with "/"
produces an empty string as the first element, which marks an
absolute path.  The server drops any other empty elements.  <vspace blankLines='1'/>
An entry is unsupported if the server cannot create a FileNode
for it.  These are symlink entries when "SymLink" is not in
<spanx style="verb">supportedNodeTypes</spanx>, and entries of any type that has no
FileNode equivalent ("hardlink", "fifo", "blockDevice", and
"charDevice").  The <spanx style="verb">onUnsupportedEntry</spanx> property controls how
the server handles them.</t>
  <t>onUnsupportedEntry: "String" (default: "error")
If "error", the server rejects the Blob/convert creation with
an "unsupportedEntry" SetError, and creates no FileNodes.  If
"skip", the server does not create a FileNode for an
unsupported entry, and extracts the other entries as usual.  A
skipped entry still appears in the response <spanx style="verb">entries</spanx> array,
with a null <spanx style="verb">nodeId</spanx>.  Any other value is an
"invalidProperties" error.</t>
  <t>onExists: "String|null" (default: null)
Controls the behaviour when an extracted entry would collide
with an existing FileNode name under the same parent.  The
values and semantics are the same as for FileNode/set (see
above): null rejects with an <spanx style="verb">alreadyExists</spanx> SetError,
"replace" destroys the existing node, "rename" gives the new
node a server-chosen name, and "newest" replaces the existing
node only if the archive entry has a strictly later <spanx style="verb">modified</spanx>
timestamp.</t>
</list></t>

<t>When <spanx style="verb">parentNodeId</spanx> is set, each ArchiveEntry in the response
<spanx style="verb">entries</spanx> array includes an additional <spanx style="verb">nodeId</spanx> property
containing the id of the FileNode that was created for that
entry, or null if the server skipped the entry.</t>

<t>If <spanx style="verb">parentNodeId</spanx> references a FileNode that does not exist,
is not a Directory, or for which the user does not have
<spanx style="verb">mayAddChildren</spanx> permission, the server <bcp14>MUST</bcp14> reject the Blob/convert
creation with an appropriate SetError (<spanx style="verb">notFound</spanx>,
<spanx style="verb">invalidProperties</spanx>, or <spanx style="verb">forbidden</spanx>).</t>

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

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

<t><spanx style="verb">json
[["Blob/convert", {
  "accountId": "account1",
  "create": {
    "e1": {
      "extract": {
        "blobId": "Barchive123",
        "type": "application/zip",
        "parentNodeId": "dir456"
      }
    }
  }
}, "R1"]]
</spanx></t>

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

<t><spanx style="verb">json
[["Blob/convert", {
  "accountId": "account1",
  "created": {
    "e1": {
      "id": "Barchive123",
      "type": "application/zip",
      "size": 104857,
      "entries": [
        {
          "name": "docs/",
          "entryType": "directory",
          "nodeId": "node001"
        },
        {
          "name": "docs/readme.txt",
          "blobId": "Bdd001",
          "entryType": "file",
          "modified": "2026-03-01T12:00:00Z",
          "mode": "0644",
          "nodeId": "node002"
        },
        {
          "name": "docs/logo.png",
          "blobId": "Bdd002",
          "entryType": "file",
          "modified": "2026-02-15T09:30:00Z",
          "mode": "0644",
          "nodeId": "node003"
        }
      ]
    }
  },
  "notCreated": {}
}, "R1"]]
</spanx></t>

</section>
</section>
<section anchor="the-unsupportedentry-error"><name>The unsupportedEntry Error</name>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

</section>
</section>
<section anchor="implementation-considerations"><name>Implementation Considerations</name>

<section anchor="modification-timestamps"><name>Modification Timestamps</name>

<t>Clients <bcp14>SHOULD</bcp14> provide an updated <spanx style="verb">modified</spanx> value when modifying
a node.  This gives clients control over the timestamp, for
example when preserving original modification times during file
synchronization.  Clients that do not care about preserving
timestamps can set <spanx style="verb">modified</spanx> to null to have the server use the
current time.</t>

<t>Clients may also choose to update the <spanx style="verb">modified</spanx> timestamp on a
parent directory when moving a child node in or out, to reflect
that the directory's contents have changed.</t>

</section>
<section anchor="timestamp-precision"><name>Timestamp Precision</name>

<t>The UTCDate type (RFC 3339) supports fractional seconds.
Servers <bcp14>SHOULD</bcp14> include sub-second precision in <spanx style="verb">created</spanx>,
<spanx style="verb">modified</spanx>, <spanx style="verb">accessed</spanx>, and <spanx style="verb">changed</spanx> timestamps where their
storage backend supports it.  Clients <bcp14>MUST</bcp14> preserve fractional
seconds when they send timestamps back to the server.</t>

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

<t>Servers should set <spanx style="verb">forbiddenNameChars</spanx> and <spanx style="verb">forbiddenNodeNames</spanx>
to include characters and names that are problematic for their
storage backend and for the broadest set of clients.</t>

<t>The following characters are problematic on common platforms:</t>

<t><list style="symbols">
  <t>Windows: <spanx style="verb">&lt;</spanx>, <spanx style="verb">&gt;</spanx>, <spanx style="verb">:</spanx>, <spanx style="verb">"</spanx>, <spanx style="verb">\</spanx>, <spanx style="verb">|</spanx>, <spanx style="verb">?</spanx>, <spanx style="verb">*</spanx>, and
control characters (U+0000-U+001F).  Windows also forbids
trailing dots and spaces in names.</t>
  <t>macOS: <spanx style="verb">:</spanx> (HFS+ legacy; displayed as <spanx style="verb">/</spanx> in Finder).</t>
  <t>Linux: the null byte (U+0000).</t>
</list></t>

<t>The following names are problematic:</t>

<t><list style="symbols">
  <t>All platforms: <spanx style="verb">.</spanx> and <spanx style="verb">..</spanx> (path traversal).</t>
  <t>Windows: reserved device names CON, PRN, AUX, NUL,
COM0-COM9, and LPT0-LPT9.  These are reserved regardless
of file extension (for example, "CON.txt" is also forbidden).</t>
</list></t>

<t>A server targeting broad client compatibility should include
at least <spanx style="verb">/&lt;&gt;:"\|?*</spanx> in <spanx style="verb">forbiddenNameChars</spanx> and at least
<spanx style="verb">.</spanx>, <spanx style="verb">..</spanx>, and the Windows reserved names in
<spanx style="verb">forbiddenNodeNames</spanx>.</t>

</section>
<section anchor="case-sensitivity"><name>Case Sensitivity</name>

<t>Windows and macOS filesystems are typically case-insensitive
(treating "Foo" and "foo" as the same name), while Linux
filesystems are typically case-sensitive.  Clients syncing to
case-insensitive platforms should use <spanx style="verb">compareCaseInsensitively</spanx>
on FileNode/set requests to prevent creating sibling nodes
whose names differ only in case, as these cannot coexist on
the target platform.</t>

</section>
<section anchor="access-time-updates"><name>Access Time Updates</name>

<t>Updating <spanx style="verb">accessed</spanx> on every file read generates significant
API traffic for little value.  Clients are encouraged to use a
"relatime" strategy similar to modern POSIX filesystems: only
update <spanx style="verb">accessed</spanx> if the current value is older than <spanx style="verb">modified</spanx>,
or if more than 24 hours have elapsed since the last <spanx style="verb">accessed</spanx>
update.  Clients should batch access time updates with their
next JMAP request rather than making a dedicated call.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security considerations</name>

<t>All security considerations from <xref target="JMAP-CORE"/> apply to this document.</t>

<section anchor="path-traversal"><name>Path Traversal</name>

<t>Clients that reconstruct filesystem paths from FileNode hierarchies
<bcp14>MUST</bcp14> validate the resulting paths and reject any that would escape
the intended directory tree.  Servers <bcp14>SHOULD</bcp14> include <spanx style="verb">/</spanx> in
<spanx style="verb">forbiddenNameChars</spanx> and <spanx style="verb">.</spanx> and <spanx style="verb">..</spanx> in <spanx style="verb">forbiddenNodeNames</spanx> to
prevent path traversal attacks via node names.</t>

</section>
<section anchor="symlink-targets"><name>Symlink Targets</name>

<t>Symlink targets are not validated by the server to point to
existing nodes.  Clients that resolve symlinks <bcp14>MUST</bcp14> guard
against symlink loops (a symlink pointing to an ancestor of
itself) and <bcp14>MUST NOT</bcp14> follow symlinks outside the FileNode tree.
Servers <bcp14>SHOULD</bcp14> impose a limit on the length of <spanx style="verb">target</spanx> values
and <bcp14>MAY</bcp14> reject targets containing ".." path components.</t>

</section>
<section anchor="denial-of-service"><name>Denial of Service</name>

<t>Deep nesting of FileNodes or very large numbers of children under a
single parent can consume significant server resources.  Servers
<bcp14>SHOULD</bcp14> enforce reasonable limits via <spanx style="verb">maxFileNodeDepth</spanx> and <bcp14>MAY</bcp14>
impose additional limits on the number of children per node.
Recursive operations such as destroying a subtree with
<spanx style="verb">onDestroyRemoveChildren</spanx> can be expensive; servers <bcp14>SHOULD</bcp14> impose
limits on the size of subtrees that can be destroyed in a single
operation.</t>

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

<t>The discoverability rules defined in this document mean that ancestor
nodes of shared content are visible (with <spanx style="verb">mayRead</spanx> false) to users
who have access to descendants.  While these ancestor nodes do not
expose file content, their names and structure may reveal information
about the file hierarchy.  Server administrators and users sharing
content should be aware of this.</t>

<t>A user who can destroy a node, but cannot discover all of its
descendants, can still learn that the node has children: the
destroy fails with "nodeHasChildren", or with "forbidden" when
onDestroyRemoveChildren is true.  Any failure reveals this.
The alternatives would be to reveal the ids of the hidden nodes,
or to destroy data the user cannot see, and both are worse.</t>

<t>Changes to the <spanx style="verb">shareWith</spanx> property on a node affect all descendants.
Removing sharing from a parent node will make its descendants
undiscoverable to the affected users, unless a descendant is
also shared with them directly, which may be surprising if
those users had been actively working with the shared files.</t>

</section>
<section anchor="content-security"><name>Content Security</name>

<t>Servers that perform content scanning or malware detection <bcp14>SHOULD</bcp14>
scan blobs referenced by FileNode objects.  The <spanx style="verb">mediaType</spanx> property is
client-asserted and <bcp14>MUST NOT</bcp14> be trusted for security decisions;
servers <bcp14>SHOULD</bcp14> independently verify content types where this matters.</t>

</section>
</section>
<section anchor="iana-considerations"><name>IANA considerations</name>

<section anchor="jmap-capability-registration-for-filenode"><name>JMAP Capability registration for "filenode"</name>

<t>IANA is requested to register the "filenode" JMAP Capability as follows:</t>

<t>Capability Name: urn:ietf:params:jmap:filenode</t>

<t>Specification document: this document</t>

<t>Intended use: common</t>

<t>Change Controller: IETF</t>

<t>Security and privacy considerations: this document, Security Considerations</t>

</section>
<section anchor="jmap-error-codes-registration-for-nodehaschildren"><name>JMAP Error Codes registration for "nodeHasChildren"</name>

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

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

<t>Intended use: common</t>

<t>Change Controller: IETF</t>

<t>Description: The node being destroyed is still referenced by other nodes which have not been destroyed.</t>

<t>Reference: this document</t>

</section>
<section anchor="jmap-error-codes-registration-for-unsupportedentry"><name>JMAP Error Codes registration for "unsupportedEntry"</name>

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

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

<t>Intended use: common</t>

<t>Change Controller: IETF</t>

<t>Description: An archive or extraction found entries that the archive format or the server cannot represent, and the client asked for an error rather than for the entries to be skipped.</t>

<t>Reference: this document</t>

</section>
<section anchor="jmap-data-types-registration-for-filenode"><name>JMAP Data Types registration for "FileNode"</name>

<t>IANA is requested to register the "FileNode" JMAP Data Type as follows:</t>

<t>Type Name: FileNode</t>

<t>Can Reference Blobs: Yes</t>

<t>Can Use For State Change: Yes</t>

<t>Capability: urn:ietf:params:jmap:filenode</t>

<t>Reference: this document</t>

</section>
<section anchor="jmap-filenode-types-registry"><name>JMAP FileNode Types Registry</name>

<t>IANA is requested to create a new "JMAP FileNode Types" registry
with the following initial values.  New registrations are subject
to Specification Required (<xref target="IANA-GUIDELINES"/>).
A registration <bcp14>MUST</bcp14> reference a specification that defines the
properties specific to the type and whether nodes of the type
may have children.</t>

<texttable>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>File</c>
      <c>A regular file with blob content</c>
      <c>this document</c>
      <c>Directory</c>
      <c>A collection that may contain child nodes</c>
      <c>this document</c>
      <c>SymLink</c>
      <c>A symbolic link to another path in the tree</c>
      <c>this document</c>
</texttable>

</section>
<section anchor="jmap-filenode-roles-registry"><name>JMAP FileNode Roles Registry</name>

<t>IANA is requested to create a new "JMAP FileNode Roles" registry
with the following initial values.  New registrations are subject
to Expert Review (<xref target="IANA-GUIDELINES"/>).</t>

<texttable>
      <ttcol align='left'>Role</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>root</c>
      <c>The base of a filesystem</c>
      <c>this document</c>
      <c>home</c>
      <c>A user's home directory</c>
      <c>this document</c>
      <c>temp</c>
      <c>Temporary space; may be cleaned up automatically</c>
      <c>this document</c>
      <c>trash</c>
      <c>Deleted data; may be removed automatically or manually</c>
      <c>this document</c>
      <c>documents</c>
      <c>Document storage</c>
      <c>this document</c>
      <c>downloads</c>
      <c>Downloaded files</c>
      <c>this document</c>
      <c>music</c>
      <c>Audio files</c>
      <c>this document</c>
      <c>pictures</c>
      <c>Photos and images</c>
      <c>this document</c>
      <c>videos</c>
      <c>Video files</c>
      <c>this document</c>
</texttable>

</section>
<section anchor="jmap-metadata-namespace-registration-for-xattr"><name>JMAP Metadata Namespace Registration for "xattr"</name>

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

<t>Namespace Identifier: xattr</t>

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

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

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

<t>Reference: this document</t>

<t>Intended Usage: common</t>

<t>Change Controller: IETF</t>

</section>
</section>
<section anchor="todo"><name>TODO</name>

<t><list style="symbols">
  <t>create real-world clients to test this</t>
</list></t>

</section>
<section anchor="changes"><name>Changes</name>

<t>EDITOR: please remove this section before publication.</t>

<t>The source of this document exists on github at: https://github.com/brong/draft-gondwana-jmap-filenode/</t>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<t>{backmatter}</t>

</section>


  </middle>

  <back>


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

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



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

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

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

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

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


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

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

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

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


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

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

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


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

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

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

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




    </references>

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



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

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

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


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

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

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

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

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

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




    </references>

</references>



  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA7V96XrbVpbgfzwFmvUjkptavSSWa6qaluRE3bbs0tKp6lSm
CBKghDIJsABQMitxffMQ8wDzLPMo8yRz1nvPBUhKTqXz5bMkErjLueeefdnZ
2YmavJlmR/G/vxt8iN/k0yy+bMoqucni7FOTFXVeFlEyGlXZnXnmvEyzKC3H
RTKDV9MqmTQ7edZMdv46S+Y7E3iigCd2Dr6J6sVoltc4ytVyDs+enV69icZJ
k92U1fIorps0WsxT+Ls+ir95cbgflaO6nGb4d5TPq6O4qRZ1c7i//3L/MPqY
Le/LKoVRiiariqzZOcGpo7pJivQvybQsYIZlVkfz/Cj+oSnH/bguq6bKJjX8
tpzhLz9GUbJobsvqKIp3ohj+ywuY+/Vu/G1ZpPdJkdCHvLPXVVmEn5fVzVH8
JqmbWZJP6ZMMfzuKR/Dozb9N5JsmS2a743IWRUVZzZImv8uO6GkE4c7x+4vT
o/jizTHt2H18+d3g4uz8W/rm5Yuv+Zt3pydng6s/feAXXnzz9Bv6+PribOfq
9N2Ht4Mr+ea5vHA2OB/sfHt9dnL69uz89JLnOTh84ed5/fb969M/XgEYd052
+fBuZI98gKNpOYLTtws+Pzm7Ont/Pni7/q0x/JU3cNLJ1L/57vRqcDK4GtjX
PKbMsiaBw0+iKC8mIaCOB29PBv9Jq3/29csD+eziRD988fT5oZlmcPZWIXpg
1j14e3p+Mri45On9xOMEUDRNqjrY49Xg+OpSwH9gDuYP1++vBvLFs8Pn9MX3
p6/d+l4eyKGcnx2/P+HzeH7w8pso2tnZiZNR3VTJuImiq9uM79AoqbN4XpWA
ouU03hJM2MaP7vI0q+MGnkxG+TRvlnFTxov5tEzSGLA8Tsv7Av+IkmqUw7jV
Mh7lBf5AQO7G8dVtXtuPYvgTtjvN4P24h0fb69NI46SIR1m8qLMUwB/DI3EJ
81a8RHf7611cOAziPomTNK1hMDi92zLF9WWf5iXsCAeHL/A7pAH1sm6yWYz3
8ia+z5tb3FbUAB2o43IS6+HDp0kTJ1Wm20/j0VKWUmWzssnsaAo1XBZCd5an
6TSLot8gUajKdDFGFIwi2sTWTz+5C/f5c/z//tf/jv/98v15/A6mjgfz+TQH
UoQ7+iCjbiO0kvgmK7IqH0fuiAA5gYAU41u45fnfc9gPrXyUNfdZBgCJx9M8
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

-->

</rfc>

