summaryrefslogtreecommitdiffstats
path: root/pigeonhole/src/lib-sieve/sieve-address-source.c
diff options
context:
space:
mode:
Diffstat (limited to 'pigeonhole/src/lib-sieve/sieve-address-source.c')
-rw-r--r--pigeonhole/src/lib-sieve/sieve-address-source.c119
1 files changed, 119 insertions, 0 deletions
diff --git a/pigeonhole/src/lib-sieve/sieve-address-source.c b/pigeonhole/src/lib-sieve/sieve-address-source.c
new file mode 100644
index 0000000..a5ec6f6
--- /dev/null
+++ b/pigeonhole/src/lib-sieve/sieve-address-source.c
@@ -0,0 +1,119 @@
+/* Copyright (c) 2002-2018 Pigeonhole authors, see the included COPYING file
+ */
+
+#include "lib.h"
+
+#include "sieve-common.h"
+#include "sieve-error.h"
+#include "sieve-settings.h"
+#include "sieve-address.h"
+#include "sieve-message.h"
+
+#include "sieve-address-source.h"
+
+bool sieve_address_source_parse
+(pool_t pool, const char *value,
+ struct sieve_address_source *asrc)
+{
+ struct smtp_address *address;
+ const char *error;
+ size_t val_len;
+
+ i_zero(asrc);
+
+ value = t_str_trim(value, "\t ");
+ value = t_str_lcase(value);
+ val_len = strlen(value);
+ if ( val_len > 0 ) {
+ if ( strcmp(value, "default") == 0 ) {
+ asrc->type = SIEVE_ADDRESS_SOURCE_DEFAULT;
+ } else if ( strcmp(value, "sender") == 0 ) {
+ asrc->type = SIEVE_ADDRESS_SOURCE_SENDER;
+ } else if ( strcmp(value, "recipient") == 0 ) {
+ asrc->type = SIEVE_ADDRESS_SOURCE_RECIPIENT;
+ } else if ( strcmp(value, "orig_recipient") == 0 ) {
+ asrc->type = SIEVE_ADDRESS_SOURCE_ORIG_RECIPIENT;
+ } else if ( strcmp(value, "user_email") == 0 ) {
+ asrc->type = SIEVE_ADDRESS_SOURCE_USER_EMAIL;
+ } else if ( strcmp(value, "postmaster") == 0 ) {
+ asrc->type = SIEVE_ADDRESS_SOURCE_POSTMASTER;
+ } else if ( smtp_address_parse_path(pool_datastack_create(), value,
+ SMTP_ADDRESS_PARSE_FLAG_ALLOW_EMPTY, &address, &error) >= 0 ) {
+ asrc->type = SIEVE_ADDRESS_SOURCE_EXPLICIT;
+ asrc->address = smtp_address_clone(pool, address);
+ } else {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+bool sieve_address_source_parse_from_setting
+(struct sieve_instance *svinst, pool_t pool,
+ const char *setting, struct sieve_address_source *asrc)
+{
+ const char *value;
+
+ value = sieve_setting_get(svinst, setting);
+ if ( value == NULL )
+ return FALSE;
+
+ if ( !sieve_address_source_parse(pool, value, asrc) ) {
+ e_warning(svinst->event, "Invalid value for setting '%s': '%s'",
+ setting, value);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+int sieve_address_source_get_address
+(struct sieve_address_source *asrc,
+ struct sieve_instance *svinst,
+ const struct sieve_script_env *senv,
+ struct sieve_message_context *msgctx,
+ enum sieve_execute_flags flags,
+ const struct smtp_address **addr_r)
+{
+ enum sieve_address_source_type type = asrc->type;
+
+ if ( type == SIEVE_ADDRESS_SOURCE_USER_EMAIL &&
+ svinst->user_email == NULL )
+ type = SIEVE_ADDRESS_SOURCE_RECIPIENT;
+
+ if ( (flags & SIEVE_EXECUTE_FLAG_NO_ENVELOPE) != 0 ) {
+ switch ( type ) {
+ case SIEVE_ADDRESS_SOURCE_SENDER:
+ case SIEVE_ADDRESS_SOURCE_RECIPIENT:
+ case SIEVE_ADDRESS_SOURCE_ORIG_RECIPIENT:
+ /* We have no envelope */
+ type = SIEVE_ADDRESS_SOURCE_DEFAULT;
+ break;
+ default:
+ break;
+ }
+ }
+
+ switch ( type ) {
+ case SIEVE_ADDRESS_SOURCE_SENDER:
+ *addr_r = sieve_message_get_sender(msgctx);
+ return 1;
+ case SIEVE_ADDRESS_SOURCE_RECIPIENT:
+ *addr_r = sieve_message_get_final_recipient(msgctx);
+ return 1;
+ case SIEVE_ADDRESS_SOURCE_ORIG_RECIPIENT:
+ *addr_r = sieve_message_get_orig_recipient(msgctx);
+ return 1;
+ case SIEVE_ADDRESS_SOURCE_USER_EMAIL:
+ *addr_r = svinst->user_email;
+ return 1;
+ case SIEVE_ADDRESS_SOURCE_POSTMASTER:
+ *addr_r = sieve_get_postmaster_smtp(senv);
+ return 1;
+ case SIEVE_ADDRESS_SOURCE_EXPLICIT:
+ *addr_r = asrc->address;
+ return 1;
+ case SIEVE_ADDRESS_SOURCE_DEFAULT:
+ break;
+ }
+ return 0;
+}