From 0b20d726bbc75e0dfd2ba1900ca5ea697645a8f1 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Thu, 15 Feb 2024 11:12:20 +0100 Subject: [PATCH 01/16] Add a 100 emails dataset on Git LFS --- tests/emails/.gitattributes | 1 + tests/emails/.gitignore | 1 + tests/emails/aero100.mbox.zstd | 3 +++ 3 files changed, 5 insertions(+) create mode 100644 tests/emails/.gitattributes create mode 100644 tests/emails/.gitignore create mode 100644 tests/emails/aero100.mbox.zstd diff --git a/tests/emails/.gitattributes b/tests/emails/.gitattributes new file mode 100644 index 0000000..1e01fd4 --- /dev/null +++ b/tests/emails/.gitattributes @@ -0,0 +1 @@ +*.zstd filter=lfs diff=lfs merge=lfs -text diff --git a/tests/emails/.gitignore b/tests/emails/.gitignore new file mode 100644 index 0000000..18e5b03 --- /dev/null +++ b/tests/emails/.gitignore @@ -0,0 +1 @@ +*.mbox diff --git a/tests/emails/aero100.mbox.zstd b/tests/emails/aero100.mbox.zstd new file mode 100644 index 0000000..fea64e0 --- /dev/null +++ b/tests/emails/aero100.mbox.zstd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26ef794e27662426602351335f1847d3497d40068422b59042b4bf2bf3b700d5 +size 15844589 From 4aa31ba8b5d9ac17a0d969f0b02eb9d317591667 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Fri, 16 Feb 2024 18:55:46 +0100 Subject: [PATCH 02/16] Add datasets --- Cargo.nix | 2 +- flake.nix | 4 +- tests/emails/imap_commands_dataset.log | 240 +++ tests/emails/imap_commands_summary.csv | 45 + tests/emails/mailbox_email_sizes.csv | 2428 ++++++++++++++++++++++++ tests/emails/report.R | 14 + 6 files changed, 2730 insertions(+), 3 deletions(-) create mode 100644 tests/emails/imap_commands_dataset.log create mode 100644 tests/emails/imap_commands_summary.csv create mode 100644 tests/emails/mailbox_email_sizes.csv create mode 100644 tests/emails/report.R diff --git a/Cargo.nix b/Cargo.nix index 3a77fae..164d505 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -4931,7 +4931,7 @@ in ${ if hostPlatform.isUnix then "signal_hook_registry" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".signal-hook-registry."1.4.1" { inherit profileName; }).out; socket2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".socket2."0.5.5" { inherit profileName; }).out; tokio_macros = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-macros."2.2.0" { profileName = "__noProfile"; }).out; - ${ if true then "tracing" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out; + ${ if false then "tracing" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out; ${ if hostPlatform.isWindows then "windows_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.48.0" { inherit profileName; }).out; }; }); diff --git a/flake.nix b/flake.nix index 0c0f783..5dae3c4 100644 --- a/flake.nix +++ b/flake.nix @@ -61,8 +61,8 @@ packageFun = import ./Cargo.nix; target = rustTarget; release = true; - rustcLinkFlags = [ "--cfg" "tokio_unstable" ]; - rustcBuildFlags = [ "--cfg" "tokio_unstable" ]; + #rustcLinkFlags = [ "--cfg" "tokio_unstable" ]; + #rustcBuildFlags = [ "--cfg" "tokio_unstable" ]; rustToolchain = with fenix.packages.x86_64-linux; combine [ minimal.cargo minimal.rustc diff --git a/tests/emails/imap_commands_dataset.log b/tests/emails/imap_commands_dataset.log new file mode 100644 index 0000000..00223d8 --- /dev/null +++ b/tests/emails/imap_commands_dataset.log @@ -0,0 +1,240 @@ +Append { mailbox: Other(MailboxOther(Atom(AtomExt("Sent")))), flags: [Seen], date: None, message: REDACTED } } +Append { mailbox: Other(MailboxOther(String(Quoted(Quoted("Drafts"))))), flags: [Seen, Draft], date: None, message: REDACTED } } +Append { mailbox: Other(MailboxOther(String(Quoted(Quoted("Sent"))))), flags: [Seen], date: None, message: REDACTED } } +Append { mailbox: Other(MailboxOther(String(Quoted(Quoted("Sent"))))), flags: [Seen], date: Some(2024-02-14T14:12:35+01:00), message: REDACTED } } +Capability +Check +Close +Create { mailbox: Other(MailboxOther(Atom(AtomExt("Mailspring")))) } } +Create { mailbox: Other(MailboxOther(String(Quoted(Quoted("Dataset"))))) } } +Create { mailbox: Other(MailboxOther(String(Quoted(Quoted("Mailspring.Snoozed"))))) } } +Enable { capabilities: [CondStore]+ } } +Enable { capabilities: [Utf8(Accept)]+ } } +Examine { mailbox: Inbox, modifiers: [] } } +Expunge { uid_sequence_set: None } } +Fetch { sequence_set: SequenceSet([Range(Asterisk, Value(5))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Envelope, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("References"))]+)), partial: None, peek: true }]), uid: false } } +Fetch { sequence_set: SequenceSet([Range(Value(12), Value(13))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Uid, Rfc822Size, Flags, ModSeq, BodyExt { section: Some(Header(None)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [ChangedSince(22)], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [ChangedSince(24)], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [ChangedSince(5)], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [ChangedSince(638435220681800000)], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [ChangedSince(638435229950250000)], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [ChangedSince(638435249520030000)], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [ChangedSince(6)], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [ChangedSince(7)], macro_or_item_names: MessageDataItemNames([Uid, Flags, Envelope, InternalDate, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("References"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [ChangedSince(8)], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, InternalDate, Rfc822Size, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("DATE")), Atom(AtomExt("FROM")), Atom(AtomExt("SENDER")), Atom(AtomExt("SUBJECT")), Atom(AtomExt("TO")), Atom(AtomExt("CC")), Atom(AtomExt("MESSAGE-ID")), Atom(AtomExt("REFERENCES")), Atom(AtomExt("CONTENT-TYPE")), Atom(AtomExt("CONTENT-DESCRIPTION")), Atom(AtomExt("IN-REPLY-TO")), Atom(AtomExt("REPLY-TO")), Atom(AtomExt("LINES")), Atom(AtomExt("LIST-POST")), Atom(AtomExt("X-LABEL"))]+)), partial: None, peek: true }]), uid: false } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(20))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, Envelope, InternalDate, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("References"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(20))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(23))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags, Uid]), uid: false } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Uid, Flags, Rfc822Size, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("DATE")), Atom(AtomExt("FROM")), Atom(AtomExt("SUBJECT")), Atom(AtomExt("CONTENT-TYPE")), Atom(AtomExt("X-MS-TNEF-Correlator")), Atom(AtomExt("CONTENT-CLASS")), Atom(AtomExt("IMPORTANCE")), Atom(AtomExt("PRIORITY")), Atom(AtomExt("X-PRIORITY")), Atom(AtomExt("THREAD-TOPIC")), Atom(AtomExt("REPLY-TO"))]+)), partial: None, peek: true }, BodyStructure]), uid: false } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, InternalDate, Rfc822Size, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("DATE")), Atom(AtomExt("FROM")), Atom(AtomExt("SENDER")), Atom(AtomExt("SUBJECT")), Atom(AtomExt("TO")), Atom(AtomExt("CC")), Atom(AtomExt("MESSAGE-ID")), Atom(AtomExt("REFERENCES")), Atom(AtomExt("CONTENT-TYPE")), Atom(AtomExt("CONTENT-DESCRIPTION")), Atom(AtomExt("IN-REPLY-TO")), Atom(AtomExt("REPLY-TO")), Atom(AtomExt("LINES")), Atom(AtomExt("LIST-POST")), Atom(AtomExt("X-LABEL"))]+)), partial: None, peek: true }]), uid: false } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid]), uid: false } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2)), Range(Value(11), Value(13)), Range(Value(18), Value(19)), Range(Value(22), Value(26))]+), modifiers: [ChangedSince(68)], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2)), Range(Value(11), Value(13)), Range(Value(18), Value(19)), Range(Value(22), Value(26))]+), modifiers: [ChangedSince(69)], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2)), Range(Value(11), Value(13)), Range(Value(18), Value(19)), Range(Value(22), Value(26)), Range(Value(33), Value(34))]+), modifiers: [ChangedSince(102)], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2)), Range(Value(11), Value(13)), Range(Value(18), Value(19)), Range(Value(22), Value(26)), Range(Value(33), Value(34))]+), modifiers: [ChangedSince(189)], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2)), Range(Value(11), Value(13)), Range(Value(18), Value(19)), Range(Value(22), Value(26)), Range(Value(33), Value(34))]+), modifiers: [ChangedSince(81)], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2)), Range(Value(11), Value(13)), Range(Value(18), Value(19)), Range(Value(22), Value(26)), Range(Value(33), Value(34)), Range(Value(60), Value(62))]+), modifiers: [ChangedSince(165)], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2)), Range(Value(11), Value(13)), Range(Value(18), Value(19)), Range(Value(22), Value(26)), Range(Value(33), Value(34)), Range(Value(60), Value(62))]+), modifiers: [ChangedSince(166)], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2)), Range(Value(11), Value(13)), Range(Value(18), Value(19)), Range(Value(22), Value(26)), Range(Value(33), Value(34)), Range(Value(60), Value(62))]+), modifiers: [ChangedSince(168)], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags, Uid]), uid: false } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: false } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(4))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Uid, Flags, Rfc822Size, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("DATE")), Atom(AtomExt("FROM")), Atom(AtomExt("SUBJECT")), Atom(AtomExt("CONTENT-TYPE")), Atom(AtomExt("X-MS-TNEF-Correlator")), Atom(AtomExt("CONTENT-CLASS")), Atom(AtomExt("IMPORTANCE")), Atom(AtomExt("PRIORITY")), Atom(AtomExt("X-PRIORITY")), Atom(AtomExt("THREAD-TOPIC")), Atom(AtomExt("REPLY-TO"))]+)), partial: None, peek: true }, BodyStructure]), uid: false } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(4))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, Envelope, InternalDate, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("References"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(4))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(6))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, Envelope, InternalDate, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("References"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(7))]+), modifiers: [ChangedSince(9)], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: false } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(1), Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(20), Value(23))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, Envelope, InternalDate, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("References"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(27), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(2), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(30), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(3), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(3), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(4), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(5), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(5), Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Uid, Flags, Rfc822Size, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("DATE")), Atom(AtomExt("FROM")), Atom(AtomExt("SUBJECT")), Atom(AtomExt("CONTENT-TYPE")), Atom(AtomExt("X-MS-TNEF-Correlator")), Atom(AtomExt("CONTENT-CLASS")), Atom(AtomExt("IMPORTANCE")), Atom(AtomExt("PRIORITY")), Atom(AtomExt("X-PRIORITY")), Atom(AtomExt("THREAD-TOPIC")), Atom(AtomExt("REPLY-TO"))]+)), partial: None, peek: true }, BodyStructure]), uid: false } } +Fetch { sequence_set: SequenceSet([Range(Value(5), Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(60), Value(62))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Uid, Rfc822Size, Flags, ModSeq, BodyExt { section: Some(Header(None)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(60), Value(62))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(63), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(6), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(6), Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, Envelope, InternalDate, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("References"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(6), Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, InternalDate, Envelope, BodyStructure, Rfc822Size, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("REFERENCES")), Atom(AtomExt("THREAD-TOPIC")), Atom(AtomExt("FROM")), Atom(AtomExt("SENDER")), Atom(AtomExt("REPLY-TO"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(6), Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(86), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(8), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Range(Value(9), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(13))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Header(None)), partial: None, peek: true }, BodyExt { section: Some(Text(None)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: None, partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags, Uid]), uid: false } } +Fetch { sequence_set: SequenceSet([Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header, BodyExt { section: Some(Part(Part([1]+))), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: false }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Resent-Message-ID")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To")), Atom(AtomExt("List-Unsubscribe")), Atom(AtomExt("Received")), Atom(AtomExt("Delivery-Date"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(1)), Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("bcc")), Atom(AtomExt("cc")), Atom(AtomExt("date")), Atom(AtomExt("from")), Atom(AtomExt("reply-to")), Atom(AtomExt("sender")), Atom(AtomExt("subject")), Atom(AtomExt("to"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(1)), Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("in-reply-to")), Atom(AtomExt("message-id")), Atom(AtomExt("references"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(1)), Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Text(None)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(1)), Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Rfc822Size, Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(1)), Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(22))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: None, partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(24))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, BodyExt { section: Some(Text(None)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(24))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, InternalDate, Envelope, BodyStructure, Rfc822Size, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("REFERENCES")), Atom(AtomExt("THREAD-TOPIC")), Atom(AtomExt("FROM")), Atom(AtomExt("SENDER")), Atom(AtomExt("REPLY-TO"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(24))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(24))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(24)), Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Resent-Message-ID")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To")), Atom(AtomExt("List-Unsubscribe")), Atom(AtomExt("Received")), Atom(AtomExt("Delivery-Date"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(29))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(29))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: None, partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Text(None)), partial: None, peek: true }]), uid: false } } +Fetch { sequence_set: SequenceSet([Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Envelope, InternalDate, Rfc822Size, Flags, BodyStructure, Uid, BodyExt { section: Some(Header(None)), partial: None, peek: true }, Rfc822Size, InternalDate]), uid: false } } +Fetch { sequence_set: SequenceSet([Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header, BodyExt { section: Some(Part(Part([1]+))), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header, BodyExt { section: Some(Part(Part([2]+))), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(2)), Single(Value(8))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: None, partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Uid, Flags, Rfc822Size, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("DATE")), Atom(AtomExt("FROM")), Atom(AtomExt("SUBJECT")), Atom(AtomExt("CONTENT-TYPE")), Atom(AtomExt("X-MS-TNEF-Correlator")), Atom(AtomExt("CONTENT-CLASS")), Atom(AtomExt("IMPORTANCE")), Atom(AtomExt("PRIORITY")), Atom(AtomExt("X-PRIORITY")), Atom(AtomExt("THREAD-TOPIC")), Atom(AtomExt("REPLY-TO"))]+)), partial: None, peek: true }, BodyStructure]), uid: false } } +Fetch { sequence_set: SequenceSet([Single(Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header, BodyExt { section: Some(Part(Part([1]+))), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header, BodyExt { section: Some(Part(Part([2]+))), partial: Some((0, 10240)), peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, BodyStructure, InternalDate, Rfc822Size]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, InternalDate, Envelope, BodyStructure, Rfc822Size, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("REFERENCES")), Atom(AtomExt("THREAD-TOPIC")), Atom(AtomExt("FROM")), Atom(AtomExt("SENDER")), Atom(AtomExt("REPLY-TO")), Atom(AtomExt("AUTO-SUBMITTED")), Atom(AtomExt("BOUNCES-TO")), Atom(AtomExt("LIST-ARCHIVE")), Atom(AtomExt("LIST-HELP")), Atom(AtomExt("LIST-ID")), Atom(AtomExt("LIST-OWNER")), Atom(AtomExt("LIST-POST")), Atom(AtomExt("LIST-SUBSCRIBE")), Atom(AtomExt("LIST-UNSUBSCRIBE")), Atom(AtomExt("PRECEDENCE")), Atom(AtomExt("RESENT-FROM")), Atom(AtomExt("RETURN-PATH"))]+)), partial: None, peek: true }, BodyExt { section: Some(Text(None)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(3)), Single(Value(2)), Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Resent-Message-ID")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To")), Atom(AtomExt("List-Unsubscribe")), Atom(AtomExt("Received")), Atom(AtomExt("Delivery-Date"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(4))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: None, partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(4))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header, BodyExt { section: Some(Part(Part([2, 1]+))), partial: None, peek: true }, BodyExt { section: Some(Part(Part([2, 2]+))), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(4))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(4)), Single(Value(3)), Single(Value(2)), Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(5))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: None, partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(5))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header, BodyExt { section: Some(Part(Part([1, 2]+))), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(5))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(5))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(60))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Part(Part([1, 2]+))), partial: Some((0, 2227)), peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(60))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Part(Part([2]+))), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(60))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyStructure, BodyExt { section: Some(Header(None)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(60))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(61))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Header(None)), partial: None, peek: true }, BodyExt { section: Some(Text(None)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(62))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Part(Part([1, 2]+))), partial: Some((0, 711)), peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(62))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Part(Part([2]+))), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(62))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyStructure, BodyExt { section: Some(Header(None)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(62))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(6))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header, BodyExt { section: Some(Part(Part([2]+))), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(6))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, BodyExt { section: Some(Part(Part([2]+))), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(6))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, Envelope, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("References"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(6))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Header(None)), partial: None, peek: true }, BodyExt { section: Some(Text(None)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Uid, Rfc822Size, Flags, ModSeq, BodyExt { section: Some(Header(None)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header, BodyExt { section: Some(Part(Part([1, 2]+))), partial: None, peek: true }, BodyExt { section: Some(Part(Part([2]+))), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, BodyExt { section: Some(Part(Part([1, 2]+))), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(7)), Single(Value(6)), Single(Value(5)), Single(Value(4)), Single(Value(3)), Single(Value(2)), Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Resent-Message-ID")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To")), Atom(AtomExt("List-Unsubscribe")), Atom(AtomExt("Received")), Atom(AtomExt("Delivery-Date"))]+)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(83))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Header(None)), partial: None, peek: true }, BodyExt { section: Some(Text(None)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(83))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Uid, Rfc822Size, Flags, ModSeq, BodyExt { section: Some(Header(None)), partial: None, peek: true }]), uid: true } } +Fetch { sequence_set: SequenceSet([Single(Value(85))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Uid, Rfc822Size, Flags, ModSeq, BodyExt { section: Some(Header(None)), partial: None, peek: true }]), uid: true } } +Idle +List { reference: Other(MailboxOther(String(Quoted(Quoted("Archive."))))), mailbox_wildcard: Token(ListCharString("*")), return: [] } } +List { reference: Other(MailboxOther(String(Quoted(Quoted("INBOX."))))), mailbox_wildcard: Token(ListCharString("*")), return: [] } } +List { reference: Other(MailboxOther(String(Quoted(Quoted(""))))), mailbox_wildcard: String(Quoted(Quoted("Dataset"))), return: [] } } +List { reference: Other(MailboxOther(String(Quoted(Quoted(""))))), mailbox_wildcard: String(Quoted(Quoted("INBOX"))), return: [] } } +List { reference: Other(MailboxOther(String(Quoted(Quoted(""))))), mailbox_wildcard: String(Quoted(Quoted(""))), return: [] } } +List { reference: Other(MailboxOther(String(Quoted(Quoted(""))))), mailbox_wildcard: String(Quoted(Quoted("*"))), return: [] } } +List { reference: Other(MailboxOther(String(Quoted(Quoted(""))))), mailbox_wildcard: String(Quoted(Quoted("*"))), return: [Status([Unseen])] } } +List { reference: Other(MailboxOther(String(Quoted(Quoted(""))))), mailbox_wildcard: Token(ListCharString("INBOX")), return: [] } } +List { reference: Other(MailboxOther(String(Quoted(Quoted(""))))), mailbox_wildcard: Token(ListCharString("%")), return: [] } } +List { reference: Other(MailboxOther(String(Quoted(Quoted("Mailspring."))))), mailbox_wildcard: Token(ListCharString("*")), return: [] } } +List { reference: Other(MailboxOther(String(Quoted(Quoted("Sent."))))), mailbox_wildcard: Token(ListCharString("*")), return: [] } } +List { reference: Other(MailboxOther(String(Quoted(Quoted("Trash."))))), mailbox_wildcard: Token(ListCharString("*")), return: [] } } +Login { username: Atom(AtomExt("REDACTED")), password: /* REDACTED */ } } +Login { username: String(Quoted(Quoted("REDACTED"))), password: /* REDACTED */ } } +Login { username: String(Quoted(Quoted("REDACTED@saint-ex.deuxfleurs.org"))), password: /* REDACTED */ } } +Logout +Lsub { reference: Other(MailboxOther(String(Quoted(Quoted(""))))), mailbox_wildcard: String(Quoted(Quoted("*"))) } } +Move { sequence_set: SequenceSet([Range(Value(20), Value(21))]+), mailbox: Other(MailboxOther(String(Quoted(Quoted("Dataset"))))), uid: true } } +Move { sequence_set: SequenceSet([Single(Value(29))]+), mailbox: Other(MailboxOther(String(Quoted(Quoted("Dataset"))))), uid: true } } +Noop +Search { charset: None, criteria: And([Header(Atom(AtomExt("Message-ID")), Atom(AtomExt(""))), Undeleted]+), uid: true } } +Search { charset: None, criteria: And([SequenceSet(SequenceSet([Range(Value(1), Asterisk)]+)), Deleted]+), uid: true } } +Search { charset: None, criteria: And([SequenceSet(SequenceSet([Range(Value(1), Asterisk)]+)), Not(Deleted)]+), uid: true } } +Search { charset: None, criteria: And([SequenceSet(SequenceSet([Range(Value(1), Asterisk)]+)), Since(2023-11-16)]+), uid: true } } +Search { charset: None, criteria: And([SequenceSet(SequenceSet([Range(Value(1), Asterisk)]+)), Unseen]+), uid: true } } +Search { charset: None, criteria: And([SequenceSet(SequenceSet([Range(Value(1), Value(1))]+)), Not(Deleted)]+), uid: true } } +Search { charset: None, criteria: And([SequenceSet(SequenceSet([Range(Value(1), Value(4))]+)), Not(Deleted)]+), uid: true } } +Search { charset: None, criteria: And([Since(2024-02-07), All]+), uid: false } } +Search { charset: None, criteria: And([Since(2024-02-08), All]+), uid: false } } +Search { charset: None, criteria: And([Since(2024-02-09), All]+), uid: false } } +Search { charset: None, criteria: And([Undeleted, Since(2023-11-17)]+), uid: false } } +Search { charset: None, criteria: And([Undeleted, Since(2024-02-13)]+), uid: false } } +Search { charset: None, criteria: Before(2024-02-09), uid: true } } +Search { charset: None, criteria: Since(2024-01-31), uid: true } } +Select { mailbox: Inbox, modifiers: [] } } +Select { mailbox: Inbox, modifiers: [Condstore] } } +Select { mailbox: Other(MailboxOther(Atom(AtomExt("Archive")))), modifiers: [] } } +Select { mailbox: Other(MailboxOther(Atom(AtomExt("Drafts")))), modifiers: [] } } +Select { mailbox: Other(MailboxOther(Atom(AtomExt("Mailspring")))), modifiers: [] } } +Select { mailbox: Other(MailboxOther(Atom(AtomExt("Sent")))), modifiers: [] } } +Select { mailbox: Other(MailboxOther(Atom(AtomExt("Test.Coucou")))), modifiers: [] } } +Select { mailbox: Other(MailboxOther(Atom(AtomExt("Test")))), modifiers: [] } } +Select { mailbox: Other(MailboxOther(Atom(AtomExt("Trash")))), modifiers: [] } } +Select { mailbox: Other(MailboxOther(String(Quoted(Quoted("Archive"))))), modifiers: [] } } +Select { mailbox: Other(MailboxOther(String(Quoted(Quoted("Dataset"))))), modifiers: [] } } +Select { mailbox: Other(MailboxOther(String(Quoted(Quoted("Drafts"))))), modifiers: [] } } +Select { mailbox: Other(MailboxOther(String(Quoted(Quoted("INBOX.Pourriel"))))), modifiers: [] } } +Select { mailbox: Other(MailboxOther(String(Quoted(Quoted("Mailspring"))))), modifiers: [] } } +Select { mailbox: Other(MailboxOther(String(Quoted(Quoted("Mailspring.Snoozed"))))), modifiers: [] } } +Select { mailbox: Other(MailboxOther(String(Quoted(Quoted("Sent"))))), modifiers: [] } } +Select { mailbox: Other(MailboxOther(String(Quoted(Quoted("Sent"))))), modifiers: [Condstore] } } +Select { mailbox: Other(MailboxOther(String(Quoted(Quoted("Trash"))))), modifiers: [] } } +Status { mailbox: Inbox, item_names: [Messages, Recent, UidNext, UidValidity, Unseen] } } +Status { mailbox: Inbox, item_names: [Unseen, Messages, Recent, UidNext, UidValidity, HighestModSeq] } } +Status { mailbox: Other(MailboxOther(Atom(AtomExt("Archive")))), item_names: [Unseen, Messages, Recent, UidNext, UidValidity, HighestModSeq] } } +Status { mailbox: Other(MailboxOther(Atom(AtomExt("Drafts")))), item_names: [Unseen, Messages, Recent, UidNext, UidValidity, HighestModSeq] } } +Status { mailbox: Other(MailboxOther(Atom(AtomExt("Mailspring")))), item_names: [Unseen, Messages, Recent, UidNext, UidValidity, HighestModSeq] } } +Status { mailbox: Other(MailboxOther(Atom(AtomExt("Sent")))), item_names: [Unseen, Messages, Recent, UidNext, UidValidity, HighestModSeq] } } +Status { mailbox: Other(MailboxOther(Atom(AtomExt("Trash")))), item_names: [Unseen, Messages, Recent, UidNext, UidValidity, HighestModSeq] } } +Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Archive"))))), item_names: [UidNext, Messages, Unseen, Recent] } } +Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Archive"))))), item_names: [UidNext, UidValidity, Unseen, Recent] } } +Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Drafts"))))), item_names: [Messages] } } +Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Drafts"))))), item_names: [UidNext, Messages, Unseen, Recent] } } +Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Drafts"))))), item_names: [UidNext, UidValidity, Unseen, Recent] } } +Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("INBOX.Pourriel"))))), item_names: [UidNext, Messages, Unseen, Recent] } } +Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("INBOX.Pourriel"))))), item_names: [Unseen, Messages, Recent, UidNext, UidValidity, HighestModSeq] } } +Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Mailspring"))))), item_names: [UidNext, Messages, Unseen, Recent] } } +Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Mailspring.Snoozed"))))), item_names: [UidNext, Messages, Unseen, Recent] } } +Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Mailspring.Snoozed"))))), item_names: [Unseen, Messages, Recent, UidNext, UidValidity, HighestModSeq] } } +Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Sent"))))), item_names: [UidNext, Messages, Unseen, Recent] } } +Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Sent"))))), item_names: [UidNext, UidValidity, Unseen, Recent] } } +Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Test.Coucou"))))), item_names: [UidNext, UidValidity, Unseen, Recent] } } +Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Test"))))), item_names: [UidNext, UidValidity, Unseen, Recent] } } +Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Trash"))))), item_names: [UidNext, UidValidity, Unseen, Recent] } } +Store { sequence_set: SequenceSet([Range(Value(60), Value(62))]+), kind: Add, response: Answer, flags: [Deleted], modifiers: [], uid: true } } +Store { sequence_set: SequenceSet([Range(Value(60), Value(62))]+), kind: Add, response: Answer, flags: [Deleted, Seen], modifiers: [], uid: true } } +Store { sequence_set: SequenceSet([Range(Value(60), Value(62))]+), kind: Add, response: Answer, flags: [Seen, Deleted], modifiers: [], uid: true } } +Store { sequence_set: SequenceSet([Single(Value(1))]+), kind: Add, response: Answer, flags: [Seen], modifiers: [], uid: true } } +Store { sequence_set: SequenceSet([Single(Value(24))]+), kind: Add, response: Answer, flags: [Seen, Deleted], modifiers: [], uid: true } } +Store { sequence_set: SequenceSet([Single(Value(24))]+), kind: Add, response: Answer, flags: [Seen], modifiers: [], uid: true } } +Store { sequence_set: SequenceSet([Single(Value(26))]+), kind: Add, response: Answer, flags: [Answered], modifiers: [], uid: true } } +Store { sequence_set: SequenceSet([Single(Value(29))]+), kind: Add, response: Answer, flags: [Keyword(Atom("NonJunk"))], modifiers: [], uid: true } } +Store { sequence_set: SequenceSet([Single(Value(29))]+), kind: Add, response: Answer, flags: [Seen], modifiers: [], uid: true } } +Store { sequence_set: SequenceSet([Single(Value(2))]+), kind: Add, response: Answer, flags: [Seen], modifiers: [], uid: false } } +Store { sequence_set: SequenceSet([Single(Value(2))]+), kind: Add, response: Silent, flags: [Deleted], modifiers: [], uid: true } } +Store { sequence_set: SequenceSet([Single(Value(3))]+), kind: Add, response: Answer, flags: [Seen], modifiers: [], uid: true } } +Store { sequence_set: SequenceSet([Single(Value(3))]+), kind: Add, response: Silent, flags: [Seen], modifiers: [], uid: true } } +Store { sequence_set: SequenceSet([Single(Value(5))]+), kind: Add, response: Answer, flags: [Keyword(Atom("NonJunk"))], modifiers: [], uid: true } } +Store { sequence_set: SequenceSet([Single(Value(60))]+), kind: Add, response: Answer, flags: [Seen, Deleted], modifiers: [], uid: true } } +Store { sequence_set: SequenceSet([Single(Value(60))]+), kind: Add, response: Silent, flags: [Seen], modifiers: [], uid: true } } +Store { sequence_set: SequenceSet([Single(Value(61))]+), kind: Add, response: Answer, flags: [Seen, Deleted], modifiers: [], uid: true } } +Store { sequence_set: SequenceSet([Single(Value(61))]+), kind: Add, response: Silent, flags: [Seen], modifiers: [], uid: true } } +Store { sequence_set: SequenceSet([Single(Value(62))]+), kind: Add, response: Silent, flags: [Seen], modifiers: [], uid: true } } +Subscribe { mailbox: Other(MailboxOther(Atom(AtomExt("Mailspring")))) } } +Subscribe { mailbox: Other(MailboxOther(String(Quoted(Quoted("Dataset"))))) } } +Subscribe { mailbox: Other(MailboxOther(String(Quoted(Quoted("Mailspring.Snoozed"))))) } } +Unselect diff --git a/tests/emails/imap_commands_summary.csv b/tests/emails/imap_commands_summary.csv new file mode 100644 index 0000000..d04803b --- /dev/null +++ b/tests/emails/imap_commands_summary.csv @@ -0,0 +1,45 @@ +count,command,aggregation +6,Append,Raw +33,Capability,Raw +96,Check,Raw +6,Close,Raw +3,Create,Raw +9,Enable,Raw +26,Examine,Raw +1,Expunge,Raw +1187,Fetch,Raw +248,Idle,Raw +132,List,Raw +244,Login,Raw +169,Logout,Raw +14,Lsub,Raw +2,Move,Raw +295,Noop,Raw +658,Search,Raw +746,Select,Raw +203,Status,Raw +23,Store,Raw +3,Subscribe,Raw +515,Unselect,Raw +6,Append,Unique +1,Capability,Unique +1,Check,Unique +1,Close,Unique +3,Create,Unique +2,Enable,Unique +1,Examine,Unique +1,Expunge,Unique +128,Fetch,Unique +1,Idle,Unique +12,List,Unique +9,Login,Unique +1,Logout,Unique +1,Lsub,Unique +2,Move,Unique +1,Noop,Unique +14,Search,Unique +18,Select,Unique +22,Status,Unique +19,Store,Unique +3,Subscribe,Unique +1,Unselect,Unique diff --git a/tests/emails/mailbox_email_sizes.csv b/tests/emails/mailbox_email_sizes.csv new file mode 100644 index 0000000..afcd630 --- /dev/null +++ b/tests/emails/mailbox_email_sizes.csv @@ -0,0 +1,2428 @@ +pos,size,mailbox +0,10988,personal +1,27704,personal +2,43026,personal +3,55998,personal +4,92193,personal +5,6348,personal +6,5312,personal +7,5820,personal +8,5275,personal +9,5312,personal +10,6817,personal +11,5412,personal +12,4758,personal +13,10434,personal +14,16572,personal +15,108694,personal +16,3464,personal +17,38964,personal +18,3842,personal +19,133952,personal +20,2975,personal +21,4101,personal +22,8128,personal +23,11277,personal +24,1945,personal +25,16028,personal +26,2430,personal +27,2616,personal +28,54781,personal +29,83451,personal +30,50419,personal +31,12881,personal +32,11385,personal +33,37353,personal +34,1345,personal +35,130505,personal +36,109192,personal +37,11364,personal +38,59164,personal +39,1436448,personal +40,1436447,personal +41,9917,personal +42,29469,personal +43,6040,personal +44,6199,personal +45,4842,personal +46,5317,personal +47,5117,personal +48,20511,personal +49,20511,personal +50,20524,personal +51,29203,personal +52,28611,personal +53,6964,personal +54,29148,personal +55,8015,personal +56,7567,personal +57,8751,personal +58,233544,personal +59,7549,personal +60,5733,personal +61,168918,personal +62,4945,personal +63,6883,personal +64,260171,personal +65,116465,personal +66,1453,personal +67,6562,personal +68,6367,personal +69,5997,personal +70,5489,personal +71,6221,personal +72,61097,personal +73,5500,personal +74,10150,personal +75,5454,personal +76,5080,personal +77,9628,personal +78,6569,personal +79,6252,personal +80,110054,personal +81,5491,personal +82,5354,personal +83,31057,personal +84,4518,personal +85,6830,personal +86,5662,personal +87,6020,personal +88,5296,personal +89,5653,personal +90,5614,personal +91,124107,personal +92,123586,personal +93,5449,personal +94,84358,personal +95,16534,personal +96,11760,personal +97,40738,personal +98,5395,personal +99,4979,personal +100,5276,personal +101,4972,personal +102,211571,personal +103,5355,personal +104,16492,personal +105,50631,personal +106,1346,personal +107,6232,personal +108,41804,personal +109,5562,personal +110,3134,personal +111,45611,personal +112,765,personal +113,16546,personal +114,75240,personal +115,5911,personal +116,75363,personal +117,5155,personal +118,153337,personal +119,61773,personal +120,5419,personal +121,5441,personal +122,5395,personal +123,5419,personal +124,4982,personal +125,5296,personal +126,5851,personal +127,5499,personal +128,4832,personal +129,5403,personal +130,12702,personal +131,77842,personal +132,13377,personal +133,50691,personal +134,118018,personal +135,2497,personal +136,159149,personal +137,1874,personal +138,4531,personal +139,2970,personal +140,8801,personal +141,11430,personal +142,31230,personal +143,6065,personal +144,2097,personal +145,1318,personal +146,6243,personal +147,5766,personal +148,5370,personal +149,5224,personal +150,8626,personal +151,4274,personal +152,122687,personal +153,16568,personal +154,75293,personal +155,1582,personal +156,96133,personal +157,49847,personal +158,761,personal +159,8269,personal +160,102047,personal +161,7989,personal +162,6700512,personal +163,2735,personal +164,3924,personal +165,93180,personal +166,2272,personal +167,8262,personal +168,5306,personal +169,27415,personal +170,12684,personal +171,5699,personal +172,5557,personal +173,5311,personal +174,9829,personal +175,5393,personal +176,5249,personal +177,8247,personal +178,9504,personal +179,29354,personal +180,2977,personal +181,4488,personal +182,55256,personal +183,5364,personal +184,12328,personal +185,24247,personal +186,5454,personal +187,7421,personal +188,5268,personal +189,4743,personal +190,5515,personal +191,5364,personal +192,5352,personal +193,6734,personal +194,68126,personal +195,19590,personal +196,63306,personal +197,3383,personal +198,5425,personal +199,3405,personal +200,4690,personal +201,14973,personal +202,16278,personal +203,41111,personal +204,13487763,personal +205,23570,personal +206,7894,personal +207,6375,personal +208,4302,personal +209,154404,personal +210,7195,personal +211,3754,personal +212,2140,personal +213,12393,personal +214,71969,personal +215,16951,personal +216,62668,personal +217,35402,personal +218,8337,personal +219,18178,personal +220,22764,personal +221,13286,personal +222,65418,personal +223,42071,personal +224,1344,personal +225,4436,personal +226,12239,personal +227,4656,personal +228,35675,personal +229,1599,personal +230,3867,personal +231,54796,personal +232,11325,personal +233,2318,personal +234,697520,personal +235,95386,personal +236,4794,personal +237,699633,personal +238,216324,personal +239,54641,personal +240,15290,personal +241,4587,personal +242,20146,personal +243,10810,personal +244,223134,personal +245,5308,personal +246,5380,personal +247,5383,personal +248,15172,personal +249,11623,personal +250,5363,personal +251,124804,personal +252,7973,personal +253,51955,personal +254,116668,personal +255,3798,personal +256,6142,personal +257,51549,personal +258,11447,personal +259,20550,personal +260,23745,personal +261,2629,personal +262,29248,personal +263,2096,personal +264,26693,personal +265,14281,personal +266,1714,personal +267,14026,personal +268,22319,personal +269,2980,personal +270,2805,personal +271,5424,personal +272,5423,personal +273,5426,personal +274,5431,personal +275,35136,personal +276,120451,personal +277,5427,personal +278,5447,personal +279,5427,personal +280,12513,personal +281,29035,personal +282,1346,personal +283,1346,personal +284,30488,personal +285,1345,personal +286,74474,personal +287,286076,personal +288,34133,personal +289,20123,personal +290,36199,personal +291,37734,personal +292,35246,personal +293,23025,personal +294,1346,personal +295,11087,personal +296,3551263,personal +297,16963,personal +298,25394,personal +299,123716,personal +300,27672,personal +301,27712,personal +302,30050,personal +303,87408,personal +304,38683,personal +305,40160,personal +306,1346,personal +307,4780,personal +308,16601,personal +309,6065,personal +310,11431,personal +311,10365,personal +312,8934,personal +313,4340,personal +314,21579,personal +315,6877,personal +316,4070,personal +317,90207,personal +318,22981,personal +319,10319,personal +320,10359,personal +321,3478528,personal +322,879706,personal +323,9756,personal +324,1141732,personal +325,2216472,personal +326,5045,personal +327,5498,personal +328,4837,personal +329,5923,personal +330,4988,personal +331,4803,personal +332,6279,personal +333,4750,personal +334,229353,personal +335,6585,personal +336,5958,personal +337,7040,personal +338,5942,personal +339,5015,personal +340,4796,personal +341,60376,personal +342,18078,personal +343,13588,personal +344,21268,personal +345,5640,personal +346,32853,personal +347,139216,personal +348,6595,personal +349,1753,personal +350,1745,personal +351,2287,personal +352,165450,personal +353,15359,personal +354,31160,personal +355,2482519,personal +356,23041,personal +357,219359,personal +358,21070,personal +359,6087,personal +360,892629,personal +361,4765,personal +362,5605,personal +363,10979,personal +364,33973,personal +365,3412,personal +366,159790,personal +367,7499,personal +368,4668,personal +369,72384,personal +370,65135,personal +371,10649,personal +372,21299,personal +373,24338,personal +374,24273,personal +375,26460,personal +376,123105,personal +377,28210,personal +378,8109,personal +379,15858,personal +380,11430,personal +381,21620,personal +382,3604,personal +383,27469,personal +384,16633,personal +385,23103,personal +386,15261,personal +387,30289,personal +388,39715,personal +389,43012,personal +390,37162,personal +391,28633,personal +392,3526,personal +393,31052,personal +394,2600,personal +395,38025,personal +396,37960,personal +397,19971,personal +398,43690,personal +399,23588,personal +400,159106,personal +401,58972,personal +402,16365,personal +403,9157,personal +404,70530,personal +405,25035,personal +406,46121,personal +407,189615,personal +408,189623,personal +409,13374,personal +410,11030,personal +411,70461,personal +412,4478,personal +413,14946,personal +414,1345,personal +415,17999,personal +416,32282,personal +417,65622,personal +418,65600,personal +419,21125,personal +420,419621,personal +421,155859,personal +422,16185,personal +423,4443,personal +424,6216,personal +425,19750,personal +426,23160,personal +427,1211134,personal +428,1211176,personal +429,27636,personal +430,31129,personal +431,1168,personal +432,167150,personal +433,17741,personal +434,27816,personal +435,40235,personal +436,45600,personal +437,49645,personal +438,5336,personal +439,31775,personal +440,29347,personal +441,25679,personal +442,34324,personal +443,17325,personal +444,25600,personal +445,41884,personal +446,3889,personal +447,62773,personal +448,54677,personal +449,31018,personal +450,29346,personal +451,80042,personal +452,78099,personal +453,84093,personal +454,27588,personal +455,329106,personal +456,38900,personal +457,40378,personal +458,563565,personal +459,4332,personal +460,19009,personal +461,26851,personal +462,99596,personal +463,21971,personal +464,21588,personal +465,17282,personal +466,29329,personal +467,31991,personal +468,25679,personal +469,48542,personal +470,27567,personal +471,55265,personal +472,61304,personal +473,215578,personal +474,113788,personal +475,43532,personal +476,5323,personal +477,29329,personal +478,31991,personal +479,25676,personal +480,32442,personal +481,2247,personal +482,26550,personal +483,25247,personal +484,19597,personal +485,26551,personal +486,60706,personal +487,3355,personal +488,116004,personal +489,51180,personal +490,20399,personal +491,21186,personal +492,22222,personal +493,11889,personal +494,337173,personal +495,108663,personal +496,8307,personal +497,22748,personal +498,5460,personal +499,39727,personal +500,30202,personal +501,32228,personal +502,26555,personal +503,47412,personal +504,409018,personal +505,19738,personal +506,100835,personal +507,53070,personal +508,7831,personal +509,33014,personal +510,6480,personal +511,30210,personal +512,52665,personal +513,9327,personal +514,45697,personal +515,50784,personal +516,26812,personal +517,92628,personal +518,1013627,personal +519,215559,personal +520,5187,personal +521,149887,personal +522,3022,personal +523,23086,personal +524,23140,personal +525,93493,personal +526,41329,personal +527,41327,personal +528,170064,personal +529,14307,personal +530,331440,personal +531,2549,personal +532,2547,personal +533,2585,personal +534,6065,personal +535,19904,personal +536,10141,personal +537,10845,personal +538,26568,personal +539,109856,personal +540,11437,personal +541,49659,personal +542,94750,personal +543,10435,personal +544,17100,personal +545,91092,personal +546,4278,personal +547,5908,personal +548,3591,personal +549,50548,personal +550,44138,personal +551,30689,personal +552,7447,personal +553,3790,personal +554,73284,personal +555,36735,personal +556,94775,personal +557,91312,personal +558,12011,personal +559,7267,personal +560,8166,personal +561,3795,personal +562,4812,personal +563,14140,personal +564,8174,personal +565,4674,personal +566,2625,personal +567,3794,personal +568,84958,personal +569,1898,personal +570,84906,personal +571,5544,personal +572,5546,personal +573,9175,personal +574,6186,personal +575,48620,personal +576,3798,personal +577,766,personal +578,3097,personal +579,15819,personal +580,37577,personal +581,39888,personal +582,45569,personal +583,2595,personal +584,45303,personal +585,12022,personal +586,12064,personal +587,3840,personal +588,30648,personal +589,4277,personal +590,19520,personal +591,102074,personal +592,102075,personal +593,123217,personal +594,12530,personal +595,32545,personal +596,3796,personal +597,20593,personal +598,80377,personal +599,33252,personal +600,2022,personal +601,92874,personal +602,138321,personal +603,3794,personal +604,30204,personal +605,30207,personal +606,24814,personal +607,24856,personal +608,11708,personal +609,8236,personal +610,32797,personal +611,4917,personal +612,3091,personal +613,3093,personal +614,16726,personal +615,4851,personal +616,20339,personal +617,20379,personal +618,4847,personal +619,4628,personal +620,3796,personal +621,1746,personal +622,1738,personal +623,2274,personal +624,4799,personal +625,9469,personal +626,9469,personal +627,10630,personal +628,8170,personal +629,34914,personal +630,7785,personal +631,7785,personal +632,7785,personal +633,7785,personal +634,7785,personal +635,7785,personal +636,7785,personal +637,4346,personal +638,10014,personal +639,16288,personal +640,11084,personal +641,1346,personal +642,9202,personal +643,16097,personal +644,20571,personal +645,3294,personal +646,231192,personal +647,7810,personal +648,5515,personal +649,3229,personal +650,4331191,personal +651,16241,personal +652,23566,personal +653,4460,personal +654,4690,personal +655,47755,personal +656,26510,personal +657,69171,personal +658,100964,personal +659,97938,personal +660,112149,personal +661,61898,personal +662,5068,personal +663,60174,personal +664,5240,personal +665,16726,personal +666,16730,personal +667,4681,personal +668,4422,personal +669,155320,personal +670,72414,personal +671,41602,personal +672,1346,personal +673,1346,personal +674,27819,personal +675,16728,personal +676,30218,personal +677,45838,personal +678,199999,personal +679,3128,personal +680,3886,personal +681,3992,personal +682,4020,personal +683,4091,personal +684,2535680,personal +685,6750,personal +686,2926,personal +687,2946,personal +688,2677,personal +689,5403,personal +690,258438,personal +691,61329,personal +692,4883,personal +693,20765,personal +694,4452,personal +695,4758,personal +696,19750,personal +697,30211,personal +698,38731,personal +699,113183,personal +700,1345,personal +701,5671,personal +702,44266,personal +703,46228,personal +704,376289,personal +705,962,personal +706,16877,personal +707,36532,personal +708,71070,personal +709,47738,personal +710,30191,personal +711,3922,personal +712,3136,personal +713,11598,personal +714,44391,personal +715,41098,personal +716,32442,personal +717,5705,personal +718,42783,personal +719,15601,personal +720,120413,personal +721,5446,personal +722,1605,personal +723,8328659,personal +724,264852,personal +725,5956,personal +726,146369,personal +727,1605,personal +728,16963,personal +729,1692,personal +730,1345,personal +731,46910,personal +732,21578,personal +733,31118,personal +734,45763,personal +735,3163,personal +736,5029,personal +737,2306,personal +738,10955,personal +739,2316,personal +740,2948,personal +741,98182,personal +742,10595,personal +743,10637,personal +744,30850,personal +745,29825,personal +746,7687,personal +747,30684,personal +748,32378,personal +749,26581,personal +750,81517,personal +751,11431,personal +752,32228,personal +753,28181,personal +754,2200,personal +755,2092,personal +756,2307,personal +757,6065,personal +758,322708,personal +759,322711,personal +760,50991,personal +761,10809,personal +762,63100,personal +763,15641,personal +764,3215,personal +765,51839,personal +766,5291,personal +767,7086,personal +768,264849,personal +769,127296,personal +770,16469,personal +771,3658,personal +772,3261,personal +773,22822,personal +774,23941,personal +775,3656,personal +776,2452,personal +777,28751,personal +778,32646,personal +779,37442,personal +780,42287,personal +781,33442,personal +782,39108,personal +783,43848,personal +784,48539,personal +785,3822,personal +786,2759,personal +787,2650,personal +788,3146,personal +789,3519,personal +790,79643,personal +791,1519,personal +792,70038,personal +793,8862,personal +794,74977,personal +795,115250,personal +796,97631,personal +797,129978,personal +798,14296,personal +799,39014,personal +800,39056,personal +801,13225829,personal +802,33146,personal +803,1346,personal +804,103214,personal +805,154914,personal +806,126564,personal +807,110745,personal +808,115688,personal +809,382958,personal +810,1146569,personal +811,191439,personal +812,143936,personal +813,41810,personal +814,19189,personal +815,39112,personal +816,21466,personal +817,21508,personal +818,16257,personal +819,42901,personal +820,5230,personal +821,81946,personal +822,23043,personal +823,196068,personal +824,66879,personal +825,21272,personal +826,6185,personal +827,61727,personal +828,198514,personal +829,73220,personal +830,31402,personal +831,7125,personal +832,123046,personal +833,54125,personal +834,16732,personal +835,3949,personal +836,13974,personal +837,26512,personal +838,5216,personal +839,14727,personal +840,4558,personal +841,26122,personal +842,68225,personal +843,42271,personal +844,16243,personal +845,4697,personal +846,23562,personal +847,17425,personal +848,18839,personal +849,24558,personal +850,39161,personal +851,30036,personal +852,67071,personal +853,84460,personal +854,48272,personal +855,47312,personal +856,47027,personal +857,47426,personal +858,36573,personal +859,40378,personal +860,71618,personal +861,47761,personal +862,154922,personal +863,4226,personal +864,2806,personal +865,4974,personal +866,4720,personal +867,13346,personal +868,148283,personal +869,249741,personal +870,196070,personal +871,178058,personal +872,23657,personal +873,16718,personal +874,16718,personal +875,42660,personal +876,7096,personal +877,175456,personal +878,65954,personal +879,19750,personal +880,54656,personal +881,79684,personal +882,129385,personal +883,2231,personal +884,2231,personal +885,34642,personal +886,12216,personal +887,3712,personal +888,5586,personal +889,1007167,personal +890,3145,personal +891,416953,personal +892,13076,personal +893,15008,personal +894,10980,personal +895,11850,personal +896,203697,personal +897,52541,personal +898,58031,personal +899,2376,personal +900,44580,personal +901,6773,personal +902,39303,personal +903,73398,personal +904,1105766,personal +905,47101,personal +906,5466,personal +907,4666,personal +908,40382,personal +909,71558,personal +910,4947,personal +911,3713,personal +912,1346,personal +913,17413,personal +914,17537,personal +915,6262,personal +916,205042,personal +917,17031,personal +918,15311698,personal +919,30018,personal +920,111473,personal +921,15710,personal +922,125475,personal +923,39061,personal +924,1892,personal +925,28361,personal +926,6565,personal +927,2592,personal +928,35201,personal +929,2737,personal +930,41809,personal +931,97049,personal +932,1700951,personal +933,10869,personal +934,17207,personal +935,17249,personal +936,22429,personal +937,217977,personal +938,30833,personal +939,27591,personal +940,12407,personal +941,104585,personal +942,203694,personal +943,40370,personal +944,33448,personal +945,11435,personal +946,6065,personal +947,5615,personal +948,163229,personal +949,27636,personal +950,2385,personal +951,2382,personal +952,13407,personal +953,2936,personal +954,90101,personal +955,90143,personal +956,61186,personal +957,5822,personal +958,31820,personal +959,35042,personal +960,33470,personal +961,24861,personal +962,6658,personal +963,6574,personal +964,33216,personal +965,4461,personal +966,3780,personal +967,4157,personal +968,7683,personal +969,8026,personal +970,14391,personal +971,5237,personal +972,35491,personal +973,19168,personal +974,71953,personal +975,2023,personal +976,203698,personal +977,1346,personal +978,33755,personal +979,52617,personal +980,13076,personal +981,63332,personal +982,40240,personal +983,143079,personal +984,143121,personal +985,33779,personal +986,23079,personal +987,1660,personal +988,16261,personal +989,266286,personal +990,16229,personal +991,4688,personal +992,6850,personal +993,1284251,personal +994,49120,personal +995,1437,personal +996,96032,personal +997,5553,personal +998,16221,personal +999,128480,personal +1000,6780,personal +1001,24772,personal +1002,105102,personal +1003,135764,personal +1004,788403,personal +1005,22430,personal +1006,36292,personal +1007,144924,personal +1008,20354,personal +1009,1346,personal +1010,18134,personal +1011,16191,personal +1012,275120,personal +1013,23559,personal +1014,2935,personal +1015,80367,personal +1016,4106,personal +1017,13064,personal +1018,43034,personal +1019,26566,personal +1020,15792,personal +1021,5969,personal +1022,13684,personal +1023,6600,personal +1024,13838,personal +1025,18914,personal +1026,15052,personal +1027,84238,personal +1028,20822,personal +1029,19750,personal +1030,218390,personal +1031,13650,personal +1032,16418977,personal +1033,41458,personal +1034,16712,personal +1035,1438,personal +1036,1189,personal +1037,1074,personal +1038,23079,personal +1039,60074,personal +1040,54867,personal +1041,4989,personal +1042,18092,personal +1043,204887,personal +1044,56631,personal +1045,80294,personal +1046,5917,personal +1047,3213,personal +1048,2490793,personal +1049,2527,personal +1050,48147,personal +1051,31220,personal +1052,6671,personal +1053,19260,personal +1054,47634,personal +1055,35305,personal +1056,9236,personal +1057,4407,personal +1058,40474,personal +1059,11647,personal +1060,338144,personal +1061,16427205,personal +1062,66186,personal +1063,2022,personal +1064,13065,personal +1065,40453,personal +1066,6550,personal +1067,5843,personal +1068,6842,personal +1069,6363,personal +1070,204887,personal +1071,60386,personal +1072,19581,personal +1073,6465,personal +1074,12340,personal +1075,18905,personal +1076,164427,personal +1077,6657,personal +1078,8930,personal +1079,209718,personal +1080,12947,personal +1081,7038,personal +1082,6435,personal +1083,156944,personal +1084,5900,personal +1085,11433,personal +1086,8179,personal +1087,49051,personal +1088,3281,personal +1089,2802464,personal +1090,6758,personal +1091,13892,personal +1092,49054,personal +1093,175699,personal +1094,63602,personal +1095,488824,personal +1096,19787,personal +1097,6065,personal +1098,7371,personal +1099,9893,personal +1100,2721,personal +1101,869721,personal +1102,15040,personal +1103,116310,personal +1104,6281,personal +1105,259363,personal +1106,9523,personal +1107,17277,personal +1108,16716,personal +1109,3118,personal +1110,428015,personal +1111,11661,personal +1112,34556,personal +1113,3283,personal +1114,5579,personal +1115,3695,personal +1116,23653,personal +1117,8927,personal +1118,20847,personal +1119,65086,personal +1120,150393,personal +1121,1346,personal +1122,34267,personal +1123,3405,personal +1124,432856,personal +1125,24295,personal +1126,266636,personal +1127,337074,personal +1128,36175,personal +1129,7601,personal +1130,30233,personal +1131,67433,personal +1132,1199,personal +1133,7112,personal +1134,10505,personal +1135,7584,personal +1136,7207,personal +1137,3732,personal +1138,4568,personal +1139,1565,personal +1140,1565,personal +1141,13805,personal +1142,9238,personal +1143,5553,personal +1144,16712,personal +1145,6061,personal +1146,3438,personal +1147,25065,personal +1148,7300,personal +1149,60576,personal +1150,40593,personal +1151,3587,personal +1152,5764,personal +1153,5643,personal +1154,868992,personal +1155,129639,personal +1156,2509,personal +1157,204887,personal +1158,11224,personal +1159,16157,personal +1160,7153,personal +1161,16235,personal +1162,220108,personal +1163,106681,personal +1164,21523,personal +1165,281067,personal +1166,15037,personal +1167,5155,personal +1168,10287,personal +1169,253205,personal +1170,12285,personal +1171,63287,personal +1172,4483,personal +1173,4806,personal +1174,19118,personal +1175,3390,personal +1176,5693,personal +1177,33754,personal +1178,10962,personal +1179,16203,personal +1180,4704,personal +1181,22663,personal +1182,20584130,personal +1183,5056,personal +1184,4863,personal +1185,4581,personal +1186,5512,personal +1187,68110,personal +1188,4803,personal +1189,16188,personal +1190,16194,personal +1191,16228,personal +1192,6395,personal +1193,22446,personal +1194,155775,personal +1195,21905,personal +1196,3349,personal +1197,4591,personal +1198,4848,personal +1199,7026,personal +1200,53946,personal +1201,12050,personal +1202,5910,personal +1203,6495,personal +1204,7197,personal +1205,14455,personal +1206,18931,personal +1207,6187,personal +1208,16204,personal +1209,5145,personal +1210,4722,personal +1211,3228,personal +1212,2224,personal +1213,22837,personal +1214,205488,personal +1215,2552,personal +1216,16146,personal +1217,44144,personal +1218,85766,personal +1219,11668,personal +1220,19754,personal +1221,129639,personal +1222,1307,personal +1223,1630,personal +1224,4052,personal +1225,36680,personal +1226,45179,personal +1227,180734,personal +1228,147458,personal +1229,1849,personal +1230,25038,personal +1231,206466,personal +1232,40010,personal +1233,8902,personal +1234,11015,personal +1235,6410,personal +1236,17362,personal +1237,4684,personal +1238,21465,personal +1239,1573,personal +1240,3892,personal +1241,3510,personal +1242,48006,personal +1243,6514,personal +1244,4531,personal +1245,9921,personal +1246,10235,personal +1247,9891,personal +1248,9075,personal +1249,4883,personal +1250,5375,personal +1251,5147,personal +1252,13297,personal +1253,15804,personal +1254,16629,personal +1255,17866,personal +1256,21645,personal +1257,21529,personal +1258,21449,personal +1259,25047,personal +1260,25226,personal +1261,5252,personal +1262,5462,personal +1263,86317,personal +1264,49958,personal +1265,6249,personal +1266,1356,personal +1267,1945,personal +1268,5379,personal +1269,5379,personal +1270,1328,personal +1271,6589,personal +1272,6946,personal +1273,118937,personal +1274,94080,personal +1275,21613,personal +1276,21228,personal +1277,29264,personal +1278,1346,personal +1279,28229,personal +1280,8914,personal +1281,4881,personal +1282,13205,personal +1283,3093,personal +1284,34331,personal +1285,17309,personal +1286,18314,personal +1287,23460,personal +1288,16696,personal +1289,52973,personal +1290,4346,personal +1291,4107,personal +1292,21579,personal +1293,6570,personal +1294,6065,personal +1295,1287,personal +1296,1391,personal +1297,2665,personal +1298,4707,personal +1299,5693,personal +1300,252592,personal +1301,16187,personal +1302,44144,personal +1303,12515,personal +1304,4406,personal +1305,61550,personal +1306,29063,personal +1307,11435,personal +1308,82024,personal +1309,16169,personal +1310,3045,personal +1311,14136,personal +1312,25822,personal +1313,94127,personal +1314,3446,personal +1315,259217,personal +1316,22566,personal +1317,8299,personal +1318,4509,personal +1319,39879,personal +1320,11989,personal +1321,28332,personal +1322,7273,personal +1323,27794,personal +1324,50492,personal +1325,15283,personal +1326,6118,personal +1327,2788,personal +1328,20549,personal +1329,7858,personal +1330,3888,personal +1331,1684,personal +1332,1676,personal +1333,128500,personal +1334,3306,personal +1335,4522395,personal +1336,1730,personal +1337,1722,personal +1338,1594,personal +1339,20263,personal +1340,11447,personal +1341,31112,personal +1342,220809,personal +1343,422050,personal +1344,209401,personal +1345,81981,personal +1346,1558,personal +1347,7564,personal +1348,60817,personal +1349,6515,personal +1350,1346,personal +1351,91392,personal +1352,9906,personal +1353,160534,personal +1354,118358,personal +1355,4450,personal +1356,4321,personal +1357,16870,personal +1358,4438,personal +1359,5142,personal +1360,4745,personal +1361,349779,personal +1362,5243,personal +1363,1105030,personal +1364,30826,personal +1365,16781,personal +1366,17662,personal +1367,42596,personal +1368,2626,personal +1369,4386,personal +1370,3038,personal +1371,4689,personal +1372,16270,personal +1373,23600,personal +1374,2655,personal +1375,208926,personal +1376,4460,personal +1377,220795,personal +1378,28548,personal +1379,16182,personal +1380,16206,personal +1381,28307,personal +1382,243060,personal +1383,593078,personal +1384,16708,personal +1385,30207,personal +1386,22667,personal +1387,4278,personal +1388,4497,personal +1389,5566,personal +1390,5528,personal +1391,5530,personal +1392,16142,personal +1393,48213,personal +1394,3931,personal +1395,19750,personal +1396,268165,personal +1397,1345,personal +1398,1870,personal +1399,24896,personal +1400,5793,personal +1401,33604,personal +1402,4062,personal +1403,13750,personal +1404,33616,personal +1405,42596,personal +1406,2425,personal +1407,4849,personal +1408,5470,personal +1409,5200,personal +1410,220802,personal +1411,47400,personal +1412,52294,personal +1413,14493,personal +1414,88657,personal +1415,4555,personal +1416,120414,personal +1417,2022,personal +1418,1536,personal +1419,71689,personal +1420,93114,personal +1421,43718,personal +1422,2099,personal +1423,5352,personal +1424,7328,personal +1425,10845,personal +1426,68540,personal +1427,24458,personal +1428,2462,personal +1429,1894,personal +1430,5542,personal +1431,14514,personal +1432,220795,personal +1433,24758,personal +1434,1268,personal +1435,4514,personal +1436,6065,personal +1437,148109,personal +1438,1894,personal +1439,4272,personal +1440,4439,personal +1441,4732,personal +1442,4440,personal +1443,4969,personal +1444,5924,personal +1445,28959,personal +1446,4439,personal +1447,53633,personal +1448,4636,personal +1449,2772,personal +1450,4724,personal +1451,10673,personal +1452,4673,personal +1453,271191,personal +1454,11538,personal +1455,10659,personal +1456,22983,personal +1457,22918,personal +1458,16809,personal +1459,1942,personal +1460,8806,personal +1461,167064,personal +1462,2471,personal +1463,19852,personal +1464,21339,personal +1465,5233,personal +1466,220791,personal +1467,272724,personal +1468,3706,personal +1469,4291,personal +1470,4461,personal +1471,844204,personal +1472,1596393,personal +1473,198879,personal +1474,1027186,personal +1475,2377,personal +1476,634817,personal +1477,5069,personal +1478,103650,personal +1479,103667,personal +1480,26844,personal +1481,7441,personal +1482,563791,personal +1483,4461,personal +1484,1488,personal +1485,499302,personal +1486,4461,personal +1487,2473,personal +1488,40722,personal +1489,47648,personal +1490,1275,personal +1491,816671,personal +1492,2129,personal +1493,2986,personal +1494,4628,personal +1495,4691,personal +1496,16193,personal +1497,1549,personal +1498,7298,personal +1499,4922,personal +1500,4947,personal +1501,47700,personal +1502,28763,personal +1503,44407,personal +1504,45582,personal +1505,14145,personal +1506,33113,personal +1507,2512,personal +1508,9769,personal +1509,47706,personal +1510,23889,personal +1511,11277,personal +1512,1585,personal +1513,720998,personal +1514,16237,personal +1515,53043,personal +1516,1730,personal +1517,3766,personal +1518,136161,personal +1519,6458,personal +1520,5299,personal +1521,2995,personal +1522,19984,personal +1523,4611,personal +1524,9603,personal +1525,277102,personal +1526,1379,personal +1527,3865,personal +1528,1828,personal +1529,48027,personal +1530,3489,personal +1531,76299,personal +1532,3888,personal +1533,32386,personal +1534,852619,personal +1535,8496,personal +1536,146302,personal +1537,4694,personal +1538,583592,personal +1539,4656,personal +1540,6305,personal +1541,5255,personal +1542,5852,personal +1543,34244,personal +1544,30845,personal +1545,201318,personal +1546,96779,personal +1547,11469,personal +1548,11730,personal +1549,11794,personal +1550,5774,personal +1551,1805,personal +1552,1161067,personal +1553,7006,personal +1554,1285,personal +1555,2664,personal +1556,16737,personal +1557,14354,personal +1558,6180,personal +1559,1286,personal +1560,9963,personal +1561,22416,personal +1562,3373,personal +1563,4694,personal +1564,1348,personal +1565,9057,personal +1566,34085,personal +1567,4045,personal +1568,754554,personal +1569,8494,personal +1570,551856,personal +1571,6088,personal +1572,3299,personal +1573,36429,personal +1574,757618,personal +1575,26838,personal +1576,4573,personal +1577,9412,personal +1578,10145,personal +1579,4410,personal +1580,5223,personal +1581,1357,personal +1582,434981,personal +1583,225513,personal +1584,36897,personal +1585,629762,personal +1586,22292,personal +1587,1356,personal +1588,53833,personal +1589,434915,personal +1590,434895,personal +1591,434969,personal +1592,434908,personal +1593,3693,personal +1594,11914,personal +1595,12153,personal +1596,16716,personal +1597,84517,personal +1598,17876,personal +1599,119306,personal +1600,66005,personal +1601,1758,personal +1602,7293,personal +1603,9442,personal +1604,2384,personal +1605,4660,personal +1606,7266,personal +1607,92040,personal +1608,6653,personal +1609,13641,personal +1610,12014,personal +1611,19286,personal +1612,34501,personal +1613,3815,personal +1614,815,personal +1615,61349,personal +1616,4753,personal +1617,9861,personal +1618,14101,personal +1619,11178,personal +1620,15526,personal +1621,33107,personal +1622,33107,personal +1623,22103,personal +1624,28014,personal +1625,5741,personal +1626,122052,personal +1627,144682,personal +1628,28077,personal +1629,110832,personal +1630,3445,personal +1631,68644,personal +1632,53849,personal +1633,132847,personal +1634,289419,personal +1635,6062,personal +1636,13408,personal +1637,4443,personal +1638,59515,personal +1639,3096,personal +1640,16176,personal +1641,5799,personal +1642,35599,personal +1643,1201,personal +1644,2843,personal +1645,3064,personal +1646,2370,personal +1647,11450,personal +1648,3375,personal +1649,227230,personal +1650,5385,personal +1651,5788,personal +1652,4658,personal +1653,4656,personal +1654,7958,personal +1655,4546,personal +1656,4757,personal +1657,1686,personal +1658,4055,personal +1659,2224,personal +1660,23192,personal +1661,257277,personal +1662,1349,personal +1663,14484,personal +1664,5036,personal +1665,5349494,personal +1666,4653,personal +1667,183198,personal +1668,30055,personal +1669,30550,personal +1670,1393,personal +1671,1650,personal +1672,58403,personal +1673,68576,personal +1674,1349,personal +1675,4620,personal +1676,571731,personal +1677,5672,personal +1678,5682,personal +1679,1349,personal +1680,35143,personal +1681,4695,personal +1682,525746,personal +1683,36122,personal +1684,55951,personal +1685,60246,personal +1686,32713,personal +1687,5019,personal +1688,7741,personal +1689,6856,personal +1690,11361,personal +1691,1349,personal +1692,227221,personal +1693,14550,personal +1694,66050,personal +1695,2204111,personal +1696,16884,personal +1697,6271,personal +1698,14415,personal +1699,16706,personal +1700,51202,personal +1701,51194,personal +1702,468194,personal +1703,23329,personal +1704,14291,personal +1705,18823,personal +1706,533759,personal +1707,4610,personal +1708,19820,personal +1709,16711,personal +1710,3853,personal +1711,16715,personal +1712,534797,personal +1713,78003,personal +1714,7164,personal +1715,4424,personal +1716,16072,personal +1717,6269,personal +1718,8614,personal +1719,204200,personal +1720,8698,personal +1721,148965,personal +1722,5908,personal +1723,13987,personal +1724,582644,personal +1725,5024,personal +1726,7046,personal +1727,6446,personal +1728,3251,personal +1729,3017,personal +1730,38578,personal +1731,10411,personal +1732,6526,personal +1733,12293,personal +1734,227222,personal +1735,22338,personal +1736,45128,personal +1737,42234,personal +1738,57453,personal +1739,99301,personal +1740,4004,personal +1741,984471,personal +1742,1596428,personal +1743,1063483,personal +1744,384566,personal +1745,1985,personal +1746,9805,personal +1747,6294,personal +1748,1348,personal +1749,14201,personal +1750,86449,personal +1751,7208,personal +1752,4081,personal +1753,59957,personal +1754,2505,personal +1755,3075,personal +1756,16727,personal +1757,34484,personal +1758,7071,personal +1759,19751,personal +1760,10394,personal +1761,2716,personal +1762,55449,personal +1763,7226,personal +1764,20279,personal +1765,18381,personal +1766,18129,personal +1767,9204,personal +1768,11635,personal +1769,13681,personal +1770,10922,personal +1771,27906,personal +1772,70764,personal +1773,70764,personal +1774,70764,personal +1775,70764,personal +1776,70764,personal +1777,70764,personal +1778,70764,personal +1779,7545,personal +1780,7545,personal +1781,7545,personal +1782,7545,personal +1783,7545,personal +1784,7545,personal +1785,7545,personal +1786,93520,personal +1787,28358,personal +1788,11807,personal +1789,11815,personal +1790,312483,personal +1791,7163,personal +1792,7182,personal +1793,7418,personal +1794,30352,personal +1795,30315,personal +1796,7871,personal +1797,10628,personal +1798,9535,personal +1799,4672041,personal +1800,14304,personal +1801,28683,personal +1802,2795,personal +1803,3188,personal +1804,2997,personal +1805,8280,personal +1806,3314,personal +1807,1512,personal +1808,2235,personal +1809,11158,personal +1810,26729,personal +1811,1555,personal +1812,13398,personal +1813,652095,personal +1814,12227,personal +1815,49723,personal +1816,3863,personal +1817,1463982,personal +1818,10795,personal +1819,2427,personal +1820,6493,personal +1821,29273,personal +1822,2509,personal +1823,3547,personal +1824,3432,personal +1825,3693,personal +1826,14175,personal +1827,3488,personal +1828,3704,personal +1829,13230,personal +1830,14704,personal +1831,3701,personal +1832,7055,personal +1833,10220,personal +1834,6452,personal +1835,2397,personal +1836,97816,personal +1837,311964,personal +1838,5372,personal +1839,9347,personal +1840,3708,personal +1841,21518,personal +1842,4451,personal +1843,14649,personal +1844,26348,personal +1845,1357,personal +1846,15043,personal +1847,25183,personal +1848,1349,personal +1849,4574,personal +1850,5059,personal +1851,2427,personal +1852,47579,personal +1853,12360,personal +1854,50329,personal +1855,50337,personal +1856,77446,personal +1857,98260,personal +1858,1436,personal +1859,3335,personal +1860,6265,personal +1861,60526,personal +1862,5712,personal +1863,4484,personal +1864,4326,personal +1865,4833,personal +1866,16255,personal +1867,66769,personal +1868,104508,personal +1869,1319310,personal +1870,2348,personal +1871,104508,personal +1872,385566,personal +1873,90936,personal +1874,90995,personal +1875,90733,personal +1876,90733,personal +1877,4131,personal +1878,8708,personal +1879,5536,personal +1880,1349,personal +1881,4983,personal +1882,18027,personal +1883,17359,personal +1884,5151,personal +1885,92809,personal +1886,21199,personal +1887,312418,personal +1888,3527,personal +1889,18389,personal +1890,5210,personal +1891,49731,personal +1892,49723,personal +1893,16743,personal +1894,5786,personal +1895,4958,personal +1896,4994,personal +1897,5006,personal +1898,4996,personal +1899,4894,personal +1900,130397,personal +1901,4950,personal +1902,10179,personal +1903,78041,personal +1904,21595,personal +1905,1357,personal +1906,231960,personal +1907,1589,personal +1908,1790,personal +1909,1764,personal +1910,5030,personal +1911,4450,personal +1912,6192,personal +1913,311825,personal +1914,5171,personal +1915,582904,personal +1916,38500,personal +1917,2748,personal +1918,169644,personal +1919,656534,personal +1920,2062,personal +1921,16735,personal +1922,65026,personal +1923,59900,personal +1924,19751,personal +1925,209612,personal +1926,311829,personal +1927,9816,personal +1928,29342,personal +1929,16192,personal +1930,112768,personal +1931,1491,personal +1932,2248,personal +1933,2130,personal +1934,1071,personal +1935,111473,personal +1936,67433,personal +1937,86214,personal +1938,26555,personal +1939,6999,personal +1940,25981,personal +1941,35195,personal +1942,1752,personal +1943,1744,personal +1944,2549,personal +1945,2585,personal +1946,93256,personal +1947,279295,personal +1948,318753,personal +1949,5055,personal +1950,4983,personal +1951,9579,personal +1952,5035,personal +1953,5285,personal +1954,6452,personal +1955,5081,personal +1956,5924,personal +1957,17476,personal +1958,26683,personal +1959,26538,personal +1960,5029,personal +1961,35086,personal +1962,22782,personal +1963,3990,personal +1964,318749,personal +1965,6613,personal +1966,2985,personal +1967,67524,personal +1968,13906,personal +1969,49817,personal +1970,2536,personal +1971,20106,personal +1972,28159,personal +1973,72032,personal +1974,24723,personal +1975,168692,personal +1976,37272,personal +1977,31154,personal +1978,3111,personal +1979,318753,personal +1980,1357,personal +1981,2864,personal +1982,1512,personal +1983,7229,personal +1984,112847,personal +1985,9595,personal +1986,6918,personal +1987,194701,personal +1988,196830,personal +1989,202695,personal +1990,3246,personal +1991,75125,personal +1992,208331,personal +1993,6896,personal +1994,139517,personal +1995,141290,personal +1996,146064,personal +1997,582005,personal +1998,3028,personal +1999,152075,personal +2000,7709,personal +2001,11121,personal +2002,6332,personal +2003,160332,personal +2004,33150,personal +2005,39364,personal +2006,64145,personal +2007,161255,personal +2008,5784,personal +2009,4732,personal +2010,2493,personal +2011,2602,personal +2012,2934,personal +2013,2583,personal +2014,2773,personal +2015,3815,personal +2016,11814,personal +2017,16661,personal +2018,3558,personal +2019,53462,personal +2020,191425,personal +2021,318751,personal +2022,2194,personal +2023,2029,personal +2024,5132,personal +2025,273842,personal +2026,6261,personal +2027,6817,personal +2028,908189,personal +2029,60399,personal +2030,3639,personal +2031,63917,personal +2032,8869,personal +2033,21686,personal +2034,7742,personal +2035,7647,personal +2036,10490,personal +2037,5116,personal +2038,22354,personal +2039,29887,personal +2040,43967,personal +2041,2845,personal +2042,50108,personal +2043,6733,personal +2044,5254,personal +2045,485352,personal +2046,1076610,personal +2047,21622,personal +2048,11836,personal +2049,2019,personal +2050,85704,personal +2051,135646,personal +2052,19871,personal +2053,7126,personal +2054,903991,personal +2055,4960,personal +2056,41659,personal +2057,12558,personal +2058,19339,personal +2059,4401,personal +2060,22280,personal +2061,19861,personal +2062,62083,personal +2063,28538,personal +2064,21765,personal +2065,45044,personal +2066,27824,personal +2067,107442,personal +2068,10883,personal +2069,55860,personal +2070,29534,personal +2071,55872,personal +2072,1955,personal +2073,10979,personal +2074,55045,personal +2075,44704,personal +2076,101343,personal +2077,6452,personal +2078,6176,personal +2079,21940,personal +2080,47127,personal +2081,86773,personal +2082,62307,personal +2083,80272,personal +2084,6847,personal +2085,10454,personal +2086,12258,personal +2087,209527,personal +2088,29059,personal +2089,12712,personal +2090,9857,personal +2091,2887,personal +2092,147536,personal +2093,55099,personal +2094,64299,personal +2095,6979,personal +2096,11212,personal +2097,19593,personal +2098,10554,personal +2099,60830,personal +2100,3861,personal +2101,4165,personal +2102,1560,personal +2103,39554,personal +2104,33125,personal +2105,6287,personal +2106,32288,personal +2107,26784,personal +2108,62032,personal +2109,113896,personal +2110,19576,personal +2111,1959,personal +2112,12963,personal +2113,794113,personal +2114,582301,personal +2115,50105,personal +2116,16285,personal +2117,47254,personal +2118,221535,personal +2119,275148,personal +2120,3337,personal +2121,5029,personal +2122,318752,personal +2123,1347,personal +2124,8983,personal +2125,28259,personal +2126,3136,personal +2127,5723,personal +2128,3410,personal +2129,14536,personal +2130,49858,personal +2131,32878,personal +2132,12002,personal +2133,2913,personal +2134,24177,personal +2135,18759,personal +2136,38371,personal +2137,5465,personal +2138,1281175,personal +2139,22331,personal +2140,85687,personal +2141,318752,personal +2142,4699,personal +2143,36943,personal +2144,1348,personal +2145,551460,personal +2146,105202,personal +2147,157420,personal +2148,1566,personal +2149,5269,personal +2150,4837,personal +2151,4835,personal +2152,4934,personal +2153,4467,personal +2154,6454,personal +2155,5115,personal +2156,64312,personal +2157,58013,personal +2158,66602,personal +2159,6777,personal +2160,8932,personal +2161,5042,personal +2162,4653,personal +2163,5029,personal +2164,4651,personal +2165,66600,personal +2166,5748,personal +2167,5750,personal +2168,5785,personal +2169,125623,personal +2170,3465,personal +2171,3851,personal +2172,4906,personal +2173,2490,personal +2174,76240,personal +2175,112715,personal +2176,108003,personal +2177,36454,personal +2178,11704,personal +2179,10595,personal +2180,12908,personal +2181,6302,personal +2182,9423,personal +2183,106475,personal +2184,27475,personal +2185,5348,personal +2186,5444,personal +2187,325201,personal +2188,4088,personal +2189,6476,personal +2190,9691,personal +2191,9618,personal +2192,28048,personal +2193,43034,personal +2194,6452,personal +2195,5833,personal +2196,4724,personal +2197,4675,personal +2198,82191,personal +2199,42475,personal +2200,19319,personal +2201,19667,personal +2202,5359,personal +2203,1108,personal +2204,25544,personal +2205,18492,personal +2206,4364,personal +2207,4549,personal +2208,5982,personal +2209,5010,personal +2210,279308,personal +2211,2704,personal +2212,12634,personal +2213,3446,personal +2214,3112,personal +2215,4210,personal +2216,3920,personal +2217,3985,personal +2218,4786,personal +2219,2465,personal +2220,43030,personal +2221,32821,personal +2222,12775,personal +2223,3144,personal +2224,1572,personal +2225,4750,personal +2226,164896,personal +2227,228538,personal +2228,2534,personal +2229,7685,personal +2230,709325,personal +2231,16312,personal +2232,11446,personal +2233,25577,personal +2234,1492,personal +2235,1492,personal +2236,8969,personal +2237,8061,personal +2238,724446,personal +2239,15757,personal +2240,13251,personal +2241,13251,personal +2242,10876,personal +2243,5103,personal +2244,5405,personal +2245,71210,personal +2246,4287,personal +2247,651056,personal +2248,27099,personal +2249,12635,personal +2250,723,personal +2251,1079,personal +2252,567459,personal +2253,144264,personal +2254,9460,personal +2255,31002,personal +2256,73559,personal +2257,4230,personal +2258,4713,personal +2259,5024,personal +2260,38647,personal +2261,41058,personal +2262,41496,personal +2263,119170,personal +2264,11635,personal +2265,27375,personal +2266,7759,personal +2267,2146,personal +2268,3724,personal +2269,4996,personal +2270,2811,personal +2271,37985,personal +2272,32553,personal +2273,2940,personal +2274,47618,personal +2275,1762,personal +2276,325200,personal +2277,5405,personal +2278,1591,personal +2279,63849,personal +2280,4676,personal +2281,31885,personal +2282,8031,personal +2283,63019,personal +2284,63029,personal +2285,4912,personal +2286,16884,personal +2287,16989,personal +2288,34496,personal +2289,16886,personal +2290,16980,personal +2291,16894,personal +2292,6588,personal +2293,76875,personal +2294,134765,personal +2295,47047,personal +2296,3397,personal +2297,49301,personal +2298,6532,personal +2299,5344,personal +2300,6779,personal +2301,6672,personal +2302,5758,personal +2303,8183,personal +2304,6528,personal +2305,6763,personal +2306,29384,personal +2307,6909,personal +2308,42787,personal +2309,14995,personal +2310,4916,personal +2311,9493,personal +2312,16382,personal +2313,42229,personal +2314,40629,personal +2315,6452,personal +2316,7593,personal +2317,10583,personal +2318,4418,personal +2319,3877,personal +2320,3832,personal +2321,3892,personal +2322,4510,personal +2323,4070,personal +2324,4540,personal +2325,18890,personal +2326,5005,personal +0,1197,dataset +1,669,dataset +2,2446863,dataset +3,17570,dataset +4,32629,dataset +5,20966,dataset +6,17060,dataset +7,6813,dataset +8,1536,dataset +9,33864,dataset +10,32553,dataset +11,184932,dataset +12,16344,dataset +13,6302,dataset +14,14536,dataset +15,5255,dataset +16,11538,dataset +17,20549,dataset +18,21465,dataset +19,10962,dataset +20,33754,dataset +21,3383940,dataset +22,3007,dataset +23,695324,dataset +24,2006073,dataset +25,21523,dataset +26,23653,dataset +27,19581,dataset +28,17413,dataset +29,26122,dataset +30,23941,dataset +31,47047,dataset +32,25577,dataset +33,36454,dataset +34,44704,dataset +35,39364,dataset +36,59164,dataset +37,41804,dataset +38,49847,dataset +39,19590,dataset +40,60376,dataset +41,17741,dataset +42,44138,dataset +43,32797,dataset +44,45838,dataset +45,28181,dataset +46,42271,dataset +47,24861,dataset +48,20822,dataset +49,31220,dataset +50,3281,dataset +51,17277,dataset +52,43718,dataset +53,40722,dataset +54,289419,dataset +55,525746,dataset +56,29273,dataset +57,35086,dataset +58,20106,dataset +59,22782,dataset +60,5808,dataset +61,62307,dataset +62,3321,dataset +63,71315,dataset +64,6578,dataset +65,10878,dataset +66,37947,dataset +67,21278,dataset +68,3957,dataset +69,3987,dataset +70,4102,dataset +71,4233,dataset +72,4194,dataset +73,4065,dataset +74,3927,dataset +75,3886,dataset +76,4352,dataset +77,3933,dataset +78,4104,dataset +79,4794,dataset +80,4804,dataset +81,49034,dataset +82,6361558,dataset +83,124050,dataset +84,137595,dataset +85,19489,dataset +86,28247,dataset +87,84954,dataset +88,14315,dataset +89,1391,dataset +90,4127,dataset +91,3884,dataset +92,1280,dataset +93,5502023,dataset +94,2487,dataset +95,83298,dataset +96,911,dataset +97,1607,dataset +98,737,dataset +99,2615,dataset diff --git a/tests/emails/report.R b/tests/emails/report.R new file mode 100644 index 0000000..928597a --- /dev/null +++ b/tests/emails/report.R @@ -0,0 +1,14 @@ +library(tidyverse) +library(lubridate) +read_csv("imap_commands_summary.csv") -> cmd + +ggplot(cmd, aes(x=command, y=count)) + + geom_bar(stat = "identity")+ + theme_classic() + + facet_wrap(~aggregation, ncol=1, scales = "free") + +read_csv("mailbox_email_sizes.csv") -> mbx +ggplot(mbx, aes(x=size, colour=mailbox)) + + stat_ecdf(pad=FALSE,geom = "step") + +scale_x_log10()+ theme_classic() + From 28b1f4f14dffc5dcd5152ce931f6c50b17c134db Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Tue, 20 Feb 2024 11:42:51 +0100 Subject: [PATCH 03/16] Unsollicited responses on APPEND --- src/imap/command/authenticated.rs | 18 ++++++++++++------ tests/behavior.rs | 2 +- tests/common/fragments.rs | 3 +-- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/imap/command/authenticated.rs b/src/imap/command/authenticated.rs index 26b1946..baf3033 100644 --- a/src/imap/command/authenticated.rs +++ b/src/imap/command/authenticated.rs @@ -14,13 +14,13 @@ use imap_codec::imap_types::mailbox::{ListMailbox, Mailbox as MailboxCodec}; use imap_codec::imap_types::response::{Code, CodeOther, Data}; use imap_codec::imap_types::status::{StatusDataItem, StatusDataItemName}; +use crate::imap::Body; use crate::imap::capability::{ClientCapability, ServerCapability}; use crate::imap::command::{anystate, MailboxName}; use crate::imap::flow; -use crate::imap::mailbox_view::MailboxView; +use crate::imap::mailbox_view::{MailboxView, UpdateParameters}; use crate::imap::response::Response; -use crate::mail::mailbox::Mailbox; use crate::mail::uidindex::*; use crate::mail::user::{User, MAILBOX_HIERARCHY_DELIMITER as MBX_HIER_DELIM_RAW}; use crate::mail::IMF; @@ -558,9 +558,12 @@ impl<'a> AuthenticatedContext<'a> { ) -> Result<(Response<'static>, flow::Transition)> { let append_tag = self.req.tag.clone(); match self.append_internal(mailbox, flags, date, message).await { - Ok((_mb, uidvalidity, uid, _modseq)) => Ok(( + + + Ok((_mb_view, unsollicited, uidvalidity, uid, _modseq)) => Ok(( Response::build() .tag(append_tag) + .set_body(unsollicited) .message("APPEND completed") .code(Code::Other(CodeOther::unvalidated( format!("APPENDUID {} {}", uidvalidity, uid).into_bytes(), @@ -593,13 +596,14 @@ impl<'a> AuthenticatedContext<'a> { )) } + //@FIXME should be refactored and integrated to the mailbox view pub(crate) async fn append_internal( self, mailbox: &MailboxCodec<'a>, flags: &[Flag<'a>], date: &Option, message: &Literal<'a>, - ) -> Result<(Arc, ImapUidvalidity, ImapUid, ModSeq)> { + ) -> Result<(MailboxView, Vec>, ImapUidvalidity, ImapUid, ModSeq)> { let name: &str = MailboxName(mailbox).try_into()?; let mb_opt = self.user.open_mailbox(&name).await?; @@ -607,6 +611,7 @@ impl<'a> AuthenticatedContext<'a> { Some(mb) => mb, None => bail!("Mailbox does not exist"), }; + let mut view = MailboxView::new(mb, self.client_capabilities.condstore.is_enabled()).await; if date.is_some() { tracing::warn!("Cannot set date when appending message"); @@ -617,9 +622,10 @@ impl<'a> AuthenticatedContext<'a> { let flags = flags.iter().map(|x| x.to_string()).collect::>(); // TODO: filter allowed flags? ping @Quentin - let (uidvalidity, uid, modseq) = mb.append(msg, None, &flags[..]).await?; + let (uidvalidity, uid, modseq) = view.internal.mailbox.append(msg, None, &flags[..]).await?; + let unsollicited = view.update(UpdateParameters::default()).await?; - Ok((mb, uidvalidity, uid, modseq)) + Ok((view, unsollicited, uidvalidity, uid, modseq)) } } diff --git a/tests/behavior.rs b/tests/behavior.rs index 7fdd553..13baf0e 100644 --- a/tests/behavior.rs +++ b/tests/behavior.rs @@ -225,7 +225,7 @@ fn rfc4551_imapext_condstore() { FetchKind::Rfc822Size, FetchMod::ChangedSince(2), )?; - assert!(fetch_res.contains("* 1 FETCH (RFC822.SIZE 84 MODSEQ (3))")); + assert!(fetch_res.contains("* 1 FETCH (RFC822.SIZE 81 MODSEQ (3))")); assert!(!fetch_res.contains("* 2 FETCH")); assert_eq!(store_res.lines().count(), 2); diff --git a/tests/common/fragments.rs b/tests/common/fragments.rs index a10d4e0..606af2b 100644 --- a/tests/common/fragments.rs +++ b/tests/common/fragments.rs @@ -384,8 +384,7 @@ pub fn append(imap: &mut TcpStream, content: Email) -> Result { // write our stuff imap.write(ref_mail)?; imap.write(&b"\r\n"[..])?; - let read = read_lines(imap, &mut buffer, None)?; - assert_eq!(&read[..5], &b"47 OK"[..]); + let read = read_lines(imap, &mut buffer, Some(&b"47 OK"[..]))?; let srv_msg = std::str::from_utf8(read)?; Ok(srv_msg.to_string()) From 64b474f682a3c519ca1bda279132273a53ca2115 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Tue, 20 Feb 2024 13:24:42 +0100 Subject: [PATCH 04/16] Unsollicited response on APPEND was wrong, upgrade imap-flow to fix LITERAL+ --- Cargo.lock | 6 ++++-- src/imap/command/authenticated.rs | 11 ++++++----- src/imap/mod.rs | 12 ++++++------ 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c37165a..50e7b02 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1869,7 +1869,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite 0.2.13", - "socket2 0.5.5", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -1980,13 +1980,15 @@ dependencies = [ [[package]] name = "imap-flow" version = "0.1.0" -source = "git+https://github.com/superboum/imap-flow.git?branch=custom/aerogramme#60ff9e082ccfcd10a042b616d8038a578fa0c8ff" +source = "git+https://github.com/superboum/imap-flow.git?branch=custom/aerogramme#2bea066da1e09ad04bb5fb71b0dd8d6e5d9e3d19" dependencies = [ "bounded-static", "bytes", "imap-codec", + "imap-types", "thiserror", "tokio", + "tracing", ] [[package]] diff --git a/src/imap/command/authenticated.rs b/src/imap/command/authenticated.rs index baf3033..d2e7815 100644 --- a/src/imap/command/authenticated.rs +++ b/src/imap/command/authenticated.rs @@ -549,6 +549,8 @@ impl<'a> AuthenticatedContext<'a> { )) } + //@FIXME we should write a specific version for the "selected" state + //that returns some unsollicited responses async fn append( self, mailbox: &MailboxCodec<'a>, @@ -560,10 +562,9 @@ impl<'a> AuthenticatedContext<'a> { match self.append_internal(mailbox, flags, date, message).await { - Ok((_mb_view, unsollicited, uidvalidity, uid, _modseq)) => Ok(( + Ok((_mb_view, uidvalidity, uid, _modseq)) => Ok(( Response::build() .tag(append_tag) - .set_body(unsollicited) .message("APPEND completed") .code(Code::Other(CodeOther::unvalidated( format!("APPENDUID {} {}", uidvalidity, uid).into_bytes(), @@ -603,7 +604,7 @@ impl<'a> AuthenticatedContext<'a> { flags: &[Flag<'a>], date: &Option, message: &Literal<'a>, - ) -> Result<(MailboxView, Vec>, ImapUidvalidity, ImapUid, ModSeq)> { + ) -> Result<(MailboxView, ImapUidvalidity, ImapUid, ModSeq)> { let name: &str = MailboxName(mailbox).try_into()?; let mb_opt = self.user.open_mailbox(&name).await?; @@ -623,9 +624,9 @@ impl<'a> AuthenticatedContext<'a> { // TODO: filter allowed flags? ping @Quentin let (uidvalidity, uid, modseq) = view.internal.mailbox.append(msg, None, &flags[..]).await?; - let unsollicited = view.update(UpdateParameters::default()).await?; + //let unsollicited = view.update(UpdateParameters::default()).await?; - Ok((view, unsollicited, uidvalidity, uid, modseq)) + Ok((view, uidvalidity, uid, modseq)) } } diff --git a/src/imap/mod.rs b/src/imap/mod.rs index 58c4dc0..544086e 100644 --- a/src/imap/mod.rs +++ b/src/imap/mod.rs @@ -185,15 +185,15 @@ impl NetLoop { } async fn new(ctx: ClientContext, sock: AnyStream) -> Result { + let mut opts = ServerFlowOptions::default(); + opts.crlf_relaxed = false; + opts.literal_accept_text = Text::unvalidated("OK"); + opts.literal_reject_text = Text::unvalidated("Literal rejected"); + // Send greeting let (server, _) = ServerFlow::send_greeting( sock, - ServerFlowOptions { - crlf_relaxed: false, - literal_accept_text: Text::unvalidated("OK"), - literal_reject_text: Text::unvalidated("Literal rejected"), - ..ServerFlowOptions::default() - }, + opts, Greeting::ok( Some(Code::Capability(ctx.server_capabilities.to_vec())), "Aerogramme", From de5717a020ed741ef206ebb649bac2cd678572fa Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Tue, 20 Feb 2024 16:02:56 +0100 Subject: [PATCH 05/16] Upgrade Cargo.nix --- Cargo.nix | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Cargo.nix b/Cargo.nix index 164d505..70812e5 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -23,7 +23,7 @@ args@{ ignoreLockHash, }: let - nixifiedLockHash = "92030f2aa1c723f2d8dc8fb6d98a261fbc7ba40c61a6426fa0b55448dd0d3ad1"; + nixifiedLockHash = "3b8bcf5ea054b1e2cc4267f418aa02f3982a7bd534f12f13be2cd956aaebf0f2"; workspaceSrc = if args.workspaceSrc == null then ./. else args.workspaceSrc; currentLockHash = builtins.hashFile "sha256" (workspaceSrc + /Cargo.lock); lockHashIgnored = if ignoreLockHash @@ -2594,7 +2594,7 @@ in httpdate = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".httpdate."1.0.3" { inherit profileName; }).out; itoa = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.10" { inherit profileName; }).out; pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out; - socket2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".socket2."0.5.5" { inherit profileName; }).out; + socket2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".socket2."0.4.10" { inherit profileName; }).out; tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.35.1" { inherit profileName; }).out; tower_service = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-service."0.3.2" { inherit profileName; }).out; tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out; @@ -2755,14 +2755,16 @@ in url = https://github.com/superboum/imap-flow.git; name = "imap-flow"; version = "0.1.0"; - rev = "60ff9e082ccfcd10a042b616d8038a578fa0c8ff"; + rev = "2bea066da1e09ad04bb5fb71b0dd8d6e5d9e3d19"; ref = "custom/aerogramme";}; dependencies = { bounded_static = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bounded-static."0.5.0" { inherit profileName; }).out; bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; imap_codec = (rustPackages."git+https://github.com/superboum/imap-codec".imap-codec."2.0.0" { inherit profileName; }).out; + imap_types = (rustPackages."git+https://github.com/superboum/imap-codec".imap-types."2.0.0" { inherit profileName; }).out; thiserror = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.56" { inherit profileName; }).out; tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.35.1" { inherit profileName; }).out; + tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out; }; }); From 4d501b6947497d7705c64dcaf093e5e5a09a9235 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Thu, 22 Feb 2024 11:35:39 +0100 Subject: [PATCH 06/16] Compile streams --- src/imap/mailbox_view.rs | 125 ++++++++++++++++++++------------------- src/imap/search.rs | 21 +------ src/mail/mailbox.rs | 2 +- src/mail/query.rs | 68 ++++++++++----------- 4 files changed, 98 insertions(+), 118 deletions(-) diff --git a/src/imap/mailbox_view.rs b/src/imap/mailbox_view.rs index d57e9a3..5055c40 100644 --- a/src/imap/mailbox_view.rs +++ b/src/imap/mailbox_view.rs @@ -4,7 +4,7 @@ use std::sync::Arc; use anyhow::{anyhow, Error, Result}; -use futures::stream::{FuturesOrdered, StreamExt}; +use futures::stream::{StreamExt, TryStreamExt}; use imap_codec::imap_types::core::Charset; use imap_codec::imap_types::fetch::MessageDataItem; @@ -362,46 +362,33 @@ impl MailboxView { .iter() .map(|midx| midx.uuid) .collect::>(); - let query_result = self.internal.query(&uuids, query_scope).fetch().await?; - // [3/6] Derive an IMAP-specific view from the results, apply the filters - let views = query_result - .iter() - .zip(mail_idx_list.into_iter()) - .map(|(qr, midx)| MailView::new(qr, midx)) - .collect::, _>>()?; + let query = self.internal.query(&uuids, query_scope); + //let query_result = self.internal.query(&uuids, query_scope).fetch().await?; - // [4/6] Apply the IMAP transformation, bubble up any error - // We get 2 results: - // - The one we send to the client - // - The \Seen flags we must set internally - let (flag_mgmt, imap_ret): (Vec<_>, Vec<_>) = views - .iter() - .map(|mv| mv.filter(&ap).map(|(body, seen)| ((mv, seen), body))) - .collect::, _>>()? - .into_iter() - .unzip(); - - // [5/6] Register the \Seen flags - flag_mgmt - .iter() - .filter(|(_mv, seen)| matches!(seen, SeenFlag::MustAdd)) - .map(|(mv, _seen)| async move { - let seen_flag = Flag::Seen.to_string(); - self.internal - .mailbox - .add_flags(*mv.query_result.uuid(), &[seen_flag]) - .await?; - Ok::<_, anyhow::Error>(()) + let query_stream = query + .fetch() + .zip(futures::stream::iter(mail_idx_list)) + // [3/6] Derive an IMAP-specific view from the results, apply the filters + .map(|(maybe_qr, midx)| match maybe_qr { + Ok(qr) => Ok((MailView::new(&qr, midx)?.filter(&ap)?, midx)), + Err(e) => Err(e), }) - .collect::>() - .collect::>() - .await - .into_iter() - .collect::>()?; + // [4/6] Apply the IMAP transformation + .then(|maybe_ret| async move { + let ((body, seen), midx) = maybe_ret?; + + // [5/6] Register the \Seen flags + if matches!(seen, SeenFlag::MustAdd) { + let seen_flag = Flag::Seen.to_string(); + self.internal.mailbox.add_flags(midx.uuid, &[seen_flag]).await?; + } + + Ok::<_, anyhow::Error>(body) + }); // [6/6] Build the final result that will be sent to the client. - Ok(imap_ret) + query_stream.try_collect().await } /// A naive search implementation... @@ -423,39 +410,55 @@ impl MailboxView { // 3. Filter the selection based on the ID / UID / Flags let (kept_idx, to_fetch) = crit.filter_on_idx(&selection); - // 4. Fetch additional info about the emails + // 4.a Fetch additional info about the emails let query_scope = crit.query_scope(); let uuids = to_fetch.iter().map(|midx| midx.uuid).collect::>(); - let query_result = self.internal.query(&uuids, query_scope).fetch().await?; + let query = self.internal.query(&uuids, query_scope); - // 5. If needed, filter the selection based on the body - let kept_query = crit.filter_on_query(&to_fetch, &query_result)?; + // 4.b We don't want to keep all data in memory, so we do the computing in a stream + let query_stream = query + .fetch() + .zip(futures::stream::iter(&to_fetch)) + // 5.a Build a mailview with the body, might fail with an error + // 5.b If needed, filter the selection based on the body, but keep the errors + // 6. Drop the query+mailbox, keep only the mail index + // Here we release a lot of memory, this is the most important part ^^ + .filter_map(|(maybe_qr, midx)| { + let r = match maybe_qr { + Ok(qr) => match MailView::new(&qr, midx).map(|mv| crit.is_keep_on_query(&mv)) { + Ok(true) => Some(Ok(*midx)), + Ok(_) => None, + Err(e) => Some(Err(e)), + } + Err(e) => Some(Err(e)), + }; + futures::future::ready(r) + }); - // 6. Format the result according to the client's taste: - // either return UID or ID. - let final_selection = kept_idx.iter().chain(kept_query.iter()); - let selection_fmt = match uid { - true => final_selection.map(|in_idx| in_idx.uid).collect(), - _ => final_selection.map(|in_idx| in_idx.i).collect(), - }; - // 7. Add the modseq entry if needed - let is_modseq = crit.is_modseq(); - let maybe_modseq = match is_modseq { - true => { - let final_selection = kept_idx.iter().chain(kept_query.iter()); - final_selection - .map(|in_idx| in_idx.modseq) - .max() - .map(|r| NonZeroU64::try_from(r)) - .transpose()? - } + // 7. Chain both streams (part resolved from index, part resolved from metadata+body) + let main_stream = futures::stream::iter(kept_idx) + .map(Ok) + .chain(query_stream) + .map_ok(|idx| match uid { + true => (idx.uid, idx.modseq), + _ => (idx.i, idx.modseq), + }); + + // 8. Do the actual computation + let internal_result: Vec<_> = main_stream.try_collect().await?; + let (selection, modseqs): (Vec<_>, Vec<_>) = internal_result.into_iter().unzip(); + + // 9. Aggregate the maximum modseq value + let maybe_modseq = match crit.is_modseq() { + true => modseqs.into_iter().max(), _ => None, }; + // 10. Return the final result Ok(( - vec![Body::Data(Data::Search(selection_fmt, maybe_modseq))], - is_modseq, + vec![Body::Data(Data::Search(selection, maybe_modseq))], + maybe_modseq.is_some(), )) } @@ -678,7 +681,7 @@ mod tests { content: rfc822.to_vec(), }; - let mv = MailView::new(&qr, &mail_in_idx)?; + let mv = MailView::new(std::borrow::Cow::Borrowed(&qr), &mail_in_idx)?; let (res_body, _seen) = mv.filter(&ap)?; let fattr = match res_body { diff --git a/src/imap/search.rs b/src/imap/search.rs index d06c3bd..4ff70ee 100644 --- a/src/imap/search.rs +++ b/src/imap/search.rs @@ -1,13 +1,12 @@ use std::num::{NonZeroU32, NonZeroU64}; -use anyhow::Result; use imap_codec::imap_types::core::NonEmptyVec; use imap_codec::imap_types::search::{MetadataItemSearch, SearchKey}; use imap_codec::imap_types::sequence::{SeqOrUid, Sequence, SequenceSet}; use crate::imap::index::MailIndex; use crate::imap::mail_view::MailView; -use crate::mail::query::{QueryResult, QueryScope}; +use crate::mail::query::QueryScope; pub enum SeqType { Undefined, @@ -145,22 +144,6 @@ impl<'a> Criteria<'a> { (to_keep, to_fetch) } - pub fn filter_on_query<'b>( - &self, - midx_list: &[&'b MailIndex<'b>], - query_result: &'b Vec, - ) -> Result>> { - Ok(midx_list - .iter() - .zip(query_result.iter()) - .map(|(midx, qr)| MailView::new(qr, midx)) - .collect::, _>>()? - .into_iter() - .filter(|mail_view| self.is_keep_on_query(mail_view)) - .map(|mail_view| mail_view.in_idx) - .collect()) - } - // ---- /// Here we are doing a partial filtering: we do not have access @@ -213,7 +196,7 @@ impl<'a> Criteria<'a> { /// the email, as body(x) might be false. So we need to check it. But as seqid(x) is true, /// we could simplify the request to just body(x) and truncate the first OR. Today, we are /// not doing that, and thus we reevaluate everything. - fn is_keep_on_query(&self, mail_view: &MailView) -> bool { + pub fn is_keep_on_query(&self, mail_view: &MailView) -> bool { use SearchKey::*; match self.0 { // Combinator logic diff --git a/src/mail/mailbox.rs b/src/mail/mailbox.rs index c20d815..9190883 100644 --- a/src/mail/mailbox.rs +++ b/src/mail/mailbox.rs @@ -498,7 +498,7 @@ fn dump(uid_index: &Bayou) { /// The metadata of a message that is stored in K2V /// at pk = mail/, sk = -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct MailMeta { /// INTERNALDATE field (milliseconds since epoch) pub internaldate: u64, diff --git a/src/mail/query.rs b/src/mail/query.rs index a183c5a..cbc5fe6 100644 --- a/src/mail/query.rs +++ b/src/mail/query.rs @@ -2,7 +2,8 @@ use super::mailbox::MailMeta; use super::snapshot::FrozenMailbox; use super::unique_ident::UniqueIdent; use anyhow::Result; -use futures::stream::{FuturesOrdered, StreamExt}; +use futures::stream::{Stream, StreamExt, BoxStream}; +use futures::future::FutureExt; /// Query is in charge of fetching efficiently /// requested data for a list of emails @@ -28,64 +29,57 @@ impl QueryScope { } } +//type QueryResultStream = Box>>; + impl<'a, 'b> Query<'a, 'b> { - pub async fn fetch(&self) -> Result> { + pub fn fetch(&self) -> BoxStream> { match self.scope { - QueryScope::Index => Ok(self - .emails - .iter() - .map(|&uuid| QueryResult::IndexResult { uuid }) - .collect()), - QueryScope::Partial => self.partial().await, - QueryScope::Full => self.full().await, + QueryScope::Index => Box::pin(futures::stream::iter(self.emails).map(|&uuid| Ok(QueryResult::IndexResult { uuid }))), + QueryScope::Partial => Box::pin(self.partial()), + QueryScope::Full => Box::pin(self.full()), } } // --- functions below are private *for reasons* + fn partial<'d>(&'d self) -> impl Stream> + 'd + Send { + async move { + let maybe_meta_list: Result> = self.frozen.mailbox.fetch_meta(self.emails).await; + let list_res = maybe_meta_list + .map(|meta_list| meta_list + .into_iter() + .zip(self.emails) + .map(|(metadata, &uuid)| Ok(QueryResult::PartialResult { uuid, metadata })) + .collect() + ) + .unwrap_or_else(|e| vec![Err(e)]); - async fn partial(&self) -> Result> { - let meta = self.frozen.mailbox.fetch_meta(self.emails).await?; - let result = meta - .into_iter() - .zip(self.emails.iter()) - .map(|(metadata, &uuid)| QueryResult::PartialResult { uuid, metadata }) - .collect::>(); - - Ok(result) + futures::stream::iter(list_res) + }.flatten_stream() } - /// @FIXME WARNING: THIS CAN ALLOCATE A LOT OF MEMORY - /// AND GENERATE SO MUCH NETWORK TRAFFIC. - /// THIS FUNCTION SHOULD BE REWRITTEN, FOR EXAMPLE WITH - /// SOMETHING LIKE AN ITERATOR - async fn full(&self) -> Result> { - let meta_list = self.partial().await?; - meta_list - .into_iter() - .map(|meta| async move { + fn full<'d>(&'d self) -> impl Stream> + 'd + Send { + self.partial() + .then(move |maybe_meta| async move { + let meta = maybe_meta?; + let content = self .frozen .mailbox .fetch_full( *meta.uuid(), &meta - .metadata() - .expect("meta to be PartialResult") - .message_key, - ) + .metadata() + .expect("meta to be PartialResult") + .message_key, + ) .await?; Ok(meta.into_full(content).expect("meta to be PartialResult")) }) - .collect::>() - .collect::>() - .await - .into_iter() - .collect::, _>>() } } -#[derive(Debug)] +#[derive(Debug, Clone)] pub enum QueryResult { IndexResult { uuid: UniqueIdent, From 3f204b102abb408a9f0b2adc45065585ddc16a88 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Thu, 22 Feb 2024 11:51:58 +0100 Subject: [PATCH 07/16] fix test --- src/imap/mailbox_view.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/imap/mailbox_view.rs b/src/imap/mailbox_view.rs index 5055c40..076f92e 100644 --- a/src/imap/mailbox_view.rs +++ b/src/imap/mailbox_view.rs @@ -681,7 +681,7 @@ mod tests { content: rfc822.to_vec(), }; - let mv = MailView::new(std::borrow::Cow::Borrowed(&qr), &mail_in_idx)?; + let mv = MailView::new(&qr, &mail_in_idx)?; let (res_body, _seen) = mv.filter(&ap)?; let fattr = match res_body { From 2adf73dd8e6e76997d4fb67f9f7b3fe065530722 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Thu, 22 Feb 2024 17:30:40 +0100 Subject: [PATCH 08/16] Update imap-flow, clean IDLE --- Cargo.lock | 6 +- Cargo.toml | 2 +- src/imap/capability.rs | 4 +- src/imap/command/authenticated.rs | 4 +- src/imap/command/selected.rs | 14 +-- src/imap/flow.rs | 11 +- src/imap/mailbox_view.rs | 6 +- src/imap/mime_view.rs | 12 +- src/imap/mod.rs | 189 ++++++++++++++++-------------- src/imap/request.rs | 4 +- src/imap/response.rs | 3 +- src/imap/search.rs | 4 +- src/imap/session.rs | 48 ++++++-- 13 files changed, 181 insertions(+), 126 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 50e7b02..45eaad3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1965,7 +1965,7 @@ dependencies = [ [[package]] name = "imap-codec" version = "2.0.0" -source = "git+https://github.com/superboum/imap-codec?branch=custom/aerogramme#0adcc244282c64cc7874ffa9cd22e4a451ee19f8" +source = "git+https://github.com/superboum/imap-codec?branch=custom/aerogramme#d8a5afc03fb771232e94c73af6a05e79dc80bbed" dependencies = [ "abnf-core", "base64 0.21.7", @@ -1980,7 +1980,7 @@ dependencies = [ [[package]] name = "imap-flow" version = "0.1.0" -source = "git+https://github.com/superboum/imap-flow.git?branch=custom/aerogramme#2bea066da1e09ad04bb5fb71b0dd8d6e5d9e3d19" +source = "git+https://github.com/duesee/imap-flow.git?branch=main#68c1da5d1c56dbe543d9736de9683259d1d28191" dependencies = [ "bounded-static", "bytes", @@ -1994,7 +1994,7 @@ dependencies = [ [[package]] name = "imap-types" version = "2.0.0" -source = "git+https://github.com/superboum/imap-codec?branch=custom/aerogramme#0adcc244282c64cc7874ffa9cd22e4a451ee19f8" +source = "git+https://github.com/superboum/imap-codec?branch=custom/aerogramme#d8a5afc03fb771232e94c73af6a05e79dc80bbed" dependencies = [ "base64 0.21.7", "bounded-static", diff --git a/Cargo.toml b/Cargo.toml index 41002fc..aad2ac6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -64,7 +64,7 @@ eml-codec = "0.1.2" smtp-message = { git = "http://github.com/Alexis211/kannader", branch = "feature/lmtp" } smtp-server = { git = "http://github.com/Alexis211/kannader", branch = "feature/lmtp" } imap-codec = { version = "2.0.0", features = ["bounded-static", "ext_condstore_qresync"] } -imap-flow = { git = "https://github.com/superboum/imap-flow.git", branch = "custom/aerogramme" } +imap-flow = { git = "https://github.com/duesee/imap-flow.git", branch = "main" } thiserror = "1.0.56" [dev-dependencies] diff --git a/src/imap/capability.rs b/src/imap/capability.rs index 256d820..c76b51c 100644 --- a/src/imap/capability.rs +++ b/src/imap/capability.rs @@ -1,5 +1,5 @@ use imap_codec::imap_types::command::{FetchModifier, SelectExamineModifier, StoreModifier}; -use imap_codec::imap_types::core::NonEmptyVec; +use imap_codec::imap_types::core::Vec1; use imap_codec::imap_types::extensions::enable::{CapabilityEnable, Utf8Kind}; use imap_codec::imap_types::response::Capability; use std::collections::HashSet; @@ -49,7 +49,7 @@ impl Default for ServerCapability { } impl ServerCapability { - pub fn to_vec(&self) -> NonEmptyVec> { + pub fn to_vec(&self) -> Vec1> { self.0 .iter() .map(|v| v.clone()) diff --git a/src/imap/command/authenticated.rs b/src/imap/command/authenticated.rs index d2e7815..129c2fd 100644 --- a/src/imap/command/authenticated.rs +++ b/src/imap/command/authenticated.rs @@ -6,7 +6,7 @@ use anyhow::{anyhow, bail, Result}; use imap_codec::imap_types::command::{ Command, CommandBody, ListReturnItem, SelectExamineModifier, }; -use imap_codec::imap_types::core::{Atom, Literal, NonEmptyVec, QuotedChar}; +use imap_codec::imap_types::core::{Atom, Literal, Vec1, QuotedChar}; use imap_codec::imap_types::datetime::DateTime; use imap_codec::imap_types::extensions::enable::CapabilityEnable; use imap_codec::imap_types::flag::{Flag, FlagNameAttribute}; @@ -584,7 +584,7 @@ impl<'a> AuthenticatedContext<'a> { fn enable( self, - cap_enable: &NonEmptyVec>, + cap_enable: &Vec1>, ) -> Result<(Response<'static>, flow::Transition)> { let mut response_builder = Response::build().to_req(self.req); let capabilities = self.client_capabilities.try_enable(cap_enable.as_ref()); diff --git a/src/imap/command/selected.rs b/src/imap/command/selected.rs index 73f8aec..e871509 100644 --- a/src/imap/command/selected.rs +++ b/src/imap/command/selected.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use anyhow::Result; use imap_codec::imap_types::command::{Command, CommandBody, FetchModifier, StoreModifier}; -use imap_codec::imap_types::core::Charset; +use imap_codec::imap_types::core::{Vec1, Charset}; use imap_codec::imap_types::fetch::MacroOrMessageDataItemNames; use imap_codec::imap_types::flag::{Flag, StoreResponse, StoreType}; use imap_codec::imap_types::mailbox::Mailbox as MailboxCodec; @@ -54,11 +54,12 @@ pub async fn dispatch<'a>( ctx.fetch(sequence_set, macro_or_item_names, modifiers, uid) .await } + //@FIXME SearchKey::And is a legacy hack, should be refactored CommandBody::Search { charset, criteria, uid, - } => ctx.search(charset, criteria, uid).await, + } => ctx.search(charset, &SearchKey::And(criteria.clone()), uid).await, CommandBody::Expunge { // UIDPLUS (rfc4315) uid_sequence_set, @@ -88,15 +89,6 @@ pub async fn dispatch<'a>( // UNSELECT extension (rfc3691) CommandBody::Unselect => ctx.unselect().await, - // IDLE extension (rfc2177) - CommandBody::Idle => Ok(( - Response::build() - .to_req(ctx.req) - .message("DUMMY command due to anti-pattern in the code") - .ok()?, - flow::Transition::Idle(ctx.req.tag.clone(), tokio::sync::Notify::new()), - )), - // In selected mode, we fallback to authenticated when needed _ => { authenticated::dispatch(authenticated::AuthenticatedContext { diff --git a/src/imap/flow.rs b/src/imap/flow.rs index 6ddd092..4405e71 100644 --- a/src/imap/flow.rs +++ b/src/imap/flow.rs @@ -1,11 +1,12 @@ use std::error::Error as StdError; use std::fmt; use std::sync::Arc; + use tokio::sync::Notify; +use imap_codec::imap_types::core::Tag; use crate::imap::mailbox_view::MailboxView; use crate::mail::user::User; -use imap_codec::imap_types::core::Tag; #[derive(Debug)] pub enum Error { @@ -31,6 +32,14 @@ pub enum State { ), Logout, } +impl State { + pub fn notify(&self) -> Option> { + match self { + Self::Idle(_, _, _, _, anotif) => Some(anotif.clone()), + _ => None, + } + } +} impl fmt::Display for State { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { use State::*; diff --git a/src/imap/mailbox_view.rs b/src/imap/mailbox_view.rs index 076f92e..f6395b4 100644 --- a/src/imap/mailbox_view.rs +++ b/src/imap/mailbox_view.rs @@ -6,7 +6,7 @@ use anyhow::{anyhow, Error, Result}; use futures::stream::{StreamExt, TryStreamExt}; -use imap_codec::imap_types::core::Charset; +use imap_codec::imap_types::core::{Charset, Vec1}; use imap_codec::imap_types::fetch::MessageDataItem; use imap_codec::imap_types::flag::{Flag, FlagFetch, FlagPerm, StoreResponse, StoreType}; use imap_codec::imap_types::response::{Code, CodeOther, Data, Status}; @@ -629,7 +629,7 @@ impl MailboxView { mod tests { use super::*; use imap_codec::encode::Encoder; - use imap_codec::imap_types::core::NonEmptyVec; + use imap_codec::imap_types::core::Vec1; use imap_codec::imap_types::fetch::Section; use imap_codec::imap_types::fetch::{MacroOrMessageDataItemNames, MessageDataItemName}; use imap_codec::imap_types::response::Response; @@ -749,7 +749,7 @@ mod tests { let test_repr = Response::Data(Data::Fetch { seq: NonZeroU32::new(1).unwrap(), - items: NonEmptyVec::from(MessageDataItem::Body(mime_view::bodystructure( + items: Vec1::from(MessageDataItem::Body(mime_view::bodystructure( &message.child, false, )?)), diff --git a/src/imap/mime_view.rs b/src/imap/mime_view.rs index 8fc043b..8bbbd2d 100644 --- a/src/imap/mime_view.rs +++ b/src/imap/mime_view.rs @@ -8,7 +8,7 @@ use imap_codec::imap_types::body::{ BasicFields, Body as FetchBody, BodyStructure, MultiPartExtensionData, SinglePartExtensionData, SpecificFields, }; -use imap_codec::imap_types::core::{AString, IString, NString, NonEmptyVec}; +use imap_codec::imap_types::core::{AString, IString, NString, Vec1}; use imap_codec::imap_types::fetch::{Part as FetchPart, Section as FetchSection}; use eml_codec::{ @@ -141,8 +141,8 @@ impl<'a> NodeMime<'a> { enum SubsettedSection<'a> { Part, Header, - HeaderFields(&'a NonEmptyVec>), - HeaderFieldsNot(&'a NonEmptyVec>), + HeaderFields(&'a Vec1>), + HeaderFieldsNot(&'a Vec1>), Text, Mime, } @@ -238,7 +238,7 @@ impl<'a> SelectedMime<'a> { /// case-insensitive but otherwise exact. fn header_fields( &self, - fields: &'a NonEmptyVec>, + fields: &'a Vec1>, invert: bool, ) -> Result> { // Build a lowercase ascii hashset with the fields to fetch @@ -398,8 +398,8 @@ impl<'a> NodeMult<'a> { .filter_map(|inner| NodeMime(&inner).structure(is_ext).ok()) .collect::>(); - NonEmptyVec::validate(&inner_bodies)?; - let bodies = NonEmptyVec::unvalidated(inner_bodies); + Vec1::validate(&inner_bodies)?; + let bodies = Vec1::unvalidated(inner_bodies); Ok(BodyStructure::Multi { bodies, diff --git a/src/imap/mod.rs b/src/imap/mod.rs index 544086e..dbf72fe 100644 --- a/src/imap/mod.rs +++ b/src/imap/mod.rs @@ -15,7 +15,7 @@ mod session; use std::net::SocketAddr; -use anyhow::{bail, Result}; +use anyhow::{anyhow, bail, Result, Context}; use futures::stream::{FuturesUnordered, StreamExt}; use tokio::net::TcpListener; @@ -144,13 +144,6 @@ use tokio_util::bytes::BytesMut; const PIPELINABLE_COMMANDS: usize = 64; -#[derive(Debug)] -enum LoopMode { - Quit, - Interactive, - Idle(BytesMut, Arc), -} - // @FIXME a full refactor of this part of the code will be needed sooner or later struct NetLoop { ctx: ClientContext, @@ -163,7 +156,7 @@ impl NetLoop { async fn handler(ctx: ClientContext, sock: AnyStream) { let addr = ctx.addr.clone(); - let nl = match Self::new(ctx, sock).await { + let mut nl = match Self::new(ctx, sock).await { Ok(nl) => { tracing::debug!(addr=?addr, "netloop successfully initialized"); nl @@ -241,85 +234,111 @@ impl NetLoop { tracing::info!("runner is quitting"); } - async fn core(mut self) -> Result<()> { - tracing::trace!("Starting the core loop"); - let mut mode = LoopMode::Interactive; + async fn core(&mut self) -> Result<()> { + let mut maybe_idle: Option> = None; loop { - tracing::trace!(mode=?mode, "Core loop iter"); - mode = match mode { - LoopMode::Interactive => self.interactive_mode().await?, - LoopMode::Idle(buff, stop) => self.idle_mode(buff, stop).await?, - LoopMode::Quit => break, - } + tokio::select! { + // Managing imap_flow stuff + srv_evt = self.server.progress() => match srv_evt? { + ServerFlowEvent::ResponseSent { handle: _handle, response } => { + match response { + Response::Status(Status::Bye(_)) => return Ok(()), + _ => tracing::trace!("sent to {} content {:?}", self.ctx.addr, response), + } + }, + ServerFlowEvent::CommandReceived { command } => { + match self.cmd_tx.try_send(Request::ImapCommand(command)) { + Ok(_) => (), + Err(mpsc::error::TrySendError::Full(_)) => { + self.server.enqueue_status(Status::bye(None, "Too fast").unwrap()); + tracing::error!("client {:?} is sending commands too fast, closing.", self.ctx.addr); + } + _ => { + self.server.enqueue_status(Status::bye(None, "Internal session exited").unwrap()); + tracing::error!("session task exited for {:?}, quitting", self.ctx.addr); + } + } + }, + ServerFlowEvent::IdleCommandReceived { tag } => { + match self.cmd_tx.try_send(Request::IdleStart(tag)) { + Ok(_) => (), + Err(mpsc::error::TrySendError::Full(_)) => { + self.server.enqueue_status(Status::bye(None, "Too fast").unwrap()); + tracing::error!("client {:?} is sending commands too fast, closing.", self.ctx.addr); + } + _ => { + self.server.enqueue_status(Status::bye(None, "Internal session exited").unwrap()); + tracing::error!("session task exited for {:?}, quitting", self.ctx.addr); + } + } + } + ServerFlowEvent::IdleDoneReceived => { + tracing::trace!("client sent DONE and want to stop IDLE"); + maybe_idle.ok_or(anyhow!("Received IDLE done but not idling currently"))?.notify_one(); + maybe_idle = None; + } + flow => { + self.server.enqueue_status(Status::bye(None, "Unsupported server flow event").unwrap()); + tracing::error!("session task exited for {:?} due to unsupported flow {:?}", self.ctx.addr, flow); + } + }, + + // Managing response generated by Aerogramme + maybe_msg = self.resp_rx.recv() => match maybe_msg { + Some(ResponseOrIdle::Response(response)) => { + tracing::trace!("Interactive, server has a response for the client"); + for body_elem in response.body.into_iter() { + let _handle = match body_elem { + Body::Data(d) => self.server.enqueue_data(d), + Body::Status(s) => self.server.enqueue_status(s), + }; + } + self.server.enqueue_status(response.completion); + }, + Some(ResponseOrIdle::IdleAccept(stop)) => { + tracing::trace!("Interactive, server agreed to switch in idle mode"); + let cr = CommandContinuationRequest::basic(None, "Idling")?; + self.server.idle_accept(cr).or(Err(anyhow!("refused continuation for idle accept")))?; + self.cmd_tx.try_send(Request::IdlePoll)?; + if maybe_idle.is_some() { + bail!("Can't start IDLE if already idling"); + } + maybe_idle = Some(stop); + }, + Some(ResponseOrIdle::IdleEvent(elems)) => { + tracing::trace!("server imap session has some change to communicate to the client"); + for body_elem in elems.into_iter() { + let _handle = match body_elem { + Body::Data(d) => self.server.enqueue_data(d), + Body::Status(s) => self.server.enqueue_status(s), + }; + } + self.cmd_tx.try_send(Request::IdlePoll)?; + }, + Some(ResponseOrIdle::IdleReject(response)) => { + tracing::trace!("inform client that session rejected idle"); + self.server + .idle_reject(response.completion) + .or(Err(anyhow!("wrong reject command")))?; + }, + None => { + self.server.enqueue_status(Status::bye(None, "Internal session exited").unwrap()); + tracing::error!("session task exited for {:?}, quitting", self.ctx.addr); + }, + Some(_) => unreachable!(), + + }, + + // When receiving a CTRL+C + _ = self.ctx.must_exit.changed() => { + tracing::trace!("Interactive, CTRL+C, exiting"); + self.server.enqueue_status(Status::bye(None, "Server is being shutdown").unwrap()); + }, + }; } - Ok(()) - } - - async fn interactive_mode(&mut self) -> Result { - tokio::select! { - // Managing imap_flow stuff - srv_evt = self.server.progress() => match srv_evt? { - ServerFlowEvent::ResponseSent { handle: _handle, response } => { - match response { - Response::Status(Status::Bye(_)) => return Ok(LoopMode::Quit), - _ => tracing::trace!("sent to {} content {:?}", self.ctx.addr, response), - } - }, - ServerFlowEvent::CommandReceived { command } => { - match self.cmd_tx.try_send(Request::ImapCommand(command)) { - Ok(_) => (), - Err(mpsc::error::TrySendError::Full(_)) => { - self.server.enqueue_status(Status::bye(None, "Too fast").unwrap()); - tracing::error!("client {:?} is sending commands too fast, closing.", self.ctx.addr); - } - _ => { - self.server.enqueue_status(Status::bye(None, "Internal session exited").unwrap()); - tracing::error!("session task exited for {:?}, quitting", self.ctx.addr); - } - } - }, - flow => { - self.server.enqueue_status(Status::bye(None, "Unsupported server flow event").unwrap()); - tracing::error!("session task exited for {:?} due to unsupported flow {:?}", self.ctx.addr, flow); - } - }, - - // Managing response generated by Aerogramme - maybe_msg = self.resp_rx.recv() => match maybe_msg { - Some(ResponseOrIdle::Response(response)) => { - tracing::trace!("Interactive, server has a response for the client"); - for body_elem in response.body.into_iter() { - let _handle = match body_elem { - Body::Data(d) => self.server.enqueue_data(d), - Body::Status(s) => self.server.enqueue_status(s), - }; - } - self.server.enqueue_status(response.completion); - }, - Some(ResponseOrIdle::StartIdle(stop)) => { - tracing::trace!("Interactive, server agreed to switch in idle mode"); - let cr = CommandContinuationRequest::basic(None, "Idling")?; - self.server.enqueue_continuation(cr); - self.cmd_tx.try_send(Request::Idle)?; - return Ok(LoopMode::Idle(BytesMut::new(), stop)) - }, - None => { - self.server.enqueue_status(Status::bye(None, "Internal session exited").unwrap()); - tracing::error!("session task exited for {:?}, quitting", self.ctx.addr); - }, - Some(_) => unreachable!(), - - }, - - // When receiving a CTRL+C - _ = self.ctx.must_exit.changed() => { - tracing::trace!("Interactive, CTRL+C, exiting"); - self.server.enqueue_status(Status::bye(None, "Server is being shutdown").unwrap()); - }, - }; - Ok(LoopMode::Interactive) } + /* async fn idle_mode(&mut self, mut buff: BytesMut, stop: Arc) -> Result { // Flush send loop { @@ -398,5 +417,5 @@ impl NetLoop { return Ok(LoopMode::Interactive) }, }; - } + }*/ } diff --git a/src/imap/request.rs b/src/imap/request.rs index 49b4992..cff18a3 100644 --- a/src/imap/request.rs +++ b/src/imap/request.rs @@ -1,7 +1,9 @@ use imap_codec::imap_types::command::Command; +use imap_codec::imap_types::core::Tag; #[derive(Debug)] pub enum Request { ImapCommand(Command<'static>), - Idle, + IdleStart(Tag<'static>), + IdlePoll, } diff --git a/src/imap/response.rs b/src/imap/response.rs index 40e6927..b6a0e98 100644 --- a/src/imap/response.rs +++ b/src/imap/response.rs @@ -118,6 +118,7 @@ impl<'a> Response<'a> { #[derive(Debug)] pub enum ResponseOrIdle { Response(Response<'static>), - StartIdle(Arc), + IdleAccept(Arc), + IdleReject(Response<'static>), IdleEvent(Vec>), } diff --git a/src/imap/search.rs b/src/imap/search.rs index 4ff70ee..37a7e9e 100644 --- a/src/imap/search.rs +++ b/src/imap/search.rs @@ -1,6 +1,6 @@ use std::num::{NonZeroU32, NonZeroU64}; -use imap_codec::imap_types::core::NonEmptyVec; +use imap_codec::imap_types::core::Vec1; use imap_codec::imap_types::search::{MetadataItemSearch, SearchKey}; use imap_codec::imap_types::sequence::{SeqOrUid, Sequence, SequenceSet}; @@ -48,7 +48,7 @@ impl<'a> Criteria<'a> { let mut new_vec = base.0.into_inner(); new_vec.extend_from_slice(ext.0.as_ref()); let seq = SequenceSet( - NonEmptyVec::try_from(new_vec) + Vec1::try_from(new_vec) .expect("merging non empty vec lead to non empty vec"), ); (seq, x) diff --git a/src/imap/session.rs b/src/imap/session.rs index 12bbfee..9165574 100644 --- a/src/imap/session.rs +++ b/src/imap/session.rs @@ -4,8 +4,8 @@ use crate::imap::flow; use crate::imap::request::Request; use crate::imap::response::{Response, ResponseOrIdle}; use crate::login::ArcLoginProvider; -use anyhow::{anyhow, bail, Result}; -use imap_codec::imap_types::command::Command; +use anyhow::{anyhow, bail, Result, Context}; +use imap_codec::imap_types::{core::Tag, command::Command}; //----- pub struct Instance { @@ -27,13 +27,44 @@ impl Instance { pub async fn request(&mut self, req: Request) -> ResponseOrIdle { match req { - Request::Idle => self.idle().await, + Request::IdleStart(tag) => self.idle_init(tag), + Request::IdlePoll => self.idle_poll().await, Request::ImapCommand(cmd) => self.command(cmd).await, } } - pub async fn idle(&mut self) -> ResponseOrIdle { - match self.idle_happy().await { + pub fn idle_init(&mut self, tag: Tag<'static>) -> ResponseOrIdle { + // Build transition + //@FIXME the notifier should be hidden inside the state and thus not part of the transition! + let transition = flow::Transition::Idle(tag.clone(), tokio::sync::Notify::new()); + + // Try to apply the transition and get the stop notifier + let maybe_stop = self + .state + .apply(transition) + .context("IDLE transition failed") + .and_then(|_| self.state.notify().ok_or(anyhow!("IDLE state has no Notify object"))); + + // Build an appropriate response + match maybe_stop { + Ok(stop) => ResponseOrIdle::IdleAccept(stop), + Err(e) => { + tracing::error!(err=?e, "unable to init idle due to a transition error"); + //ResponseOrIdle::IdleReject(tag) + let no = Response::build() + .tag(tag) + .message( + "Internal error, processing command triggered an illegal IMAP state transition", + ) + .no() + .unwrap(); + ResponseOrIdle::IdleReject(no) + } + } + } + + pub async fn idle_poll(&mut self) -> ResponseOrIdle { + match self.idle_poll_happy().await { Ok(r) => r, Err(e) => { tracing::error!(err=?e, "something bad happened in idle"); @@ -42,7 +73,7 @@ impl Instance { } } - pub async fn idle_happy(&mut self) -> Result { + pub async fn idle_poll_happy(&mut self) -> Result { let (mbx, tag, stop) = match &mut self.state { flow::State::Idle(_, ref mut mbx, _, tag, stop) => (mbx, tag.clone(), stop.clone()), _ => bail!("Invalid session state, can't idle"), @@ -128,10 +159,11 @@ impl Instance { .bad() .unwrap()); } + ResponseOrIdle::Response(resp) - match &self.state { + /*match &self.state { flow::State::Idle(_, _, _, _, n) => ResponseOrIdle::StartIdle(n.clone()), _ => ResponseOrIdle::Response(resp), - } + }*/ } } From 9b26e251e3d6d7b850064a2c1ed5bb5870918f1e Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Thu, 22 Feb 2024 17:31:03 +0100 Subject: [PATCH 09/16] formatting --- src/imap/command/authenticated.rs | 11 +++---- src/imap/command/selected.rs | 7 ++-- src/imap/flow.rs | 2 +- src/imap/mailbox_view.rs | 10 +++--- src/imap/mod.rs | 2 +- src/imap/session.rs | 10 ++++-- src/mail/query.rs | 53 +++++++++++++++++-------------- 7 files changed, 54 insertions(+), 41 deletions(-) diff --git a/src/imap/command/authenticated.rs b/src/imap/command/authenticated.rs index 129c2fd..eb8833d 100644 --- a/src/imap/command/authenticated.rs +++ b/src/imap/command/authenticated.rs @@ -6,7 +6,7 @@ use anyhow::{anyhow, bail, Result}; use imap_codec::imap_types::command::{ Command, CommandBody, ListReturnItem, SelectExamineModifier, }; -use imap_codec::imap_types::core::{Atom, Literal, Vec1, QuotedChar}; +use imap_codec::imap_types::core::{Atom, Literal, QuotedChar, Vec1}; use imap_codec::imap_types::datetime::DateTime; use imap_codec::imap_types::extensions::enable::CapabilityEnable; use imap_codec::imap_types::flag::{Flag, FlagNameAttribute}; @@ -14,12 +14,12 @@ use imap_codec::imap_types::mailbox::{ListMailbox, Mailbox as MailboxCodec}; use imap_codec::imap_types::response::{Code, CodeOther, Data}; use imap_codec::imap_types::status::{StatusDataItem, StatusDataItemName}; -use crate::imap::Body; use crate::imap::capability::{ClientCapability, ServerCapability}; use crate::imap::command::{anystate, MailboxName}; use crate::imap::flow; use crate::imap::mailbox_view::{MailboxView, UpdateParameters}; use crate::imap::response::Response; +use crate::imap::Body; use crate::mail::uidindex::*; use crate::mail::user::{User, MAILBOX_HIERARCHY_DELIMITER as MBX_HIER_DELIM_RAW}; @@ -560,8 +560,6 @@ impl<'a> AuthenticatedContext<'a> { ) -> Result<(Response<'static>, flow::Transition)> { let append_tag = self.req.tag.clone(); match self.append_internal(mailbox, flags, date, message).await { - - Ok((_mb_view, uidvalidity, uid, _modseq)) => Ok(( Response::build() .tag(append_tag) @@ -623,8 +621,9 @@ impl<'a> AuthenticatedContext<'a> { let flags = flags.iter().map(|x| x.to_string()).collect::>(); // TODO: filter allowed flags? ping @Quentin - let (uidvalidity, uid, modseq) = view.internal.mailbox.append(msg, None, &flags[..]).await?; - //let unsollicited = view.update(UpdateParameters::default()).await?; + let (uidvalidity, uid, modseq) = + view.internal.mailbox.append(msg, None, &flags[..]).await?; + //let unsollicited = view.update(UpdateParameters::default()).await?; Ok((view, uidvalidity, uid, modseq)) } diff --git a/src/imap/command/selected.rs b/src/imap/command/selected.rs index e871509..d000905 100644 --- a/src/imap/command/selected.rs +++ b/src/imap/command/selected.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use anyhow::Result; use imap_codec::imap_types::command::{Command, CommandBody, FetchModifier, StoreModifier}; -use imap_codec::imap_types::core::{Vec1, Charset}; +use imap_codec::imap_types::core::{Charset, Vec1}; use imap_codec::imap_types::fetch::MacroOrMessageDataItemNames; use imap_codec::imap_types::flag::{Flag, StoreResponse, StoreType}; use imap_codec::imap_types::mailbox::Mailbox as MailboxCodec; @@ -59,7 +59,10 @@ pub async fn dispatch<'a>( charset, criteria, uid, - } => ctx.search(charset, &SearchKey::And(criteria.clone()), uid).await, + } => { + ctx.search(charset, &SearchKey::And(criteria.clone()), uid) + .await + } CommandBody::Expunge { // UIDPLUS (rfc4315) uid_sequence_set, diff --git a/src/imap/flow.rs b/src/imap/flow.rs index 4405e71..e372d69 100644 --- a/src/imap/flow.rs +++ b/src/imap/flow.rs @@ -2,8 +2,8 @@ use std::error::Error as StdError; use std::fmt; use std::sync::Arc; -use tokio::sync::Notify; use imap_codec::imap_types::core::Tag; +use tokio::sync::Notify; use crate::imap::mailbox_view::MailboxView; use crate::mail::user::User; diff --git a/src/imap/mailbox_view.rs b/src/imap/mailbox_view.rs index f6395b4..1c53b93 100644 --- a/src/imap/mailbox_view.rs +++ b/src/imap/mailbox_view.rs @@ -370,7 +370,7 @@ impl MailboxView { .fetch() .zip(futures::stream::iter(mail_idx_list)) // [3/6] Derive an IMAP-specific view from the results, apply the filters - .map(|(maybe_qr, midx)| match maybe_qr { + .map(|(maybe_qr, midx)| match maybe_qr { Ok(qr) => Ok((MailView::new(&qr, midx)?.filter(&ap)?, midx)), Err(e) => Err(e), }) @@ -381,7 +381,10 @@ impl MailboxView { // [5/6] Register the \Seen flags if matches!(seen, SeenFlag::MustAdd) { let seen_flag = Flag::Seen.to_string(); - self.internal.mailbox.add_flags(midx.uuid, &[seen_flag]).await?; + self.internal + .mailbox + .add_flags(midx.uuid, &[seen_flag]) + .await?; } Ok::<_, anyhow::Error>(body) @@ -429,13 +432,12 @@ impl MailboxView { Ok(true) => Some(Ok(*midx)), Ok(_) => None, Err(e) => Some(Err(e)), - } + }, Err(e) => Some(Err(e)), }; futures::future::ready(r) }); - // 7. Chain both streams (part resolved from index, part resolved from metadata+body) let main_stream = futures::stream::iter(kept_idx) .map(Ok) diff --git a/src/imap/mod.rs b/src/imap/mod.rs index dbf72fe..02ab9ce 100644 --- a/src/imap/mod.rs +++ b/src/imap/mod.rs @@ -15,7 +15,7 @@ mod session; use std::net::SocketAddr; -use anyhow::{anyhow, bail, Result, Context}; +use anyhow::{anyhow, bail, Context, Result}; use futures::stream::{FuturesUnordered, StreamExt}; use tokio::net::TcpListener; diff --git a/src/imap/session.rs b/src/imap/session.rs index 9165574..fa3232a 100644 --- a/src/imap/session.rs +++ b/src/imap/session.rs @@ -4,8 +4,8 @@ use crate::imap::flow; use crate::imap::request::Request; use crate::imap::response::{Response, ResponseOrIdle}; use crate::login::ArcLoginProvider; -use anyhow::{anyhow, bail, Result, Context}; -use imap_codec::imap_types::{core::Tag, command::Command}; +use anyhow::{anyhow, bail, Context, Result}; +use imap_codec::imap_types::{command::Command, core::Tag}; //----- pub struct Instance { @@ -43,7 +43,11 @@ impl Instance { .state .apply(transition) .context("IDLE transition failed") - .and_then(|_| self.state.notify().ok_or(anyhow!("IDLE state has no Notify object"))); + .and_then(|_| { + self.state + .notify() + .ok_or(anyhow!("IDLE state has no Notify object")) + }); // Build an appropriate response match maybe_stop { diff --git a/src/mail/query.rs b/src/mail/query.rs index cbc5fe6..3e6fe99 100644 --- a/src/mail/query.rs +++ b/src/mail/query.rs @@ -2,8 +2,8 @@ use super::mailbox::MailMeta; use super::snapshot::FrozenMailbox; use super::unique_ident::UniqueIdent; use anyhow::Result; -use futures::stream::{Stream, StreamExt, BoxStream}; use futures::future::FutureExt; +use futures::stream::{BoxStream, Stream, StreamExt}; /// Query is in charge of fetching efficiently /// requested data for a list of emails @@ -34,7 +34,10 @@ impl QueryScope { impl<'a, 'b> Query<'a, 'b> { pub fn fetch(&self) -> BoxStream> { match self.scope { - QueryScope::Index => Box::pin(futures::stream::iter(self.emails).map(|&uuid| Ok(QueryResult::IndexResult { uuid }))), + QueryScope::Index => Box::pin( + futures::stream::iter(self.emails) + .map(|&uuid| Ok(QueryResult::IndexResult { uuid })), + ), QueryScope::Partial => Box::pin(self.partial()), QueryScope::Full => Box::pin(self.full()), } @@ -42,40 +45,42 @@ impl<'a, 'b> Query<'a, 'b> { // --- functions below are private *for reasons* fn partial<'d>(&'d self) -> impl Stream> + 'd + Send { - async move { - let maybe_meta_list: Result> = self.frozen.mailbox.fetch_meta(self.emails).await; + async move { + let maybe_meta_list: Result> = + self.frozen.mailbox.fetch_meta(self.emails).await; let list_res = maybe_meta_list - .map(|meta_list| meta_list - .into_iter() - .zip(self.emails) - .map(|(metadata, &uuid)| Ok(QueryResult::PartialResult { uuid, metadata })) - .collect() - ) + .map(|meta_list| { + meta_list + .into_iter() + .zip(self.emails) + .map(|(metadata, &uuid)| Ok(QueryResult::PartialResult { uuid, metadata })) + .collect() + }) .unwrap_or_else(|e| vec![Err(e)]); futures::stream::iter(list_res) - }.flatten_stream() + } + .flatten_stream() } fn full<'d>(&'d self) -> impl Stream> + 'd + Send { - self.partial() - .then(move |maybe_meta| async move { - let meta = maybe_meta?; + self.partial().then(move |maybe_meta| async move { + let meta = maybe_meta?; - let content = self - .frozen - .mailbox - .fetch_full( - *meta.uuid(), - &meta + let content = self + .frozen + .mailbox + .fetch_full( + *meta.uuid(), + &meta .metadata() .expect("meta to be PartialResult") .message_key, - ) - .await?; + ) + .await?; - Ok(meta.into_full(content).expect("meta to be PartialResult")) - }) + Ok(meta.into_full(content).expect("meta to be PartialResult")) + }) } } From 38a8c7de2a3bdd61a72e4b549cde5db7e52fd170 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Thu, 22 Feb 2024 17:32:18 +0100 Subject: [PATCH 10/16] upgrade cargo2nix --- Cargo.nix | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.nix b/Cargo.nix index 70812e5..08d70a8 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -23,7 +23,7 @@ args@{ ignoreLockHash, }: let - nixifiedLockHash = "3b8bcf5ea054b1e2cc4267f418aa02f3982a7bd534f12f13be2cd956aaebf0f2"; + nixifiedLockHash = "5973cfc48eed6a8da96c5bccd1af1407d6e66a4ab986132f761669fdd0ecd688"; workspaceSrc = if args.workspaceSrc == null then ./. else args.workspaceSrc; currentLockHash = builtins.hashFile "sha256" (workspaceSrc + /Cargo.lock); lockHashIgnored = if ignoreLockHash @@ -97,7 +97,7 @@ in hyper_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.24.2" { inherit profileName; }).out; im = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".im."15.1.0" { inherit profileName; }).out; imap_codec = (rustPackages."git+https://github.com/superboum/imap-codec".imap-codec."2.0.0" { inherit profileName; }).out; - imap_flow = (rustPackages."git+https://github.com/superboum/imap-flow.git".imap-flow."0.1.0" { inherit profileName; }).out; + imap_flow = (rustPackages."git+https://github.com/duesee/imap-flow.git".imap-flow."0.1.0" { inherit profileName; }).out; itertools = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itertools."0.10.5" { inherit profileName; }).out; k2v_client = (rustPackages."git+https://git.deuxfleurs.fr/Deuxfleurs/garage.git".k2v-client."0.0.4" { inherit profileName; }).out; lazy_static = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; }).out; @@ -2725,7 +2725,7 @@ in url = https://github.com/superboum/imap-codec; name = "imap-codec"; version = "2.0.0"; - rev = "0adcc244282c64cc7874ffa9cd22e4a451ee19f8"; + rev = "d8a5afc03fb771232e94c73af6a05e79dc80bbed"; ref = "custom/aerogramme";}; features = builtins.concatLists [ [ "bounded-static" ] @@ -2747,16 +2747,16 @@ in }; }); - "git+https://github.com/superboum/imap-flow.git".imap-flow."0.1.0" = overridableMkRustCrate (profileName: rec { + "git+https://github.com/duesee/imap-flow.git".imap-flow."0.1.0" = overridableMkRustCrate (profileName: rec { name = "imap-flow"; version = "0.1.0"; - registry = "git+https://github.com/superboum/imap-flow.git"; + registry = "git+https://github.com/duesee/imap-flow.git"; src = fetchCrateGit { - url = https://github.com/superboum/imap-flow.git; + url = https://github.com/duesee/imap-flow.git; name = "imap-flow"; version = "0.1.0"; - rev = "2bea066da1e09ad04bb5fb71b0dd8d6e5d9e3d19"; - ref = "custom/aerogramme";}; + rev = "68c1da5d1c56dbe543d9736de9683259d1d28191"; + ref = "main";}; dependencies = { bounded_static = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bounded-static."0.5.0" { inherit profileName; }).out; bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; @@ -2776,7 +2776,7 @@ in url = https://github.com/superboum/imap-codec; name = "imap-types"; version = "2.0.0"; - rev = "0adcc244282c64cc7874ffa9cd22e4a451ee19f8"; + rev = "d8a5afc03fb771232e94c73af6a05e79dc80bbed"; ref = "custom/aerogramme";}; features = builtins.concatLists [ [ "bounded-static" ] From a579382042e0e1af95a00e97647a2cc3794fb108 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Fri, 23 Feb 2024 08:46:05 +0100 Subject: [PATCH 11/16] update flake dependency --- flake.lock | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/flake.lock b/flake.lock index 374a5d8..2371bdb 100644 --- a/flake.lock +++ b/flake.lock @@ -48,11 +48,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1688484237, - "narHash": "sha256-qFUn2taHGe203wm7Oio4UGFz1sAiq+kitRexY3sQ1CA=", + "lastModified": 1706768574, + "narHash": "sha256-4o6TMpzBHO659EiJTzd/EGQGUDdbgwKwhqf3u6b23U8=", "owner": "nix-community", "repo": "fenix", - "rev": "626a9e0a84010728b335f14d3982e11b99af7dc6", + "rev": "668102037129923cd0fc239d864fce71eabdc6a3", "type": "github" }, "original": { @@ -116,11 +116,11 @@ "systems": "systems_2" }, "locked": { - "lastModified": 1689068808, - "narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=", + "lastModified": 1705309234, + "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", "owner": "numtide", "repo": "flake-utils", - "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4", + "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", "type": "github" }, "original": { @@ -162,11 +162,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1688231357, - "narHash": "sha256-ZOn16X5jZ6X5ror58gOJAxPfFLAQhZJ6nOUeS4tfFwo=", + "lastModified": 1706550542, + "narHash": "sha256-UcsnCG6wx++23yeER4Hg18CXWbgNpqNXcHIo5/1Y+hc=", "owner": "nixos", "repo": "nixpkgs", - "rev": "645ff62e09d294a30de823cb568e9c6d68e92606", + "rev": "97b17f32362e475016f942bbdfda4a4a72a8a652", "type": "github" }, "original": { @@ -178,11 +178,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1690294827, - "narHash": "sha256-JV53dEaMM566e+6R4Wj58jBAkFg7HaZr3SsXZ9hdh40=", + "lastModified": 1708673722, + "narHash": "sha256-FPbPhA727wuVkmR21Va6scRjAmj4pk3U8blteaXB/Hg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "7ce0abe77d2ace6d6fc43ff7077019e62a77e741", + "rev": "92cf4feb2b9091466a82b27e4bb045cbccc2ba09", "type": "github" }, "original": { @@ -204,11 +204,11 @@ "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1688410727, - "narHash": "sha256-TqKZO9D64UDBCMY2sUP2ebAKP0oY7S9enrHfZaDiqBQ=", + "lastModified": 1706735270, + "narHash": "sha256-IJk+UitcJsxzMQWm9pa1ZbJBriQ4ginXOlPyVq+Cu40=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "45272efec5fcb8bc46e303d6ced8bd2ba095a667", + "rev": "42cb1a2bd79af321b0cc503d2960b73f34e2f92b", "type": "github" }, "original": { From 02a8537556236437d905cefe8aa2c5d0a96f129a Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Fri, 23 Feb 2024 17:01:51 +0100 Subject: [PATCH 12/16] Replace with a single AWS HTTP client --- Cargo.lock | 303 ++++++++++++++++++++--------------- Cargo.toml | 7 +- src/login/ldap_provider.rs | 7 +- src/login/static_provider.rs | 6 +- src/storage/garage.rs | 49 ++++-- 5 files changed, 225 insertions(+), 147 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 45eaad3..9fdbd4b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -35,6 +35,8 @@ dependencies = [ "async-trait", "aws-config", "aws-sdk-s3", + "aws-smithy-runtime", + "aws-smithy-runtime-api", "backtrace", "base64 0.21.7", "chrono", @@ -45,6 +47,7 @@ dependencies = [ "futures", "hex", "hyper-rustls", + "hyper-util", "im", "imap-codec", "imap-flow", @@ -455,28 +458,27 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "aws-config" -version = "1.1.2" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e64b72d4bdbb41a73d27709c65a25b6e4bfc8321bf70fa3a8b19ce7d4eb81b0" +checksum = "3182c19847238b50b62ae0383a6dbfc14514e552eb5e307e1ea83ccf5840b8a6" dependencies = [ "aws-credential-types", - "aws-http", "aws-runtime", "aws-sdk-sso", "aws-sdk-ssooidc", "aws-sdk-sts", "aws-smithy-async", - "aws-smithy-http 0.60.3", + "aws-smithy-http 0.60.6", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.3", + "aws-smithy-types 1.1.7", "aws-types", "bytes", "fastrand 2.0.1", "hex", - "http", - "hyper", + "http 0.2.11", + "hyper 0.14.28", "ring 0.17.7", "time", "tokio", @@ -486,77 +488,62 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.1.2" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a7cb3510b95492bd9014b60e2e3bee3e48bc516e220316f8e6b60df18b47331" +checksum = "e5635d8707f265c773282a22abe1ecd4fbe96a8eb2f0f14c0796f8016f11a41a" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.3", + "aws-smithy-types 1.1.7", "zeroize", ] -[[package]] -name = "aws-http" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a95d41abe4e941399fdb4bc2f54713eac3c839d98151875948bb24e66ab658f2" -dependencies = [ - "aws-smithy-runtime-api", - "aws-smithy-types 1.1.3", - "aws-types", - "bytes", - "http", - "http-body", - "pin-project-lite 0.2.13", - "tracing", -] - [[package]] name = "aws-runtime" -version = "1.1.2" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cca219c6705d525ace011d6f9bc51aaf32fce5b4c41661d2d7ff22d9b4d49" +checksum = "6f82b9ae2adfd9d6582440d0eeb394c07f74d21b4c0cc72bdb73735c9e1a9c0e" dependencies = [ "aws-credential-types", - "aws-http", - "aws-sigv4 1.1.2", + "aws-sigv4 1.1.6", "aws-smithy-async", "aws-smithy-eventstream", - "aws-smithy-http 0.60.3", + "aws-smithy-http 0.60.6", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.3", + "aws-smithy-types 1.1.7", "aws-types", + "bytes", "fastrand 2.0.1", - "http", + "http 0.2.11", + "http-body 0.4.6", "percent-encoding", + "pin-project-lite 0.2.13", "tracing", "uuid", ] [[package]] name = "aws-sdk-s3" -version = "1.12.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634fbe5b6591ee2e281cd2ba8641e9bd752dbf5bf338924d6ad4bd5a3304fe31" +checksum = "5076637347e7d0218e61facae853110682ae58efabd2f4e2a9e530c203d5fa7b" dependencies = [ "aws-credential-types", - "aws-http", "aws-runtime", - "aws-sigv4 1.1.2", + "aws-sigv4 1.1.6", "aws-smithy-async", "aws-smithy-checksums", "aws-smithy-eventstream", - "aws-smithy-http 0.60.3", + "aws-smithy-http 0.60.6", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.3", + "aws-smithy-types 1.1.7", "aws-smithy-xml", "aws-types", "bytes", - "http", - "http-body", + "http 0.2.11", + "http-body 0.4.6", "once_cell", "percent-encoding", "regex-lite", @@ -566,22 +553,21 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.10.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee41005e0f3a19ae749c7953d9e1f1ef8d2183f76f64966e346fa41c1ba0ed44" +checksum = "ca7e8097448832fcd22faf6bb227e97d76b40e354509d1307653a885811c7151" dependencies = [ "aws-credential-types", - "aws-http", "aws-runtime", "aws-smithy-async", - "aws-smithy-http 0.60.3", + "aws-smithy-http 0.60.6", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.3", + "aws-smithy-types 1.1.7", "aws-types", "bytes", - "http", + "http 0.2.11", "once_cell", "regex-lite", "tracing", @@ -589,22 +575,21 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.10.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa08168f8a27505e7b90f922c32a489feb1f2133878981a15138bebc849ac09c" +checksum = "a75073590e23d63044606771afae309fada8eb10ded54a1ce4598347221d3fef" dependencies = [ "aws-credential-types", - "aws-http", "aws-runtime", "aws-smithy-async", - "aws-smithy-http 0.60.3", + "aws-smithy-http 0.60.6", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.3", + "aws-smithy-types 1.1.7", "aws-types", "bytes", - "http", + "http 0.2.11", "once_cell", "regex-lite", "tracing", @@ -612,23 +597,22 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.10.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29102eff04d50ef70f11a48823db33e33c6cc5f027bfb6ff4864efbd5f1f66f3" +checksum = "650e4aaae41547151dea4d8142f7ffcc8ab8ba76d5dccc8933936ef2102c3356" dependencies = [ "aws-credential-types", - "aws-http", "aws-runtime", "aws-smithy-async", - "aws-smithy-http 0.60.3", + "aws-smithy-http 0.60.6", "aws-smithy-json", "aws-smithy-query", "aws-smithy-runtime", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.3", + "aws-smithy-types 1.1.7", "aws-smithy-xml", "aws-types", - "http", + "http 0.2.11", "once_cell", "regex-lite", "tracing", @@ -644,7 +628,7 @@ dependencies = [ "form_urlencoded", "hex", "hmac", - "http", + "http 0.2.11", "once_cell", "percent-encoding", "regex", @@ -655,21 +639,22 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "1.1.2" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b92384b39aedb258aa734fe0e7b2ffcd13f33e68227251a72cd2635e0acc8f1a" +checksum = "404c64a104188ac70dd1684718765cb5559795458e446480e41984e68e57d888" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", - "aws-smithy-http 0.60.3", + "aws-smithy-http 0.60.6", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.3", + "aws-smithy-types 1.1.7", "bytes", "crypto-bigint 0.5.5", "form_urlencoded", "hex", "hmac", - "http", + "http 0.2.11", + "http 1.0.0", "once_cell", "p256", "percent-encoding", @@ -683,9 +668,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "1.1.3" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eac0bb78e9e2765699999a02d7bfb4e6ad8f13e0962ebb9f5202b1d8cd76006" +checksum = "fcf7f09a27286d84315dfb9346208abb3b0973a692454ae6d0bc8d803fcce3b4" dependencies = [ "futures-util", "pin-project-lite 0.2.13", @@ -694,18 +679,18 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.60.3" +version = "0.60.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535a2d5f1e459bc7709580a77152c8d493982db083236c2b1d1c51dc6217e8a3" +checksum = "0fd4b66f2a8e7c84d7e97bda2666273d41d2a2e25302605bcf906b7b2661ae5e" dependencies = [ - "aws-smithy-http 0.60.3", - "aws-smithy-types 1.1.3", + "aws-smithy-http 0.60.6", + "aws-smithy-types 1.1.7", "bytes", "crc32c", "crc32fast", "hex", - "http", - "http-body", + "http 0.2.11", + "http-body 0.4.6", "md-5", "pin-project-lite 0.2.13", "sha1", @@ -715,11 +700,11 @@ dependencies = [ [[package]] name = "aws-smithy-eventstream" -version = "0.60.3" +version = "0.60.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "682371561562d08ab437766903c6bc28f4f95d7ab2ecfb389bda7849dd98aefe" +checksum = "e6363078f927f612b970edf9d1903ef5cef9a64d1e8423525ebb1f0a1633c858" dependencies = [ - "aws-smithy-types 1.1.3", + "aws-smithy-types 1.1.7", "bytes", "crc32fast", ] @@ -734,9 +719,9 @@ dependencies = [ "bytes", "bytes-utils", "futures-core", - "http", - "http-body", - "hyper", + "http 0.2.11", + "http-body 0.4.6", + "hyper 0.14.28", "once_cell", "percent-encoding", "pin-project-lite 0.2.13", @@ -746,18 +731,18 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.60.3" +version = "0.60.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "365ca49744b2bda2f1e2dc03b856da3fa5a28ca5b0a41e41d7ff5305a8fae190" +checksum = "b6ca214a6a26f1b7ebd63aa8d4f5e2194095643023f9608edf99a58247b9d80d" dependencies = [ "aws-smithy-eventstream", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.3", + "aws-smithy-types 1.1.7", "bytes", "bytes-utils", "futures-core", - "http", - "http-body", + "http 0.2.11", + "http-body 0.4.6", "once_cell", "percent-encoding", "pin-project-lite 0.2.13", @@ -767,39 +752,39 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.60.3" +version = "0.60.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733ccdb727ac63370836aa3b3c483d75ad2ef7bc6507db3efe1d01e8d2e50367" +checksum = "1af80ecf3057fb25fe38d1687e94c4601a7817c6a1e87c1b0635f7ecb644ace5" dependencies = [ - "aws-smithy-types 1.1.3", + "aws-smithy-types 1.1.7", ] [[package]] name = "aws-smithy-query" -version = "0.60.3" +version = "0.60.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aff02ae2ee7968bbce2983ffb5ce529d24f4848532300f398347bde8c2196974" +checksum = "eb27084f72ea5fc20033efe180618677ff4a2f474b53d84695cfe310a6526cbc" dependencies = [ - "aws-smithy-types 1.1.3", + "aws-smithy-types 1.1.7", "urlencoding", ] [[package]] name = "aws-smithy-runtime" -version = "1.1.3" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ab9cb6fee50680af8ceaa293ae79eba32095ca117161cb323f9ee30dd87d139" +checksum = "fbb5fca54a532a36ff927fbd7407a7c8eb9c3b4faf72792ba2965ea2cad8ed55" dependencies = [ "aws-smithy-async", - "aws-smithy-http 0.60.3", + "aws-smithy-http 0.60.6", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.3", + "aws-smithy-types 1.1.7", "bytes", "fastrand 2.0.1", "h2", - "http", - "http-body", - "hyper", + "http 0.2.11", + "http-body 0.4.6", + "hyper 0.14.28", "hyper-rustls", "once_cell", "pin-project-lite 0.2.13", @@ -811,14 +796,15 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.1.3" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02ca2da7619517310bfead6d18abcdde90f1439224d887d608503cfacff46dff" +checksum = "22389cb6f7cac64f266fb9f137745a9349ced7b47e0d2ba503e9e40ede4f7060" dependencies = [ "aws-smithy-async", - "aws-smithy-types 1.1.3", + "aws-smithy-types 1.1.7", "bytes", - "http", + "http 0.2.11", + "http 1.0.0", "pin-project-lite 0.2.13", "tokio", "tracing", @@ -840,16 +826,16 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.1.3" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4bb944488536cd2fef43212d829bc7e9a8bfc4afa079d21170441e7be8d2d0" +checksum = "f081da5481210523d44ffd83d9f0740320050054006c719eae0232d411f024d3" dependencies = [ "base64-simd", "bytes", "bytes-utils", "futures-core", - "http", - "http-body", + "http 0.2.11", + "http-body 0.4.6", "itoa", "num-integer", "pin-project-lite 0.2.13", @@ -863,24 +849,24 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.3" +version = "0.60.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef796feaf894d7fd03869235237aeffe73ed1b29a3927cceeee2eecadf876eba" +checksum = "0fccd8f595d0ca839f9f2548e66b99514a85f92feb4c01cf2868d93eb4888a42" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "1.1.2" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8549aa62c5b7db5c57ab915200ee214b4f5d8f19b29a4a8fa0b3ad3bca1380e3" +checksum = "8fbb5d48aae496f628e7aa2e41991dd4074f606d9e3ade1ce1059f293d40f9a2" dependencies = [ "aws-credential-types", "aws-smithy-async", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.3", - "http", + "aws-smithy-types 1.1.7", + "http 0.2.11", "rustc_version", "tracing", ] @@ -896,9 +882,9 @@ dependencies = [ "bitflags 1.3.2", "bytes", "futures-util", - "http", - "http-body", - "hyper", + "http 0.2.11", + "http-body 0.4.6", + "hyper 0.14.28", "itoa", "matchit", "memchr", @@ -922,8 +908,8 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http", - "http-body", + "http 0.2.11", + "http-body 0.4.6", "mime", "rustversion", "tower-layer", @@ -1242,9 +1228,9 @@ dependencies = [ [[package]] name = "crc32c" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8f48d60e5b4d2c53d5c2b1d8a58c849a70ae5e5509b08a48d047e3b65714a74" +checksum = "89254598aa9b9fa608de44b3ae54c810f0f06d755e24c50177f1f8f31ff50ce2" dependencies = [ "rustc_version", ] @@ -1743,7 +1729,7 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.11", "indexmap 2.1.0", "slab", "tokio", @@ -1823,6 +1809,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.6" @@ -1830,10 +1827,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "http 0.2.11", "pin-project-lite 0.2.13", ] +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.0.0", +] + [[package]] name = "httparse" version = "1.8.0" @@ -1863,19 +1870,34 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http", - "http-body", + "http 0.2.11", + "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite 0.2.13", - "socket2 0.4.10", + "socket2 0.5.5", "tokio", "tower-service", "tracing", "want", ] +[[package]] +name = "hyper" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" +dependencies = [ + "bytes", + "http 1.0.0", + "http-body 1.0.0", + "pin-project-lite 0.2.13", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-rustls" version = "0.24.2" @@ -1883,8 +1905,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http", - "hyper", + "http 0.2.11", + "hyper 0.14.28", "log", "rustls 0.21.10", "rustls-native-certs", @@ -1898,12 +1920,30 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper", + "hyper 0.14.28", "pin-project-lite 0.2.13", "tokio", "tokio-io-timeout", ] +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.0.0", + "http-body 1.0.0", + "hyper 1.2.0", + "pin-project-lite 0.2.13", + "tower", + "tower-service", + "tracing", +] + [[package]] name = "iana-time-zone" version = "0.1.59" @@ -2083,8 +2123,8 @@ dependencies = [ "aws-sigv4 0.55.3", "base64 0.21.7", "hex", - "http", - "hyper", + "http 0.2.11", + "hyper 0.14.28", "hyper-rustls", "log", "percent-encoding", @@ -3523,9 +3563,9 @@ dependencies = [ "base64 0.21.7", "bytes", "h2", - "http", - "http-body", - "hyper", + "http 0.2.11", + "http-body 0.4.6", + "hyper 0.14.28", "hyper-timeout", "percent-encoding", "pin-project", @@ -3576,6 +3616,7 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ + "log", "pin-project-lite 0.2.13", "tracing-attributes", "tracing-core", diff --git a/Cargo.toml b/Cargo.toml index aad2ac6..48d1db4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,6 +49,7 @@ rustls = "0.22" rustls-pemfile = "2.0" tokio-rustls = "0.25" hyper-rustls = { version = "0.24", features = ["http2"] } +hyper-util = { version = "0.1", features = ["client"] } rpassword = "7.0" # login @@ -56,8 +57,10 @@ ldap3 = { version = "0.10", default-features = false, features = ["tls-rustls"] # storage k2v-client = { git = "https://git.deuxfleurs.fr/Deuxfleurs/garage.git", tag = "v0.9.1" } -aws-config = { version = "1.1.1", features = ["behavior-version-latest"] } -aws-sdk-s3 = "1.9.0" +aws-config = { version = "1", features = ["behavior-version-latest"] } +aws-sdk-s3 = "1" +aws-smithy-runtime = "1" +aws-smithy-runtime-api = "1" # email protocols eml-codec = "0.1.2" diff --git a/src/login/ldap_provider.rs b/src/login/ldap_provider.rs index e73e1dc..42c993d 100644 --- a/src/login/ldap_provider.rs +++ b/src/login/ldap_provider.rs @@ -21,6 +21,7 @@ pub struct LdapLoginProvider { storage_specific: StorageSpecific, in_memory_store: storage::in_memory::MemDb, + garage_store: storage::garage::GarageRoot, } enum BucketSource { @@ -91,7 +92,11 @@ impl LdapLoginProvider { mail_attr: config.mail_attr, crypto_root_attr: config.crypto_root_attr, storage_specific: specific, + //@FIXME should be created outside of the login provider + //Login provider should return only a cryptoroot + a storage URI + //storage URI that should be resolved outside... in_memory_store: storage::in_memory::MemDb::new(), + garage_store: storage::garage::GarageRoot::new(), }) } @@ -114,7 +119,7 @@ impl LdapLoginProvider { BucketSource::Attr(a) => get_attr(user, &a)?, }; - storage::garage::GarageBuilder::new(storage::garage::GarageConf { + self.garage_store.user(storage::garage::GarageConf { region: from_config.aws_region.clone(), s3_endpoint: from_config.s3_endpoint.clone(), k2v_endpoint: from_config.k2v_endpoint.clone(), diff --git a/src/login/static_provider.rs b/src/login/static_provider.rs index 1e1ecbf..e190a91 100644 --- a/src/login/static_provider.rs +++ b/src/login/static_provider.rs @@ -25,6 +25,7 @@ pub struct UserDatabase { pub struct StaticLoginProvider { user_db: watch::Receiver, in_memory_store: storage::in_memory::MemDb, + garage_store: storage::garage::GarageRoot, } pub async fn update_user_list(config: PathBuf, up: watch::Sender) -> Result<()> { @@ -84,6 +85,7 @@ impl StaticLoginProvider { Ok(Self { user_db: rx, in_memory_store: storage::in_memory::MemDb::new(), + garage_store: storage::garage::GarageRoot::new(), }) } } @@ -109,7 +111,7 @@ impl LoginProvider for StaticLoginProvider { let storage: storage::Builder = match &user.config.storage { StaticStorage::InMemory => self.in_memory_store.builder(username).await, StaticStorage::Garage(grgconf) => { - storage::garage::GarageBuilder::new(storage::garage::GarageConf { + self.garage_store.user(storage::garage::GarageConf { region: grgconf.aws_region.clone(), k2v_endpoint: grgconf.k2v_endpoint.clone(), s3_endpoint: grgconf.s3_endpoint.clone(), @@ -140,7 +142,7 @@ impl LoginProvider for StaticLoginProvider { let storage: storage::Builder = match &user.config.storage { StaticStorage::InMemory => self.in_memory_store.builder(&user.username).await, StaticStorage::Garage(grgconf) => { - storage::garage::GarageBuilder::new(storage::garage::GarageConf { + self.garage_store.user(storage::garage::GarageConf { region: grgconf.aws_region.clone(), k2v_endpoint: grgconf.k2v_endpoint.clone(), s3_endpoint: grgconf.s3_endpoint.clone(), diff --git a/src/storage/garage.rs b/src/storage/garage.rs index 709e729..870854a 100644 --- a/src/storage/garage.rs +++ b/src/storage/garage.rs @@ -1,7 +1,38 @@ use crate::storage::*; use aws_sdk_s3::{self as s3, error::SdkError, operation::get_object::GetObjectError}; +use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; +use aws_smithy_runtime_api::client::http::SharedHttpClient; +//use hyper_rustls::HttpsConnector; +//use hyper_util::client::legacy::connect::HttpConnector; + + use serde::Serialize; +pub struct GarageRoot { + aws_http: SharedHttpClient, +} + +impl GarageRoot { + pub fn new() -> Self { + /*let http = hyper_rustls::HttpsConnectorBuilder::new() + .https_or_http() + .with_native_roots() + .enable_http1() + .enable_http2() + .build();*/ + let aws_http = HyperClientBuilder::new().build_https(); + Self { aws_http } + } + + pub fn user(&self, conf: GarageConf) -> anyhow::Result> { + let mut unicity: Vec = vec![]; + unicity.extend_from_slice(file!().as_bytes()); + unicity.append(&mut rmp_serde::to_vec(&conf)?); + + Ok(Arc::new(GarageUser { conf, aws_http: self.aws_http.clone(), unicity })) + } +} + #[derive(Clone, Debug, Serialize)] pub struct GarageConf { pub region: String, @@ -12,23 +43,18 @@ pub struct GarageConf { pub bucket: String, } +//@FIXME we should get rid of this builder +//and allocate a S3 + K2V client only once per user +//(and using a shared HTTP client) #[derive(Clone, Debug)] -pub struct GarageBuilder { +pub struct GarageUser { conf: GarageConf, + aws_http: SharedHttpClient, unicity: Vec, } -impl GarageBuilder { - pub fn new(conf: GarageConf) -> anyhow::Result> { - let mut unicity: Vec = vec![]; - unicity.extend_from_slice(file!().as_bytes()); - unicity.append(&mut rmp_serde::to_vec(&conf)?); - Ok(Arc::new(Self { conf, unicity })) - } -} - #[async_trait] -impl IBuilder for GarageBuilder { +impl IBuilder for GarageUser { async fn build(&self) -> Result { let s3_creds = s3::config::Credentials::new( self.conf.aws_access_key_id.clone(), @@ -41,6 +67,7 @@ impl IBuilder for GarageBuilder { let sdk_config = aws_config::from_env() .region(aws_config::Region::new(self.conf.region.clone())) .credentials_provider(s3_creds) + .http_client(self.aws_http.clone()) .endpoint_url(self.conf.s3_endpoint.clone()) .load() .await; From 2a084df300dc30d40cf3599c1cb7a90132d5a6e8 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Fri, 23 Feb 2024 17:31:29 +0100 Subject: [PATCH 13/16] Also share HTTPClient for K2V --- Cargo.lock | 227 +++++++++++++++++++++-------------- Cargo.toml | 6 +- src/login/ldap_provider.rs | 2 +- src/login/static_provider.rs | 2 +- src/storage/garage.rs | 38 +++--- 5 files changed, 164 insertions(+), 111 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9fdbd4b..90296a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -46,7 +46,7 @@ dependencies = [ "eml-codec", "futures", "hex", - "hyper-rustls", + "hyper-rustls 0.26.0", "hyper-util", "im", "imap-codec", @@ -468,11 +468,11 @@ dependencies = [ "aws-sdk-ssooidc", "aws-sdk-sts", "aws-smithy-async", - "aws-smithy-http 0.60.6", + "aws-smithy-http", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.7", + "aws-smithy-types", "aws-types", "bytes", "fastrand 2.0.1", @@ -494,7 +494,7 @@ checksum = "e5635d8707f265c773282a22abe1ecd4fbe96a8eb2f0f14c0796f8016f11a41a" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.7", + "aws-smithy-types", "zeroize", ] @@ -505,12 +505,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f82b9ae2adfd9d6582440d0eeb394c07f74d21b4c0cc72bdb73735c9e1a9c0e" dependencies = [ "aws-credential-types", - "aws-sigv4 1.1.6", + "aws-sigv4", "aws-smithy-async", "aws-smithy-eventstream", - "aws-smithy-http 0.60.6", + "aws-smithy-http", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.7", + "aws-smithy-types", "aws-types", "bytes", "fastrand 2.0.1", @@ -522,6 +522,28 @@ dependencies = [ "uuid", ] +[[package]] +name = "aws-sdk-config" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cb71960e3e197c3f512f3bf0f47f444acd708db59733416107ec2ff161ff5c4" +dependencies = [ + "aws-credential-types", + "aws-runtime", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", + "bytes", + "http 0.2.11", + "once_cell", + "regex-lite", + "tracing", +] + [[package]] name = "aws-sdk-s3" version = "1.16.0" @@ -530,15 +552,15 @@ checksum = "5076637347e7d0218e61facae853110682ae58efabd2f4e2a9e530c203d5fa7b" dependencies = [ "aws-credential-types", "aws-runtime", - "aws-sigv4 1.1.6", + "aws-sigv4", "aws-smithy-async", "aws-smithy-checksums", "aws-smithy-eventstream", - "aws-smithy-http 0.60.6", + "aws-smithy-http", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.7", + "aws-smithy-types", "aws-smithy-xml", "aws-types", "bytes", @@ -560,11 +582,11 @@ dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", - "aws-smithy-http 0.60.6", + "aws-smithy-http", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.7", + "aws-smithy-types", "aws-types", "bytes", "http 0.2.11", @@ -582,11 +604,11 @@ dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", - "aws-smithy-http 0.60.6", + "aws-smithy-http", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.7", + "aws-smithy-types", "aws-types", "bytes", "http 0.2.11", @@ -604,12 +626,12 @@ dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", - "aws-smithy-http 0.60.6", + "aws-smithy-http", "aws-smithy-json", "aws-smithy-query", "aws-smithy-runtime", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.7", + "aws-smithy-types", "aws-smithy-xml", "aws-types", "http 0.2.11", @@ -618,25 +640,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "aws-sigv4" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d2ce6f507be68e968a33485ced670111d1cbad161ddbbab1e313c03d37d8f4c" -dependencies = [ - "aws-smithy-http 0.55.3", - "form_urlencoded", - "hex", - "hmac", - "http 0.2.11", - "once_cell", - "percent-encoding", - "regex", - "sha2", - "time", - "tracing", -] - [[package]] name = "aws-sigv4" version = "1.1.6" @@ -645,9 +648,9 @@ checksum = "404c64a104188ac70dd1684718765cb5559795458e446480e41984e68e57d888" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", - "aws-smithy-http 0.60.6", + "aws-smithy-http", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.7", + "aws-smithy-types", "bytes", "crypto-bigint 0.5.5", "form_urlencoded", @@ -683,8 +686,8 @@ version = "0.60.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fd4b66f2a8e7c84d7e97bda2666273d41d2a2e25302605bcf906b7b2661ae5e" dependencies = [ - "aws-smithy-http 0.60.6", - "aws-smithy-types 1.1.7", + "aws-smithy-http", + "aws-smithy-types", "bytes", "crc32c", "crc32fast", @@ -704,31 +707,11 @@ version = "0.60.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6363078f927f612b970edf9d1903ef5cef9a64d1e8423525ebb1f0a1633c858" dependencies = [ - "aws-smithy-types 1.1.7", + "aws-smithy-types", "bytes", "crc32fast", ] -[[package]] -name = "aws-smithy-http" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b3b693869133551f135e1f2c77cb0b8277d9e3e17feaf2213f735857c4f0d28" -dependencies = [ - "aws-smithy-types 0.55.3", - "bytes", - "bytes-utils", - "futures-core", - "http 0.2.11", - "http-body 0.4.6", - "hyper 0.14.28", - "once_cell", - "percent-encoding", - "pin-project-lite 0.2.13", - "pin-utils", - "tracing", -] - [[package]] name = "aws-smithy-http" version = "0.60.6" @@ -737,7 +720,7 @@ checksum = "b6ca214a6a26f1b7ebd63aa8d4f5e2194095643023f9608edf99a58247b9d80d" dependencies = [ "aws-smithy-eventstream", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.7", + "aws-smithy-types", "bytes", "bytes-utils", "futures-core", @@ -756,7 +739,7 @@ version = "0.60.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1af80ecf3057fb25fe38d1687e94c4601a7817c6a1e87c1b0635f7ecb644ace5" dependencies = [ - "aws-smithy-types 1.1.7", + "aws-smithy-types", ] [[package]] @@ -765,7 +748,7 @@ version = "0.60.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb27084f72ea5fc20033efe180618677ff4a2f474b53d84695cfe310a6526cbc" dependencies = [ - "aws-smithy-types 1.1.7", + "aws-smithy-types", "urlencoding", ] @@ -776,16 +759,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbb5fca54a532a36ff927fbd7407a7c8eb9c3b4faf72792ba2965ea2cad8ed55" dependencies = [ "aws-smithy-async", - "aws-smithy-http 0.60.6", + "aws-smithy-http", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.7", + "aws-smithy-types", "bytes", "fastrand 2.0.1", - "h2", + "h2 0.3.24", "http 0.2.11", "http-body 0.4.6", "hyper 0.14.28", - "hyper-rustls", + "hyper-rustls 0.24.2", "once_cell", "pin-project-lite 0.2.13", "pin-utils", @@ -801,7 +784,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22389cb6f7cac64f266fb9f137745a9349ced7b47e0d2ba503e9e40ede4f7060" dependencies = [ "aws-smithy-async", - "aws-smithy-types 1.1.7", + "aws-smithy-types", "bytes", "http 0.2.11", "http 1.0.0", @@ -811,19 +794,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "aws-smithy-types" -version = "0.55.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16a3d0bf4f324f4ef9793b86a1701d9700fbcdbd12a846da45eed104c634c6e8" -dependencies = [ - "base64-simd", - "itoa", - "num-integer", - "ryu", - "time", -] - [[package]] name = "aws-smithy-types" version = "1.1.7" @@ -865,7 +835,7 @@ dependencies = [ "aws-credential-types", "aws-smithy-async", "aws-smithy-runtime-api", - "aws-smithy-types 1.1.7", + "aws-smithy-types", "http 0.2.11", "rustc_version", "tracing", @@ -1737,6 +1707,25 @@ dependencies = [ "tracing", ] +[[package]] +name = "h2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 1.0.0", + "indexmap 2.1.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1841,6 +1830,19 @@ dependencies = [ "http 1.0.0", ] +[[package]] +name = "http-body-util" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" +dependencies = [ + "bytes", + "futures-util", + "http 1.0.0", + "http-body 1.0.0", + "pin-project-lite 0.2.13", +] + [[package]] name = "httparse" version = "1.8.0" @@ -1869,7 +1871,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", + "h2 0.3.24", "http 0.2.11", "http-body 0.4.6", "httparse", @@ -1890,8 +1892,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" dependencies = [ "bytes", + "futures-channel", + "futures-util", + "h2 0.4.2", "http 1.0.0", "http-body 1.0.0", + "httparse", + "httpdate", + "itoa", "pin-project-lite 0.2.13", "smallvec", "tokio", @@ -1909,11 +1917,30 @@ dependencies = [ "hyper 0.14.28", "log", "rustls 0.21.10", - "rustls-native-certs", + "rustls-native-certs 0.6.3", "tokio", "tokio-rustls 0.24.1", ] +[[package]] +name = "hyper-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" +dependencies = [ + "futures-util", + "http 1.0.0", + "hyper 1.2.0", + "hyper-util", + "log", + "rustls 0.22.2", + "rustls-native-certs 0.7.0", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.25.0", + "tower-service", +] + [[package]] name = "hyper-timeout" version = "0.4.1" @@ -1939,6 +1966,8 @@ dependencies = [ "http-body 1.0.0", "hyper 1.2.0", "pin-project-lite 0.2.13", + "socket2 0.5.5", + "tokio", "tower", "tower-service", "tracing", @@ -2118,14 +2147,17 @@ dependencies = [ [[package]] name = "k2v-client" version = "0.0.4" -source = "git+https://git.deuxfleurs.fr/Deuxfleurs/garage.git?tag=v0.9.1#ee57dd922b9c396298473b41e4046c8d00ee77d5" +source = "git+https://git.deuxfleurs.fr/Deuxfleurs/garage.git?branch=k2v/shared_http_client#8b35a946d9f6b31b26b9783acbfab984316051f4" dependencies = [ - "aws-sigv4 0.55.3", + "aws-sdk-config", + "aws-sigv4", "base64 0.21.7", "hex", - "http 0.2.11", - "hyper 0.14.28", - "hyper-rustls", + "http 1.0.0", + "http-body-util", + "hyper 1.2.0", + "hyper-rustls 0.26.0", + "hyper-util", "log", "percent-encoding", "serde", @@ -2178,7 +2210,7 @@ dependencies = [ "percent-encoding", "ring 0.16.20", "rustls 0.20.9", - "rustls-native-certs", + "rustls-native-certs 0.6.3", "thiserror", "tokio", "tokio-rustls 0.23.4", @@ -2947,6 +2979,19 @@ dependencies = [ "security-framework", ] +[[package]] +name = "rustls-native-certs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +dependencies = [ + "openssl-probe", + "rustls-pemfile 2.0.0", + "rustls-pki-types", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -3562,7 +3607,7 @@ dependencies = [ "axum", "base64 0.21.7", "bytes", - "h2", + "h2 0.3.24", "http 0.2.11", "http-body 0.4.6", "hyper 0.14.28", diff --git a/Cargo.toml b/Cargo.toml index 48d1db4..4c10fcc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,15 +48,15 @@ rand = "0.8.5" rustls = "0.22" rustls-pemfile = "2.0" tokio-rustls = "0.25" -hyper-rustls = { version = "0.24", features = ["http2"] } -hyper-util = { version = "0.1", features = ["client"] } +hyper-rustls = { version = "0.26", features = ["http2"] } +hyper-util = { version = "0.1", features = ["full"] } rpassword = "7.0" # login ldap3 = { version = "0.10", default-features = false, features = ["tls-rustls"] } # storage -k2v-client = { git = "https://git.deuxfleurs.fr/Deuxfleurs/garage.git", tag = "v0.9.1" } +k2v-client = { git = "https://git.deuxfleurs.fr/Deuxfleurs/garage.git", branch = "k2v/shared_http_client" } aws-config = { version = "1", features = ["behavior-version-latest"] } aws-sdk-s3 = "1" aws-smithy-runtime = "1" diff --git a/src/login/ldap_provider.rs b/src/login/ldap_provider.rs index 42c993d..0af5676 100644 --- a/src/login/ldap_provider.rs +++ b/src/login/ldap_provider.rs @@ -96,7 +96,7 @@ impl LdapLoginProvider { //Login provider should return only a cryptoroot + a storage URI //storage URI that should be resolved outside... in_memory_store: storage::in_memory::MemDb::new(), - garage_store: storage::garage::GarageRoot::new(), + garage_store: storage::garage::GarageRoot::new()?, }) } diff --git a/src/login/static_provider.rs b/src/login/static_provider.rs index e190a91..79626df 100644 --- a/src/login/static_provider.rs +++ b/src/login/static_provider.rs @@ -85,7 +85,7 @@ impl StaticLoginProvider { Ok(Self { user_db: rx, in_memory_store: storage::in_memory::MemDb::new(), - garage_store: storage::garage::GarageRoot::new(), + garage_store: storage::garage::GarageRoot::new()?, }) } } diff --git a/src/storage/garage.rs b/src/storage/garage.rs index 870854a..a23bbb2 100644 --- a/src/storage/garage.rs +++ b/src/storage/garage.rs @@ -1,27 +1,29 @@ -use crate::storage::*; use aws_sdk_s3::{self as s3, error::SdkError, operation::get_object::GetObjectError}; use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; use aws_smithy_runtime_api::client::http::SharedHttpClient; -//use hyper_rustls::HttpsConnector; -//use hyper_util::client::legacy::connect::HttpConnector; - - +use hyper_rustls::HttpsConnector; +use hyper_util::rt::TokioExecutor; +use hyper_util::client::legacy::{connect::HttpConnector, Client as HttpClient}; use serde::Serialize; +use crate::storage::*; + pub struct GarageRoot { + k2v_http: HttpClient, k2v_client::Body>, aws_http: SharedHttpClient, } impl GarageRoot { - pub fn new() -> Self { - /*let http = hyper_rustls::HttpsConnectorBuilder::new() - .https_or_http() - .with_native_roots() - .enable_http1() - .enable_http2() - .build();*/ + pub fn new() -> anyhow::Result { + let connector = hyper_rustls::HttpsConnectorBuilder::new() + .with_native_roots()? + .https_or_http() + .enable_http1() + .enable_http2() + .build(); + let k2v_http = HttpClient::builder(TokioExecutor::new()).build(connector); let aws_http = HyperClientBuilder::new().build_https(); - Self { aws_http } + Ok(Self { k2v_http, aws_http }) } pub fn user(&self, conf: GarageConf) -> anyhow::Result> { @@ -29,7 +31,12 @@ impl GarageRoot { unicity.extend_from_slice(file!().as_bytes()); unicity.append(&mut rmp_serde::to_vec(&conf)?); - Ok(Arc::new(GarageUser { conf, aws_http: self.aws_http.clone(), unicity })) + Ok(Arc::new(GarageUser { + conf, + aws_http: self.aws_http.clone(), + k2v_http: self.k2v_http.clone(), + unicity + })) } } @@ -50,6 +57,7 @@ pub struct GarageConf { pub struct GarageUser { conf: GarageConf, aws_http: SharedHttpClient, + k2v_http: HttpClient, k2v_client::Body>, unicity: Vec, } @@ -87,7 +95,7 @@ impl IBuilder for GarageUser { user_agent: None, }; - let k2v_client = match k2v_client::K2vClient::new(k2v_config) { + let k2v_client = match k2v_client::K2vClient::new_with_client(k2v_config, self.k2v_http.clone()) { Err(e) => { tracing::error!("unable to build k2v client: {}", e); return Err(StorageError::Internal); From ab03c7a1605e5684193fde828cfd9e35e8799ebc Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Fri, 23 Feb 2024 18:27:38 +0100 Subject: [PATCH 14/16] Upgrade Cargo.nix --- Cargo.nix | 660 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 380 insertions(+), 280 deletions(-) diff --git a/Cargo.nix b/Cargo.nix index 08d70a8..cbb8354 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -23,7 +23,7 @@ args@{ ignoreLockHash, }: let - nixifiedLockHash = "5973cfc48eed6a8da96c5bccd1af1407d6e66a4ab986132f761669fdd0ecd688"; + nixifiedLockHash = "94ca89fbaba4455fedcad9404b2f26e06837c2e23d491d5cb3e0bcbdf6132d05"; workspaceSrc = if args.workspaceSrc == null then ./. else args.workspaceSrc; currentLockHash = builtins.hashFile "sha256" (workspaceSrc + /Cargo.lock); lockHashIgnored = if ignoreLockHash @@ -83,8 +83,10 @@ in anyhow = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".anyhow."1.0.79" { inherit profileName; }).out; argon2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".argon2."0.5.2" { inherit profileName; }).out; async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.77" { profileName = "__noProfile"; }).out; - aws_config = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-config."1.1.2" { inherit profileName; }).out; - aws_sdk_s3 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-s3."1.12.0" { inherit profileName; }).out; + aws_config = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-config."1.1.6" { inherit profileName; }).out; + aws_sdk_s3 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-s3."1.16.0" { inherit profileName; }).out; + aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.7" { inherit profileName; }).out; + aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out; backtrace = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".backtrace."0.3.69" { inherit profileName; }).out; base64 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.7" { inherit profileName; }).out; chrono = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.31" { inherit profileName; }).out; @@ -94,7 +96,8 @@ in eml_codec = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".eml-codec."0.1.2" { inherit profileName; }).out; futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.30" { inherit profileName; }).out; hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out; - hyper_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.24.2" { inherit profileName; }).out; + hyper_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.26.0" { inherit profileName; }).out; + hyper_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-util."0.1.3" { inherit profileName; }).out; im = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".im."15.1.0" { inherit profileName; }).out; imap_codec = (rustPackages."git+https://github.com/superboum/imap-codec".imap-codec."2.0.0" { inherit profileName; }).out; imap_flow = (rustPackages."git+https://github.com/duesee/imap-flow.git".imap-flow."0.1.0" { inherit profileName; }).out; @@ -612,11 +615,11 @@ in src = fetchCratesIo { inherit name version; sha256 = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"; }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-config."1.1.2" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".aws-config."1.1.6" = overridableMkRustCrate (profileName: rec { name = "aws-config"; - version = "1.1.2"; + version = "1.1.6"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "7e64b72d4bdbb41a73d27709c65a25b6e4bfc8321bf70fa3a8b19ce7d4eb81b0"; }; + src = fetchCratesIo { inherit name version; sha256 = "3182c19847238b50b62ae0383a6dbfc14514e552eb5e307e1ea83ccf5840b8a6"; }; features = builtins.concatLists [ [ "behavior-version-latest" ] [ "client-hyper" ] @@ -627,19 +630,18 @@ in [ "sso" ] ]; dependencies = { - aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.2" { inherit profileName; }).out; - aws_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-http."0.60.2" { inherit profileName; }).out; - aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.2" { inherit profileName; }).out; - aws_sdk_sso = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sso."1.10.0" { inherit profileName; }).out; - aws_sdk_ssooidc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-ssooidc."1.10.0" { inherit profileName; }).out; - aws_sdk_sts = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sts."1.10.0" { inherit profileName; }).out; - aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out; - aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" { inherit profileName; }).out; - aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.3" { inherit profileName; }).out; - aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.3" { inherit profileName; }).out; - aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out; - aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out; - aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.2" { inherit profileName; }).out; + aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" { inherit profileName; }).out; + aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.6" { inherit profileName; }).out; + aws_sdk_sso = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sso."1.14.0" { inherit profileName; }).out; + aws_sdk_ssooidc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-ssooidc."1.14.0" { inherit profileName; }).out; + aws_sdk_sts = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sts."1.14.0" { inherit profileName; }).out; + aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out; + aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out; + aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.6" { inherit profileName; }).out; + aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.7" { inherit profileName; }).out; + aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out; + aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out; + aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.6" { inherit profileName; }).out; bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; fastrand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fastrand."2.0.1" { inherit profileName; }).out; hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out; @@ -653,71 +655,85 @@ in }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.2" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" = overridableMkRustCrate (profileName: rec { name = "aws-credential-types"; - version = "1.1.2"; + version = "1.1.6"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "4a7cb3510b95492bd9014b60e2e3bee3e48bc516e220316f8e6b60df18b47331"; }; + src = fetchCratesIo { inherit name version; sha256 = "e5635d8707f265c773282a22abe1ecd4fbe96a8eb2f0f14c0796f8016f11a41a"; }; features = builtins.concatLists [ [ "test-util" ] ]; dependencies = { - aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out; - aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out; - aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out; + aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out; + aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out; + aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out; zeroize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zeroize."1.7.0" { inherit profileName; }).out; }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-http."0.60.2" = overridableMkRustCrate (profileName: rec { - name = "aws-http"; - version = "0.60.2"; - registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "a95d41abe4e941399fdb4bc2f54713eac3c839d98151875948bb24e66ab658f2"; }; - dependencies = { - aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out; - aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out; - aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.2" { inherit profileName; }).out; - bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; - http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out; - http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" { inherit profileName; }).out; - pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out; - tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out; - }; - }); - - "registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.2" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.6" = overridableMkRustCrate (profileName: rec { name = "aws-runtime"; - version = "1.1.2"; + version = "1.1.6"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "233cca219c6705d525ace011d6f9bc51aaf32fce5b4c41661d2d7ff22d9b4d49"; }; + src = fetchCratesIo { inherit name version; sha256 = "6f82b9ae2adfd9d6582440d0eeb394c07f74d21b4c0cc72bdb73735c9e1a9c0e"; }; features = builtins.concatLists [ [ "event-stream" ] + [ "http-02x" ] [ "sigv4a" ] ]; dependencies = { - aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.2" { inherit profileName; }).out; - aws_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-http."0.60.2" { inherit profileName; }).out; - aws_sigv4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."1.1.2" { inherit profileName; }).out; - aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out; - aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.3" { inherit profileName; }).out; - aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" { inherit profileName; }).out; - aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out; - aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out; - aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.2" { inherit profileName; }).out; + aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" { inherit profileName; }).out; + aws_sigv4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."1.1.6" { inherit profileName; }).out; + aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out; + aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.4" { inherit profileName; }).out; + aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out; + aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out; + aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out; + aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.6" { inherit profileName; }).out; + bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; fastrand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fastrand."2.0.1" { inherit profileName; }).out; http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out; + http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" { inherit profileName; }).out; percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out; + pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out; tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out; uuid = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".uuid."1.7.0" { inherit profileName; }).out; }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-s3."1.12.0" = overridableMkRustCrate (profileName: rec { - name = "aws-sdk-s3"; - version = "1.12.0"; + "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-config."1.15.0" = overridableMkRustCrate (profileName: rec { + name = "aws-sdk-config"; + version = "1.15.0"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "634fbe5b6591ee2e281cd2ba8641e9bd752dbf5bf338924d6ad4bd5a3304fe31"; }; + src = fetchCratesIo { inherit name version; sha256 = "0cb71960e3e197c3f512f3bf0f47f444acd708db59733416107ec2ff161ff5c4"; }; + features = builtins.concatLists [ + [ "default" ] + [ "rt-tokio" ] + [ "rustls" ] + ]; + dependencies = { + aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" { inherit profileName; }).out; + aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.6" { inherit profileName; }).out; + aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out; + aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out; + aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.6" { inherit profileName; }).out; + aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.7" { inherit profileName; }).out; + aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out; + aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out; + aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.6" { inherit profileName; }).out; + bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; + http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out; + once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out; + regex_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex-lite."0.1.5" { inherit profileName; }).out; + tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-s3."1.16.0" = overridableMkRustCrate (profileName: rec { + name = "aws-sdk-s3"; + version = "1.16.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "5076637347e7d0218e61facae853110682ae58efabd2f4e2a9e530c203d5fa7b"; }; features = builtins.concatLists [ [ "default" ] [ "rt-tokio" ] @@ -725,20 +741,19 @@ in [ "sigv4a" ] ]; dependencies = { - aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.2" { inherit profileName; }).out; - aws_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-http."0.60.2" { inherit profileName; }).out; - aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.2" { inherit profileName; }).out; - aws_sigv4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."1.1.2" { inherit profileName; }).out; - aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out; - aws_smithy_checksums = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-checksums."0.60.3" { inherit profileName; }).out; - aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.3" { inherit profileName; }).out; - aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" { inherit profileName; }).out; - aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.3" { inherit profileName; }).out; - aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.3" { inherit profileName; }).out; - aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out; - aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out; - aws_smithy_xml = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-xml."0.60.3" { inherit profileName; }).out; - aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.2" { inherit profileName; }).out; + aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" { inherit profileName; }).out; + aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.6" { inherit profileName; }).out; + aws_sigv4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."1.1.6" { inherit profileName; }).out; + aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out; + aws_smithy_checksums = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-checksums."0.60.6" { inherit profileName; }).out; + aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.4" { inherit profileName; }).out; + aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out; + aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.6" { inherit profileName; }).out; + aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.7" { inherit profileName; }).out; + aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out; + aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out; + aws_smithy_xml = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-xml."0.60.6" { inherit profileName; }).out; + aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.6" { inherit profileName; }).out; bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out; http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" { inherit profileName; }).out; @@ -750,22 +765,21 @@ in }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sso."1.10.0" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sso."1.14.0" = overridableMkRustCrate (profileName: rec { name = "aws-sdk-sso"; - version = "1.10.0"; + version = "1.14.0"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "ee41005e0f3a19ae749c7953d9e1f1ef8d2183f76f64966e346fa41c1ba0ed44"; }; + src = fetchCratesIo { inherit name version; sha256 = "ca7e8097448832fcd22faf6bb227e97d76b40e354509d1307653a885811c7151"; }; dependencies = { - aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.2" { inherit profileName; }).out; - aws_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-http."0.60.2" { inherit profileName; }).out; - aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.2" { inherit profileName; }).out; - aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out; - aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" { inherit profileName; }).out; - aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.3" { inherit profileName; }).out; - aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.3" { inherit profileName; }).out; - aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out; - aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out; - aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.2" { inherit profileName; }).out; + aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" { inherit profileName; }).out; + aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.6" { inherit profileName; }).out; + aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out; + aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out; + aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.6" { inherit profileName; }).out; + aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.7" { inherit profileName; }).out; + aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out; + aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out; + aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.6" { inherit profileName; }).out; bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out; once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out; @@ -774,22 +788,21 @@ in }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-ssooidc."1.10.0" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-ssooidc."1.14.0" = overridableMkRustCrate (profileName: rec { name = "aws-sdk-ssooidc"; - version = "1.10.0"; + version = "1.14.0"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "fa08168f8a27505e7b90f922c32a489feb1f2133878981a15138bebc849ac09c"; }; + src = fetchCratesIo { inherit name version; sha256 = "a75073590e23d63044606771afae309fada8eb10ded54a1ce4598347221d3fef"; }; dependencies = { - aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.2" { inherit profileName; }).out; - aws_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-http."0.60.2" { inherit profileName; }).out; - aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.2" { inherit profileName; }).out; - aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out; - aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" { inherit profileName; }).out; - aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.3" { inherit profileName; }).out; - aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.3" { inherit profileName; }).out; - aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out; - aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out; - aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.2" { inherit profileName; }).out; + aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" { inherit profileName; }).out; + aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.6" { inherit profileName; }).out; + aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out; + aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out; + aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.6" { inherit profileName; }).out; + aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.7" { inherit profileName; }).out; + aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out; + aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out; + aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.6" { inherit profileName; }).out; bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out; once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out; @@ -798,24 +811,23 @@ in }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sts."1.10.0" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sts."1.14.0" = overridableMkRustCrate (profileName: rec { name = "aws-sdk-sts"; - version = "1.10.0"; + version = "1.14.0"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "29102eff04d50ef70f11a48823db33e33c6cc5f027bfb6ff4864efbd5f1f66f3"; }; + src = fetchCratesIo { inherit name version; sha256 = "650e4aaae41547151dea4d8142f7ffcc8ab8ba76d5dccc8933936ef2102c3356"; }; dependencies = { - aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.2" { inherit profileName; }).out; - aws_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-http."0.60.2" { inherit profileName; }).out; - aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.2" { inherit profileName; }).out; - aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out; - aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" { inherit profileName; }).out; - aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.3" { inherit profileName; }).out; - aws_smithy_query = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-query."0.60.3" { inherit profileName; }).out; - aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.3" { inherit profileName; }).out; - aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out; - aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out; - aws_smithy_xml = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-xml."0.60.3" { inherit profileName; }).out; - aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.2" { inherit profileName; }).out; + aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" { inherit profileName; }).out; + aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.6" { inherit profileName; }).out; + aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out; + aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out; + aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.6" { inherit profileName; }).out; + aws_smithy_query = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-query."0.60.6" { inherit profileName; }).out; + aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.7" { inherit profileName; }).out; + aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out; + aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out; + aws_smithy_xml = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-xml."0.60.6" { inherit profileName; }).out; + aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.6" { inherit profileName; }).out; http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out; once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out; regex_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex-lite."0.1.5" { inherit profileName; }).out; @@ -823,57 +835,32 @@ in }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."0.55.3" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."1.1.6" = overridableMkRustCrate (profileName: rec { name = "aws-sigv4"; - version = "0.55.3"; + version = "1.1.6"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "9d2ce6f507be68e968a33485ced670111d1cbad161ddbbab1e313c03d37d8f4c"; }; - features = builtins.concatLists [ - [ "default" ] - [ "form_urlencoded" ] - [ "http" ] - [ "percent-encoding" ] - [ "sign-http" ] - ]; - dependencies = { - aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.55.3" { inherit profileName; }).out; - form_urlencoded = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".form_urlencoded."1.2.1" { inherit profileName; }).out; - hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out; - hmac = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hmac."0.12.1" { inherit profileName; }).out; - http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out; - once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out; - percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out; - regex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.10.2" { inherit profileName; }).out; - sha2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.8" { inherit profileName; }).out; - time = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".time."0.3.31" { inherit profileName; }).out; - tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out; - }; - }); - - "registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."1.1.2" = overridableMkRustCrate (profileName: rec { - name = "aws-sigv4"; - version = "1.1.2"; - registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "b92384b39aedb258aa734fe0e7b2ffcd13f33e68227251a72cd2635e0acc8f1a"; }; + src = fetchCratesIo { inherit name version; sha256 = "404c64a104188ac70dd1684718765cb5559795458e446480e41984e68e57d888"; }; features = builtins.concatLists [ [ "default" ] [ "http0-compat" ] + [ "http1" ] [ "sign-eventstream" ] [ "sign-http" ] [ "sigv4a" ] ]; dependencies = { - aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.2" { inherit profileName; }).out; - aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.3" { inherit profileName; }).out; - aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" { inherit profileName; }).out; - aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out; - aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out; + aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" { inherit profileName; }).out; + aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.4" { inherit profileName; }).out; + aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out; + aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out; + aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out; bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; crypto_bigint = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crypto-bigint."0.5.5" { inherit profileName; }).out; form_urlencoded = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".form_urlencoded."1.2.1" { inherit profileName; }).out; hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out; hmac = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hmac."0.12.1" { inherit profileName; }).out; - http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out; + http0 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out; + http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out; once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out; p256 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".p256."0.11.1" { inherit profileName; }).out; percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out; @@ -886,11 +873,11 @@ in }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" = overridableMkRustCrate (profileName: rec { name = "aws-smithy-async"; - version = "1.1.3"; + version = "1.1.7"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "2eac0bb78e9e2765699999a02d7bfb4e6ad8f13e0962ebb9f5202b1d8cd76006"; }; + src = fetchCratesIo { inherit name version; sha256 = "fcf7f09a27286d84315dfb9346208abb3b0973a692454ae6d0bc8d803fcce3b4"; }; features = builtins.concatLists [ [ "rt-tokio" ] ]; @@ -901,16 +888,16 @@ in }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-checksums."0.60.3" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-checksums."0.60.6" = overridableMkRustCrate (profileName: rec { name = "aws-smithy-checksums"; - version = "0.60.3"; + version = "0.60.6"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "535a2d5f1e459bc7709580a77152c8d493982db083236c2b1d1c51dc6217e8a3"; }; + src = fetchCratesIo { inherit name version; sha256 = "0fd4b66f2a8e7c84d7e97bda2666273d41d2a2e25302605bcf906b7b2661ae5e"; }; dependencies = { - aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" { inherit profileName; }).out; - aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out; + aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out; + aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out; bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; - crc32c = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crc32c."0.6.4" { inherit profileName; }).out; + crc32c = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crc32c."0.6.5" { inherit profileName; }).out; crc32fast = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crc32fast."1.3.2" { inherit profileName; }).out; hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out; http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out; @@ -923,52 +910,31 @@ in }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.3" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.4" = overridableMkRustCrate (profileName: rec { name = "aws-smithy-eventstream"; - version = "0.60.3"; + version = "0.60.4"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "682371561562d08ab437766903c6bc28f4f95d7ab2ecfb389bda7849dd98aefe"; }; + src = fetchCratesIo { inherit name version; sha256 = "e6363078f927f612b970edf9d1903ef5cef9a64d1e8423525ebb1f0a1633c858"; }; dependencies = { - aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out; + aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out; bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; crc32fast = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crc32fast."1.3.2" { inherit profileName; }).out; }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.55.3" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" = overridableMkRustCrate (profileName: rec { name = "aws-smithy-http"; - version = "0.55.3"; + version = "0.60.6"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "2b3b693869133551f135e1f2c77cb0b8277d9e3e17feaf2213f735857c4f0d28"; }; - dependencies = { - aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" { inherit profileName; }).out; - bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; - bytes_utils = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes-utils."0.1.4" { inherit profileName; }).out; - futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out; - http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out; - http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" { inherit profileName; }).out; - hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.28" { inherit profileName; }).out; - once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out; - percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out; - pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out; - pin_utils = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-utils."0.1.0" { inherit profileName; }).out; - tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out; - }; - }); - - "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" = overridableMkRustCrate (profileName: rec { - name = "aws-smithy-http"; - version = "0.60.3"; - registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "365ca49744b2bda2f1e2dc03b856da3fa5a28ca5b0a41e41d7ff5305a8fae190"; }; + src = fetchCratesIo { inherit name version; sha256 = "b6ca214a6a26f1b7ebd63aa8d4f5e2194095643023f9608edf99a58247b9d80d"; }; features = builtins.concatLists [ [ "aws-smithy-eventstream" ] [ "event-stream" ] ]; dependencies = { - aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.3" { inherit profileName; }).out; - aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out; - aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out; + aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.4" { inherit profileName; }).out; + aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out; + aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out; bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; bytes_utils = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes-utils."0.1.4" { inherit profileName; }).out; futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out; @@ -982,32 +948,32 @@ in }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.3" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.6" = overridableMkRustCrate (profileName: rec { name = "aws-smithy-json"; - version = "0.60.3"; + version = "0.60.6"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "733ccdb727ac63370836aa3b3c483d75ad2ef7bc6507db3efe1d01e8d2e50367"; }; + src = fetchCratesIo { inherit name version; sha256 = "1af80ecf3057fb25fe38d1687e94c4601a7817c6a1e87c1b0635f7ecb644ace5"; }; dependencies = { - aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out; + aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out; }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-query."0.60.3" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-query."0.60.6" = overridableMkRustCrate (profileName: rec { name = "aws-smithy-query"; - version = "0.60.3"; + version = "0.60.6"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "aff02ae2ee7968bbce2983ffb5ce529d24f4848532300f398347bde8c2196974"; }; + src = fetchCratesIo { inherit name version; sha256 = "eb27084f72ea5fc20033efe180618677ff4a2f474b53d84695cfe310a6526cbc"; }; dependencies = { - aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out; + aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out; urlencoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".urlencoding."2.1.3" { inherit profileName; }).out; }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.3" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.7" = overridableMkRustCrate (profileName: rec { name = "aws-smithy-runtime"; - version = "1.1.3"; + version = "1.1.7"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "6ab9cb6fee50680af8ceaa293ae79eba32095ca117161cb323f9ee30dd87d139"; }; + src = fetchCratesIo { inherit name version; sha256 = "fbb5fca54a532a36ff927fbd7407a7c8eb9c3b4faf72792ba2965ea2cad8ed55"; }; features = builtins.concatLists [ [ "client" ] [ "connector-hyper-0-14-x" ] @@ -1015,10 +981,10 @@ in [ "tls-rustls" ] ]; dependencies = { - aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out; - aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" { inherit profileName; }).out; - aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out; - aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out; + aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out; + aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out; + aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out; + aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out; bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; fastrand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fastrand."2.0.1" { inherit profileName; }).out; h2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".h2."0.3.24" { inherit profileName; }).out; @@ -1035,11 +1001,11 @@ in }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" = overridableMkRustCrate (profileName: rec { name = "aws-smithy-runtime-api"; - version = "1.1.3"; + version = "1.1.7"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "02ca2da7619517310bfead6d18abcdde90f1439224d887d608503cfacff46dff"; }; + src = fetchCratesIo { inherit name version; sha256 = "22389cb6f7cac64f266fb9f137745a9349ced7b47e0d2ba503e9e40ede4f7060"; }; features = builtins.concatLists [ [ "client" ] [ "default" ] @@ -1047,10 +1013,11 @@ in [ "http-auth" ] ]; dependencies = { - aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out; - aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out; + aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out; + aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out; bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out; + http1 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out; pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out; tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.35.1" { inherit profileName; }).out; tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out; @@ -1058,25 +1025,11 @@ in }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" = overridableMkRustCrate (profileName: rec { name = "aws-smithy-types"; - version = "0.55.3"; + version = "1.1.7"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "16a3d0bf4f324f4ef9793b86a1701d9700fbcdbd12a846da45eed104c634c6e8"; }; - dependencies = { - base64_simd = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64-simd."0.8.0" { inherit profileName; }).out; - itoa = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.10" { inherit profileName; }).out; - num_integer = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-integer."0.1.45" { inherit profileName; }).out; - ryu = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ryu."1.0.16" { inherit profileName; }).out; - time = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".time."0.3.31" { inherit profileName; }).out; - }; - }); - - "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" = overridableMkRustCrate (profileName: rec { - name = "aws-smithy-types"; - version = "1.1.3"; - registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "5d4bb944488536cd2fef43212d829bc7e9a8bfc4afa079d21170441e7be8d2d0"; }; + src = fetchCratesIo { inherit name version; sha256 = "f081da5481210523d44ffd83d9f0740320050054006c719eae0232d411f024d3"; }; features = builtins.concatLists [ [ "byte-stream-poll-next" ] [ "http-body-0-4-x" ] @@ -1101,26 +1054,26 @@ in }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-xml."0.60.3" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-xml."0.60.6" = overridableMkRustCrate (profileName: rec { name = "aws-smithy-xml"; - version = "0.60.3"; + version = "0.60.6"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "ef796feaf894d7fd03869235237aeffe73ed1b29a3927cceeee2eecadf876eba"; }; + src = fetchCratesIo { inherit name version; sha256 = "0fccd8f595d0ca839f9f2548e66b99514a85f92feb4c01cf2868d93eb4888a42"; }; dependencies = { xmlparser = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".xmlparser."0.13.6" { inherit profileName; }).out; }; }); - "registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.2" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.6" = overridableMkRustCrate (profileName: rec { name = "aws-types"; - version = "1.1.2"; + version = "1.1.6"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "8549aa62c5b7db5c57ab915200ee214b4f5d8f19b29a4a8fa0b3ad3bca1380e3"; }; + src = fetchCratesIo { inherit name version; sha256 = "8fbb5d48aae496f628e7aa2e41991dd4074f606d9e3ade1ce1059f293d40f9a2"; }; dependencies = { - aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.2" { inherit profileName; }).out; - aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out; - aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out; - aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out; + aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" { inherit profileName; }).out; + aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out; + aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out; + aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out; http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out; tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out; }; @@ -1639,11 +1592,11 @@ in }; }); - "registry+https://github.com/rust-lang/crates.io-index".crc32c."0.6.4" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".crc32c."0.6.5" = overridableMkRustCrate (profileName: rec { name = "crc32c"; - version = "0.6.4"; + version = "0.6.5"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "d8f48d60e5b4d2c53d5c2b1d8a58c849a70ae5e5509b08a48d047e3b65714a74"; }; + src = fetchCratesIo { inherit name version; sha256 = "89254598aa9b9fa608de44b3ae54c810f0f06d755e24c50177f1f8f31ff50ce2"; }; buildDependencies = { rustc_version = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".rustc_version."0.4.0" { profileName = "__noProfile"; }).out; }; @@ -2417,6 +2370,26 @@ in }; }); + "registry+https://github.com/rust-lang/crates.io-index".h2."0.4.2" = overridableMkRustCrate (profileName: rec { + name = "h2"; + version = "0.4.2"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943"; }; + dependencies = { + bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; + fnv = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fnv."1.0.7" { inherit profileName; }).out; + futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out; + futures_sink = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.30" { inherit profileName; }).out; + futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out; + http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out; + indexmap = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".indexmap."2.1.0" { inherit profileName; }).out; + slab = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".slab."0.4.9" { inherit profileName; }).out; + tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.35.1" { inherit profileName; }).out; + tokio_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.10" { inherit profileName; }).out; + tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out; + }; + }); + "registry+https://github.com/rust-lang/crates.io-index".hashbrown."0.12.3" = overridableMkRustCrate (profileName: rec { name = "hashbrown"; version = "0.12.3"; @@ -2527,6 +2500,22 @@ in }; }); + "registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" = overridableMkRustCrate (profileName: rec { + name = "http"; + version = "1.0.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + dependencies = { + bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; + fnv = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fnv."1.0.7" { inherit profileName; }).out; + itoa = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.10" { inherit profileName; }).out; + }; + }); + "registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" = overridableMkRustCrate (profileName: rec { name = "http-body"; version = "0.4.6"; @@ -2539,6 +2528,31 @@ in }; }); + "registry+https://github.com/rust-lang/crates.io-index".http-body."1.0.0" = overridableMkRustCrate (profileName: rec { + name = "http-body"; + version = "1.0.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643"; }; + dependencies = { + bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; + http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".http-body-util."0.1.0" = overridableMkRustCrate (profileName: rec { + name = "http-body-util"; + version = "0.1.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840"; }; + dependencies = { + bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; + futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out; + http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out; + http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."1.0.0" { inherit profileName; }).out; + pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out; + }; + }); + "registry+https://github.com/rust-lang/crates.io-index".httparse."1.8.0" = overridableMkRustCrate (profileName: rec { name = "httparse"; version = "1.8.0"; @@ -2594,7 +2608,7 @@ in httpdate = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".httpdate."1.0.3" { inherit profileName; }).out; itoa = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.10" { inherit profileName; }).out; pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out; - socket2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".socket2."0.4.10" { inherit profileName; }).out; + socket2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".socket2."0.5.5" { inherit profileName; }).out; tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.35.1" { inherit profileName; }).out; tower_service = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-service."0.3.2" { inherit profileName; }).out; tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out; @@ -2602,6 +2616,35 @@ in }; }); + "registry+https://github.com/rust-lang/crates.io-index".hyper."1.2.0" = overridableMkRustCrate (profileName: rec { + name = "hyper"; + version = "1.2.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a"; }; + features = builtins.concatLists [ + [ "client" ] + [ "default" ] + [ "http1" ] + [ "http2" ] + [ "server" ] + ]; + dependencies = { + bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; + futures_channel = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.30" { inherit profileName; }).out; + futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out; + h2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".h2."0.4.2" { inherit profileName; }).out; + http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out; + http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."1.0.0" { inherit profileName; }).out; + httparse = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".httparse."1.8.0" { inherit profileName; }).out; + httpdate = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".httpdate."1.0.3" { inherit profileName; }).out; + itoa = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.10" { inherit profileName; }).out; + pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out; + smallvec = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".smallvec."1.13.1" { inherit profileName; }).out; + tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.35.1" { inherit profileName; }).out; + want = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".want."0.3.1" { inherit profileName; }).out; + }; + }); + "registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.24.2" = overridableMkRustCrate (profileName: rec { name = "hyper-rustls"; version = "0.24.2"; @@ -2631,6 +2674,37 @@ in }; }); + "registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.26.0" = overridableMkRustCrate (profileName: rec { + name = "hyper-rustls"; + version = "0.26.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c"; }; + features = builtins.concatLists [ + [ "default" ] + [ "http1" ] + [ "http2" ] + [ "log" ] + [ "logging" ] + [ "native-tokio" ] + [ "ring" ] + [ "rustls-native-certs" ] + [ "tls12" ] + ]; + dependencies = { + futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out; + http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out; + hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."1.2.0" { inherit profileName; }).out; + hyper_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-util."0.1.3" { inherit profileName; }).out; + log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out; + rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.22.2" { inherit profileName; }).out; + rustls_native_certs = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-native-certs."0.7.0" { inherit profileName; }).out; + pki_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pki-types."1.1.0" { inherit profileName; }).out; + tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.35.1" { inherit profileName; }).out; + tokio_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-rustls."0.25.0" { inherit profileName; }).out; + tower_service = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-service."0.3.2" { inherit profileName; }).out; + }; + }); + "registry+https://github.com/rust-lang/crates.io-index".hyper-timeout."0.4.1" = overridableMkRustCrate (profileName: rec { name = "hyper-timeout"; version = "0.4.1"; @@ -2644,6 +2718,39 @@ in }; }); + "registry+https://github.com/rust-lang/crates.io-index".hyper-util."0.1.3" = overridableMkRustCrate (profileName: rec { + name = "hyper-util"; + version = "0.1.3"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa"; }; + features = builtins.concatLists [ + [ "client" ] + [ "client-legacy" ] + [ "default" ] + [ "full" ] + [ "http1" ] + [ "http2" ] + [ "server" ] + [ "server-auto" ] + [ "service" ] + [ "tokio" ] + ]; + dependencies = { + bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out; + futures_channel = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.30" { inherit profileName; }).out; + futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out; + http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out; + http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."1.0.0" { inherit profileName; }).out; + hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."1.2.0" { inherit profileName; }).out; + pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out; + socket2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".socket2."0.5.5" { inherit profileName; }).out; + tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.35.1" { inherit profileName; }).out; + tower = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower."0.4.13" { inherit profileName; }).out; + tower_service = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-service."0.3.2" { inherit profileName; }).out; + tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out; + }; + }); + "registry+https://github.com/rust-lang/crates.io-index".iana-time-zone."0.1.59" = overridableMkRustCrate (profileName: rec { name = "iana-time-zone"; version = "0.1.59"; @@ -2900,14 +3007,18 @@ in url = https://git.deuxfleurs.fr/Deuxfleurs/garage.git; name = "k2v-client"; version = "0.0.4"; - rev = "ee57dd922b9c396298473b41e4046c8d00ee77d5";}; + rev = "8b35a946d9f6b31b26b9783acbfab984316051f4"; + ref = "k2v/shared_http_client";}; dependencies = { - aws_sigv4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."0.55.3" { inherit profileName; }).out; + aws_sdk_config = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-config."1.15.0" { inherit profileName; }).out; + aws_sigv4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."1.1.6" { inherit profileName; }).out; base64 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.7" { inherit profileName; }).out; hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out; - http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out; - hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.28" { inherit profileName; }).out; - hyper_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.24.2" { inherit profileName; }).out; + http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out; + http_body_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body-util."0.1.0" { inherit profileName; }).out; + hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."1.2.0" { inherit profileName; }).out; + hyper_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.26.0" { inherit profileName; }).out; + hyper_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-util."0.1.3" { inherit profileName; }).out; log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out; percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out; serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.195" { inherit profileName; }).out; @@ -3795,23 +3906,9 @@ in registry = "registry+https://github.com/rust-lang/crates.io-index"; src = fetchCratesIo { inherit name version; sha256 = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"; }; features = builtins.concatLists [ - [ "default" ] - [ "perf" ] - [ "perf-backtrack" ] - [ "perf-cache" ] - [ "perf-dfa" ] - [ "perf-inline" ] - [ "perf-literal" ] - [ "perf-onepass" ] [ "std" ] - [ "unicode" ] - [ "unicode-age" ] - [ "unicode-bool" ] [ "unicode-case" ] - [ "unicode-gencat" ] [ "unicode-perl" ] - [ "unicode-script" ] - [ "unicode-segment" ] ]; dependencies = { aho_corasick = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aho-corasick."1.1.2" { inherit profileName; }).out; @@ -3843,26 +3940,13 @@ in src = fetchCratesIo { inherit name version; sha256 = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"; }; features = builtins.concatLists [ [ "alloc" ] - [ "dfa-onepass" ] - [ "hybrid" ] [ "meta" ] - [ "nfa-backtrack" ] [ "nfa-pikevm" ] [ "nfa-thompson" ] - [ "perf-inline" ] - [ "perf-literal" ] - [ "perf-literal-multisubstring" ] - [ "perf-literal-substring" ] [ "std" ] [ "syntax" ] - [ "unicode" ] - [ "unicode-age" ] - [ "unicode-bool" ] [ "unicode-case" ] - [ "unicode-gencat" ] [ "unicode-perl" ] - [ "unicode-script" ] - [ "unicode-segment" ] [ "unicode-word-boundary" ] ]; dependencies = { @@ -3908,16 +3992,9 @@ in registry = "registry+https://github.com/rust-lang/crates.io-index"; src = fetchCratesIo { inherit name version; sha256 = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"; }; features = builtins.concatLists [ - [ "default" ] [ "std" ] - [ "unicode" ] - [ "unicode-age" ] - [ "unicode-bool" ] [ "unicode-case" ] - [ "unicode-gencat" ] [ "unicode-perl" ] - [ "unicode-script" ] - [ "unicode-segment" ] ]; }); @@ -4175,6 +4252,20 @@ in }; }); + "registry+https://github.com/rust-lang/crates.io-index".rustls-native-certs."0.7.0" = overridableMkRustCrate (profileName: rec { + name = "rustls-native-certs"; + version = "0.7.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792"; }; + dependencies = { + ${ if hostPlatform.isUnix && !(hostPlatform.parsed.kernel.name == "darwin") then "openssl_probe" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".openssl-probe."0.1.5" { inherit profileName; }).out; + rustls_pemfile = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pemfile."2.0.0" { inherit profileName; }).out; + pki_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pki-types."1.1.0" { inherit profileName; }).out; + ${ if hostPlatform.isWindows then "schannel" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".schannel."0.1.23" { inherit profileName; }).out; + ${ if hostPlatform.parsed.kernel.name == "darwin" then "security_framework" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".security-framework."2.9.2" { inherit profileName; }).out; + }; + }); + "registry+https://github.com/rust-lang/crates.io-index".rustls-pemfile."1.0.4" = overridableMkRustCrate (profileName: rec { name = "rustls-pemfile"; version = "1.0.4"; @@ -4368,6 +4459,7 @@ in [ "alloc" ] [ "default" ] [ "derive" ] + [ "rc" ] [ "serde_derive" ] [ "std" ] ]; @@ -4512,6 +4604,10 @@ in version = "1.13.1"; registry = "registry+https://github.com/rust-lang/crates.io-index"; src = fetchCratesIo { inherit name version; sha256 = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"; }; + features = builtins.concatLists [ + [ "const_generics" ] + [ "const_new" ] + ]; }); "registry+https://github.com/rust-lang/crates.io-index".smol."1.3.0" = overridableMkRustCrate (profileName: rec { @@ -5110,12 +5206,14 @@ in [ "__common" ] [ "balance" ] [ "buffer" ] + [ "default" ] [ "discover" ] [ "futures-core" ] [ "futures-util" ] [ "indexmap" ] [ "limit" ] [ "load" ] + [ "log" ] [ "make" ] [ "pin-project" ] [ "pin-project-lite" ] @@ -5166,10 +5264,12 @@ in features = builtins.concatLists [ [ "attributes" ] [ "default" ] + [ "log" ] [ "std" ] [ "tracing-attributes" ] ]; dependencies = { + log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out; pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out; tracing_attributes = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-attributes."0.1.27" { profileName = "__noProfile"; }).out; tracing_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-core."0.1.32" { inherit profileName; }).out; From 0b122582e8374b9de43c8f096534301e18105f0c Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Fri, 23 Feb 2024 18:28:04 +0100 Subject: [PATCH 15/16] fix code formatting --- src/storage/garage.rs | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/storage/garage.rs b/src/storage/garage.rs index a23bbb2..7152764 100644 --- a/src/storage/garage.rs +++ b/src/storage/garage.rs @@ -2,8 +2,8 @@ use aws_sdk_s3::{self as s3, error::SdkError, operation::get_object::GetObjectEr use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; use aws_smithy_runtime_api::client::http::SharedHttpClient; use hyper_rustls::HttpsConnector; -use hyper_util::rt::TokioExecutor; use hyper_util::client::legacy::{connect::HttpConnector, Client as HttpClient}; +use hyper_util::rt::TokioExecutor; use serde::Serialize; use crate::storage::*; @@ -15,13 +15,13 @@ pub struct GarageRoot { impl GarageRoot { pub fn new() -> anyhow::Result { - let connector = hyper_rustls::HttpsConnectorBuilder::new() - .with_native_roots()? - .https_or_http() - .enable_http1() - .enable_http2() - .build(); - let k2v_http = HttpClient::builder(TokioExecutor::new()).build(connector); + let connector = hyper_rustls::HttpsConnectorBuilder::new() + .with_native_roots()? + .https_or_http() + .enable_http1() + .enable_http2() + .build(); + let k2v_http = HttpClient::builder(TokioExecutor::new()).build(connector); let aws_http = HyperClientBuilder::new().build_https(); Ok(Self { k2v_http, aws_http }) } @@ -31,11 +31,11 @@ impl GarageRoot { unicity.extend_from_slice(file!().as_bytes()); unicity.append(&mut rmp_serde::to_vec(&conf)?); - Ok(Arc::new(GarageUser { - conf, - aws_http: self.aws_http.clone(), + Ok(Arc::new(GarageUser { + conf, + aws_http: self.aws_http.clone(), k2v_http: self.k2v_http.clone(), - unicity + unicity, })) } } @@ -95,13 +95,14 @@ impl IBuilder for GarageUser { user_agent: None, }; - let k2v_client = match k2v_client::K2vClient::new_with_client(k2v_config, self.k2v_http.clone()) { - Err(e) => { - tracing::error!("unable to build k2v client: {}", e); - return Err(StorageError::Internal); - } - Ok(v) => v, - }; + let k2v_client = + match k2v_client::K2vClient::new_with_client(k2v_config, self.k2v_http.clone()) { + Err(e) => { + tracing::error!("unable to build k2v client: {}", e); + return Err(StorageError::Internal); + } + Ok(v) => v, + }; Ok(Box::new(GarageStore { bucket: self.conf.bucket.clone(), From 1ea3de30995b434c4e59123c1ab634d89a0274b5 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Fri, 23 Feb 2024 18:32:09 +0100 Subject: [PATCH 16/16] bumping to 0.2.2 --- Cargo.lock | 2 +- Cargo.nix | 8 ++++---- Cargo.toml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 90296a3..a50d101 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -28,7 +28,7 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aerogramme" -version = "0.2.1" +version = "0.2.2" dependencies = [ "anyhow", "argon2", diff --git a/Cargo.nix b/Cargo.nix index cbb8354..7c184ab 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -23,7 +23,7 @@ args@{ ignoreLockHash, }: let - nixifiedLockHash = "94ca89fbaba4455fedcad9404b2f26e06837c2e23d491d5cb3e0bcbdf6132d05"; + nixifiedLockHash = "1636bcbca38619e40eeddcb9e9c0af1240654ca176fe1a6fb3444b21526b53c2"; workspaceSrc = if args.workspaceSrc == null then ./. else args.workspaceSrc; currentLockHash = builtins.hashFile "sha256" (workspaceSrc + /Cargo.lock); lockHashIgnored = if ignoreLockHash @@ -45,7 +45,7 @@ in { cargo2nixVersion = "0.11.0"; workspace = { - aerogramme = rustPackages.unknown.aerogramme."0.2.1"; + aerogramme = rustPackages.unknown.aerogramme."0.2.2"; }; "registry+https://github.com/rust-lang/crates.io-index".abnf-core."0.6.0" = overridableMkRustCrate (profileName: rec { name = "abnf-core"; @@ -74,9 +74,9 @@ in src = fetchCratesIo { inherit name version; sha256 = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"; }; }); - "unknown".aerogramme."0.2.1" = overridableMkRustCrate (profileName: rec { + "unknown".aerogramme."0.2.2" = overridableMkRustCrate (profileName: rec { name = "aerogramme"; - version = "0.2.1"; + version = "0.2.2"; registry = "unknown"; src = fetchCrateLocal workspaceSrc; dependencies = { diff --git a/Cargo.toml b/Cargo.toml index 4c10fcc..7d2e032 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aerogramme" -version = "0.2.1" +version = "0.2.2" authors = ["Alex Auvolat ", "Quentin Dufour "] edition = "2021" license = "EUPL-1.2"