idnits 2.17.1 draft-ietf-jmap-sieve-01.txt: Checking boilerplate required by RFC 5378 and the IETF Trust (see https://trustee.ietf.org/license-info): ---------------------------------------------------------------------------- No issues found here. Checking nits according to https://www.ietf.org/id-info/1id-guidelines.txt: ---------------------------------------------------------------------------- No issues found here. Checking nits according to https://www.ietf.org/id-info/checklist : ---------------------------------------------------------------------------- No issues found here. Miscellaneous warnings: ---------------------------------------------------------------------------- == The copyright year in the IETF Trust and authors Copyright Line does not match the current year -- The document date (September 22, 2020) is 1284 days in the past. Is this intentional? Checking references for intended status: Proposed Standard ---------------------------------------------------------------------------- (See RFCs 3967 and 4897 for information about using normative references to lower-maturity documents in RFCs) No issues found here. Summary: 0 errors (**), 0 flaws (~~), 1 warning (==), 1 comment (--). Run idnits with the --verbose option for more detailed information about the items above. -------------------------------------------------------------------------------- 2 JMAP K. Murchison 3 Internet-Draft Fastmail 4 Intended status: Standards Track September 22, 2020 5 Expires: March 26, 2021 7 JMAP for Sieve Scripts 8 draft-ietf-jmap-sieve-01 10 Abstract 12 This document specifies a data model for managing Sieve scripts on a 13 server using JMAP. 15 Open Issues 17 o Do we need/want both "content" and "blobId" in the SieveScript 18 object? It may be simpler to have just one way of specifying 19 content and "blobId" is more versatile and doesn't require JSON- 20 encoding of the content. Furthermore, use of the forthcoming(?) 21 Blob/set method would avoid the extra roundtrip of having to 22 upload the blob first. 24 o The strawman for SieveScript/test only uses blobIds. Will this 25 have to change once the issue regarding content/blobId in 26 SieveScript is resolved? 28 o Should ":fcc" and associated arguments (e.g., ":flags", 29 ":create":, etc) reported in the /test response be in their own 30 "fcc" sub-object rather than listed inline with the rest of the 31 arguments for the action? 33 Status of This Memo 35 This Internet-Draft is submitted in full conformance with the 36 provisions of BCP 78 and BCP 79. 38 Internet-Drafts are working documents of the Internet Engineering 39 Task Force (IETF). Note that other groups may also distribute 40 working documents as Internet-Drafts. The list of current Internet- 41 Drafts is at https://datatracker.ietf.org/drafts/current/. 43 Internet-Drafts are draft documents valid for a maximum of six months 44 and may be updated, replaced, or obsoleted by other documents at any 45 time. It is inappropriate to use Internet-Drafts as reference 46 material or to cite them other than as "work in progress." 48 This Internet-Draft will expire on March 26, 2021. 50 Copyright Notice 52 Copyright (c) 2020 IETF Trust and the persons identified as the 53 document authors. All rights reserved. 55 This document is subject to BCP 78 and the IETF Trust's Legal 56 Provisions Relating to IETF Documents 57 (https://trustee.ietf.org/license-info) in effect on the date of 58 publication of this document. Please review these documents 59 carefully, as they describe your rights and restrictions with respect 60 to this document. Code Components extracted from this document must 61 include Simplified BSD License text as described in Section 4.e of 62 the Trust Legal Provisions and are provided without warranty as 63 described in the Simplified BSD License. 65 Table of Contents 67 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 68 1.1. Notational Conventions . . . . . . . . . . . . . . . . . 3 69 1.2. Terminology . . . . . . . . . . . . . . . . . . . . . . . 3 70 1.3. Addition to the Capabilities Object . . . . . . . . . . . 3 71 1.3.1. urn:ietf:params:jmap:sieve . . . . . . . . . . . . . 3 72 2. Sieve Scripts . . . . . . . . . . . . . . . . . . . . . . . . 5 73 2.1. SieveScript/get . . . . . . . . . . . . . . . . . . . . . 6 74 2.2. SieveScript/set . . . . . . . . . . . . . . . . . . . . . 6 75 2.3. SieveScript/query . . . . . . . . . . . . . . . . . . . . 8 76 2.4. SieveScript/validate . . . . . . . . . . . . . . . . . . 9 77 2.5. SieveScript/test . . . . . . . . . . . . . . . . . . . . 10 78 2.5.1. Example . . . . . . . . . . . . . . . . . . . . . . . 13 79 3. Security Considerations . . . . . . . . . . . . . . . . . . . 16 80 4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 16 81 4.1. JMAP Capability Registration for "sieve" . . . . . . . . 16 82 4.2. JMAP Error Codes Registry . . . . . . . . . . . . . . . . 16 83 4.2.1. scriptNameExists . . . . . . . . . . . . . . . . . . 16 84 4.2.2. tooManyScripts . . . . . . . . . . . . . . . . . . . 16 85 4.2.3. invalidScript . . . . . . . . . . . . . . . . . . . . 17 86 4.2.4. scriptIsActive . . . . . . . . . . . . . . . . . . . 17 87 5. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 17 88 6. References . . . . . . . . . . . . . . . . . . . . . . . . . 17 89 6.1. Normative References . . . . . . . . . . . . . . . . . . 18 90 6.2. Informative References . . . . . . . . . . . . . . . . . 19 91 Appendix A. Change History (To be removed by RFC Editor before 92 publication) . . . . . . . . . . . . . . . . . . . . 19 93 Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 19 95 1. Introduction 97 JMAP ([RFC8620] - JSON Meta Application Protocol) is a generic 98 protocol for synchronizing data, such as mail, calendars or contacts, 99 between a client and a server. It is optimized for mobile and web 100 environments, and aims to provide a consistent interface to different 101 data types. 103 This specification defines a data model for managing Sieve [RFC5228] 104 scripts on a server using JMAP. The data model is designed to allow 105 a server to provide consistent access to the same scripts via 106 ManageSieve [RFC5804] as well as JMAP, however the functionality 107 offered over the two protocols may differ. 109 1.1. Notational Conventions 111 The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", 112 "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and 113 "OPTIONAL" in this document are to be interpreted as described in BCP 114 14 [RFC2119] [RFC8174] when, and only when, they appear in all 115 capitals, as shown here. 117 Type signatures, examples, and property descriptions in this document 118 follow the conventions established in Section 1.1 of [RFC8620]. Data 119 types defined in the core specification are also used in this 120 document. 122 1.2. Terminology 124 The same terminology is used in this document as in the core JMAP 125 specification, see [RFC8620], Section 1.6. 127 The term SieveScript (with this specific capitalization) is used to 128 refer to the data type defined in this document and instances of 129 those data types. 131 1.3. Addition to the Capabilities Object 133 The capabilities object is returned as part of the JMAP Session 134 object; see [RFC8620], Section 2. This document defines one 135 additional capability URI. 137 1.3.1. urn:ietf:params:jmap:sieve 139 This represents support for the SieveScript data type and associated 140 API methods. The value of this property in the JMAP Session 141 capabilities property is an empty object. 143 The value of this property in an account's accountCapabilities 144 property is an object that MUST contain the following information on 145 server capabilities: 147 o *supportsTest*: "Boolean" 149 If true, the server supports the SieveScript/test (Section 2.5) 150 method. 152 o *maxNumberRedirects*: "UnsignedInt|null" 154 The maximum number of Sieve "redirect" actions a script can 155 perform during a single evaluation (see [RFC5804], Section 1.7), 156 or "null" for no limit. 158 o *maxNumberScripts*: "UnsignedInt|null" 160 The maximum number of Sieve scripts the server is willing to store 161 for the user, or "null" for no limit. 163 o *maxSizeScript*: "UnsignedInt|null" 165 The maximum size (in octets) of a Sieve script the server is 166 willing to store for the user, or "null" for no limit. 168 o *sieveExtensions*: "String[]" 170 A list of case-sensitive Sieve capability strings (as listed in 171 Sieve "require" action [RFC5228], Section 3.2) indicating the 172 extensions supported by the Sieve engine. 174 o *notificationMethods*: "String[]|null" 176 A list of URI schema parts [RFC3986] for notification methods 177 supported by the Sieve "enotify" extension [RFC5435], or "null" if 178 the extension is not supported by the Sieve engine. 180 o *externalLists*: "String[]|null" 182 A list of URI schema parts [RFC3986] for externally stored list 183 types supported by the Sieve "extlists" extension [RFC6134], or 184 "null" if the extension is not supported by the Sieve engine. 186 2. Sieve Scripts 188 A *SieveScript* object represents a single Sieve [RFC5228] script. A 189 user may have multiple SieveScripts on the server, yet only one 190 script may be used for filtering of incoming messages. This is the 191 active script. Users may have zero or one active script. The 192 SieveScript/set (Section 2.2) method described below is used for 193 changing the active script or disabling Sieve processing. 195 A *SieveScript* object has the following properties: 197 o *id*: "Id" (immutable; server-set) 199 The id of the script. 201 o *name*: "String" 203 The unique user-visible name for the script, subject to the 204 requirements in [RFC5804], Section 1.6. 206 o *content*: "String" 208 The raw octets of the script [RFC5228]. 210 Note that both Sieve and JSON require encoding of special 211 characters which MUST be done in the following order: 213 1. Escape any double quote (") or backslash (\) characters 214 appearing inside of quoted strings in the Sieve code per 215 Section 2.4.2 of [RFC5228]. E.g., A string containing the 216 value \foo becomes "\\foo". 218 2. Escape any double quote ("), backslash (\), tab, carriage 219 return, or line feed characters appearing in the resultant 220 Sieve code per Section 7 of [RFC8259]. E.g., The example 221 string in step 1 becomes \"\\\\foo\". 223 o *blobId*: "Id" (immutable) 224 The id of the blob containing the raw octets of the script 225 [RFC5228]. 227 o *isActive*: "Boolean" (server-set; default: false) 229 Is this the user's active script? 231 Example (using the Imap4Flags [RFC5232] Extension): 233 { 234 "id": "Sabc", 235 "blobId": "Bxyz", 236 "name": "example.siv", 237 "content": 238 "require [ \"imap4flags\" ];\r\nkeep :flags \"\\\\flagged\";", 239 "isActive": false 240 } 242 2.1. SieveScript/get 244 This is a standard "/get" method as described in [RFC8620], 245 Section 5.1. The _ids_ argument may be "null" to fetch all at once. 247 This method provides similar functionality to the GETSCRIPT and 248 LISTSCRIPTS commands in [RFC5804]. 250 2.2. SieveScript/set 252 This is a standard "/set" method as described in [RFC8620], 253 Section 5.3 but with the following additional request arguments, 254 either of which may be omitted: 256 o *replaceOnCreate*: "Boolean" (default: false) 258 If false, any attempt to create a SieveScript having the same 259 "name" property as an existing SieveScript MUST be rejected with a 260 "scriptNameExists" SetError. If true, the existing SieveScript 261 will be destroyed and the new SieveScript created as a single 262 atomic action. The id of the replaced SieveScript MUST be 263 reported in the "destroyed" argument in the response. 265 o *onSuccessActivateScript*: "Id|null" 266 The id of the SieveScript to activate if the create/update/destroy 267 succeeds. (For references to SieveScript creations, this is 268 equivalent to a creation-reference, so the id will be the creation 269 id prefixed with a "#".) If "null", the currently active script 270 (if any) will be deactivated. If this argument is not present in 271 the request, the currently active script (if any) will remain as 272 such. The id of the activated acript MUST be reported in the 273 "created" or "updated" argument in the response as appropriate. 274 The id of the deactivated script, if any, MUST be reported in the 275 "updated" argument in the response unless the script was also 276 destroyed. 278 This method provides similar functionality to the PUTSCRIPT, 279 DELETESCRIPT, RENAMESCRIPT, and SETACTIVE commands in [RFC5804]. 281 When creating or updating a script, a client MUST include either a 282 _content_ or a _blobId_ property. A request that includes neither or 283 both properties MUST be rejected with an "invalidProperties" 284 SetError. The server MUST check the script content for syntactic 285 validity, which includes checking that all Sieve extensions mentioned 286 in Sieve script "require" statement(s) are supported by the Sieve 287 interpreter. (Note that if the Sieve interpreter supports the Sieve 288 "ihave" extension [RFC5463], any unrecognized/unsupported extension 289 mentioned in the "ihave" test MUST NOT cause the syntactic validation 290 failure.) A script of zero length SHOULD be considered invalid. If 291 the script content is invalid the request MUST be rejected with a 292 "invalidScript" SetError. 294 Note that simply activating or deactivating a script without changing 295 any script content is accomplished via a request containing an 296 "onSuccessActivateScript" argument and "null" "create", "update", and 297 "delete" arguments. 299 The following extra SetError types are defined: 301 For "create": 303 o *scriptNameExists*: 305 A SieveScript already exists with the given *name* property, and 306 the "replaceOnCreate" argument was false. An _existingId_ 307 property of type _Id_ MUST be included on the SetError object with 308 the id of the existing SieveScript. 310 o *tooManyScripts*: 312 Creating the SieveScript would exceed the *maxNumberScripts* limit 313 (see Section 1.3.1). 315 For "create" and "update": 317 o *invalidScript*: 319 The SieveScript violates the Sieve grammar [RFC5228] and/or one or 320 more extensions mentioned in the script's "require" statement(s) 321 are not supported by the Sieve interpreter. The _description_ 322 property on the SetError object SHOULD contain a specific error 323 message giving the line number of the first error. 325 For "destroy": 327 o *scriptIsActive*: 329 The SieveScript is active and the "onSuccessActivateScript" 330 argument was not present. 332 2.3. SieveScript/query 334 This is a standard "/query" method as described in [RFC8620], 335 Section 5.5. A _FilterCondition_ object has the following 336 properties, any of which may be omitted: 338 o *name*: "String" 340 The SieveScript "name" property contains the given string. 342 o *isActive*: "Boolean" 344 The "isActive" property of the SieveScript must be identical to 345 the value given to match the condition. 347 The following SieveScript properties MUST be supported for sorting: 349 o "name" 351 o "isActive" 353 2.4. SieveScript/validate 355 This method is used by the client to verify Sieve script validity 356 without storing the script on the server. 358 The method provides similar functionality to the CHECKSCRIPT command 359 in [RFC5804]. 361 The *SieveScript/validate* method takes the following arguments: 363 o *accountId*: "Id" 365 The id of the account to use. 367 o *content*: "String" 369 The raw octets of the script [RFC5228]. 371 o *blobId*: "Id" (immutable) 373 The id of the blob containing the raw octets of the script 374 [RFC5228]. 376 A client MUST include either a _content_ or a _blobId_ property. A 377 request that includes neither or both properties MUST be rejected 378 with an "invalidProperties" SetError. The _content_ property, if 379 used, MUST be encoded following the same procedure as for the 380 _content_ property in the SieveScript (Section 2) object. The server 381 MUST check the script content for syntactic validity, which includes 382 checking that all Sieve extensions mentioned in Sieve script 383 "require" statement(s) are supported by the Sieve interpreter. (Note 384 that if the Sieve interpreter supports the Sieve "ihave" extension 385 [RFC5463], any unrecognized/unsupported extension mentioned in the 386 "ihave" test MUST NOT cause the syntactic validation failure.) 388 The response has the following arguments: 390 o *accountId*: "Id" 391 The id of the account used for this call. 393 o *error*: "SetError|null" 395 A SetError object if the request or the script content invalid, or 396 "null" if the script content is valid. 398 2.5. SieveScript/test 400 This method is used by the client to ask the Sieve interpreter to 401 evaluate a Sieve script against a set of emails and report what 402 actions would be performed for each. 404 The *SieveScript/test* method takes the following arguments: 406 o *accountId*: "Id" 408 The id of the account to use. 410 o *scriptBlobId*: "Id" 412 The id of the blob containing the SieveScript to test against. 414 o *emailBlobIds*: "Id[]" 416 The ids of the blobs containing the Emails [RFC8621] to test 417 against. 419 o *envelope*: "Envelope|null" 421 Information that the Sieve interpreter should assume was present 422 in the SMTP transaction that delivered the email when evaluating 423 "envelope" tests. If "null", all "envelope" tests MUST eveluate 424 to false. See Section 7 of Email [RFC8621] for the contents of 425 the Envelope object. 427 o *lastVacationResponse*: "Date|null" 429 The date-time at which the Sieve interpreter should assume that it 430 last auto-replied to the sender of the email, or "null" if the 431 Sieve interpreter should assume that it has not auto-replied to 432 the sender. 434 The response has the following arguments: 436 o *accountId*: "Id" 438 The id of the account used for this call. 440 o *completed*: "Id[Action[]]|null" 442 A map of the blob id to a set of _Action_ types for each Email 443 successfully processed by the script, or "null" if none. The 444 _Action_ data type is a tuple, represented as a JSON array 445 containing two elements: 447 1. A "String" *name* of the Sieve action (e.g., "keep"). 449 2. A "String[*]" object containing named *arguments* for that 450 action (e.g., ":flags" or "mailbox"). 452 o *notCompleted*: "Id[SetError]|null" 454 A map of the blob id to a SetError object for each Email that was 455 not successfully processed by the script, or "null" if none. A 456 "serverFail" SetError (see Section 3.6.2 of [RFC8620]) MUST be 457 used to indicate a Sieve interpreter run-time error. 459 The following additional errors may be returned instead of the 460 "SieveScript/test" response: 462 o "blobNotFound": The script referenced by the blob id could not be 463 found. 465 o "invalidScript": The referenced script is invalid (see 466 Section 2.2). 468 o "serverFail": The referenced script failed preparation to be 469 executed for some other reason. 471 The name to use for each argument is a direct mapping of the argument 472 names as given in the specification of each action. Tagged and 473 optional arguments MUST use the name of the tag, minus the leading 474 ":". Positional arguments MUST use the name of the argument inside 475 of the angle brackets ("<" and ">") in the "Usage" line in the 476 specification for the action. 478 The JSON data type to use for each argument value is a direct mapping 479 from its Sieve data type, per the following table: 481 +-------------+----------------+ 482 | Sieve Type | JSON Type | 483 +-------------+----------------+ 484 | Number | Number | 485 | String | String | 486 | String List | String[] | 487 | no value | Boolean (true) | 488 +-------------+----------------+ 490 Recommendations for constructing the list of arguments are as 491 follows: 493 o Tagged arguments SHOULD procede positional arguments. 495 o Optional arguments in which the value is supplied by the Sieve 496 interpreter SHOULD be included (e.g., ":from" and ":subject" 497 arguments to the "vacation" [RFC5230] action). 499 o Optional arguments in which the value is supplied by a Sieve 500 variable SHOULD be included (e.g., "keep" or "fileinto" actions 501 without an explicit ":flags" argument, but "imap4flags" [RFC5232] 502 have been set on the internal variable). 504 o Optional arguments in which the value is the specfied default MAY 505 be omitted. 507 o Tagged arguments that are only used to determine whether the 508 action will be executed and have no impact on the result of the 509 action MAY be omitted (e.g., ":days" and ":addresses" arguments to 510 the vacation action). 512 2.5.1. Example 514 Assume that the following script has been uploaded and assigned blob 515 id "B123". 517 require [ "imapflags", "editheader", "vacation", "fcc" ]; 518 setflag "$SieveFiltered"; 519 addheader :last "X-Sieve-Filtered" "yes"; 520 vacation :days 3 :fcc "INBOX.Sent" :flags "\\Answered" text: 521 Gone fishing. 522 . 523 ; 525 Assume that the following email has been uploaded and assigned blob 526 id "B456". 528 From: "Some Example Sender" 529 To: test@example.com 530 Subject: test email 531 Date: Wed, 23 Sep 2020 12:11:11 -0500 532 MIME-Version: 1.0 533 Content-Type: text/plain; charset="UTF-8" 535 This is a test email. 537 The following request executes the script against the email and 538 provides envelope information for use by the "vacation" action. 540 { 541 "using": [ 542 "urn:ietf:params:jmap:core", 543 "urn:ietf:params:jmap:sieve", 544 "urn:ietf:params:jmap:mail" 545 ], 546 "methodCalls": [ 547 [ 548 "SieveScript/test", 549 { 550 "scriptBlobId": "B123", 551 "emailBlobIds": [ 552 "B456" 553 ], 554 "envelope": { 555 "mailFrom": { 556 "email": "example@example.net", 557 "parameters": null 558 }, 559 "rcptTo": [ 560 { 561 "email": "test@example.com", 562 "parameters": null 563 } 564 ] 565 }, 566 "lastVacationResponse": null 567 }, 568 "R1" 569 ] 570 ] 571 } 572 The following response lists the actions that would be performed by 573 the script. 575 { 576 "methodResponses": [ 577 [ 578 "SieveScript/test", 579 { 580 "accountId": "test", 581 "completed": { 582 "B456": [ 583 [ 584 "addheader", 585 { 586 "last": true, 587 "field-name": "X-Sieve-Filtered", 588 "value": "yes" 589 } 590 ], 591 [ 592 "vacation", 593 { 594 "fcc": "INBOX.Sent", 595 "flags": [ 596 "\\answered" 597 ], 598 "subject": "Auto: test email", 599 "from": "test@example.com", 600 "reason": "Gone fishing." 601 } 602 ], 603 [ 604 "keep", 605 { 606 "flags": [ 607 "$SieveFiltered" 608 ] 609 } 610 ] 611 ] 612 }, 613 "notCompleted": null 614 }, 615 "R1" 616 ] 617 ], 618 "sessionState": "0" 619 } 621 3. Security Considerations 623 All security considerations of JMAP [RFC8620] apply to this 624 specification. 626 4. IANA Considerations 628 4.1. JMAP Capability Registration for "sieve" 630 IANA will register the "sieve" JMAP Capability as follows: 632 Capability Name: "urn:ietf:params:jmap:sieve" 634 Specification document: this document 636 Intended use: common 638 Change Controller: IETF 640 Security and privacy considerations: this document, Section 3 642 4.2. JMAP Error Codes Registry 644 The following sub-section register several new error codes in the 645 JMAP Error Codes registry, as defined in [RFC8620]. 647 4.2.1. scriptNameExists 649 JMAP Error Code: scriptNameExists 651 Intended use: common 653 Change controller: IETF 655 Reference: This document, Section 2.2 657 Description: The client tried to create a SieveScript with the same 658 "name" property as an existing SieveScript and the "replaceOnCreate" 659 argument was false. present. 661 4.2.2. tooManyScripts 663 JMAP Error Code: tooManyScripts 665 Intended use: common 667 Change controller: IETF 668 Reference: This document, Section 2.2 670 Description: Creating the SieveScript would exceed the 671 "maxNumberScripts" limit. 673 4.2.3. invalidScript 675 JMAP Error Code: invalidScript 677 Intended use: common 679 Change controller: IETF 681 Reference: This document, Section 2.2 683 Description: The SieveScript violates the Sieve grammar [RFC5228] 684 and/or one or more extensions mentioned in the script's "require" 685 statement(s) are not supported by the Sieve interpreter. 687 4.2.4. scriptIsActive 689 JMAP Error Code: scriptIsActive 691 Intended use: common 693 Change controller: IETF 695 Reference: This document, Section 2.2 697 Description: The client tried to destroy the active SieveScript, but 698 the "OnSuccessActivateScript" argument was not present. 700 5. Acknowledgments 702 The concepts in this document are based largely on those in 703 [RFC5804]. The author would like to thank the authors of that 704 document for providing both inspiration and some borrowed text for 705 this document. 707 The author would also like to thank the following individuals for 708 contributing their ideas and support for writing this specification: 709 Bron Gondwana, Alexey Melnikov, and Ricardo Signes. 711 6. References 712 6.1. Normative References 714 [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate 715 Requirement Levels", BCP 14, RFC 2119, 716 DOI 10.17487/RFC2119, March 1997, 717 . 719 [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform 720 Resource Identifier (URI): Generic Syntax", STD 66, 721 RFC 3986, DOI 10.17487/RFC3986, January 2005, 722 . 724 [RFC5228] Guenther, P., Ed. and T. Showalter, Ed., "Sieve: An Email 725 Filtering Language", RFC 5228, DOI 10.17487/RFC5228, 726 January 2008, . 728 [RFC5435] Melnikov, A., Ed., Leiba, B., Ed., Segmuller, W., and T. 729 Martin, "Sieve Email Filtering: Extension for 730 Notifications", RFC 5435, DOI 10.17487/RFC5435, January 731 2009, . 733 [RFC5804] Melnikov, A., Ed. and T. Martin, "A Protocol for Remotely 734 Managing Sieve Scripts", RFC 5804, DOI 10.17487/RFC5804, 735 July 2010, . 737 [RFC6134] Melnikov, A. and B. Leiba, "Sieve Extension: Externally 738 Stored Lists", RFC 6134, DOI 10.17487/RFC6134, July 2011, 739 . 741 [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 742 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, 743 May 2017, . 745 [RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data 746 Interchange Format", STD 90, RFC 8259, 747 DOI 10.17487/RFC8259, December 2017, 748 . 750 [RFC8620] Jenkins, N. and C. Newman, "The JSON Meta Application 751 Protocol (JMAP)", RFC 8620, DOI 10.17487/RFC8620, July 752 2019, . 754 [RFC8621] Jenkins, N. and C. Newman, "The JSON Meta Application 755 Protocol (JMAP) for Mail", RFC 8621, DOI 10.17487/RFC8621, 756 August 2019, . 758 6.2. Informative References 760 [RFC5230] Showalter, T. and N. Freed, Ed., "Sieve Email Filtering: 761 Vacation Extension", RFC 5230, DOI 10.17487/RFC5230, 762 January 2008, . 764 [RFC5232] Melnikov, A., "Sieve Email Filtering: Imap4flags 765 Extension", RFC 5232, DOI 10.17487/RFC5232, January 2008, 766 . 768 [RFC5463] Freed, N., "Sieve Email Filtering: Ihave Extension", 769 RFC 5463, DOI 10.17487/RFC5463, March 2009, 770 . 772 Appendix A. Change History (To be removed by RFC Editor before 773 publication) 775 Changes since ietf-00: 777 o Specified that changes made by onSuccessActivateScript MUST be 778 reported in the /set response as created and/or updated as 779 appropriate. 781 o Reworked and specified more of the /test response based on 782 implementation experience. 784 Changes since murchison-01: 786 o Explicitly stated that Sieve capability strings are case- 787 sensitive. 789 o errorDescription is now String|null. 791 o Added /query method. 793 o Added /test method. 795 Changes since murchison-00: 797 o Added IANA registration for "scriptIsActive" JMAP error code. 799 o Added open issue about /set{create} with an existing script name. 801 Author's Address 802 Kenneth Murchison 803 Fastmail US LLC 804 1429 Walnut Street - Suite 1201 805 Philadelphia, PA 19102 806 USA 808 Email: murch@fastmailteam.com