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> | |||
<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="September" 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 <xref target="object"/> | |||
instances of those data types. | and instances of this data type used throughout this document. | |||
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> | |||
<t>For brevity, JMAP API | <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> c ontain | |||
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 scheme 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. | |||
</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 scheme 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> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode name="" type="json"><![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": { | |||
"implementation": "ACME Email Filtering" | "implementation": "ACME Email Filtering" | |||
skipping to change at line 320 ¶ | skipping to change at line 287 ¶ | |||
"urn:ietf:params:jmap:vacationresponse": "ken", | "urn:ietf:params:jmap:vacationresponse": "ken", | |||
... | ... | |||
}, | }, | |||
"username": "ken@example.com", | "username": "ken@example.com", | |||
"apiUrl": "/jmap/", | "apiUrl": "/jmap/", | |||
"downloadUrl": | "downloadUrl": | |||
"/jmap/download/{accountId}/{blobId}/{name}?accept={type}", | "/jmap/download/{accountId}/{blobId}/{name}?accept={type}", | |||
"uploadUrl": "/jmap/upload/{accountId}/", | "uploadUrl": "/jmap/upload/{accountId}/", | |||
... | ... | |||
} | } | |||
]]></artwork> | ]]></sourcecode> | |||
</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 "SieveScript" 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 "SieveScript" 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 "ids" 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[ | <sourcecode name="" type="json"><![CDATA[ | |||
[ | [ | |||
["SieveScript/get", { | ["SieveScript/get", { | |||
"accountId": "ken" | "accountId": "ken" | |||
}, "0"] | }, "0"] | |||
] | ] | |||
[ | [ | |||
[ | [ | |||
"SieveScript/get", | "SieveScript/get", | |||
{ | { | |||
skipping to change at line 481 ¶ | skipping to change at line 438 ¶ | |||
"isActive": true, | "isActive": true, | |||
"blobId": "S7" | "blobId": "S7" | |||
} | } | |||
], | ], | |||
"notFound": [], | "notFound": [], | |||
"accountId": "ken" | "accountId": "ken" | |||
}, | }, | |||
"0" | "0" | |||
] | ] | |||
] | ] | |||
]]></artwork> | ]]></sourcecode> | |||
<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[ | <sourcecode name="" type="http-message"><![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" | |||
Content-Length: 49 | Content-Length: 49 | |||
require ["fileinto"]; | require ["fileinto"]; | |||
fileinto "INBOX.target"; | fileinto "INBOX.target"; | |||
]]></artwork> | ]]></sourcecode> | |||
<t keepWithNext="true"> | <t keepWithNext="true"> | |||
Fetch script properties | Fetch script properties | |||
and content in a single JMAP API request using the | and content in a single JMAP API request using the | |||
<xref target="RFC9404"> JMAP Blob management extension</xref>: | <xref target="RFC9404"> JMAP Blob management extension</xref>: | |||
</t> | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
<sourcecode name="" type="json"><![CDATA[ | ||||
[ | [ | |||
["SieveScript/get", { | ["SieveScript/get", { | |||
"accountId": "ken", | "accountId": "ken", | |||
"ids": [ "2d647053-dded-418d-917a-63eda3ac8f7b" ] | "ids": [ "2d647053-dded-418d-917a-63eda3ac8f7b" ] | |||
}, "0"], | }, "0"], | |||
["Blob/get", { | ["Blob/get", { | |||
"accountId": "ken", | "accountId": "ken", | |||
"#ids": { | "#ids": { | |||
"resultOf": "0", | "resultOf": "0", | |||
"name": "SieveScript/get", | "name": "SieveScript/get", | |||
skipping to change at line 558 ¶ | skipping to change at line 516 ¶ | |||
"require [\"fileinto\"];\\r\\nfileinto \"INBOX.target\";\\r\\n", | "require [\"fileinto\"];\\r\\nfileinto \"INBOX.target\";\\r\\n", | |||
"size": 49 | "size": 49 | |||
} | } | |||
], | ], | |||
"notFound": [], | "notFound": [], | |||
"accountId": "ken" | "accountId": "ken" | |||
}, | }, | |||
"1" | "1" | |||
] | ] | |||
] | ] | |||
]]></artwork> | ]]></sourcecode> | |||
</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 "true", 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 "false" 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 "onSuccessActivateScript" and | |||
<strong>onSuccessDeactivateScript</strong> arguments are | "onSuccessDeactivateScript" arguments are | |||
present in the request, then | present in the request, then | |||
<strong>onSuccessDeactivateScript</strong> MUST be processed first. | "onSuccessDeactivateScript" <bcp14>MUST</bcp14> be processed 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 "description" 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[ | <sourcecode name="" type="http-message"><![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"; | |||
if address :is ["To", "Cc"] "jmap@ietf.org" { | if address :is ["To", "Cc"] "jmap@ietf.org" { | |||
setflag "\\Flagged"; | setflag "\\Flagged"; | |||
skipping to change at line 729 ¶ | skipping to change at line 676 ¶ | |||
Date: Thu, 10 Dec 2020 17:14:31 GMT | Date: Thu, 10 Dec 2020 17:14:31 GMT | |||
Content-Type: application/json; charset=utf-8 | Content-Type: application/json; charset=utf-8 | |||
Content-Length: 171 | Content-Length: 171 | |||
{ | { | |||
"accountId": "ken", | "accountId": "ken", | |||
"blobId": "Gabcc83e44a6e19991c4568d0b94e1767c83dd123", | "blobId": "Gabcc83e44a6e19991c4568d0b94e1767c83dd123", | |||
"type": "application/sieve" | "type": "application/sieve" | |||
"size": 98 | "size": 98 | |||
} | } | |||
]]></artwork> | ]]></sourcecode> | |||
<t keepWithNext="true"> | <t keepWithNext="true"> | |||
Create and activate | Create and activate | |||
a script using the uploaded blob. | a script using the uploaded blob. | |||
Note that the response shows that an existing active | Note that the response shows that an existing active | |||
script has been deactivated in lieu of the newly | script has been deactivated in lieu of the newly | |||
created script being activated. | created script being activated. | |||
</t> | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode name="" type="json"><![CDATA[ | |||
[ | [ | |||
["SieveScript/set", { | ["SieveScript/set", { | |||
"accountId": "ken", | "accountId": "ken", | |||
"create": { | "create": { | |||
"A": { | "A": { | |||
"name": null, | "name": null, | |||
"blobId": "Gabcc83e44a6e19991c4568d0b94e1767c83dd123" | "blobId": "Gabcc83e44a6e19991c4568d0b94e1767c83dd123" | |||
} | } | |||
}, | }, | |||
"onSuccessActivateScript": "#A" | "onSuccessActivateScript": "#A" | |||
skipping to change at line 779 ¶ | skipping to change at line 726 ¶ | |||
}, | }, | |||
"destroyed": null, | "destroyed": null, | |||
"notCreated": null, | "notCreated": null, | |||
"notUpdated": null, | "notUpdated": null, | |||
"notDestroyed": null, | "notDestroyed": null, | |||
"accountId": "ken" | "accountId": "ken" | |||
}, | }, | |||
"0" | "0" | |||
] | ] | |||
] | ] | |||
]]></artwork> | ]]></sourcecode> | |||
<t keepWithNext="true"> | <t keepWithNext="true"> | |||
Update the script content using | Update the script content using | |||
the <xref target="RFC9404"> JMAP Blob management extension</xref>: | the <xref target="RFC9404"> JMAP Blob management extension</xref>: | |||
</t> | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode name="" type="json"><![CDATA[ | |||
{ | { | |||
[ | [ | |||
["Blob/upload", { | ["Blob/upload", { | |||
"accountId": "ken", | "accountId": "ken", | |||
"create": { | "create": { | |||
"B": { | "B": { | |||
"data": [ { | "data": [ { | |||
"data:asText": | "data:asText": | |||
"redirect \"ken@example.com\"\r\n;" | "redirect \"ken@example.com\"\r\n;" | |||
} ], | } ], | |||
skipping to change at line 845 ¶ | skipping to change at line 792 ¶ | |||
}, | }, | |||
"destroyed": null, | "destroyed": null, | |||
"notCreated": null, | "notCreated": null, | |||
"notUpdated": null, | "notUpdated": null, | |||
"notDestroyed": null, | "notDestroyed": null, | |||
"accountId": "ken" | "accountId": "ken" | |||
}, | }, | |||
"2" | "2" | |||
] | ] | |||
] | ] | |||
]]></artwork> | ]]></sourcecode> | |||
<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[ | <sourcecode name="" type="json"><![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 | |||
}, "3"] | }, "3"] | |||
] | ] | |||
skipping to change at line 882 ¶ | skipping to change at line 829 ¶ | |||
}, | }, | |||
"destroyed": null, | "destroyed": null, | |||
"notCreated": null, | "notCreated": null, | |||
"notUpdated": null, | "notUpdated": null, | |||
"notDestroyed": null, | "notDestroyed": null, | |||
"accountId": "ken" | "accountId": "ken" | |||
}, | }, | |||
"3" | "3" | |||
] | ] | |||
] | ] | |||
]]></artwork> | ]]></sourcecode> | |||
<t keepWithNext="true"> | <t keepWithNext="true"> | |||
Reactivate the script: | Reactivate the script: | |||
</t> | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode name="" type="json"><![CDATA[ | |||
[ | [ | |||
["SieveScript/set", { | ["SieveScript/set", { | |||
"accountId": "ken", | "accountId": "ken", | |||
"onSuccessActivateScript": "dd1b164f-8cdc-448c-9f54" | "onSuccessActivateScript": "dd1b164f-8cdc-448c-9f54" | |||
}, "4"] | }, "4"] | |||
] | ] | |||
[ | [ | |||
[ | [ | |||
"SieveScript/set", | "SieveScript/set", | |||
skipping to change at line 915 ¶ | skipping to change at line 862 ¶ | |||
}, | }, | |||
"destroyed": null, | "destroyed": null, | |||
"notCreated": null, | "notCreated": null, | |||
"notUpdated": null, | "notUpdated": null, | |||
"notDestroyed": null, | "notDestroyed": null, | |||
"accountId": "ken" | "accountId": "ken" | |||
}, | }, | |||
"4" | "4" | |||
] | ] | |||
] | ] | |||
]]></artwork> | ]]></sourcecode> | |||
<t keepWithNext="true"> | <t keepWithNext="true"> | |||
Deactivate and destroy the active script: | Deactivate and destroy the active script: | |||
</t> | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode name="" type="json"><![CDATA[ | |||
[ | [ | |||
["SieveScript/set", { | ["SieveScript/set", { | |||
"accountId": "ken", | "accountId": "ken", | |||
"onSuccessDeactivateScript": true | "onSuccessDeactivateScript": true | |||
}, "5"], | }, "5"], | |||
["SieveScript/set", { | ["SieveScript/set", { | |||
"accountId": "ken", | "accountId": "ken", | |||
"destroy": [ "dd1b164f-8cdc-448c-9f54" ] | "destroy": [ "dd1b164f-8cdc-448c-9f54" ] | |||
}, "6"] | }, "6"] | |||
] | ] | |||
skipping to change at line 969 ¶ | skipping to change at line 916 ¶ | |||
"dd1b164f-8cdc-448c-9f54" | "dd1b164f-8cdc-448c-9f54" | |||
], | ], | |||
"notCreated": null, | "notCreated": null, | |||
"notUpdated": null, | "notUpdated": null, | |||
"notDestroyed": null, | "notDestroyed": null, | |||
"accountId": "ken" | "accountId": "ken" | |||
}, | }, | |||
"6" | "6" | |||
] | ] | |||
] | ] | |||
]]></artwork> | ]]></sourcecode> | |||
</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 "FilterCondition" 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="content"/>. | |||
</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 "sieve" in the "JMAP Capabilities" registry as fo | |||
</t> | llows: | |||
<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 "SieveScript" in the "JMAP Data Types" registry a | |||
</t> | s 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> | |||
</rfc> | </rfc> | |||
End of changes. 148 change blocks. | ||||
592 lines changed or deleted | 348 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |