<?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.34 (Ruby 3.3.8) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-ietf-jmap-metadata-02" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="JMAP Object Metadata">JMAP Object Metadata</title>

    <author initials="M." surname="De Gennaro" fullname="Mauro De Gennaro">
      <organization abbrev="Stalwart Labs">Stalwart Labs LLC</organization>
      <address>
        <postal>
          <street>1309 Coffeen Avenue, Suite 1200</street>
          <city>Sheridan</city>
          <region>WY</region>
          <code>82801</code>
          <country>USA</country>
        </postal>
        <email>mauro@stalw.art</email>
        <uri>https://stalw.art</uri>
      </address>
    </author>

    <date year="2026" month="May" day="27"/>

    
    <workgroup>JMAP</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 41?>

<t>This document defines an extension to the JSON Meta Application Protocol (JMAP) that lets clients and servers attach metadata to existing JMAP data types. Each opted-in data type gains two new properties, <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx>, whose values are objects keyed by <em>namespace identifier</em>. 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 <spanx style="verb">/get</spanx>, <spanx style="verb">/set</spanx>, <spanx style="verb">/changes</spanx>, and <spanx style="verb">/query</spanx> methods to read, modify, and synchronize it.</t>



    </abstract>



  </front>

  <middle>


<?line 45?>

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

<t>JMAP (<xref target="RFC8620"/>, JSON Meta Application Protocol) is a generic protocol for synchronizing data, such as mail, calendars or contacts, 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>Metadata, or annotations, are auxiliary data elements that provide additional context, user-defined properties, or system-specific information about primary data objects. They enable user annotations, application-specific settings, collaborative tagging, and similar functionality. Other protocols have addressed this need with mechanisms such as the IMAP METADATA extension <xref target="RFC5464"/> and WebDAV dead properties <xref target="RFC4918"/>; this specification provides an analogous facility within JMAP.</t>

<t>This document defines a uniform mechanism for managing such metadata. Each opted-in JMAP data type gains a <spanx style="verb">metadata</spanx> property (shared metadata) and, optionally, a <spanx style="verb">privateMetadata</spanx> property (per-user metadata). The value of each property is an object keyed by <em>namespace identifier</em>. This document defines no initial namespaces; vendors use domain-name identifiers for proprietary extensions, and additional registered identifiers may be defined by future specifications.</t>

<t>Because metadata is carried as a property on the related object, the existing JMAP methods for that data type apply unchanged. Clients fetch metadata with the type's <spanx style="verb">/get</spanx> method, modify it through <spanx style="verb">/set</spanx> patches, learn of changes through <spanx style="verb">/changes</spanx>, and search across metadata and primary properties together through <spanx style="verb">/query</spanx>.</t>

<section anchor="notational-conventions"><name>Notational Conventions</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 anchor="addition-to-the-capabilities-object"><name>Addition to the Capabilities Object</name>

<t>The capabilities object is returned as part of the JMAP Session object; see <xref section="2" sectionFormat="of" target="RFC8620"/>. This document defines one additional capability URI.</t>

<section anchor="urnietfparamsjmapmetadata"><name>urn:ietf:params:jmap:metadata</name>

<t>This capability represents support for the metadata extension defined in this document. Servers that include this capability provide the <spanx style="verb">metadata</spanx> and (optionally) <spanx style="verb">privateMetadata</spanx> properties on the data types they list.</t>

<t>The value of this property in the JMAP Session "capabilities" property is an empty object.</t>

<t>The value of this property in an account's "accountCapabilities" property is an object containing the following field:</t>

<dl newline="true">
  <dt><strong>dataTypes</strong>: <spanx style="verb">String[DataTypeMetadataInfo]</spanx></dt>
  <dd>
    <t>An object whose keys are the names of JMAP data types for which the server supports metadata in this account. A type that does not appear in this object does not gain the <spanx style="verb">metadata</spanx> or <spanx style="verb">privateMetadata</spanx> properties in this account. The value associated with each type is a <spanx style="verb">DataTypeMetadataInfo</spanx> object as defined below.</t>
  </dd>
</dl>

<t>A <strong>DataTypeMetadataInfo</strong> object has the following fields:</t>

<dl newline="true">
  <dt><strong>namespaces</strong>: <spanx style="verb">String[]</spanx></dt>
  <dd>
    <t>The set of IANA-registered metadata namespace names (as defined in <xref target="namespaces-registry"></xref>) that the server supports on this data type. Each value <bcp14>MUST</bcp14> be a registered name (a sequence of US-ASCII letters, digits, hyphens, and underscores, with no dot). Vendor (domain-name) namespaces <bcp14>MUST NOT</bcp14> appear in this list; their support is signalled by <spanx style="verb">supportsVendorNamespaces</spanx> instead.</t>
  </dd>
  <dt><strong>supportsVendorNamespaces</strong>: <spanx style="verb">Boolean</spanx> (default: false)</dt>
  <dd>
    <t>Indicates whether the server accepts vendor (domain-name) namespaces on this data type. If true, any well-formed domain-name namespace (<xref target="namespaces"></xref>) may be written by clients, subject to the other constraints of this specification (access control, <spanx style="verb">maxDepth</spanx>, quota). If false, any <spanx style="verb">/set</spanx> operation that targets a domain-name namespace <bcp14>MUST</bcp14> be rejected with an "invalidProperties" SetError, and any subselector or filter condition referencing such a namespace <bcp14>MUST</bcp14> be treated as unsupported per the rules of <xref target="get-extension"></xref> and <xref target="filter-conditions"></xref>.
</t>

    <t>A server <bcp14>SHOULD NOT</bcp14> advertise a data type that supports neither registered namespaces (empty <spanx style="verb">namespaces</spanx>) nor vendor namespaces (<spanx style="verb">supportsVendorNamespaces: false</spanx>), since such an entry advertises support for nothing.</t>
  </dd>
  <dt><strong>supportsPrivate</strong>: <spanx style="verb">Boolean</spanx> (default: false)</dt>
  <dd>
    <t>Indicates whether this account, on this data type, supports per-user <spanx style="verb">privateMetadata</spanx>. This is a server feature flag, not a per-user permission. If false, the <spanx style="verb">privateMetadata</spanx> property <bcp14>MUST</bcp14> be absent from response objects of this type, all <spanx style="verb">privateMetadata*</spanx> filter conditions (<xref target="filter-conditions"></xref>) <bcp14>MUST</bcp14> be rejected with an "unsupportedFilter" error, and any <spanx style="verb">/set</spanx> operation that targets <spanx style="verb">privateMetadata</spanx> <bcp14>MUST</bcp14> be rejected with an "invalidProperties" SetError. Per-user write authorization on a <spanx style="verb">privateMetadata</spanx> write that the server otherwise supports is handled separately, through the "forbidden" SetError defined in <xref target="access-control"></xref>.</t>
  </dd>
  <dt><strong>maxDepth</strong>: <spanx style="verb">UnsignedInt|null</spanx> (default: null)</dt>
  <dd>
    <t>Maximum depth of nested objects within a namespace value on this data type. A depth of 1 indicates only flat properties are supported; a depth of 2 allows one level of nesting; and so forth. A value of <spanx style="verb">null</spanx> indicates no server-enforced limit; clients <bcp14>SHOULD</bcp14> treat <spanx style="verb">null</spanx> as unbounded, subject to the quota and per-value size limits the server may otherwise enforce. Depth counting is defined in <xref target="namespaces"></xref>.</t>
  </dd>
</dl>

<t>A worked example of the capability object appears in <xref target="example-capability"></xref>.</t>

</section>
</section>
</section>
<section anchor="the-metadata-properties"><name>The Metadata Properties</name>

<t>This extension introduces two properties on each opted-in data type:</t>

