1 #ifndef DOVEADM_MAIL_H
2 #define DOVEADM_MAIL_H
3 
4 #include <stdio.h>
5 #include "doveadm.h"
6 #include "doveadm-util.h"
7 #include "module-context.h"
8 #include "mail-error.h"
9 #include "mail-storage.h"
10 #include "mail-storage-service.h"
11 
12 struct mailbox;
13 struct mailbox_list;
14 struct mail_storage;
15 struct mail_user;
16 struct doveadm_mail_cmd_context;
17 
18 struct doveadm_mail_cmd_vfuncs {
19 	/* Parse one getopt() parameter. This is called for each parameter. */
20 	bool (*parse_arg)(struct doveadm_mail_cmd_context *ctx, int c);
21 	/* Usually not needed. The preinit() is called just after parsing all
22 	   parameters, but before any userdb lookups are done. This allows the
23 	   preinit() to alter the userdb lookup behavior (especially
24 	   service_flags). */
25 	void (*preinit)(struct doveadm_mail_cmd_context *ctx);
26 	/* Initialize the command. Most importantly if the function prints
27 	   anything, this should initialize the headers. It shouldn't however
28 	   do any actual work. The init() is called also when doveadm is
29 	   performing the work via doveadm-server, which could be running
30 	   remotely with completely different Dovecot configuration. */
31 	void (*init)(struct doveadm_mail_cmd_context *ctx,
32 		     const char *const args[]);
33 	/* Usually not needed. When iterating through multiple users, use this
34 	   function to get the next username. Overriding this is usually done
35 	   only when there's a known username filter, such as the expire
36 	   plugin. */
37 	int (*get_next_user)(struct doveadm_mail_cmd_context *ctx,
38 			     const char **username_r);
39 	/* Usually not needed. This is called between
40 	   mail_storage_service_lookup() and mail_storage_service_next() for
41 	   each user. */
42 	int (*prerun)(struct doveadm_mail_cmd_context *ctx,
43 		      struct mail_storage_service_user *service_user,
44 		      const char **error_r);
45 	/* This is the main function which performs all the work for the
46 	   command. This is called once per each user. */
47 	int (*run)(struct doveadm_mail_cmd_context *ctx,
48 		   struct mail_user *mail_user);
49 	/* Deinitialize the command. Called once at the end - even if
50 	   preinit() or init() was never called. */
51 	void (*deinit)(struct doveadm_mail_cmd_context *ctx);
52 };
53 
54 struct doveadm_mail_cmd_module_register {
55 	unsigned int id;
56 };
57 
58 union doveadm_mail_cmd_module_context {
59         struct doveadm_mail_cmd_vfuncs super;
60 	struct doveadm_mail_cmd_module_register *reg;
61 };
62 
63 struct doveadm_mail_cmd_context {
64 	pool_t pool;
65 	struct doveadm_cmd_context *cctx;
66 	const struct doveadm_mail_cmd *cmd;
67 	const char *const *args;
68 	/* args including -options */
69 	const char *const *full_args;
70 
71 	const char *getopt_args;
72 	const struct doveadm_settings *set;
73 	enum mail_storage_service_flags service_flags;
74 	enum mailbox_transaction_flags transaction_flags;
75 	struct mail_storage_service_ctx *storage_service;
76 	struct mail_storage_service_input storage_service_input;
77 	/* search args aren't set for all mail commands */
78 	struct mail_search_args *search_args;
79 	struct istream *users_list_input;
80 
81 	struct mail_storage_service_user *cur_service_user;
82 	struct mail_user *cur_mail_user;
83 	struct doveadm_mail_cmd_vfuncs v;
84 
85 	struct istream *cmd_input;
86 	int cmd_input_fd;
87 
88 	ARRAY(union doveadm_mail_cmd_module_context *) module_contexts;
89 
90 	/* if non-zero, exit with this code */
91 	int exit_code;
92 
93 	/* This command is being called by a remote doveadm client. */
94 	bool proxying:1;
95 	/* We're handling only a single user */
96 	bool iterate_single_user:1;
97 	/* We're going through all users (not set for wildcard usernames) */
98 	bool iterate_all_users:1;
99 	/* Add username header to all replies */
100 	bool add_username_header:1;
101 };
102 
103 struct doveadm_mail_cmd {
104 	struct doveadm_mail_cmd_context *(*alloc)(void);
105 	const char *name;
106 	const char *usage_args;
107 };
108 
109 extern void (*hook_doveadm_mail_init)(struct doveadm_mail_cmd_context *ctx);
110 extern struct doveadm_mail_cmd_module_register doveadm_mail_cmd_module_register;
111 extern char doveadm_mail_cmd_hide;
112 
113 bool doveadm_is_killed(void);
114 int doveadm_killed_signo(void);
115 
116 void doveadm_mail_help(const struct doveadm_mail_cmd *cmd) ATTR_NORETURN;
117 void doveadm_mail_help_name(const char *cmd_name) ATTR_NORETURN;
118 void doveadm_mail_try_help_name(const char *cmd_name);
119 
120 void doveadm_mail_init(void);
121 void doveadm_mail_init_finish(void);
122 void doveadm_mail_deinit(void);
123 
124 struct doveadm_mail_cmd_context *
125 doveadm_mail_cmd_init(const struct doveadm_mail_cmd *cmd,
126 		      const struct doveadm_settings *set);
127 void doveadm_mail_cmd_deinit(struct doveadm_mail_cmd_context *ctx);
128 void doveadm_mail_cmd_free(struct doveadm_mail_cmd_context *ctx);
129 int doveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx,
130 			     const char **error_r);
131 int doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx,
132 			     const struct mail_storage_service_input *input,
133 			     const char **error_r);
134 void doveadm_mail_server_flush(void);
135 
136 /* Request input stream to be read (from stdin). This must be called from
137    the command's init() function. */
138 void doveadm_mail_get_input(struct doveadm_mail_cmd_context *ctx);
139 
140 struct mailbox *
141 doveadm_mailbox_find(struct mail_user *user, const char *mailbox);
142 struct mail_search_args *
143 doveadm_mail_build_search_args(const char *const args[]);
144 void doveadm_mailbox_args_check(const char *const args[]);
145 struct mail_search_args *
146 doveadm_mail_mailbox_search_args_build(const char *const args[]);
147 
148 void expunge_search_args_check(struct mail_search_args *args, const char *cmd);
149 
150 struct doveadm_mail_cmd_context *
151 doveadm_mail_cmd_alloc_size(size_t size);
152 #define doveadm_mail_cmd_alloc(type) \
153 	(type *)doveadm_mail_cmd_alloc_size(sizeof(type))
154 
155 void doveadm_mail_failed_error(struct doveadm_mail_cmd_context *ctx,
156 			       enum mail_error error);
157 void doveadm_mail_failed_storage(struct doveadm_mail_cmd_context *ctx,
158 				 struct mail_storage *storage);
159 void doveadm_mail_failed_mailbox(struct doveadm_mail_cmd_context *ctx,
160 				 struct mailbox *box);
161 void doveadm_mail_failed_list(struct doveadm_mail_cmd_context *ctx,
162 			      struct mailbox_list *list);
163 
164 extern struct doveadm_cmd_ver2 doveadm_cmd_batch;
165 extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_metadata_set_ver2;
166 extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_metadata_unset_ver2;
167 extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_metadata_get_ver2;
168 extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_metadata_list_ver2;
169 extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_status_ver2;
170 extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_list_ver2;
171 extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_create_ver2;
172 extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_delete_ver2;
173 extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_rename_ver2;
174 extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_subscribe_ver2;
175 extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_unsubscribe_ver2;
176 extern struct doveadm_cmd_ver2 doveadm_cmd_fetch_ver2;
177 extern struct doveadm_cmd_ver2 doveadm_cmd_save_ver2;
178 extern struct doveadm_cmd_ver2 doveadm_cmd_index_ver2;
179 extern struct doveadm_cmd_ver2 doveadm_cmd_altmove_ver2;
180 extern struct doveadm_cmd_ver2 doveadm_cmd_deduplicate_ver2;
181 extern struct doveadm_cmd_ver2 doveadm_cmd_expunge_ver2;
182 extern struct doveadm_cmd_ver2 doveadm_cmd_flags_add_ver2;
183 extern struct doveadm_cmd_ver2 doveadm_cmd_flags_remove_ver2;
184 extern struct doveadm_cmd_ver2 doveadm_cmd_flags_replace_ver2;
185 extern struct doveadm_cmd_ver2 doveadm_cmd_import_ver2;
186 extern struct doveadm_cmd_ver2 doveadm_cmd_search_ver2;
187 extern struct doveadm_cmd_ver2 doveadm_cmd_copy_ver2;
188 extern struct doveadm_cmd_ver2 doveadm_cmd_move_ver2;
189 extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_update_ver2;
190 extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_path_ver2;
191 extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_cache_decision;
192 extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_cache_remove;
193 extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_cache_purge;
194 extern struct doveadm_cmd_ver2 doveadm_cmd_rebuild_attachments;
195 
196 #define DOVEADM_CMD_MAIL_COMMON \
197 DOVEADM_CMD_PARAM('A', "all-users", CMD_PARAM_BOOL, 0) \
198 DOVEADM_CMD_PARAM('S', "socket-path", CMD_PARAM_STR, 0) \
199 DOVEADM_CMD_PARAM('u', "user", CMD_PARAM_STR, 0) \
200 DOVEADM_CMD_PARAM('\0', "trans-flags", CMD_PARAM_INT64, 0) \
201 DOVEADM_CMD_PARAM('F', "user-file", CMD_PARAM_ISTREAM, 0)
202 
203 #define DOVEADM_CMD_MAIL_USAGE_PREFIX \
204 	"[-u <user>|-A] [-S <socket_path>] "
205 
206 #endif
207