-/* $Cambridge: exim/src/src/sieve.c,v 1.13 2005/08/30 10:55:52 ph10 Exp $ */
+/* $Cambridge: exim/src/src/sieve.c,v 1.17 2005/11/28 09:47:20 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
/* Undefine it for UNIX-style \n end-of-line terminators (default). */
#undef RFC_EOL
-/* Define this for development of the subaddress Sieve extension. */
+/* Define this for development of the Sieve extension "envelope-auth". */
+#undef ENVELOPE_AUTH
+
+/* Define this for development of the Sieve extension "notify". */
+#undef NOTIFY
+
+/* Define this for the Sieve extension "subaddress". */
#define SUBADDRESS
-/* Define this for the vacation Sieve extension. */
+/* Define this for the Sieve extension "vacation". */
#define VACATION
/* Must be >= 1 */
int keep;
int require_envelope;
int require_fileinto;
+#ifdef ENVELOPE_AUTH
+ int require_envelope_auth;
+#endif
+#ifdef NOTIFY
+ int require_notify;
+#endif
#ifdef SUBADDRESS
int require_subaddress;
#endif
static const struct String str_cc={ str_cc_c, 2 };
static uschar str_bcc_c[]="Bcc";
static const struct String str_bcc={ str_bcc_c, 3 };
+static uschar str_auth_c[]="auth";
+static const struct String str_auth={ str_auth_c, 4 };
static uschar str_sender_c[]="Sender";
static const struct String str_sender={ str_sender_c, 6 };
static uschar str_resent_from_c[]="Resent-From";
static const struct String str_fileinto={ str_fileinto_c, 8 };
static uschar str_envelope_c[]="envelope";
static const struct String str_envelope={ str_envelope_c, 8 };
+#ifdef ENVELOPE_AUTH
+static uschar str_envelope_auth_c[]="envelope-auth";
+static const struct String str_envelope_auth={ str_envelope_auth_c, 13 };
+#endif
+#ifdef NOTIFY
+static uschar str_notify_c[]="notify";
+static const struct String str_notify={ str_notify_c, 6 };
+#endif
#ifdef SUBADDRESS
static uschar str_subaddress_c[]="subaddress";
static const struct String str_subaddress={ str_subaddress_c, 10 };
*t++=*r++;
}
*t++='\0';
-value->character=rfc2047_decode(s,TRUE,US"utf-8",'\0',&value->length,&errmsg);
+value->character=rfc2047_decode(s,check_rfc2047_length,US"utf-8",'\0',&value->length,&errmsg);
}
<envelope-part: string-list> <key-list: string-list>
envelope-part is case insensitive "from" or "to"
+#ifdef ENVELOPE_AUTH
+ envelope-part =/ "auth"
+#endif
*/
enum Comparator comparator=COMP_EN_ASCII_CASEMAP;
return -1;
}
*cond=0;
- for (e=env; e->character; ++e)
+ for (e=env; e->length!=-1 && !*cond; ++e)
{
const uschar *envelopeExpr=CUS 0;
uschar *envelope=US 0;
case ADDRPART_DOMAIN: envelopeExpr=CUS "$domain"; break;
}
}
+#ifdef ENVELOPE_AUTH
+ else if (eq_asciicase(e,&str_auth,0))
+ {
+ switch (addressPart)
+ {
+ case ADDRPART_ALL: envelopeExpr=CUS "$authenticated_sender"; break;
+#ifdef SUBADDRESS
+ case ADDRPART_USER:
+#endif
+ case ADDRPART_LOCALPART: envelopeExpr=CUS "${local_part:$authenticated_sender}"; break;
+ case ADDRPART_DOMAIN: envelopeExpr=CUS "${domain:$authenticated_sender}"; break;
+#ifdef SUBADDRESS
+ case ADDRPART_DETAIL: envelopeExpr=CUS 0; break;
+#endif
+ }
+ }
+#endif
else
{
filter->errmsg=CUS "invalid envelope string";
filter->errmsg=CUS "missing test";
return -1;
}
+ if ((filter_test != FTEST_NONE && debug_selector != 0) ||
+ (debug_selector & D_filter) != 0)
+ {
+ if (exec) debug_printf("if %s\n",cond?"true":"false");
+ }
m=parse_block(filter,exec ? cond : 0, generated);
if (m==-1 || m==2) return m;
if (m==0)
filter->errmsg=CUS "missing test";
return -1;
}
+ if ((filter_test != FTEST_NONE && debug_selector != 0) ||
+ (debug_selector & D_filter) != 0)
+ {
+ if (exec) debug_printf("elsif %s\n",cond?"true":"false");
+ }
m=parse_block(filter,exec && unsuccessful ? cond : 0, generated);
if (m==-1 || m==2) return m;
if (m==0)
fileinto-command = "fileinto" { fileinto-options } string ";"
fileinto-options =
fileinto-options =) [ ":copy" ]
- */
+ */
struct String folder;
uschar *s;
}
if (parse_semicolon(filter)==-1) return -1;
}
+#ifdef NOTIFY
+ else if (parse_identifier(filter,CUS "notify"))
+ {
+ /*
+ notify-command = "notify" { notify-options } ";"
+ notify-options = [":method" string]
+ [":message" string]
+ */
+
+ int m;
+ struct String method;
+ struct String message;
+
+ if (!filter->require_notify)
+ {
+ filter->errmsg=CUS "missing previous require \"notify\";";
+ return -1;
+ }
+ method.character=(uschar*)0;
+ method.length=-1;
+ message.character=(uschar*)0;
+ message.length=-1;
+ for (;;)
+ {
+ if (parse_white(filter)==-1) return -1;
+ if (parse_identifier(filter,CUS ":method")==1)
+ {
+ if (parse_white(filter)==-1) return -1;
+ if ((m=parse_string(filter,&method))!=1)
+ {
+ if (m==0) filter->errmsg=CUS "method string expected";
+ return -1;
+ }
+ }
+ else if (parse_identifier(filter,CUS ":message")==1)
+ {
+ if (parse_white(filter)==-1) return -1;
+ if ((m=parse_string(filter,&message))!=1)
+ {
+ if (m==0) filter->errmsg=CUS "message string expected";
+ return -1;
+ }
+ }
+ else break;
+ }
+ if (parse_semicolon(filter)==-1) return -1;
+ }
+#endif
#ifdef VACATION
else if (parse_identifier(filter,CUS "vacation"))
{
filter->keep=1;
filter->require_envelope=0;
filter->require_fileinto=0;
+#ifdef ENVELOPE_AUTH
+filter->require_envelope_auth=0;
+#endif
+#ifdef NOTIFY
+filter->require_notify=0;
+#endif
#ifdef SUBADDRESS
filter->require_subaddress=0;
#endif
{
if (eq_octet(check,&str_envelope,0)) filter->require_envelope=1;
else if (eq_octet(check,&str_fileinto,0)) filter->require_fileinto=1;
+#ifdef ENVELOPE_AUTH
+ else if (eq_octet(check,&str_envelope_auth,0)) filter->require_envelope_auth=1;
+#endif
+#ifdef NOTIFY
+ else if (eq_octet(check,&str_notify,0)) filter->require_notify=1;
+#endif
#ifdef SUBADDRESS
else if (eq_octet(check,&str_subaddress,0)) filter->require_subaddress=1;
#endif