From e7e9056a06f1cba3b4323f3be622b2c74945e221 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan.bosch@open-xchange.com> Date: Sun, 1 Sep 2024 17:08:31 +0200 Subject: [PATCH] lib-sieve: sieve-script - Create default handlers for binary load/save --- src/lib-sieve/sieve-script-private.h | 14 +++++ src/lib-sieve/sieve-script.c | 62 +++++++++++++++++++ .../storage/dict/sieve-dict-script.c | 18 ++---- .../storage/file/sieve-file-script.c | 15 ++--- .../storage/ldap/sieve-ldap-script.c | 19 ++---- 5 files changed, 93 insertions(+), 35 deletions(-) diff --git a/src/lib-sieve/sieve-script-private.h b/src/lib-sieve/sieve-script-private.h index c0b7433e3..d23ce0f79 100644 --- a/src/lib-sieve/sieve-script-private.h +++ b/src/lib-sieve/sieve-script-private.h @@ -74,6 +74,20 @@ void sieve_script_init(struct sieve_script *script, const struct sieve_script *script_class, const char *location, const char *name); +/* + * Binary + */ + +int sieve_script_binary_load_default(struct sieve_script *script, + const char *path, + struct sieve_binary **sbin_r, + enum sieve_error *error_code_r); +int sieve_script_binary_save_default(struct sieve_script *script, + struct sieve_binary *sbin, + const char *path, bool update, + mode_t save_mode, + enum sieve_error *error_code_r); + /* * Built-in script drivers */ diff --git a/src/lib-sieve/sieve-script.c b/src/lib-sieve/sieve-script.c index b15c197ac..aa34673a5 100644 --- a/src/lib-sieve/sieve-script.c +++ b/src/lib-sieve/sieve-script.c @@ -9,6 +9,7 @@ #include "hash.h" #include "array.h" #include "eacces-error.h" +#include "mkdir-parents.h" #include "istream.h" #include "sieve-common.h" @@ -503,6 +504,31 @@ bool sieve_script_binary_dump_metadata(struct sieve_script *script, return result; } +int sieve_script_binary_load_default(struct sieve_script *script, + const char *path, + struct sieve_binary **sbin_r, + enum sieve_error *error_code_r) +{ + struct sieve_instance *svinst = script->storage->svinst; + enum sieve_error error_code; + + if (path == NULL) { + sieve_script_set_error( + script, SIEVE_ERROR_NOT_POSSIBLE, + "Cannot load script binary for this storage"); + *error_code_r = script->storage->error_code; + return -1; + } + + if (sieve_binary_open(svinst, path, script, sbin_r, &error_code) < 0) { + sieve_script_set_error(script, error_code, + "Failed to load script binary"); + *error_code_r = script->storage->error_code; + return -1; + } + return 0; +} + int sieve_script_binary_load(struct sieve_script *script, struct sieve_binary **sbin_r, enum sieve_error *error_code_r) @@ -525,6 +551,42 @@ int sieve_script_binary_load(struct sieve_script *script, return ret; } +int sieve_script_binary_save_default(struct sieve_script *script ATTR_UNUSED, + struct sieve_binary *sbin, + const char *path, bool update, + mode_t save_mode, + enum sieve_error *error_code_r) +{ + struct sieve_storage *storage = script->storage; + enum sieve_error error_code; + int ret; + + if (path == NULL) { + sieve_script_set_error( + script, SIEVE_ERROR_NOT_POSSIBLE, + "Cannot save script binary for this storage"); + *error_code_r = script->storage->error_code; + return -1; + } + + if (storage->bin_path != NULL && + str_begins_with(path, storage->bin_path) && + sieve_storage_setup_bin_path( + script->storage, mkdir_get_executable_mode(save_mode)) < 0) { + *error_code_r = SIEVE_ERROR_TEMP_FAILURE; + return -1; + } + + ret = sieve_binary_save(sbin, path, update, save_mode, &error_code); + if (ret < 0) { + sieve_script_set_error(script, error_code, + "Failed to save script binary"); + *error_code_r = script->storage->error_code; + return -1; + } + return 0; +} + int sieve_script_binary_save(struct sieve_script *script, struct sieve_binary *sbin, bool update, enum sieve_error *error_code_r) diff --git a/src/lib-sieve/storage/dict/sieve-dict-script.c b/src/lib-sieve/storage/dict/sieve-dict-script.c index b03fbc31c..dcd062487 100644 --- a/src/lib-sieve/storage/dict/sieve-dict-script.c +++ b/src/lib-sieve/storage/dict/sieve-dict-script.c @@ -232,11 +232,9 @@ sieve_dict_script_binary_load(struct sieve_script *script, struct sieve_dict_script *dscript = container_of(script, struct sieve_dict_script, script); - if (sieve_dict_script_get_bin_path(dscript) == NULL) - return -1; - - return sieve_binary_open(script->storage->svinst, dscript->bin_path, - script, sbin_r, error_code_r); + return sieve_script_binary_load_default( + script, sieve_dict_script_get_bin_path(dscript), + sbin_r, error_code_r); } static int @@ -247,13 +245,9 @@ sieve_dict_script_binary_save(struct sieve_script *script, struct sieve_dict_script *dscript = container_of(script, struct sieve_dict_script, script); - if (sieve_dict_script_get_bin_path(dscript) == NULL) - return 0; - if (sieve_storage_setup_bin_path(script->storage, 0700) < 0) - return -1; - - return sieve_binary_save(sbin, dscript->bin_path, update, 0600, - error_code_r); + return sieve_script_binary_save_default( + script, sbin, sieve_dict_script_get_bin_path(dscript), + update, 0600, error_code_r); } static int diff --git a/src/lib-sieve/storage/file/sieve-file-script.c b/src/lib-sieve/storage/file/sieve-file-script.c index 959ba6311..a416fbe79 100644 --- a/src/lib-sieve/storage/file/sieve-file-script.c +++ b/src/lib-sieve/storage/file/sieve-file-script.c @@ -537,10 +537,9 @@ sieve_file_script_binary_load(struct sieve_script *script, { struct sieve_file_script *fscript = container_of(script, struct sieve_file_script, script); - struct sieve_instance *svinst = script->storage->svinst; - return sieve_binary_open(svinst, fscript->bin_path, script, - sbin_r, error_code_r); + return sieve_script_binary_load_default(script, fscript->bin_path, + sbin_r, error_code_r); } static int @@ -548,16 +547,12 @@ sieve_file_script_binary_save(struct sieve_script *script, struct sieve_binary *sbin, bool update, enum sieve_error *error_code_r) { - struct sieve_storage *storage = script->storage; struct sieve_file_script *fscript = container_of(script, struct sieve_file_script, script); - if (storage->bin_path != NULL && - sieve_storage_setup_bin_path(storage, 0700) < 0) - return -1; - - return sieve_binary_save(sbin, fscript->bin_path, update, - (fscript->st.st_mode & 0777), error_code_r); + return sieve_script_binary_save_default( + script, sbin, fscript->bin_path, update, + (fscript->st.st_mode & 0777), error_code_r); } static const char * diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-script.c b/src/lib-sieve/storage/ldap/sieve-ldap-script.c index 102028849..3f416daa5 100644 --- a/src/lib-sieve/storage/ldap/sieve-ldap-script.c +++ b/src/lib-sieve/storage/ldap/sieve-ldap-script.c @@ -251,15 +251,12 @@ sieve_ldap_script_binary_load(struct sieve_script *script, struct sieve_binary **sbin_r, enum sieve_error *error_code_r) { - struct sieve_storage *storage = script->storage; struct sieve_ldap_script *lscript = container_of(script, struct sieve_ldap_script, script); - if (sieve_ldap_script_get_bin_path(lscript) == NULL) - return -1; - - return sieve_binary_open(storage->svinst, lscript->bin_path, script, - sbin_r, error_code_r); + return sieve_script_binary_load_default( + script, sieve_ldap_script_get_bin_path(lscript), + sbin_r, error_code_r); } static int @@ -270,13 +267,9 @@ sieve_ldap_script_binary_save(struct sieve_script *script, struct sieve_ldap_script *lscript = container_of(script, struct sieve_ldap_script, script); - if (sieve_ldap_script_get_bin_path(lscript) == NULL) - return 0; - if (sieve_storage_setup_bin_path(script->storage, 0700) < 0) - return -1; - - return sieve_binary_save(sbin, lscript->bin_path, update, 0600, - error_code_r); + return sieve_script_binary_save_default( + script, sbin, sieve_ldap_script_get_bin_path(lscript), + update, 0600, error_code_r); } static int -- GitLab