<?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-gondwana-jmap-conditional-00" category="std" consensus="true" submissionType="IETF" updates="8620" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="JMAP Conditional">JMAP Conditional Set</title>

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

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

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 30?>

<t>The JMAP base protocol (<xref target="JMAP-CORE"/>) provides the Foo/set method for
creating, updating, and destroying objects.  It offers a single concurrency
control, the "ifInState" argument, which guards an entire object type: if any
object of that type has changed, the whole method is rejected.</t>

<t>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 "If-Match"
precondition — for any JMAP data type.</t>



    </abstract>



  </front>

  <middle>


<?line 44?>

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

<t>The Foo/set method defined in <xref target="JMAP-CORE"/> is the mechanism by which clients
create, update, and destroy objects.  It provides one form of concurrency
control: the optional "ifInState" argument, which aborts the entire method if
the account's state string for that data type does not match the value the
client supplies.</t>

<t>This guard is coarse.  The state string changes whenever <em>any</em> object of that
type changes, by any client.  In a busy account — or one that receives
server-initiated changes, such as the arrival of new mail — the state can
change between a client's read and its write for reasons entirely unrelated to
the object the client is modifying.  Using "ifInState" to protect a single
update therefore leads to frequent spurious rejections and retries.</t>

<t>Clients commonly need a narrower guarantee: "apply this change only if the
specific object I read still holds the values I depend on".  This is the same
need met by the HTTP "If-Match" precondition (<xref target="HTTP-SEMANTICS"/>) and the
entity-tag model of WebDAV (<xref target="WEBDAV"/>): a conditional write scoped to a single
resource.</t>

<t>This document defines a generic, per-object conditional mechanism for Foo/set.
It introduces no new properties and no new version tokens.  Instead it reuses
the PatchObject already defined by <xref target="JMAP-CORE"/> for updates: a client states
its precondition as a PatchObject describing the values it expects the object
to currently hold, and the server performs the change only if applying that
patch would change nothing.</t>

<t>Because the mechanism is defined entirely in terms of an object's properties
and the existing PatchObject semantics, it applies uniformly to every data
type that implements Foo/set, with no per-type additions.</t>

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

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

<?line -18?>

<t>The terms "Id", "PatchObject", "SetError", and "Foo/set" are defined in
<xref target="JMAP-CORE"/>.  A "pointer" is a JSON Pointer as used within a PatchObject
(see <xref target="JMAP-CORE"/>, Section 5.3).</t>

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

<section anchor="urnietfparamsjmapconditional"><name>urn:ietf:params:jmap:conditional</name>

<t>The presence of the "urn:ietf:params:jmap:conditional" property in the
"capabilities" object of the JMAP Session resource indicates support for the
conditional Foo/set behaviour defined in this document.  The value of this
property <bcp14>MUST</bcp14> be an empty object.</t>

<t>A client indicates that it wishes to use this extension by including the
capability URI in the "using" array of a request.  When a server that
advertises this capability receives a request whose "using" array includes
this URI, it <bcp14>MUST</bcp14> honour the "ifUnchangedBy" argument (<xref target="conditional-set"/>) on
every Foo/set method it implements.</t>

<t>The capability is generic: it does not depend on any particular data type, and
its presence applies to all types for which the server implements Foo/set.</t>

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

<figure><artwork><![CDATA[
"urn:ietf:params:jmap:conditional": {}
]]></artwork></figure>

</section>
</section>
</section>
<section anchor="conditional-set"><name>Conditional Foo/set</name>

<t>This document adds one argument to the standard Foo/set method
(<xref target="JMAP-CORE"/>, Section 5.3):</t>

<t><list style="symbols">
  <t>ifUnchangedBy: "Id[PatchObject]" (default: an empty object)  <vspace blankLines='1'/>
A map of object id to a PatchObject expressing a precondition on that
object.  For each entry, the precondition is satisfied if and only if
applying the given PatchObject to the current server-side object would
leave the object unchanged.  <vspace blankLines='1'/>
Equivalently: for every pointer in the PatchObject, the object's current
value at that pointer <bcp14>MUST</bcp14> equal the value given in the PatchObject.  A
JSON "null" value matches a property that is not present (it asserts that
removing the property would be a no-op).  Comparison uses the same
representation the server would return for that property from Foo/get.</t>
</list></t>

<section anchor="evaluation-rules"><name>Evaluation Rules</name>

<t><list style="numbers" type="1">
  <t>Preconditions are evaluated against the state of each object as it exists
at the start of the method, before any create, update, or destroy in the
same method is applied.</t>
  <t>The "ifUnchangedBy" argument applies only to objects identified by an
