mail.c revision 539977f9257bd8985be5a8093658da266ae9cd19
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen#include "lib.h"
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen#include "ioloop.h"
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen#include "buffer.h"
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen#include "hex-binary.h"
d172c364637944d667aa98eb5de0d4a3a97ab92aTimo Sirainen#include "crc32.h"
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen#include "sha1.h"
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen#include "hostpid.h"
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen#include "mail-storage-private.h"
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen#include <time.h>
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenstruct mail *mail_alloc(struct mailbox_transaction_context *t,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen enum mail_fetch_field wanted_fields,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mailbox_header_lookup_ctx *wanted_headers)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
539977f9257bd8985be5a8093658da266ae9cd19Timo Sirainen struct mail *mail;
539977f9257bd8985be5a8093658da266ae9cd19Timo Sirainen
539977f9257bd8985be5a8093658da266ae9cd19Timo Sirainen T_BEGIN {
539977f9257bd8985be5a8093658da266ae9cd19Timo Sirainen mail = t->box->v.mail_alloc(t, wanted_fields, wanted_headers);
539977f9257bd8985be5a8093658da266ae9cd19Timo Sirainen hook_mail_allocated(mail);
539977f9257bd8985be5a8093658da266ae9cd19Timo Sirainen } T_END;
539977f9257bd8985be5a8093658da266ae9cd19Timo Sirainen
539977f9257bd8985be5a8093658da266ae9cd19Timo Sirainen return mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenvoid mail_free(struct mail **mail)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen struct mail_private *p = (struct mail_private *)*mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen p->v.free(*mail);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen *mail = NULL;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenvoid mail_set_seq(struct mail *mail, uint32_t seq)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen p->v.set_seq(mail, seq);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenbool mail_set_uid(struct mail *mail, uint32_t uid)
a12399903f415a7e14c2816cffa2f7a09dcbb097Timo Sirainen{
a12399903f415a7e14c2816cffa2f7a09dcbb097Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
a12399903f415a7e14c2816cffa2f7a09dcbb097Timo Sirainen
a12399903f415a7e14c2816cffa2f7a09dcbb097Timo Sirainen return p->v.set_uid(mail, uid);
a12399903f415a7e14c2816cffa2f7a09dcbb097Timo Sirainen}
a12399903f415a7e14c2816cffa2f7a09dcbb097Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenenum mail_flags mail_get_flags(struct mail *mail)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen return p->v.get_flags(mail);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainenuint64_t mail_get_modseq(struct mail *mail)
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen{
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen return p->v.get_modseq(mail);
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen}
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenconst char *const *mail_get_keywords(struct mail *mail)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen return p->v.get_keywords(mail);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainenconst ARRAY_TYPE(keyword_indexes) *mail_get_keyword_indexes(struct mail *mail)
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen{
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen return p->v.get_keyword_indexes(mail);
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen}
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen
c0225f7f6b43d34dc58c17d3304f0fd60ab89894Timo Sirainenint mail_get_parts(struct mail *mail, struct message_part **parts_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_parts(mail, parts_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_date(struct mail *mail, time_t *date_r, int *timezone_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen int tz;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen if (timezone_r == NULL)
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen timezone_r = &tz;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_date(mail, date_r, timezone_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_received_date(struct mail *mail, time_t *date_r)
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen{
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_received_date(mail, date_r);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen}
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_save_date(struct mail *mail, time_t *date_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_save_date(mail, date_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_virtual_size(struct mail *mail, uoff_t *size_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_virtual_size(mail, size_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_physical_size(struct mail *mail, uoff_t *size_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_physical_size(mail, size_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_first_header(struct mail *mail, const char *field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char **value_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_first_header(mail, field, FALSE, value_r);
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen}
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_first_header_utf8(struct mail *mail, const char *field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char **value_r)
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen{
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_first_header(mail, field, TRUE, value_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_headers(struct mail *mail, const char *field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char *const **value_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_headers(mail, field, FALSE, value_r);
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen}
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_headers_utf8(struct mail *mail, const char *field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char *const **value_r)
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen{
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_headers(mail, field, TRUE, value_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
87460b08cb97b31cde640d4975a6aa2c1d0e7226Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_header_stream(struct mail *mail,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen struct mailbox_header_lookup_ctx *headers,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen struct istream **stream_r)
87460b08cb97b31cde640d4975a6aa2c1d0e7226Timo Sirainen{
87460b08cb97b31cde640d4975a6aa2c1d0e7226Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
87460b08cb97b31cde640d4975a6aa2c1d0e7226Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_header_stream(mail, headers, stream_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
ebe6df72f1309135f02b6a4d2aef1e81a073f91cTimo Sirainenint mail_set_aborted(struct mail *mail)
ebe6df72f1309135f02b6a4d2aef1e81a073f91cTimo Sirainen{
ebe6df72f1309135f02b6a4d2aef1e81a073f91cTimo Sirainen mail_storage_set_error(mail->box->storage, MAIL_ERROR_NOTPOSSIBLE,
ebe6df72f1309135f02b6a4d2aef1e81a073f91cTimo Sirainen "Mail field not cached");
ebe6df72f1309135f02b6a4d2aef1e81a073f91cTimo Sirainen return -1;
ebe6df72f1309135f02b6a4d2aef1e81a073f91cTimo Sirainen}
ebe6df72f1309135f02b6a4d2aef1e81a073f91cTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_stream(struct mail *mail, struct message_size *hdr_size,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen struct message_size *body_size, struct istream **stream_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
ebe6df72f1309135f02b6a4d2aef1e81a073f91cTimo Sirainen if (mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER)
ebe6df72f1309135f02b6a4d2aef1e81a073f91cTimo Sirainen return mail_set_aborted(mail);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_stream(mail, hdr_size, body_size, stream_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_special(struct mail *mail, enum mail_fetch_field field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char **value_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_special(mail, field, value_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
9af6cc9ebc9986c1275ebdfa29c39e152af1557eTimo Sirainenstruct mail *mail_get_real_mail(struct mail *mail)
9af6cc9ebc9986c1275ebdfa29c39e152af1557eTimo Sirainen{
9af6cc9ebc9986c1275ebdfa29c39e152af1557eTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
9af6cc9ebc9986c1275ebdfa29c39e152af1557eTimo Sirainen
9af6cc9ebc9986c1275ebdfa29c39e152af1557eTimo Sirainen return p->v.get_real_mail(mail);
9af6cc9ebc9986c1275ebdfa29c39e152af1557eTimo Sirainen}
9af6cc9ebc9986c1275ebdfa29c39e152af1557eTimo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenvoid mail_update_flags(struct mail *mail, enum modify_type modify_type,
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen enum mail_flags flags)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
efb373fd7e30df171452c9f40881a8bd06b81780Timo Sirainen p->v.update_flags(mail, modify_type, flags);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenvoid mail_update_keywords(struct mail *mail, enum modify_type modify_type,
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen struct mail_keywords *keywords)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen p->v.update_keywords(mail, modify_type, keywords);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainenvoid mail_update_modseq(struct mail *mail, uint64_t min_modseq)
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen{
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen p->v.update_modseq(mail, min_modseq);
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen}
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainenvoid mail_update_uid(struct mail *mail, uint32_t new_uid)
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen{
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen p->v.update_uid(mail, new_uid);
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen}
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainenvoid mail_update_pop3_uidl(struct mail *mail, const char *uidl)
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen{
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen if (p->v.update_pop3_uidl != NULL)
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen p->v.update_pop3_uidl(mail, uidl);
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen}
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenvoid mail_expunge(struct mail *mail)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen p->v.expunge(mail);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
910fa4e4204a73d3d24c03f3059dd24e727ca057Timo Sirainen
910fa4e4204a73d3d24c03f3059dd24e727ca057Timo Sirainenvoid mail_set_expunged(struct mail *mail)
910fa4e4204a73d3d24c03f3059dd24e727ca057Timo Sirainen{
910fa4e4204a73d3d24c03f3059dd24e727ca057Timo Sirainen mail_storage_set_error(mail->box->storage, MAIL_ERROR_EXPUNGED,
910fa4e4204a73d3d24c03f3059dd24e727ca057Timo Sirainen "Message was expunged");
910fa4e4204a73d3d24c03f3059dd24e727ca057Timo Sirainen mail->expunged = TRUE;
910fa4e4204a73d3d24c03f3059dd24e727ca057Timo Sirainen}
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainen
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainenvoid mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field)
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainen{
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainen
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainen p->v.set_cache_corrupted(mail, field);
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainen}
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainenconst char *mail_generate_guid_string(void)
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen{
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen static struct timespec ts = { 0, 0 };
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen static unsigned int pid = 0;
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen /* we'll use the current time in nanoseconds as the initial 64bit
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen counter. */
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen if (ts.tv_sec == 0) {
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen if (clock_gettime(CLOCK_REALTIME, &ts) < 0)
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen i_fatal("clock_gettime() failed: %m");
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen pid = getpid();
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen } else if ((uint32_t)ts.tv_nsec < (uint32_t)-1) {
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen ts.tv_nsec++;
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen } else {
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen ts.tv_sec++;
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen ts.tv_nsec = 0;
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen }
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen return t_strdup_printf("%04x%04lx%04x%s",
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen (unsigned int)ts.tv_nsec,
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen (unsigned long)ts.tv_sec,
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen pid, my_hostname);
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen}
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainenvoid mail_generate_guid_128(uint8_t guid[MAIL_GUID_128_SIZE])
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen{
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen static struct timespec ts = { 0, 0 };
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen static uint8_t guid_static[8];
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen uint32_t pid, host_crc;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen /* we'll use the current time in nanoseconds as the initial 64bit
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen counter. */
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen if (ts.tv_sec == 0) {
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen if (clock_gettime(CLOCK_REALTIME, &ts) < 0)
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen i_fatal("clock_gettime() failed: %m");
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen pid = getpid();
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen host_crc = crc32_str(my_hostname);
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid_static[0] = (pid & 0x000000ff);
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid_static[1] = (pid & 0x0000ff00) >> 8;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid_static[2] = (pid & 0x00ff0000) >> 16;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid_static[3] = (pid & 0xff000000) >> 24;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid_static[4] = (host_crc & 0x000000ff);
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid_static[5] = (host_crc & 0x0000ff00) >> 8;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid_static[6] = (host_crc & 0x00ff0000) >> 16;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid_static[7] = (host_crc & 0xff000000) >> 24;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen } else if ((uint32_t)ts.tv_nsec < (uint32_t)-1) {
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen ts.tv_nsec++;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen } else {
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen ts.tv_sec++;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen ts.tv_nsec = 0;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen }
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid[0] = (ts.tv_nsec & 0x000000ff);
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid[1] = (ts.tv_nsec & 0x0000ff00) >> 8;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid[2] = (ts.tv_nsec & 0x00ff0000) >> 16;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid[3] = (ts.tv_nsec & 0xff000000) >> 24;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid[4] = (ts.tv_sec & 0x000000ff);
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid[5] = (ts.tv_sec & 0x0000ff00) >> 8;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid[6] = (ts.tv_sec & 0x00ff0000) >> 16;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid[7] = (ts.tv_sec & 0xff000000) >> 24;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen memcpy(guid + 8, guid_static, 8);
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen}
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainenvoid mail_generate_guid_128_hash(const char *guid,
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainen uint8_t guid_128[MAIL_GUID_128_SIZE])
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen{
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen unsigned char sha1_sum[SHA1_RESULTLEN];
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen buffer_t buf;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainen buffer_create_data(&buf, guid_128, MAIL_GUID_128_SIZE);
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainen if (strlen(guid) != MAIL_GUID_128_SIZE*2 ||
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainen hex_to_binary(guid, &buf) < 0 ||
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen buf.used != MAIL_GUID_128_SIZE) {
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen /* not 128bit hex. use a hash of it instead. */
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen buffer_set_used_size(&buf, 0);
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainen sha1_get_digest(guid, strlen(guid), sha1_sum);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen#if SHA1_RESULTLEN < DBOX_GUID_BIN_LEN
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen# error not possible
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen#endif
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen buffer_append(&buf,
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen sha1_sum + SHA1_RESULTLEN - MAIL_GUID_128_SIZE,
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen MAIL_GUID_128_SIZE);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen }
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen}
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainen
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainenbool mail_guid_128_is_empty(const uint8_t guid_128[MAIL_GUID_128_SIZE])
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainen{
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainen unsigned int i;
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainen
c820b702d1eabfd5b029ac168fe769265e541561Timo Sirainen for (i = 0; i < MAIL_GUID_128_SIZE; i++) {
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainen if (guid_128[i] != 0)
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainen return FALSE;
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainen }
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainen return TRUE;
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainen}
16aef418492cb8d18c5196fd573a487177a9cab2Timo Sirainen
16aef418492cb8d18c5196fd573a487177a9cab2Timo Sirainenconst char *mail_guid_128_to_string(const uint8_t guid_128[MAIL_GUID_128_SIZE])
16aef418492cb8d18c5196fd573a487177a9cab2Timo Sirainen{
16aef418492cb8d18c5196fd573a487177a9cab2Timo Sirainen return binary_to_hex(guid_128, MAIL_GUID_128_SIZE);
16aef418492cb8d18c5196fd573a487177a9cab2Timo Sirainen}