expire-tool.c revision 796363ab199a7e728ef334ba1fed69da2d97c0d7
2e37d45867d081db150ab78dad303b9077aea24fTimo Sirainen/* Copyright (c) 2006-2008 Dovecot authors, see the included COPYING file */
b66412da78711db8423288847ecfb08469609a03Timo Sirainen/* ugly, but automake doesn't like having it built as both static and
b66412da78711db8423288847ecfb08469609a03Timo Sirainen dynamic object.. */
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen#define DEFAULT_AUTH_SOCKET_PATH PKG_RUNDIR"/auth-master"
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainenstatic int user_init(struct expire_context *ctx, const char *user)
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if ((ret = auth_client_put_user_env(ctx->auth_conn, user)) <= 0) {
4babe70b863c71ea330cbf32ac0b71876f4f9137Timo Sirainen /* user no longer exists */
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen ctx->mail_user = mail_user_init(user, getenv("HOME"));
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainenstatic void user_deinit(struct expire_context *ctx)
39afc7584d935b2dc7332c21966a7b20da03f1ecTimo Sirainenmailbox_delete_old_mails(struct expire_context *ctx, const char *user,
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen unsigned int expunge_secs, unsigned int altmove_secs,
b66412da78711db8423288847ecfb08469609a03Timo Sirainen if (ctx->user != NULL && strcmp(user, ctx->user) != 0)
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen ns = mail_namespace_find(ctx->mail_user->namespaces, &ns_mailbox);
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen /* entire namespace no longer exists, remove the entry */
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen i_info("Namespace lookup failed: %s", mailbox);
b66412da78711db8423288847ecfb08469609a03Timo Sirainen box = mailbox_open(ns->storage, ns_mailbox, NULL, 0);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen (void)mail_storage_get_last_error(ns->storage, &error);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen /* mailbox no longer exists, remove the entry */
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen search_ctx = mailbox_search_init(t, search_args, NULL);
b66412da78711db8423288847ecfb08469609a03Timo Sirainen while ((ret = mailbox_search_next(search_ctx, mail)) > 0) {
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if (mail_get_save_date(mail, &save_time) < 0) {
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen /* maybe just got expunged. anyway try again later. */
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen "Save date lookup failed",
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if (save_time + (time_t)expunge_secs <= now &&
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen } else if (save_time + (time_t)altmove_secs <= now &&
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen /* works only with dbox */
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen if ((flags & MAIL_INDEX_MAIL_FLAG_BACKEND) != 0) {
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen /* alread moved */
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen /* first non-expired one. */
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FAST, 0, NULL) < 0)
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen if (getenv("EXPIRE") == NULL && getenv("EXPIRE_ALTMOVE") == NULL)
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen i_fatal("expire and expire_altmove settings not set");
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen ctx.auth_conn = auth_connection_init(auth_socket);
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen env = expire_env_init(getenv("EXPIRE"), getenv("EXPIRE_ALTMOVE"));
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen dict = dict_init(getenv("EXPIRE_DICT"), DICT_DATA_TYPE_UINT32, "");
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen iter = dict_iterate_init(dict, DICT_EXPIRE_PREFIX,
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen /* We'll get the oldest values (timestamps) first */
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen while (dict_iterate(iter, &key, &value) > 0) {
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen /* key = DICT_EXPIRE_PREFIX<user>/<mailbox> */
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen i_error("Expire dictionary contains invalid key: %s",
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen /* we're no longer expunging old messages from here */
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if (time(NULL) < (time_t)strtoul(value, NULL, 10)) {
b66412da78711db8423288847ecfb08469609a03Timo Sirainen /* this and the rest of the timestamps are in future,
b66412da78711db8423288847ecfb08469609a03Timo Sirainen so stop processing */
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen ret = mailbox_delete_old_mails(&ctx, username,
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen /* failed to update */
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen } else if (oldest == 0) {
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen /* no more messages or mailbox deleted */
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen i_snprintf(new_value, sizeof(new_value), "%lu",
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen (unsigned long)oldest);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen /* no change */
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainenint main(int argc ATTR_UNUSED, const char *argv[])