diff options
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.c | 114 |
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); +} |