| rfc9425.original.xml | rfc9425.xml | |||
|---|---|---|---|---|
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
| <!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Process | ||||
| or - mmark.miek.nl" --> | <!DOCTYPE rfc [ | |||
| <rfc version="3" ipr="trust200902" docName="draft-ietf-jmap-quotas-12" submissio | <!ENTITY nbsp " "> | |||
| nType="IETF" category="std" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XIncl | <!ENTITY zwsp "​"> | |||
| ude" indexInclude="true" consensus="true"> | <!ENTITY nbhy "‑"> | |||
| <!ENTITY wj "⁠"> | ||||
| ]> | ||||
| <rfc version="3" ipr="trust200902" docName="draft-ietf-jmap-quotas-12" number="9 | ||||
| 425" submissionType="IETF" category="std" consensus="true" xml:lang="en" xmlns:x | ||||
| i="http://www.w3.org/2001/XInclude" tocInclude="true" sortRefs="true" symRefs="t | ||||
| rue" updates="" obsoletes=""> | ||||
| <front> | <front> | |||
| <title abbrev="JMAP Quotas">JMAP for Quotas</title><seriesInfo value="draft-ietf | ||||
| -jmap-quotas-12" stream="IETF" status="standard" name="Internet-Draft"></seriesI | <title abbrev="JMAP Quotas">JSON Meta Application Protocol (JMAP) for Quotas</ti | |||
| nfo> | tle> | |||
| <author role="editor" initials="R.C." surname="Cordier" fullname="René Cordier"> | <seriesInfo name="RFC" value="9425"/> | |||
| <organization>Linagora Vietnam</organization><address><postal><street>5 Dien Bie | <author role="editor" initials="R." surname="Cordier" fullname="René Cordier"><o | |||
| n Phu</street> | rganization>Linagora Vietnam</organization> | |||
| <address><postal><street>5 Dien Bien Phu</street> | ||||
| <city>Hanoi</city> | <city>Hanoi</city> | |||
| <code>10000</code> | <code>10000</code> | |||
| <country>Vietnam</country> | <country>Vietnam</country> | |||
| </postal><email>rcordier@linagora.com</email> | </postal><email>rcordier@linagora.com</email> | |||
| <uri>https://linagora.vn</uri> | <uri>https://linagora.vn</uri> | |||
| </address></author><date year="2023" month="February" day="6"></date> | </address></author> | |||
| <area>Applications</area> | <date year="2023" month="June"></date> | |||
| <workgroup>JMAP Working Group</workgroup> | <area>art</area> | |||
| <workgroup>jmap</workgroup> | ||||
| <keyword>JMAP</keyword> | <keyword>JMAP</keyword> | |||
| <keyword>JSON</keyword> | <keyword>JSON</keyword> | |||
| <keyword>email</keyword> | <keyword>email</keyword> | |||
| <keyword>quotas</keyword> | <keyword>quotas</keyword> | |||
| <abstract> | <abstract> | |||
| <t>This document specifies a data model for handling quotas on accounts with a s erver using the JSON Meta Application Protocol (JMAP).</t> | <t>This document specifies a data model for handling quotas on accounts with a s erver using the JSON Meta Application Protocol (JMAP).</t> | |||
| </abstract> | </abstract> | |||
| </front> | </front> | |||
| <middle> | <middle> | |||
| <section anchor="introduction"><name>Introduction</name> | <section anchor="introduction"><name>Introduction</name> | |||
| <t>JMAP (<xref target="RFC8620"></xref> <u format="char-num">–</u> JSON Meta App | <t>The JSON Meta Application Protocol (JMAP) <xref target="RFC8620"/> is a | |||
| lication Protocol) is a generic protocol for synchronising data, such as mails, | generic protocol for synchronizing data, such as mails, calendars, or contacts | |||
| calendars or contacts, between a client and a server. It is optimised for mobile | between a client and a server. It is optimized for mobile and web environments | |||
| and web environments, and aims | and aims to provide a consistent interface to different data types.</t> | |||
| to provide a consistent interface to different data types.</t> | <t>This specification defines a data model for handling quotas over JMAP, | |||
| <t>This specification defines a data model for handling quotas over JMAP, allowi | allowing a user to obtain details about a certain quota.</t> | |||
| ng a user to obtain details about a certain quota.</t> | ||||
| <t>This specification does not address quota administration, which should be han dled by other means.</t> | <t>This specification does not address quota administration, which should be han dled by other means.</t> | |||
| <section anchor="notational-conventions"><name>Notational conventions</name> | <section anchor="notational-conventions"> | |||
| <t>The key words "MUST", "MUST NOT", "REQUIRED", & | <name>Notational Conventions</name> | |||
| quot;SHALL", "SHALL NOT", | <t> | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT R | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | |||
| ECOMMENDED", "MAY", and | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
| "OPTIONAL" in this document are to be interpreted as described in BCP | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | |||
| 14 <xref target="RFC2119"></xref> <xref target="RFC8174"></xref> when, and only | "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
| when, they appear in all | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are | |||
| capitals, as shown here.</t> | to be interpreted as described in BCP 14 <xref target="RFC2119"/> | |||
| <t>Type signatures, examples and property descriptions in this document follow t | <xref target="RFC8174"/> when, and only when, they appear in all capitals, | |||
| he conventions established in section 1.1 | as shown here. | |||
| of <xref target="RFC8620"></xref>. Data types defined in the core specification | </t> | |||
| are also used in this document.</t> | <t>Type signatures, examples, and property descriptions in this document | |||
| follow the conventions established in <xref target="RFC8620" | ||||
| sectionFormat="of" section="1.1"></xref>. Data types defined in the core | ||||
| specification are also used in this document.</t> | ||||
| </section> | </section> | |||
| <section anchor="terminology"><name>Terminology</name> | <section anchor="terminology"><name>Terminology</name> | |||
| <t>This document reuses the terminology from the core JMAP specification establi | <t>This document reuses the terminology from the core JMAP specification establi | |||
| shed in section 1.6 of <xref target="RFC8620"></xref>.</t> | shed in <xref target="RFC8620" sectionFormat="of" section="1.6"></xref>.</t> | |||
| <t>The term Quota (when capitalized) is used to refer to the data type defined i | ||||
| n this document | <t>The term "Quota" (when capitalized) is used to refer to the data type | |||
| in <xref target="quota"></xref> and instance of that data type.</t> | defined in <xref target="quota"/> and instance of that | |||
| data type.</t> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="addition-to-the-capabilities-object"><name>Addition to the capa | <section anchor="addition-to-the-capabilities-object"><name>Addition to the Capa | |||
| bilities object</name> | bilities Object</name> | |||
| <t>The capabilities object is returned as part of the JMAP Session object; see < | <t>The capabilities object is returned as part of the JMAP Session object; see < | |||
| xref target="RFC8620"></xref>, section 2.</t> | xref target="RFC8620" sectionFormat="comma" section="2"></xref>.</t> | |||
| <t>This document defines one additional capability URI.</t> | <t>This document defines one additional capability URI.</t> | |||
| <section anchor="urn-ietf-params-jmap-quota"><name>urn:ietf:params:jmap:quota</n ame> | <section anchor="urn-ietf-params-jmap-quota"><name>urn:ietf:params:jmap:quota</n ame> | |||
| <t>This represents support for the Quota data type and associated API methods. S | <t>This represents support for the Quota data type and associated API methods. S | |||
| ervers supporting this specification MUST add a property called urn:ietf:params: | ervers supporting this specification <bcp14>MUST</bcp14> add a property called " | |||
| jmap:quota to the capabilities object.</t> | urn:ietf:params:jmap:quota" to the capabilities object.</t> | |||
| <t>The value of this property is an empty object in both the JMAP session capabi | <t>The value of this property is an empty object in both the JMAP Session capabi | |||
| lities property and an account's accountCapabilities property.</t> | lities property and an account's accountCapabilities property.</t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="sub-types-of-the-quota-data-type"><name>Sub-types of the Quota | <section anchor="sub-types-of-the-quota-data-type"><name>Sub-types of the Quota | |||
| data type</name> | Data Type</name> | |||
| <t>There are two fields within the Quota datatype which have an enumerated set o | <t>There are two fields within the Quota data type, which have an enumerated set | |||
| f possible values. These are:</t> | of possible values. These are:</t> | |||
| <section anchor="scope"><name>Scope</name> | <section anchor="scope"><name>Scope</name> | |||
| <t>The <strong>Scope</strong> data type is used to represent the entities the Qu ota applies to. It is defined as a "String" with values from the follo wing set:</t> | <t>The Scope data type is used to represent the entities the quota applies to. I t is defined as a "String" with values from the following set:</t> | |||
| <ul spacing="compact"> | <ul> | |||
| <li>account: The Quota information applies to just the client's account</li> | <li><t>account: The quota information applies to just the client's account.</t | |||
| <li>domain: The Quota information applies to all accounts sharing this domain</l | ></li> | |||
| i> | <li><t>domain: The quota information applies to all accounts sharing this doma | |||
| <li>global: The Quota information applies to all accounts belonging to the serve | in.</t></li> | |||
| r</li> | <li><t>global: The quota information applies to all accounts belonging to the | |||
| server.</t></li> | ||||
| </ul> | </ul> | |||
| </section> | </section> | |||
| <section anchor="resourcetype"><name>ResourceType</name> | <section anchor="resourcetype"><name>ResourceType</name> | |||
| <t>The <strong>ResourceType</strong> data type is used to act as a unit of measu re for the quota usage. It is defined as a "String" with values from t he following set:</t> | <t>The ResourceType data type is used to act as a unit of measure for the quota usage. It is defined as a "String" with values from the following set:</t> | |||
| <ul spacing="compact"> | <ul> | |||
| <li>count: The quota is measured in number of data type objects. For example, a | <li><t>count: The quota is measured in a number of data type objects. For exam | |||
| quota can have a limit of 50 "Mail" objects.</li> | ple, a | |||
| <li>octets: The quota is measured in size (in "octets"). For example, | quota can have a limit of 50 "Mail" objects.</t></li> | |||
| a quota can have a limit of 25000 "octets".</li> | ||||
| <li><t>octets: The quota is measured in size (in octets). For example, a quota | ||||
| can have a limit of 25000 octets.</t></li> | ||||
| </ul> | </ul> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="quota"><name>Quota</name> | <section anchor="quota"><name>Quota</name> | |||
| <t>The quota is an object that displays the limit set to an account usage. It th en shows as well the current usage in regard to that limit.</t> | <t>The Quota is an object that displays the limit set to an account usage. It th en shows as well the current usage in regard to that limit.</t> | |||
| <section anchor="properties-of-the-quota-object"><name>Properties of the quota o | <section anchor="properties-of-the-quota-object"><name>Properties of the Quota O | |||
| bject</name> | bject</name> | |||
| <t>The quota object MUST contain the following fields:</t> | <t>The Quota object <bcp14>MUST</bcp14> contain the following fields:</t> | |||
| <ul spacing="compact"> | <ul> | |||
| <li>id: "Id"</li> | <li><t>id: <tt>Id</tt></t> | |||
| </ul> | <t>The unique identifier for this object.</t></li> | |||
| <ul empty="true"><li>The unique identifier for this object.</li></ul> | ||||
| <ul spacing="compact"> | <li><t>resourceType: <tt>String</tt></t> | |||
| <li>resourceType: "String"</li> | <t>The resource type of the quota as defined in <xref | |||
| </ul> | target="resourcetype"></xref>.</t></li> | |||
| <ul empty="true"><li>The resource type of the quota as defined in <xref target=" | ||||
| resourcetype"></xref>.</li></ul> | ||||
| <ul spacing="compact"> | <li><t>used: <tt>UnsignedInt</tt></t> | |||
| <li>used: "UnsignedInt"</li> | <t>The current usage of the defined quota, using the "resourceType" defined as | |||
| </ul> | unit of measure. Computation of this value is handled by the | |||
| <ul empty="true"><li>The current usage of the defined quota, using the "res | server.</t></li> | |||
| ourceType" defined as unit of measure. | ||||
| Computation of this value is handled by the server.</li></ul> | ||||
| <ul spacing="compact"> | <li><t>hardLimit: <tt>UnsignedInt</tt></t> | |||
| <li>hardLimit: "UnsignedInt"</li> | <t>The hard limit set by this quota, using the "resourceType" defined as unit | |||
| </ul> | of measure. Objects in scope may not be created or updated if this limit is | |||
| <ul empty="true"><li>The hard limit set by this quota, using the "resourceT | reached.</t></li> | |||
| ype" defined as unit of measure. Objects | ||||
| in scope may not be created or updated if this limit is reached.</li></ul> | ||||
| <ul spacing="compact"> | <li><t>scope: <tt>String</tt></t> | |||
| <li>scope: "String"</li> | <t>The "Scope" of this quota as defined in <xref | |||
| </ul> | target="scope"></xref>.</t></li> | |||
| <ul empty="true"><li>The "Scope" of this quota as defined in <xref tar | ||||
| get="scope"></xref>.</li></ul> | ||||
| <ul spacing="compact"> | <li><t>name: <tt>String</tt></t> | |||
| <li>name: "String"</li> | <t>The name of the quota. Useful for managing quotas and using queries for sea | |||
| </ul> | rching.</t></li> | |||
| <ul empty="true"><li>The name of the quota object. Useful for managing quotas an | ||||
| d using queries for searching.</li></ul> | ||||
| <ul spacing="compact"> | <li><t>types: <tt>String[]</tt></t> | |||
| <li>types: "String[]"</li> | <t>A list of all the type names as defined in the "JMAP Types Names" registry | |||
| </ul> | (e.g., Email, Calendar, etc.) to which this quota applies. | |||
| <ul empty="true"><li>A list of all the type names as defined in the "JMAP T | ||||
| ypes Names" registry (e.g., Email, Calendar, etc.) to which this quota appl | ||||
| ies. | ||||
| This allows to assign quotas to distinct or shared data types.</li></ul> | ||||
| <ul empty="true"><li>The server MUST filter out any types for which the client d | ||||
| id not request the associated capability in the "using" section of the | ||||
| request. | ||||
| Further, the server MUST NOT return Quota objects for which there are no types r | ||||
| ecognised by the client.</li></ul> | ||||
| <t>The quota object MAY contain the following fields:</t> | ||||
| <ul spacing="compact"> | This allows the quotas to be assigned to distinct or shared data types.</t> | |||
| <li>warnLimit: "UnsignedInt|null"</li> | <t>The server <bcp14>MUST</bcp14> filter out any types for which the client di | |||
| d not request the associated capability in the "using" section of the request. | ||||
| Further, the server <bcp14>MUST NOT</bcp14> return Quota objects for which the | ||||
| re are no types recognized by the client.</t></li> | ||||
| </ul> | </ul> | |||
| <ul empty="true"><li>The warn limit set by this quota object, using the "re | ||||
| sourceType" defined as unit of measure. | ||||
| It can be used to send a warning to an entity about to reach the hard limit soon | ||||
| , but with no action taken yet. If set, it | ||||
| SHOULD be lower than the "softLimit" (if present and different from nu | ||||
| ll) and the "hardLimit".</li></ul> | ||||
| <ul spacing="compact"> | <t>The Quota object <bcp14>MAY</bcp14> contain the following fields:</t> | |||
| <li>softLimit: "UnsignedInt|null"</li> | ||||
| </ul> | ||||
| <ul empty="true"><li>The soft limit set by this quota object, using the "re | ||||
| sourceType" defined as unit of measure. | ||||
| It can be used to still allow some operations, but refuse some others. What is a | ||||
| llowed or not is up to the server. For example, it | ||||
| could be used for blocking outgoing events of an entity (sending emails, creatin | ||||
| g calendar events, ...) while still receiving | ||||
| incoming events (receiving emails, receiving calendars events, ...). If set, it | ||||
| SHOULD be higher than the "warnLimit" | ||||
| (if present and different from null) but lower than the "hardLimit".</ | ||||
| li></ul> | ||||
| <ul spacing="compact"> | <ul> | |||
| <li>description: "String|null"</li> | <li><t>warnLimit: <tt>UnsignedInt|null</tt></t> | |||
| <t>The warn limit set by this quota, using the "resourceType" | ||||
| defined as unit of measure. It can be used to send a warning to an entity | ||||
| about to reach the hard limit soon, but with no action taken yet. If set, it | ||||
| <bcp14>SHOULD</bcp14> be lower than the "softLimit" (if present and | ||||
| different from null) and the "hardLimit".</t></li> | ||||
| <li><t>softLimit: <tt>UnsignedInt|null</tt></t> | ||||
| <t>The soft limit set by this quota, using the "resourceType" defined | ||||
| as unit of measure. It can be used to still allow some operations but refuse | ||||
| some others. What is allowed or not is up to the server. For example, it could | ||||
| be used for blocking outgoing events of an entity (sending emails, creating | ||||
| calendar events, etc.) while still receiving incoming events (receiving emails | ||||
| , | ||||
| receiving calendars events, etc.). If set, it <bcp14>SHOULD</bcp14> be higher | ||||
| than the "warnLimit" (if present and different from null) but lower | ||||
| than the "hardLimit".</t></li> | ||||
| <li><t>description: <tt>String|null</tt></t> | ||||
| <t>Arbitrary, free, human-readable description of this quota. It might be used | ||||
| to explain where the different limits come from and explain the entities and | ||||
| data types this quota applies to. The description <bcp14>MUST</bcp14> be | ||||
| encoded in UTF-8 <xref target="RFC3629"/> as described in <xref | ||||
| target="RFC8620" sectionFormat="comma" section="1.5"/>, and selected based on | ||||
| an | ||||
| Accept-Language header in the request (as defined in <xref target="RFC9110" | ||||
| sectionFormat="comma" section="12.5.4"/>) or out-of-band information about the | ||||
| user's language or locale.</t></li> | ||||
| </ul> | </ul> | |||
| <ul empty="true"><li>Arbitrary free, human-readable, description of this quota. | ||||
| It might be used to explain | ||||
| where the different limits come from and explain the entities and data types thi | ||||
| s quota applies to. The description MUST be | ||||
| encoded in UTF-8 <xref target="RFC3629"></xref> as described in <xref target="RF | ||||
| C8620"></xref> section 1.5, selected based on an Accept-Language header in the r | ||||
| equest | ||||
| (as defined in <xref target="RFC9110"></xref>, Section 12.5.4) or out-of-band in | ||||
| formation about the user's language/locale.</li></ul> | ||||
| <t>The following JMAP methods are supported.</t> | <t>The following JMAP methods are supported.</t> | |||
| </section> | </section> | |||
| <section anchor="quota-get"><name>Quota/get</name> | <section anchor="quota-get"><name>Quota/get</name> | |||
| <t>Standard "/get" method as described in <xref target="RFC8620"></xre | <t>Standard "/get" method as described in <xref target="RFC8620" | |||
| f> section 5.1. The <em>ids</em> argument may be "null" to fetch all Q | sectionFormat="comma" section="5.1"/>. The <em>id</em>'s argument may be "null" | |||
| uotas of the account | to fetch all quotas of the account at once, as demonstrated in <xref target="fet | |||
| at once, as demonstrated in this document in <xref target="fetching-quotas"></xr | ching-quotas"/>.</t> | |||
| ef>.</t> | ||||
| </section> | </section> | |||
| <section anchor="quota-changes"><name>Quota/changes</name> | <section anchor="quota-changes"><name>Quota/changes</name> | |||
| <t>Standard "/changes" method as described in <xref target="RFC8620">< /xref> section 5.2 but with one extra argument in the response:</t> | <t>Standard "/changes" method as described in <xref target="RFC8620" sectionForm at="comma" section="5.2"/>, but with one extra argument in the response:</t> | |||
| <ul spacing="compact"> | <ul> | |||
| <li>updatedProperties: "String[]|null"</li> | <li><t>updatedProperties: <tt>String[]|null</tt></t> | |||
| <t>If only the "used" Quota property has changed since the old | ||||
| state, this will be a list containing only that property. If the server is | ||||
| unable to tell if only "used" has changed, it <bcp14>MUST</bcp14> be | ||||
| null.</t></li> | ||||
| </ul> | </ul> | |||
| <ul empty="true"><li>If only the "used" Quota property has changed sin | ||||
| ce the old state, this | <t>Since "used" frequently changes, but other properties are generally only | |||
| will be a list containing only that property. If the server is unable to tell if | changed rarely, the server can help the client optimize data transfer by | |||
| only "used" has changed, it | keeping track of changes to quota usage separate from other state changes. The | |||
| MUST be null.</li></ul> | updatedProperties array may be used directly via a back-reference in a | |||
| <t>Since "used" frequently changes but other properties are generally | subsequent Quota/get call in the same request, so only these properties are | |||
| only changed rarely, the server can help the client | returned if nothing else has changed.</t> | |||
| optimise data transfer by keeping track of changes to Quota usage separate from | <t>Servers <bcp14>MAY</bcp14> decide to add other properties to the list that | |||
| other state changes. The | they judge to be changing frequently.</t> | |||
| updatedProperties array may be used directly via a back-reference in a subsequen | <t>This method's usage is demonstrated in <xref | |||
| t Quota/get call in the same request, | target="requesting-latest-quota-changes"/>.</t> | |||
| so only these properties are returned if nothing else has changed.</t> | ||||
| <t>Servers MAY decide to add other properties to the list that they judge to be | ||||
| changing frequently.</t> | ||||
| <t>This method's usage is demonstrated in this document at <xref target="request | ||||
| ing-latest-quota-changes"></xref>.</t> | ||||
| </section> | </section> | |||
| <section anchor="quota-query"><name>Quota/query</name> | <section anchor="quota-query"><name>Quota/query</name> | |||
| <t>This is a standard "/query" method as described in <xref target="RF | <t>This is a standard "/query" method as described in <xref target="RFC8620" sec | |||
| C8620"></xref>, Section 5.5.</t> | tionFormat="comma" section="5.5"/>.</t> | |||
| <t>A <strong>FilterCondition</strong> object has the following properties, any o | <t>A FilterCondition object has the following properties, any of which may be in | |||
| f which may be included or omitted:</t> | cluded or omitted:</t> | |||
| <ul spacing="compact"> | <ul> | |||
| <li>name: "String"</li> | <li><t>name: <tt>String</tt></t> | |||
| </ul> | <t>The Quota <em>name</em> property contains the given string.</t></li> | |||
| <ul empty="true"><li>The Quota <em>name</em> property contains the given string. | ||||
| </li></ul> | ||||
| <ul spacing="compact"> | <li><t>scope: <tt>String</tt></t> | |||
| <li>scope: "String"</li> | <t>The Quota <em>scope</em> property must match the given value exactly.</t></ | |||
| </ul> | li> | |||
| <ul empty="true"><li>The Quota <em>scope</em> property must match the given valu | ||||
| e exactly.</li></ul> | ||||
| <ul spacing="compact"> | <li><t>resourceType: <tt>String</tt></t> | |||
| <li>resourceType: "String"</li> | <t>The Quota <em>resourceType</em> property must match the given value exactly | |||
| </ul> | .</t></li> | |||
| <ul empty="true"><li>The Quota <em>resourceType</em> property must match the giv | ||||
| en value exactly.</li></ul> | ||||
| <ul spacing="compact"> | <li><t>type: <tt>String</tt></t> | |||
| <li>type: "String"</li> | <t>The Quota <em>types</em> property contains the given value.</t></li> | |||
| </ul> | </ul> | |||
| <ul empty="true"><li>The Quota <em>types</em> property contains the given value. | ||||
| </li></ul> | <t>A Quota object matches the FilterCondition if, and only if, all the given con | |||
| <t>A Quota object matches the FilterCondition if and only if all the given condi | ditions | |||
| tions | ||||
| match. If zero properties are specified, it is automatically true for all object s.</t> | match. If zero properties are specified, it is automatically true for all object s.</t> | |||
| <t>The following Quota properties MUST be supported for sorting:</t> | <t>The following Quota properties <bcp14>MUST</bcp14> be supported for sorting:< /t> | |||
| <ul spacing="compact"> | <ul spacing="normal"> | |||
| <li>name</li> | <li>name</li> | |||
| <li>used</li> | <li>used</li> | |||
| </ul> | </ul> | |||
| </section> | </section> | |||
| <section anchor="quota-querychanges"><name>Quota/queryChanges</name> | <section anchor="quota-querychanges"><name>Quota/queryChanges</name> | |||
| <t>This is a standard "/queryChanges" method as described in <xref tar get="RFC8620"></xref>, Section 5.6.</t> | <t>This is a standard "/queryChanges" method as described in <xref target="RFC86 20" sectionFormat="comma" section="5.6"/>.</t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="examples"><name>Examples</name> | <section anchor="examples"><name>Examples</name> | |||
| <section anchor="fetching-quotas"><name>Fetching quotas</name> | <section anchor="fetching-quotas"><name>Fetching Quotas</name> | |||
| <t>Request fetching all quotas related to an account :</t> | <t>Request fetching all quotas related to an account:</t> | |||
| <artwork>[[ "Quota/get", { | <sourcecode type="json"><![CDATA[ | |||
| "accountId": "u33084183", | [[ "Quota/get", { | |||
| "ids": null | "accountId": "u33084183", | |||
| }, "0" ]] | "ids": null | |||
| </artwork> | }, "0" ]] | |||
| <t>With response :</t> | ]]></sourcecode> | |||
| <artwork>[[ "Quota/get", { | <t>With response:</t> | |||
| "accountId": "u33084183", | ||||
| "state": "78540", | <sourcecode type="json"><![CDATA[ | |||
| "list": [{ | [[ "Quota/get", { | |||
| "id": "2a06df0d-9865-4e74-a92f-74dcc814270e", | "accountId": "u33084183", | |||
| "resourceType": "count", | "state": "78540", | |||
| "used": 1056, | "list": [{ | |||
| "warnLimit": 1600, | "id": "2a06df0d-9865-4e74-a92f-74dcc814270e", | |||
| "softLimit": 1800, | "resourceType": "count", | |||
| "hardLimit": 2000, | "used": 1056, | |||
| "scope": "account", | "warnLimit": 1600, | |||
| "name": "bob@example.com", | "softLimit": 1800, | |||
| "description": "Personal account usage. When the soft limit i | "hardLimit": 2000, | |||
| s reached, the user is not allowed to send mails or create contacts and calendar | "scope": "account", | |||
| events anymore.", | "name": "bob@example.com", | |||
| "types" : [ "Mail", "Calendar", "Contact& | "description": "Personal account usage. When the soft limit is | |||
| quot; ] | reached, the user is not allowed to send mails or | |||
| create contacts and calendar events anymore.", | ||||
| "types" : [ "Mail", "Calendar", "Contact" ] | ||||
| }, { | }, { | |||
| "id": "3b06df0e-3761-4s74-a92f-74dcc963501x", | "id": "3b06df0e-3761-4s74-a92f-74dcc963501x", | |||
| "resourceType": "octets", | "resourceType": "octets", | |||
| ... | ... | |||
| }, ...], | }, ...], | |||
| "notFound": [] | "notFound": [] | |||
| }, "0" ]] | }, "0" ]] | |||
| </artwork> | ]]></sourcecode> | |||
| </section> | </section> | |||
| <section anchor="requesting-latest-quota-changes"><name>Requesting latest quota changes</name> | <section anchor="requesting-latest-quota-changes"><name>Requesting Latest Quota Changes</name> | |||
| <t>Request fetching the changes for a specific quota:</t> | <t>Request fetching the changes for a specific quota:</t> | |||
| <artwork>[[ "Quota/changes", { | <sourcecode type="json"><![CDATA[ | |||
| "accountId": "u33084183", | [[ "Quota/changes", { | |||
| "sinceState": "78540", | "accountId": "u33084183", | |||
| "maxChanges": 20 | "sinceState": "78540", | |||
| }, "0" ], | "maxChanges": 20 | |||
| [ "Quota/get", { | }, "0" ], | |||
| "accountId": "u33084183", | [ "Quota/get", { | |||
| "#ids": { | "accountId": "u33084183", | |||
| "resultOf": "0", | "#ids": { | |||
| "name": "Quota/changes", | "resultOf": "0", | |||
| "path": "/updated" | "name": "Quota/changes", | |||
| "path": "/updated" | ||||
| }, | }, | |||
| "#properties": { | "#properties": { | |||
| "resultOf": "0", | "resultOf": "0", | |||
| "name": "Quota/changes", | "name": "Quota/changes", | |||
| "path": "/updatedProperties" | "path": "/updatedProperties" | |||
| } | } | |||
| }, "1" ]] | }, "1" ]] | |||
| </artwork> | ]]></sourcecode> | |||
| <t>With response:</t> | <t>With response:</t> | |||
| <artwork>[[ "Quota/changes", { | <sourcecode type="json"><![CDATA[ | |||
| "accountId": "u33084183", | [[ "Quota/changes", { | |||
| "oldState": "78540", | "accountId": "u33084183", | |||
| "newState": "78542", | "oldState": "78540", | |||
| "hasMoreChanges": false, | "newState": "78542", | |||
| "updatedProperties": ["used"], | "hasMoreChanges": false, | |||
| "created": [], | "updatedProperties": ["used"], | |||
| "updated": ["2a06df0d-9865-4e74-a92f-74dcc814270e"], | "created": [], | |||
| "destroyed": [] | "updated": ["2a06df0d-9865-4e74-a92f-74dcc814270e"], | |||
| }, "0" ], | "destroyed": [] | |||
| [ "Quota/get", { | }, "0" ], | |||
| "accountId": "u33084183", | [ "Quota/get", { | |||
| "state": "10826", | "accountId": "u33084183", | |||
| "list": [{ | "state": "10826", | |||
| "id": "2a06df0d-9865-4e74-a92f-74dcc814270e", | "list": [{ | |||
| "used": 1246 | "id": "2a06df0d-9865-4e74-a92f-74dcc814270e", | |||
| "used": 1246 | ||||
| }], | }], | |||
| "notFound": [] | "notFound": [] | |||
| }, "1" ]] | }, "1" ]] | |||
| </artwork> | ]]></sourcecode> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="push"><name>Push</name> | <section anchor="push"><name>Push</name> | |||
| <t>Servers MUST support the JMAP push mechanisms, as specified in <xref target=" | <t>Servers <bcp14>MUST</bcp14> support the JMAP push mechanisms, as specified | |||
| RFC8620"></xref> Section 7, to allow clients to receive | in <xref target="RFC8620" sectionFormat="comma" section="7"/>, to allow | |||
| notifications when the state changes for the Quota type defined in this specific | clients to receive notifications when the state changes for the Quota type | |||
| ation.</t> | defined in this specification.</t> | |||
| </section> | ||||
| <section anchor="security-considerations"><name>Security considerations</name> | ||||
| <t>All security considerations of JMAP (<xref target="RFC8620"></xref>) apply to | ||||
| this specification.</t> | ||||
| <t>Implementors should be careful to make sure the implementation of the extensi | ||||
| on specified in this document does not violate the site's | ||||
| security policy. The resource usage of other users is likely to be considered co | ||||
| nfidential information and should not be divulged to | ||||
| unauthorized persons.</t> | ||||
| <t>As for any resource shared across users (for example, a quota with the " | ||||
| domain" or "global" scope), a user that can consume | ||||
| the resource can affect the resources available to the other users. For example, | ||||
| a user could spam themselves with events and | ||||
| make the shared resource hit the limit and unusable for others (implementors cou | ||||
| ld mitigate that with some rate limiting | ||||
| implementation on the server).</t> | ||||
| <t>Also, revealing domain and global quota counts to all users may cause privacy | ||||
| leakage of other sensitive data, | ||||
| or at least the existence of other sensitive data. For example, some users are p | ||||
| art of a private list | ||||
| belonging to the server, so they shouldn't know how many users are in there. But | ||||
| by comparing the quota count | ||||
| before and after sending a message to the list, it could reveal the number of pe | ||||
| ople of the list, as the | ||||
| domain or global quota count would go up by the number of people subscribed. In | ||||
| order to limit those attacks, quotas with | ||||
| "domain" or "global" scope SHOULD only be visible to server | ||||
| administrators and not to general users.</t> | ||||
| </section> | </section> | |||
| <section anchor="iana-considerations"><name>IANA Considerations</name> | <section anchor="iana-considerations"><name>IANA Considerations</name> | |||
| <section anchor="jmap-capability-registration-for-quota"><name>JMAP Capability R | <section anchor="jmap-capability-registration-for-quota"><name>JMAP Capability R | |||
| egistration for "quota"</name> | egistration for "quota"</name> | |||
| <t>IANA will register the "quota" JMAP Capability as follows:</t> | <t>IANA has registered the "quota" JMAP Capability as follows:</t> | |||
| <t>Capability Name: "urn:ietf:params:jmap:quota"</t> | ||||
| <t>Specification document: this document</t> | <dl spacing="normal" newline="false"> | |||
| <t>Intended use: common</t> | <dt>Capability Name:</dt> | |||
| <t>Change Controller: IETF</t> | <dd>urn:ietf:params:jmap:quota</dd> | |||
| <t>Security and privacy considerations: this document, <xref target="security-co | <dt>Reference:</dt> | |||
| nsiderations"></xref>.</t> | <dd>RFC 9425</dd> | |||
| <dt>Intended Use:</dt> | ||||
| <dd>common</dd> | ||||
| <dt>Change Controller:</dt> | ||||
| <dd>IETF</dd> | ||||
| <dt>Security and Privacy Considerations:</dt> | ||||
| <dd>RFC 9425, <xref target="security-considerations"></xref></dd> | ||||
| </dl> | ||||
| </section> | </section> | |||
| <section anchor="jmap-datatype-registration-for-quota"><name>JMAP Datatype Regis | <section anchor="jmap-datatype-registration-for-quota"><name>JMAP Data Type Regi | |||
| tration for "Quota"</name> | stration for "Quota"</name> | |||
| <t>IANA will register the "Quota" Data Type as folows:</t> | <t>IANA has registered the "Quota" Data Type as follows:</t> | |||
| <t>Type Name: "Quota"</t> | ||||
| <t>Can reference blobs: No</t> | <dl spacing="normal" newline="false"> | |||
| <t>Can use for state change: Yes</t> | <dt>Type Name:</dt> | |||
| <t>Capability: "urn:ietf:params:jmap:quota"</t> | <dd>Quota</dd> | |||
| <t>Reference: this document</t> | <dt>Can Reference Blobs:</dt> | |||
| <dd>No</dd> | ||||
| <dt>Can Use for State Change:</dt> | ||||
| <dd>Yes</dd> | ||||
| <dt>Capability:</dt> | ||||
| <dd>urn:ietf:params:jmap:quota</dd> | ||||
| <dt>Reference:</dt> | ||||
| <dd>RFC 9425</dd> | ||||
| </dl> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="acknowledgements"><name>Acknowledgements</name> | <section anchor="security-considerations"><name>Security Considerations</name> | |||
| <t>Thank you to Michael Bailly, that co-wrote the first draft version of this do | <t>All security considerations of JMAP <xref target="RFC8620"/> apply to this | |||
| cument, before deciding to turn to other matters.</t> | specification.</t> | |||
| <t>Thank you to Benoit Tellier for his constant help and support on writing this | <t>Implementors should be careful to make sure the implementation of the | |||
| document.</t> | extension specified in this document does not violate the site's security | |||
| <t>Thank you to Raphael Ouazana for sharing his own experience on how to write a | policy. The resource usage of other users is likely to be considered | |||
| RFC after finalizing his own document, the <xref target="RFC9007"></xref>.</t> | confidential information and should not be divulged to unauthorized | |||
| <t>Thank you to Bron Gondwana, Neil Jenkins, Alexei Melnikov, Joris Baum and the | persons.</t> | |||
| people from the IETF JMAP working group in general | <t>As for any resource shared across users (for example, a quota with the | |||
| that helped with extensive discussions, reviews and feedbacks.</t> | "domain" or "global" scope), a user that can consume the resource can affect | |||
| <t>Thank you to the people in the IETF organization that took the time to read, | the resources available to the other users. For example, a user could spam | |||
| understand, comment and give great feedbacks | themselves with events and make the shared resource hit the limit and unusable | |||
| in the last rounds.</t> | for others (implementors could mitigate that with some rate-limiting | |||
| implementation on the server).</t> | ||||
| <t>Also, revealing domain and global quota counts to all users may cause | ||||
| privacy leakage of other sensitive data, or at least the existence of other | ||||
| sensitive data. For example, some users are part of a private list belonging | ||||
| to the server, so they shouldn't know how many users are in there. However, by | ||||
| comparing the quota count before and after sending a message to the list, it | ||||
| could reveal the number of people of the list, as the domain or global quota | ||||
| count would go up by the number of people subscribed. In order to limit those | ||||
| attacks, quotas with "domain" or "global" scope <bcp14>SHOULD</bcp14> only be | ||||
| visible to server administrators and not to general users.</t> | ||||
| </section> | </section> | |||
| </middle> | </middle> | |||
| <back> | <back> | |||
| <references><name>Normative References</name> | <references><name>Normative References</name> | |||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119. xml"/> | |||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3629. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3629. xml"/> | |||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174. xml"/> | |||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8620. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8620. xml"/> | |||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.9007. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.9007. xml"/> | |||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.9110. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.9110. xml"/> | |||
| </references> | </references> | |||
| <section anchor="acknowledgements" numbered="false" toc="default"> | ||||
| <name>Acknowledgements</name> | ||||
| <t>Thank you to <contact fullname="Michael Bailly"/>, who co-wrote the first | ||||
| draft version of this document, before deciding to turn to other matters.</t> | ||||
| <t>Thank you to <contact fullname="Benoit Tellier"/> for his constant help and | ||||
| support on writing this document.</t> | ||||
| <t>Thank you to <contact fullname="Raphael Ouazana"/> for sharing his own | ||||
| experience on how to write an RFC after finalizing his own document: <xref | ||||
| target="RFC9007"/>.</t> | ||||
| <t>Thank you to <contact fullname="Bron Gondwana"/>, <contact fullname="Neil | ||||
| Jenkins"/>, <contact fullname="Alexey Melnikov"/>, <contact fullname="Joris | ||||
| Baum"/>, and the people from the IETF JMAP working group in general, who | ||||
| helped with extensive discussions, reviews, and feedback.</t> | ||||
| <t>Thank you to the people in the IETF organization, who took the time to | ||||
| read, understand, comment, and give great feedback in the last rounds.</t> | ||||
| </section> | ||||
| </back> | </back> | |||
| </rfc> | </rfc> | |||
| End of changes. 56 change blocks. | ||||
| 328 lines changed or deleted | 335 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. | ||||