diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-script.c b/src/lib-sieve/storage/ldap/sieve-ldap-script.c index 7c7dc67c7e1cadacb130e166f410f2df6227e84a..affe5898597278535b262998d931a663825dbd59 100644 --- a/src/lib-sieve/storage/ldap/sieve-ldap-script.c +++ b/src/lib-sieve/storage/ldap/sieve-ldap-script.c @@ -125,17 +125,26 @@ static int sieve_ldap_script_binary_read_metadata { struct sieve_ldap_script *lscript = (struct sieve_ldap_script *)script; + struct sieve_ldap_storage *lstorage = + (struct sieve_ldap_storage *)script->storage; struct sieve_binary *sbin = sieve_binary_block_get_binary(sblock); string_t *dn, *modattr; + /* config file changed? */ + if ( sieve_binary_mtime(sbin) <= lstorage->set_mtime ) + return 0; + + /* open script if not open already */ if ( lscript->dn == NULL && sieve_script_open(script, NULL) < 0 ) return 0; + /* if modattr not found recompile always */ if ( lscript->modattr == NULL || *lscript->modattr == '\0' ) return 0; + /* compare DN in binary and from search result */ if ( !sieve_binary_read_string(sblock, offset, &dn) ) { sieve_script_sys_error(script, "Binary `%s' has invalid metadata for script `%s': " @@ -147,6 +156,7 @@ static int sieve_ldap_script_binary_read_metadata if ( strcmp(str_c(dn), lscript->dn) != 0 ) return 0; + /* compare modattr in binary and from search result */ if ( !sieve_binary_read_string(sblock, offset, &modattr) ) { sieve_script_sys_error(script, "Binary `%s' has invalid metadata for script `%s': " diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.c b/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.c index 548d2530f02dffd1a8a5fd50f4ecb261768d2081..040eb1b686080a5e6d99dc1661b9c8c66048b188 100644 --- a/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.c +++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.c @@ -15,6 +15,10 @@ #include "sieve-ldap-db.h" +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + #define DEF_STR(name) DEF_STRUCT_STR(name, sieve_ldap_storage_settings) #define DEF_INT(name) DEF_STRUCT_INT(name, sieve_ldap_storage_settings) #define DEF_BOOL(name) DEF_STRUCT_BOOL(name, sieve_ldap_storage_settings) @@ -87,8 +91,18 @@ int sieve_ldap_storage_read_settings { struct sieve_storage *storage = &lstorage->storage; const char *str, *error; + struct stat st; + + if ( stat(config_path, &st) < 0 ) { + sieve_storage_sys_error(storage, + "Failed to read LDAP storage config: " + "stat(%s) failed: %m", config_path); + return -1; + } lstorage->set = default_settings; + lstorage->set_mtime = st.st_mtime; + if (!settings_read_nosection (config_path, parse_setting, lstorage, &error)) { sieve_storage_set_critical(storage, diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage.h b/src/lib-sieve/storage/ldap/sieve-ldap-storage.h index fbd9aa90664ce654340536474b6372a5ffdc3196..5ddbc5a4437dfc84928b0968abbf4a31068bfa94 100644 --- a/src/lib-sieve/storage/ldap/sieve-ldap-storage.h +++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage.h @@ -64,7 +64,9 @@ int sieve_ldap_storage_read_settings struct sieve_ldap_storage { struct sieve_storage storage; + struct sieve_ldap_storage_settings set; + time_t set_mtime; const char *username; // FIXME: needed?