existing id.  Each id used as a key in "ifUnchangedBy" <bcp14>MUST</bcp14> also appear as
a key in the "update" argument or as a member of the "destroy" argument of
the same method.  If an id appears in "ifUnchangedBy" but in neither, the
server <bcp14>MUST</bcp14> reject the whole method with an "invalidArguments" error.  A
creation id (an id prefixed with "#") <bcp14>MAY</bcp14> be used as a key in
"ifUnchangedBy" to reference an object created by an earlier method call in
the same request; the server resolves it using the creation id mechanism
(<xref target="JMAP-CORE"/>, Section 5.3).  This lets a client condition a change on an
object it created earlier in the request not having been changed by another
actor in the interval between method calls.</t>
  <t>Unlike the PatchObject supplied in the "update" argument, which may only
reference properties the client is permitted to set, the PatchObject in
"ifUnchangedBy" <bcp14>MAY</bcp14> reference any property of the object, including
server-set and otherwise read-only properties (for example a content
identifier, a size, or a server-maintained change timestamp).  This allows
a client to condition a change on properties it cannot itself modify.</t>
  <t>If a pointer in an "ifUnchangedBy" PatchObject is not a valid pointer for
the object's type, the server <bcp14>MUST</bcp14> treat the affected id as it would an
invalid update: the id is added to "notUpdated" or "notDestroyed" with an
"invalidPatch" SetError.</t>
  <t>The "ifUnchangedBy" argument is independent of, and composes with, the
method-level "ifInState" argument.  If both are supplied, the server first
checks "ifInState" (rejecting the whole method with a "stateMismatch"
error if it does not match), and then evaluates the per-object
preconditions.</t>
</list></t>

</section>
<section anchor="effect"><name>Effect</name>

<t>If the precondition for an id is satisfied, the corresponding update or
destroy proceeds exactly as it would without this extension.</t>

<t>If the precondition is not satisfied, the server <bcp14>MUST NOT</bcp14> perform the
corresponding update or destroy.  It <bcp14>MUST</bcp14> instead add the id to "notUpdated"
(if the id appeared in "update") or "notDestroyed" (if the id appeared in
"destroy"), with a SetError of type "stateMismatch" (<xref target="statemismatch"/>).</t>

<t>As with all Foo/set processing, each id is handled independently: a failed
precondition on one id does not prevent other ids in the same method, whose
preconditions are satisfied and which are otherwise valid, from succeeding.</t>

</section>
<section anchor="statemismatch"><name>The "stateMismatch" SetError</name>

<t>This document defines a new SetError type, "stateMismatch", for use in the
"notUpdated" and "notDestroyed" maps of a Foo/set response.  It indicates that
an "ifUnchangedBy" precondition for the id was not satisfied: the object's
current server-side state differs from the state the client asserted.</t>

<t>The SetError object has no properties beyond the common "type" property and an
optional "description".  In particular it does not echo the object's current
values; a client that needs them fetches the current state of the object (for
example via Foo/get or Foo/changes) before deciding how to proceed.</t>

<t>Note: <xref target="JMAP-CORE"/> uses the term "stateMismatch" for the method-level error
returned when "ifInState" does not match.  The SetError defined here is the
per-object analogue.  The two are distinguished by their position in the
response: a method-level error object versus a SetError appearing within
"notUpdated" or "notDestroyed".</t>

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

<section anchor="force-with-lease-on-file-content"><name>Force-with-lease on file content</name>

<t>A client last synchronised a file node "f42" with content blob "G_old".  It has
since produced new content "G_new", and wishes to replace the content only if no
other client has changed it in the meantime.  It conditions on the server-set
"blobId" (<xref target="JMAP-FILENODE"/>):</t>

<figure><artwork><![CDATA[
[[ "FileNode/set", {
  "accountId": "u1",
  "ifUnchangedBy": { "f42": { "blobId": "G_old" } },
  "update":       { "f42": { "blobId": "G_new",
                             "modified": "2026-05-01T09:30:00Z" } }
}, "0" ]]
]]></artwork></figure>

<t>If "f42" still references "G_old", the update succeeds.  If another client has
already replaced the content (so "blobId" is now, say, "G_other"), the
precondition fails and the server makes no change:</t>

<figure><artwork><![CDATA[
[[ "FileNode/set", {
  "accountId": "u1",
  "oldState": "f1a2",
  "newState": "f1a2",
  "updated": null,
  "notUpdated": { "f42": { "type": "stateMismatch" } }
}, "0" ]]
]]></artwork></figure>

<t>The client fetches "f42", resolves the conflict (for instance by preserving its
own version as a separate file), and retries.</t>

