-/* $Cambridge: exim/src/src/sieve.c,v 1.35 2008/11/18 11:10:43 michael Exp $ */
-
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
int require_enotify;
struct Notification *notified;
#endif
+ uschar *enotify_mailto_owner;
#ifdef SUBADDRESS
int require_subaddress;
#endif
struct Notification *next;
};
+/* This should be a complete list of supported extensions, so that an external
+ManageSieve (RFC 5804) program can interrogate the current Exim binary for the
+list of extensions and provide correct information to a client.
+
+We'll emit the list in the order given here; keep it alphabetically sorted, so
+that callers don't get surprised.
+
+List *MUST* end with a NULL. Which at least makes ifdef-vs-comma easier. */
+
+const uschar *exim_sieve_extension_list[] = {
+ CUS"comparator-i;ascii-numeric",
+ CUS"copy",
+#ifdef ENCODED_CHARACTER
+ CUS"encoded-character",
+#endif
+#ifdef ENOTIFY
+ CUS"enotify",
+#endif
+ CUS"envelope",
+#ifdef ENVELOPE_AUTH
+ CUS"envelope-auth",
+#endif
+ CUS"fileinto",
+#ifdef SUBADDRESS
+ CUS"subaddress",
+#endif
+#ifdef VACATION
+ CUS"vacation",
+#endif
+ NULL
+};
+
static int eq_asciicase(const struct String *needle, const struct String *haystack, int match_prefix);
static int parse_test(struct Sieve *filter, int *cond, int exec);
static int parse_commands(struct Sieve *filter, int exec, address_item **generated);
subject.character=(uschar*)0;
body.length=-1;
body.character=(uschar*)0;
- envelope_from=(sender_address && sender_address[0]) ? expand_string("$local_part_prefix$local_part$local_part_suffix@$domain") : US "";
+ envelope_from=(sender_address && sender_address[0]) ? expand_string(US"$local_part_prefix$local_part$local_part_suffix@$domain") : US "";
for (;;)
{
if (parse_white(filter)==-1) return -1;
for (already=filter->notified; already; already=already->next)
{
if (already->method.length==method.length
- && (method.length==-1 || strcmp(already->method.character,method.character)==0)
+ && (method.length==-1 || Ustrcmp(already->method.character,method.character)==0)
&& already->importance.length==importance.length
- && (importance.length==-1 || strcmp(already->importance.character,importance.character)==0)
+ && (importance.length==-1 || Ustrcmp(already->importance.character,importance.character)==0)
&& already->message.length==message.length
- && (message.length==-1 || strcmp(already->message.character,message.character)==0))
+ && (message.length==-1 || Ustrcmp(already->message.character,message.character)==0))
break;
}
if (already==(struct Notification*)0)
int buffer_capacity;
f = fdopen(fd, "wb");
- fprintf(f,"From: %s\n",from.length==-1 ? expand_string("$local_part_prefix$local_part$local_part_suffix@$domain") : from.character);
+ fprintf(f,"From: %s\n",from.length==-1 ? expand_string(US"$local_part_prefix$local_part$local_part_suffix@$domain") : from.character);
for (p=recipient; p; p=p->next) fprintf(f,"To: %s\n",p->text);
- fprintf(f,"Auto-Submitted: auto-notified\n");
+ fprintf(f,"Auto-Submitted: auto-notified; %s\n",filter->enotify_mailto_owner);
if (header.length>0) fprintf(f,"%s",header.character);
if (message.length==-1)
{
else if (eq_octet(check,&str_envelope_auth,0)) filter->require_envelope_auth=1;
#endif
#ifdef ENOTIFY
- else if (eq_octet(check,&str_enotify,0)) filter->require_enotify=1;
+ else if (eq_octet(check,&str_enotify,0))
+ {
+ if (filter->enotify_mailto_owner == NULL)
+ {
+ filter->errmsg=CUS "enotify disabled";
+ return -1;
+ }
+ filter->require_enotify=1;
+ }
#endif
#ifdef SUBADDRESS
else if (eq_octet(check,&str_subaddress,0)) filter->require_subaddress=1;
filter points to the entire file, read into store as a single string
options controls whether various special things are allowed, and requests
special actions (not currently used)
- sieve_vacation_directory where to store vacation "once" files
+ vacation_directory where to store vacation "once" files
+ enotify_mailto_owner owner of mailto notifications
useraddress string expression for :user part of address
subaddress string expression for :subaddress part of address
generated where to hang newly-generated addresses
int
sieve_interpret(uschar *filter, int options, uschar *vacation_directory,
- uschar *useraddress, uschar *subaddress, address_item **generated, uschar **error)
+ uschar *enotify_mailto_owner, uschar *useraddress, uschar *subaddress,
+ address_item **generated, uschar **error)
{
struct Sieve sieve;
int r;
}
}
+if (enotify_mailto_owner == NULL)
+ sieve.enotify_mailto_owner = NULL;
+else
+ {
+ sieve.enotify_mailto_owner=expand_string(enotify_mailto_owner);
+ if (sieve.enotify_mailto_owner == NULL)
+ {
+ *error = string_sprintf("failed to expand \"%s\" "
+ "(sieve_enotify_mailto_owner): %s", enotify_mailto_owner,
+ expand_string_message);
+ return FF_ERROR;
+ }
+ }
+
sieve.useraddress = useraddress == NULL ? CUS "$local_part_prefix$local_part$local_part_suffix" : useraddress;
sieve.subaddress = subaddress;