<dl newline="true">
  <dt><strong>metadata</strong>: <spanx style="verb">String[Object]</spanx> (default: <spanx style="verb">{}</spanx>)</dt>
  <dd>
    <t>An object containing shared metadata associated with the object. Each key is a namespace identifier (see <xref target="namespaces"></xref>) and each value is structured according to the namespace's definition. Shared metadata is visible to every user with read access to the related object, subject to <xref target="access-control"></xref>. The server <bcp14>MUST NOT</bcp14> return <spanx style="verb">null</spanx> for this property and <bcp14>MUST</bcp14> always include it on opted-in data types, with an empty object <spanx style="verb">{}</spanx> when no metadata is set.</t>
  </dd>
  <dt><strong>privateMetadata</strong>: <spanx style="verb">String[Object]</spanx> (default: <spanx style="verb">{}</spanx>)</dt>
  <dd>
    <t>An object containing per-user metadata associated with the object, with the same structure as <spanx style="verb">metadata</spanx>. Private metadata is visible only to the user who set it; the server <bcp14>MUST</bcp14> filter responses so that each user sees only their own <spanx style="verb">privateMetadata</spanx> content, as described in <xref target="access-control"></xref>. This property <bcp14>MUST</bcp14> be present in response objects (with value <spanx style="verb">{}</spanx> if the user has set no private metadata on the object) when the data type's <spanx style="verb">DataTypeMetadataInfo</spanx> has <spanx style="verb">supportsPrivate: true</spanx>, and <bcp14>MUST</bcp14> be absent from response objects when <spanx style="verb">supportsPrivate</spanx> is false. The server <bcp14>MUST NOT</bcp14> return <spanx style="verb">null</spanx> for this property.</t>
  </dd>
</dl>

<t>Both properties are mutable and behave like any other property of the related object. They appear in <spanx style="verb">/get</spanx> responses, accept patches through <spanx style="verb">/set</spanx>, contribute to the related type's state string (<xref target="state-behavior"></xref>), and may be searched through the <spanx style="verb">/query</spanx> filter conditions defined in <xref target="filter-conditions"></xref>.</t>

<section anchor="namespaces"><name>Namespaces</name>

<t>The keys of the <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx> objects are <em>namespace identifiers</em>. Each identifier <bcp14>MUST</bcp14> be one of:</t>

<t><list style="symbols">
  <t>A <em>registered name</em>: a sequence of US-ASCII letters, digits, hyphens, and underscores, with no dot ("."). Registered names may be defined by future specifications using the procedure in <xref target="namespaces-registry"></xref>; this document defines no registered names.</t>
  <t>A <em>domain name</em> controlled by the vendor providing the namespace, in DNS form (containing at least one ".", e.g., <spanx style="verb">example.com</spanx>, <spanx style="verb">acme.example.org</spanx>). Vendors <bcp14>MAY</bcp14> use domain-name namespaces for proprietary metadata without registration; the dot in the name guarantees no collision with registered names.</t>
</list></t>

<t>The value associated with each namespace key is an object whose internal structure is defined by the specification or vendor owning that namespace. Property names within the namespace object follow normal JSON conventions; they do not need to be domain-prefixed, since cross-namespace isolation is already provided by the top-level key.</t>

<t>Example:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "metadata": {
    "acme.example.com": {
      "color": "blue",
      "priority": "high",
      "project": {
        "id": "ALPHA-2024",
        "deadline": "2024-12-31"
      }
    }
  }
}
]]></sourcecode></figure>

<t>If the account capability specifies a <spanx style="verb">maxDepth</spanx> for a data type, the nesting depth of a namespace value <bcp14>MUST NOT</bcp14> exceed it. Depth is counted as the longest path of nested <em>objects</em> from the namespace value to any descendant: a flat object whose values are scalars or arrays has depth 1, an object containing one level of nested objects has depth 2, and so forth. Arrays do not contribute to depth themselves, but objects appearing inside arrays do: for example, <spanx style="verb">{"x": [{"y": 1}]}</spanx> has depth 2 because the inner <spanx style="verb">{"y": 1}</spanx> is one level of nesting below the outer object. Scalar values (string, number, boolean, null) and empty arrays or objects have depth 1 at the position they occupy. Servers <bcp14>MUST</bcp14> reject patches that would produce a structure exceeding <spanx style="verb">maxDepth</spanx> with an "invalidProperties" SetError.</t>

<t>Servers <bcp14>MUST</bcp14> preserve namespace keys they do not recognize on update. A patch that targets one namespace <bcp14>MUST NOT</bcp14> remove or alter the content of any other namespace.</t>

<t>Vendors are encouraged to register namespace identifiers that are likely to be useful beyond the vendor's own products, using the procedure in <xref target="namespaces-registry"></xref>. Registration enhances interoperability and avoids fragmentation.</t>

<section anchor="namespace-removal"><name>Namespaces Removed Mid-Lifetime</name>

<t>If a server stops advertising a namespace that has previously had data written under it (for example, because of a server reconfiguration or a vendor withdrawing support), the existing stored data <bcp14>MUST</bcp14> continue to be returned by <spanx style="verb">/get</spanx> for read-only access. Any <spanx style="verb">/set</spanx> operation that targets the namespace, other than a patch that removes the namespace entirely (<spanx style="verb">"metadata/&lt;namespace&gt;": null</spanx> or <spanx style="verb">"privateMetadata/&lt;namespace&gt;": null</spanx>), <bcp14>MUST</bcp14> be rejected with an "invalidProperties" SetError. This ensures clients can always migrate data off a withdrawn namespace, but cannot continue to extend it.</t>

</section>
</section>
<section anchor="state-behavior"><name>State Behavior</name>

<t>Changes to <spanx style="verb">metadata</spanx> or <spanx style="verb">privateMetadata</spanx> are changes to the related object. They advance the related type's state string, appear in the related type's <spanx style="verb">/changes</spanx> response, and are otherwise indistinguishable from changes to any other property of that type, with the following clarification:</t>

<t>Because <spanx style="verb">privateMetadata</spanx> is filtered per viewer, a change made by user A to <spanx style="verb">privateMetadata</spanx> on a shared object <bcp14>MUST</bcp14> advance the related type's state string for user A and <bcp14>MUST NOT</bcp14> advance it for any other user. The same rule applies to <spanx style="verb">/queryChanges</spanx>: a change to user B's <spanx style="verb">privateMetadata</spanx> <bcp14>MUST NOT</bcp14> cause user A's <spanx style="verb">Foo/queryChanges</spanx> to consider the object changed for filter purposes, since the change is not visible to A. A server that cannot implement per-viewer state filtering <bcp14>MUST NOT</bcp14> advertise the <spanx style="verb">urn:ietf:params:jmap:metadata</spanx> capability for any account in which <spanx style="verb">supportsPrivate</spanx> would be true for any data type, since cross-viewer state advancement leaks the existence of another user's private write (see <xref target="security-considerations"></xref>).</t>

</section>
</section>
<section anchor="standard-method-extensions"><name>Standard Method Extensions</name>

<t>For each data type listed in the <spanx style="verb">dataTypes</spanx> field of the account capability, the standard JMAP methods for that type are extended as described in the following subsections. These extensions are mandatory for the listed types: a server that advertises a data type in <spanx style="verb">dataTypes</spanx> <bcp14>MUST</bcp14> implement them.</t>

<section anchor="get-extension"><name>/get</name>

<t>When a data type appears in <spanx style="verb">dataTypes</spanx>, omitting <spanx style="verb">properties</spanx> (or setting it to <spanx style="verb">null</spanx>) in <spanx style="verb">Foo/get</spanx> <bcp14>MUST</bcp14> return both <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx> (the latter where <spanx style="verb">supportsPrivate</spanx> is true) alongside the data type's other properties. The two properties may also be requested explicitly by name in the <spanx style="verb">properties</spanx> array, like any other JMAP property.</t>

<t>When a client wants only a subset of the metadata, it <bcp14>MAY</bcp14> request individual namespaces using slash-separated subselector paths in the <spanx style="verb">properties</spanx> argument. The following rules apply to subselectors introduced by this specification:</t>

