From b4b5e04376699505e19abde68c13e3239eafa81a Mon Sep 17 00:00:00 2001 From: Ken Murchison Date: Mon, 11 Mar 2024 23:32:22 -0400 Subject: [PATCH] mboxlist.c: add 'U' field (user inboxid) to mbentry_t --- imap/mailbox.c | 5 +++++ imap/mailbox.h | 1 + imap/mboxlist.c | 19 ++++++++++++++++++- imap/mboxlist.h | 3 ++- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/imap/mailbox.c b/imap/mailbox.c index a61968ee597..83cc0fab877 100644 --- a/imap/mailbox.c +++ b/imap/mailbox.c @@ -1133,6 +1133,11 @@ EXPORTED const char *mailbox_uniqueid(const struct mailbox *mailbox) return mbentry->uniqueid ? mbentry->uniqueid : mailbox->h.uniqueid; } +EXPORTED const char *mailbox_inboxid(const struct mailbox *mailbox) +{ + return mailbox->mbentry->inboxid; +} + EXPORTED const char *mailbox_partition(const struct mailbox *mailbox) { return mailbox->mbentry->partition; diff --git a/imap/mailbox.h b/imap/mailbox.h index 471987efd6c..e8c64ba295b 100644 --- a/imap/mailbox.h +++ b/imap/mailbox.h @@ -590,6 +590,7 @@ extern int mailbox_delete(struct mailbox **mailboxptr); /* reading details */ extern const char *mailbox_name(const struct mailbox *mailbox); extern const char *mailbox_uniqueid(const struct mailbox *mailbox); +extern const char *mailbox_inboxid(const struct mailbox *mailbox); extern const char *mailbox_partition(const struct mailbox *mailbox); extern const char *mailbox_acl(const struct mailbox *mailbox); extern const char *mailbox_quotaroot(const struct mailbox *mailbox); diff --git a/imap/mboxlist.c b/imap/mboxlist.c index fb567578441..04c814f9935 100644 --- a/imap/mboxlist.c +++ b/imap/mboxlist.c @@ -148,6 +148,7 @@ EXPORTED mbentry_t *mboxlist_entry_copy(const mbentry_t *src) copy->server = xstrdupnull(src->server); copy->acl = xstrdupnull(src->acl); copy->uniqueid = xstrdupnull(src->uniqueid); + copy->inboxid = xstrdupnull(src->inboxid); copy->legacy_specialuse = xstrdupnull(src->legacy_specialuse); @@ -187,6 +188,7 @@ EXPORTED void mboxlist_entry_free(mbentry_t **mbentryptr) free(mbentry->server); free(mbentry->acl); free(mbentry->uniqueid); + free(mbentry->inboxid); free(mbentry->legacy_specialuse); @@ -273,6 +275,9 @@ static struct dlist *mboxlist_entry_dlist(const char *dbname, else if (mbentry->uniqueid) dlist_setatom(dl, "I", mbentry->uniqueid); + if (mbentry->inboxid) + dlist_setatom(dl, "U", mbentry->inboxid); + if (mbentry->partition) dlist_setatom(dl, "P", mbentry->partition); @@ -618,6 +623,9 @@ static int parseentry_cb(int type, struct dlistsax_data *d) else if (!strcmp(key, "I")) { rock->mbentry->uniqueid = xstrdupnull(d->data); } + else if (!strcmp(key, "U")) { + rock->mbentry->inboxid = xstrdupnull(d->data); + } else if (!strcmp(key, "M")) { rock->mbentry->mtime = atoi(d->data); } @@ -652,6 +660,7 @@ static int parseentry_cb(int type, struct dlistsax_data *d) * F: _f_oldermodseq * H: name_h_istory * I: unique_i_d + * U: _u_serinboxid * M: _m_time * N: _n_ame * P: _p_artition @@ -1865,6 +1874,7 @@ EXPORTED int mboxlist_createmailbox(const mbentry_t *mbentry, int isremote = mbtype & MBTYPE_REMOTE; mbentry_t *usermbentry = NULL, *newmbentry = NULL; int silent = 0; + int isinbox; init_internal(); @@ -1874,6 +1884,8 @@ EXPORTED int mboxlist_createmailbox(const mbentry_t *mbentry, assert_namespacelocked(mboxname); + isinbox = mboxname_isusermailbox(mboxname, 1); + if ((flags & MBOXLIST_CREATE_SYNC)) { silent = 1; } @@ -1933,9 +1945,11 @@ EXPORTED int mboxlist_createmailbox(const mbentry_t *mbentry, newmbentry->mbtype = mbtype; newmbentry->partition = xstrdupnull(newpartition); newmbentry->uniqueid = xstrdup(uniqueid ? uniqueid : makeuuid()); + if (isinbox) newmbentry->inboxid = xstrdup(newmbentry->uniqueid); + else if (usermbentry) newmbentry->inboxid = xstrdup(usermbentry->uniqueid); if (!(flags & MBOXLIST_CREATE_DBONLY) && !isremote) { - if (mboxname_isusermailbox(mboxname, 1)) { + if (isinbox) { /* Create initial mbentry for new users -- the uniqueid in the record is required to open user metadata files (conversations, counters) */ @@ -2766,6 +2780,7 @@ EXPORTED int mboxlist_renamemailbox(const mbentry_t *mbentry, newmbentry->acl = xstrdupnull(mailbox_acl(oldmailbox)); newmbentry->uidvalidity = oldmailbox->i.uidvalidity; newmbentry->uniqueid = xstrdupnull(mailbox_uniqueid(oldmailbox)); + newmbentry->inboxid = xstrdupnull(mailbox_inboxid(oldmailbox)); newmbentry->createdmodseq = oldmailbox->i.createdmodseq; newmbentry->foldermodseq = silent ? mailbox_foldermodseq(oldmailbox) : mboxname_nextmodseq(newname, mailbox_foldermodseq(oldmailbox), @@ -2830,6 +2845,7 @@ EXPORTED int mboxlist_renamemailbox(const mbentry_t *mbentry, newmbentry->acl = xstrdupnull(mailbox_acl(newmailbox)); newmbentry->uidvalidity = newmailbox->i.uidvalidity; newmbentry->uniqueid = xstrdupnull(mailbox_uniqueid(newmailbox)); + newmbentry->inboxid = xstrdupnull(mailbox_inboxid(newmailbox)); newmbentry->createdmodseq = newmailbox->i.createdmodseq; newmbentry->foldermodseq = newmailbox->i.highestmodseq; } @@ -2842,6 +2858,7 @@ EXPORTED int mboxlist_renamemailbox(const mbentry_t *mbentry, newmbentry->acl = xstrdupnull(mailbox_acl(oldmailbox)); newmbentry->uidvalidity = oldmailbox->i.uidvalidity; newmbentry->uniqueid = xstrdupnull(mailbox_uniqueid(oldmailbox)); + newmbentry->inboxid = xstrdupnull(mailbox_inboxid(oldmailbox)); newmbentry->createdmodseq = oldmailbox->i.createdmodseq; newmbentry->foldermodseq = oldmailbox->i.highestmodseq; diff --git a/imap/mboxlist.h b/imap/mboxlist.h index f73952be6fd..26584cbc9da 100644 --- a/imap/mboxlist.h +++ b/imap/mboxlist.h @@ -120,6 +120,7 @@ struct mboxlist_entry { char *acl; /* extra fields */ char *uniqueid; + char *inboxid; /* legacy upgrade support */ char *legacy_specialuse; /* replication support */ @@ -127,7 +128,7 @@ struct mboxlist_entry { }; #define MBENTRY_INITIALIZER { NULL, NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, \ - NULL, NULL, PTRARRAY_INITIALIZER } + NULL, NULL, NULL, PTRARRAY_INITIALIZER } typedef struct mboxlist_entry mbentry_t;