diff options
Diffstat (limited to '')
-rw-r--r-- | src/imap/imap-commands.h | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/src/imap/imap-commands.h b/src/imap/imap-commands.h new file mode 100644 index 0000000..651a6df --- /dev/null +++ b/src/imap/imap-commands.h @@ -0,0 +1,137 @@ +#ifndef IMAP_COMMANDS_H +#define IMAP_COMMANDS_H + +struct client_command_context; + +#include "mail-storage.h" +#include "mail-namespace.h" +#include "imap-parser.h" +#include "imap-sync.h" +#include "imap-commands-util.h" + +typedef bool command_func_t(struct client_command_context *cmd); +typedef void command_hook_callback_t(struct client_command_context *ctx); + +enum command_flags { + /* Command uses sequences as its input parameters */ + COMMAND_FLAG_USES_SEQS = 0x01, + /* Command may reply with EXPUNGE, causing sequences to break */ + COMMAND_FLAG_BREAKS_SEQS = 0x02, + /* Command changes the mailbox */ + COMMAND_FLAG_BREAKS_MAILBOX = 0x04 | COMMAND_FLAG_BREAKS_SEQS, + + /* Command uses selected mailbox */ + COMMAND_FLAG_USES_MAILBOX = COMMAND_FLAG_BREAKS_MAILBOX | + COMMAND_FLAG_USES_SEQS, + + /* Command requires mailbox syncing before it can do its job. */ + COMMAND_FLAG_REQUIRES_SYNC = 0x08, + /* Command allows replying with [NONEXISTENT] imap resp code. + Dovecot internally returns it for all kinds of commands, + but unfortunately RFC 5530 specifies it only for "delete something" + operations. */ + COMMAND_FLAG_USE_NONEXISTENT = 0x10 +}; + +struct command { + const char *name; + command_func_t *func; + + enum command_flags flags; +}; +ARRAY_DEFINE_TYPE(command, struct command); + +extern ARRAY_TYPE(command) imap_commands; + +/* Register command. Given name parameter must be permanently stored until + command is unregistered. */ +void command_register(const char *name, command_func_t *func, + enum command_flags flags); +void command_unregister(const char *name); + +/* Register array of commands. */ +void command_register_array(const struct command *cmdarr, unsigned int count); +void command_unregister_array(const struct command *cmdarr, unsigned int count); + +/* Register hook callbacks that are called before and after all commands */ +void command_hook_register(command_hook_callback_t *pre, + command_hook_callback_t *post); +void command_hook_unregister(command_hook_callback_t *pre, + command_hook_callback_t *post); +/* Execute command and hooks */ +bool command_exec(struct client_command_context *cmd); +/* Starts counting command statistics. */ +void command_stats_start(struct client_command_context *cmd); +/* Finish counting command statistics. This is called automatically when + command_exec() returns, but it should be called explicitly if the stats are + needed during command_exec(). */ +void command_stats_flush(struct client_command_context *cmd); + +struct command *command_find(const char *name); + +void commands_init(void); +void commands_deinit(void); + +/* IMAP4rev1 commands: */ + +/* Non-Authenticated State */ +bool cmd_logout(struct client_command_context *cmd); + +bool cmd_capability(struct client_command_context *cmd); +bool cmd_noop(struct client_command_context *cmd); + +/* Authenticated State */ +bool cmd_select(struct client_command_context *cmd); +bool cmd_examine(struct client_command_context *cmd); + +bool cmd_create(struct client_command_context *cmd); +bool cmd_delete(struct client_command_context *cmd); +bool cmd_rename(struct client_command_context *cmd); + +bool cmd_subscribe(struct client_command_context *cmd); +bool cmd_unsubscribe(struct client_command_context *cmd); + +bool cmd_list(struct client_command_context *cmd); +bool cmd_lsub(struct client_command_context *cmd); + +bool cmd_status(struct client_command_context *cmd); +bool cmd_append(struct client_command_context *cmd); + +/* Selected state */ +bool cmd_check(struct client_command_context *cmd); +bool cmd_close(struct client_command_context *cmd); +bool cmd_expunge(struct client_command_context *cmd); +bool cmd_search(struct client_command_context *cmd); +bool cmd_fetch(struct client_command_context *cmd); +bool cmd_store(struct client_command_context *cmd); +bool cmd_copy(struct client_command_context *cmd); +bool cmd_uid(struct client_command_context *cmd); + +/* IMAP extensions: */ +bool cmd_cancelupdate(struct client_command_context *cmd); +bool cmd_enable(struct client_command_context *cmd); +bool cmd_id(struct client_command_context *cmd); +bool cmd_idle(struct client_command_context *cmd); +bool cmd_namespace(struct client_command_context *cmd); +bool cmd_getmetadata(struct client_command_context *cmd); +bool cmd_setmetadata(struct client_command_context *cmd); +bool cmd_notify(struct client_command_context *cmd); +bool cmd_sort(struct client_command_context *cmd); +bool cmd_thread(struct client_command_context *cmd); +bool cmd_uid_expunge(struct client_command_context *cmd); +bool cmd_move(struct client_command_context *cmd); +bool cmd_unselect(struct client_command_context *cmd); +bool cmd_x_cancel(struct client_command_context *cmd); +bool cmd_x_state(struct client_command_context *cmd); + +/* IMAP URLAUTH (RFC4467): */ +bool cmd_genurlauth(struct client_command_context *cmd); +bool cmd_resetkey(struct client_command_context *cmd); +bool cmd_urlfetch(struct client_command_context *cmd); + +/* private: */ +bool cmd_list_full(struct client_command_context *cmd, bool lsub); +bool cmd_select_full(struct client_command_context *cmd, bool readonly); +bool cmd_subscribe_full(struct client_command_context *cmd, bool subscribe); + +#endif |