summaryrefslogtreecommitdiffstats
path: root/pigeonhole/src/lib-sieve/sieve-storage-private.h
diff options
context:
space:
mode:
Diffstat (limited to 'pigeonhole/src/lib-sieve/sieve-storage-private.h')
-rw-r--r--pigeonhole/src/lib-sieve/sieve-storage-private.h256
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