diff options
Diffstat (limited to 'pigeonhole/src/lib-sieve/sieve-storage-private.h')
-rw-r--r-- | pigeonhole/src/lib-sieve/sieve-storage-private.h | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/pigeonhole/src/lib-sieve/sieve-storage-private.h b/pigeonhole/src/lib-sieve/sieve-storage-private.h new file mode 100644 index 0000000..16af3d4 --- /dev/null +++ b/pigeonhole/src/lib-sieve/sieve-storage-private.h @@ -0,0 +1,256 @@ +#ifndef SIEVE_STORAGE_PRIVATE_H +#define SIEVE_STORAGE_PRIVATE_H + +#include "sieve.h" +#include "sieve-error-private.h" + +#include "sieve-storage.h" + +#define MAILBOX_ATTRIBUTE_PREFIX_SIEVE \ + MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER"sieve/" +#define MAILBOX_ATTRIBUTE_PREFIX_SIEVE_FILES \ + MAILBOX_ATTRIBUTE_PREFIX_SIEVE"files/" +#define MAILBOX_ATTRIBUTE_SIEVE_DEFAULT \ + MAILBOX_ATTRIBUTE_PREFIX_SIEVE"default" + +#define MAILBOX_ATTRIBUTE_SIEVE_DEFAULT_LINK 'L' +#define MAILBOX_ATTRIBUTE_SIEVE_DEFAULT_SCRIPT 'S' + +struct sieve_storage; + +ARRAY_DEFINE_TYPE(sieve_storage_class, const struct sieve_storage *); + +struct sieve_storage_vfuncs { + struct sieve_storage *(*alloc)(void); + void (*destroy)(struct sieve_storage *storage); + int (*init)(struct sieve_storage *storage, const char *const *options, + enum sieve_error *error_r); + + int (*get_last_change)(struct sieve_storage *storage, + time_t *last_change_r); + void (*set_modified)(struct sieve_storage *storage, time_t mtime); + + int (*is_singular)(struct sieve_storage *storage); + + /* script access */ + struct sieve_script *(*get_script)(struct sieve_storage *storage, + const char *name); + + /* script sequence */ + struct sieve_script_sequence *(*get_script_sequence)( + struct sieve_storage *storage, enum sieve_error *error_r); + struct sieve_script *(*script_sequence_next)( + struct sieve_script_sequence *seq, enum sieve_error *error_r); + void (*script_sequence_destroy)(struct sieve_script_sequence *seq); + + /* active script */ + int (*active_script_get_name)(struct sieve_storage *storage, + const char **name_r); + struct sieve_script *(*active_script_open)( + struct sieve_storage *storage); + int (*deactivate)(struct sieve_storage *storage); + int (*active_script_get_last_change)(struct sieve_storage *storage, + time_t *last_change_r); + + /* listing scripts */ + struct sieve_storage_list_context *(*list_init)( + struct sieve_storage *storage); + const char *(*list_next)(struct sieve_storage_list_context *lctx, + bool *active_r); + int (*list_deinit)(struct sieve_storage_list_context *lctx); + + /* saving scripts */ + // FIXME: simplify this API; reduce this mostly to a single save function + struct sieve_storage_save_context *(*save_alloc)( + struct sieve_storage *storage); + int (*save_init)(struct sieve_storage_save_context *sctx, + const char *scriptname, struct istream *input); + int (*save_continue)(struct sieve_storage_save_context *sctx); + int (*save_finish)(struct sieve_storage_save_context *sctx); + struct sieve_script *(*save_get_tempscript)( + struct sieve_storage_save_context *sctx); + void (*save_cancel)(struct sieve_storage_save_context *sctx); + int (*save_commit)(struct sieve_storage_save_context *sctx); + int (*save_as)(struct sieve_storage *storage, struct istream *input, + const char *name); + int (*save_as_active)(struct sieve_storage *storage, + struct istream *input, time_t mtime); + + /* checking quota */ + int (*quota_havespace)(struct sieve_storage *storage, + const char *scriptname, size_t size, + enum sieve_storage_quota *quota_r, + uint64_t *limit_r); +}; + +struct sieve_storage { + pool_t pool; + unsigned int refcount; + struct sieve_instance *svinst; + struct event *event; + + const char *driver_name; + unsigned int version; + + const struct sieve_storage *storage_class; + struct sieve_storage_vfuncs v; + + uint64_t max_scripts; + uint64_t max_storage; + + char *error; + enum sieve_error error_code; + + const char *data; + const char *location; + const char *script_name; + const char *bin_dir; + + const char *default_name; + const char *default_location; + struct sieve_storage *default_for; + + struct mail_namespace *sync_inbox_ns; + + enum sieve_storage_flags flags; + + /* this is the main personal storage */ + bool main_storage:1; + bool allows_synchronization:1; + bool is_default:1; +}; + +struct event * +sieve_storage_event_create(struct sieve_instance *svinst, + const struct sieve_storage *storage_class); +struct sieve_storage * +sieve_storage_alloc(struct sieve_instance *svinst, struct event *event, + const struct sieve_storage *storage_class, const char *data, + enum sieve_storage_flags flags, bool main) ATTR_NULL(2, 4); + +int sieve_storage_setup_bindir(struct sieve_storage *storage, mode_t mode); + +/* + * Active script + */ + +int sieve_storage_active_script_is_default(struct sieve_storage *storage); + +/* + * Listing scripts + */ + +struct sieve_storage_list_context { + struct sieve_storage *storage; + + bool seen_active:1; // Just present for assertions + bool seen_default:1; +}; + +/* + * Script sequence + */ + +struct sieve_script_sequence { + struct sieve_storage *storage; +}; + +/* + * Saving scripts + */ + +struct sieve_storage_save_context { + pool_t pool; + struct sieve_storage *storage; + struct event *event; + + const char *scriptname, *active_scriptname; + struct sieve_script *scriptobject; + + struct istream *input; + + time_t mtime; + + bool failed:1; + bool finished:1; +}; + +/* + * Storage class + */ + +struct sieve_storage_class_registry; + +void sieve_storages_init(struct sieve_instance *svinst); +void sieve_storages_deinit(struct sieve_instance *svinst); + +void sieve_storage_class_register(struct sieve_instance *svinst, + const struct sieve_storage *storage_class); +void sieve_storage_class_unregister(struct sieve_instance *svinst, + const struct sieve_storage *storage_class); +const struct sieve_storage * +sieve_storage_find_class(struct sieve_instance *svinst, const char *name); + +/* + * Built-in storage drivers + */ + +/* data (currently only for internal use) */ + +#define SIEVE_DATA_STORAGE_DRIVER_NAME "data" + +extern const struct sieve_storage sieve_data_storage; + +/* file */ + +#define SIEVE_FILE_STORAGE_DRIVER_NAME "file" + +extern const struct sieve_storage sieve_file_storage; + +struct sieve_storage * +sieve_file_storage_init_legacy(struct sieve_instance *svinst, + const char *active_path, + const char *storage_path, + enum sieve_storage_flags flags, + enum sieve_error *error_r) ATTR_NULL(6); + +/* dict */ + +#define SIEVE_DICT_STORAGE_DRIVER_NAME "dict" + +extern const struct sieve_storage sieve_dict_storage; + +/* ldap */ + +#define SIEVE_LDAP_STORAGE_DRIVER_NAME "ldap" + +extern const struct sieve_storage sieve_ldap_storage; + +/* + * Error handling + */ + +void sieve_storage_set_internal_error(struct sieve_storage *storage); + +void sieve_storage_copy_error(struct sieve_storage *storage, + const struct sieve_storage *source); + +/* + * Synchronization + */ + +int sieve_storage_sync_init(struct sieve_storage *storage, + struct mail_user *user); +void sieve_storage_sync_deinit(struct sieve_storage *storage); + +int sieve_storage_sync_script_save(struct sieve_storage *storage, + const char *name); +int sieve_storage_sync_script_rename(struct sieve_storage *storage, + const char *oldname, const char *newname); +int sieve_storage_sync_script_delete(struct sieve_storage *storage, + const char *name); + +int sieve_storage_sync_script_activate(struct sieve_storage *storage); +int sieve_storage_sync_deactivate(struct sieve_storage *storage); + +#endif |