mail.c revision c0225f7f6b43d34dc58c17d3304f0fd60ab89894
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "lib.h"
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen#include "ioloop.h"
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen#include "buffer.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "hex-binary.h"
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen#include "crc32.h"
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen#include "sha1.h"
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen#include "hostpid.h"
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen#include "mail-storage-private.h"
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen#include <time.h>
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstruct mail *mail_alloc(struct mailbox_transaction_context *t,
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen enum mail_fetch_field wanted_fields,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mailbox_header_lookup_ctx *wanted_headers)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return t->box->v.mail_alloc(t, wanted_fields, wanted_headers);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenvoid mail_free(struct mail **mail)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)*mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen p->v.free(*mail);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen *mail = NULL;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenvoid mail_set_seq(struct mail *mail, uint32_t seq)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen p->v.set_seq(mail, seq);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenbool mail_set_uid(struct mail *mail, uint32_t uid)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.set_uid(mail, uid);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenenum mail_flags mail_get_flags(struct mail *mail)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_flags(mail);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenuint64_t mail_get_modseq(struct mail *mail)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_modseq(mail);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenconst char *const *mail_get_keywords(struct mail *mail)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_keywords(mail);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenconst ARRAY_TYPE(keyword_indexes) *mail_get_keyword_indexes(struct mail *mail)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_keyword_indexes(mail);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_parts(struct mail *mail, struct message_part **parts_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_parts(mail, parts_r);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_date(struct mail *mail, time_t *date_r, int *timezone_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen int tz;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (timezone_r == NULL)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen timezone_r = &tz;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_date(mail, date_r, timezone_r);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_received_date(struct mail *mail, time_t *date_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_received_date(mail, date_r);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_save_date(struct mail *mail, time_t *date_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_save_date(mail, date_r);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_virtual_size(struct mail *mail, uoff_t *size_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_virtual_size(mail, size_r);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_physical_size(struct mail *mail, uoff_t *size_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_physical_size(mail, size_r);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_first_header(struct mail *mail, const char *field,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen const char **value_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_first_header(mail, field, FALSE, value_r);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_first_header_utf8(struct mail *mail, const char *field,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen const char **value_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_first_header(mail, field, TRUE, value_r);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_headers(struct mail *mail, const char *field,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen const char *const **value_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_headers(mail, field, FALSE, value_r);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_headers_utf8(struct mail *mail, const char *field,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen const char *const **value_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_headers(mail, field, TRUE, value_r);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_header_stream(struct mail *mail,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mailbox_header_lookup_ctx *headers,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct istream **stream_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_header_stream(mail, headers, stream_r);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_set_aborted(struct mail *mail)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen mail_storage_set_error(mail->box->storage, MAIL_ERROR_NOTPOSSIBLE,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen "Mail field not cached");
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return -1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_stream(struct mail *mail, struct message_size *hdr_size,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct message_size *body_size, struct istream **stream_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return mail_set_aborted(mail);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return p->v.get_stream(mail, hdr_size, body_size, stream_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainenint mail_get_special(struct mail *mail, enum mail_fetch_field field,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char **value_r)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
4dc8837ab37c1a606add1067e21ed868754db4e3Timo Sirainen
8e5fedd9ada47735be8ac0f8af2a66e8528bd776Timo Sirainen return p->v.get_special(mail, field, value_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
e8bdf1be00aec45d0c6dd72ad9c8be02a3dfc778Timo Sirainenvoid mail_update_flags(struct mail *mail, enum modify_type modify_type,
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen enum mail_flags flags)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen
2abfef71398a61e5ed97c23a1ceb71461933ccb8Timo Sirainen p->v.update_flags(mail, modify_type, flags);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid mail_update_keywords(struct mail *mail, enum modify_type modify_type,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_keywords *keywords)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen p->v.update_keywords(mail, modify_type, keywords);
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen}
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainenvoid mail_update_modseq(struct mail *mail, uint64_t min_modseq)
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen{
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen
cbf7138b49d32fce0645dc6523fbb42cc07cb2faTimo Sirainen p->v.update_modseq(mail, min_modseq);
cbf7138b49d32fce0645dc6523fbb42cc07cb2faTimo Sirainen}
b9b48aaaebf6f72dfab567cda073cde8a7b26598Timo Sirainen
b9b48aaaebf6f72dfab567cda073cde8a7b26598Timo Sirainenvoid mail_update_uid(struct mail *mail, uint32_t new_uid)
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen{
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainen
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainen p->v.update_uid(mail, new_uid);
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainen}
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainen
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainenvoid mail_update_pop3_uidl(struct mail *mail, const char *uidl)
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainen{
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainen
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainen if (p->v.update_pop3_uidl != NULL)
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainen p->v.update_pop3_uidl(mail, uidl);
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainenvoid mail_expunge(struct mail *mail)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
e30b748edcef3cf3352478bf21fa8f785bdc773aTimo Sirainen
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen p->v.expunge(mail);
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen}
d4dcb9c30dba354cff7af6d303ecef7698194c55Timo Sirainen
1582b4d531679849bba299c17b6ec9402b7df67dTimo Sirainenvoid mail_set_expunged(struct mail *mail)
1582b4d531679849bba299c17b6ec9402b7df67dTimo Sirainen{
1582b4d531679849bba299c17b6ec9402b7df67dTimo Sirainen mail_storage_set_error(mail->box->storage, MAIL_ERROR_EXPUNGED,
1582b4d531679849bba299c17b6ec9402b7df67dTimo Sirainen "Message was expunged");
9a107dedb8f35727c21b3d1d54475d33f6e2eb1fTimo Sirainen mail->expunged = TRUE;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
9a107dedb8f35727c21b3d1d54475d33f6e2eb1fTimo Sirainenvoid mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field)
9a107dedb8f35727c21b3d1d54475d33f6e2eb1fTimo Sirainen{
9a107dedb8f35727c21b3d1d54475d33f6e2eb1fTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
9a107dedb8f35727c21b3d1d54475d33f6e2eb1fTimo Sirainen
9a107dedb8f35727c21b3d1d54475d33f6e2eb1fTimo Sirainen p->v.set_cache_corrupted(mail, field);
9c7e765845357342923e16351181091028e5930fTimo Sirainen}
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainenconst char *mail_generate_guid_string(void)
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen{
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainen static struct timespec ts = { 0, 0 };
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainen static unsigned int pid = 0;
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainen
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainen /* we'll use the current time in nanoseconds as the initial 64bit
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainen counter. */
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainen if (ts.tv_sec == 0) {
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen if (clock_gettime(CLOCK_REALTIME, &ts) < 0)
b00787191c3c31bebb939c3d00f1fcdb67356c69Timo Sirainen i_fatal("clock_gettime() failed: %m");
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen pid = getpid();
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen } else if ((uint32_t)ts.tv_nsec < (uint32_t)-1) {
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen ts.tv_nsec++;
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen } else {
d22301419109ed4a38351715e6760011421dadecTimo Sirainen ts.tv_sec++;
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen ts.tv_nsec = 0;
ee116df08d0fdab703483e18fe8076b2ef9fd9d7Timo Sirainen }
ee116df08d0fdab703483e18fe8076b2ef9fd9d7Timo Sirainen return t_strdup_printf("%04x%04lx%04x%s",
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen (unsigned int)ts.tv_nsec,
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen (unsigned long)ts.tv_sec,
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen pid, my_hostname);
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen}
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainenvoid mail_generate_guid_128(uint8_t guid[MAIL_GUID_128_SIZE])
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen static struct timespec ts = { 0, 0 };
e30b748edcef3cf3352478bf21fa8f785bdc773aTimo Sirainen static uint8_t guid_static[8];
e30b748edcef3cf3352478bf21fa8f785bdc773aTimo Sirainen uint32_t pid, host_crc;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* we'll use the current time in nanoseconds as the initial 64bit
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen counter. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (ts.tv_sec == 0) {
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen if (clock_gettime(CLOCK_REALTIME, &ts) < 0)
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen i_fatal("clock_gettime() failed: %m");
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen pid = getpid();
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen host_crc = crc32_str(my_hostname);
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen
e30b748edcef3cf3352478bf21fa8f785bdc773aTimo Sirainen guid_static[0] = (pid & 0x000000ff);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen guid_static[1] = (pid & 0x0000ff00) >> 8;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen guid_static[2] = (pid & 0x00ff0000) >> 16;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen guid_static[3] = (pid & 0xff000000) >> 24;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen guid_static[4] = (host_crc & 0x000000ff);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen guid_static[5] = (host_crc & 0x0000ff00) >> 8;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen guid_static[6] = (host_crc & 0x00ff0000) >> 16;
aa62d8779ce53900c2f09bf2ff6fa790bc9f6a89Timo Sirainen guid_static[7] = (host_crc & 0xff000000) >> 24;
ea9fd7f876643e985946a2563140359064819b8eTimo Sirainen } else if ((uint32_t)ts.tv_nsec < (uint32_t)-1) {
ea9fd7f876643e985946a2563140359064819b8eTimo Sirainen ts.tv_nsec++;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } else {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ts.tv_sec++;
4b43f50117630aa12b3cfd0cbd05ae22ba27fec1Timo Sirainen ts.tv_nsec = 0;
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen guid[0] = (ts.tv_nsec & 0x000000ff);
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen guid[1] = (ts.tv_nsec & 0x0000ff00) >> 8;
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen guid[2] = (ts.tv_nsec & 0x00ff0000) >> 16;
e0719fca14e337eee5a0d924bc4e9d53151a7188Timo Sirainen guid[3] = (ts.tv_nsec & 0xff000000) >> 24;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen guid[4] = (ts.tv_sec & 0x000000ff);
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen guid[5] = (ts.tv_sec & 0x0000ff00) >> 8;
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen guid[6] = (ts.tv_sec & 0x00ff0000) >> 16;
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen guid[7] = (ts.tv_sec & 0xff000000) >> 24;
4b43f50117630aa12b3cfd0cbd05ae22ba27fec1Timo Sirainen memcpy(guid + 8, guid_static, 8);
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen}
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen
4b43f50117630aa12b3cfd0cbd05ae22ba27fec1Timo Sirainenvoid mail_generate_guid_128_hash(const char *guid,
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen uint8_t guid_128[MAIL_GUID_128_SIZE])
4b43f50117630aa12b3cfd0cbd05ae22ba27fec1Timo Sirainen{
4b43f50117630aa12b3cfd0cbd05ae22ba27fec1Timo Sirainen unsigned char sha1_sum[SHA1_RESULTLEN];
4b43f50117630aa12b3cfd0cbd05ae22ba27fec1Timo Sirainen buffer_t buf;
4b43f50117630aa12b3cfd0cbd05ae22ba27fec1Timo Sirainen
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen buffer_create_data(&buf, guid_128, MAIL_GUID_128_SIZE);
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen if (strlen(guid) != MAIL_GUID_128_SIZE*2 ||
cbf7138b49d32fce0645dc6523fbb42cc07cb2faTimo Sirainen hex_to_binary(guid, &buf) < 0 ||
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen buf.used != MAIL_GUID_128_SIZE) {
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen /* not 128bit hex. use a hash of it instead. */
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen buffer_set_used_size(&buf, 0);
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen sha1_get_digest(guid, strlen(guid), sha1_sum);
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen#if SHA1_RESULTLEN < DBOX_GUID_BIN_LEN
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen# error not possible
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen#endif
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen buffer_append(&buf,
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen sha1_sum + SHA1_RESULTLEN - MAIL_GUID_128_SIZE,
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen MAIL_GUID_128_SIZE);
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen }
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen}
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainenbool mail_guid_128_is_empty(const uint8_t guid_128[MAIL_GUID_128_SIZE])
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen{
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen unsigned int i;
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen for (i = 0; i < MAIL_GUID_128_SIZE; i++) {
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen if (guid_128[i] != 0)
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen return FALSE;
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen }
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen return TRUE;
4b43f50117630aa12b3cfd0cbd05ae22ba27fec1Timo Sirainen}
4b43f50117630aa12b3cfd0cbd05ae22ba27fec1Timo Sirainen
4b43f50117630aa12b3cfd0cbd05ae22ba27fec1Timo Sirainenconst char *mail_guid_128_to_string(const uint8_t guid_128[MAIL_GUID_128_SIZE])
538303a216166f3526c0ae9658c9978275cfa100Timo Sirainen{
e0719fca14e337eee5a0d924bc4e9d53151a7188Timo Sirainen return binary_to_hex(guid_128, MAIL_GUID_128_SIZE);
e0719fca14e337eee5a0d924bc4e9d53151a7188Timo Sirainen}
e0719fca14e337eee5a0d924bc4e9d53151a7188Timo Sirainen