doveadm-mail.h revision 26c41874cf6019c3e39f0ed630b2a07a92b2635f
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch#ifndef DOVEADM_MAIL_H
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen#define DOVEADM_MAIL_H
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen#include <stdio.h>
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen#include "doveadm.h"
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen#include "doveadm-util.h"
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen#include "module-context.h"
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen#include "mail-error.h"
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen#include "mail-storage-service.h"
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainenstruct mailbox;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainenstruct mailbox_list;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainenstruct mail_storage;
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainenstruct mail_user;
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainenstruct doveadm_mail_cmd_context;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainenstruct doveadm_mail_cmd_vfuncs {
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen /* Parse one getopt() parameter. This is called for each parameter. */
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen bool (*parse_arg)(struct doveadm_mail_cmd_context *ctx, int c);
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen /* Usually not needed. The preinit() is called just after parsing all
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen parameters, but before any userdb lookups are done. This allows the
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen preinit() to alter the userdb lookup behavior (especially
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen service_flags). */
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen void (*preinit)(struct doveadm_mail_cmd_context *ctx);
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen /* Initialize the command. Most importantly if the function prints
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen anything, this should initialize the headers. It shouldn't however
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen do any actual work. The init() is called also when doveadm is
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen performing the work via doveadm-server, which could be running
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen remotely with completely different Dovecot configuration. */
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen void (*init)(struct doveadm_mail_cmd_context *ctx,
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen const char *const args[]);
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen /* Usually not needed. When iterating through multiple users, use this
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen function to get the next username. Overriding this is usually done
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen only when there's a known username filter, such as the expire
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen plugin. */
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen int (*get_next_user)(struct doveadm_mail_cmd_context *ctx,
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen const char **username_r);
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen /* Usually not needed. This is called between
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen mail_storage_service_lookup() and mail_storage_service_next() for
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen each user. */
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen int (*prerun)(struct doveadm_mail_cmd_context *ctx,
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen struct mail_storage_service_user *service_user,
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen const char **error_r);
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen /* This is the main function which performs all the work for the
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen command. This is called once per each user. */
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen int (*run)(struct doveadm_mail_cmd_context *ctx,
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen struct mail_user *mail_user);
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen /* Deinitialize the command. Called once at the end - even if
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen preinit() or init() was never called. */
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen void (*deinit)(struct doveadm_mail_cmd_context *ctx);
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen};
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainenstruct doveadm_mail_cmd_module_register {
bcd286622779a93f809b11993db0550f8c7cc9b5Timo Sirainen unsigned int id;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen};
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainenunion doveadm_mail_cmd_module_context {
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen struct doveadm_mail_cmd_vfuncs super;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen struct doveadm_mail_cmd_module_register *reg;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen};
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainenstruct doveadm_mail_cmd_context {
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen pool_t pool;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen const struct doveadm_mail_cmd *cmd;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen const char *const *args;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen /* args including -options */
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen const char *const *full_args;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen /* connection via doveadm-server */
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen struct client_connection *conn;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen const char *getopt_args;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen const struct doveadm_settings *set;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen enum mail_storage_service_flags service_flags;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen struct mail_storage_service_ctx *storage_service;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen struct mail_storage_service_input storage_service_input;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen /* search args aren't set for all mail commands */
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen struct mail_search_args *search_args;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen struct istream *users_list_input;
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen struct ip_addr cur_client_ip;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen const char *cur_username;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen struct mail_storage_service_user *cur_service_user;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen struct mail_user *cur_mail_user;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen struct doveadm_mail_cmd_vfuncs v;
e93184a9055c2530366dfe617e07199603c399ddMartti Rannanjärvi
e93184a9055c2530366dfe617e07199603c399ddMartti Rannanjärvi struct istream *cmd_input;
e93184a9055c2530366dfe617e07199603c399ddMartti Rannanjärvi int cmd_input_fd;
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen ARRAY(union doveadm_mail_cmd_module_context *) module_contexts;
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen /* if non-zero, exit with this code */
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen int exit_code;
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen /* This command is being called by a remote doveadm client. */
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen bool proxying:1;
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen /* We're handling only a single user */
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen bool iterate_single_user:1;
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen /* We're going through all users (not set for wildcard usernames) */
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen bool iterate_all_users:1;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen /* Add username header to all replies */
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen bool add_username_header:1;
5df8396a7cbad0b38b83a86667fb3d4c223f6f7cTimo Sirainen /* Running from CLI doveadm (not doveadm-server) */
5df8396a7cbad0b38b83a86667fb3d4c223f6f7cTimo Sirainen bool cli:1;
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen /* Allow empty mailbox name - to allow access to server attributes */
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen bool allow_empty_mailbox_name:1;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen};
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainenstruct doveadm_mail_cmd {
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen struct doveadm_mail_cmd_context *(*alloc)(void);
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen const char *name;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen const char *usage_args;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen};
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo SirainenARRAY_DEFINE_TYPE(doveadm_mail_cmd, struct doveadm_mail_cmd);
2974dca6be5120e49279f06c8aa952e5fac56048Timo Sirainen
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainenextern ARRAY_TYPE(doveadm_mail_cmd) doveadm_mail_cmds;
extern void (*hook_doveadm_mail_init)(struct doveadm_mail_cmd_context *ctx);
extern struct doveadm_mail_cmd_module_register doveadm_mail_cmd_module_register;
extern char doveadm_mail_cmd_hide;
bool doveadm_is_killed(void);
int doveadm_killed_signo(void);
bool doveadm_mail_try_run(const char *cmd_name, int argc, char *argv[]);
void doveadm_mail_register_cmd(const struct doveadm_mail_cmd *cmd);
const struct doveadm_mail_cmd *doveadm_mail_cmd_find(const char *cmd_name);
void doveadm_mail_usage(string_t *out);
void doveadm_mail_help(const struct doveadm_mail_cmd *cmd) ATTR_NORETURN;
void doveadm_mail_help_name(const char *cmd_name) ATTR_NORETURN;
void doveadm_mail_try_help_name(const char *cmd_name);
bool doveadm_mail_has_subcommands(const char *cmd_name);
void doveadm_mail_init(void);
void doveadm_mail_deinit(void);
const struct doveadm_mail_cmd *
doveadm_mail_cmd_find_from_argv(const char *cmd_name, int *argc,
const char *const **argv);
struct doveadm_mail_cmd_context *
doveadm_mail_cmd_init(const struct doveadm_mail_cmd *cmd,
const struct doveadm_settings *set);
int doveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx,
const struct doveadm_cmd_context *cctx,
const char **error_r);
int doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx,
const struct mail_storage_service_input *input,
const char **error_r);
void doveadm_mail_server_flush(void);
/* Request input stream to be read (from stdin). This must be called from
the command's init() function. */
void doveadm_mail_get_input(struct doveadm_mail_cmd_context *ctx);
struct mailbox *
doveadm_mailbox_find(struct mail_user *user, const char *mailbox);
struct mail_search_args *
doveadm_mail_build_search_args(const char *const args[]);
void doveadm_mailbox_args_check(const char *const args[]);
struct mail_search_args *
doveadm_mail_mailbox_search_args_build(const char *const args[]);
void expunge_search_args_check(struct mail_search_args *args, const char *cmd);
struct doveadm_mail_cmd_context *
doveadm_mail_cmd_alloc_size(size_t size);
#define doveadm_mail_cmd_alloc(type) \
(type *)doveadm_mail_cmd_alloc_size(sizeof(type))
void doveadm_mail_failed_error(struct doveadm_mail_cmd_context *ctx,
enum mail_error error);
void doveadm_mail_failed_storage(struct doveadm_mail_cmd_context *ctx,
struct mail_storage *storage);
void doveadm_mail_failed_mailbox(struct doveadm_mail_cmd_context *ctx,
struct mailbox *box);
void doveadm_mail_failed_list(struct doveadm_mail_cmd_context *ctx,
struct mailbox_list *list);
extern struct doveadm_mail_cmd cmd_batch;
extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_metadata_set_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_metadata_unset_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_metadata_get_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_metadata_list_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_status_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_list_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_create_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_delete_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_rename_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_subscribe_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_unsubscribe_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_fetch_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_save_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_index_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_altmove_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_deduplicate_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_expunge_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_flags_add_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_flags_remove_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_flags_replace_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_import_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_search_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_copy_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_move_ver2;
extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_update_ver2;
#define DOVEADM_CMD_MAIL_COMMON \
DOVEADM_CMD_PARAM('A', "all-users", CMD_PARAM_BOOL, 0) \
DOVEADM_CMD_PARAM('S', "socket-path", CMD_PARAM_STR, 0) \
DOVEADM_CMD_PARAM('u', "user", CMD_PARAM_STR, 0) \
DOVEADM_CMD_PARAM('F', "user-file", CMD_PARAM_ISTREAM, 0)
#define DOVEADM_CMD_MAIL_USAGE_PREFIX \
"[-u <user>|-A] [-S <socket_path>] "
#endif