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