<t><list style="symbols">
  <t>Each subselector path <bcp14>MUST</bcp14> have exactly two segments, of the shape <spanx style="verb">metadata/&lt;namespace&gt;</spanx> or <spanx style="verb">privateMetadata/&lt;namespace&gt;</spanx>. Paths with zero, one, or three-or-more segments under these roots <bcp14>MUST</bcp14> be rejected with an "invalidArguments" method-level error.</t>
  <t>Multiple subselectors with the same root combine by union. For example, <spanx style="verb">["metadata/x", "metadata/y"]</spanx> returns <spanx style="verb">{"metadata": {"x": ..., "y": ...}}</spanx> (and nothing else under <spanx style="verb">metadata</spanx>).</t>
  <t>An explicit root entry supersedes subselectors with the same root. For example, <spanx style="verb">["metadata", "metadata/x"]</spanx> returns the complete <spanx style="verb">metadata</spanx> object; the <spanx style="verb">metadata/x</spanx> entry is redundant rather than restrictive.</t>
  <t>A subselector whose namespace is not supported on the data type <bcp14>MUST</bcp14> be silently omitted from the response. A namespace is supported if it is a registered name listed in <spanx style="verb">namespaces</spanx>, or if it is a domain name and <spanx style="verb">supportsVendorNamespaces</spanx> is true. This lets clients perform capability-tolerant fetches without first consulting the session capability.</t>
  <t>This specification defines slash-path subselectors only for <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx>. The use of slash-path subselectors with any other property name is outside the scope of this document.</t>
</list></t>

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

<t>The <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx> properties are mutable.</t>

<t>In a <spanx style="verb">create</spanx> entry of <spanx style="verb">Foo/set</spanx>, each property's value <bcp14>MUST</bcp14> be a complete JSON object (possibly the empty object <spanx style="verb">{}</spanx>). A value of <spanx style="verb">null</spanx> for either property <bcp14>MUST</bcp14> be rejected with an "invalidProperties" SetError; the canonical "no metadata" form is <spanx style="verb">{}</spanx>.</t>

<t>In an <spanx style="verb">update</spanx> entry of <spanx style="verb">Foo/set</spanx>, clients <bcp14>MAY</bcp14> either send a complete object as the value of <spanx style="verb">metadata</spanx> or <spanx style="verb">privateMetadata</spanx> (replacing the previous value entirely), or use the PatchObject form (<xref section="5.3" sectionFormat="of" target="RFC8620"/>) with the keys treated as JSON Pointer paths <xref target="RFC6901"/> relative to the object root. Patch paths follow the structure <spanx style="verb">metadata/&lt;namespace&gt;</spanx> (replacing or removing an entire namespace value), <spanx style="verb">metadata/&lt;namespace&gt;/&lt;key&gt;</spanx> (modifying a single property within a namespace), <spanx style="verb">privateMetadata/&lt;namespace&gt;</spanx>, and <spanx style="verb">privateMetadata/&lt;namespace&gt;/&lt;key&gt;</spanx>. As required by <xref target="RFC6901"/>, any <spanx style="verb">/</spanx> character within a key <bcp14>MUST</bcp14> be escaped as <spanx style="verb">~1</spanx>, and any <spanx style="verb">~</spanx> character <bcp14>MUST</bcp14> be escaped as <spanx style="verb">~0</spanx>.</t>

<t>Setting a patch value to <spanx style="verb">null</spanx> removes the targeted key, per standard PatchObject semantics (<xref section="5.3" sectionFormat="of" target="RFC8620"/>). Setting a path to a complete object value replaces whatever was previously at that path; in particular, a patch of the shape <spanx style="verb">"metadata/&lt;namespace&gt;": { ... }</spanx> replaces the entire content of that namespace, deleting any keys not present in the new value. Clients that wish to add or update individual properties without removing others <bcp14>MUST</bcp14> patch the specific keys.</t>

<t>The server <bcp14>MUST</bcp14> validate every write against the account capability for the data type. When more than one of the following rules applies, the server <bcp14>MUST</bcp14> evaluate them in the order listed; the first matching rule determines the SetError:</t>

<t><list style="numbers" type="1">
  <t>If the user lacks the required access on the related object (write permission to modify shared <spanx style="verb">metadata</spanx>, or read permission to modify their own <spanx style="verb">privateMetadata</spanx>), reject with "forbidden".</t>
  <t>If the path begins with <spanx style="verb">privateMetadata</spanx> and <spanx style="verb">supportsPrivate</spanx> is false for this data type, reject with "invalidProperties".</t>
  <t>If the targeted namespace is not supported on this data type, reject with "invalidProperties" (except for the migration case in <xref target="namespace-removal"></xref>). A namespace is supported if it is a registered name listed in <spanx style="verb">namespaces</spanx>, or if it is a domain name and <spanx style="verb">supportsVendorNamespaces</spanx> is true.</t>
  <t>If a namespace value would exceed <spanx style="verb">maxDepth</spanx>, reject with "invalidProperties".</t>
</list></t>

<t>When a patch modifies one namespace, all other namespaces under <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx> <bcp14>MUST</bcp14> be preserved unchanged. This is a natural consequence of JSON Pointer patch semantics; it is mentioned here only to emphasize that no special "preserve unknown properties" handling beyond ordinary patch semantics is required.</t>

<section anchor="quota-enforcement-on-set"><name>Quota Enforcement on /set</name>

<t>Servers <bcp14>SHOULD</bcp14> enforce quota limits on the total storage consumed by metadata within an account, as described in <xref target="quota"></xref>. If a patch would cause the account to exceed its metadata quota, the server <bcp14>MUST</bcp14> reject the operation with an "overQuota" SetError.</t>

</section>
</section>
<section anchor="changes-extension"><name>/changes</name>

<t>For each data type listed in <spanx style="verb">dataTypes</spanx>, the <spanx style="verb">Foo/changes</spanx> request accepts the following additional optional argument:</t>

<dl newline="true">
  <dt><strong>ignoreMetadataOnlyChanges</strong>: <spanx style="verb">Boolean</spanx> (default: false)</dt>
  <dd>
    <t>If true, the server <bcp14>MUST</bcp14> exclude from the <spanx style="verb">updated</spanx> array any id whose only changes since <spanx style="verb">sinceState</spanx>, from the viewer's perspective, are confined to <spanx style="verb">metadata</spanx> and/or <spanx style="verb">privateMetadata</spanx>. Ids with changes to additional properties (whether those additional changes coexist with metadata changes or not) remain present. The state string still advances normally, so a client using this argument continues to see correct synchronization for all non-metadata-only changes; metadata-only changes are simply not reported to this client. When this argument is true, <spanx style="verb">updatedProperties</spanx> (defined below) <bcp14>MUST</bcp14> be <spanx style="verb">null</spanx> in the response, since no metadata-only ids remain that would make it useful.</t>
  </dd>
</dl>

<t>The response is extended to include the following additional argument:</t>

<dl>
  <dt><strong>updatedProperties</strong>: <spanx style="verb">String[]|null</spanx></dt>
  <dd>
    <t>This argument is determined <em>per viewer</em>: each user's <spanx style="verb">Foo/changes</spanx> response is computed against the changes visible to that user (in particular, <spanx style="verb">privateMetadata</spanx> written by other users is invisible). If, from the viewer's perspective, the only properties that have changed on every id in the <spanx style="verb">updated</spanx> array since the old state are <spanx style="verb">metadata</spanx> and/or <spanx style="verb">privateMetadata</spanx>, this argument <bcp14>MUST</bcp14> be set to a list containing only those property names (e.g., <spanx style="verb">["metadata"]</spanx>, <spanx style="verb">["privateMetadata"]</spanx>, or <spanx style="verb">["metadata", "privateMetadata"]</spanx>). If any other property of any id in the array may also have changed (from the viewer's perspective), or if the server cannot determine the answer for any id in the array, this argument <bcp14>MUST</bcp14> be <spanx style="verb">null</spanx>. The argument applies uniformly to all ids in <spanx style="verb">updated</spanx>; per-id granularity is not provided.</t>
  </dd>
</dl>

<t>This argument follows the same convention used by <spanx style="verb">Mailbox/changes</spanx> in <xref section="2.5" sectionFormat="of" target="RFC8621"/>.</t>

</section>
<section anchor="querychanges"><name>/queryChanges</name>

<t><spanx style="verb">Foo/queryChanges</spanx> is unchanged in its method signature, but its per-viewer behavior on shared objects with per-user <spanx style="verb">privateMetadata</spanx> <bcp14>MUST</bcp14> follow the rule given in <xref target="state-behavior"></xref>: a change to another user's <spanx style="verb">privateMetadata</spanx> <bcp14>MUST NOT</bcp14> cause this user's <spanx style="verb">Foo/queryChanges</spanx> to consider the object changed for filter purposes.</t>

</section>
<section anchor="filter-conditions"><name>/query</name>

<t>For each data type listed in <spanx style="verb">dataTypes</spanx>, the FilterCondition object for <spanx style="verb">Foo/query</spanx> is extended with the optional fields defined below. Several of those fields take a <spanx style="verb">MetadataTextMatch</spanx> value.</t>

<t>A <strong>MetadataTextMatch</strong> object has the following fields:</t>

<dl newline="true">
  <dt><strong>path</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>The path within the metadata object to match against, of the form <spanx style="verb">&lt;namespace&gt;</spanx> or <spanx style="verb">&lt;namespace&gt;/&lt;key&gt;</spanx> (with <spanx style="verb">/</spanx> and <spanx style="verb">~</spanx> escaped per <xref target="RFC6901"/> where applicable). Same syntax as the value of <spanx style="verb">metadataExists</spanx>.</t>
  </dd>
  <dt><strong>value</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>The string to search for at <spanx style="verb">path</spanx>. The interpretation of this string (substring containment versus exact equality) is determined by the FilterCondition field that carries the <spanx style="verb">MetadataTextMatch</spanx>.</t>
  </dd>
</dl>

<t>The extended FilterCondition fields are:</t>

<dl newline="true">
  <dt><strong>metadataExists</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>A path of the form <spanx style="verb">&lt;namespace&gt;</spanx> or <spanx style="verb">&lt;namespace&gt;/&lt;key&gt;</spanx> (with <spanx style="verb">/</spanx> and <spanx style="verb">~</spanx> escaped per <xref target="RFC6901"/> where applicable). Matches an object if and only if a value is present at the given path within the object's <spanx style="verb">metadata</spanx> property. A namespace-only path matches if the namespace key is present and its value is not the empty object <spanx style="verb">{}</spanx>.</t>
  </dd>
  <dt><strong>privateMetadataExists</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>As <spanx style="verb">metadataExists</spanx>, but matches against the authenticated user's <spanx style="verb">privateMetadata</spanx>.</t>
  </dd>
  <dt><strong>metadataTextContains</strong>: <spanx style="verb">MetadataTextMatch</spanx></dt>
  <dd>
    <t>Matches an object if the <spanx style="verb">metadata</spanx> value at the supplied <spanx style="verb">path</spanx> is a string that contains the supplied <spanx style="verb">value</spanx> as a case-insensitive substring. The condition does not match if the path does not exist within <spanx style="verb">metadata</spanx>, or if the value at the path is not a string.</t>
  </dd>
  <dt><strong>privateMetadataTextContains</strong>: <spanx style="verb">MetadataTextMatch</spanx></dt>
  <dd>
    <t>As <spanx style="verb">metadataTextContains</spanx>, but searches the authenticated user's <spanx style="verb">privateMetadata</spanx>.</t>
  </dd>
  <dt><strong>metadataTextEquals</strong>: <spanx style="verb">MetadataTextMatch</spanx></dt>
  <dd>
    <t>Matches an object if the <spanx style="verb">metadata</spanx> value at the supplied <spanx style="verb">path</spanx> is a string that is exactly equal (case-sensitive, byte-for-byte) to the supplied <spanx style="verb">value</spanx>. The condition does not match if the path does not exist within <spanx style="verb">metadata</spanx>, or if the value at the path is not a string.</t>
  </dd>
  <dt><strong>privateMetadataTextEquals</strong>: <spanx style="verb">MetadataTextMatch</spanx></dt>
  <dd>
    <t>As <spanx style="verb">metadataTextEquals</spanx>, but searches the authenticated user's <spanx style="verb">privateMetadata</spanx>.</t>
  </dd>
</dl>

<t>The following availability rules apply to all six conditions:</t>

<t><list style="symbols">
  <t>Servers <bcp14>MUST</bcp14> support <spanx style="verb">metadataExists</spanx> and <spanx style="verb">privateMetadataExists</spanx> (where <spanx style="verb">supportsPrivate</spanx> is true), since they require only a presence check.</t>
  <t>Servers <bcp14>MAY</bcp14> reject any of the four text-match conditions with an "unsupportedFilter" error if implementation cost or storage layout makes them infeasible. Clients <bcp14>SHOULD</bcp14> be prepared to fall back to a client-side scan in this case.</t>
  <t>Any <spanx style="verb">privateMetadata*</spanx> condition (existence or text) <bcp14>MUST</bcp14> be rejected with an "unsupportedFilter" error if <spanx style="verb">supportsPrivate</spanx> is false for the data type.</t>
  <t>A condition that names a namespace not supported on the data type <bcp14>MUST</bcp14> match no objects (it does not produce an error; absent data simply matches no presence or text check). A namespace is supported if it is a registered name listed in <spanx style="verb">namespaces</spanx>, or if it is a domain name and <spanx style="verb">supportsVendorNamespaces</spanx> is true.</t>
</list></t>

<t>These conditions compose with the data type's existing filter conditions through the usual <spanx style="verb">AND</spanx>/<spanx style="verb">OR</spanx>/<spanx style="verb">NOT</spanx> operators (<xref section="5.5" sectionFormat="of" target="RFC8620"/>). For example, a client may query for Email objects in a particular mailbox whose vendor metadata contains a search term in a single server-side query, as shown in <xref target="example-query"></xref>.</t>

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

<t>Access control for metadata follows the access control of the related object. The two properties are governed by different rules:</t>

<t><list style="symbols">
  <t>The <spanx style="verb">metadata</spanx> property is shared. A user who has read access to the related object <bcp14>MAY</bcp14> read the object's <spanx style="verb">metadata</spanx>. A user who has write access to the related object <bcp14>MAY</bcp14> modify the object's <spanx style="verb">metadata</spanx>. For shareable JMAP data types as defined in <xref section="4" sectionFormat="of" target="RFC9670"/>, "read" and "write" mean the <spanx style="verb">mayRead</spanx> and <spanx style="verb">mayWrite</spanx> permissions of the related object (or the equivalent indicators defined by the type-specific specification).</t>
  <t>The <spanx style="verb">privateMetadata</spanx> property is per-user. The server <bcp14>MUST</bcp14> filter responses so that each user sees only the <spanx style="verb">privateMetadata</spanx> content they themselves wrote. Private metadata written by another user on the same related object <bcp14>MUST NOT</bcp14> be visible. To write <spanx style="verb">privateMetadata</spanx> on a related object, the user needs only read access to the related object; write access on the related object is not required.</t>
</list></t>

<t>The server <bcp14>MUST</bcp14> enforce these rules consistently across <spanx style="verb">/get</spanx>, <spanx style="verb">/set</spanx>, <spanx style="verb">/query</spanx>, <spanx style="verb">/queryChanges</spanx>, and <spanx style="verb">/changes</spanx>. If a user attempts to read <spanx style="verb">metadata</spanx> on an object they cannot read, the server <bcp14>MUST</bcp14> return the same error it returns for any other property of an inaccessible object. If a user attempts to write <spanx style="verb">metadata</spanx> without write permission on the related object, or to write <spanx style="verb">privateMetadata</spanx> without read permission, the server <bcp14>MUST</bcp14> reject the operation with a "forbidden" SetError.</t>

<t>If <spanx style="verb">supportsPrivate</spanx> is false for the data type, the server <bcp14>MUST</bcp14> reject every write that targets <spanx style="verb">privateMetadata</spanx> on that type with an "invalidProperties" SetError, regardless of the user's permissions on the related object.</t>

<t>When sharing permissions on a related object change, the visibility of its <spanx style="verb">metadata</spanx> changes accordingly. <spanx style="verb">privateMetadata</spanx> belonging to a user remains visible to that user as long as the user retains read access to the related object; if read access is revoked, the user's <spanx style="verb">privateMetadata</spanx> <bcp14>SHOULD</bcp14> be hidden along with the rest of the object.</t>

<section anchor="account-delegation-and-administrative-access"><name>Account Delegation and Administrative Access</name>

<t>Servers that support account delegation, impersonation, or administrative access have to decide whether a delegated session sees another user's <spanx style="verb">privateMetadata</spanx> on objects shared with both. Such exposure is rarely intended. Unless the deployment has explicitly authorized per-user metadata access for the delegated session, servers <bcp14>SHOULD NOT</bcp14> expose the account owner's <spanx style="verb">privateMetadata</spanx> to delegated sessions, and <bcp14>SHOULD NOT</bcp14> permit delegated sessions to write <spanx style="verb">privateMetadata</spanx> that would be attributed to the account owner. When a delegated session does write <spanx style="verb">privateMetadata</spanx>, the server <bcp14>MUST</bcp14> attribute the write to the authenticated identity of the session (the delegate), not to the account owner.</t>

</section>
</section>
<section anchor="quota"><name>Quota</name>

<t>Servers <bcp14>SHOULD</bcp14> enforce quota limits on the storage consumed by metadata within an account. Unbounded metadata growth could be exploited to exhaust resources, particularly because <spanx style="verb">privateMetadata</spanx> is per-user and so a single shared object can carry one private payload per user with access to it.</t>

<t>Servers that support the JMAP Quotas extension <xref target="RFC9425"/> <bcp14>SHOULD</bcp14> integrate metadata storage into the quota framework defined there. Servers that do not implement <xref target="RFC9425"/> <bcp14>SHOULD</bcp14> still enforce implementation-defined limits and reject overruns with an "overQuota" SetError.</t>

<t>The size metric used for metadata quota is implementation-defined; clients <bcp14>SHOULD NOT</bcp14> assume that two servers compute identical sizes for the same data. Servers that wish to expose a predictable metric to clients <bcp14>SHOULD</bcp14> document it.</t>

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

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

<t>A session for an account whose server supports metadata on three data types, with varying private-metadata and depth settings:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "capabilities": {
    "urn:ietf:params:jmap:metadata": {}
  },
  "accounts": {
    "A1": {
      "accountCapabilities": {
        "urn:ietf:params:jmap:metadata": {
          "dataTypes": {
            "Email": {
              "namespaces": [],
              "supportsVendorNamespaces": true,
              "supportsPrivate": true,
              "maxDepth": 4
            },
            "Mailbox": {
              "namespaces": [],
              "supportsVendorNamespaces": true,
              "supportsPrivate": true,
              "maxDepth": null
            },
            "CalendarEvent": {
              "namespaces": [],
              "supportsVendorNamespaces": true,
              "supportsPrivate": false,
              "maxDepth": 2
            },
            "FileNode": {
              "namespaces": ["photography"],
              "supportsVendorNamespaces": false,
              "supportsPrivate": false,
              "maxDepth": 3
            }
          }
        }
      }
    }
  }
}
]]></sourcecode></figure>

