expire-tool.c revision 796363ab199a7e728ef334ba1fed69da2d97c0d7
2e37d45867d081db150ab78dad303b9077aea24fTimo Sirainen/* Copyright (c) 2006-2008 Dovecot authors, see the included COPYING file */
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen#include "lib.h"
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen#include "ioloop.h"
afb7901ecb5d5566d4cf19be969654946fbaad4bTimo Sirainen#include "env-util.h"
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen#include "file-lock.h"
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen#include "randgen.h"
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen#include "lib-signals.h"
994bb1a8a80da664083691d41dd9aec5d6fba2bfTimo Sirainen#include "dict-client.h"
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen#include "mail-index.h"
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen#include "mail-search-build.h"
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen#include "mail-storage.h"
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen#include "mail-namespace.h"
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen#include "auth-client.h"
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen#include "expire-env.h"
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen
39afc7584d935b2dc7332c21966a7b20da03f1ecTimo Sirainen#include <stdlib.h>
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen
b66412da78711db8423288847ecfb08469609a03Timo Sirainen/* ugly, but automake doesn't like having it built as both static and
b66412da78711db8423288847ecfb08469609a03Timo Sirainen dynamic object.. */
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen#include "expire-env.c"
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen#define DEFAULT_AUTH_SOCKET_PATH PKG_RUNDIR"/auth-master"
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainenstruct expire_context {
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen struct auth_connection *auth_conn;
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen
39afc7584d935b2dc7332c21966a7b20da03f1ecTimo Sirainen char *user;
39afc7584d935b2dc7332c21966a7b20da03f1ecTimo Sirainen struct mail_user *mail_user;
39afc7584d935b2dc7332c21966a7b20da03f1ecTimo Sirainen bool testrun;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen};
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainenstatic int user_init(struct expire_context *ctx, const char *user)
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen{
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen int ret;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen env_clean();
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if ((ret = auth_client_put_user_env(ctx->auth_conn, user)) <= 0) {
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if (ret < 0)
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen return ret;
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen
4babe70b863c71ea330cbf32ac0b71876f4f9137Timo Sirainen /* user no longer exists */
4babe70b863c71ea330cbf32ac0b71876f4f9137Timo Sirainen return 0;
4babe70b863c71ea330cbf32ac0b71876f4f9137Timo Sirainen }
4babe70b863c71ea330cbf32ac0b71876f4f9137Timo Sirainen
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen ctx->mail_user = mail_user_init(user, getenv("HOME"));
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen if (mail_namespaces_init(ctx->mail_user) < 0)
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen return -1;
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen return 1;
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen}
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainenstatic void user_deinit(struct expire_context *ctx)
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen{
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen mail_user_deinit(&ctx->mail_user);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen i_free_and_null(ctx->user);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen}
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainenstatic int
39afc7584d935b2dc7332c21966a7b20da03f1ecTimo Sirainenmailbox_delete_old_mails(struct expire_context *ctx, const char *user,
39afc7584d935b2dc7332c21966a7b20da03f1ecTimo Sirainen const char *mailbox,
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen unsigned int expunge_secs, unsigned int altmove_secs,
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen time_t *oldest_r)
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen{
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen struct mail_namespace *ns;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen struct mailbox *box;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen struct mail_search_context *search_ctx;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen struct mailbox_transaction_context *t;
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen struct mail_search_args *search_args;
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen struct mail *mail;
4babe70b863c71ea330cbf32ac0b71876f4f9137Timo Sirainen const char *ns_mailbox;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen time_t now, save_time;
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen enum mail_error error;
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen enum mail_flags flags;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen int ret;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen *oldest_r = 0;
b66412da78711db8423288847ecfb08469609a03Timo Sirainen
b66412da78711db8423288847ecfb08469609a03Timo Sirainen if (ctx->user != NULL && strcmp(user, ctx->user) != 0)
b66412da78711db8423288847ecfb08469609a03Timo Sirainen user_deinit(ctx);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if (ctx->user == NULL) {
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if ((ret = user_init(ctx, user)) <= 0) {
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if (ctx->testrun)
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen i_info("User lookup failed: %s", user);
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen return ret;
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen }
afb7901ecb5d5566d4cf19be969654946fbaad4bTimo Sirainen ctx->user = i_strdup(user);
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen }
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen ns_mailbox = mailbox;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen ns = mail_namespace_find(ctx->mail_user->namespaces, &ns_mailbox);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if (ns == NULL) {
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen /* entire namespace no longer exists, remove the entry */
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if (ctx->testrun)
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen i_info("Namespace lookup failed: %s", mailbox);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen return 0;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen }
b66412da78711db8423288847ecfb08469609a03Timo Sirainen
b66412da78711db8423288847ecfb08469609a03Timo Sirainen box = mailbox_open(ns->storage, ns_mailbox, NULL, 0);
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen if (box == NULL) {
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen (void)mail_storage_get_last_error(ns->storage, &error);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if (error != MAIL_ERROR_NOTFOUND)
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen return -1;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen /* mailbox no longer exists, remove the entry */
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen return 0;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen }
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen search_args = mail_search_build_init();
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen mail_search_build_add_all(search_args);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen t = mailbox_transaction_begin(box, 0);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen search_ctx = mailbox_search_init(t, search_args, NULL);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen mail_search_args_unref(&search_args);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
b66412da78711db8423288847ecfb08469609a03Timo Sirainen mail = mail_alloc(t, 0, NULL);
b66412da78711db8423288847ecfb08469609a03Timo Sirainen
b66412da78711db8423288847ecfb08469609a03Timo Sirainen now = time(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 if (ctx->testrun) {
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen i_info("%s: seq=%u uid=%u: "
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen "Save date lookup failed",
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen mailbox, mail->seq, mail->uid);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen }
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen ret = -1;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen break;
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen }
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if (save_time + (time_t)expunge_secs <= now &&
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen expunge_secs != 0) {
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen if (!ctx->testrun)
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen mail_expunge(mail);
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen else {
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen i_info("%s: seq=%u uid=%u: Expunge",
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen mailbox, mail->seq, mail->uid);
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen }
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen } else if (save_time + (time_t)altmove_secs <= now &&
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen altmove_secs != 0) {
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen /* works only with dbox */
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen flags = mail_get_flags(mail);
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen if ((flags & MAIL_INDEX_MAIL_FLAG_BACKEND) != 0) {
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen /* alread moved */
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen } else if (!ctx->testrun) {
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen mail_update_flags(mail, MODIFY_ADD,
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen MAIL_INDEX_MAIL_FLAG_BACKEND);
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen } else {
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen i_info("%s: seq=%u uid=%u: Move to alt dir",
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen mailbox, mail->seq, mail->uid);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen }
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen } else {
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen /* first non-expired one. */
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen *oldest_r = save_time;
b66412da78711db8423288847ecfb08469609a03Timo Sirainen break;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen }
b66412da78711db8423288847ecfb08469609a03Timo Sirainen }
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen mail_free(&mail);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
b66412da78711db8423288847ecfb08469609a03Timo Sirainen if (mailbox_search_deinit(&search_ctx) < 0)
b66412da78711db8423288847ecfb08469609a03Timo Sirainen ret = -1;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if (!ctx->testrun) {
b66412da78711db8423288847ecfb08469609a03Timo Sirainen if (mailbox_transaction_commit(&t) < 0)
b66412da78711db8423288847ecfb08469609a03Timo Sirainen ret = -1;
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen } else {
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen mailbox_transaction_rollback(&t);
b66412da78711db8423288847ecfb08469609a03Timo Sirainen }
b66412da78711db8423288847ecfb08469609a03Timo Sirainen
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FAST, 0, NULL) < 0)
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen ret = -1;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen mailbox_close(&box);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen return ret < 0 ? -1 : 0;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen}
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
5bd2cf0f30371cb0374b026322a6f52fdb20755fTimo Sirainenstatic void expire_run(bool testrun)
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen{
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen struct expire_context ctx;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen struct dict *dict = NULL;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen struct dict_transaction_context *trans;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen struct dict_iterate_context *iter;
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen struct expire_env *env;
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen time_t oldest;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen unsigned int expunge_secs, altmove_secs;
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen const char *auth_socket, *p, *key, *value;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen const char *userp, *mailbox;
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen int ret;
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen dict_driver_register(&dict_driver_client);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen mail_storage_init();
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen mail_storage_register_all();
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen mailbox_list_register_all();
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen if (getenv("EXPIRE") == NULL && getenv("EXPIRE_ALTMOVE") == NULL)
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen i_fatal("expire and expire_altmove settings not set");
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen if (getenv("EXPIRE_DICT") == NULL)
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen i_fatal("expire_dict setting not set");
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen auth_socket = getenv("AUTH_SOCKET_PATH");
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen if (auth_socket == NULL)
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen auth_socket = DEFAULT_AUTH_SOCKET_PATH;
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen memset(&ctx, 0, sizeof(ctx));
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen ctx.testrun = testrun;
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 if (dict == NULL)
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen i_fatal("dict_init() failed");
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen trans = dict_transaction_begin(dict);
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen iter = dict_iterate_init(dict, DICT_EXPIRE_PREFIX,
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen DICT_ITERATE_FLAG_RECURSE |
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen DICT_ITERATE_FLAG_SORT_BY_VALUE);
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen
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 userp = key + strlen(DICT_EXPIRE_PREFIX);
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen p = strchr(userp, '/');
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen if (p == NULL) {
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen i_error("Expire dictionary contains invalid key: %s",
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen key);
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen continue;
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen }
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen mailbox = p + 1;
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen if (!expire_box_find(env, mailbox,
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen &expunge_secs, &altmove_secs)) {
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen /* we're no longer expunging old messages from here */
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen if (!testrun)
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen dict_unset(trans, key);
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen else
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen i_info("%s: removed from config", mailbox);
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen continue;
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen }
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 if (testrun) {
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen i_info("%s: stop, expire time in future: %s",
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen mailbox, value);
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen }
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen break;
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen }
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen T_BEGIN {
9c0716dfcd6b575419776848dd7157186ef58d57Timo Sirainen const char *username;
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen username = t_strdup_until(userp, p);
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen ret = mailbox_delete_old_mails(&ctx, username,
b66412da78711db8423288847ecfb08469609a03Timo Sirainen mailbox, expunge_secs,
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen altmove_secs, &oldest);
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen } T_END;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
b66412da78711db8423288847ecfb08469609a03Timo Sirainen if (ret < 0) {
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen /* failed to update */
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen } else if (oldest == 0) {
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen /* no more messages or mailbox deleted */
afb7901ecb5d5566d4cf19be969654946fbaad4bTimo Sirainen if (!testrun)
afb7901ecb5d5566d4cf19be969654946fbaad4bTimo Sirainen dict_unset(trans, key);
afb7901ecb5d5566d4cf19be969654946fbaad4bTimo Sirainen else
afb7901ecb5d5566d4cf19be969654946fbaad4bTimo Sirainen i_info("%s: no messages left", mailbox);
afb7901ecb5d5566d4cf19be969654946fbaad4bTimo Sirainen } else {
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen char new_value[MAX_INT_STRLEN];
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen
b66412da78711db8423288847ecfb08469609a03Timo Sirainen oldest += altmove_secs != 0 ?
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen altmove_secs : expunge_secs;
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen i_snprintf(new_value, sizeof(new_value), "%lu",
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen (unsigned long)oldest);
b66412da78711db8423288847ecfb08469609a03Timo Sirainen if (strcmp(value, new_value) == 0) {
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen /* no change */
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen } else if (!testrun)
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen dict_set(trans, key, new_value);
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen else {
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen i_info("%s: timestamp %s -> %s",
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen mailbox, value, new_value);
b66412da78711db8423288847ecfb08469609a03Timo Sirainen }
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen }
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen }
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen dict_iterate_deinit(&iter);
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen if (!testrun)
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen dict_transaction_commit(&trans);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen else
b66412da78711db8423288847ecfb08469609a03Timo Sirainen dict_transaction_rollback(&trans);
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen dict_deinit(&dict);
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen if (ctx.user != NULL)
b66412da78711db8423288847ecfb08469609a03Timo Sirainen user_deinit(&ctx);
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen auth_connection_deinit(ctx.auth_conn);
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen mail_storage_deinit();
b66412da78711db8423288847ecfb08469609a03Timo Sirainen dict_driver_unregister(&dict_driver_client);
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen}
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainenint main(int argc ATTR_UNUSED, const char *argv[])
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen{
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen struct ioloop *ioloop;
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen bool test = FALSE;
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen lib_init();
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen lib_signals_init();
afb7901ecb5d5566d4cf19be969654946fbaad4bTimo Sirainen random_init();
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen while (argv[1] != NULL) {
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen if (strcmp(argv[1], "--test") == 0)
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen test = TRUE;
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen else
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen i_fatal("Unknown parameter: %s", argv[1]);
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen argv++;
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen }
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen ioloop = io_loop_create();
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen expire_run(test);
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen io_loop_destroy(&ioloop);
d6cc34b076dced6ebf8af47d72c8242357288312Timo Sirainen
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen lib_signals_deinit();
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen lib_deinit();
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen return 0;
b58fbcc79c40f867eccae98548fcd25a16823433Timo Sirainen}
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen