Migration implementation (part 1)

This commit is contained in:
mdecimus
2025-12-10 19:13:04 +01:00
parent efd1d86ff3
commit f1fe0345ef
86 changed files with 2553 additions and 356 deletions

View File

@@ -47,7 +47,11 @@ impl MailboxFnc for Server {
SpecialUse::Drafts => DRAFTS_ID,
SpecialUse::Sent => SENT_ID,
SpecialUse::Archive => ARCHIVE_ID,
SpecialUse::None | SpecialUse::Important => {
SpecialUse::None
| SpecialUse::Important
| SpecialUse::Memos
| SpecialUse::Scheduled
| SpecialUse::Snoozed => {
last_document_id += 1;
last_document_id
}

View File

@@ -104,10 +104,12 @@ pub enum EncryptionType {
PGP {
algo: Algorithm,
certs: String,
allow_spam_training: bool,
},
SMIME {
algo: Algorithm,
certs: String,
allow_spam_training: bool,
},
#[default]
Disabled,

View File

@@ -993,7 +993,7 @@ impl std::hash::Hash for MergeThreadIds<AHashSet<u32>> {
}
}
pub(crate) struct ThreadInfo;
pub struct ThreadInfo;
impl ThreadInfo {
pub fn serialize(thread_id: u32, ref_ids: &[CheekyHash]) -> Vec<u8> {

View File

@@ -127,6 +127,53 @@ pub enum MetadataHeaderName {
ArcAuthenticationResults,
ArcMessageSignature,
ArcSeal,
// Delivery/Routing
DeliveredTo,
XOriginalTo,
ReturnReceiptTo,
DispositionNotificationTo,
ErrorsTo,
// Authentication
AuthenticationResults,
ReceivedSpf,
// Spam/Virus
XSpamStatus,
XSpamScore,
XSpamFlag,
XSpamResult,
// Priority
Importance,
Priority,
XPriority,
XMSMailPriority,
// Client/Agent
XMailer,
UserAgent,
XMimeOLE,
// Network/Origin
XOriginatingIp,
XForwardedTo,
XForwardedFor,
// Auto-response
AutoSubmitted,
XAutoResponseSuppress,
Precedence,
// Organization/Threading
Organization,
ThreadIndex,
ThreadTopic,
// List (additional)
ListUnsubscribePost,
FeedbackId,
}
#[derive(Debug, PartialEq, Eq, Clone, rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)]
@@ -691,7 +738,57 @@ impl From<HeaderName<'_>> for MetadataHeaderName {
HeaderName::ArcMessageSignature => MetadataHeaderName::ArcMessageSignature,
HeaderName::ArcSeal => MetadataHeaderName::ArcSeal,
HeaderName::Other(value) => {
MetadataHeaderName::Other(value.into_owned().into_boxed_str())
let name = hashify::tiny_map_ignore_case!(value.as_bytes(),
// Delivery/Routing
"Delivered-To" => MetadataHeaderName::DeliveredTo,
"X-Original-To" => MetadataHeaderName::XOriginalTo,
"Return-Receipt-To" => MetadataHeaderName::ReturnReceiptTo,
"Disposition-Notification-To" => MetadataHeaderName::DispositionNotificationTo,
"Errors-To" => MetadataHeaderName::ErrorsTo,
// Authentication
"Authentication-Results" => MetadataHeaderName::AuthenticationResults,
"Received-SPF" => MetadataHeaderName::ReceivedSpf,
// Spam/Virus
"X-Spam-Status" => MetadataHeaderName::XSpamStatus,
"X-Spam-Score" => MetadataHeaderName::XSpamScore,
"X-Spam-Flag" => MetadataHeaderName::XSpamFlag,
"X-Spam-Result" => MetadataHeaderName::XSpamResult,
// Priority
"Importance" => MetadataHeaderName::Importance,
"Priority" => MetadataHeaderName::Priority,
"X-Priority" => MetadataHeaderName::XPriority,
"X-MSMail-Priority" => MetadataHeaderName::XMSMailPriority,
// Client/Agent
"X-Mailer" => MetadataHeaderName::XMailer,
"User-Agent" => MetadataHeaderName::UserAgent,
"X-MimeOLE" => MetadataHeaderName::XMimeOLE,
// Network/Origin
"X-Originating-IP" => MetadataHeaderName::XOriginatingIp,
"X-Forwarded-To" => MetadataHeaderName::XForwardedTo,
"X-Forwarded-For" => MetadataHeaderName::XForwardedFor,
// Auto-response
"Auto-Submitted" => MetadataHeaderName::AutoSubmitted,
"X-Auto-Response-Suppress" => MetadataHeaderName::XAutoResponseSuppress,
"Precedence" => MetadataHeaderName::Precedence,
// Organization/Threading
"Organization" => MetadataHeaderName::Organization,
"Thread-Index" => MetadataHeaderName::ThreadIndex,
"Thread-Topic" => MetadataHeaderName::ThreadTopic,
// List (additional)
"List-Unsubscribe-Post" => MetadataHeaderName::ListUnsubscribePost,
"Feedback-ID" => MetadataHeaderName::FeedbackId,
);
name.unwrap_or_else(|| {
MetadataHeaderName::Other(value.into_owned().into_boxed_str())
})
}
other => MetadataHeaderName::Other(other.as_str().to_string().into_boxed_str()),
}
@@ -787,6 +884,7 @@ impl ArchivedMessageMetadataContents {
}
}
#[derive(Default)]
pub struct MessageDataBuilder {
pub mailboxes: Vec<UidMailbox>,
pub keywords: Vec<Keyword>,
@@ -1086,6 +1184,35 @@ impl ArchivedMetadataHeaderName {
ArchivedMetadataHeaderName::ArcMessageSignature => "ARC-Message-Signature",
ArchivedMetadataHeaderName::ArcSeal => "ARC-Seal",
ArchivedMetadataHeaderName::DkimSignature => "DKIM-Signature",
ArchivedMetadataHeaderName::DeliveredTo => "Delivered-To",
ArchivedMetadataHeaderName::XOriginalTo => "X-Original-To",
ArchivedMetadataHeaderName::ReturnReceiptTo => "Return-Receipt-To",
ArchivedMetadataHeaderName::DispositionNotificationTo => "Disposition-Notification-To",
ArchivedMetadataHeaderName::ErrorsTo => "Errors-To",
ArchivedMetadataHeaderName::AuthenticationResults => "Authentication-Results",
ArchivedMetadataHeaderName::ReceivedSpf => "Received-SPF",
ArchivedMetadataHeaderName::XSpamStatus => "X-Spam-Status",
ArchivedMetadataHeaderName::XSpamScore => "X-Spam-Score",
ArchivedMetadataHeaderName::XSpamFlag => "X-Spam-Flag",
ArchivedMetadataHeaderName::XSpamResult => "X-Spam-Result",
ArchivedMetadataHeaderName::Importance => "Importance",
ArchivedMetadataHeaderName::Priority => "Priority",
ArchivedMetadataHeaderName::XPriority => "X-Priority",
ArchivedMetadataHeaderName::XMSMailPriority => "X-MSMail-Priority",
ArchivedMetadataHeaderName::XMailer => "X-Mailer",
ArchivedMetadataHeaderName::UserAgent => "User-Agent",
ArchivedMetadataHeaderName::XMimeOLE => "X-MimeOLE",
ArchivedMetadataHeaderName::XOriginatingIp => "X-Originating-IP",
ArchivedMetadataHeaderName::XForwardedTo => "X-Forwarded-To",
ArchivedMetadataHeaderName::XForwardedFor => "X-Forwarded-For",
ArchivedMetadataHeaderName::AutoSubmitted => "Auto-Submitted",
ArchivedMetadataHeaderName::XAutoResponseSuppress => "X-Auto-Response-Suppress",
ArchivedMetadataHeaderName::Precedence => "Precedence",
ArchivedMetadataHeaderName::Organization => "Organization",
ArchivedMetadataHeaderName::ThreadIndex => "Thread-Index",
ArchivedMetadataHeaderName::ThreadTopic => "Thread-Topic",
ArchivedMetadataHeaderName::ListUnsubscribePost => "List-Unsubscribe-Post",
ArchivedMetadataHeaderName::FeedbackId => "Feedback-ID",
ArchivedMetadataHeaderName::Other(name) => name.as_ref(),
}
}