</section>
<section anchor="fetching-a-mailbox-with-its-metadata"><name>Fetching a Mailbox with its metadata</name>

<t>Request the shared metadata and the user's private metadata for a single Mailbox:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["Mailbox/get", {
    "accountId": "A1",
    "ids": ["MB1"],
    "properties": [
      "id", "name",
      "metadata/acme.example.com",
      "privateMetadata/acme.example.com"
    ]
  }, "c1"]
]
]]></sourcecode></figure>

<t>Response:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["Mailbox/get", {
    "accountId": "A1",
    "state": "mb-100",
    "list": [
      {
        "id": "MB1",
        "name": "Team Inbox",
        "metadata": {
          "acme.example.com": {
            "color": "blue",
            "owner": "team-alpha"
          }
        },
        "privateMetadata": {
          "acme.example.com": {
            "workflowState": "pending-review"
          }
        }
      }
    ],
    "notFound": []
  }, "c1"]
]
]]></sourcecode></figure>

</section>
<section anchor="patching-a-single-property-within-a-namespace"><name>Patching a single property within a namespace</name>

<t>Update one property inside a namespace without disturbing the others:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["Mailbox/set", {
    "accountId": "A1",
    "update": {
      "MB1": {
        "metadata/acme.example.com/color": "green"
      }
    }
  }, "c1"]
]
]]></sourcecode></figure>

<t>Removing a single property uses a patch to <spanx style="verb">null</spanx>:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["Mailbox/set", {
    "accountId": "A1",
    "update": {
      "MB1": {
        "metadata/acme.example.com/color": null
      }
    }
  }, "c1"]
]
]]></sourcecode></figure>

</section>
<section anchor="creating-an-email-with-private-metadata"><name>Creating an Email with private metadata</name>

<t>Create a draft Email and attach a private workflow annotation atomically. The metadata is just another property on the create:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["Email/set", {
    "accountId": "A1",
    "create": {
      "draft1": {
        "mailboxIds": { "MB1": true },
        "subject": "Project Update",
        "from": [{ "email": "alice@example.com" }],
        "to":   [{ "email": "bob@example.com" }],
        "bodyStructure": {
          "type": "text/plain",
          "partId": "1"
        },
        "bodyValues": {
          "1": { "value": "Here is the project update..." }
        },
        "privateMetadata": {
          "acme.example.com": {
            "workflowState": "pending-review",
            "assignedTo": "carol@example.com"
          }
        }
      }
    }
  }, "c1"]
]
]]></sourcecode></figure>

<t>The response is a single <spanx style="verb">Email/set</spanx> response; there is no separate metadata response, because metadata is part of the Email object.</t>

</section>
<section anchor="attaching-photography-metadata-to-a-filenode"><name>Attaching photography metadata to a FileNode</name>

<t>This example uses a <em>fictional</em> IANA-registered namespace <spanx style="verb">photography</spanx>, assumed for the purpose of this example to be specified for photographic information about image files and applicable to the <spanx style="verb">FileNode</spanx> data type. The capability for the account in <xref target="example-capability"></xref> advertises FileNode as supporting <spanx style="verb">photography</spanx> and no vendor namespaces.</t>

<t>Request:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["FileNode/set", {
    "accountId": "A1",
    "update": {
      "F456": {
        "metadata/photography": {
          "geoLocation": {
            "latitude": 46.362,
            "longitude": 14.090
          },
          "cameraMake": "Canon",
          "cameraModel": "EOS R5",
          "aperture": "f/2.8",
          "shutterSpeed": "1/250",
          "iso": 400,
          "focalLength": "50mm",
          "dateTaken": "2023-10-01T01:14:00Z",
          "imageSize": {
            "width": 6000,
            "height": 4000
          }
        }
      }
    }
  }, "c1"]
]
]]></sourcecode></figure>

<t>Subsequent retrieval of the FileNode, requesting only the relevant metadata namespace:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["FileNode/get", {
    "accountId": "A1",
    "ids": ["F456"],
    "properties": [
      "id", "name", "type", "size",
      "metadata/photography"
    ]
  }, "c2"]
]
]]></sourcecode></figure>

<t>Response:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["FileNode/get", {
    "accountId": "A1",
    "state": "f-200",
    "list": [
      {
        "id": "F456",
        "name": "lake-island.jpg",
        "type": "image/jpeg",
        "size": 2458624,
        "metadata": {
          "photography": {
            "geoLocation": {
              "latitude": 46.362,
              "longitude": 14.090
            },
            "cameraMake": "Canon",
            "cameraModel": "EOS R5",
            "aperture": "f/2.8",
            "shutterSpeed": "1/250",
            "iso": 400,
            "focalLength": "50mm",
            "dateTaken": "2023-10-01T01:14:00Z",
            "imageSize": {
              "width": 6000,
              "height": 4000
            }
          }
        }
      }
    ],
    "notFound": []
  }, "c2"]
]
]]></sourcecode></figure>

</section>
<section anchor="updating-a-calendarevent-and-its-metadata-atomically"><name>Updating a CalendarEvent and its metadata atomically</name>

<t>This example updates a primary property of a CalendarEvent and two vendor metadata properties in the same <spanx style="verb">/set</spanx> call. All changes apply together; if any fails for the same id, none take effect, since they are part of a single update entry.</t>

<t>Request:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["CalendarEvent/set", {
    "accountId": "A1",
    "update": {
      "CE789": {
        "title": "Quarterly Review Meeting",
        "start": "2024-12-15T14:00:00",
        "metadata/acme.example.com/lastModifiedReason":
            "Rescheduled per manager request",
        "metadata/acme.example.com/approvalStatus": "pending"
      }
    }
  }, "c1"]
]
]]></sourcecode></figure>

<t>A successful response is a single <spanx style="verb">CalendarEvent/set</spanx> response; metadata changes do not produce a separate response because they are properties of the event itself:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["CalendarEvent/set", {
    "accountId": "A1",
    "oldState": "c-200",
    "newState": "c-201",
    "updated": {
      "CE789": null
    }
  }, "c1"]
]
]]></sourcecode></figure>

