Initial commit

This commit is contained in:
Maurus Decimus
2026-05-29 18:02:15 +02:00
commit 576073f8c9
263 changed files with 78638 additions and 0 deletions
+223
View File
@@ -0,0 +1,223 @@
/*
* SPDX-FileCopyrightText: 2020 Stalwart Labs LLC <[email protected]>
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*/
#[derive(Debug, Clone, Copy)]
pub struct MailboxSpec {
pub key: &'static str,
pub name: &'static str,
pub parent: Option<&'static str>,
}
#[derive(Debug, Clone, Copy)]
pub struct FileSpec {
pub key: &'static str,
pub name: &'static str,
pub parent: Option<&'static str>,
pub directory: bool,
}
#[derive(Debug, Clone, Copy)]
pub struct SieveScript {
pub name: &'static str,
pub body: &'static str,
pub active: bool,
}
#[derive(Debug, Clone, Copy)]
pub struct Layout {
pub mailboxes: &'static [MailboxSpec],
pub files: &'static [FileSpec],
pub calendars: &'static [&'static str],
pub address_books: &'static [&'static str],
pub sieve_scripts: &'static [SieveScript],
pub email_count: usize,
pub contact_count: usize,
pub event_count: usize,
}
macro_rules! mailbox {
($k:expr, $n:expr, $p:expr) => {
MailboxSpec {
key: $k,
name: $n,
parent: $p,
}
};
}
macro_rules! node {
($k:expr, $n:expr, $p:expr, $d:expr) => {
FileSpec {
key: $k,
name: $n,
parent: $p,
directory: $d,
}
};
}
pub const ACCOUNT1: &str = "user1";
pub const ACCOUNT2: &str = "user2";
pub const ACCOUNT3: &str = "user3";
pub const PASSWORD: &str = "VandelayUser#2026";
pub static MAILBOXES_DEEP: &[MailboxSpec] = &[
mailbox!("proj", "Projects", None),
mailbox!("y2024", "2024", Some("proj")),
mailbox!("q1", "Q1", Some("y2024")),
mailbox!("acme", "ClientAcme", Some("q1")),
mailbox!("acme_in", "Internal", Some("acme")),
mailbox!("q2", "Q2", Some("y2024")),
mailbox!("globex", "ClientGlobex", Some("q2")),
mailbox!("y2025", "2025", Some("proj")),
mailbox!("alpha", "Alpha", Some("y2025")),
mailbox!("beta", "Beta", Some("y2025")),
mailbox!("travel", "Travel", None),
mailbox!("asia", "Asia", Some("travel")),
mailbox!("jp", "Japan", Some("asia")),
mailbox!("tokyo", "Tokyo", Some("jp")),
mailbox!("eu", "Europe", Some("travel")),
mailbox!("it", "Italy", Some("eu")),
mailbox!("rome", "Rome", Some("it")),
mailbox!("arch", "Archive", None),
mailbox!("arch23", "2023", Some("arch")),
mailbox!("arch24", "2024", Some("arch")),
];
pub static MAILBOXES_MEDIUM: &[MailboxSpec] = &[
mailbox!("work", "Work", None),
mailbox!("clients", "Clients", Some("work")),
mailbox!("acme", "AcmeCorp", Some("clients")),
mailbox!("inv", "Invoices", Some("acme")),
mailbox!("globex", "Globex", Some("clients")),
mailbox!("internal", "Internal", Some("work")),
mailbox!("pers", "Personal", None),
mailbox!("rcpt", "Receipts", Some("pers")),
];
pub static MAILBOXES_FLAT: &[MailboxSpec] = &[
mailbox!("lists", "Lists", None),
mailbox!("news", "Newsletters", Some("lists")),
mailbox!("misc", "Misc", None),
];
pub static FILES_DEEP: &[FileSpec] = &[
node!("docs", "Documents", None, true),
node!("rep", "Reports", Some("docs"), true),
node!("d24", "2024", Some("rep"), true),
node!("q1f", "q1-results.bin", Some("d24"), false),
node!("q2f", "q2-results.bin", Some("d24"), false),
node!("d25", "2025", Some("rep"), true),
node!("q1f25", "q1-results.bin", Some("d25"), false),
node!("spec", "Specs", Some("docs"), true),
node!("ovr", "overview.bin", Some("spec"), false),
node!("notes", "notes.bin", Some("docs"), false),
node!("photos", "Photos", None, true),
node!("vac", "Vacations", Some("photos"), true),
node!("vit", "Italy", Some("vac"), true),
node!("vrome", "rome.bin", Some("vit"), false),
node!("vjp", "Japan", Some("vac"), true),
node!("vtokyo", "tokyo.bin", Some("vjp"), false),
node!("readme", "README.bin", None, false),
];
pub static FILES_MEDIUM: &[FileSpec] = &[
node!("media", "Media", None, true),
node!("audio", "Audio", Some("media"), true),
node!("song", "song.bin", Some("audio"), false),
node!("video", "Video", Some("media"), true),
node!("clip", "clip.bin", Some("video"), false),
node!("proj", "Projects", None, true),
node!("src", "src", Some("proj"), true),
node!("main", "main.bin", Some("src"), false),
];
pub static FILES_FLAT: &[FileSpec] = &[
node!("bak", "Backup", None, true),
node!("snap", "snapshot.bin", Some("bak"), false),
node!("scratch", "scratch.bin", None, false),
];
pub static CALENDARS_DEEP: &[&str] = &["Personal", "Work", "Birthdays", "Travel"];
pub static CALENDARS_MEDIUM: &[&str] = &["Personal", "Work"];
pub static CALENDARS_FLAT: &[&str] = &["Personal", "Holidays"];
pub static ADDRESS_BOOKS_DEEP: &[&str] = &["Personal", "Work", "Friends"];
pub static ADDRESS_BOOKS_MEDIUM: &[&str] = &["Personal", "Work"];
pub static ADDRESS_BOOKS_FLAT: &[&str] = &["Personal", "Family"];
pub static SIEVE_DEEP: &[SieveScript] = &[
SieveScript {
name: "spam",
body: "require [\"fileinto\"];\nif header :contains \"X-Spam\" \"YES\" {\n fileinto \"Junk\";\n stop;\n}\n",
active: true,
},
SieveScript {
name: "vacation",
body: "require [\"vacation\"];\nvacation :days 7 :subject \"Out of office\" \"I am away, will reply later.\";\n",
active: false,
},
SieveScript {
name: "organize",
body: "require [\"fileinto\",\"mailbox\"];\nif address :is \"from\" \"[email protected]\" {\n fileinto :create \"Projects/2025/Beta\";\n}\n",
active: false,
},
];
pub static SIEVE_MEDIUM: &[SieveScript] = &[
SieveScript {
name: "filter",
body: "require [\"fileinto\"];\nif address :is \"to\" \"[email protected]\" {\n fileinto \"Work\";\n}\n",
active: true,
},
SieveScript {
name: "draft",
body: "require [\"reject\"];\nif address :is \"from\" \"[email protected]\" {\n reject \"go away\";\n}\n",
active: false,
},
];
pub static SIEVE_FLAT: &[SieveScript] = &[];
pub fn layout_for(username: &str) -> Layout {
match username {
s if s == ACCOUNT1 => Layout {
mailboxes: MAILBOXES_DEEP,
files: FILES_DEEP,
calendars: CALENDARS_DEEP,
address_books: ADDRESS_BOOKS_DEEP,
sieve_scripts: SIEVE_DEEP,
email_count: 200,
contact_count: 40,
event_count: 40,
},
s if s == ACCOUNT2 => Layout {
mailboxes: MAILBOXES_MEDIUM,
files: FILES_MEDIUM,
calendars: CALENDARS_MEDIUM,
address_books: ADDRESS_BOOKS_MEDIUM,
sieve_scripts: SIEVE_MEDIUM,
email_count: 80,
contact_count: 15,
event_count: 15,
},
_ => Layout {
mailboxes: MAILBOXES_FLAT,
files: FILES_FLAT,
calendars: CALENDARS_FLAT,
address_books: ADDRESS_BOOKS_FLAT,
sieve_scripts: SIEVE_FLAT,
email_count: 20,
contact_count: 10,
event_count: 10,
},
}
}
pub fn accounts() -> [&'static str; 3] {
[ACCOUNT1, ACCOUNT2, ACCOUNT3]
}