pop3c-storage.c revision 95d62f8d6d281cc488dc4f488d4388701e559012
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen/* Copyright (c) 2011-2017 Dovecot authors, see the included COPYING file */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic struct mail_storage *pop3c_storage_alloc(void)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen pool = pool_alloconly_create("pop3c storage", 512+256);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen storage = p_new(pool, struct pop3c_storage, 1);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenpop3c_storage_create(struct mail_storage *_storage,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen const char **error_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct pop3c_storage *storage = POP3C_STORAGE(_storage);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen storage->set = mail_namespace_get_driver_settings(ns, _storage);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (storage->set->pop3c_password[0] == '\0') {
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenpop3c_client_create_from_set(struct mail_storage *storage,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen client_set.master_user = set->pop3c_master_user;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen storage->user->set->base_dir[0] == '\0' ? "" :
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen t_strconcat(storage->user->set->base_dir, "/",
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen mail_user_set_get_temp_prefix(str, storage->user->set);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen mail_user_home_expand(storage->user, set->pop3c_rawlog_dir);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen client_set.ssl_ca_dir = storage->set->ssl_client_ca_dir;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen client_set.ssl_ca_file = storage->set->ssl_client_ca_file;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen client_set.ssl_verify = set->pop3c_ssl_verify;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen client_set.ssl_mode = POP3C_CLIENT_SSL_MODE_IMMEDIATE;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen else if (strcmp(set->pop3c_ssl, "starttls") == 0)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen client_set.ssl_mode = POP3C_CLIENT_SSL_MODE_STARTTLS;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen client_set.ssl_mode = POP3C_CLIENT_SSL_MODE_NONE;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen client_set.ssl_crypto_device = storage->set->ssl_crypto_device;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenpop3c_storage_get_list_settings(const struct mail_namespace *ns,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (set->root_dir != NULL && *set->root_dir != '\0' &&
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* we don't really care about root_dir, but we
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen just need to get index_dir autocreated.
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen it happens when index_dir differs from root_dir. */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic struct mailbox *
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenpop3c_mailbox_alloc(struct mail_storage *storage, struct mailbox_list *list,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen pool = pool_alloconly_create("pop3c mailbox", 1024*3);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen index_storage_mailbox_alloc(&mbox->box, vname, flags, MAIL_INDEX_PREFIX);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenpop3c_mailbox_exists(struct mailbox *box, bool auto_boxes ATTR_UNUSED,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic void pop3c_login_callback(enum pop3c_command_state state,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* authentication failure probably */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen "pop3c: Disconnected from remote server");
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic int pop3c_mailbox_open(struct mailbox *box)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct pop3c_mailbox *mbox = POP3C_MAILBOX(box);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen mail_storage_set_error(box->storage, MAIL_ERROR_NOTFOUND,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (index_storage_mailbox_open(box, FALSE) < 0)
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen mbox->client = pop3c_client_create_from_set(box->storage,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen pop3c_client_login(mbox->client, pop3c_login_callback, mbox);
e8bdf1be00aec45d0c6dd72ad9c8be02a3dfc778Timo Sirainenstatic void pop3c_mailbox_close(struct mailbox *box)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct pop3c_mailbox *mbox = POP3C_MAILBOX(box);
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen const struct mailbox_update *update ATTR_UNUSED,
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen mail_storage_set_error(box->storage, MAIL_ERROR_NOTPOSSIBLE,
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen "POP3 mailbox creation isn't supported");
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen const struct mailbox_update *update ATTR_UNUSED)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (!guid_128_is_empty(update->mailbox_guid) ||
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen update->uid_validity != 0 || update->min_next_uid != 0 ||
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen mail_storage_set_error(box->storage, MAIL_ERROR_NOTPOSSIBLE,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "POP3 mailbox update isn't supported");
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen return index_storage_mailbox_update(box, update);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic int pop3c_mailbox_get_status(struct mailbox *box,
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen struct pop3c_mailbox *mbox = POP3C_MAILBOX(box);
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainen if (index_storage_get_status(box, items, status_r) < 0)
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainen if ((pop3c_client_get_capabilities(mbox->client) &
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainenstatic int pop3c_mailbox_get_metadata(struct mailbox *box,
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen /* a bit ugly way to do this, but better than nothing for now.
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen FIXME: if indexes are enabled, keep this there. */
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen mail_generate_guid_128_hash(box->name, metadata_r->guid);
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen if (index_mailbox_get_metadata(box, items, metadata_r) < 0)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic void pop3c_notify_changes(struct mailbox *box ATTR_UNUSED)
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainenpop3c_save_alloc(struct mailbox_transaction_context *t)
0b3662995e9fa0d0d857ec5350ce2b1ee6d3b94fTimo Sirainenpop3c_save_begin(struct mail_save_context *ctx,
0b3662995e9fa0d0d857ec5350ce2b1ee6d3b94fTimo Sirainen mail_storage_set_error(ctx->transaction->box->storage,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen MAIL_ERROR_NOTPOSSIBLE, "POP3 doesn't support saving mails");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic int pop3c_save_continue(struct mail_save_context *ctx ATTR_UNUSED)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic int pop3c_save_finish(struct mail_save_context *ctx)
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainenpop3c_save_cancel(struct mail_save_context *ctx)
4b43f50117630aa12b3cfd0cbd05ae22ba27fec1Timo Sirainenstatic bool pop3c_storage_is_inconsistent(struct mailbox *box)
4b43f50117630aa12b3cfd0cbd05ae22ba27fec1Timo Sirainen struct pop3c_mailbox *mbox = POP3C_MAILBOX(box);