</section>
<section anchor="example-query"><name>Querying by metadata and a primary property together</name>

<t>Find all Email objects in a particular Mailbox whose private vendor <spanx style="verb">memo</spanx> contains the text "follow up":</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["Email/query", {
    "accountId": "A1",
    "filter": {
      "operator": "AND",
      "conditions": [
        { "inMailbox": "MB-inbox" },
        { "privateMetadataExists": "acme.example.com/memo" },
        {
          "privateMetadataTextContains": {
            "path":  "acme.example.com/memo",
            "value": "follow up"
          }
        }
      ]
    }
  }, "c1"]
]
]]></sourcecode></figure>

</section>
<section anchor="detecting-a-metadata-only-change-through-changes"><name>Detecting a metadata-only change through /changes</name>

<t>After a server-side metadata update, the next <spanx style="verb">Email/changes</spanx> call returns:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["Email/changes", {
    "accountId": "A1",
    "oldState": "e-100",
    "newState": "e-103",
    "hasMoreChanges": false,
    "created": [],
    "updated": ["EM1", "EM2"],
    "destroyed": [],
    "updatedProperties": ["metadata"]
  }, "c1"]
]
]]></sourcecode></figure>

<t>The client knows it only needs to refetch the <spanx style="verb">metadata</spanx> property of <spanx style="verb">EM1</spanx> and <spanx style="verb">EM2</spanx>, not the full Email objects.</t>

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

<section anchor="metadata-confidentiality"><name>Metadata Confidentiality</name>

<t>Metadata may contain sensitive information: personal notes, workflow states, application-specific data, and other user-generated content. Servers <bcp14>MUST</bcp14> enforce the access-control rules in <xref target="access-control"></xref>. Failures here are direct privacy breaches.</t>

<t><spanx style="verb">privateMetadata</spanx> is per-user. The server <bcp14>MUST</bcp14> ensure that each user sees only their own content, even on shared related objects. This is the most common implementation pitfall in this specification: a query or <spanx style="verb">/get</spanx> implementation that returns <spanx style="verb">privateMetadata</spanx> keyed by user other than the requester is a serious bug. Servers <bcp14>MUST</bcp14> verify that result filtering applies uniformly to <spanx style="verb">/get</spanx>, <spanx style="verb">/query</spanx>, <spanx style="verb">/changes</spanx>, <spanx style="verb">/queryChanges</spanx>, and to any cached or denormalized representation.</t>

<t>Per-viewer state (<xref target="state-behavior"></xref>) interacts with confidentiality. A server that advances the related type's state for user B in response to user A's private write is not leaking the metadata content, but it is leaking a signal that <em>something</em> private to A changed on the related object. The specification therefore requires per-viewer state filtering and forbids advertising the capability for accounts that cannot provide it.</t>

</section>
<section anchor="user-identity-and-authentication"><name>User Identity and Authentication</name>

<t>The private-metadata model relies on accurate user identification. Servers <bcp14>MUST</bcp14>:</t>

<t><list style="symbols">
  <t>Reliably identify the authenticated user for every metadata operation.</t>
  <t>Maintain accurate association between <spanx style="verb">privateMetadata</spanx> content and the user that wrote it.</t>
  <t>Prevent authentication bypass or identity spoofing that could allow access to other users' private metadata.</t>
  <t>Carefully handle account delegation and administrative access: see <xref target="account-delegation-and-administrative-access"></xref>.</t>
</list></t>

</section>
<section anchor="injection-attacks-through-namespace-values"><name>Injection Attacks Through Namespace Values</name>

<t>Namespace values accept arbitrary client-supplied content. Servers and clients <bcp14>MUST</bcp14> treat namespace values as untrusted user input. Typical risks include script injection (values rendered in a web context without sanitization), JSON injection (values that break downstream parsing), path traversal (cleverly named keys), and SQL injection (values stored in SQL columns without parameterization).</t>

<t>Servers <bcp14>MUST</bcp14>:</t>

<t><list style="symbols">
  <t>Validate that namespace identifiers conform to the registered-name or domain-name syntax.</t>
  <t>Sanitize values before use in any context where interpretation could occur.</t>
  <t>Apply appropriate output encoding when displaying metadata.</t>
  <t>Enforce limits on the size of individual values and on <spanx style="verb">maxDepth</spanx>.</t>
  <t>Reject or sanitize values containing control characters or other potentially harmful content.</t>
</list></t>

<t>Clients that render metadata to users <bcp14>MUST</bcp14> treat the content as untrusted, with appropriate sandboxing, Content Security Policy, and context-appropriate escaping.</t>

</section>
<section anchor="resource-exhaustion"><name>Resource Exhaustion</name>

<t>Without controls, metadata can be abused for denial of service:</t>

<t><list style="symbols">
  <t>Storage exhaustion: bulk creation of large metadata payloads, particularly under <spanx style="verb">privateMetadata</spanx>, where every user with access to a shared object can independently consume space.</t>
  <t>Processing exhaustion: deeply nested or pathologically large namespace values.</t>
  <t>Query complexity: text-match filter conditions (<spanx style="verb">metadataTextContains</spanx>/<spanx style="verb">metadataTextEquals</spanx> and their private variants) that require expensive scanning, particularly when combined with per-user filtering across many users. Servers <bcp14>MAY</bcp14> reject such conditions with "unsupportedFilter" (<xref target="filter-conditions"></xref>) to bound the cost.</t>
</list></t>

<t>Servers <bcp14>SHOULD</bcp14> apply the quota mechanism in <xref target="quota"></xref>, enforce <spanx style="verb">maxDepth</spanx>, time out long-running queries, and apply rate limiting to metadata writes. Servers <bcp14>SHOULD</bcp14> monitor for unusual usage patterns (e.g., a single user creating private metadata on unusually many objects).</t>

</section>
<section anchor="server-vulnerabilities"><name>Server Vulnerabilities</name>

<t>Implementations <bcp14>MUST</bcp14> be robust against malformed input. In particular, servers <bcp14>MUST</bcp14>:</t>

