summaryrefslogtreecommitdiffstats
path: root/pigeonhole/src/lib-sieve/plugins/vacation/ext-vacation-common.c
diff options
context:
space:
mode:
Diffstat (limited to 'pigeonhole/src/lib-sieve/plugins/vacation/ext-vacation-common.c')
-rw-r--r--pigeonhole/src/lib-sieve/plugins/vacation/ext-vacation-common.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/pigeonhole/src/lib-sieve/plugins/vacation/ext-vacation-common.c b/pigeonhole/src/lib-sieve/plugins/vacation/ext-vacation-common.c
new file mode 100644
index 0000000..97be3a5
--- /dev/null
+++ b/pigeonhole/src/lib-sieve/plugins/vacation/ext-vacation-common.c
@@ -0,0 +1,114 @@
+/* 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-extensions.h"
+
+#include "ext-vacation-common.h"
+
+bool ext_vacation_load
+(const struct sieve_extension *ext, void **context)
+{
+ struct sieve_instance *svinst = ext->svinst;
+ struct ext_vacation_config *config;
+ sieve_number_t min_period, max_period, default_period;
+ bool use_original_recipient, dont_check_recipient, send_from_recipient,
+ to_header_ignore_envelope;
+ unsigned long long max_subject_codepoints;
+ const char *default_subject, *default_subject_template;
+
+ if ( *context != NULL ) {
+ ext_vacation_unload(ext);
+ }
+
+ if ( !sieve_setting_get_duration_value
+ (svinst, "sieve_vacation_min_period", &min_period) ) {
+ min_period = EXT_VACATION_DEFAULT_MIN_PERIOD;
+ }
+
+ if ( !sieve_setting_get_duration_value
+ (svinst, "sieve_vacation_max_period", &max_period) ) {
+ max_period = EXT_VACATION_DEFAULT_MAX_PERIOD;
+ }
+
+ if ( !sieve_setting_get_duration_value
+ (svinst, "sieve_vacation_default_period", &default_period) ) {
+ default_period = EXT_VACATION_DEFAULT_PERIOD;
+ }
+
+ if ( max_period > 0
+ && (min_period > max_period || default_period < min_period
+ || default_period > max_period) ) {
+ min_period = EXT_VACATION_DEFAULT_MIN_PERIOD;
+ max_period = EXT_VACATION_DEFAULT_MAX_PERIOD;
+ default_period = EXT_VACATION_DEFAULT_PERIOD;
+
+ e_warning(svinst->event, "vacation extension: "
+ "invalid settings: violated "
+ "sieve_vacation_min_period < "
+ "sieve_vacation_default_period < "
+ "sieve_vacation_max_period");
+ }
+
+ default_subject = sieve_setting_get(
+ svinst, "sieve_vacation_default_subject");
+ default_subject_template = sieve_setting_get(
+ svinst, "sieve_vacation_default_subject_template");
+
+ if ( !sieve_setting_get_uint_value
+ (svinst, "sieve_vacation_max_subject_codepoints", &max_subject_codepoints) ) {
+ max_subject_codepoints = EXT_VACATION_DEFAULT_MAX_SUBJECT_CODEPOINTS;
+ }
+
+ if ( !sieve_setting_get_bool_value
+ (svinst, "sieve_vacation_use_original_recipient", &use_original_recipient) ) {
+ use_original_recipient = FALSE;
+ }
+
+ if ( !sieve_setting_get_bool_value
+ (svinst, "sieve_vacation_dont_check_recipient", &dont_check_recipient) ) {
+ dont_check_recipient = FALSE;
+ }
+
+ if ( !sieve_setting_get_bool_value
+ (svinst, "sieve_vacation_send_from_recipient", &send_from_recipient) ) {
+ send_from_recipient = FALSE;
+ }
+
+ if ( !sieve_setting_get_bool_value(svinst,
+ "sieve_vacation_to_header_ignore_envelope",
+ &to_header_ignore_envelope) ) {
+ to_header_ignore_envelope = FALSE;
+ }
+
+ config = i_new(struct ext_vacation_config, 1);
+ config->min_period = min_period;
+ config->max_period = max_period;
+ config->default_period = default_period;
+ config->max_subject_codepoints = max_subject_codepoints;
+ config->default_subject = i_strdup_empty(default_subject);
+ config->default_subject_template = i_strdup_empty(default_subject_template);
+ config->use_original_recipient = use_original_recipient;
+ config->dont_check_recipient = dont_check_recipient;
+ config->send_from_recipient = send_from_recipient;
+ config->to_header_ignore_envelope = to_header_ignore_envelope;
+
+ *context = (void *) config;
+
+ return TRUE;
+}
+
+void ext_vacation_unload
+(const struct sieve_extension *ext)
+{
+ struct ext_vacation_config *config =
+ (struct ext_vacation_config *) ext->context;
+
+ i_free(config->default_subject);
+ i_free(config->default_subject_template);
+ i_free(config);
+}