</section>
<section anchor="conditional-destroy"><name>Conditional destroy</name>

<t>Destroy a message only if it has not been read on another device.  In
<xref target="JMAP-MAIL"/>, an unread message has no "$seen" keyword, so the client asserts
that "keywords/$seen" is absent:</t>

<figure><artwork><![CDATA[
[[ "Email/set", {
  "accountId": "u1",
  "ifUnchangedBy": { "M7": { "keywords/$seen": null } },
  "destroy":      [ "M7" ]
}, "0" ]]
]]></artwork></figure>

<t>If the message has since been marked "$seen", "M7" is returned in
"notDestroyed" with a "stateMismatch" SetError and is not deleted.</t>

</section>
<section anchor="a-condition-that-ignores-unrelated-changes"><name>A condition that ignores unrelated changes</name>

<t>Because the precondition references only the pointers the client supplies,
concurrent changes to other properties of the same object do not cause it to
fail.  Here a client removes a grantee's access, but only if that grantee
currently holds exactly the rights the client saw:</t>

<figure><artwork><![CDATA[
[[ "FileNode/set", {
  "accountId": "u1",
  "ifUnchangedBy": { "d3": { "shareWith/bob/mayRead": true } },
  "update":       { "d3": { "shareWith/bob": null } }
}, "0" ]]
]]></artwork></figure>

<t>The change applies only if Bob currently has "mayRead" of "true".  A concurrent
change to an unrelated property of "d3" (its name, or another grantee's rights)
does not trigger a "stateMismatch".</t>

</section>
<section anchor="whole-object-compare-and-swap"><name>Whole-object compare-and-swap</name>

<t>A data type that maintains a server-set change token can be used to require
that nothing at all has changed.  For example, a type with a server-maintained
"changed" timestamp that is updated on every modification:</t>

<figure><artwork><![CDATA[
"ifUnchangedBy": { "f42": { "changed": "2026-04-30T12:00:00Z" } }
]]></artwork></figure>

<t>Because the server updates "changed" on any modification to the object, this
asserts that the entire object is unchanged since the client last read it,
recovering the coarse "If-Match" behaviour as a special case of the general
mechanism.</t>

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

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

<t>IANA is requested to register the "conditional" JMAP Capability as follows, in
the "JMAP Capabilities" registry established by <xref target="JMAP-CORE"/>:</t>

<dl>
  <dt>Capability Name:</dt>
  <dd>
    <t>urn:ietf:params:jmap:conditional</t>
  </dd>
  <dt>Specification document:</dt>
  <dd>
    <t>this document</t>
  </dd>
  <dt>Intended use:</dt>
  <dd>
    <t>common</t>
  </dd>
  <dt>Change Controller:</dt>
  <dd>
    <t>IETF</t>
  </dd>
  <dt>Security and privacy considerations:</dt>
  <dd>
    <t>this document, <xref target="security"/></t>
  </dd>
</dl>

</section>
</section>
<section anchor="security"><name>Security Considerations</name>

<section anchor="information-disclosure"><name>Information Disclosure</name>

<t>The conditional mechanism returns no object data.  A failed precondition yields
only a "stateMismatch" SetError with no payload, disclosing nothing beyond the
single fact that the asserted state did not hold — information the client could
already obtain by reading the object with Foo/get.</t>

<t>A precondition does not bypass access control.  A server <bcp14>MUST</bcp14> require the same
permissions to read the properties referenced in an "ifUnchangedBy" PatchObject
as it would to return them from Foo/get.  In particular, a server <bcp14>MUST NOT</bcp14>
evaluate a precondition on a property the requesting client is not permitted to
read; such a condition <bcp14>MUST</bcp14> fail with a "forbidden" SetError, so that the
mechanism cannot be used as an oracle to probe the values of properties the
client cannot otherwise see.</t>

</section>
<section anchor="resource-consumption"><name>Resource Consumption</name>

<t>Evaluating a precondition is comparable in cost to validating an update
PatchObject and imposes no significant additional load.</t>

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

<reference anchor="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="JMAP-FILENODE">
   <front>
      <title>JMAP File Storage extension</title>
      <author fullname="Bron Gondwana" initials="B." surname="Gondwana">
         <organization>Fastmail</organization>
      </author>
      <date day="15" month="May" 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.

   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>
   <seriesInfo name="Internet-Draft" value="draft-ietf-jmap-filenode-14"/>
   
</reference>




    </references>

</references>



  </back>

<!-- ##markdown-source:
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
twhILplw5MZH9EpyFb2OP3f5B/O/v8CZC3k0AAA=

-->

</rfc>