<t><list style="symbols">
  <t>Validate all input against the type signatures in this document.</t>
  <t>Handle JSON parsing errors gracefully without exposing internal state.</t>
  <t>Protect against integer overflow, buffer overflow, and similar low-level vulnerabilities when processing metadata.</t>
  <t>Implement efficient per-user filtering of <spanx style="verb">privateMetadata</spanx> so that it does not become a denial-of-service vector under load.</t>
  <t>Log security-relevant events (auth failures, permission denials, attempts to read another user's private metadata) for monitoring.</t>
</list></t>

</section>
<section anchor="client-vulnerabilities"><name>Client Vulnerabilities</name>

<t>Clients that handle metadata <bcp14>MUST</bcp14>:</t>

<t><list style="symbols">
  <t>Validate server responses; in particular, do not assume the structure of a namespace without checking.</t>
  <t>Distinguish clearly in the UI between <spanx style="verb">metadata</spanx> (visible to others) and <spanx style="verb">privateMetadata</spanx> (visible only to the user), so users do not inadvertently disclose private notes.</t>
  <t>Refuse to execute or interpret metadata content as code without explicit user consent and appropriate sandboxing.</t>
  <t>Apply Content Security Policy and similar browser-level mitigations when displaying metadata in web UIs.</t>
</list></t>

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

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

<t>IANA will register the "metadata" JMAP Capability as follows:</t>

<t><strong>Capability Name:</strong> urn:ietf:params:jmap:metadata<br />
<strong>Specification document:</strong> this document<br />
<strong>Intended use:</strong> common<br />
<strong>Change Controller:</strong> IETF<br />
<strong>Security and privacy considerations:</strong> this document, <xref target="security-considerations"></xref></t>

</section>
<section anchor="namespaces-registry"><name>Creation of the "JMAP Metadata Namespaces" Registry</name>

<t>IANA has created the "JMAP Metadata Namespaces" registry to record metadata namespace identifiers used as top-level keys in the <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx> properties defined by this specification.</t>

<t>This registry uses the Expert Review process (<xref section="4.5" sectionFormat="comma" target="RFC8126"/>). Registrants must propose a name without a dot ("."), since names containing a dot are reserved for vendor domain-name namespaces and need no registration. The designated expert <bcp14>MUST</bcp14> ensure that the proposed name does not collide with an existing registration and that the specification provides sufficient detail for interoperability (in particular, the structure of the namespace's value).</t>

<t>Registrations may be of intended use "common", "reserved", or "obsolete". A "reserved" registration reserves a name without assigning semantics; an "obsolete" registration marks a name that should no longer be used by up-to-date implementations.</t>

<section anchor="preliminary-community-review"><name>Preliminary Community Review</name>

<t>Notice of a potential new registration <bcp14>SHOULD</bcp14> be sent to the JMAP mailing list <eref target="mailto:jmap@ietf.org">jmap@ietf.org</eref> for review. The intent is to solicit comments on the namespace identifier, the clarity of the specification, and any interoperability or security considerations. The submitter <bcp14>MAY</bcp14> revise or withdraw the proposal at any time.</t>

</section>
<section anchor="change-procedures"><name>Change Procedures</name>

<t>The change controller for a registration <bcp14>MAY</bcp14> request changes to its definition using the same procedure as the original registration. Significant changes that would invalidate existing data <bcp14>SHOULD</bcp14> be made only to correct serious errors. Registrations <bcp14>MUST NOT</bcp14> be deleted; namespaces that are no longer appropriate for use can be marked obsolete by a change to their intended-use field.</t>

<t>The owner of a registration <bcp14>MAY</bcp14> transfer responsibility to another person or agency by informing IANA.</t>

</section>
<section anchor="jmap-metadata-namespaces-registry-template"><name>"JMAP Metadata Namespaces" Registry Template</name>

<dl newline="true">
  <dt><strong>Namespace Identifier</strong>:</dt>
  <dd>
    <t>The name registered for use as a key in the <spanx style="verb">metadata</spanx> or <spanx style="verb">privateMetadata</spanx> object. <bcp14>MUST</bcp14> consist of US-ASCII letters, digits, hyphens, and underscores, and <bcp14>MUST NOT</bcp14> contain a dot.</t>
  </dd>
  <dt><strong>Value Type</strong>:</dt>
  <dd>
    <t>A description of the structure of values stored under this namespace key (for example, "object whose values are strings").</t>
  </dd>
  <dt><strong>Applicable Properties</strong>:</dt>
  <dd>
    <t>One of: <spanx style="verb">"metadata"</spanx> (this namespace may appear only under <spanx style="verb">metadata</spanx>), <spanx style="verb">"privateMetadata"</spanx> (only under <spanx style="verb">privateMetadata</spanx>), or <spanx style="verb">"both"</spanx> (under either).</t>
  </dd>
  <dt><strong>Applicable Data Types</strong>:</dt>
  <dd>
    <t>A list of JMAP data type names on which this namespace is meaningful, or <spanx style="verb">"any"</spanx> if the namespace is not restricted.</t>
  </dd>
  <dt><strong>Reference or Description</strong>:</dt>
  <dd>
    <t>A brief description, or an RFC number and section reference, describing the namespace's contents. May be omitted for "reserved" entries.</t>
  </dd>
  <dt><strong>Intended Usage</strong>:</dt>
  <dd>
    <t><spanx style="verb">"common"</spanx>, <spanx style="verb">"reserved"</spanx>, or <spanx style="verb">"obsolete"</spanx>.</t>
  </dd>
  <dt><strong>Change Controller</strong>:</dt>
  <dd>
    <t>Who may request changes to this entry (IETF for RFCs from the IETF stream).</t>
  </dd>
</dl>

</section>
<section anchor="submit-request-to-iana"><name>Submit Request to IANA</name>

<t>Registration requests can be sent to <eref target="mailto:iana@iana.org">iana@iana.org</eref>.</t>

</section>
<section anchor="designated-expert-review"><name>Designated Expert Review</name>

<t>The designated expert (DE) is primarily concerned with preventing name collisions and ensuring that the specification provides enough detail for interoperability. For common-use registrations, the DE is expected to confirm that suitable documentation (per <xref section="4.6" sectionFormat="of" target="RFC8126"/>) is available. A published specification is not required for reserved or obsolete registrations.</t>

<t>The DE will either approve or deny the registration and publish a notice of the decision to the JMAP working group mailing list (or its successor) and to IANA. A denial <bcp14>MUST</bcp14> be justified and <bcp14>SHOULD</bcp14> include concrete suggestions for how the request can be modified to become acceptable.</t>

</section>
<section anchor="initial-contents"><name>Initial Contents</name>

<t>This document defines no initial entries for the "JMAP Metadata Namespaces" registry. Future specifications may register entries through the procedure defined in this section.</t>

</section>
</section>
</section>


  </middle>

  <back>


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

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



<reference anchor="RFC8620">
  <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="RFC8126">
  <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="RFC9670">
  <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="RFC6901">
  <front>
    <title>JavaScript Object Notation (JSON) Pointer</title>
    <author fullname="P. Bryan" initials="P." role="editor" surname="Bryan"/>
    <author fullname="K. Zyp" initials="K." surname="Zyp"/>
    <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
    <date month="April" year="2013"/>
    <abstract>
      <t>JSON Pointer defines a string syntax for identifying a specific value within a JavaScript Object Notation (JSON) document.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6901"/>
  <seriesInfo name="DOI" value="10.17487/RFC6901"/>
</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="RFC8621">
  <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="RFC9425">
  <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="RFC5464">
  <front>
    <title>The IMAP METADATA Extension</title>
    <author fullname="C. Daboo" initials="C." surname="Daboo"/>
    <date month="February" year="2009"/>
    <abstract>
      <t>The METADATA extension to the Internet Message Access Protocol permits clients and servers to maintain "annotations" or "metadata" on IMAP servers. It is possible to have annotations on a per-mailbox basis or on the server as a whole. For example, this would allow comments about the purpose of a particular mailbox to be "attached" to that mailbox, or a "message of the day" containing server status information to be made available to anyone logging in to the server. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5464"/>
  <seriesInfo name="DOI" value="10.17487/RFC5464"/>
</reference>
<reference anchor="RFC4918">
  <front>
    <title>HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)</title>
    <author fullname="L. Dusseault" initials="L." role="editor" surname="Dusseault"/>
    <date month="June" year="2007"/>
    <abstract>
      <t>Web Distributed Authoring and Versioning (WebDAV) consists of a set of methods, headers, and content-types ancillary to HTTP/1.1 for the management of resource properties, creation and management of resource collections, URL namespace manipulation, and resource locking (collision avoidance).</t>
      <t>RFC 2518 was published in February 1999, and this specification obsoletes RFC 2518 with minor revisions mostly due to interoperability experience. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4918"/>
  <seriesInfo name="DOI" value="10.17487/RFC4918"/>
</reference>



    </references>

</references>


<?line 763?>

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

<t>[[This section to be removed by RFC Editor]]</t>

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

<t><list style="symbols">
  <t>Redesigned the extension around two properties (<spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx>) on each opted-in JMAP data type, rather than a separate <spanx style="verb">Metadata</spanx> data type with its own methods. Removed the <spanx style="verb">Metadata</spanx> data type, all <spanx style="verb">Metadata/*</spanx> methods, the related object types, the extended <spanx style="verb">/get</spanx>/<spanx style="verb">/set</spanx> arguments, and the uniqueness and cascading-deletion machinery.</t>
  <t>Added a per-data-type capability advertising IANA-registered namespace support (<spanx style="verb">namespaces</spanx>), vendor (domain-name) namespace support (<spanx style="verb">supportsVendorNamespaces</spanx>), private-metadata support (<spanx style="verb">supportsPrivate</spanx>), and a nesting limit (<spanx style="verb">maxDepth</spanx>).</t>
  <t>Added <spanx style="verb">updatedProperties</spanx> to <spanx style="verb">Foo/changes</spanx> for opted-in types, modelled on <spanx style="verb">Mailbox/changes</spanx> in RFC 8621. Specified per-viewer behavior for <spanx style="verb">/changes</spanx> and <spanx style="verb">/queryChanges</spanx> on shared objects carrying per-user private metadata.</t>
  <t>Added FilterCondition fields to <spanx style="verb">Foo/query</spanx>: <spanx style="verb">metadataExists</spanx>, <spanx style="verb">privateMetadataExists</spanx>, <spanx style="verb">metadataTextContains</spanx>, <spanx style="verb">metadataTextEquals</spanx>, and the corresponding private variants. Servers <bcp14>MAY</bcp14> reject the text-match conditions with "unsupportedFilter" when implementation cost is prohibitive.</t>
  <t>Added an <spanx style="verb">ignoreMetadataOnlyChanges</spanx> argument to <spanx style="verb">Foo/changes</spanx>, letting metadata-uninterested clients skip wakeups for metadata-only changes on data types they otherwise care about.</t>
  <t>Specified PatchObject semantics for <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx>, including handling of unknown namespaces, error ordering on <spanx style="verb">/set</spanx>, and the migration case where a namespace is removed from the server's advertised set after data has been written.</t>
  <t>Replaced the previous metadata-types and metadata-properties registries with a single "JMAP Metadata Namespaces" registry. This document defines no initial entries; bindings to other protocols (e.g., IMAP METADATA, WebDAV dead properties) are expected to be defined in separate specifications.</t>
</list></t>

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

<t><list style="symbols">
  <t>Renamed <spanx style="verb">parentType</spanx> and <spanx style="verb">parentId</spanx> properties to <spanx style="verb">relatedType</spanx> and <spanx style="verb">relatedId</spanx> throughout the document to better reflect their purpose and avoid implying a strict hierarchy.</t>
  <t>Added <spanx style="verb">filterRelatedType</spanx> and <spanx style="verb">filterMetadataType</spanx> optional parameters to Metadata/changes method to allow filtering changes by related object type and metadata type.</t>
  <t>Changed the error type from "invalidProperties" to "alreadyExists" when a client attempts to create a Metadata object that violates the uniqueness constraint.</t>
  <t>Added requirement that <spanx style="verb">relatedType</spanx> must be specified in the same FilterCondition object whenever <spanx style="verb">relatedIds</spanx> is used in Metadata/query.</t>
  <t>Added <spanx style="verb">id</spanx> as a <bcp14>MUST</bcp14> support property for sorting in Metadata/query; other properties changed to <bcp14>SHOULD</bcp14> support.</t>
  <t>Replaced the <spanx style="verb">metadataTypes</spanx> argument with a <spanx style="verb">fetchMetadata</spanx> Boolean argument (default: false) in the extended /get method.</t>
  <t>Added <spanx style="verb">onSuccessCreateMetadata</spanx> and <spanx style="verb">onSuccessUpdateMetadata</spanx> arguments to the extended /set method to enable transactional metadata operations that are conditional on the success of the related object operation.</t>
</list></t>

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

<t><list style="symbols">
  <t>Initial version</t>
</list></t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA81963LbVrbmfz4FhvkRSUXKkuKkEznVpxXbmdYpK3Zbdqd6
0q4hSG6SiEGABwAlsz3qZ5lnmSeb9a219g0AJTs5dU5PnenIBLAva6/7bY/H
40GTNbk5T/796uJV8nL6q5k1yZVp0nnapIN0Oq3MzZ6H83JWpGv6dF6li2ac
mWYx/nWdbsZrfWN8cjaot9N1VtdZWbzZbejdy+dvfhzM0sYsy2p3ntTNfLDd
0MumPh+U07rMDf+ZbarzpKm2dXN2cvIdjfPe7G7Lak4DFI2pCtOMn2HWQd2k
xfx/p3lZ0OA7Uw/orffLqtxuZNWDTXae/NKUs1FSl1VTmUVNf+3W+OPdYJBu
m1VZnQ+S8SCh/5cV9XlydZw8M8n/NEWRViX/LNu8SrdV2X5UVsvz5LpJ89u0
apIX6bROXrx4yo8s8KKn/KSmdZjmPDn96uS75Gm5WBhTJBc3ptiaUXK9zRqT
nNK++d1Z1hCcrlemyuZpwT9VZknwPE9+/pu8Uc5pdd+efXtyqv/eFg2A+/b6
gn8w6zTLz5M11v+nGqs5puXwo21F4Fk1zaY+f/TIPxoUZbVOm+zGEGiS1z8+
/fabs5Nz+4f+dHr2zbn9Q3767ps/yFv4Q3765ruT03P7x2CQFYvuyKd25FMd
5vHZ1+f2D/np68ffPD63f8hPj787/fbc/jEYjMdjgjhBNp3R+t+ssjohBN2u
TdEkc7PIClMnaZGYD40pgI5JUybNyiT/fv3yJ8bp5GKzyTNCTTx8VZWEM2We
HACJDunNtEkIN+tklmc0JMaaJ7WpbkxFfzdNOlslFu8xtPmQ1U1WLIV05Fci
gPo4eY5Xy01j5uOs8E+SZUrYlzS3ZVKY22RTlRtTNZkhdJ3YgSc862RTZTdE
MZYQJ6PkdlXWJrlJ8y12WZmkZFqtEyIbM0+mu+QIOFxv0plJsjltIFtkpjo6
Ti6SvgcJQc9kBJ4qSfkFxrmaKI9Gu6UHyeXFTxeE/PR4XhJ6FfLWrCTMK/Nc
5gR4Cann9Bpt5yabAx740U35hP+ZE/wwU56Xt7V+IQBO/ZHUAlU6vTl/5IBd
z1aE4LyqctvQTBnNNyuJWWQFf3mc/GBm6bYOvqHtzdKqymidKc1kob1LgBcr
7JbWRA8FjCN36BgEz93pTh4tTUMHMHlU639nq7RYmpr+5rN69B9bU+0mmHpV
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
vBu1n+9zvQylo9re91Wx3PeaTbqk54+jZ3fxq0ONyP9rLh1ZDPeu/qleifQc
mQb/PXuQlrz3bOLs3h38mOXmp3JuHl78cLMqm5JY9Wa1G37WTvqX+Bu28lW8
lUHf3/avnnZLxKF+NJrHniZX1vUGLhJmeQ4GrzV7ktlnu1moNmNplZsHzrHK
y1mdI2Q8v9CKfrFoD+t6OPLdq5hbXEqLqVNtLTXM5gL/qx9OLdyHQYYuPbLs
JpsjowjH5rtYuXqLTm+ssAVWVDTTeZNffMdcj5gmrWLwTiD6Wt00v2+DnKmC
n9bT8enJif0ZzuRgd50mXIBH0H2Lt00/vzHpOrkswFSCp/t46j0dw/SN/r5h
+pB1SDxsaNZxmm9W6bAfLYO1tFO+PntJUIIWeXl7bQG3IaIjjBujNMfc7llB
RBgWkUhX+hEKKbOnnhMmmnmVOpp5uE5rMHgrVTSiSrorQKRxVhBSsB4QtDTZ
VlNbRidVNfvxqf4EfJI8slAOA1UiubuXKh65416SulH0NG/rkICthOtAZyst
FLQ4yNZ2/QvsLZBr+zcGfQ4lh1rlJ3EMSUtr8bzBgF/kFv24ilXf5Zo4uQ8z
9W05FHWDW+7opXINxRXuljeruH3urzB+rInfvu9LSl+7AOX5PwmcMkIITt5B
G6JyQJfMiD9akHMzk5CutbcyZnglvQMTIYaQESEtk5vEJUOjStswzbOZ+VNI
8sldIGGHTUlvJfE303J6zxfTcr67tiWdbQYD9Vl41ofm0SZPsyJia0MYmAKo
U89K7lqj/5Ubz7WHPhUAcawfA/zZiFeFY/4KE23Idnw8/O/ijy0mTpYVt7R/
AzCTUVCV+Z864i8kl/Cv/QT0ppVQ7hjExOGnT9t+IsasuO5dB39PCj7Lfdpz
K154o1YYcFSHHhMhG0lehYvuqE0Tqwe6nu3SGV5Z2NEi0zskjzr38HiWPgmG
R0CgFo+INUQ19dOl5tk5pH+a7Xgp7/uRem/SzNbwDywyTsXwt8M6zyvKYXRD
k7BskhNbuoWVQQujPW3uw6Y4dmQOtIoSK+1qgt0n0gWje8fIsdMuu2zLDvwb
BcGPj7/+Zo8kCFX3FjUtTfmilOhdl5BQR95s2Tp4/M3xV9+ctSiHHeH6wunj
45PvTkJaiZjKjEBQpVfpeybIpyjwH/a9QPtn/vb85XXy+uv4lRTcXxjacPHo
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

-->

</rfc>

