diff --git a/configure.in b/configure.in index b63be4ffbfd6024f0277bdfa1de4e5f99f4e5b58..2348bb2eb7dc0d27175dd6d724e8d910e5d67223 100644 --- a/configure.in +++ b/configure.in @@ -65,6 +65,7 @@ src/lib-sieve/plugins/comparator-i-ascii-numeric/Makefile src/lib-sieve/plugins/relational/Makefile src/lib-sieve/plugins/regex/Makefile src/lib-sieve/plugins/imapflags/Makefile +src/lib-sieve/plugins/copy/Makefile src/sieve-bin/Makefile stamp.h]) diff --git a/src/lib-sieve/Makefile.am b/src/lib-sieve/Makefile.am index 9a55bde1c9236147044bd370dddf795f9646f661..7aacc7b5d4a47c26d4c72fe83798289c662be97d 100644 --- a/src/lib-sieve/Makefile.am +++ b/src/lib-sieve/Makefile.am @@ -36,6 +36,7 @@ plugins = \ ./plugins/comparator-i-ascii-numeric/libsieve_ext_comparator-i-ascii-numeric.la \ ./plugins/relational/libsieve_ext_relational.la \ ./plugins/regex/libsieve_ext_regex.la \ + ./plugins/copy/libsieve_ext_copy.la \ ./plugins/imapflags/libsieve_ext_imapflags.la libsieve_la_DEPENDENCIES = $(plugins) diff --git a/src/lib-sieve/plugins/Makefile.am b/src/lib-sieve/plugins/Makefile.am index 508d899e4150f9033121e272341c3e0b4e94aeb7..e3620cf186c6266843c29958d04b2dc62d6670c5 100644 --- a/src/lib-sieve/plugins/Makefile.am +++ b/src/lib-sieve/plugins/Makefile.am @@ -1,2 +1,2 @@ -SUBDIRS = vacation subaddress comparator-i-ascii-numeric relational regex imapflags +SUBDIRS = vacation subaddress comparator-i-ascii-numeric relational regex imapflags copy diff --git a/src/lib-sieve/plugins/copy/Makefile.am b/src/lib-sieve/plugins/copy/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..e6df8563a8947f8cb33b9489726f25b12b526ee9 --- /dev/null +++ b/src/lib-sieve/plugins/copy/Makefile.am @@ -0,0 +1,12 @@ +noinst_LTLIBRARIES = libsieve_ext_copy.la + +AM_CPPFLAGS = \ + -I../../ \ + -I$(dovecot_incdir) \ + -I$(dovecot_incdir)/src/lib \ + -I$(dovecot_incdir)/src/lib-mail \ + -I$(dovecot_incdir)/src/lib-storage + +libsieve_ext_copy_la_SOURCES = \ + ext-copy.c + diff --git a/src/lib-sieve/plugins/copy/ext-copy.c b/src/lib-sieve/plugins/copy/ext-copy.c new file mode 100644 index 0000000000000000000000000000000000000000..d4034d9f2e6299c7b6f7dcb764265b637cf8c653 --- /dev/null +++ b/src/lib-sieve/plugins/copy/ext-copy.c @@ -0,0 +1,76 @@ +/* Extension copy + * ------------------ + * + * Authors: Stephan Bosch + * Specification: RFC 3894 + * Implementation: + * Status: under development + * + */ + +#include <stdio.h> + +#include "sieve-common.h" + +#include "sieve-code.h" +#include "sieve-extensions.h" +#include "sieve-commands.h" +#include "sieve-validator.h" +#include "sieve-generator.h" +#include "sieve-interpreter.h" + +/* Forward declarations */ + +static bool ext_copy_load(int ext_id); +static bool ext_copy_validator_load(struct sieve_validator *validator); + +/* Extension definitions */ + +int ext_my_id; + +const struct sieve_extension copy_extension = { + "copy", + ext_copy_load, + ext_copy_validator_load, + NULL, NULL, NULL, + SIEVE_EXT_DEFINE_NO_OPCODES, + NULL +}; + +static bool ext_copy_load(int ext_id) +{ + ext_my_id = ext_id; + + return TRUE; +} + +/* Tag validation */ + +static bool tag_copy_validate + (struct sieve_validator *validator ATTR_UNUSED, + struct sieve_ast_argument **arg ATTR_UNUSED, + struct sieve_command_context *cmd ATTR_UNUSED) +{ + /* FIXME: currently not generated */ + *arg = sieve_ast_arguments_detach(*arg,1); + + return TRUE; +} + +/* Command registration */ + +static const struct sieve_argument copy_tag = { + "days", NULL, + tag_copy_validate, + NULL, NULL +}; + +/* Load extension into validator */ +static bool ext_copy_validator_load(struct sieve_validator *validator) +{ + /* Register new command */ + //sieve_validator_register_tag(validator, cmd_reg, ©_tag, -1); + + return TRUE; +} + diff --git a/src/lib-sieve/plugins/copy/rfc3894.txt b/src/lib-sieve/plugins/copy/rfc3894.txt new file mode 100644 index 0000000000000000000000000000000000000000..4f89a420a73b83637009de6cc6ca0560320aef64 --- /dev/null +++ b/src/lib-sieve/plugins/copy/rfc3894.txt @@ -0,0 +1,283 @@ + + + + + + +Network Working Group J. Degener +Request for Comments: 3894 Sendmail, Inc. +Category: Standards Track October 2004 + + + Sieve Extension: Copying Without Side Effects + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2004). + +Abstract + + The Sieve scripting language allows users to control handling and + disposal of their incoming e-mail. By default, an e-mail message + that is processed by a Sieve script is saved in the owner's "inbox". + Actions such as "fileinto" and "redirect" cancel this default + behavior. + + This document defines a new keyword parameter, ":copy", to be used + with the Sieve "fileinto" and "redirect" actions. Adding ":copy" to + an action suppresses cancellation of the default "inbox" save. It + allows users to add commands to an existing script without changing + the meaning of the rest of the script. + +1. Introduction + + The Sieve scripting language [SIEVE] allows users to control handling + and disposal of their incoming e-mail. Two frequently used Sieve + commands are "fileinto" (saving into a local message store, such as + an IMAP server) and "redirect" (forwarding to another e-mail + address). Both of these cancel the Sieve default behavior of saving + into the user's "inbox". + + But some users have the notion of forwarding an extra copy of a + message for safekeeping to another e-mail address, or of saving a + copy in a folder - in addition to the regular message delivery, which + shouldn't be affected by the copy. + + + + + +Degener Standards Track [Page 1] + +RFC 3894 Sieve Extension - Copy Without Side Effects October 2004 + + + If saving an extra copy is all the user wanted to do, + + fileinto "unfiltered"; + keep; + + would do the job. The "keep" command does explicitly what the + cancelled default behavior did. But the explicit "keep" is a poor + substitute for the implicit "keep" when more processing follows: + + fileinto "unfiltered"; + keep; + + if header "Subject" "MAKE MONEY FAST!!!" + { + discard; + } + + In this example, the "discard" is ineffective against the explicit + "keep"; the discarded message still ends up in the user's inbox. + + It is possible to generate Sieve code that perfectly expresses a + user's wishes, but such code quickly grows unwieldy because it needs + to keep track of the state that the implicit "keep" would have had + without the "fileinto" or "redirect" command. + + This extension tries to make life easier for user interface designers + and script writers by allowing them to express the "copy" semantics + directly. + +2. Conventions used + + Conventions for notations are as in [SIEVE] section 1.1, including + use of [KEYWORDS] and "Syntax:" label for the definition of action + and tagged arguments syntax. + + The capability string associated with extension defined in this + document is "copy". + +3. ":copy" extension to the "fileinto" and "redirect" commands + + Syntax: + "fileinto" [":copy"] <folder: string> + "redirect" [":copy"] <address: string> + + If the optional ":copy" keyword is specified with "fileinto" or + "redirect", the tagged command does not cancel the implicit "keep". + Instead, it merely files or redirects a copy in addition to whatever + else is happening to the message. + + + +Degener Standards Track [Page 2] + +RFC 3894 Sieve Extension - Copy Without Side Effects October 2004 + + + Example: + + require ["copy", "fileinto"]; + fileinto :copy "incoming"; + + # ... more processing follows ... + +4. Security Considerations + + The "copy" extension makes it easier to eavesdrop on a user's message + stream without the user noticing. This was technically possible + before if an attacker gained read/write access to a user's Sieve + scripts, but now an attacker no longer needs to parse a script in + order to modify it. Write access to Sieve scripts must be protected + as strongly as read/write access to e-mail, for example by using + secure directory protocols such as correctly parameterized LDAP over + TLS [LDAP]. + + Organizations that wish to monitor their users' e-mail traffic must + familiarize themselves with local data protection laws before + creating stores of old e-mail traffic without control, or perhaps + even knowledge, of the sender or intended recipients. + + Organizations that legally use "redirect :copy" to eavesdrop on + correspondence (for example, by keeping a log to answer questions + about insider trading at a later time) can avoid future problems by + setting users' privacy expectations correctly. + +5. IANA Considerations + + The following template specifies the IANA registration of the "copy" + Sieve extension specified in this document. + + To: iana@iana.org + Subject: Registration of new Sieve extension + + Capability name: copy + Capability keyword: copy + Capability arguments: N/A + Standards Track: RFC 3894 + Person and email address to contact for further information: + + Jutta Degener + Sendmail, Inc. + 6425 Christie Ave, 4th Floor + Emeryville, CA 94608 + + Email: jutta@sendmail.com + + + +Degener Standards Track [Page 3] + +RFC 3894 Sieve Extension - Copy Without Side Effects October 2004 + + + This information has been added to the list of Sieve extensions given + on http://www.iana.org/assignments/sieve-extensions. + +6. Acknowledgments + + Thanks to Eric Allman, Ned Freed, Will Lee, Nigel Swinson, and Rand + Wacker for corrections and comments. + +7. References + +7.1. Normative References + + [KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [SIEVE] Showalter, T., "Sieve: A Mail Filtering Language", RFC + 3028, January 2001. + +7.2. Informative References + + [LDAP] Wahl, M., Alvestrand, H., Hodges, J., and R. Morgan, + "Authentication Methods for LDAP", RFC 2829, May 2000. + +Author's Address + + Jutta Degener + Sendmail, Inc. + 6425 Christie Ave, 4th Floor + Emeryville, CA 94608 + + EMail: jutta@sendmail.com + + + + + + + + + + + + + + + + + + + + +Degener Standards Track [Page 4] + +RFC 3894 Sieve Extension - Copy Without Side Effects October 2004 + + +Full Copyright Statement + + Copyright (C) The Internet Society (2004). + + This document is subject to the rights, licenses and restrictions + contained in BCP 78, and except as set forth therein, the authors + retain all their rights. + + This document and the information contained herein are provided on an + "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/S HE + REPRESENTS OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE + INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF + THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED + WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Intellectual Property + + The IETF takes no position regarding the validity or scope of any + Intellectual Property Rights or other rights that might be claimed to + pertain to the implementation or use of the technology described in + this document or the extent to which any license under such rights + might or might not be available; nor does it represent that it has + made any independent effort to identify any such rights. Information + on the IETF's procedures with respect to rights in IETF Documents can + be found in BCP 78 and BCP 79. + + Copies of IPR disclosures made to the IETF Secretariat and any + assurances of licenses to be made available, or the result of an + attempt made to obtain a general license or permission for the use of + such proprietary rights by implementers or users of this + specification can be obtained from the IETF on-line IPR repository at + http://www.ietf.org/ipr. + + The IETF invites any interested party to bring to its attention any + copyrights, patents or patent applications, or other proprietary + rights that may cover technology that may be required to implement + this standard. Please address the information to the IETF at ietf- + ipr@ietf.org. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + +Degener Standards Track [Page 5] + diff --git a/src/lib-sieve/sieve-extensions.c b/src/lib-sieve/sieve-extensions.c index f5345b9d94d73bd0a31d5ea0dacaa6c325f7eac7..9415504baeff336cd14d93fa66a799400a855bb0 100644 --- a/src/lib-sieve/sieve-extensions.c +++ b/src/lib-sieve/sieve-extensions.c @@ -53,6 +53,7 @@ extern const struct sieve_extension comparator_i_ascii_numeric_extension; extern const struct sieve_extension relational_extension; extern const struct sieve_extension regex_extension; extern const struct sieve_extension imapflags_extension; +extern const struct sieve_extension copy_extension; const struct sieve_extension *sieve_core_extensions[] = { &comparator_extension, &match_type_extension, &address_part_extension, @@ -62,7 +63,8 @@ const struct sieve_extension *sieve_core_extensions[] = { /* 'Plugins' */ &vacation_extension, &subaddress_extension, &comparator_i_ascii_numeric_extension, - &relational_extension, ®ex_extension, &imapflags_extension + &relational_extension, ®ex_extension, &imapflags_extension, + ©_extension }; const unsigned int sieve_core_extensions_count = diff --git a/src/sieve-bin/sieve-exec.c b/src/sieve-bin/sieve-exec.c index b48d2070791cc10297918ec9f711f07a143df1c5..612154e960087f4b18fd79413be77b459e9f6c25 100644 --- a/src/sieve-bin/sieve-exec.c +++ b/src/sieve-bin/sieve-exec.c @@ -3,6 +3,7 @@ #include "lib.h" #include "mail-storage.h" #include "mail-namespace.h" +#include "env-util.h" #include "bin-common.h" #include "mail-raw.h"