diff --git a/Cargo.lock b/Cargo.lock index 20b9d95..387615f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,10 +23,32 @@ version = "0.3.0" dependencies = [ "aero-user", "anyhow", + "hex", "log", "rand", "serde", "tokio", + "tracing", +] + +[[package]] +name = "aero-collections" +version = "0.3.0" +dependencies = [ + "aero-bayou", + "aero-user", + "anyhow", + "base64 0.21.7", + "eml-codec", + "futures", + "hex", + "im", + "lazy_static", + "rand", + "serde", + "sodiumoxide", + "tokio", + "tracing", ] [[package]] @@ -93,6 +115,21 @@ dependencies = [ "tokio", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anyhow" version = "1.0.79" @@ -616,6 +653,15 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + [[package]] name = "blake2" version = "0.10.6" @@ -684,7 +730,12 @@ version = "0.4.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", "num-traits", + "wasm-bindgen", + "windows-targets 0.52.0", ] [[package]] @@ -887,6 +938,27 @@ dependencies = [ "zeroize", ] +[[package]] +name = "eml-codec" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4499124d87abce26a57ef96ece800fa8babc38fbedd81c607c340ae83d46d2e" +dependencies = [ + "base64 0.21.7", + "chrono", + "encoding_rs", + "nom 7.1.3", +] + +[[package]] +name = "encoding_rs" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +dependencies = [ + "cfg-if", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -1284,6 +1356,29 @@ dependencies = [ "tracing", ] +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "idna" version = "0.5.0" @@ -1294,6 +1389,20 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "im" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" +dependencies = [ + "bitmaps", + "rand_core", + "rand_xoshiro", + "sized-chunks", + "typenum", + "version_check", +] + [[package]] name = "indexmap" version = "2.2.5" @@ -1716,6 +1825,15 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core", +] + [[package]] name = "regex-lite" version = "0.1.5" @@ -2066,6 +2184,16 @@ dependencies = [ "rand_core", ] +[[package]] +name = "sized-chunks" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +dependencies = [ + "bitmaps", + "typenum", +] + [[package]] name = "slab" version = "0.4.9" @@ -2601,6 +2729,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.0", +] + [[package]] name = "windows-sys" version = "0.48.0" diff --git a/Cargo.toml b/Cargo.toml index 56d5cf3..5654322 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ members = [ "aero-sasl", "aero-dav", "aero-dav/fuzz", -# "aero-collections", + "aero-collections", # "aero-proto", # "aerogramme", ] @@ -19,7 +19,7 @@ aero-user = { version = "0.3.0", path = "aero-user" } aero-bayou = { version = "0.3.0", path = "aero-bayou" } aero-sasl = { version = "0.3.0", path = "aero-sasl" } aero-dav = { version = "0.3.0", path = "aero-dav" } -#aero-collections = { version = "0.3.0", path = "aero-collections" } +aero-collections = { version = "0.3.0", path = "aero-collections" } #aero-proto = { version = "0.3.0", path = "aero-proto" } #aerogramme = { version = "0.3.0", path = "aerogramme" } diff --git a/aero-bayou/Cargo.toml b/aero-bayou/Cargo.toml index d271f4a..cade216 100644 --- a/aero-bayou/Cargo.toml +++ b/aero-bayou/Cargo.toml @@ -10,6 +10,8 @@ description = "A simplified version of Bayou by Terry et al. (ACM SIGOPS 1995)" aero-user.workspace = true anyhow.workspace = true +hex.workspace = true +tracing.workspace = true log.workspace = true rand.workspace = true serde.workspace = true diff --git a/aero-bayou/src/lib.rs b/aero-bayou/src/lib.rs index 7756964..159dbbf 100644 --- a/aero-bayou/src/lib.rs +++ b/aero-bayou/src/lib.rs @@ -1,4 +1,4 @@ -mod timestamp +pub mod timestamp; use std::sync::{Arc, Weak}; use std::time::{Duration, Instant}; @@ -9,9 +9,9 @@ use rand::prelude::*; use serde::{Deserialize, Serialize}; use tokio::sync::{watch, Notify}; -use aero_foundations::cryptoblob::*; -use aero_foundations::login::Credentials; -use aero_foundations::storage; +use aero_user::cryptoblob::*; +use aero_user::login::Credentials; +use aero_user::storage; use crate::timestamp::*; diff --git a/aero-collections/Cargo.toml b/aero-collections/Cargo.toml new file mode 100644 index 0000000..90d285e --- /dev/null +++ b/aero-collections/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "aero-collections" +version = "0.3.0" +authors = ["Alex Auvolat ", "Quentin Dufour "] +edition = "2021" +license = "EUPL-1.2" +description = "Aerogramme own representation of the different objects it manipulates" + +[dependencies] +aero-user.workspace = true +aero-bayou.workspace = true + +anyhow.workspace = true +base64.workspace = true +futures.workspace = true +lazy_static.workspace = true +serde.workspace = true +hex.workspace = true +tokio.workspace = true +tracing.workspace = true +rand.workspace = true +im.workspace = true +sodiumoxide.workspace = true +eml-codec.workspace = true diff --git a/aero-collections/src/calendar/mod.rs b/aero-collections/src/calendar/mod.rs new file mode 100644 index 0000000..19e3340 --- /dev/null +++ b/aero-collections/src/calendar/mod.rs @@ -0,0 +1 @@ +//@FIXME Event Index diff --git a/aero-collections/src/lib.rs b/aero-collections/src/lib.rs new file mode 100644 index 0000000..adcfc93 --- /dev/null +++ b/aero-collections/src/lib.rs @@ -0,0 +1,3 @@ +pub mod user; +pub mod mail; +pub mod calendar; diff --git a/aero-collections/mail/incoming.rs b/aero-collections/src/mail/incoming.rs similarity index 98% rename from aero-collections/mail/incoming.rs rename to aero-collections/src/mail/incoming.rs index e2ad97d..8220461 100644 --- a/aero-collections/mail/incoming.rs +++ b/aero-collections/src/mail/incoming.rs @@ -1,6 +1,3 @@ -//use std::collections::HashMap; -use std::convert::TryFrom; - use std::sync::{Arc, Weak}; use std::time::Duration; @@ -11,15 +8,16 @@ use futures::{future::BoxFuture, FutureExt}; use tokio::sync::watch; use tracing::{debug, error, info, warn}; -use crate::cryptoblob; -use crate::login::{Credentials, PublicCredentials}; +use aero_user::cryptoblob; +use aero_user::login::{Credentials, PublicCredentials}; +use aero_user::storage; +use aero_bayou::timestamp::now_msec; + use crate::mail::mailbox::Mailbox; use crate::mail::uidindex::ImapUidvalidity; use crate::mail::unique_ident::*; use crate::user::User; use crate::mail::IMF; -use crate::storage; -use crate::timestamp::now_msec; const INCOMING_PK: &str = "incoming"; const INCOMING_LOCK_SK: &str = "lock"; diff --git a/aero-collections/mail/mailbox.rs b/aero-collections/src/mail/mailbox.rs similarity index 98% rename from aero-collections/mail/mailbox.rs rename to aero-collections/src/mail/mailbox.rs index d1a5473..a767678 100644 --- a/aero-collections/mail/mailbox.rs +++ b/aero-collections/src/mail/mailbox.rs @@ -2,14 +2,15 @@ use anyhow::{anyhow, bail, Result}; use serde::{Deserialize, Serialize}; use tokio::sync::RwLock; -use crate::bayou::Bayou; -use crate::cryptoblob::{self, gen_key, open_deserialize, seal_serialize, Key}; -use crate::login::Credentials; +use aero_user::cryptoblob::{self, gen_key, open_deserialize, seal_serialize, Key}; +use aero_user::login::Credentials; +use aero_user::storage::{self, BlobRef, BlobVal, RowRef, RowVal, Selector, Store}; +use aero_bayou::Bayou; +use aero_bayou::timestamp::now_msec; + use crate::mail::uidindex::*; use crate::mail::unique_ident::*; use crate::mail::IMF; -use crate::storage::{self, BlobRef, BlobVal, RowRef, RowVal, Selector, Store}; -use crate::timestamp::now_msec; pub struct Mailbox { pub(super) id: UniqueIdent, diff --git a/aero-collections/mail/mod.rs b/aero-collections/src/mail/mod.rs similarity index 95% rename from aero-collections/mail/mod.rs rename to aero-collections/src/mail/mod.rs index 03e85cd..85361f3 100644 --- a/aero-collections/mail/mod.rs +++ b/aero-collections/src/mail/mod.rs @@ -1,5 +1,3 @@ -use std::convert::TryFrom; - pub mod incoming; pub mod mailbox; pub mod query; diff --git a/aero-collections/mail/namespace.rs b/aero-collections/src/mail/namespace.rs similarity index 94% rename from aero-collections/mail/namespace.rs rename to aero-collections/src/mail/namespace.rs index 5e67173..452ac68 100644 --- a/aero-collections/mail/namespace.rs +++ b/aero-collections/src/mail/namespace.rs @@ -1,19 +1,12 @@ -use std::collections::{BTreeMap, HashMap}; -use std::sync::{Arc, Weak}; +use std::collections::BTreeMap; -use anyhow::{anyhow, bail, Result}; -use lazy_static::lazy_static; +use anyhow::{bail, Result}; use serde::{Deserialize, Serialize}; -use tokio::sync::watch; -use crate::cryptoblob::{open_deserialize, seal_serialize}; -use crate::login::Credentials; -use crate::mail::incoming::incoming_mail_watch_process; -use crate::mail::mailbox::Mailbox; +use aero_bayou::timestamp::now_msec; + use crate::mail::uidindex::ImapUidvalidity; use crate::mail::unique_ident::{gen_ident, UniqueIdent}; -use crate::storage; -use crate::timestamp::now_msec; pub const MAILBOX_HIERARCHY_DELIMITER: char = '.'; diff --git a/aero-collections/mail/query.rs b/aero-collections/src/mail/query.rs similarity index 100% rename from aero-collections/mail/query.rs rename to aero-collections/src/mail/query.rs diff --git a/aero-collections/mail/snapshot.rs b/aero-collections/src/mail/snapshot.rs similarity index 100% rename from aero-collections/mail/snapshot.rs rename to aero-collections/src/mail/snapshot.rs diff --git a/aero-collections/mail/uidindex.rs b/aero-collections/src/mail/uidindex.rs similarity index 99% rename from aero-collections/mail/uidindex.rs rename to aero-collections/src/mail/uidindex.rs index 5a06670..637a1ac 100644 --- a/aero-collections/mail/uidindex.rs +++ b/aero-collections/src/mail/uidindex.rs @@ -3,7 +3,7 @@ use std::num::{NonZeroU32, NonZeroU64}; use im::{HashMap, OrdMap, OrdSet}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use crate::bayou::*; +use aero_bayou::*; use crate::mail::unique_ident::UniqueIdent; pub type ModSeq = NonZeroU64; diff --git a/aero-collections/mail/unique_ident.rs b/aero-collections/src/mail/unique_ident.rs similarity index 98% rename from aero-collections/mail/unique_ident.rs rename to aero-collections/src/mail/unique_ident.rs index 0e629db..0987a2c 100644 --- a/aero-collections/mail/unique_ident.rs +++ b/aero-collections/src/mail/unique_ident.rs @@ -5,7 +5,7 @@ use lazy_static::lazy_static; use rand::prelude::*; use serde::{de::Error, Deserialize, Deserializer, Serialize, Serializer}; -use crate::timestamp::now_msec; +use aero_bayou::timestamp::now_msec; /// An internal Mail Identifier is composed of two components: /// - a process identifier, 128 bits, itself composed of: diff --git a/aero-collections/user.rs b/aero-collections/src/user.rs similarity index 97% rename from aero-collections/user.rs rename to aero-collections/src/user.rs index a38b9c1..193ce90 100644 --- a/aero-collections/user.rs +++ b/aero-collections/src/user.rs @@ -1,20 +1,18 @@ -use std::collections::{BTreeMap, HashMap}; +use std::collections::HashMap; use std::sync::{Arc, Weak}; use anyhow::{anyhow, bail, Result}; use lazy_static::lazy_static; -use serde::{Deserialize, Serialize}; use tokio::sync::watch; -use crate::cryptoblob::{open_deserialize, seal_serialize}; -use crate::login::Credentials; +use aero_user::cryptoblob::{open_deserialize, seal_serialize}; +use aero_user::login::Credentials; +use aero_user::storage; + use crate::mail::incoming::incoming_mail_watch_process; use crate::mail::mailbox::Mailbox; use crate::mail::uidindex::ImapUidvalidity; -use crate::mail::unique_ident::{gen_ident, UniqueIdent}; -use crate::storage; -use crate::timestamp::now_msec; - +use crate::mail::unique_ident::UniqueIdent; use crate::mail::namespace::{MAILBOX_HIERARCHY_DELIMITER, INBOX, DRAFTS, ARCHIVE, SENT, TRASH, MAILBOX_LIST_PK, MAILBOX_LIST_SK,MailboxList,CreatedMailbox}; //@FIXME User should be totally rewriten