rfc9661.original.xml | rfc9661.xml | |||
---|---|---|---|---|
<?xml version='1.0' encoding='utf-8'?> | <?xml version='1.0' encoding='UTF-8'?> | |||
<!-- draft submitted in xml v3 --> | ||||
<!DOCTYPE rfc [ | <!DOCTYPE rfc [ | |||
<!ENTITY nbsp " "> | <!ENTITY nbsp " "> | |||
<!ENTITY zwsp "​"> | <!ENTITY zwsp "​"> | |||
<!ENTITY nbhy "‑"> | <!ENTITY nbhy "‑"> | |||
<!ENTITY wj "⁠"> | <!ENTITY wj "⁠"> | |||
]> | ]> | |||
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" category="std" | |||
ipr="trust200902" | docName="draft-ietf-jmap-sieve-22" number="9661" obsoletes="" updates="" submis | |||
category="std" | sionType="IETF" consensus="true" xml:lang="en" tocInclude="true" symRefs="true" | |||
docName="draft-ietf-jmap-sieve-22" | sortRefs="true" version="3"> | |||
obsoletes="" | ||||
updates="" | ||||
submissionType="IETF" | ||||
consensus="true" | ||||
xml:lang="en" | ||||
tocInclude="true" | ||||
symRefs="true" | ||||
sortRefs="true" | ||||
version="3"> | ||||
<!-- xml2rfc v2v3 conversion 3.10.0 --> | ||||
<front> | <front> | |||
<title abbrev="JMAP Sieve">JMAP for Sieve Scripts</title> | <title abbrev="JMAP Sieve">The JSON Meta Application Protocol (JMAP) for Sie | |||
<seriesInfo name="Internet-Draft" value="draft-ietf-jmap-sieve-22"/> | ve Scripts</title> | |||
<!-- [rfced] For ease of the reader, we expanded "JMAP" in the | ||||
document title. Please let us know any objections. | ||||
Original: | ||||
JMAP for Sieve Scripts | ||||
Currently: | ||||
The JSON Meta Application Protocol (JMAP) for Sieve Scripts --> | ||||
<seriesInfo name="RFC" value="9661"/> | ||||
<author initials="K." surname="Murchison" fullname="Kenneth Murchison"> | <author initials="K." surname="Murchison" fullname="Kenneth Murchison"> | |||
<organization abbrev="Fastmail">Fastmail US LLC</organization> | <organization abbrev="Fastmail">Fastmail US LLC</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>1429 Walnut Street - Suite 1201</street> | <street>1429 Walnut Street, Suite 1201</street> | |||
<city>Philadelphia</city> | <city>Philadelphia</city> | |||
<region>PA</region> | <region>PA</region> | |||
<code>19102</code> | <code>19102</code> | |||
<country>USA</country> | <country>United States of America</country> | |||
</postal> | </postal> | |||
<email>murch@fastmailteam.com</email> | <email>murch@fastmailteam.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date/> | <date month="August" year="2024"/> | |||
<area>ART</area> | <area>ART</area> | |||
<!-- <workgroup>Independent Submission</workgroup>--> | <workgroup>jmap</workgroup> | |||
<workgroup>JMAP</workgroup> | ||||
<keyword>JMAP</keyword> | <keyword>JMAP</keyword> | |||
<keyword>JSON</keyword> | <keyword>JSON</keyword> | |||
<keyword>Sieve</keyword> | <keyword>Sieve</keyword> | |||
<abstract> | <abstract> | |||
<t>This document specifies a data model for managing Sieve | <t>This document specifies a data model for managing Sieve | |||
scripts on a server using the JSON Meta Application Protocol | scripts on a server using the JSON Meta Application Protocol | |||
(JMAP). | (JMAP). | |||
Clients can use this protocol to efficiently search, access, | Clients can use this protocol to efficiently search, access, | |||
organize, and validate Sieve scripts. | organize, and validate Sieve scripts. | |||
</t> | </t> | |||
</abstract> | </abstract> | |||
<!-- | ||||
<note title="Open Issues"> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
</li> | ||||
</ul> | ||||
</note> | ||||
</front> | </front> | |||
<middle> | <middle> | |||
<section numbered="true" toc="default"> | <section numbered="true" toc="default"> | |||
<name>Introduction</name> | <name>Introduction</name> | |||
<t><xref target="RFC8620">JMAP</xref> | <t><xref target="RFC8620">The JSON Meta Application Protocol (JMAP)</xref> | |||
(JSON Meta Application Protocol) is a generic protocol for | is a generic protocol for | |||
synchronizing data, such as mail, calendars or contacts, between | synchronizing data, such as mail, calendars, or contacts, between | |||
a client and a server. | a client and a server. | |||
It is optimized for mobile and web environments, and aims to | It is optimized for mobile and web environments, and it aims to | |||
provide a consistent interface to different data types. | provide a consistent interface to different data types. | |||
</t> | </t> | |||
<t>This specification defines a data model for managing | <t>This specification defines a data model for managing | |||
<xref target="RFC5228">Sieve</xref> scripts on | <xref target="RFC5228">Sieve scripts</xref> on | |||
a server using JMAP. | a server using JMAP. | |||
The data model is designed to allow a server to provide | The data model is designed to allow a server to provide | |||
consistent access to the same scripts via | consistent access to the same scripts via | |||
<xref target="RFC5804">ManageSieve</xref> as well as JMAP. | <xref target="RFC5804">ManageSieve</xref> as well as JMAP. | |||
</t> | </t> | |||
<section numbered="true" toc="default"> | <section numbered="true" toc="default"> | |||
<name>Notational Conventions</name> | <name>Notational Conventions</name> | |||
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", | <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | |||
"SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", | |||
RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be | "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", | |||
interpreted as described in BCP 14 | "<bcp14>SHOULD NOT</bcp14>", | |||
<xref target="RFC2119"/> | "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
<xref target="RFC8174"/> when, and only when, | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document | |||
they appear in all capitals, as shown here. | are to be interpreted as described in BCP 14 | |||
</t> | <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only | |||
when, they appear in all capitals, as shown here.</t> | ||||
<t>Type signatures, examples, and property descriptions in | <t>Type signatures, examples, and property descriptions in | |||
this document follow the conventions established in | this document follow the conventions established in | |||
<xref target="RFC8620" section="1.1"/>. | <xref target="RFC8620" section="1.1"/>. | |||
This document also uses data types and terminology established | This document also uses data types and terminology established | |||
in Sections | in Sections <xref target="RFC8620" section="1.2" | |||
<xref target="RFC8620" section="1.2" | sectionFormat="bare"/> through <xref target="RFC8620" | |||
sectionFormat="bare"/>-<xref target="RFC8620" | ||||
section="1.6" sectionFormat="bare"/> of | section="1.6" sectionFormat="bare"/> of | |||
<xref target="RFC8620"/>.</t> | <xref target="RFC8620"/>.</t> | |||
<t>The term SieveScript (with this specific capitalization) is | <t>The term "SieveScript" (with this specific capitalization) is | |||
used to refer to the data type defined in this document and | used to refer to the data type defined in this document and | |||
instances of those data types. | instances of the data types defined in <xref target="RFC8620"/>. | |||
Servers MUST support all properties specified for the | Servers <bcp14>MUST</bcp14> support all properties specified for the | |||
data type defined in this document.</t> | data type defined in this document. | |||
<t>For brevity, JMAP API | <!-- [rfced] Section 1.1: We found "data type defined in this | |||
document" and "those data types" in the same sentence confusing at | ||||
first. We updated as noted below. If this is incorrect, please | ||||
clarify the text. | ||||
Original: | ||||
The term SieveScript (with this specific capitalization) is used to | ||||
refer to the data type defined in this document and instances of | ||||
those data types. | ||||
Currently: | ||||
The term "SieveScript" (with this specific capitalization) is used to | ||||
refer to the data type defined in this document and instances of the | ||||
data types defined in [RFC8620]. --> | ||||
</t> | ||||
<t>For brevity, JMAP API examples | ||||
(see <xref target="RFC8620" section="3"/>) | (see <xref target="RFC8620" section="3"/>) | |||
examples only show the "methodCalls" property of the Request | only show the "methodCalls" property of the Request | |||
object, and the "methodResponses" property of the Response | object and the "methodResponses" property of the Response | |||
object. | object. | |||
All other examples are shown using the | All other examples are shown using the | |||
<xref target="RFC9112">HTTP 1.1</xref> protocol.</t> | <xref target="RFC9112">HTTP/1.1 protocol</xref>.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | <section numbered="true" toc="default"> | |||
<name>Addition to the Capabilities Object</name> | <name>Addition to the Capabilities Object</name> | |||
<t>The capabilities object is returned as part of the JMAP | <t>The capabilities object is returned as part of the JMAP | |||
Session object; | Session object; | |||
see <xref target="RFC8620" section="2" sectionFormat="comma"/>. | see <xref target="RFC8620" section="2" sectionFormat="comma"/>. | |||
This document defines one additional capability URI. | This document defines one additional capability URI. | |||
</t> | </t> | |||
<section anchor="capa" numbered="true" toc="default"> | <section anchor="capa" numbered="true" toc="default"> | |||
<name>urn:ietf:params:jmap:sieve</name> | <name>urn:ietf:params:jmap:sieve</name> | |||
<t>The urn:ietf:params:jmap:sieve URI represents support for | <t>The urn:ietf:params:jmap:sieve URI represents support for | |||
the SieveScript data type and associated API methods. | the SieveScript data type and associated API methods. | |||
The value of this property in the JMAP Session | The value of this property in the JMAP Session | |||
capabilities property is an object that MUST contain | capabilities property is an object that <bcp14>MUST</bcp14> contain | |||
the following information on server capabilities: | the following information on server capabilities: | |||
</t> | </t> | |||
<ul spacing="normal"> | <dl spacing="normal"> | |||
<li> | <dt><strong>implementation</strong>:</dt><dd><t> | |||
<t><strong>implementation</strong>: | ||||
<tt>String</tt> | <tt>String</tt> | |||
</t> | </t> | |||
<t> | <t> | |||
The name and version of the Sieve implementation. | The name and version of the Sieve implementation. | |||
</t> | </t> | |||
<t/> | </dd> | |||
</li> | </dl> | |||
</ul> | ||||
<t>The value of this property in an account's | <t>The value of this property in an account's | |||
accountCapabilities property is an object that MUST contain | accountCapabilities property is an object that <bcp14>MUST</bcp14> con tain | |||
the following information on per-account server capabilities: | the following information on per-account server capabilities: | |||
</t> | </t> | |||
<ul spacing="normal"> | <dl spacing="normal"> | |||
<li> | <dt><strong>maxSizeScriptName</strong>:</dt> | |||
<t><strong>maxSizeScriptName</strong>: | <dd><t><tt>UnsignedInt</tt> | |||
<tt>UnsignedInt</tt> | ||||
</t> | </t> | |||
<t> | <t> | |||
The maximum length, in octets, allowed for the | The maximum length, in octets, allowed for the | |||
name of a SieveScript. | name of a SieveScript. | |||
For compatibility with ManageSieve, this MUST be at | For compatibility with ManageSieve, this <bcp14>MUST</bcp14> be at | |||
least 512 (up to 128 Unicode characters). | least 512 (up to 128 Unicode characters). | |||
</t> | </t></dd> | |||
<t/> | ||||
</li> | <dt><strong>maxSizeScript</strong>:</dt><dd> | |||
<li> | <t><tt>UnsignedInt|null</tt> | |||
<t><strong>maxSizeScript</strong>: | ||||
<tt>UnsignedInt|null</tt> | ||||
</t> | </t> | |||
<t> | <t> | |||
The maximum size (in octets) of a Sieve script the | The maximum size (in octets) of a Sieve script the | |||
server is willing to store for the user, | server is willing to store for the user, | |||
or <tt>null</tt> for no limit. | or <tt>null</tt> for no limit. | |||
</t> | </t> | |||
<t/> | </dd> | |||
</li> | <dt><strong>maxNumberScripts</strong>:</dt> | |||
<li> | <dd><t><tt>UnsignedInt|null</tt> | |||
<t><strong>maxNumberScripts</strong>: | ||||
<tt>UnsignedInt|null</tt> | ||||
</t> | </t> | |||
<t> | <t> | |||
The maximum number of Sieve scripts the server is | The maximum number of Sieve scripts the server is | |||
willing to store for the user, | willing to store for the user, | |||
or <tt>null</tt> for no limit. | or <tt>null</tt> for no limit. | |||
</t> | </t> | |||
<t/> | </dd> | |||
</li> | <dt><strong>maxNumberRedirects</strong>:</dt> | |||
<li> | <dd><t><tt>UnsignedInt|null</tt> | |||
<t><strong>maxNumberRedirects</strong>: | ||||
<tt>UnsignedInt|null</tt> | ||||
</t> | </t> | |||
<t> | <t> | |||
The maximum number of Sieve "redirect" actions a | The maximum number of Sieve "redirect" actions a | |||
script can perform during a single evaluation | script can perform during a single evaluation, | |||
or <tt>null</tt> for no limit. | or <tt>null</tt> for no limit. | |||
Note that this is different from the total number of | Note that this is different from the total number of | |||
"redirect" actions a script can contain. | "redirect" actions a script can contain. | |||
</t> | </t> | |||
<t/> | </dd> | |||
</li> | ||||
<li> | <dt><strong>sieveExtensions</strong>:</dt> | |||
<t><strong>sieveExtensions</strong>: | <dd><t><tt>String[]</tt> | |||
<tt>String[]</tt> | ||||
</t> | </t> | |||
<t> | <t> | |||
A list of case-sensitive Sieve capability strings (as | A list of case-sensitive Sieve capability strings (as | |||
listed in Sieve "require" action; see | listed in the Sieve "require" action; see | |||
<xref target="RFC5228" section="3.2" sectionFormat="comma"/>) | <xref target="RFC5228" section="3.2" sectionFormat="comma"/>) | |||
indicating the extensions supported by the Sieve engine. | indicating the extensions supported by the Sieve engine. | |||
</t> | </t></dd> | |||
<t/> | <dt><strong>notificationMethods</strong>:</dt> | |||
</li> | <dd><t><tt>String[]|null</tt> | |||
<li> | ||||
<t><strong>notificationMethods</strong>: | ||||
<tt>String[]|null</tt> | ||||
</t> | </t> | |||
<t> | <t> | |||
A list of | A list of | |||
<xref target="RFC3986">URI schema parts</xref> | <xref target="RFC3986">URI schema parts</xref> | |||
for notification methods supported by the Sieve | for notification methods supported by the Sieve | |||
<xref target="RFC5435">"enotify"</xref> | <xref target="RFC5435">"enotify" extension</xref>, | |||
extension, or <tt>null</tt> if the extension | or <tt>null</tt> if the extension | |||
is not supported by the Sieve engine. | is not supported by the Sieve engine. | |||
<!-- [rfced] Section 1.2.1.: We see "URI scheme" but not "URI schema" | ||||
in RFC 3986. Should "schema" be "scheme"? | ||||
Original: | ||||
* *notificationMethods*: String[]|null | ||||
A list of URI schema parts [RFC3986] for notification methods | ||||
supported by the Sieve "enotify" [RFC5435] extension, or null if | ||||
the extension is not supported by the Sieve engine. | ||||
* *externalLists*: String[]|null | ||||
A list of URI schema parts [RFC3986] for externally stored list | ||||
types supported by the Sieve "extlists" [RFC6134] extension, or | ||||
null if the extension is not supported by the Sieve engine. --> | ||||
</t> | </t> | |||
<t/> | </dd> | |||
</li> | <dt><strong>externalLists</strong>:</dt> | |||
<li> | <dd><t><tt>String[]|null</tt> | |||
<t><strong>externalLists</strong>: | ||||
<tt>String[]|null</tt> | ||||
</t> | </t> | |||
<t> | <t> | |||
A list of | A list of | |||
<xref target="RFC3986">URI schema parts</xref> | <xref target="RFC3986">URI schema parts</xref> | |||
for externally stored list types supported by the | for externally stored list types supported by the | |||
Sieve <xref target="RFC6134">"extlists"</xref> | Sieve <xref target="RFC6134">"extlists" extension</xref>, | |||
extension, or <tt>null</tt> if the extension | or <tt>null</tt> if the extension | |||
is not supported by the Sieve engine. | is not supported by the Sieve engine. | |||
</t> | </t> | |||
</li> | </dd> | |||
</ul> | </dl> | |||
</section> | </section> | |||
<section anchor="session" numbered="true" toc="default"> | <section anchor="session" numbered="true" toc="default"> | |||
<name>Example</name> | <name>Example</name> | |||
<t keepWithNext="true"> | <t keepWithNext="true"> | |||
A JMAP Session object showing a user that has access to their | This example JMAP Session object shows a user that has access to the ir | |||
own Sieve scripts with support for a few Sieve extensions: | own Sieve scripts with support for a few Sieve extensions: | |||
</t> | </t> | |||
<!-- [rfced] Please review each artwork element in this document. | ||||
Should any of them be tagged as sourcecode, perhaps with type set to | ||||
"json" or "http-message" as appropriate? For example, is the data in | ||||
Section 1.2.2 of type "json", and are the HTTP/1.1 GET and POST | ||||
entries in Sections 2.3.1 and 2.4.1 of type "http-message"? | ||||
If the current list of preferred values for "type" on | ||||
(https://www.rfc-editor.org/rpc/wiki/doku.php?id=sourcecode-types) | ||||
does not contain an applicable type, please let us know. | ||||
Also, it is acceptable to leave the "type" attribute unset. --> | ||||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
{ | { | |||
"capabilities": { | "capabilities": { | |||
"urn:ietf:params:jmap:core": { | "urn:ietf:params:jmap:core": { | |||
... | ... | |||
}, | }, | |||
"urn:ietf:params:jmap:mail": {}, | "urn:ietf:params:jmap:mail": {}, | |||
"urn:ietf:params:jmap:quota": {}, | "urn:ietf:params:jmap:quota": {}, | |||
"urn:ietf:params:jmap:blob": {}, | "urn:ietf:params:jmap:blob": {}, | |||
"urn:ietf:params:jmap:sieve": { | "urn:ietf:params:jmap:sieve": { | |||
skipping to change at line 328 ¶ | skipping to change at line 351 ¶ | |||
... | ... | |||
} | } | |||
]]></artwork> | ]]></artwork> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="object" numbered="true" toc="default"> | <section anchor="object" numbered="true" toc="default"> | |||
<name>Sieve Scripts</name> | <name>Sieve Scripts</name> | |||
<t>A <strong>SieveScript</strong> object represents | <t>A <strong>SieveScript</strong> object represents | |||
a single <xref target="RFC5228">Sieve</xref> script for | a single <xref target="RFC5228">Sieve script</xref> for | |||
filtering email messages at time of final delivery. | filtering email messages at the time of final delivery. | |||
</t> | </t> | |||
<section anchor="props" numbered="true" toc="default"> | <section anchor="props" numbered="true" toc="default"> | |||
<name>Sieve Script Properties</name> | <name>Sieve Script Properties</name> | |||
<t>A <strong>SieveScript</strong> object has the | <t>A <strong>SieveScript</strong> object has the | |||
following properties: | following properties: | |||
</t> | </t> | |||
<ul spacing="normal"> | <dl spacing="normal"> | |||
<li> | <dt><strong>id</strong>:</dt> | |||
<t><strong>id</strong>: | <dd><t><tt>Id</tt> | |||
<tt>Id</tt> | ||||
(immutable; server-set) | (immutable; server-set) | |||
</t> | </t> | |||
<t> | <t> | |||
The id of the script. | The id of the script. | |||
</t> | </t> | |||
<t/> | </dd> | |||
</li> | <dt><strong>name</strong>:</dt> | |||
<li> | <dd><t><tt>String|null</tt> | |||
<t><strong>name</strong>: | (optional; default is server dependent) | |||
<tt>String|null</tt> | ||||
(optional; default is server-dependent) | ||||
</t> | </t> | |||
<t> | <t> | |||
User-visible name for the SieveScript. | User-visible name for the SieveScript. | |||
If non-null, this MUST be a | If non-null, this <bcp14>MUST</bcp14> be a | |||
<xref target="RFC5198">Net-Unicode</xref> | <xref target="RFC5198">Net-Unicode string</xref> | |||
string of at least 1 character in length, subject to the | of at least 1 character in length, subject to the | |||
maximum size given in the capability object. | maximum size given in the capability object. | |||
</t> | </t> | |||
<t> | <t> | |||
For compatibility with ManageSieve, servers MUST reject | For compatibility with ManageSieve, servers <bcp14>MUST</bcp14> re ject | |||
names that contain any of the following Unicode characters: | names that contain any of the following Unicode characters: | |||
U+0000 - U+001F, U+007F - U+009F, U+2028, U+2029. | U+0000-U+001F, U+007F-U+009F, U+2028, or U+2029. | |||
</t> | </t> | |||
<t> | <t> | |||
Servers MAY reject names that violate server policy | Servers <bcp14>MAY</bcp14> reject names that violate server policy | |||
(e.g., names containing slash (/)). | (e.g., names containing a slash (/)). | |||
</t> | </t> | |||
<t> | <t> | |||
The name MUST be unique among all SieveScripts within an | The name <bcp14>MUST</bcp14> be unique among all SieveScripts with in an | |||
account. | account. | |||
</t> | </t> | |||
<t/> | </dd> | |||
</li> | <dt><strong>blobId</strong>:</dt> | |||
<li> | <dd><t><tt>Id</tt> | |||
<t><strong>blobId</strong>: | ||||
<tt>Id</tt> | ||||
</t> | </t> | |||
<t> | <t> | |||
The id of the blob containing the raw octets of the script. | The id of the blob containing the raw octets of the script. | |||
</t> | </t> | |||
<t/> | </dd> | |||
</li> | <dt><strong>isActive</strong>:</dt> | |||
<li> | <dd><t><tt>Boolean</tt> | |||
<t><strong>isActive</strong>: | ||||
<tt>Boolean</tt> | ||||
(server-set; default: false) | (server-set; default: false) | |||
</t> | </t> | |||
<t> | <t> | |||
Indicator that the SieveScript is actively filtering | Indicator that the SieveScript is actively filtering | |||
incoming messages. | incoming messages. | |||
</t> | </t> | |||
<t> | <t> | |||
A user may have at most one active script. | A user may have at most one active script. | |||
The <xref target="set">SieveScript/set</xref> method is | The <xref target="set">SieveScript/set method</xref> is | |||
used for changing the active script or disabling Sieve | used for changing the active script or disabling Sieve | |||
processing. | processing. | |||
</t> | </t> | |||
<t/> | </dd> | |||
</li> | </dl> | |||
</ul> | ||||
</section> | </section> | |||
<section anchor="content" numbered="true" toc="default"> | <section anchor="content" numbered="true" toc="default"> | |||
<name>Sieve Script Content</name> | <name>Sieve Script Content</name> | |||
<t>A script MUST be <xref target="RFC3629">UTF-8</xref> | <t>A script <bcp14>MUST</bcp14> be <xref target="RFC3629">UTF-8 content< | |||
content of at least 1 character in length, subject to the | /xref> | |||
of at least 1 character in length, subject to the | ||||
syntax of <xref target="RFC5228">Sieve</xref>. | syntax of <xref target="RFC5228">Sieve</xref>. | |||
A script MUST NOT contain any "require" statement(s) | A script <bcp14>MUST NOT</bcp14> contain any "require" statement(s) | |||
mentioning Sieve capability strings not present in the | mentioning Sieve capability strings not present in the | |||
<xref target="capa">capability</xref> object. | <xref target="capa">capability object</xref>. | |||
Note that if the Sieve <xref target="RFC5463">"ihave"</xref> | Note that if the Sieve <xref target="RFC5463">"ihave" capability strin | |||
capability string is present in the capability object, | g </xref> | |||
the script MAY mention unrecognized/unsupported extensions | is present in the capability object, | |||
the script <bcp14>MAY</bcp14> mention unrecognized/unsupported extensi | ||||
ons | ||||
in the "ihave" test. | in the "ihave" test. | |||
</t> | </t> | |||
<t>Script content is treated as a binary blob and | <t>Script content is treated as a binary blob and | |||
uploaded/downloaded via the mechanisms in | uploaded/downloaded via the mechanisms provided in | |||
<xref target="RFC8620"/> Sections | Sections <xref target="RFC8620" section="6.1" | |||
<xref target="RFC8620" section="6.1" | sectionFormat="bare"/> and <xref target="RFC8620" | |||
sectionFormat="bare"/>/<xref target="RFC8620" | section="6.2" sectionFormat="bare"/> of <xref target="RFC8620"/> | |||
section="6.2" sectionFormat="bare"/> | , | |||
respectively and/or via the JMAP Blob management methods in | respectively, and/or via the JMAP Blob management methods provided in | |||
<xref target="RFC9404"/> Sections | Sections <xref target="RFC9404" section="4.1" | |||
<xref target="RFC9404" section="4.1" | sectionFormat="bare"/> and <xref target="RFC9404" | |||
sectionFormat="bare"/>/<xref target="RFC9404" | section="4.2" sectionFormat="bare"/> of <xref target="RFC9404"/> | |||
section="4.2" sectionFormat="bare"/> | , | |||
respectively. | respectively. | |||
</t> | </t> | |||
<t>Downloading script content via the JMAP downloadUrl or the | <t>Downloading script content via the JMAP downloadUrl or the | |||
Blob/get method provides equivalent functionality to the | Blob/get method provides functionality equivalent to that of the | |||
GETSCRIPT command in <xref target="RFC5804"/>. | GETSCRIPT command defined in <xref target="RFC5804"/>. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="get" numbered="true" toc="default"> | <section anchor="get" numbered="true" toc="default"> | |||
<name>SieveScript/get</name> | <name>SieveScript/get</name> | |||
<t>This is a standard "/get" method as described in | <t>This is a standard "/get" method as described in | |||
<xref target="RFC8620" section="5.1" sectionFormat="comma"/>. | <xref target="RFC8620" section="5.1" sectionFormat="comma"/>. | |||
The <em>ids</em> argument may be | The <em>ids</em> argument may be | |||
<tt>null</tt> to fetch all scripts at once. | <tt>null</tt> to fetch all scripts at once. | |||
</t> | </t> | |||
<t>This method provides equivalent functionality to the | <t>This method provides functionality equivalent to that of the | |||
LISTSCRIPTS command in <xref target="RFC5804"/>. | LISTSCRIPTS command defined in <xref target="RFC5804"/>. | |||
</t> | </t> | |||
<section numbered="true" toc="default"> | <section numbered="true" toc="default"> | |||
<name>Examples</name> | <name>Examples</name> | |||
<t keepWithNext="true"> | <t keepWithNext="true"> | |||
List all scripts: | List all scripts: | |||
</t> | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
[ | [ | |||
["SieveScript/get", { | ["SieveScript/get", { | |||
skipping to change at line 485 ¶ | skipping to change at line 498 ¶ | |||
"notFound": [], | "notFound": [], | |||
"accountId": "ken" | "accountId": "ken" | |||
}, | }, | |||
"0" | "0" | |||
] | ] | |||
] | ] | |||
]]></artwork> | ]]></artwork> | |||
<t keepWithNext="true"> | <t keepWithNext="true"> | |||
Download the script content via | Download the script content via | |||
the JMAP downloadUrl as advertised in <xref target="session"/>: | the JMAP downloadUrl as advertised in the example in <xref target="s ession"/>: | |||
</t> | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
GET /jmap/download/ken/S7/test1.siv?accept=application/sieve HTTP/1.1 | GET /jmap/download/ken/S7/test1.siv?accept=application/sieve HTTP/1.1 | |||
Host: jmap.example.com | Host: jmap.example.com | |||
Authorization: Basic a2VuOnBhc3N3b3Jk | Authorization: Basic a2VuOnBhc3N3b3Jk | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Date: Fri, 22 Oct 2021 15:27:38 GMT | Date: Fri, 22 Oct 2021 15:27:38 GMT | |||
Content-Type: application/sieve; charset=utf-8 | Content-Type: application/sieve; charset=utf-8 | |||
Content-Disposition: attachment; filename="test1.siv" | Content-Disposition: attachment; filename="test1.siv" | |||
skipping to change at line 561 ¶ | skipping to change at line 574 ¶ | |||
], | ], | |||
"notFound": [], | "notFound": [], | |||
"accountId": "ken" | "accountId": "ken" | |||
}, | }, | |||
"1" | "1" | |||
] | ] | |||
] | ] | |||
]]></artwork> | ]]></artwork> | |||
</section> | </section> | |||
</section> | </section> | |||
<!-- /get --> | ||||
<section anchor="set" numbered="true" toc="default"> | <section anchor="set" numbered="true" toc="default"> | |||
<name>SieveScript/set</name> | <name>SieveScript/set</name> | |||
<t>This is a standard "/set" method as described in | <t>This is a standard "/set" method as described in | |||
<xref target="RFC8620" section="5.3" sectionFormat="comma"/> | <xref target="RFC8620" section="5.3" sectionFormat="comma"/>, | |||
but with the following additional optional request arguments: | but with the following additional optional request arguments: | |||
</t> | </t> | |||
<ul spacing="normal"> | <dl spacing="normal"> | |||
<li> | <dt><strong>onSuccessActivateScript</strong>:</dt> | |||
<t><strong>onSuccessActivateScript</strong>: | <dd><t><tt>Id</tt> | |||
<tt>Id</tt> | ||||
</t> | </t> | |||
<t> | <t> | |||
The id of the SieveScript to activate if and | The id of the SieveScript to activate if and | |||
only if all of the creations, modifications, and | only if all of the creations, modifications, and | |||
destructions (if any) succeed. | destructions (if any) succeed. | |||
(For references to SieveScript creations, this is | (For references to SieveScript creations, this is | |||
equivalent to a creation-reference, so the id will be the | equivalent to a creation-reference, so the id will be the | |||
creation id prefixed with a "#".) | creation id prefixed with a "#".) | |||
The currently active SieveScript (if any) will be deactivated | The currently active SieveScript (if any) will be deactivated | |||
before activating the specified SieveScript. | before activating the specified SieveScript. | |||
</t> | </t> | |||
<t> | <t> | |||
If omitted, or if the id is either invalid or nonexistent, it MUST b | If omitted, or if the id is either invalid or nonexistent, it <bcp14 | |||
e | >MUST</bcp14> be | |||
ignored and the currently active SieveScript (if any) will | ignored, and the currently active SieveScript (if any) will | |||
remain as such. | remain as such. | |||
</t> | </t> | |||
<t> | <t> | |||
The id of any activated SieveScript MUST be reported in | The id of any activated SieveScript <bcp14>MUST</bcp14> be reported in | |||
either the "created" or "updated" argument in the response | either the "created" or "updated" argument in the response | |||
as appropriate, including a value of "true" for the "isActive" | as appropriate, including a value of "true" for the "isActive" | |||
property. | property. | |||
The id of any deactivated SieveScript MUST be reported in | The id of any deactivated SieveScript <bcp14>MUST</bcp14> be reporte d in | |||
the "updated" argument in the response, including a value of | the "updated" argument in the response, including a value of | |||
"false" for the "isActive" property. | "false" for the "isActive" property. | |||
</t> | </t> | |||
<t/> | </dd> | |||
</li> | ||||
<li> | <dt><strong>onSuccessDeactivateScript</strong>:</dt> | |||
<t><strong>onSuccessDeactivateScript</strong>: | <dd><t><tt>Boolean</tt> | |||
<tt>Boolean</tt> | ||||
</t> | </t> | |||
<t> | <t> | |||
If <tt>true</tt>, the currently active | If <tt>true</tt>, the currently active | |||
SieveScript (if any) will be deactivated if and only if | SieveScript (if any) will be deactivated if and only if | |||
all of the creations, modifications, and destructions (if | all of the creations, modifications, and destructions (if | |||
any) succeed. | any) succeed. | |||
If <tt>false</tt> or omitted, the currently active SieveScript (if | If <tt>false</tt> or omitted, the currently active SieveScript (if | |||
any) will remain as such. | any) will remain as such. | |||
</t> | </t> | |||
<t> | <t> | |||
The id of any deactivated SieveScript MUST be reported in | The id of any deactivated SieveScript <bcp14>MUST</bcp14> be reporte d in | |||
the "updated" argument in the response, including a value of | the "updated" argument in the response, including a value of | |||
"false" for the "isActive" property. | "false" for the "isActive" property. | |||
</t> | </t> | |||
<t/> | </dd> | |||
</li> | </dl> | |||
</ul> | ||||
<t>If both the <strong>onSuccessActivateScript</strong> and | <t>If both the <strong>onSuccessActivateScript</strong> and | |||
<strong>onSuccessDeactivateScript</strong> arguments are | <strong>onSuccessDeactivateScript</strong> arguments are | |||
present in the request, then | present in the request, then | |||
<strong>onSuccessDeactivateScript</strong> MUST be processed first. | <strong>onSuccessDeactivateScript</strong> <bcp14>MUST</bcp14> be proces sed first. | |||
If neither argument is present in the request, the currently | If neither argument is present in the request, the currently | |||
active SieveScript (if any) will remain as such. | active SieveScript (if any) will remain as such. | |||
</t> | </t> | |||
<t>This method provides equivalent functionality to the | <t>This method provides functionality equivalent to that of the | |||
PUTSCRIPT, DELETESCRIPT, RENAMESCRIPT, and SETACTIVE commands | PUTSCRIPT, DELETESCRIPT, RENAMESCRIPT, and SETACTIVE commands defined | |||
in <xref target="RFC5804"/>. | in <xref target="RFC5804"/>. | |||
</t> | </t> | |||
<t>Script content must first be uploaded as per | <t>Script content must first be uploaded as per | |||
<xref target="content"/> prior to referencing it in a | <xref target="content"/> prior to referencing it in a | |||
SieveScript/set call.</t> | SieveScript/set call.</t> | |||
<t>If the SieveScript can not be created or updated because it | <t>If the SieveScript cannot be created or updated because it | |||
would result in two SieveScripts with the same name, the | would result in two SieveScripts with the same name, the | |||
server MUST reject the request with an "alreadyExists" | server <bcp14>MUST</bcp14> reject the request with an "alreadyExists" | |||
SetError. | SetError. | |||
An "existingId" property of type "Id" MUST be included on the | An "existingId" property of type "Id" <bcp14>MUST</bcp14> be included on the | |||
SetError object with the id of the existing SieveScript.</t> | SetError object with the id of the existing SieveScript.</t> | |||
<t>If the SieveScript can not be created or updated because | <t>If the SieveScript cannot be created or updated because | |||
its size exceeds the "maxSizeScript" limit, the server MUST | its size exceeds the "maxSizeScript" limit, the server <bcp14>MUST</bcp1 | |||
4> | ||||
reject the request with a "tooLarge" SetError.</t> | reject the request with a "tooLarge" SetError.</t> | |||
<t>If the SieveScript can not be created because it would | <t>If the SieveScript cannot be created because it would | |||
exceed the "maxNumberScripts" limit or would exceed a | exceed the "maxNumberScripts" limit or would exceed a | |||
server-imposed storage limit, the server MUST | server-imposed storage limit, the server <bcp14>MUST</bcp14> | |||
reject the request with an "overQuota" SetError.</t> | reject the request with an "overQuota" SetError.</t> | |||
<t>The active SieveScript MUST NOT be destroyed | <t>The active SieveScript <bcp14>MUST NOT</bcp14> be destroyed | |||
unless it is first deactivated in a separate SieveScript/set | unless it is first deactivated in a separate SieveScript/set | |||
method call.</t> | method call.</t> | |||
<t>The following extra SetError types are defined: | <t>The following extra SetError types are defined: | |||
</t> | </t> | |||
<t>For "create" and "update": | <t>For "create" and "update": | |||
</t> | </t> | |||
<ul spacing="normal"> | <dl spacing="normal"> | |||
<li> | ||||
<t><strong>invalidSieve</strong>: | <dt><strong>invalidSieve</strong>:</dt> | |||
</t> | <dd><t> | |||
<t> | ||||
The SieveScript content violates the | The SieveScript content violates the | |||
<xref target="RFC5228">Sieve</xref> | <xref target="RFC5228">Sieve grammar</xref>, | |||
grammar and/or one | and/or one | |||
or more extensions mentioned in the script's "require" | or more extensions mentioned in the script's "require" | |||
statement(s) are not supported by the Sieve interpreter. | statement(s) are not supported by the Sieve interpreter. | |||
The <em>description</em> property on | The <em>description</em> property on | |||
the SetError object SHOULD contain a specific error | the SetError object <bcp14>SHOULD</bcp14> contain a specific error | |||
message giving at least the line number of the first error. | message giving at least the line number of the first error.</t> | |||
</t> | </dd> | |||
<t/> | </dl> | |||
</li> | ||||
</ul> | ||||
<t>For "destroy": | <t>For "destroy": | |||
</t> | </t> | |||
<ul spacing="normal"> | <dl spacing="normal"> | |||
<li> | <dt><strong>sieveIsActive</strong>:</dt> | |||
<t><strong>sieveIsActive</strong>: | <dd><t> | |||
</t> | ||||
<t> | ||||
The SieveScript is active. | The SieveScript is active. | |||
</t> | </t> | |||
<t/> | </dd> | |||
</li> | </dl> | |||
</ul> | ||||
<section numbered="true" toc="default"> | <section numbered="true" toc="default"> | |||
<name>Examples</name> | <name>Examples</name> | |||
<t keepWithNext="true"> | <t keepWithNext="true"> | |||
Upload a script | Upload a script | |||
requiring the Imap4Flags | requiring the Imap4Flags Extension | |||
<xref target="RFC5232"/> | <xref target="RFC5232"/> | |||
Extension using the JMAP uploadUrl as advertised in | using the JMAP uploadUrl as advertised in the example in | |||
<xref target="session"/>: | <xref target="session"/>: | |||
</t> | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
POST /jmap/upload/ken/ HTTP/1.1 | POST /jmap/upload/ken/ HTTP/1.1 | |||
Host: jmap.example.com | Host: jmap.example.com | |||
Authorization: Basic a2VuOnBhc3N3b3Jk | Authorization: Basic a2VuOnBhc3N3b3Jk | |||
Content-Type: application/sieve | Content-Type: application/sieve | |||
Content-Length: 98 | Content-Length: 98 | |||
require "imapflags"; | require "imapflags"; | |||
skipping to change at line 847 ¶ | skipping to change at line 849 ¶ | |||
"notCreated": null, | "notCreated": null, | |||
"notUpdated": null, | "notUpdated": null, | |||
"notDestroyed": null, | "notDestroyed": null, | |||
"accountId": "ken" | "accountId": "ken" | |||
}, | }, | |||
"2" | "2" | |||
] | ] | |||
] | ] | |||
]]></artwork> | ]]></artwork> | |||
<t keepWithNext="true"> | <t keepWithNext="true"> | |||
Update the script name and deactivate it: | Update the script name, and deactivate it: | |||
</t> | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
[ | [ | |||
["SieveScript/set", { | ["SieveScript/set", { | |||
"accountId": "ken", | "accountId": "ken", | |||
"update": { "dd1b164f-8cdc-448c-9f54": { | "update": { "dd1b164f-8cdc-448c-9f54": { | |||
"name": "myscript" | "name": "myscript" | |||
} | } | |||
}, | }, | |||
"onSuccessDeactivateScript": true | "onSuccessDeactivateScript": true | |||
skipping to change at line 972 ¶ | skipping to change at line 974 ¶ | |||
"notUpdated": null, | "notUpdated": null, | |||
"notDestroyed": null, | "notDestroyed": null, | |||
"accountId": "ken" | "accountId": "ken" | |||
}, | }, | |||
"6" | "6" | |||
] | ] | |||
] | ] | |||
]]></artwork> | ]]></artwork> | |||
</section> | </section> | |||
</section> | </section> | |||
<!-- /set --> | ||||
<section numbered="true" toc="default"> | <section numbered="true" toc="default"> | |||
<name>SieveScript/query</name> | <name>SieveScript/query</name> | |||
<t>This is a standard "/query" method as described in | <t>This is a standard "/query" method as described in | |||
<xref target="RFC8620" section="5.5" sectionFormat="comma"/>. | <xref target="RFC8620" section="5.5" sectionFormat="comma"/>. | |||
A <em>FilterCondition</em> object has the | A <em>FilterCondition</em> object has the | |||
following properties, either of which may be omitted: | following properties, either of which may be omitted: | |||
</t> | </t> | |||
<ul spacing="normal"> | <dl spacing="normal"> | |||
<li> | ||||
<t><strong>name</strong>: | <dt><strong>name</strong>:</dt> | |||
<tt>String</tt> | <dd><t><tt>String</tt> | |||
</t> | </t> | |||
<t> | <t> | |||
The SieveScript "name" property contains the given string. | The SieveScript "name" property contains the given string. | |||
</t> | </t> | |||
<t/> | </dd> | |||
</li> | ||||
<li> | <dt><strong>isActive</strong>:</dt> | |||
<t><strong>isActive</strong>: | <dd><t><tt>Boolean</tt> | |||
<tt>Boolean</tt> | ||||
</t> | </t> | |||
<t> | <t> | |||
The "isActive" property of the SieveScript must be | The "isActive" property of the SieveScript must be | |||
identical to the value given to match the condition. | identical to the value given to match the condition. | |||
</t> | </t> | |||
<t/> | </dd> | |||
</li> | </dl> | |||
<!-- | <t>The following SieveScript properties <bcp14>MUST</bcp14> be supported | |||
<t> | for | |||
<spanx style="strong">isIncluded</spanx>: | ||||
<spanx style="verb">Boolean</spanx> | ||||
<vspace blankLines="1"/> | ||||
If true, the SieveScript must be included | ||||
(see <xref target="RFC6609" />) by the content of another | ||||
SieveScript to match the condition. | ||||
Otherwise, the SieveScript must not be included by the | ||||
content of another SieveScript to match the condition. | ||||
<vspace blankLines="1"/> | ||||
</t> | ||||
</ul> | ||||
<t>The following SieveScript properties MUST be supported for | ||||
sorting: | sorting: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<t><strong>name</strong> | <t><strong>name</strong> | |||
</t> | </t> | |||
<t/> | ||||
</li> | </li> | |||
<li> | <li> | |||
<strong>isActive</strong> | <strong>isActive</strong> | |||
</li> | </li> | |||
</ul> | </ul> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | <section numbered="true" toc="default"> | |||
<name>SieveScript/validate</name> | <name>SieveScript/validate</name> | |||
<t>This method is used by the client to verify Sieve script | <t>This method is used by the client to verify Sieve script | |||
validity without storing the script on the server. | validity without storing the script on the server. | |||
</t> | </t> | |||
<t>The method takes the following arguments: | <t>The method takes the following arguments: | |||
</t> | </t> | |||
<ul spacing="normal"> | <dl spacing="normal"> | |||
<li> | <dt><strong>accountId</strong>:</dt> | |||
<t><strong>accountId</strong>: | <dd><t><tt>Id</tt> | |||
<tt>Id</tt> | ||||
</t> | </t> | |||
<t> | <t> | |||
The id of the account to use. | The id of the account to use. | |||
</t> | </t> | |||
<t/> | </dd> | |||
</li> | <dt><strong>blobId</strong>:</dt> | |||
<li> | <dd><t><tt>Id</tt> | |||
<t><strong>blobId</strong>: | ||||
<tt>Id</tt> | ||||
</t> | </t> | |||
<t> | <t> | |||
The id of the blob containing the raw octets of the | The id of the blob containing the raw octets of the | |||
script to validate, | script to validate, | |||
subject to the same requirements in | subject to the same requirements in | |||
<xref target="object"/>. | <xref target="object"/>. | |||
<!-- [rfced] Section 2.6: This citation is confusing, as | ||||
Section 2 only contains one brief sentence and this subsection is | ||||
part of Section 2. If the suggested text is not correct, please | ||||
clarify. | ||||
Original: | ||||
* *blobId*: Id | ||||
The id of the blob containing the raw octets of the script to | ||||
validate, subject to the same requirements in Section 2. | ||||
Suggested: | ||||
* *blobId*: Id | ||||
The id of the blob containing the raw octets of the script to | ||||
validate, subject to the same requirements as those discussed | ||||
earlier in this section. --> | ||||
</t> | </t> | |||
<t/> | </dd> | |||
</li> | </dl> | |||
</ul> | ||||
<t>The response has the following arguments: | <t>The response has the following arguments: | |||
</t> | </t> | |||
<ul spacing="normal"> | <dl spacing="normal"> | |||
<li> | <dt><strong>accountId</strong>:</dt> | |||
<t><strong>accountId</strong>: | <dd><t><tt>Id</tt> | |||
<tt>Id</tt> | ||||
</t> | </t> | |||
<t> | <t> | |||
The id of the account used for this call. | The id of the account used for this call. | |||
</t> | </t> | |||
<t/> | </dd> | |||
</li> | ||||
<li> | <dt><strong>error</strong>:</dt> | |||
<t><strong>error</strong>: | <dd><t><tt>SetError|null</tt> | |||
<tt>SetError|null</tt> | ||||
</t> | </t> | |||
<t> | <t> | |||
An "invalidSieve" SetError object if the script content | An "invalidSieve" SetError object if the script content | |||
is invalid (see <xref target="set"/>), | is invalid (see <xref target="set"/>), | |||
or <tt>null</tt> if the | or <tt>null</tt> if the | |||
script content is valid. | script content is valid. | |||
</t> | </t> | |||
<t/> | </dd> | |||
</li> | </dl> | |||
</ul> | ||||
<t>This method provides equivalent functionality to the | <t>This method provides functionality equivalent to that of the | |||
CHECKSCRIPT command in <xref target="RFC5804"/>.</t> | CHECKSCRIPT command defined in <xref target="RFC5804"/>.</t> | |||
<t>Script content must first be uploaded as per | <t>Script content must first be uploaded as per | |||
<xref target="content"/> prior to referencing it in a | <xref target="content"/> prior to referencing it in a | |||
SieveScript/validate call.</t> | SieveScript/validate call.</t> | |||
</section> | </section> | |||
<!-- /validate --> | ||||
</section> | </section> | |||
<section anchor="quotas" numbered="true" toc="default"> | <section anchor="quotas" numbered="true" toc="default"> | |||
<name>Quotas</name> | <name>Quotas</name> | |||
<t>Servers SHOULD impose quotas on Sieve scripts to prevent | <t>Servers <bcp14>SHOULD</bcp14> impose quotas on Sieve scripts to prevent | |||
malicious users from exceeding available storage. | malicious users from exceeding available storage. | |||
Administration of such quotas is outside of the scope of this | Administration of such quotas is outside of the scope of this | |||
specification, however <xref target="RFC9425"/> defines a data | specification; however, <xref target="RFC9425"/> defines a data | |||
model for users to obtain quota details over JMAP.</t> | model for users to obtain quota details over JMAP.</t> | |||
<t>The mechanism for handling SieveScript requests that would place | <t>The mechanism for handling SieveScript requests that would place | |||
a user over a quota setting is discussed in <xref target="set"/>. | a user over a quota setting is discussed in <xref target="set"/>. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="vacation" numbered="true" toc="default"> | <section anchor="vacation" numbered="true" toc="default"> | |||
<name>Compatibility with JMAP Vacation Response</name> | <name>Compatibility with JMAP Vacation Response</name> | |||
<t><xref target="RFC8621" section="8"/> defines a | <t><xref target="RFC8621" section="8"/> defines a | |||
VacationResponse object to represent an autoresponder to | VacationResponse object to represent an autoresponder to | |||
incoming email messages. | incoming email messages. | |||
Servers that implement the VacationResponse as a Sieve script | Servers that implement the VacationResponse as a Sieve script | |||
that resides amongst other user scripts are subject to the | that resides among other user scripts are subject to the | |||
following requirements: | following requirements: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>MUST allow the VacationResponse Sieve script to be fetched | <li><bcp14>MUST</bcp14> allow the VacationResponse Sieve script to be fe | |||
by the <xref target="get">SieveScript/get</xref> | tched | |||
method. | by the <xref target="get">SieveScript/get method</xref>. | |||
</li> | </li> | |||
<li>MUST allow the VacationResponse Sieve script to be | <li><bcp14>MUST</bcp14> allow the VacationResponse Sieve script to be | |||
[de]activated via the "onSuccessActivateScript" argument to | activated or deactivated via the "onSuccessActivateScript" argument to | |||
the <xref target="set">SieveScript/set</xref> method. | the <xref target="set">SieveScript/set method</xref>. | |||
</li> | </li> | |||
<li>MUST NOT allow the VacationResponse Sieve script to be | <li><bcp14>MUST NOT</bcp14> allow the VacationResponse Sieve script to b e | |||
destroyed or have its content updated by the | destroyed or have its content updated by the | |||
<xref target="set">SieveScript/set</xref> method. | <xref target="set">SieveScript/set method</xref>. | |||
Any such request MUST be rejected with a "forbidden" SetError. | Any such request <bcp14>MUST</bcp14> be rejected with a "forbidden" SetE | |||
A "description" property MAY be present with an explanation | rror. | |||
A "description" property <bcp14>MAY</bcp14> be present with an explanati | ||||
on | ||||
that the script can only be modified by a VacationResponse/set | that the script can only be modified by a VacationResponse/set | |||
method. | method. | |||
</li> | </li> | |||
</ul> | </ul> | |||
</section> | </section> | |||
<section anchor="security" numbered="true" toc="default"> | <section anchor="security" numbered="true" toc="default"> | |||
<name>Security Considerations</name> | <name>Security Considerations</name> | |||
<t>All security considerations of | <t>All security considerations discussed in | |||
<xref target="RFC8620">JMAP</xref> | <xref target="RFC8620">JMAP</xref> | |||
and <xref target="RFC5228">Sieve</xref> | and <xref target="RFC5228">Sieve</xref> | |||
apply to this specification.</t> | apply to this specification.</t> | |||
<t>Additionally, implementations MUST treat Sieve script content | <t>Additionally, implementations <bcp14>MUST</bcp14> treat Sieve script co | |||
as untrusted data. As such, script parsers MUST fail gracefully | ntent | |||
as untrusted data. As such, script parsers <bcp14>MUST</bcp14> fail grace | ||||
fully | ||||
in the face of syntactically invalid or malicious content and | in the face of syntactically invalid or malicious content and | |||
MUST be prepared to deal with resource exhaustion (E.g., | <bcp14>MUST</bcp14> be prepared to deal with resource exhaustion (e.g., | |||
allocation of enormous strings, lists, or command blocks). | allocation of enormous strings, lists, or command blocks). | |||
</t> | </t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | <section numbered="true" toc="default"> | |||
<name>IANA Considerations</name> | <name>IANA Considerations</name> | |||
<section numbered="true" toc="default"> | <section numbered="true" toc="default"> | |||
<name>JMAP Capability Registration for "sieve"</name> | <name>JMAP Capability Registration for "sieve"</name> | |||
<t>IANA will register the "sieve" JMAP Capability as follows: | <t>IANA has registered the "sieve" in the "JMAP Capabilities" registry a | |||
</t> | s follows: | |||
<t>Capability Name: | ||||
<tt>urn:ietf:params:jmap:sieve</tt> | ||||
</t> | ||||
<t>Specification document: this document | ||||
</t> | ||||
<t>Intended use: common | ||||
</t> | ||||
<t>Change Controller: IETF | ||||
</t> | ||||
<t>Security and privacy considerations: this document, | ||||
<xref target="security"/> | ||||
</t> | </t> | |||
<dl spacing="normal"> | ||||
<dt>Capability Name:</dt><dd><tt>urn:ietf:params:jmap:sieve</tt></dd> | ||||
<dt>Reference:</dt><dd>RFC 9661</dd> | ||||
<dt>Intended Use:</dt><dd>common</dd> | ||||
<dt>Change Controller:</dt><dd>IETF</dd> | ||||
<dt>Security and Privacy Considerations:</dt><dd>RFC 9661, | ||||
<xref target="security"/></dd> | ||||
</dl> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | <section numbered="true" toc="default"> | |||
<name>JMAP Data Type Registration for "SieveScript"</name> | <name>JMAP Data Type Registration for "SieveScript"</name> | |||
<t>IANA will register the "SieveScript" JMAP Data Type as follows: | <t>IANA has registered the "SieveScript" in the "JMAP Data Types" regist | |||
</t> | ry as follows: | |||
<t>Type Name: <tt>SieveScript</tt> | ||||
</t> | ||||
<t>Can Reference Blobs: yes | ||||
</t> | ||||
<t>Can Use for State Change: yes | ||||
</t> | ||||
<t>Capability: | ||||
<tt>urn:ietf:params:jmap:sieve</tt> | ||||
</t> | ||||
<t>Specification document: this document | ||||
</t> | </t> | |||
<dl spacing="normal"> | ||||
<dt>Type Name:</dt><dd><tt>SieveScript</tt></dd> | ||||
<dt>Can Reference Blobs:</dt><dd>Yes</dd> | ||||
<dt>Can Use for State Change:</dt><dd>Yes</dd> | ||||
<dt>Capability:</dt><dd><tt>urn:ietf:params:jmap:sieve</tt></dd> | ||||
<dt>Reference:</dt><dd>RFC 9661</dd> | ||||
</dl> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | <section numbered="true" toc="default"> | |||
<name>JMAP Error Codes Registry</name> | <name>JMAP Error Codes Registry</name> | |||
<t> | <t> | |||
The following sub-sections register two new error codes in the | IANA has registered the following two new error codes in the | |||
JMAP Error Codes registry, as defined in | "JMAP Error Codes" registry, as defined in | |||
<xref target="RFC8620"/>. | <xref target="RFC8620"/>. | |||
</t> | </t> | |||
<section numbered="true" toc="default"> | <section numbered="true" toc="default"> | |||
<name>invalidSieve</name> | <name>invalidSieve</name> | |||
<t>JMAP Error Code: invalidSieve </t> | <dl spacing="normal"> | |||
<t>Intended use: common </t> | <dt>JMAP Error Code:</dt><dd>invalidSieve</dd> | |||
<t>Change controller: IETF </t> | <dt>Intended Use:</dt><dd>common</dd> | |||
<t>Reference: This document, <xref target="set"/> </t> | <dt>Change Controller:</dt><dd>IETF</dd> | |||
<t>Description: The SieveScript violates the | <dt>Reference:</dt><dd>RFC 9661, <xref target="set"/></dd> | |||
<xref target="RFC5228">Sieve grammar</xref> and/or one | <dt>Description:</dt><dd>The SieveScript violates the | |||
<xref target="RFC5228">Sieve grammar</xref>, and/or one | ||||
or more extensions mentioned in the script's "require" | or more extensions mentioned in the script's "require" | |||
statement(s) are not supported by the Sieve interpreter.</t> | statement(s) are not supported by the Sieve interpreter.</dd> | |||
</dl> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | <section numbered="true" toc="default"> | |||
<name>sieveIsActive</name> | <name>sieveIsActive</name> | |||
<t>JMAP Error Code: sieveIsActive </t> | <dl spacing="normal"> | |||
<t>Intended use: common </t> | <dt>JMAP Error Code:</dt><dd>sieveIsActive</dd> | |||
<t>Change controller: IETF </t> | <dt>Intended Use:</dt><dd>common</dd> | |||
<t>Reference: This document, <xref target="set"/> </t> | <dt>Change Controller:</dt><dd>IETF</dd> | |||
<t>Description: The client tried to destroy the active | <dt>Reference:</dt><dd>RFC 9661, <xref target="set"/></dd> | |||
SieveScript.</t> | <dt>Description:</dt><dd>The client tried to destroy the active | |||
SieveScript.</dd> | ||||
</dl> | ||||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<name>Acknowledgments</name> | ||||
<t>The concepts in this document are based largely on those in | ||||
<xref target="RFC5804"/>. | ||||
The author would like to thank the authors of that document for | ||||
providing both inspiration and some borrowed text for this | ||||
document.</t> | ||||
<t>The author would also like to thank the following | ||||
individuals for contributing their ideas and support for | ||||
writing this specification: Joris Baum, Mauro De Gennaro, | ||||
Bron Gondwana, Neil Jenkins, Alexey Melnikov, and Ricardo Signes.</t> | ||||
</section> | ||||
</middle> | </middle> | |||
<back> | <back> | |||
<references> | <references> | |||
<name>References</name> | <name>References</name> | |||
<references> | <references> | |||
<name>Normative References</name> | <name>Normative References</name> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | |||
FC.2119.xml"/> | 119.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
FC.8174.xml"/> | 174.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
FC.8620.xml"/> | 620.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
FC.8621.xml"/> | 621.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5 | |||
FC.5228.xml"/> | 228.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3 | |||
FC.3986.xml"/> | 986.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5 | |||
FC.5435.xml"/> | 435.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | |||
FC.6134.xml"/> | 134.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3 | |||
FC.3629.xml"/> | 629.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5 | |||
FC.5198.xml"/> | 198.xml"/> | |||
</references> | </references> | |||
<references> | <references> | |||
<name>Informative References</name> | <name>Informative References</name> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5 | |||
FC.5232.xml"/> | 232.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5 | |||
FC.5463.xml"/> | 463.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5 | |||
FC.5804.xml"/> | 804.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9 | |||
FC.9112.xml"/> | 112.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9 | |||
FC.9404.xml"/> | 404.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9 | |||
FC.9425.xml"/> | 425.xml"/> | |||
</references> | </references> | |||
</references> | </references> | |||
<section numbered="true" toc="default"> | <section numbered="false" toc="default"> | |||
<name>Change History | <name>Acknowledgments</name> | |||
(To be removed by RFC Editor before publication)</name> | <t>The concepts in this document are based largely on those in | |||
<t>Changes since ietf-21: | <xref target="RFC5804"/>. | |||
</t> | The author would like to thank the authors of that document for | |||
<ul spacing="normal"> | providing both inspiration and some borrowed text for this | |||
<li>Rearranged and tweaked some /validate text.</li> | document.</t> | |||
</ul> | <t>The author would also like to thank the following | |||
<t>Changes since ietf-20: | individuals for contributing their ideas and support for | |||
</t> | writing this specification: <contact fullname="Joris Baum"/>, <contact ful | |||
<ul spacing="normal"> | lname="Mauro De Gennaro"/>, | |||
<li>Listed Unicode characters prohibited in script names.</li> | <contact fullname="Bron Gondwana"/>, <contact fullname="Neil Jenkins"/>, < | |||
<li>Cleaned up the language of the optional /set arguments.</li> | contact fullname="Alexey Melnikov"/>, and <contact fullname="Ricardo Signes"/>.< | |||
<li>Added security considerations about parsing Sieve script | /t> | |||
content.</li> | ||||
<li>Miscellaneous editorial changes.</li> | ||||
</ul> | ||||
<t>Changes since ietf-19: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Tweaked the example captions.</li> | ||||
</ul> | ||||
<t>Changes since ietf-18: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Edited JMAP API examples for brevity to match other JMAP | ||||
specs, and added explanatory text to 1.1.</li> | ||||
<li>Updated <xref> elements to to use "section" and | ||||
"sectionFormat" attributes.</li> | ||||
</ul> | ||||
<t>Changes since ietf-17: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Several editorial changes resulting from IESG review | ||||
comments.</li> | ||||
<li>Added a section discussuing quotas.</li> | ||||
</ul> | ||||
<t>Changes since ietf-16: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Renamed the "invalidScript" and "scriptIsActive" SetErrors | ||||
to "invalidSieve" and "sieveIsActive" respectively.</li> | ||||
</ul> | ||||
<t>Changes since ietf-15: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Added registration for SieveScript JMAP Data Type.</li> | ||||
<li>Miscellaneous editorial changes.</li> | ||||
</ul> | ||||
<t>Changes since ietf-14: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Updated reference for JMAP Blobs.</li> | ||||
</ul> | ||||
<t>Changes since ietf-13: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Added implementation argument to capabilities.</li> | ||||
<li>Miscellaneous editorial changes.</li> | ||||
</ul> | ||||
<t>Changes since ietf-12: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Added onSuccessDeactivateScipt argument to /set | ||||
method.</li> | ||||
<li>Clarified that the "isActive" property must be included in the | ||||
created/uodated/destroyed arguments in a response of the | ||||
active script is changed and/or deactivated.</li> | ||||
<li>Miscellaneous editorial changes.</li> | ||||
</ul> | ||||
<t>Changes since ietf-11: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Fixed examples to be proper JSON and JMAP.</li> | ||||
</ul> | ||||
<t>Changes since ietf-10: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Fixed SieveScript/set response deactivating script example.</li> | ||||
<li>Fixed line line nit in Blob/get request.</li> | ||||
<li>Removed unused references.</li> | ||||
</ul> | ||||
<t>Changes since ietf-09: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Fixed Blob/upload request in example.</li> | ||||
</ul> | ||||
<t>Changes since ietf-08: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Fixed Blob/upload response in example.</li> | ||||
<li>Removed SieveScript/test method (to be written as an | ||||
extension document).</li> | ||||
</ul> | ||||
<t>Changes since ietf-07: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Updated example to use Blob/upload rather than Blob/set.</li> | ||||
</ul> | ||||
<t>Changes since ietf-06: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>None (refreshed to avoid expiration).</li> | ||||
</ul> | ||||
<t>Changes since ietf-05: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Converted source from xml2rfc v2 to v3.</li> | ||||
<li>Added examples for SieveScript/get.</li> | ||||
<li>Miscellaneous editorial changes.</li> | ||||
</ul> | ||||
<t>Changes since ietf-04: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>SieveScript/test: Switched from using a JSON array for each | ||||
completed action and its args to a JSON object.</li> | ||||
<li>Switched to referencing draft-ietf-jmap-blob.</li> | ||||
<li>Miscellaneous editorial changes.</li> | ||||
</ul> | ||||
<t>Changes since ietf-03: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>SieveScript/test: Moved positional arguments into their own | ||||
array (because the specfications don't use a consistent method for | ||||
defining the action syntax or naming of positional arguments).</li> | ||||
</ul> | ||||
<t>Changes since ietf-02: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Removed open issues.</li> | ||||
<li>Reverted back to using only blob ids for script content.</li> | ||||
<li>Added "rateLimit" and "requestTooLarge" to the list of | ||||
possible error codes for /set method.</li> | ||||
<li>Added Compatibility with JMAP Vacation Response | ||||
section.</li> | ||||
<li>Added RFC5228 to Security Considerations.</li> | ||||
<li>Miscellaneous editorial changes.</li> | ||||
</ul> | ||||
<t>Changes since ietf-01: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Removed normative references to ManageSieve (RFC 5804).</li> | ||||
<li>Added the 'maxSizeScriptName' capability.</li> | ||||
<li>Made the 'name' property in the SieveScript object | ||||
optional.</li> | ||||
<li>Added requirements for the 'name' property in the | ||||
SieveScript object.</li> | ||||
<li>Removed the 'blobId' property from the SieveScript | ||||
object.</li> | ||||
<li>Removed the 'replaceOnCreate' argument from the /set | ||||
method.</li> | ||||
<li>Removed the 'blobId' argument from the /validate method.</li> | ||||
<li>Removed the 'scriptBlobId' argument from, and added the | ||||
'scriptContent' argument to, the /test method.</li> | ||||
<li>Editorial fixes from Neil Jenkins and Ricardo Signes.</li> | ||||
<li>Other miscellaneous text reorganization and editorial fixes.</li> | ||||
</ul> | ||||
<t>Changes since ietf-00: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Specified that changes made by onSuccessActivateScript MUST | ||||
be reported in the /set response as created and/or updated as | ||||
appropriate.</li> | ||||
<li>Reworked and specified more of the /test response based on | ||||
implementation experience.</li> | ||||
</ul> | ||||
<t>Changes since murchison-01: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Explicitly stated that Sieve capability strings are | ||||
case-sensitive.</li> | ||||
<li>errorDescription is now String|null.</li> | ||||
<li>Added /query method.</li> | ||||
<li>Added /test method.</li> | ||||
</ul> | ||||
<t>Changes since murchison-00: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Added IANA registration for "scriptIsActive" JMAP error code.</li> | ||||
<li>Added open issue about /set{create} with an existing script name.</l | ||||
i> | ||||
</ul> | ||||
</section> | </section> | |||
</back> | </back> | |||
<!-- [rfced] For consistency of style, please let us know which form | ||||
you prefer for each of the following: | ||||
a) All argument names are double-quoted except 'ids argument' | ||||
(delimited with "<em>" in the XML file), 'onSuccessActivateScript' | ||||
(delimited with "<strong>" in the XML file), and | ||||
'onSuccessDeactivateScript' (delimited with "<strong>" in the XML | ||||
file). | ||||
b) All property names in this document are double-quoted except | ||||
'JMAP Session capabilities property', 'accountCapabilities property', | ||||
and 'description property' (which is delimited with "<em>" in the | ||||
XML file). We also see 'A "description" property' at the end of | ||||
Section 4. | ||||
c) Object names are inconsistently marked - for example, | ||||
'Request object', 'SieveScript object' (delimited with "<strong>" | ||||
in the XML file), and 'FilterCondition object' (delimited with | ||||
"<em>" in the XML file). It appears that most object names are | ||||
currently unmarked. | ||||
d) We also see 'value of "true"' but 'If <tt>true</tt>' in the XML file. | ||||
We also see 'default: false', 'value of "false"', and | ||||
'If <tt>false</tt>' in the XML file. --> | ||||
<!-- [rfced] Please review the "Inclusive Language" portion of the | ||||
online Style Guide at | ||||
<https://www.rfc-editor.org/styleguide/part2/#inclusive_language>, | ||||
and let us know if any changes are needed. | ||||
Note that our script did not flag any words in particular, but this | ||||
should still be reviewed as a best practice. --> | ||||
</rfc> | </rfc> | |||
End of changes. 122 change blocks. | ||||
557 lines changed or deleted | 421 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |