imapc-storage.c revision 5235a79ca4ea7a9bc7e64bd17ed1617357a25034
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* Copyright (c) 2011 Dovecot authors, see the included COPYING file */
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher#define DNS_CLIENT_SOCKET_NAME "dns-client"
d3da1c165cdb4c1ec126a8f4b6b544ca415b9d20Pavel Březinastatic struct imapc_resp_code_map imapc_resp_code_map[] = {
d3da1c165cdb4c1ec126a8f4b6b544ca415b9d20Pavel Březina { IMAP_RESP_CODE_UNAVAILABLE, MAIL_ERROR_TEMP },
d3da1c165cdb4c1ec126a8f4b6b544ca415b9d20Pavel Březina { IMAP_RESP_CODE_AUTHFAILED, MAIL_ERROR_PERM },
1183d29d87c5c7439cf2364b7d7324d4a13b6e35Stephen Gallagher { IMAP_RESP_CODE_AUTHZFAILED, MAIL_ERROR_PERM },
1183d29d87c5c7439cf2364b7d7324d4a13b6e35Stephen Gallagher { IMAP_RESP_CODE_EXPIRED, MAIL_ERROR_PERM },
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { IMAP_RESP_CODE_PRIVACYREQUIRED, MAIL_ERROR_PERM },
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { IMAP_RESP_CODE_CONTACTADMIN, MAIL_ERROR_PERM },
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { IMAP_RESP_CODE_NOPERM, MAIL_ERROR_PERM },
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { IMAP_RESP_CODE_INUSE, MAIL_ERROR_INUSE },
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { IMAP_RESP_CODE_EXPUNGEISSUED, MAIL_ERROR_EXPUNGED },
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { IMAP_RESP_CODE_CORRUPTION, MAIL_ERROR_TEMP },
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { IMAP_RESP_CODE_SERVERBUG, MAIL_ERROR_TEMP },
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* { IMAP_RESP_CODE_CLIENTBUG, 0 }, */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { IMAP_RESP_CODE_CANNOT, MAIL_ERROR_NOTPOSSIBLE },
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { IMAP_RESP_CODE_LIMIT, MAIL_ERROR_NOTPOSSIBLE },
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { IMAP_RESP_CODE_OVERQUOTA, MAIL_ERROR_NOSPACE },
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { IMAP_RESP_CODE_ALREADYEXISTS, MAIL_ERROR_EXISTS },
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { IMAP_RESP_CODE_NONEXISTENT, MAIL_ERROR_NOTFOUND }
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorcestatic void imapc_untagged_status(const struct imapc_untagged_reply *reply,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherimap_resp_text_code_parse(const char *str, enum mail_error *error_r)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int i;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0; i < N_ELEMENTS(imapc_resp_code_map); i++) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (strcmp(imapc_resp_code_map[i].code, str) == 0) {
327127bb7fcc07f882209f029e14026de1b23c94Maxim pool = pool_alloconly_create("imapc storage", 512+256);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallaghervoid imapc_copy_error_from_reply(struct imapc_storage *storage,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (imap_resp_text_code_parse(reply->resp_text_key, &error)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher mail_storage_set_error(&storage->storage, error,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher mail_storage_set_error(&storage->storage, default_error,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallaghervoid imapc_simple_callback(const struct imapc_command_reply *reply,
f36078af138f052cd9a30360867b0ebd0805af5eJakub Hrozek else if (reply->state == IMAPC_COMMAND_STATE_NO) {
34c78b745eb349eef2b0f13ef2b722632aebe619Jan Cholasta imapc_copy_error_from_reply(ctx->storage, MAIL_ERROR_PARAMS, reply);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher mail_storage_set_critical(&ctx->storage->storage,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "imapc: Command failed: %s", reply->text_full);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallaghervoid imapc_async_stop_callback(const struct imapc_command_reply *reply,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (reply->state == IMAPC_COMMAND_STATE_OK)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher else if (reply->state == IMAPC_COMMAND_STATE_NO) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher imapc_copy_error_from_reply(storage, MAIL_ERROR_PARAMS, reply);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher mail_storage_set_critical(&storage->storage,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "imapc: Command failed: %s", reply->text_full);
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bosestatic void imapc_storage_untagged_cb(const struct imapc_untagged_reply *reply,
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher struct imapc_mailbox *mbox = reply->untagged_box_context;
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher const struct imapc_storage_event_callback *cb;
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher const struct imapc_mailbox_event_callback *mcb;
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher array_foreach(&storage->untagged_callbacks, cb) {
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher if (strcasecmp(reply->name, cb->name) == 0)
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek array_foreach(&mbox->untagged_callbacks, mcb) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher array_foreach(&mbox->resp_text_callbacks, mcb) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (strcasecmp(reply->resp_text_key, mcb->name) == 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherimapc_storage_create(struct mail_storage *_storage,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct imapc_storage *storage = (struct imapc_storage *)_storage;
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek port = mail_user_plugin_getenv(_storage->user, "imapc_port");
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek *error_r = t_strdup_printf("Invalid port: %s", port);
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek set.username = mail_user_plugin_getenv(_storage->user, "imapc_user");
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek set.password = mail_user_plugin_getenv(_storage->user, "pass");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher t_strconcat(_storage->user->set->base_dir, "/",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher mail_user_set_get_temp_prefix(str, _storage->user->set);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher set.ssl_ca_dir = mail_user_plugin_getenv(_storage->user,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "imapc_ssl_ca_dir");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher value = mail_user_plugin_getenv(_storage->user,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "imapc_ssl_starttls");
5352c9b3609bca63814f9f6f03dbbbadf6c6333aStephen Gallagher storage->list = (struct imapc_mailbox_list *)ns->list;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher storage->client = imapc_client_init(&set);
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek p_array_init(&storage->untagged_callbacks, _storage->pool, 16);
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek imapc_client_register_untagged(storage->client,
505383ec905863bb8f4f563f694b9bf077f9002cJakub Hrozek imapc_storage_register_untagged(storage, "STATUS",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void imapc_storage_destroy(struct mail_storage *_storage)
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce struct imapc_storage *storage = (struct imapc_storage *)_storage;
336879aabae137f9a81304f147fb0d43001654b0Simo Sorcevoid imapc_storage_register_untagged(struct imapc_storage *storage,
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce const char *name,
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce cb = array_append_space(&storage->untagged_callbacks);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher cb->name = p_strdup(storage->storage.pool, name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherimapc_storage_get_list_settings(const struct mail_namespace *ns ATTR_UNUSED,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic struct mailbox *
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherimapc_mailbox_alloc(struct mail_storage *storage, struct mailbox_list *list,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *vname, enum mailbox_flags flags)
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher pool = pool_alloconly_create("imapc mailbox", 1024*3);
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher mbox = p_new(pool, struct imapc_mailbox, 1);
void *context)
bool directory)
if (directory) {
.class_flags = 0,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,