From af23099e356d969c99fe7663ca21ba80e2dbda16 Mon Sep 17 00:00:00 2001 From: Maurus Decimus <11444311+mdecimus@users.noreply.github.com> Date: Sun, 19 Apr 2026 08:11:56 +0200 Subject: [PATCH] Box large futures --- crates/common/src/lib.rs | 2 +- crates/common/src/manager/application.rs | 85 ++-- crates/common/src/manager/boot.rs | 5 +- crates/coordinator/src/lib.rs | 2 + .../resources/requests/mkcol-002.json | 8 +- .../requests/propertyupdate-001.json | 8 +- crates/dav-proto/src/schema/property.rs | 2 +- crates/dav/src/common/propfind.rs | 4 +- crates/dav/src/lib.rs | 2 +- crates/directory/src/lib.rs | 2 +- crates/email/src/lib.rs | 2 + crates/groupware/src/lib.rs | 2 + crates/http-proto/src/lib.rs | 2 + crates/http/src/api/diagnose.rs | 4 +- crates/http/src/api/mod.rs | 4 +- crates/http/src/auth/authenticate.rs | 13 +- crates/http/src/auth/oauth/registration.rs | 2 +- crates/http/src/lib.rs | 2 + crates/imap/src/core/client.rs | 6 +- crates/imap/src/lib.rs | 2 + crates/imap/src/op/authenticate.rs | 2 +- crates/imap/src/op/login.rs | 4 +- crates/jmap-proto/src/references/mod.rs | 4 +- crates/jmap-proto/src/request/mod.rs | 148 +++--- crates/jmap-proto/src/response/mod.rs | 112 ++--- crates/jmap/src/api/request.rs | 129 +++-- crates/jmap/src/calendar_event/copy.rs | 18 +- crates/jmap/src/changes/get.rs | 8 +- crates/jmap/src/changes/query.rs | 16 +- crates/jmap/src/contact/copy.rs | 4 +- crates/jmap/src/email/copy.rs | 4 +- crates/jmap/src/lib.rs | 2 +- crates/jmap/src/submission/set.rs | 4 +- crates/jmap/src/websocket/stream.rs | 1 - crates/main/src/main.rs | 2 +- crates/managesieve/src/core/client.rs | 2 +- crates/managesieve/src/lib.rs | 2 + crates/migration/src/lib.rs | 2 + crates/pop3/src/client.rs | 13 +- crates/pop3/src/lib.rs | 2 + crates/pop3/src/op/authenticate.rs | 2 +- crates/registry/src/lib.rs | 2 + crates/services/src/lib.rs | 2 + crates/services/src/task_manager/manager.rs | 2 +- crates/services/src/task_manager/scheduler.rs | 7 +- .../src/task_manager/spam_classifier.rs | 16 +- crates/smtp/src/lib.rs | 2 +- crates/smtp/src/outbound/client.rs | 6 +- crates/smtp/src/outbound/delivery.rs | 1 - crates/smtp/src/outbound/error.rs | 10 +- crates/smtp/src/outbound/session.rs | 4 +- crates/smtp/src/reporting/analysis.rs | 59 ++- crates/spam-filter/src/lib.rs | 2 + crates/store/src/lib.rs | 2 + crates/trc/src/lib.rs | 2 + crates/utils/src/lib.rs | 2 + resources/docker/Dockerfile.fdb | 2 +- resources/docker/entrypoint.sh | 7 +- resources/schema/schema.json.gz | Bin 138692 -> 138694 bytes resources/schema/schema.json.sha256 | 2 +- tests/resources/acme/Docker.pebble | 28 -- tests/resources/acme/config.toml | 58 --- .../resources/acme/docker-compose-pebble.yaml | 33 -- tests/resources/acme/test_acme.sh | 9 - .../resources/scripts/create_test_cluster.sh | 53 --- tests/resources/scripts/create_test_env.sh | 15 - tests/src/cluster/broadcast.rs | 341 +++++++------- tests/src/imap/mod.rs | 445 +++++++++--------- tests/src/jmap/mod.rs | 351 +++++++------- tests/src/smtp/inbound/rewrite.rs | 215 ++++----- tests/src/system/mod.rs | 107 ++--- tests/src/webdav/mod.rs | 311 ++++++------ 72 files changed, 1267 insertions(+), 1469 deletions(-) delete mode 100644 tests/resources/acme/Docker.pebble delete mode 100644 tests/resources/acme/config.toml delete mode 100644 tests/resources/acme/docker-compose-pebble.yaml delete mode 100644 tests/resources/acme/test_acme.sh delete mode 100644 tests/resources/scripts/create_test_cluster.sh delete mode 100644 tests/resources/scripts/create_test_env.sh diff --git a/crates/common/src/lib.rs b/crates/common/src/lib.rs index 9e880859..b4971a69 100644 --- a/crates/common/src/lib.rs +++ b/crates/common/src/lib.rs @@ -4,7 +4,7 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ -#![warn(clippy::large_futures)] +#![deny(clippy::large_futures)] use crate::auth::{AccessTokenInner, EmailAddress}; use crate::manager::application::WebApplications; diff --git a/crates/common/src/manager/application.rs b/crates/common/src/manager/application.rs index 28d45604..d369cc7d 100644 --- a/crates/common/src/manager/application.rs +++ b/crates/common/src/manager/application.rs @@ -245,17 +245,18 @@ impl WebApplicationManager { resource }; - // Uncompress - let mut bundle = zip::ZipArchive::new(Cursor::new(bundle)).map_err(|err| { - trc::ResourceEvent::Error - .caused_by(trc::location!()) - .reason(err) - .ctx(Key::Url, self.url.clone()) - .details("Failed to decompress application bundle") - })?; - let mut routes = AHashMap::new(); - for i in 0..bundle.len() { - let (file_name, contents) = { + let url = self.url.clone(); + let bundle_path = self.bundle_path.path.clone(); + let routes = tokio::task::spawn_blocking(move || -> trc::Result<_> { + let mut bundle = zip::ZipArchive::new(Cursor::new(bundle)).map_err(|err| { + trc::ResourceEvent::Error + .caused_by(trc::location!()) + .reason(err) + .ctx(Key::Url, url.clone()) + .details("Failed to decompress application bundle") + })?; + let mut routes = AHashMap::new(); + for i in 0..bundle.len() { let mut file = bundle.by_index(i).map_err(|err| { trc::ResourceEvent::Error .caused_by(trc::location!()) @@ -268,35 +269,43 @@ impl WebApplicationManager { let mut contents = Vec::new(); file.read_to_end(&mut contents).map_err(unpack_error)?; - (file.name().to_string(), contents) - }; - let path = self.bundle_path.path.join(format!("{i:02}")); - tokio::fs::write(&path, contents) - .await - .map_err(unpack_error)?; + let file_name = file.name().to_string(); + drop(file); - let resource = Resource { - content_type: match file_name - .rsplit_once('.') - .map(|(_, ext)| ext) - .unwrap_or_default() - { - "html" => "text/html", - "css" => "text/css", - "wasm" => "application/wasm", - "js" => "application/javascript", - "json" => "application/json", - "png" => "image/png", - "svg" => "image/svg+xml", - "ico" => "image/x-icon", - _ => "application/octet-stream", - } - .into(), - contents: path, - }; + let path = bundle_path.join(format!("{i:02}")); + std::fs::write(&path, contents).map_err(unpack_error)?; - routes.insert(file_name, resource); - } + let resource = Resource { + content_type: match file_name + .rsplit_once('.') + .map(|(_, ext)| ext) + .unwrap_or_default() + { + "html" => "text/html", + "css" => "text/css", + "wasm" => "application/wasm", + "js" => "application/javascript", + "json" => "application/json", + "png" => "image/png", + "svg" => "image/svg+xml", + "ico" => "image/x-icon", + _ => "application/octet-stream", + } + .into(), + contents: path, + }; + + routes.insert(file_name, resource); + } + Ok(routes) + }) + .await + .map_err(|err| { + trc::ResourceEvent::Error + .caused_by(trc::location!()) + .reason(err) + .details("Bundle unpack task panicked") + })??; trc::event!( Resource(trc::ResourceEvent::ApplicationUnpacked), diff --git a/crates/common/src/manager/boot.rs b/crates/common/src/manager/boot.rs index a21b48f4..b4e125ab 100644 --- a/crates/common/src/manager/boot.rs +++ b/crates/common/src/manager/boot.rs @@ -153,7 +153,8 @@ impl BootManager { match import_export { StoreOp::None => { // Parse components - let core = Box::pin(Core::parse(&mut bootstrap, storage)).await; + let core: Box = + Box::new(Box::pin(Core::parse(&mut bootstrap, storage)).await); let data = Data::parse(&mut bootstrap).await; let cache = Caches::parse(&mut bootstrap).await; @@ -211,7 +212,7 @@ impl BootManager { ); let (ipc, ipc_rxs) = build_ipc(!core.storage.coordinator.is_none()); let inner = Arc::new(Inner { - shared_core: ArcSwap::from_pointee(core), + shared_core: ArcSwap::new(Arc::from(core)), data, ipc, cache, diff --git a/crates/coordinator/src/lib.rs b/crates/coordinator/src/lib.rs index 5a3cbf1f..9d9a5115 100644 --- a/crates/coordinator/src/lib.rs +++ b/crates/coordinator/src/lib.rs @@ -4,6 +4,8 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ +#![deny(clippy::large_futures)] + #[allow(unused_imports)] use std::sync::Arc; diff --git a/crates/dav-proto/resources/requests/mkcol-002.json b/crates/dav-proto/resources/requests/mkcol-002.json index 05e212a0..e98a7dc6 100644 --- a/crates/dav-proto/resources/requests/mkcol-002.json +++ b/crates/dav-proto/resources/requests/mkcol-002.json @@ -175,7 +175,9 @@ 10 ], "bysetpos": [], - "wkst": null + "wkst": null, + "rscale": null, + "skip": null } } ] @@ -293,7 +295,9 @@ 4 ], "bysetpos": [], - "wkst": null + "wkst": null, + "rscale": null, + "skip": null } } ] diff --git a/crates/dav-proto/resources/requests/propertyupdate-001.json b/crates/dav-proto/resources/requests/propertyupdate-001.json index 7d6b32a2..d16de765 100644 --- a/crates/dav-proto/resources/requests/propertyupdate-001.json +++ b/crates/dav-proto/resources/requests/propertyupdate-001.json @@ -175,7 +175,9 @@ 10 ], "bysetpos": [], - "wkst": null + "wkst": null, + "rscale": null, + "skip": null } } ] @@ -293,7 +295,9 @@ 4 ], "bysetpos": [], - "wkst": null + "wkst": null, + "rscale": null, + "skip": null } } ] diff --git a/crates/dav-proto/src/schema/property.rs b/crates/dav-proto/src/schema/property.rs index 38d69238..9709923c 100644 --- a/crates/dav-proto/src/schema/property.rs +++ b/crates/dav-proto/src/schema/property.rs @@ -165,7 +165,7 @@ pub enum DavValue { Href(List), Acl(List), AclRestrictions(AclRestrictions), - Response(Response), + Response(Box), DeadProperty(DeadProperty), SupportedAddressData, SupportedCalendarData, diff --git a/crates/dav/src/common/propfind.rs b/crates/dav/src/common/propfind.rs index 3a66803b..009cad40 100644 --- a/crates/dav/src/common/propfind.rs +++ b/crates/dav/src/common/propfind.rs @@ -625,7 +625,7 @@ impl PropFindRequestHandler for Server { &query.propfind, ) .await? - .map(DavValue::Response) + .map(|r| DavValue::Response(Box::new(r))) .unwrap_or(DavValue::Null), )); } @@ -675,7 +675,7 @@ impl PropFindRequestHandler for Server { &query.propfind, ) .await? - .map(DavValue::Response) + .map(|r| DavValue::Response(Box::new(r))) .unwrap_or(DavValue::Null), )); } diff --git a/crates/dav/src/lib.rs b/crates/dav/src/lib.rs index 61b105d5..3adfc0ab 100644 --- a/crates/dav/src/lib.rs +++ b/crates/dav/src/lib.rs @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ -#![warn(clippy::large_futures)] +#![deny(clippy::large_futures)] pub mod calendar; pub mod card; diff --git a/crates/directory/src/lib.rs b/crates/directory/src/lib.rs index 619dbecf..1e4450c9 100644 --- a/crates/directory/src/lib.rs +++ b/crates/directory/src/lib.rs @@ -4,7 +4,7 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ -#![warn(clippy::large_futures)] +#![deny(clippy::large_futures)] use crate::backend::oidc::OpenIdDirectory; use backend::{ldap::LdapDirectory, sql::SqlDirectory}; diff --git a/crates/email/src/lib.rs b/crates/email/src/lib.rs index 4112d120..42da9acb 100644 --- a/crates/email/src/lib.rs +++ b/crates/email/src/lib.rs @@ -4,6 +4,8 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ +#![deny(clippy::large_futures)] + pub mod cache; pub mod identity; pub mod mailbox; diff --git a/crates/groupware/src/lib.rs b/crates/groupware/src/lib.rs index dcf75439..0001a113 100644 --- a/crates/groupware/src/lib.rs +++ b/crates/groupware/src/lib.rs @@ -4,6 +4,8 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ +#![deny(clippy::large_futures)] + use calcard::common::timezone::Tz; use common::DavResources; use percent_encoding::{AsciiSet, CONTROLS}; diff --git a/crates/http-proto/src/lib.rs b/crates/http-proto/src/lib.rs index 19062a4a..f4fffffb 100644 --- a/crates/http-proto/src/lib.rs +++ b/crates/http-proto/src/lib.rs @@ -4,6 +4,8 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ +#![deny(clippy::large_futures)] + pub mod context; pub mod request; pub mod response; diff --git a/crates/http/src/api/diagnose.rs b/crates/http/src/api/diagnose.rs index 5c6f3109..ee6bac87 100644 --- a/crates/http/src/api/diagnose.rs +++ b/crates/http/src/api/diagnose.rs @@ -649,7 +649,7 @@ async fn delivery_diagnose( if r.is_positive_completion() { Ok(r) } else { - Err(ClientError::UnexpectedReply(r)) + Err(ClientError::UnexpectedReply(Box::new(r))) } }) { Ok(_) => { @@ -669,7 +669,7 @@ async fn delivery_diagnose( if r.is_positive_completion() { Ok(r) } else { - Err(ClientError::UnexpectedReply(r)) + Err(ClientError::UnexpectedReply(Box::new(r))) } }) { Ok(_) => { diff --git a/crates/http/src/api/mod.rs b/crates/http/src/api/mod.rs index 9cfc4369..6fdcec55 100644 --- a/crates/http/src/api/mod.rs +++ b/crates/http/src/api/mod.rs @@ -71,10 +71,10 @@ impl ManagementApi for Server { "auth" if is_post => { self.is_http_anonymous_request_allowed(session.remote_ip) .await?; - self.handle_login_request( + Box::pin(self.handle_login_request( session, body.ok_or_else(|| trc::LimitEvent::SizeRequest.into_err())?, - ) + )) .await } "discover" => { diff --git a/crates/http/src/auth/authenticate.rs b/crates/http/src/auth/authenticate.rs index 5d9f2714..085c6495 100644 --- a/crates/http/src/auth/authenticate.rs +++ b/crates/http/src/auth/authenticate.rs @@ -82,13 +82,12 @@ impl Authenticator for Server { }; // Authenticate - let access_token = self - .authenticate(&AuthRequest::from_credentials( - credentials, - session.session_id, - session.remote_ip, - )) - .await?; + let access_token = Box::pin(self.authenticate(&AuthRequest::from_credentials( + credentials, + session.session_id, + session.remote_ip, + ))) + .await?; // Cache credentials self.inner.cache.http_auth.insert( diff --git a/crates/http/src/auth/oauth/registration.rs b/crates/http/src/auth/oauth/registration.rs index 9a64a83b..9e8a982b 100644 --- a/crates/http/src/auth/oauth/registration.rs +++ b/crates/http/src/auth/oauth/registration.rs @@ -49,7 +49,7 @@ impl ClientRegistrationHandler for Server { ) -> trc::Result { let tenant_id = if !self.core.oauth.allow_anonymous_client_registration { // Authenticate request - let (_, access_token) = self.authenticate_headers(req, &session).await?; + let (_, access_token) = Box::pin(self.authenticate_headers(req, &session)).await?; // Validate permissions access_token.enforce_permission(Permission::OAuthClientRegistration)?; diff --git a/crates/http/src/lib.rs b/crates/http/src/lib.rs index c76d33c4..10f30703 100644 --- a/crates/http/src/lib.rs +++ b/crates/http/src/lib.rs @@ -4,6 +4,8 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ +#![deny(clippy::large_futures)] + pub mod api; pub mod auth; pub mod form; diff --git a/crates/imap/src/core/client.rs b/crates/imap/src/core/client.rs index 00284f85..62fabd1b 100644 --- a/crates/imap/src/core/client.rs +++ b/crates/imap/src/core/client.rs @@ -175,12 +175,10 @@ impl Session { .handle_namespace(request) .await .map(|_| SessionResult::Continue), - Command::Authenticate => self - .handle_authenticate(request) + Command::Authenticate => Box::pin(self.handle_authenticate(request)) .await .map(|_| SessionResult::Continue), - Command::Login => self - .handle_login(request) + Command::Login => Box::pin(self.handle_login(request)) .await .map(|_| SessionResult::Continue), Command::Capability => self diff --git a/crates/imap/src/lib.rs b/crates/imap/src/lib.rs index 6b17b786..4a56ead0 100644 --- a/crates/imap/src/lib.rs +++ b/crates/imap/src/lib.rs @@ -4,6 +4,8 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ +#![deny(clippy::large_futures)] + use std::sync::LazyLock; use imap_proto::{ResponseCode, StatusResponse, protocol::capability::Capability}; diff --git a/crates/imap/src/op/authenticate.rs b/crates/imap/src/op/authenticate.rs index 3289c55f..57cd2c77 100644 --- a/crates/imap/src/op/authenticate.rs +++ b/crates/imap/src/op/authenticate.rs @@ -47,7 +47,7 @@ impl Session { .id(args.tag.clone()) })?; - self.authenticate(credentials, args.tag).await + Box::pin(self.authenticate(credentials, args.tag)).await } else { self.receiver.request = receiver::Request { tag: args.tag, diff --git a/crates/imap/src/op/login.rs b/crates/imap/src/op/login.rs index f3dec4ae..d5e52146 100644 --- a/crates/imap/src/op/login.rs +++ b/crates/imap/src/op/login.rs @@ -13,14 +13,14 @@ impl Session { pub async fn handle_login(&mut self, request: Request) -> trc::Result<()> { let arguments = request.parse_login()?; - self.authenticate( + Box::pin(self.authenticate( Credentials::Basic { username: arguments.username.to_string(), secret: arguments.password.to_string(), mfa_token: None, }, arguments.tag, - ) + )) .await } } diff --git a/crates/jmap-proto/src/references/mod.rs b/crates/jmap-proto/src/references/mod.rs index 39f8a98e..62ecb78b 100644 --- a/crates/jmap-proto/src/references/mod.rs +++ b/crates/jmap-proto/src/references/mod.rs @@ -310,7 +310,7 @@ mod tests { id: call.id, name: call.name, method: ResponseMethod::Changes(ChangesResponseMethod::Mailbox( - ChangesResponse { + Box::new(ChangesResponse { account_id: Id::new(1), old_state: Default::default(), new_state: Default::default(), @@ -322,7 +322,7 @@ mod tests { MailboxProperty::Name.into(), MailboxProperty::ParentId.into(), ]), - }, + }), )), }); } diff --git a/crates/jmap-proto/src/request/mod.rs b/crates/jmap-proto/src/request/mod.rs index 22c246cd..f894e3dd 100644 --- a/crates/jmap-proto/src/request/mod.rs +++ b/crates/jmap-proto/src/request/mod.rs @@ -61,110 +61,110 @@ pub struct Call { pub enum RequestMethod<'x> { Get(GetRequestMethod), Set(SetRequestMethod<'x>), - Changes(ChangesRequest), + Changes(Box), Copy(CopyRequestMethod<'x>), - ImportEmail(ImportEmailRequest), + ImportEmail(Box), Parse(ParseRequestMethod), Query(QueryRequestMethod), QueryChanges(QueryChangesRequestMethod), - SearchSnippet(GetSearchSnippetRequest), - ValidateScript(ValidateSieveScriptRequest), - LookupBlob(BlobLookupRequest), - UploadBlob(BlobUploadRequest), + SearchSnippet(Box), + ValidateScript(Box), + LookupBlob(Box), + UploadBlob(Box), Echo(Value<'x, Null, Null>), Error(trc::Error), } #[derive(Debug)] pub enum GetRequestMethod { - Email(GetRequest), - Mailbox(GetRequest), - Thread(GetRequest), - Identity(GetRequest), - EmailSubmission(GetRequest), - PushSubscription(GetRequest), - Sieve(GetRequest), - VacationResponse(GetRequest), - Principal(GetRequest), - PrincipalAvailability(GetAvailabilityRequest), - Quota(GetRequest), - Blob(GetRequest), - AddressBook(GetRequest), - ContactCard(GetRequest), - FileNode(GetRequest), - Calendar(GetRequest), - CalendarEvent(GetRequest), - CalendarEventNotification(GetRequest), - ParticipantIdentity(GetRequest), - ShareNotification(GetRequest), - Registry(GetRequest), + Email(Box>), + Mailbox(Box>), + Thread(Box>), + Identity(Box>), + EmailSubmission(Box>), + PushSubscription(Box>), + Sieve(Box>), + VacationResponse(Box>), + Principal(Box>), + PrincipalAvailability(Box), + Quota(Box>), + Blob(Box>), + AddressBook(Box>), + ContactCard(Box>), + FileNode(Box>), + Calendar(Box>), + CalendarEvent(Box>), + CalendarEventNotification(Box>), + ParticipantIdentity(Box>), + ShareNotification(Box>), + Registry(Box>), } #[derive(Debug)] pub enum SetRequestMethod<'x> { - Email(SetRequest<'x, Email>), - Mailbox(SetRequest<'x, Mailbox>), - Identity(SetRequest<'x, Identity>), - EmailSubmission(SetRequest<'x, EmailSubmission>), - PushSubscription(SetRequest<'x, PushSubscription>), - Sieve(SetRequest<'x, Sieve>), - VacationResponse(SetRequest<'x, VacationResponse>), - AddressBook(SetRequest<'x, AddressBook>), - ContactCard(SetRequest<'x, ContactCard>), - FileNode(SetRequest<'x, FileNode>), - ShareNotification(SetRequest<'x, ShareNotification>), - Calendar(SetRequest<'x, Calendar>), - CalendarEvent(SetRequest<'x, CalendarEvent>), - CalendarEventNotification(SetRequest<'x, CalendarEventNotification>), - ParticipantIdentity(SetRequest<'x, ParticipantIdentity>), - Registry(SetRequest<'x, Registry>), + Email(Box>), + Mailbox(Box>), + Identity(Box>), + EmailSubmission(Box>), + PushSubscription(Box>), + Sieve(Box>), + VacationResponse(Box>), + AddressBook(Box>), + ContactCard(Box>), + FileNode(Box>), + ShareNotification(Box>), + Calendar(Box>), + CalendarEvent(Box>), + CalendarEventNotification(Box>), + ParticipantIdentity(Box>), + Registry(Box>), } #[derive(Debug)] pub enum CopyRequestMethod<'x> { - Email(CopyRequest<'x, Email>), - ContactCard(CopyRequest<'x, ContactCard>), - CalendarEvent(CopyRequest<'x, CalendarEvent>), - Blob(CopyBlobRequest), + Email(Box>), + ContactCard(Box>), + CalendarEvent(Box>), + Blob(Box), } #[derive(Debug)] pub enum QueryRequestMethod { - Email(QueryRequest), - Mailbox(QueryRequest), - EmailSubmission(QueryRequest), - Sieve(QueryRequest), - Principal(QueryRequest), - Quota(QueryRequest), - AddressBook(QueryRequest), - ContactCard(QueryRequest), - FileNode(QueryRequest), - Calendar(QueryRequest), - CalendarEvent(QueryRequest), - CalendarEventNotification(QueryRequest), - ShareNotification(QueryRequest), - Registry(QueryRequest), + Email(Box>), + Mailbox(Box>), + EmailSubmission(Box>), + Sieve(Box>), + Principal(Box>), + Quota(Box>), + AddressBook(Box>), + ContactCard(Box>), + FileNode(Box>), + Calendar(Box>), + CalendarEvent(Box>), + CalendarEventNotification(Box>), + ShareNotification(Box>), + Registry(Box>), } #[derive(Debug)] pub enum QueryChangesRequestMethod { - Email(QueryChangesRequest), - Mailbox(QueryChangesRequest), - EmailSubmission(QueryChangesRequest), - Principal(QueryChangesRequest), - Quota(QueryChangesRequest), - ContactCard(QueryChangesRequest), - FileNode(QueryChangesRequest), - CalendarEvent(QueryChangesRequest), - CalendarEventNotification(QueryChangesRequest), - ShareNotification(QueryChangesRequest), + Email(Box>), + Mailbox(Box>), + EmailSubmission(Box>), + Principal(Box>), + Quota(Box>), + ContactCard(Box>), + FileNode(Box>), + CalendarEvent(Box>), + CalendarEventNotification(Box>), + ShareNotification(Box>), } #[derive(Debug)] pub enum ParseRequestMethod { - Email(ParseRequest), - ContactCard(ParseRequest), - CalendarEvent(ParseRequest), + Email(Box>), + ContactCard(Box>), + CalendarEvent(Box>), } #[derive(Debug, Clone, PartialEq, Eq)] diff --git a/crates/jmap-proto/src/response/mod.rs b/crates/jmap-proto/src/response/mod.rs index c0c85ce2..a8b87636 100644 --- a/crates/jmap-proto/src/response/mod.rs +++ b/crates/jmap-proto/src/response/mod.rs @@ -103,40 +103,40 @@ pub enum GetResponseMethod { #[derive(Debug, serde::Serialize)] #[serde(untagged)] pub enum SetResponseMethod { - Email(SetResponse), - Mailbox(SetResponse), - Identity(SetResponse), - EmailSubmission(SetResponse), - PushSubscription(SetResponse), - Sieve(SetResponse), - VacationResponse(SetResponse), - AddressBook(SetResponse), - ContactCard(SetResponse), - FileNode(SetResponse), - ShareNotification(SetResponse), - Calendar(SetResponse), - CalendarEvent(SetResponse), - CalendarEventNotification(SetResponse), - ParticipantIdentity(SetResponse), - Registry(SetResponse), + Email(Box>), + Mailbox(Box>), + Identity(Box>), + EmailSubmission(Box>), + PushSubscription(Box>), + Sieve(Box>), + VacationResponse(Box>), + AddressBook(Box>), + ContactCard(Box>), + FileNode(Box>), + ShareNotification(Box>), + Calendar(Box>), + CalendarEvent(Box>), + CalendarEventNotification(Box>), + ParticipantIdentity(Box>), + Registry(Box>), } #[derive(Debug, serde::Serialize)] #[serde(untagged)] pub enum ChangesResponseMethod { - Email(ChangesResponse), - Mailbox(ChangesResponse), - Thread(ChangesResponse), - Identity(ChangesResponse), - EmailSubmission(ChangesResponse), - Quota(ChangesResponse), - AddressBook(ChangesResponse), - ContactCard(ChangesResponse), - FileNode(ChangesResponse), - Calendar(ChangesResponse), - CalendarEvent(ChangesResponse), - CalendarEventNotification(ChangesResponse), - ShareNotification(ChangesResponse), + Email(Box>), + Mailbox(Box>), + Thread(Box>), + Identity(Box>), + EmailSubmission(Box>), + Quota(Box>), + AddressBook(Box>), + ContactCard(Box>), + FileNode(Box>), + Calendar(Box>), + CalendarEvent(Box>), + CalendarEventNotification(Box>), + ShareNotification(Box>), } #[derive(Debug, serde::Serialize)] @@ -306,103 +306,103 @@ impl<'x> From> for ResponseMethod<'x> { impl<'x> From> for ResponseMethod<'x> { fn from(value: SetResponse) -> Self { - ResponseMethod::Set(SetResponseMethod::Email(value)) + ResponseMethod::Set(SetResponseMethod::Email(Box::new(value))) } } impl<'x> From> for ResponseMethod<'x> { fn from(value: SetResponse) -> Self { - ResponseMethod::Set(SetResponseMethod::Mailbox(value)) + ResponseMethod::Set(SetResponseMethod::Mailbox(Box::new(value))) } } impl<'x> From> for ResponseMethod<'x> { fn from(value: SetResponse) -> Self { - ResponseMethod::Set(SetResponseMethod::Identity(value)) + ResponseMethod::Set(SetResponseMethod::Identity(Box::new(value))) } } impl<'x> From> for ResponseMethod<'x> { fn from(value: SetResponse) -> Self { - ResponseMethod::Set(SetResponseMethod::EmailSubmission(value)) + ResponseMethod::Set(SetResponseMethod::EmailSubmission(Box::new(value))) } } impl<'x> From> for ResponseMethod<'x> { fn from(value: SetResponse) -> Self { - ResponseMethod::Set(SetResponseMethod::PushSubscription(value)) + ResponseMethod::Set(SetResponseMethod::PushSubscription(Box::new(value))) } } impl<'x> From> for ResponseMethod<'x> { fn from(value: SetResponse) -> Self { - ResponseMethod::Set(SetResponseMethod::Sieve(value)) + ResponseMethod::Set(SetResponseMethod::Sieve(Box::new(value))) } } impl<'x> From> for ResponseMethod<'x> { fn from(value: SetResponse) -> Self { - ResponseMethod::Set(SetResponseMethod::VacationResponse(value)) + ResponseMethod::Set(SetResponseMethod::VacationResponse(Box::new(value))) } } impl<'x> From> for ResponseMethod<'x> { fn from(value: SetResponse) -> Self { - ResponseMethod::Set(SetResponseMethod::AddressBook(value)) + ResponseMethod::Set(SetResponseMethod::AddressBook(Box::new(value))) } } impl<'x> From> for ResponseMethod<'x> { fn from(value: SetResponse) -> Self { - ResponseMethod::Set(SetResponseMethod::ContactCard(value)) + ResponseMethod::Set(SetResponseMethod::ContactCard(Box::new(value))) } } impl<'x> From> for ResponseMethod<'x> { fn from(value: SetResponse) -> Self { - ResponseMethod::Set(SetResponseMethod::Registry(value)) + ResponseMethod::Set(SetResponseMethod::Registry(Box::new(value))) } } impl<'x> From> for ResponseMethod<'x> { fn from(value: ChangesResponse) -> Self { - ResponseMethod::Changes(ChangesResponseMethod::Email(value)) + ResponseMethod::Changes(ChangesResponseMethod::Email(Box::new(value))) } } impl<'x> From> for ResponseMethod<'x> { fn from(value: ChangesResponse) -> Self { - ResponseMethod::Changes(ChangesResponseMethod::Mailbox(value)) + ResponseMethod::Changes(ChangesResponseMethod::Mailbox(Box::new(value))) } } impl<'x> From> for ResponseMethod<'x> { fn from(value: ChangesResponse) -> Self { - ResponseMethod::Changes(ChangesResponseMethod::Thread(value)) + ResponseMethod::Changes(ChangesResponseMethod::Thread(Box::new(value))) } } impl<'x> From> for ResponseMethod<'x> { fn from(value: ChangesResponse) -> Self { - ResponseMethod::Changes(ChangesResponseMethod::Identity(value)) + ResponseMethod::Changes(ChangesResponseMethod::Identity(Box::new(value))) } } impl<'x> From> for ResponseMethod<'x> { fn from(value: ChangesResponse) -> Self { - ResponseMethod::Changes(ChangesResponseMethod::EmailSubmission(value)) + ResponseMethod::Changes(ChangesResponseMethod::EmailSubmission(Box::new(value))) } } impl<'x> From> for ResponseMethod<'x> { fn from(value: ChangesResponse) -> Self { - ResponseMethod::Changes(ChangesResponseMethod::Quota(value)) + ResponseMethod::Changes(ChangesResponseMethod::Quota(Box::new(value))) } } impl<'x> From> for ResponseMethod<'x> { fn from(value: ChangesResponse) -> Self { - ResponseMethod::Changes(ChangesResponseMethod::AddressBook(value)) + ResponseMethod::Changes(ChangesResponseMethod::AddressBook(Box::new(value))) } } @@ -498,13 +498,13 @@ impl From> for ResponseMethod<'_> { impl From> for ResponseMethod<'_> { fn from(response: SetResponse) -> Self { - ResponseMethod::Set(SetResponseMethod::FileNode(response)) + ResponseMethod::Set(SetResponseMethod::FileNode(Box::new(response))) } } impl From> for ResponseMethod<'_> { fn from(response: ChangesResponse) -> Self { - ResponseMethod::Changes(ChangesResponseMethod::FileNode(response)) + ResponseMethod::Changes(ChangesResponseMethod::FileNode(Box::new(response))) } } @@ -522,31 +522,31 @@ impl From> for ResponseMethod<'_> { impl From> for ResponseMethod<'_> { fn from(response: SetResponse) -> Self { - ResponseMethod::Set(SetResponseMethod::Calendar(response)) + ResponseMethod::Set(SetResponseMethod::Calendar(Box::new(response))) } } impl From> for ResponseMethod<'_> { fn from(response: ChangesResponse) -> Self { - ResponseMethod::Changes(ChangesResponseMethod::CalendarEvent(response)) + ResponseMethod::Changes(ChangesResponseMethod::CalendarEvent(Box::new(response))) } } impl From> for ResponseMethod<'_> { fn from(response: ChangesResponse) -> Self { - ResponseMethod::Changes(ChangesResponseMethod::CalendarEventNotification(response)) + ResponseMethod::Changes(ChangesResponseMethod::CalendarEventNotification(Box::new(response))) } } impl From> for ResponseMethod<'_> { fn from(response: SetResponse) -> Self { - ResponseMethod::Set(SetResponseMethod::CalendarEvent(response)) + ResponseMethod::Set(SetResponseMethod::CalendarEvent(Box::new(response))) } } impl From> for ResponseMethod<'_> { fn from(response: SetResponse) -> Self { - ResponseMethod::Set(SetResponseMethod::ParticipantIdentity(response)) + ResponseMethod::Set(SetResponseMethod::ParticipantIdentity(Box::new(response))) } } @@ -558,13 +558,13 @@ impl From> for ResponseMethod<'_> { impl From> for ResponseMethod<'_> { fn from(response: ChangesResponse) -> Self { - ResponseMethod::Changes(ChangesResponseMethod::ShareNotification(response)) + ResponseMethod::Changes(ChangesResponseMethod::ShareNotification(Box::new(response))) } } impl From> for ResponseMethod<'_> { fn from(response: SetResponse) -> Self { - ResponseMethod::Set(SetResponseMethod::ShareNotification(response)) + ResponseMethod::Set(SetResponseMethod::ShareNotification(Box::new(response))) } } @@ -600,6 +600,6 @@ impl From for ResponseMethod<'_> { impl From> for ResponseMethod<'_> { fn from(value: SetResponse) -> Self { - ResponseMethod::Set(SetResponseMethod::CalendarEventNotification(value)) + ResponseMethod::Set(SetResponseMethod::CalendarEventNotification(Box::new(value))) } } diff --git a/crates/jmap/src/api/request.rs b/crates/jmap/src/api/request.rs index a654c53e..5a7cb288 100644 --- a/crates/jmap/src/api/request.rs +++ b/crates/jmap/src/api/request.rs @@ -78,7 +78,6 @@ pub trait RequestHandler: Sync + Send { } impl RequestHandler for Server { - #![allow(clippy::large_futures)] async fn handle_jmap_request<'x>( &self, request: Request<'x>, @@ -236,102 +235,102 @@ impl RequestHandler for Server { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::Email)?; - self.email_get(req, access_token).await?.into() + self.email_get(*req, access_token).await?.into() } GetRequestMethod::Mailbox(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::Mailbox)?; - self.mailbox_get(req, access_token).await?.into() + self.mailbox_get(*req, access_token).await?.into() } GetRequestMethod::Thread(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::Email)?; - self.thread_get(req).await?.into() + self.thread_get(*req).await?.into() } GetRequestMethod::Identity(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.identity_get(req).await?.into() + self.identity_get(*req).await?.into() } GetRequestMethod::EmailSubmission(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.email_submission_get(req).await?.into() + self.email_submission_get(*req).await?.into() } GetRequestMethod::PushSubscription(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); - self.push_subscription_get(req, access_token).await?.into() + self.push_subscription_get(*req, access_token).await?.into() } GetRequestMethod::Sieve(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.sieve_script_get(req).await?.into() + self.sieve_script_get(*req).await?.into() } GetRequestMethod::VacationResponse(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.vacation_response_get(req).await?.into() + self.vacation_response_get(*req).await?.into() } GetRequestMethod::Principal(req) => { - self.principal_get(req, access_token).await?.into() + self.principal_get(*req, access_token).await?.into() } GetRequestMethod::Quota(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.quota_get(req, access_token).await?.into() + self.quota_get(*req, access_token).await?.into() } GetRequestMethod::Blob(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.blob_get(req, access_token).await?.into() + self.blob_get(*req, access_token).await?.into() } GetRequestMethod::AddressBook(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::AddressBook)?; - self.address_book_get(req, access_token).await?.into() + self.address_book_get(*req, access_token).await?.into() } GetRequestMethod::ContactCard(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::ContactCard)?; - self.contact_card_get(req, access_token).await?.into() + self.contact_card_get(*req, access_token).await?.into() } GetRequestMethod::FileNode(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::FileNode)?; - self.file_node_get(req, access_token).await?.into() + self.file_node_get(*req, access_token).await?.into() } GetRequestMethod::PrincipalAvailability(req) => self - .principal_get_availability(req, access_token) + .principal_get_availability(*req, access_token) .await? .into(), GetRequestMethod::Calendar(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::Calendar)?; - self.calendar_get(req, access_token).await?.into() + self.calendar_get(*req, access_token).await?.into() } GetRequestMethod::CalendarEvent(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::CalendarEvent)?; - self.calendar_event_get(req, access_token).await?.into() + self.calendar_event_get(*req, access_token).await?.into() } GetRequestMethod::CalendarEventNotification(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.calendar_event_notification_get(req, access_token) + self.calendar_event_notification_get(*req, access_token) .await? .into() } @@ -339,13 +338,13 @@ impl RequestHandler for Server { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.participant_identity_get(req).await?.into() + self.participant_identity_get(*req).await?.into() } GetRequestMethod::ShareNotification(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.share_notification_get(req).await?.into() + self.share_notification_get(*req).await?.into() } GetRequestMethod::Registry(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); @@ -353,7 +352,7 @@ impl RequestHandler for Server { Box::pin(self.registry_get( method_name.obj.unwrap_registry(), - req, + *req, access_token, )) .await? @@ -365,70 +364,70 @@ impl RequestHandler for Server { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::Email)?; - self.email_query(req, access_token).await?.into() + self.email_query(*req, access_token).await?.into() } QueryRequestMethod::Mailbox(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::Mailbox)?; - self.mailbox_query(req, access_token).await?.into() + self.mailbox_query(*req, access_token).await?.into() } QueryRequestMethod::EmailSubmission(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.email_submission_query(req).await?.into() + self.email_submission_query(*req).await?.into() } QueryRequestMethod::Sieve(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.sieve_script_query(req).await?.into() + self.sieve_script_query(*req).await?.into() } QueryRequestMethod::Principal(req) => { - self.principal_query(req, access_token).await?.into() + self.principal_query(*req, access_token).await?.into() } QueryRequestMethod::Quota(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.quota_query(req, access_token).await?.into() + self.quota_query(*req, access_token).await?.into() } QueryRequestMethod::AddressBook(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::AddressBook)?; - self.address_book_query(req, access_token).await?.into() + self.address_book_query(*req, access_token).await?.into() } QueryRequestMethod::ContactCard(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::ContactCard)?; - self.contact_card_query(req, access_token).await?.into() + self.contact_card_query(*req, access_token).await?.into() } QueryRequestMethod::FileNode(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::FileNode)?; - self.file_node_query(req, access_token).await?.into() + self.file_node_query(*req, access_token).await?.into() } QueryRequestMethod::Calendar(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::Calendar)?; - self.calendar_query(req, access_token).await?.into() + self.calendar_query(*req, access_token).await?.into() } QueryRequestMethod::CalendarEvent(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::CalendarEvent)?; - self.calendar_event_query(req, access_token).await?.into() + self.calendar_event_query(*req, access_token).await?.into() } QueryRequestMethod::CalendarEventNotification(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.calendar_event_notification_query(req, access_token) + self.calendar_event_notification_query(*req, access_token) .await? .into() } @@ -436,7 +435,7 @@ impl RequestHandler for Server { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.share_notification_query(req).await?.into() + self.share_notification_query(*req).await?.into() } QueryRequestMethod::Registry(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); @@ -444,7 +443,7 @@ impl RequestHandler for Server { Box::pin(self.registry_query( method_name.obj.unwrap_registry(), - req, + *req, access_token, )) .await? @@ -456,37 +455,37 @@ impl RequestHandler for Server { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::Email)?; - self.email_set(req, access_token, session).await?.into() + self.email_set(*req, access_token, session).await?.into() } SetRequestMethod::Mailbox(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::Mailbox)?; - self.mailbox_set(req, access_token).await?.into() + self.mailbox_set(*req, access_token).await?.into() } SetRequestMethod::Identity(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.identity_set(req).await?.into() + self.identity_set(*req).await?.into() } SetRequestMethod::EmailSubmission(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.email_submission_set(req, &session.instance, next_call) + self.email_submission_set(*req, &session.instance, next_call) .await? .into() } SetRequestMethod::PushSubscription(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); - self.push_subscription_set(req, access_token).await?.into() + self.push_subscription_set(*req, access_token).await?.into() } SetRequestMethod::Sieve(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.sieve_script_set(req, access_token, session) + self.sieve_script_set(*req, access_token, session) .await? .into() } @@ -494,13 +493,13 @@ impl RequestHandler for Server { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.vacation_response_set(req, access_token).await?.into() + self.vacation_response_set(*req, access_token).await?.into() } SetRequestMethod::AddressBook(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::AddressBook)?; - self.address_book_set(req, access_token, session) + self.address_book_set(*req, access_token, session) .await? .into() } @@ -508,7 +507,7 @@ impl RequestHandler for Server { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::ContactCard)?; - self.contact_card_set(req, access_token, session) + self.contact_card_set(*req, access_token, session) .await? .into() } @@ -516,25 +515,25 @@ impl RequestHandler for Server { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::FileNode)?; - self.file_node_set(req, access_token, session).await?.into() + self.file_node_set(*req, access_token, session).await?.into() } SetRequestMethod::ShareNotification(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.share_notification_set(req).await?.into() + self.share_notification_set(*req).await?.into() } SetRequestMethod::Calendar(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::Calendar)?; - self.calendar_set(req, access_token, session).await?.into() + self.calendar_set(*req, access_token, session).await?.into() } SetRequestMethod::CalendarEvent(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::CalendarEvent)?; - self.calendar_event_set(req, access_token, session) + self.calendar_event_set(*req, access_token, session) .await? .into() } @@ -542,7 +541,7 @@ impl RequestHandler for Server { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.calendar_event_notification_set(req, access_token, session) + self.calendar_event_notification_set(*req, access_token, session) .await? .into() } @@ -550,7 +549,7 @@ impl RequestHandler for Server { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.participant_identity_set(req).await?.into() + self.participant_identity_set(*req).await?.into() } SetRequestMethod::Registry(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); @@ -558,7 +557,7 @@ impl RequestHandler for Server { Box::pin(self.registry_set( method_name.obj.unwrap_registry(), - req, + *req, access_token, session, )) @@ -569,7 +568,7 @@ impl RequestHandler for Server { RequestMethod::Changes(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); - self.changes(req, method_name.obj, access_token) + self.changes(*req, method_name.obj, access_token) .await? .into_method_response() } @@ -582,7 +581,7 @@ impl RequestHandler for Server { .assert_has_access(req.account_id, Collection::Email)? .assert_has_access(req.from_account_id, Collection::Email)?; - self.email_copy(req, access_token, next_call, session) + self.email_copy(*req, access_token, next_call, session) .await? .into() } @@ -590,7 +589,7 @@ impl RequestHandler for Server { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.blob_copy(req, access_token).await?.into() + self.blob_copy(*req, access_token).await?.into() } CopyRequestMethod::ContactCard(mut req) => { set_account_id_if_missing(&mut req.from_account_id, access_token); @@ -600,7 +599,7 @@ impl RequestHandler for Server { .assert_has_access(req.account_id, Collection::ContactCard)? .assert_has_access(req.from_account_id, Collection::ContactCard)?; - self.contact_card_copy(req, access_token, next_call, session) + self.contact_card_copy(*req, access_token, next_call, session) .await? .into() } @@ -612,7 +611,7 @@ impl RequestHandler for Server { .assert_has_access(req.account_id, Collection::CalendarEvent)? .assert_has_access(req.from_account_id, Collection::CalendarEvent)?; - self.calendar_event_copy(req, access_token, next_call, session) + self.calendar_event_copy(*req, access_token, next_call, session) .await? .into() } @@ -621,26 +620,26 @@ impl RequestHandler for Server { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::Email)?; - self.email_import(req, access_token, session).await?.into() + self.email_import(*req, access_token, session).await?.into() } RequestMethod::Parse(req) => match req { ParseRequestMethod::Email(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::Email)?; - self.email_parse(req, access_token).await?.into() + self.email_parse(*req, access_token).await?.into() } ParseRequestMethod::ContactCard(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::ContactCard)?; - self.contact_card_parse(req, access_token).await?.into() + self.contact_card_parse(*req, access_token).await?.into() } ParseRequestMethod::CalendarEvent(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::CalendarEvent)?; - self.calendar_event_parse(req, access_token).await?.into() + self.calendar_event_parse(*req, access_token).await?.into() } }, RequestMethod::QueryChanges(req) => self.query_changes(req, access_token).await?.into(), @@ -648,25 +647,25 @@ impl RequestHandler for Server { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_has_access(req.account_id, Collection::Email)?; - self.email_search_snippet(req, access_token).await?.into() + self.email_search_snippet(*req, access_token).await?.into() } RequestMethod::ValidateScript(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.sieve_script_validate(req, access_token).await?.into() + self.sieve_script_validate(*req, access_token).await?.into() } RequestMethod::LookupBlob(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.blob_lookup(req).await?.into() + self.blob_lookup(*req).await?.into() } RequestMethod::UploadBlob(mut req) => { set_account_id_if_missing(&mut req.account_id, access_token); access_token.assert_is_member(req.account_id)?; - self.blob_upload_many(req, access_token).await?.into() + self.blob_upload_many(*req, access_token).await?.into() } RequestMethod::Echo(req) => req.into(), RequestMethod::Error(error) => return Err(error), diff --git a/crates/jmap/src/calendar_event/copy.rs b/crates/jmap/src/calendar_event/copy.rs index 31a4feca..9454c5d4 100644 --- a/crates/jmap/src/calendar_event/copy.rs +++ b/crates/jmap/src/calendar_event/copy.rs @@ -209,14 +209,16 @@ impl JmapCalendarEventCopy for Server { *next_call = Call { id: String::new(), name: MethodName::new(MethodObject::CalendarEvent, MethodFunction::Set), - method: RequestMethod::Set(SetRequestMethod::CalendarEvent(SetRequest { - account_id: request.from_account_id, - if_in_state: request.destroy_from_if_in_state, - create: None, - update: None, - destroy: MaybeResultReference::Value(destroy_ids).into(), - arguments: Default::default(), - })), + method: RequestMethod::Set(SetRequestMethod::CalendarEvent(Box::new( + SetRequest { + account_id: request.from_account_id, + if_in_state: request.destroy_from_if_in_state, + create: None, + update: None, + destroy: MaybeResultReference::Value(destroy_ids).into(), + arguments: Default::default(), + }, + ))), } .into(); } diff --git a/crates/jmap/src/changes/get.rs b/crates/jmap/src/changes/get.rs index 6ad4808c..65fe9482 100644 --- a/crates/jmap/src/changes/get.rs +++ b/crates/jmap/src/changes/get.rs @@ -335,8 +335,10 @@ impl IntermediateChangesResponse { } } -fn transmute_response(response: ChangesResponse) -> ChangesResponse { - ChangesResponse { +fn transmute_response( + response: ChangesResponse, +) -> Box> { + Box::new(ChangesResponse { account_id: response.account_id, old_state: response.old_state, new_state: response.new_state, @@ -345,5 +347,5 @@ fn transmute_response(response: ChangesResponse) -> C updated: response.updated, destroyed: response.destroyed, updated_properties: None, - } + }) } diff --git a/crates/jmap/src/changes/query.rs b/crates/jmap/src/changes/query.rs index 87f13d4f..78e97788 100644 --- a/crates/jmap/src/changes/query.rs +++ b/crates/jmap/src/changes/query.rs @@ -71,7 +71,7 @@ impl QueryChanges for Server { .as_ref() .is_some_and(|sort| sort.iter().any(|s| !s.is_immutable())); - results = self.email_query(request.into(), access_token).await?; + results = self.email_query((*request).into(), access_token).await?; } QueryChangesRequestMethod::Mailbox(mut request) => { // Query changes @@ -93,7 +93,7 @@ impl QueryChanges for Server { } up_to_id = request.up_to_id; - results = self.mailbox_query(request.into(), access_token).await?; + results = self.mailbox_query((*request).into(), access_token).await?; } QueryChangesRequestMethod::EmailSubmission(mut request) => { // Query changes @@ -115,7 +115,7 @@ impl QueryChanges for Server { } up_to_id = request.up_to_id; - results = self.email_submission_query(request.into()).await?; + results = self.email_submission_query((*request).into()).await?; } QueryChangesRequestMethod::ContactCard(mut request) => { // Query changes @@ -138,7 +138,7 @@ impl QueryChanges for Server { up_to_id = request.up_to_id; results = self - .contact_card_query(request.into(), access_token) + .contact_card_query((*request).into(), access_token) .await?; } QueryChangesRequestMethod::FileNode(mut request) => { @@ -161,7 +161,7 @@ impl QueryChanges for Server { } up_to_id = request.up_to_id; - results = self.file_node_query(request.into(), access_token).await?; + results = self.file_node_query((*request).into(), access_token).await?; } QueryChangesRequestMethod::CalendarEvent(mut request) => { // Query changes @@ -184,7 +184,7 @@ impl QueryChanges for Server { up_to_id = request.up_to_id; results = self - .calendar_event_query(request.into(), access_token) + .calendar_event_query((*request).into(), access_token) .await?; } QueryChangesRequestMethod::CalendarEventNotification(mut request) => { @@ -208,7 +208,7 @@ impl QueryChanges for Server { up_to_id = request.up_to_id; results = self - .calendar_event_notification_query(request.into(), access_token) + .calendar_event_notification_query((*request).into(), access_token) .await?; } QueryChangesRequestMethod::ShareNotification(mut request) => { @@ -231,7 +231,7 @@ impl QueryChanges for Server { } up_to_id = request.up_to_id; - results = self.share_notification_query(request.into()).await?; + results = self.share_notification_query((*request).into()).await?; } QueryChangesRequestMethod::Principal(_) => { return Err(trc::JmapEvent::CannotCalculateChanges.into_err()); diff --git a/crates/jmap/src/contact/copy.rs b/crates/jmap/src/contact/copy.rs index ed921f00..a6e68b41 100644 --- a/crates/jmap/src/contact/copy.rs +++ b/crates/jmap/src/contact/copy.rs @@ -186,14 +186,14 @@ impl JmapContactCardCopy for Server { *next_call = Call { id: String::new(), name: MethodName::new(MethodObject::ContactCard, MethodFunction::Set), - method: RequestMethod::Set(SetRequestMethod::ContactCard(SetRequest { + method: RequestMethod::Set(SetRequestMethod::ContactCard(Box::new(SetRequest { account_id: request.from_account_id, if_in_state: request.destroy_from_if_in_state, create: None, update: None, destroy: MaybeResultReference::Value(destroy_ids).into(), arguments: Default::default(), - })), + }))), } .into(); } diff --git a/crates/jmap/src/email/copy.rs b/crates/jmap/src/email/copy.rs index 6b923c12..824aa420 100644 --- a/crates/jmap/src/email/copy.rs +++ b/crates/jmap/src/email/copy.rs @@ -241,14 +241,14 @@ impl JmapEmailCopy for Server { *next_call = Call { id: String::new(), name: MethodName::new(MethodObject::Email, MethodFunction::Set), - method: RequestMethod::Set(SetRequestMethod::Email(SetRequest { + method: RequestMethod::Set(SetRequestMethod::Email(Box::new(SetRequest { account_id: request.from_account_id, if_in_state: request.destroy_from_if_in_state, create: None, update: None, destroy: MaybeResultReference::Value(destroy_ids).into(), arguments: Default::default(), - })), + }))), } .into(); } diff --git a/crates/jmap/src/lib.rs b/crates/jmap/src/lib.rs index 62fde961..94414cb6 100644 --- a/crates/jmap/src/lib.rs +++ b/crates/jmap/src/lib.rs @@ -4,7 +4,7 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ -#![warn(clippy::large_futures)] +#![deny(clippy::large_futures)] pub mod addressbook; pub mod api; diff --git a/crates/jmap/src/submission/set.rs b/crates/jmap/src/submission/set.rs index 8af68da3..8e448303 100644 --- a/crates/jmap/src/submission/set.rs +++ b/crates/jmap/src/submission/set.rs @@ -272,7 +272,7 @@ impl EmailSubmissionSet for Server { *next_call = Call { id: String::new(), name: MethodName::new(MethodObject::Email, MethodFunction::Set), - method: RequestMethod::Set(SetRequestMethod::Email(SetRequest { + method: RequestMethod::Set(SetRequestMethod::Email(Box::new(SetRequest { account_id: request.account_id, if_in_state: None, create: None, @@ -309,7 +309,7 @@ impl EmailSubmissionSet for Server { ) }), arguments: Default::default(), - })), + }))), } .into(); } diff --git a/crates/jmap/src/websocket/stream.rs b/crates/jmap/src/websocket/stream.rs index 96253aba..b31a5277 100644 --- a/crates/jmap/src/websocket/stream.rs +++ b/crates/jmap/src/websocket/stream.rs @@ -34,7 +34,6 @@ pub trait WebSocketHandler: Sync + Send { } impl WebSocketHandler for Server { - #![allow(clippy::large_futures)] async fn handle_websocket_stream( &self, mut stream: WebSocketStream>, diff --git a/crates/main/src/main.rs b/crates/main/src/main.rs index cbf2fbee..3c6bb3cd 100644 --- a/crates/main/src/main.rs +++ b/crates/main/src/main.rs @@ -4,7 +4,7 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ -#![warn(clippy::large_futures)] +#![deny(clippy::large_futures)] #![warn(clippy::cast_possible_truncation)] #![warn(clippy::cast_possible_wrap)] #![warn(clippy::cast_sign_loss)] diff --git a/crates/managesieve/src/core/client.rs b/crates/managesieve/src/core/client.rs index eb929726..cd130857 100644 --- a/crates/managesieve/src/core/client.rs +++ b/crates/managesieve/src/core/client.rs @@ -97,7 +97,7 @@ impl Session { Command::CheckScript => self.handle_checkscript(request).await, Command::HaveSpace => self.handle_havespace(request).await, Command::Capability => self.handle_capability("").await, - Command::Authenticate => self.handle_authenticate(request).await, + Command::Authenticate => Box::pin(self.handle_authenticate(request)).await, Command::StartTls => self.handle_start_tls().await, Command::Logout => self.handle_logout().await, Command::Noop => self.handle_noop(request).await, diff --git a/crates/managesieve/src/lib.rs b/crates/managesieve/src/lib.rs index 4f4bc8ba..fb665dff 100644 --- a/crates/managesieve/src/lib.rs +++ b/crates/managesieve/src/lib.rs @@ -4,6 +4,8 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ +#![deny(clippy::large_futures)] + pub mod core; pub mod op; diff --git a/crates/migration/src/lib.rs b/crates/migration/src/lib.rs index 1d9ee380..145465f7 100644 --- a/crates/migration/src/lib.rs +++ b/crates/migration/src/lib.rs @@ -4,6 +4,8 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ +#![deny(clippy::large_futures)] + use crate::v016::migrate_v0_16; use common::{DATABASE_SCHEMA_VERSION, Server}; use store::{ diff --git a/crates/pop3/src/client.rs b/crates/pop3/src/client.rs index 2a6c8eaa..a58847dd 100644 --- a/crates/pop3/src/client.rs +++ b/crates/pop3/src/client.rs @@ -100,11 +100,11 @@ impl Session { } else { unreachable!() }; - self.handle_auth(Credentials::Basic { + Box::pin(self.handle_auth(Credentials::Basic { username, secret: string, mfa_token: None, - }) + })) .await .map(|_| SessionResult::Continue) } @@ -147,10 +147,11 @@ impl Session { self.handle_stls().await.map(|_| SessionResult::UpgradeTls) } Command::Utf8 => self.handle_utf8().await.map(|_| SessionResult::Continue), - Command::Auth { mechanism, params } => self - .handle_sasl(mechanism, params) - .await - .map(|_| SessionResult::Continue), + Command::Auth { mechanism, params } => Box::pin( + self.handle_sasl(mechanism, params), + ) + .await + .map(|_| SessionResult::Continue), Command::Apop { .. } => Err(trc::Pop3Event::Error .into_err() .details("APOP not supported.")), diff --git a/crates/pop3/src/lib.rs b/crates/pop3/src/lib.rs index dda0ed92..3ca6c6d0 100644 --- a/crates/pop3/src/lib.rs +++ b/crates/pop3/src/lib.rs @@ -4,6 +4,8 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ +#![deny(clippy::large_futures)] + use std::{net::IpAddr, sync::Arc}; use common::{ diff --git a/crates/pop3/src/op/authenticate.rs b/crates/pop3/src/op/authenticate.rs index 4b0b6a8b..cf423e34 100644 --- a/crates/pop3/src/op/authenticate.rs +++ b/crates/pop3/src/op/authenticate.rs @@ -39,7 +39,7 @@ impl Session { .details("Invalid SASL challenge") })?; - self.handle_auth(credentials).await + Box::pin(self.handle_auth(credentials)).await } else { // TODO: This hack is temporary until the SASL library is developed self.receiver.state = request::State::Argument { diff --git a/crates/registry/src/lib.rs b/crates/registry/src/lib.rs index 843b95b4..1710fae9 100644 --- a/crates/registry/src/lib.rs +++ b/crates/registry/src/lib.rs @@ -4,6 +4,8 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ +#![deny(clippy::large_futures)] + pub mod jmap; pub mod pickle; pub mod schema; diff --git a/crates/services/src/lib.rs b/crates/services/src/lib.rs index 00323709..9032d87b 100644 --- a/crates/services/src/lib.rs +++ b/crates/services/src/lib.rs @@ -4,6 +4,8 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ +#![deny(clippy::large_futures)] + use broadcast::publisher::spawn_broadcast_publisher; use common::{ BuildServer, Inner, diff --git a/crates/services/src/task_manager/manager.rs b/crates/services/src/task_manager/manager.rs index 8686ab8f..b8f89317 100644 --- a/crates/services/src/task_manager/manager.rs +++ b/crates/services/src/task_manager/manager.rs @@ -241,7 +241,7 @@ pub fn spawn_task_manager(inner: Arc) { server.store_maintenance(task).await } Task::SpamFilterMaintenance(task) => { - server.spam_filter_maintenance(task).await + Box::pin(server.spam_filter_maintenance(task)).await } Task::AcmeRenewal(task) => server.acme_management(task).await, Task::DkimManagement(task_dkim_rotation) => { diff --git a/crates/services/src/task_manager/scheduler.rs b/crates/services/src/task_manager/scheduler.rs index 632adb5e..fa1d2750 100644 --- a/crates/services/src/task_manager/scheduler.rs +++ b/crates/services/src/task_manager/scheduler.rs @@ -464,9 +464,10 @@ pub fn spawn_task_scheduler(inner: Arc) { Type = "validateLicense" ); - match server - .reload_registry(RegistryChange::Reload(ObjectType::Enterprise)) - .await + match Box::pin( + server.reload_registry(RegistryChange::Reload(ObjectType::Enterprise)), + ) + .await { Ok(result) => { if !result.has_errors() { diff --git a/crates/services/src/task_manager/spam_classifier.rs b/crates/services/src/task_manager/spam_classifier.rs index b0586e76..16b13238 100644 --- a/crates/services/src/task_manager/spam_classifier.rs +++ b/crates/services/src/task_manager/spam_classifier.rs @@ -56,12 +56,12 @@ async fn spam_filter_maintenance( match task.maintenance_type { TaskSpamFilterMaintenanceType::Train => { if !server.inner.ipc.train_task_controller.is_running() { - server.spam_train(false).await?; + Box::pin(server.spam_train(false)).await?; } } TaskSpamFilterMaintenanceType::Retrain => { if !server.inner.ipc.train_task_controller.is_running() { - server.spam_train(true).await?; + Box::pin(server.spam_train(true)).await?; } } TaskSpamFilterMaintenanceType::Reset => { @@ -247,9 +247,8 @@ async fn update_spam_rules(server: &Server) -> trc::Result { } if reload_settings { - if let Err(err) = server - .reload_registry(RegistryChange::Reload(ObjectType::SpamRule)) - .await + if let Err(err) = + Box::pin(server.reload_registry(RegistryChange::Reload(ObjectType::SpamRule))).await { trc::error!(err.details("Failed to reload registry after updating spam rules")); } @@ -261,9 +260,10 @@ async fn update_spam_rules(server: &Server) -> trc::Result { } if reload_lookups { - if let Err(err) = server - .reload_registry(RegistryChange::Reload(ObjectType::MemoryLookupKey)) - .await + if let Err(err) = Box::pin( + server.reload_registry(RegistryChange::Reload(ObjectType::MemoryLookupKey)), + ) + .await { trc::error!(err.details("Failed to reload registry after updating spam rules")); } diff --git a/crates/smtp/src/lib.rs b/crates/smtp/src/lib.rs index bf1cb5b0..1fde369d 100644 --- a/crates/smtp/src/lib.rs +++ b/crates/smtp/src/lib.rs @@ -4,7 +4,7 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ -#![warn(clippy::large_futures)] +#![deny(clippy::large_futures)] use common::{ Inner, diff --git a/crates/smtp/src/outbound/client.rs b/crates/smtp/src/outbound/client.rs index 4f3825ad..be81474d 100644 --- a/crates/smtp/src/outbound/client.rs +++ b/crates/smtp/src/outbound/client.rs @@ -115,12 +115,12 @@ impl SmtpClient { return Ok(()); } _ => { - return Err(ClientError::UnexpectedReply(reply)); + return Err(ClientError::UnexpectedReply(Box::new(reply))); } } } - Err(ClientError::UnexpectedReply(reply)) + Err(ClientError::UnexpectedReply(Box::new(reply))) } pub async fn read_greeting( @@ -327,7 +327,7 @@ impl SmtpClient { smtp_proto::Error::InvalidResponse { code } => { match ResponseReceiver::from_code(code).parse(&mut iter) { Ok(response) => { - return Err(ClientError::UnexpectedReply(response)); + return Err(ClientError::UnexpectedReply(Box::new(response))); } Err(smtp_proto::Error::NeedsMoreData { .. }) => { if buf_concat.is_empty() { diff --git a/crates/smtp/src/outbound/delivery.rs b/crates/smtp/src/outbound/delivery.rs index a79dcbee..3807db82 100644 --- a/crates/smtp/src/outbound/delivery.rs +++ b/crates/smtp/src/outbound/delivery.rs @@ -44,7 +44,6 @@ use trc::{DaneEvent, DeliveryEvent, MtaStsEvent, ServerEvent, TlsRptEvent}; impl QueuedMessage { pub fn try_deliver(self, server: Server) { - #![allow(clippy::large_futures)] tokio::spawn(async move { // Lock queue event let queue_id = self.queue_id; diff --git a/crates/smtp/src/outbound/error.rs b/crates/smtp/src/outbound/error.rs index ff88941e..ef62ea3d 100644 --- a/crates/smtp/src/outbound/error.rs +++ b/crates/smtp/src/outbound/error.rs @@ -26,10 +26,10 @@ pub enum ClientError { UnparseableReply, /// Unexpected SMTP reply. - UnexpectedReply(smtp_proto::Response), + UnexpectedReply(Box>), /// SMTP authentication failure. - AuthenticationFailed(smtp_proto::Response), + AuthenticationFailed(Box>), /// Invalid TLS name provided. InvalidTLSName, @@ -73,7 +73,7 @@ impl AssertReply for Response { if self.severity() == severity { Ok(()) } else { - Err(ClientError::UnexpectedReply(self)) + Err(ClientError::UnexpectedReply(Box::new(self))) } } @@ -83,7 +83,7 @@ impl AssertReply for Response { if (200..=299).contains(&self.code) { Ok(()) } else { - Err(ClientError::UnexpectedReply(self)) + Err(ClientError::UnexpectedReply(Box::new(self))) } } @@ -93,7 +93,7 @@ impl AssertReply for Response { if self.code() == code { Ok(()) } else { - Err(ClientError::UnexpectedReply(self)) + Err(ClientError::UnexpectedReply(Box::new(self))) } } } diff --git a/crates/smtp/src/outbound/session.rs b/crates/smtp/src/outbound/session.rs index 8836c777..cbacfa2c 100644 --- a/crates/smtp/src/outbound/session.rs +++ b/crates/smtp/src/outbound/session.rs @@ -126,7 +126,7 @@ impl MessageWrapper { if r.is_positive_completion() { Ok(r) } else { - Err(ClientError::UnexpectedReply(r)) + Err(ClientError::UnexpectedReply(Box::new(r))) } }) { Ok(response) => { @@ -301,7 +301,7 @@ impl MessageWrapper { Status::from_smtp_error( params.hostname, bdat_cmd.as_deref().unwrap_or("DATA"), - ClientError::UnexpectedReply(response), + ClientError::UnexpectedReply(Box::new(response)), ), rcpt_idxs, )); diff --git a/crates/smtp/src/reporting/analysis.rs b/crates/smtp/src/reporting/analysis.rs index 4b41b456..8c29f2c7 100644 --- a/crates/smtp/src/reporting/analysis.rs +++ b/crates/smtp/src/reporting/analysis.rs @@ -163,8 +163,34 @@ impl AnalyzeReport for Server { Cow::Owned(buf) } Compression::Zip => { - let mut archive = match zip::ZipArchive::new(Cursor::new(report.data)) { - Ok(archive) => archive, + let data = report.data.to_vec(); + let result = tokio::task::spawn_blocking( + move || -> Result, std::io::Error> { + let mut archive = zip::ZipArchive::new(Cursor::new(data)) + .map_err(std::io::Error::other)?; + let mut buf = Vec::new(); + if !archive.is_empty() { + let mut file = + archive.by_index(0).map_err(std::io::Error::other)?; + buf.reserve(file.compressed_size() as usize); + file.read_to_end(&mut buf)?; + } + Ok(buf) + }, + ) + .await; + match result { + Ok(Ok(buf)) => Cow::Owned(buf), + Ok(Err(err)) => { + trc::event!( + IncomingReport(IncomingReportEvent::DecompressError), + SpanId = session_id, + From = from.to_string(), + Reason = err.to_string(), + CausedBy = trc::location!() + ); + continue; + } Err(err) => { trc::event!( IncomingReport(IncomingReportEvent::DecompressError), @@ -173,38 +199,9 @@ impl AnalyzeReport for Server { Reason = err.to_string(), CausedBy = trc::location!() ); - continue; } - }; - let mut buf = Vec::with_capacity(0); - for i in 0..archive.len() { - match archive.by_index(i) { - Ok(mut file) => { - buf = Vec::with_capacity(file.compressed_size() as usize); - if let Err(err) = file.read_to_end(&mut buf) { - trc::event!( - IncomingReport(IncomingReportEvent::DecompressError), - SpanId = session_id, - From = from.to_string(), - Reason = err.to_string(), - CausedBy = trc::location!() - ); - } - break; - } - Err(err) => { - trc::event!( - IncomingReport(IncomingReportEvent::DecompressError), - SpanId = session_id, - From = from.to_string(), - Reason = err.to_string(), - CausedBy = trc::location!() - ); - } - } } - Cow::Owned(buf) } }; diff --git a/crates/spam-filter/src/lib.rs b/crates/spam-filter/src/lib.rs index 2710d35d..b4ca6df2 100644 --- a/crates/spam-filter/src/lib.rs +++ b/crates/spam-filter/src/lib.rs @@ -4,6 +4,8 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ +#![deny(clippy::large_futures)] + pub mod analysis; pub mod modules; diff --git a/crates/store/src/lib.rs b/crates/store/src/lib.rs index e98ac962..18bbe6a5 100644 --- a/crates/store/src/lib.rs +++ b/crates/store/src/lib.rs @@ -4,6 +4,8 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ +#![deny(clippy::large_futures)] + pub mod backend; pub mod build; pub mod dispatch; diff --git a/crates/trc/src/lib.rs b/crates/trc/src/lib.rs index e4fb53e2..70923db5 100644 --- a/crates/trc/src/lib.rs +++ b/crates/trc/src/lib.rs @@ -4,6 +4,8 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ +#![deny(clippy::large_futures)] + pub mod atomics; pub mod event; pub mod ipc; diff --git a/crates/utils/src/lib.rs b/crates/utils/src/lib.rs index bf1b17db..63476e94 100644 --- a/crates/utils/src/lib.rs +++ b/crates/utils/src/lib.rs @@ -4,6 +4,8 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ +#![deny(clippy::large_futures)] + pub mod bimap; pub mod cache; pub mod chained_bytes; diff --git a/resources/docker/Dockerfile.fdb b/resources/docker/Dockerfile.fdb index b19185f1..7fd3a811 100644 --- a/resources/docker/Dockerfile.fdb +++ b/resources/docker/Dockerfile.fdb @@ -37,7 +37,7 @@ COPY Cargo.lock . COPY crates/ crates/ COPY resources/ resources/ COPY tests/ tests/ -RUN cargo build -p stalwart --no-default-features --features "foundationdb elastic s3 redis azure nats enterprise" --release +RUN cargo build -p stalwart --no-default-features --features "foundationdb s3 redis azure nats enterprise" --release FROM debian:trixie-slim AS runtime diff --git a/resources/docker/entrypoint.sh b/resources/docker/entrypoint.sh index 692435aa..f98f7644 100644 --- a/resources/docker/entrypoint.sh +++ b/resources/docker/entrypoint.sh @@ -1,10 +1,5 @@ #!/usr/bin/env sh # shellcheck shell=dash -# If the configuration file does not exist initialize it. -if [ ! -f /opt/stalwart/etc/config.toml ]; then - /usr/local/bin/stalwart --init /opt/stalwart -fi - # If the configuration file exists, start the server. -exec /usr/local/bin/stalwart --config /opt/stalwart/etc/config.toml +exec /usr/local/bin/stalwart --config /opt/stalwart/etc/config.json diff --git a/resources/schema/schema.json.gz b/resources/schema/schema.json.gz index 1e6b0413a7aa014161124e8ee00858a19237ef01..bdccce698dc19099b67c2bbd9c8429ab807ba0bf 100644 GIT binary patch delta 100871 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 We=4uoW!IJa+5Z>3t!`x=jSK)&lB%!( delta 100846 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 diff --git a/resources/schema/schema.json.sha256 b/resources/schema/schema.json.sha256 index a70b013e..faada3c8 100644 --- a/resources/schema/schema.json.sha256 +++ b/resources/schema/schema.json.sha256 @@ -1 +1 @@ -MLWAMu9TglkOY68vD-l5Yy7e37iSMMm6agiqGga9nxI \ No newline at end of file +PL8KZnGtpFbFHjUZNFp4Ety5oqiCIv7amrwZ2gnIHbA \ No newline at end of file diff --git a/tests/resources/acme/Docker.pebble b/tests/resources/acme/Docker.pebble deleted file mode 100644 index 25002ba1..00000000 --- a/tests/resources/acme/Docker.pebble +++ /dev/null @@ -1,28 +0,0 @@ -FROM golang:1.18-alpine as builder - -ENV CGO_ENABLED=0 - -WORKDIR /pebble-src - -RUN apk update && apk add --no-cache git -RUN git clone https://github.com/letsencrypt/pebble/ /pebble-src -RUN go build -o /go/bin/pebble ./cmd/pebble - -## main -FROM alpine:3.15.4 - -COPY --from=builder /go/bin/pebble /usr/bin/pebble -COPY --from=builder /pebble-src/test/ /test/ - -CMD [ "/usr/bin/pebble" ] - -EXPOSE 14000 -EXPOSE 15000 - -# Build: -# docker build -f Docker.pebble -t pebble - -# Run: -# docker run -d -p 14000:14000 -p 15000:15000 pebble -# docker run -d --name pebble -p 14000:14000 -p 15000:15000 pebble pebble -config /test/config/pebble-config.json -strict - diff --git a/tests/resources/acme/config.toml b/tests/resources/acme/config.toml deleted file mode 100644 index bdc13c50..00000000 --- a/tests/resources/acme/config.toml +++ /dev/null @@ -1,58 +0,0 @@ -acme.pebble.contact = "postmaster@example.org" -acme.pebble.directory = "https://localhost:14000/dir" -#acme.pebble.domains = "mail.example.org" -acme.pebble.renew-before = "30d" - -acme.pebble.challenge = "tls-alpn-01" -#acme.pebble.challenge = "http-01" -#acme.pebble.challenge = "dns-01" - -acme.pebble.domains = "*.example.org" -acme.pebble.provider = "cloudflare" -acme.pebble.secret = "" - -authentication.fallback-admin.secret = "secret" -authentication.fallback-admin.user = "admin" -config.local-keys.0 = "*" -directory.internal.store = "rocksdb" -directory.internal.type = "internal" -lookup.default.hostname = "mail.example.org" -lookup.default.domain = "example.org" -oauth.key = "0Wn7rO4UdmBoE8mp3cDcD9Qlpz3na74z7fGRoSuq8fVsGPelLl3KrHomBN8h2biA" -queue.quota.size.enable = true -queue.quota.size.messages = 100000 -queue.quota.size.size = 10737418240 -report.analysis.addresses = "postmaster@*" -server.http.permissive-cors = true -server.listener.http.bind = "[::]:5002" -server.listener.http.protocol = "http" -server.listener.https.bind = "[::]:5001" -server.listener.https.protocol = "http" -server.listener.https.tls.implicit = true -server.listener.imap.bind = "[::]:143" -server.listener.imap.protocol = "imap" -server.listener.imaptls.bind = "[::]:993" -server.listener.imaptls.protocol = "imap" -server.listener.imaptls.tls.implicit = true -server.listener.sieve.bind = "[::]:4190" -server.listener.sieve.protocol = "managesieve" -server.listener.smtp.bind = "[::]:25" -server.listener.smtp.protocol = "smtp" -server.listener.submission.bind = "[::]:587" -server.listener.submission.protocol = "smtp" -server.listener.submissions.bind = "[::]:465" -server.listener.submissions.protocol = "smtp" -server.listener.submissions.tls.implicit = true -storage.blob = "rocksdb" -storage.data = "rocksdb" -storage.directory = "internal" -storage.fts = "rocksdb" -storage.lookup = "rocksdb" -store.rocksdb.compression = "lz4" -store.rocksdb.path = "/tmp/stalwart-temp-data" -store.rocksdb.type = "rocksdb" -tracer.stdout.ansi = true -tracer.stdout.enable = true -tracer.stdout.level = "trace" -tracer.stdout.type = "stdout" -version.spam-filter = 1.0 diff --git a/tests/resources/acme/docker-compose-pebble.yaml b/tests/resources/acme/docker-compose-pebble.yaml deleted file mode 100644 index 5806fe59..00000000 --- a/tests/resources/acme/docker-compose-pebble.yaml +++ /dev/null @@ -1,33 +0,0 @@ -# docker-compose -f docker-compose-pebble.yaml up -# curl --request POST --data '{"ip":"192.168.5.2"}' http://localhost:8055/set-default-ipv4 -# HTTPS port should be 5001 -# HTTP port should be 5002 -# Directory https://localhost:14000/dir - -version: '3' -services: - pebble: - image: letsencrypt/pebble:latest - command: pebble -config /test/config/pebble-config.json -strict -dnsserver 10.30.50.3:8053 #-dnsserver 8.8.8.8:53 - ports: - - 14000:14000 # HTTPS ACME API - - 15000:15000 # HTTPS Management API - networks: - acmenet: - ipv4_address: 10.30.50.2 - challtestsrv: - image: letsencrypt/pebble-challtestsrv:latest - command: pebble-challtestsrv -defaultIPv6 "" -defaultIPv4 10.30.50.3 - ports: - - 8055:8055 # HTTP Management API - networks: - acmenet: - ipv4_address: 10.30.50.3 - -networks: - acmenet: - driver: bridge - ipam: - driver: default - config: - - subnet: 10.30.50.0/24 diff --git a/tests/resources/acme/test_acme.sh b/tests/resources/acme/test_acme.sh deleted file mode 100644 index 66e908f2..00000000 --- a/tests/resources/acme/test_acme.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -rm -Rf /tmp/stalwart-temp-data -mkdir -p /tmp/stalwart-temp-data -cp ./tests/resources/acme/config.toml /tmp/stalwart-temp-data/config.toml - -curl --request POST --data '{"ip":"192.168.5.2"}' http://localhost:8055/set-default-ipv4 - -cargo run -p stalwart --no-default-features --features "sqlite foundationdb postgres mysql rocks elastic s3 redis" -- --config=/tmp/stalwart-temp-data/config.toml diff --git a/tests/resources/scripts/create_test_cluster.sh b/tests/resources/scripts/create_test_cluster.sh deleted file mode 100644 index c38866f9..00000000 --- a/tests/resources/scripts/create_test_cluster.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash - -BASE_DIR="/Users/me/Downloads/stalwart-cluster" -FEATURES="rocks" -NUM_NODES=5 - -# Kill previous processes -sudo pkill stalwart - -# Delete previous tests -rm -rf $BASE_DIR - -# Build the stalwart binary -cargo build -p stalwart --no-default-features --features "$FEATURES" - -for NUM in $(seq 1 $NUM_NODES); do - sudo ifconfig en0 alias 10.0.$NUM.1 netmask 255.255.255.0 - mkdir -p $BASE_DIR/data$NUM - cat < $BASE_DIR/config$NUM.toml -cluster.bind-addr = "10.0._N_.1" -cluster.key = "the cluster key" -cluster.seed-nodes = ["10.0.1.1", "10.0.2.1", "10.0.3.1"] -authentication.fallback-admin.secret = "secret" -authentication.fallback-admin.user = "admin" -directory.internal.store = "rocksdb" -directory.internal.type = "internal" -lookup.default.hostname = "mail_N_.example.org" -server.http.permissive-cors = true -server.listener.https.bind = "10.0._N_.1:1443" -server.listener.https.protocol = "http" -server.listener.https.tls.implicit = true -server.listener.imap.bind = "10.0._N_.1:1143" -server.listener.imap.protocol = "imap" -server.listener.smtp.bind = "10.0._N_.1:1125" -server.listener.smtp.protocol = "smtp" -storage.blob = "rocksdb" -storage.data = "rocksdb" -storage.directory = "internal" -storage.fts = "rocksdb" -storage.lookup = "rocksdb" -store.rocksdb.compression = "lz4" -store.rocksdb.path = "_D_/data_N_" -store.rocksdb.type = "rocksdb" -tracer.stdout.ansi = true -tracer.stdout.enable = true -tracer.stdout.level = "debug" -tracer.stdout.type = "stdout" -config.resource.spam-filter = "file:///dev/null" -config.resource.webadmin = "file:///dev/null" -EOF - - sudo ./target/debug/stalwart --config $BASE_DIR/config$NUM.toml & -done diff --git a/tests/resources/scripts/create_test_env.sh b/tests/resources/scripts/create_test_env.sh deleted file mode 100644 index b39415c2..00000000 --- a/tests/resources/scripts/create_test_env.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -BASE_DIR="/Users/me/Downloads/stalwart-test" -FEATURES="sqlite foundationdb postgres mysql rocks elastic s3 redis" - -# Delete previous tests -rm -rf $BASE_DIR - -# Create admin user -cargo run -p stalwart --no-default-features --features "$FEATURES" -- --init=$BASE_DIR - -printf "[server.http]\npermissive-cors = true\n" >> $BASE_DIR/etc/config.toml -printf "[tracer.stdout]\ntype = 'stdout'\nlevel = 'trace'\nansi = true\nenable = true\n" >> $BASE_DIR/etc/config.toml -sed -i '' 's/secret =/secret = "secret"\n#secret =/g' $BASE_DIR/etc/config.toml -#cargo run -p stalwart --no-default-features --features "$FEATURES" -- --config=$BASE_DIR/etc/config.toml diff --git a/tests/src/cluster/broadcast.rs b/tests/src/cluster/broadcast.rs index 945753ca..43641e16 100644 --- a/tests/src/cluster/broadcast.rs +++ b/tests/src/cluster/broadcast.rs @@ -30,189 +30,178 @@ use types::id::Id; pub const NUM_NODES: usize = 3; -#[test] -fn cluster_tests() { - tokio::runtime::Builder::new_multi_thread() - .thread_stack_size(8 * 1024 * 1024) // 8MB stack - .enable_all() +#[tokio::test(flavor = "multi_thread")] +pub async fn cluster_tests() { + println!("Running cluster broadcast tests..."); + let mut servers = Vec::with_capacity(NUM_NODES); + + let coordinator_id = std::env::var("COORDINATOR").expect(concat!( + "Missing coordinator type. Try running `STORE= ", + "COORDINATOR= cargo test`" + )); + let coordinator = match coordinator_id.as_str() { + "Nats" => Coordinator::Nats(NatsCoordinator { + addresses: Map::new(vec!["127.0.0.1:4222".to_string()]), + use_tls: false, + ..Default::default() + }), + "Redis" => Coordinator::Redis(RedisStore { + url: "redis://127.0.0.1".to_string(), + ..Default::default() + }), + _ => panic!("Unsupported coordinator type: {}", coordinator_id), + }; + + // Create initial server + let test = TestServerBuilder::new("cluster_test_0") + .await + .with_object(coordinator) + .await + .with_listener(NetworkListenerProtocol::Http, "http_0", 11000, true) + .await + .with_imap_listener(12000) + .await + .with_listener(NetworkListenerProtocol::Lmtp, "lmtp_0", 11200, false) + .await .build() - .unwrap() - .block_on(async { - println!("Running cluster broadcast tests..."); - let mut servers = Vec::with_capacity(NUM_NODES); + .await; + let admin = test.account("admin"); + admin.mta_no_auth().await; + let account = admin + .create_user_account( + "jdoe@example.com", + "this is john's secret", + "John's account", + &[], + vec![], + ) + .await; + admin.reload_settings().await; - let coordinator_id = std::env::var("COORDINATOR").expect(concat!( - "Missing coordinator type. Try running `STORE= ", - "COORDINATOR= cargo test`" - )); - let coordinator = match coordinator_id.as_str() { - "Nats" => Coordinator::Nats(NatsCoordinator { - addresses: Map::new(vec!["127.0.0.1:4222".to_string()]), - use_tls: false, - ..Default::default() + // Create listeners + let mut listeners = vec![ + test.server + .registry() + .query::>(RegistryQuery::new(ObjectType::NetworkListener)) + .await + .unwrap(), + ]; + for node_id in 1..NUM_NODES { + let http_listener_id = admin + .registry_create_object(NetworkListener { + name: format!("http_{}", node_id), + bind: Map::new(vec![ + SocketAddr::from_str(&format!("127.0.0.1:1100{node_id}")).unwrap(), + ]), + protocol: NetworkListenerProtocol::Http, + tls_implicit: true, + use_tls: true, + ..Default::default() + }) + .await; + let imap_listener_id = admin + .registry_create_object(NetworkListener { + name: format!("imap_{}", node_id), + bind: Map::new(vec![ + SocketAddr::from_str(&format!("127.0.0.1:1200{node_id}")).unwrap(), + ]), + protocol: NetworkListenerProtocol::Imap, + tls_implicit: false, + use_tls: true, + ..Default::default() + }) + .await; + listeners.push(vec![http_listener_id, imap_listener_id]); + } + + // Create node roles + for (role_id, listener_ids) in listeners.into_iter().enumerate() { + admin + .registry_create_object(ClusterRole { + name: format!("role_{role_id}"), + listeners: ClusterListenerGroup::EnableSome(ClusterListenerGroupProperties { + listener_ids: Map::new(listener_ids), }), - "Redis" => Coordinator::Redis(RedisStore { - url: "redis://127.0.0.1".to_string(), - ..Default::default() - }), - _ => panic!("Unsupported coordinator type: {}", coordinator_id), - }; + tasks: ClusterTaskGroup::EnableAll, + description: None, + }) + .await; + } + servers.push(test); - // Create initial server - let test = TestServerBuilder::new("cluster_test_0") - .await - .with_object(coordinator) - .await - .with_listener(NetworkListenerProtocol::Http, "http_0", 11000, true) - .await - .with_imap_listener(12000) - .await - .with_listener(NetworkListenerProtocol::Lmtp, "lmtp_0", 11200, false) - .await - .build() - .await; - let admin = test.account("admin"); - admin.mta_no_auth().await; - let account = admin - .create_user_account( - "jdoe@example.com", - "this is john's secret", - "John's account", - &[], - vec![], - ) - .await; - admin.reload_settings().await; + // Build additional servers + for node_id in 1..NUM_NODES { + let test = TestServerBuilder::new_with_role( + &format!("cluster_test_{node_id}"), + format!("mail-{node_id}.example.com"), + Some(format!("role_{node_id}")), + false, + ) + .await + .build_with_opts(false) + .await; - // Create listeners - let mut listeners = vec![ - test.server - .registry() - .query::>(RegistryQuery::new(ObjectType::NetworkListener)) - .await - .unwrap(), - ]; - for node_id in 1..NUM_NODES { - let http_listener_id = admin - .registry_create_object(NetworkListener { - name: format!("http_{}", node_id), - bind: Map::new(vec![ - SocketAddr::from_str(&format!("127.0.0.1:1100{node_id}")).unwrap(), - ]), - protocol: NetworkListenerProtocol::Http, - tls_implicit: true, - use_tls: true, - ..Default::default() - }) - .await; - let imap_listener_id = admin - .registry_create_object(NetworkListener { - name: format!("imap_{}", node_id), - bind: Map::new(vec![ - SocketAddr::from_str(&format!("127.0.0.1:1200{node_id}")).unwrap(), - ]), - protocol: NetworkListenerProtocol::Imap, - tls_implicit: false, - use_tls: true, - ..Default::default() - }) - .await; - listeners.push(vec![http_listener_id, imap_listener_id]); - } + // Verify that the server was assigned the correct node id + assert_eq!(test.server.registry().node_id(), node_id as u16); + servers.push(test); + } - // Create node roles - for (role_id, listener_ids) in listeners.into_iter().enumerate() { - admin - .registry_create_object(ClusterRole { - name: format!("role_{role_id}"), - listeners: ClusterListenerGroup::EnableSome( - ClusterListenerGroupProperties { - listener_ids: Map::new(listener_ids), - }, - ), - tasks: ClusterTaskGroup::EnableAll, - description: None, - }) - .await; - } - servers.push(test); + // Verify cross-cluster cache invalidations + let admin = servers[0].account("admin"); + let server1 = &servers[1].server; + let server2 = &servers[2].server; + let account_id = account.id().document_id(); + assert_eq!( + server1 + .account(account_id) + .await + .unwrap() + .description + .as_deref(), + Some("John's account") + ); + assert_eq!( + server2 + .account(account_id) + .await + .unwrap() + .description + .as_deref(), + Some("John's account") + ); + admin + .registry_update_object( + ObjectType::Account, + account.id(), + json!({ + Property::Description: "John Doe" + }), + ) + .await; + tokio::time::sleep(std::time::Duration::from_millis(200)).await; + assert_eq!( + server1 + .account(account_id) + .await + .unwrap() + .description + .as_deref(), + Some("John Doe") + ); + assert_eq!( + server2 + .account(account_id) + .await + .unwrap() + .description + .as_deref(), + Some("John Doe") + ); - // Build additional servers - for node_id in 1..NUM_NODES { - let test = TestServerBuilder::new_with_role( - &format!("cluster_test_{node_id}"), - format!("mail-{node_id}.example.com"), - Some(format!("role_{node_id}")), - false, - ) - .await - .build_with_opts(false) - .await; - - // Verify that the server was assigned the correct node id - assert_eq!(test.server.registry().node_id(), node_id as u16); - servers.push(test); - } - - // Verify cross-cluster cache invalidations - let admin = servers[0].account("admin"); - let server1 = &servers[1].server; - let server2 = &servers[2].server; - let account_id = account.id().document_id(); - assert_eq!( - server1 - .account(account_id) - .await - .unwrap() - .description - .as_deref(), - Some("John's account") - ); - assert_eq!( - server2 - .account(account_id) - .await - .unwrap() - .description - .as_deref(), - Some("John's account") - ); - admin - .registry_update_object( - ObjectType::Account, - account.id(), - json!({ - Property::Description: "John Doe" - }), - ) - .await; - tokio::time::sleep(std::time::Duration::from_millis(200)).await; - assert_eq!( - server1 - .account(account_id) - .await - .unwrap() - .description - .as_deref(), - Some("John Doe") - ); - assert_eq!( - server2 - .account(account_id) - .await - .unwrap() - .description - .as_deref(), - Some("John Doe") - ); - - // Run IMAP idle tests across nodes - let mut node1_client = - imap_client("jdoe@example.com", "this is john's secret", 1).await; - let mut node2_client = - imap_client("jdoe@example.com", "this is john's secret", 2).await; - idle::test(&mut node1_client, &mut node2_client, true).await; - }); + // Run IMAP idle tests across nodes + let mut node1_client = imap_client("jdoe@example.com", "this is john's secret", 1).await; + let mut node2_client = imap_client("jdoe@example.com", "this is john's secret", 2).await; + idle::test(&mut node1_client, &mut node2_client, true).await; } async fn imap_client(login: &str, secret: &str, node_id: u32) -> ImapConnection { diff --git a/tests/src/imap/mod.rs b/tests/src/imap/mod.rs index 243dec85..404c7607 100644 --- a/tests/src/imap/mod.rs +++ b/tests/src/imap/mod.rs @@ -41,251 +41,244 @@ use serde_json::json; use std::{path::PathBuf, time::Instant}; use utils::map::vec_map::VecMap; -#[test] -fn imap_tests() { - tokio::runtime::Builder::new_multi_thread() - .thread_stack_size(8 * 1024 * 1024) // 8MB stack - .enable_all() +#[tokio::test(flavor = "multi_thread")] +pub async fn imap_tests() { + let mut test = TestServerBuilder::new("imap_tests") + .await + .with_default_listeners() + .await .build() - .unwrap() - .block_on(async { - let mut test = TestServerBuilder::new("imap_tests") - .await - .with_default_listeners() - .await - .build() - .await; + .await; - // Create admin account - let admin = test.create_admin_account("admin@example.com").await; + // Create admin account + let admin = test.create_admin_account("admin@example.com").await; - // Create test users - for (name, secret, description, aliases) in [ - ( - "jdoe@example.com", - "12345 + extra safety", - "John Doe", - &["john.doe@example.com"][..], - ), - ( - "jane.smith@example.com", - "abcde + extra safety", - "Jane Smith", - &["jane@example.com"][..], - ), - ( - "foobar@example.com", - "098765 + extra safety", - "Bill Foobar", - &["bill.foobar@example.com"][..], - ), - ( - "popper@example.com", - "a_pop3_safe_secret_with_extra_safety", - "Karl Popper", - &["karl.popper@example.com"][..], - ), - ( - "sgd@example.com", - "secret2 + extra safety", - "Sigmund Gudmund Dudmundsson", - &[][..], - ), - ( - "spamtrap@example.com", - "secret3 + extra safety", - "Spam Trap", - &[][..], - ), - ] { - let account = admin - .create_user_account( - name, - secret, - description, - aliases, - vec![Permission::UnlimitedRequests, Permission::UnlimitedUploads], + // Create test users + for (name, secret, description, aliases) in [ + ( + "jdoe@example.com", + "12345 + extra safety", + "John Doe", + &["john.doe@example.com"][..], + ), + ( + "jane.smith@example.com", + "abcde + extra safety", + "Jane Smith", + &["jane@example.com"][..], + ), + ( + "foobar@example.com", + "098765 + extra safety", + "Bill Foobar", + &["bill.foobar@example.com"][..], + ), + ( + "popper@example.com", + "a_pop3_safe_secret_with_extra_safety", + "Karl Popper", + &["karl.popper@example.com"][..], + ), + ( + "sgd@example.com", + "secret2 + extra safety", + "Sigmund Gudmund Dudmundsson", + &[][..], + ), + ( + "spamtrap@example.com", + "secret3 + extra safety", + "Spam Trap", + &[][..], + ), + ] { + let account = admin + .create_user_account( + name, + secret, + description, + aliases, + vec![Permission::UnlimitedRequests, Permission::UnlimitedUploads], + ) + .await; + test.insert_account(account); + } + + // Create test group + test.insert_account( + admin + .create_group_account("support@example.com", "Support Group", &[]) + .await, + ); + + // Add Jane to the Support group + let support_id = test.account("support@example.com").id(); + admin + .registry_update_object( + ObjectType::Account, + test.account("jane.smith@example.com").id(), + json!({ + "memberGroupIds": { support_id: true }, + }), + ) + .await; + + // Add test settings + admin + .registry_create_object(Imap { + allow_plain_text_auth: true, + ..Default::default() + }) + .await; + admin + .registry_create_object(MtaStageAuth { + require: Expression { + else_: "false".to_string(), + ..Default::default() + }, + ..Default::default() + }) + .await; + admin + .registry_create_object(SpamClassifier { + min_ham_samples: 10, + min_spam_samples: 10, + ..Default::default() + }) + .await; + admin + .registry_create_object(Email { + default_folders: VecMap::from_iter( + [ + (SpecialUse::Inbox, "Inbox"), + (SpecialUse::Sent, "Sent Items"), + (SpecialUse::Trash, "Deleted Items"), + (SpecialUse::Junk, "Junk Mail"), + (SpecialUse::Drafts, "Drafts"), + ] + .into_iter() + .map(|(use_, name)| { + ( + use_, + EmailFolder { + name: name.into(), + subscribe: false, + ..Default::default() + }, ) - .await; - test.insert_account(account); - } + }), + ), + ..Default::default() + }) + .await; + admin + .registry_create_object(MtaStageData { + add_delivered_to_header: false, + enable_spam_filter: Expression { + else_: "recipients[0] != 'popper@example.com'".into(), + ..Default::default() + }, + ..Default::default() + }) + .await; + admin + .registry_create_object(SpamTag::Score(SpamTagScore { + score: Float::new(10.0), + tag: "PROB_SPAM_LOW".into(), + })) + .await; + admin + .registry_create_object(SpamTag::Score(SpamTagScore { + score: Float::new(10.0), + tag: "PROB_SPAM_HIGH".into(), + })) + .await; + admin + .registry_create_object(SpamTag::Score(SpamTagScore { + score: Float::new(100.0), + tag: "SPAM_TRAP".into(), + })) + .await; + admin + .registry_create_object(MemoryLookupKey { + is_glob_pattern: true, + key: "spamtrap@*".into(), + namespace: "spam-traps".into(), + }) + .await; + admin.reload_settings().await; + admin.reload_lookup_stores().await; - // Create test group - test.insert_account( - admin - .create_group_account("support@example.com", "Support Group", &[]) - .await, - ); + test.insert_account(admin); - // Add Jane to the Support group - let support_id = test.account("support@example.com").id(); - admin - .registry_update_object( - ObjectType::Account, - test.account("jane.smith@example.com").id(), - json!({ - "memberGroupIds": { support_id: true }, - }), - ) - .await; + let start_time = Instant::now(); - // Add test settings - admin - .registry_create_object(Imap { - allow_plain_text_auth: true, - ..Default::default() - }) - .await; - admin - .registry_create_object(MtaStageAuth { - require: Expression { - else_: "false".to_string(), - ..Default::default() - }, - ..Default::default() - }) - .await; - admin - .registry_create_object(SpamClassifier { - min_ham_samples: 10, - min_spam_samples: 10, - ..Default::default() - }) - .await; - admin - .registry_create_object(Email { - default_folders: VecMap::from_iter( - [ - (SpecialUse::Inbox, "Inbox"), - (SpecialUse::Sent, "Sent Items"), - (SpecialUse::Trash, "Deleted Items"), - (SpecialUse::Junk, "Junk Mail"), - (SpecialUse::Drafts, "Drafts"), - ] - .into_iter() - .map(|(use_, name)| { - ( - use_, - EmailFolder { - name: name.into(), - subscribe: false, - ..Default::default() - }, - ) - }), - ), - ..Default::default() - }) - .await; - admin - .registry_create_object(MtaStageData { - add_delivered_to_header: false, - enable_spam_filter: Expression { - else_: "recipients[0] != 'popper@example.com'".into(), - ..Default::default() - }, - ..Default::default() - }) - .await; - admin - .registry_create_object(SpamTag::Score(SpamTagScore { - score: Float::new(10.0), - tag: "PROB_SPAM_LOW".into(), - })) - .await; - admin - .registry_create_object(SpamTag::Score(SpamTagScore { - score: Float::new(10.0), - tag: "PROB_SPAM_HIGH".into(), - })) - .await; - admin - .registry_create_object(SpamTag::Score(SpamTagScore { - score: Float::new(100.0), - tag: "SPAM_TRAP".into(), - })) - .await; - admin - .registry_create_object(MemoryLookupKey { - is_glob_pattern: true, - key: "spamtrap@*".into(), - namespace: "spam-traps".into(), - }) - .await; - admin.reload_settings().await; - admin.reload_lookup_stores().await; + // Body structure tests + body_structure::test(); - test.insert_account(admin); + // Connect to IMAP server + let mut imap_check = ImapConnection::connect(b"_y ").await; + let mut imap = ImapConnection::connect(b"_x ").await; + for imap in [&mut imap, &mut imap_check] { + imap.assert_read(Type::Untagged, ResponseType::Ok).await; + } - let start_time = Instant::now(); + // Unauthenticated tests + basic::test(&mut imap, &mut imap_check).await; - // Body structure tests - body_structure::test(); + // Login + let account = test.account("jdoe@example.com"); + for imap in [&mut imap, &mut imap_check] { + imap.authenticate(account.name(), account.secret()).await; + } - // Connect to IMAP server - let mut imap_check = ImapConnection::connect(b"_y ").await; - let mut imap = ImapConnection::connect(b"_x ").await; - for imap in [&mut imap, &mut imap_check] { - imap.assert_read(Type::Untagged, ResponseType::Ok).await; - } + // Delete folders + for mailbox in ["Drafts", "Junk Mail", "Sent Items"] { + imap.send(&format!("DELETE \"{}\"", mailbox)).await; + imap.assert_read(Type::Tagged, ResponseType::Ok).await; + } - // Unauthenticated tests - basic::test(&mut imap, &mut imap_check).await; + mailbox::test(&mut imap, &mut imap_check, &test).await; + append::test(&mut imap, &mut imap_check, &test).await; + search::test(&mut imap, &mut imap_check, &test).await; + fetch::test(&mut imap, &mut imap_check).await; + store::test(&mut imap, &mut imap_check, &test).await; + copy_move::test(&mut imap, &mut imap_check).await; + thread::test(&mut imap, &mut imap_check, &test).await; + idle::test(&mut imap, &mut imap_check, false).await; + condstore::test(&mut imap, &mut imap_check).await; + acl::test(&mut imap, &mut imap_check, &test).await; - // Login - let account = test.account("jdoe@example.com"); - for imap in [&mut imap, &mut imap_check] { - imap.authenticate(account.name(), account.secret()).await; - } + // Logout + for imap in [&mut imap, &mut imap_check] { + imap.send("UNAUTHENTICATE").await; + imap.assert_read(Type::Tagged, ResponseType::Ok).await; - // Delete folders - for mailbox in ["Drafts", "Junk Mail", "Sent Items"] { - imap.send(&format!("DELETE \"{}\"", mailbox)).await; - imap.assert_read(Type::Tagged, ResponseType::Ok).await; - } + imap.send("LOGOUT").await; + imap.assert_read(Type::Untagged, ResponseType::Bye).await; + } - mailbox::test(&mut imap, &mut imap_check, &test).await; - append::test(&mut imap, &mut imap_check, &test).await; - search::test(&mut imap, &mut imap_check, &test).await; - fetch::test(&mut imap, &mut imap_check).await; - store::test(&mut imap, &mut imap_check, &test).await; - copy_move::test(&mut imap, &mut imap_check).await; - thread::test(&mut imap, &mut imap_check, &test).await; - idle::test(&mut imap, &mut imap_check, false).await; - condstore::test(&mut imap, &mut imap_check).await; - acl::test(&mut imap, &mut imap_check, &test).await; + // Antispam training + antispam::test(&test).await; - // Logout - for imap in [&mut imap, &mut imap_check] { - imap.send("UNAUTHENTICATE").await; - imap.assert_read(Type::Tagged, ResponseType::Ok).await; + // Run ManageSieve tests + managesieve::test(&test).await; - imap.send("LOGOUT").await; - imap.assert_read(Type::Untagged, ResponseType::Bye).await; - } + // Run POP3 tests + pop::test(&test).await; - // Antispam training - antispam::test(&test).await; + // Print elapsed time + let elapsed = start_time.elapsed(); + println!( + "Elapsed: {}.{:03}s", + elapsed.as_secs(), + elapsed.subsec_millis() + ); - // Run ManageSieve tests - managesieve::test(&test).await; - - // Run POP3 tests - pop::test(&test).await; - - // Print elapsed time - let elapsed = start_time.elapsed(); - println!( - "Elapsed: {}.{:03}s", - elapsed.as_secs(), - elapsed.subsec_millis() - ); - - // Remove test data - if test.is_reset() { - test.temp_dir.delete(); - } - }); + // Remove test data + if test.is_reset() { + test.temp_dir.delete(); + } } pub fn expand_uid_list(list: &str) -> AHashSet { diff --git a/tests/src/jmap/mod.rs b/tests/src/jmap/mod.rs index cf839b2c..2ad867d7 100644 --- a/tests/src/jmap/mod.rs +++ b/tests/src/jmap/mod.rs @@ -23,201 +23,194 @@ pub mod files; pub mod mail; pub mod principal; -#[test] -fn jmap_tests() { - tokio::runtime::Builder::new_multi_thread() - .thread_stack_size(8 * 1024 * 1024) // 8MB stack - .enable_all() +#[tokio::test(flavor = "multi_thread")] +pub async fn jmap_tests() { + let mut test = TestServerBuilder::new("jmap_tests") + .await + .with_default_listeners() + .await .build() - .unwrap() - .block_on(async { - let mut test = TestServerBuilder::new("jmap_tests") - .await - .with_default_listeners() - .await - .build() - .await; + .await; - // Create admin account - let admin = test.create_admin_account("admin@example.com").await; + // Create admin account + let admin = test.create_admin_account("admin@example.com").await; - // Create test users - for (name, secret, description, aliases) in [ - ( - "jdoe@example.com", - "12345 + extra safety", - "John Doe", - &["john.doe@example.com"][..], - ), - ( - "jane.smith@example.com", - "abcde + extra safety", - "Jane Smith", - &["jane@example.com"], - ), - ( - "bill@example.com", - "098765 + extra safety", - "Bill Foobar", - &["bill.foobar@example.com"], - ), - ( - "robert@example.com", - "aabbcc + extra safety", - "Robert Foobar", - &[][..], - ), - ] { - let account = admin - .create_user_account( - name, - secret, - description, - aliases, - vec![Permission::UnlimitedRequests, Permission::UnlimitedUploads], - ) - .await; - test.insert_account(account); - } + // Create test users + for (name, secret, description, aliases) in [ + ( + "jdoe@example.com", + "12345 + extra safety", + "John Doe", + &["john.doe@example.com"][..], + ), + ( + "jane.smith@example.com", + "abcde + extra safety", + "Jane Smith", + &["jane@example.com"], + ), + ( + "bill@example.com", + "098765 + extra safety", + "Bill Foobar", + &["bill.foobar@example.com"], + ), + ( + "robert@example.com", + "aabbcc + extra safety", + "Robert Foobar", + &[][..], + ), + ] { + let account = admin + .create_user_account( + name, + secret, + description, + aliases, + vec![Permission::UnlimitedRequests, Permission::UnlimitedUploads], + ) + .await; + test.insert_account(account); + } - // Create test group - test.insert_account( - admin - .create_group_account("sales@example.com", "Sales Group", &[]) - .await, - ); + // Create test group + test.insert_account( + admin + .create_group_account("sales@example.com", "Sales Group", &[]) + .await, + ); - // Add test settings - admin - .registry_create_object(Imap { - allow_plain_text_auth: true, - ..Default::default() - }) - .await; - admin - .registry_create_object(Jmap { - set_max_objects: 100_000, - get_max_results: 100_000, - event_source_throttle: 500u64.into(), - push_throttle: 500u64.into(), - websocket_throttle: 500u64.into(), - push_attempt_wait: 500u64.into(), - ..Default::default() - }) - .await; - admin - .registry_create_object(MtaStageAuth { - require: Expression { - else_: "false".to_string(), - ..Default::default() + // Add test settings + admin + .registry_create_object(Imap { + allow_plain_text_auth: true, + ..Default::default() + }) + .await; + admin + .registry_create_object(Jmap { + set_max_objects: 100_000, + get_max_results: 100_000, + event_source_throttle: 500u64.into(), + push_throttle: 500u64.into(), + websocket_throttle: 500u64.into(), + push_attempt_wait: 500u64.into(), + ..Default::default() + }) + .await; + admin + .registry_create_object(MtaStageAuth { + require: Expression { + else_: "false".to_string(), + ..Default::default() + }, + ..Default::default() + }) + .await; + admin + .registry_create_object(CalendarAlarm { + min_trigger_interval: 1000u64.into(), + ..Default::default() + }) + .await; + admin + .registry_create_object(Sharing { + allow_directory_queries: true, + ..Default::default() + }) + .await; + admin + .registry_create_object(MtaOutboundStrategy { + route: Expression { + match_: List::from_iter([ + ExpressionMatch { + if_: "rcpt_domain == 'example.com'".into(), + then: "'local'".into(), }, - ..Default::default() - }) - .await; - admin - .registry_create_object(CalendarAlarm { - min_trigger_interval: 1000u64.into(), - ..Default::default() - }) - .await; - admin - .registry_create_object(Sharing { - allow_directory_queries: true, - ..Default::default() - }) - .await; - admin - .registry_create_object(MtaOutboundStrategy { - route: Expression { - match_: List::from_iter([ - ExpressionMatch { - if_: "rcpt_domain == 'example.com'".into(), - then: "'local'".into(), - }, - ExpressionMatch { - if_: concat!( - "contains(['remote.org', 'foobar.com', ", - "'test.com', 'other_domain.com'], rcpt_domain)" - ) - .into(), - then: "'mock-smtp'".into(), - }, - ]), - else_: "'mx'".to_string(), + ExpressionMatch { + if_: concat!( + "contains(['remote.org', 'foobar.com', ", + "'test.com', 'other_domain.com'], rcpt_domain)" + ) + .into(), + then: "'mock-smtp'".into(), }, - ..Default::default() - }) - .await; - admin - .registry_create_object(MtaRoute::Relay(MtaRouteRelay { - address: "127.0.0.1".into(), - port: 9999, - allow_invalid_certs: true, - implicit_tls: false, - name: "mock-smtp".into(), - protocol: MtaProtocol::Smtp, - ..Default::default() - })) - .await; - admin - .registry_create_object(MtaExtensions { - future_release: Expression { - match_: List::from_iter([ExpressionMatch { - if_: "!is_empty(authenticated_as)".into(), - then: "99999999d".into(), - }]), - else_: "false".to_string(), - }, - ..Default::default() - }) - .await; - admin.reload_settings().await; + ]), + else_: "'mx'".to_string(), + }, + ..Default::default() + }) + .await; + admin + .registry_create_object(MtaRoute::Relay(MtaRouteRelay { + address: "127.0.0.1".into(), + port: 9999, + allow_invalid_certs: true, + implicit_tls: false, + name: "mock-smtp".into(), + protocol: MtaProtocol::Smtp, + ..Default::default() + })) + .await; + admin + .registry_create_object(MtaExtensions { + future_release: Expression { + match_: List::from_iter([ExpressionMatch { + if_: "!is_empty(authenticated_as)".into(), + then: "99999999d".into(), + }]), + else_: "false".to_string(), + }, + ..Default::default() + }) + .await; + admin.reload_settings().await; - test.insert_account(admin); + test.insert_account(admin); - /*mail::get::test(&test).await; - mail::set::test(&test).await; - mail::parse::test(&test).await; - mail::query::test(&test).await; - mail::search_snippet::test(&test).await; - mail::changes::test(&test).await; - mail::query_changes::test(&test).await; - mail::copy::test(&test).await; - mail::thread_get::test(&test).await;*/ - mail::thread_merge::test(&test).await; - mail::mailbox::test(&test).await; - mail::acl::test(&test).await; - mail::sieve_script::test(&test).await; - mail::vacation_response::test(&test).await; - mail::submission::test(&test).await; + mail::get::test(&test).await; + mail::set::test(&test).await; + mail::parse::test(&test).await; + mail::query::test(&test).await; + mail::search_snippet::test(&test).await; + mail::changes::test(&test).await; + mail::query_changes::test(&test).await; + mail::copy::test(&test).await; + mail::thread_get::test(&test).await; + mail::thread_merge::test(&test).await; + mail::mailbox::test(&test).await; + mail::acl::test(&test).await; + mail::sieve_script::test(&test).await; + mail::vacation_response::test(&test).await; + mail::submission::test(&test).await; - core::event_source::test(&test).await; - core::websocket::test(&test).await; - core::push_subscription::test(&test).await; - core::blob::test(&test).await; + core::event_source::test(&test).await; + core::websocket::test(&test).await; + core::push_subscription::test(&test).await; + core::blob::test(&test).await; - contacts::addressbook::test(&test).await; - contacts::contact::test(&test).await; - contacts::acl::test(&test).await; + contacts::addressbook::test(&test).await; + contacts::contact::test(&test).await; + contacts::acl::test(&test).await; - files::node::test(&test).await; - files::acl::test(&test).await; + files::node::test(&test).await; + files::acl::test(&test).await; - calendar::calendars::test(&test).await; - calendar::event::test(&test).await; - calendar::notification::test(&test).await; - calendar::alarm::test(&test).await; + calendar::calendars::test(&test).await; + calendar::event::test(&test).await; + calendar::notification::test(&test).await; + calendar::alarm::test(&test).await; - calendar::identity::test(&test).await; - calendar::acl::test(&test).await; + calendar::identity::test(&test).await; + calendar::acl::test(&test).await; - principal::get::test(&test).await; - principal::availability::test(&test).await; + principal::get::test(&test).await; + principal::availability::test(&test).await; - if test.is_reset() { - test.temp_dir.delete(); - } - }); + if test.is_reset() { + test.temp_dir.delete(); + } } pub fn find_values(string: &str, name: &str) -> Vec { diff --git a/tests/src/smtp/inbound/rewrite.rs b/tests/src/smtp/inbound/rewrite.rs index b97f1e3c..07198e9e 100644 --- a/tests/src/smtp/inbound/rewrite.rs +++ b/tests/src/smtp/inbound/rewrite.rs @@ -27,49 +27,43 @@ if allof( envelope :localpart :contains "to" ".", } "#; -#[test] -fn address_rewrite() { - tokio::runtime::Builder::new_multi_thread() - .thread_stack_size(8 * 1024 * 1024) // 8MB stack - .enable_all() +#[tokio::test(flavor = "multi_thread")] +pub async fn address_rewrite() { + let mut test = TestServerBuilder::new("smtp_rewrite_test") + .await + .with_http_listener(19007) + .await + .disable_services() .build() - .unwrap() - .block_on(async { - let mut test = TestServerBuilder::new("smtp_rewrite_test") - .await - .with_http_listener(19007) - .await - .disable_services() - .build() - .await; + .await; - // Add test settings - let admin = test.account("admin"); - admin.mta_no_auth().await; - admin - .registry_create_object(MtaStageMail { - rewrite: Expression { - match_: List::from_iter([ExpressionMatch { - if_: concat!( - "ends_with(sender_domain, '.foobar.net') & ", - "matches('^([^.]+)@([^.]+)\\.(.+)$', sender)" - ) - .into(), - then: "$1 + '+' + $2 + '@' + $3".into(), - }]), - else_: "false".into(), - }, - script: Expression { - match_: List::from_iter([ExpressionMatch { - if_: "sender_domain = 'foobar.org'".into(), - then: "'mail'".into(), - }]), - else_: "false".into(), - }, - ..Default::default() - }) - .await; - admin + // Add test settings + let admin = test.account("admin"); + admin.mta_no_auth().await; + admin + .registry_create_object(MtaStageMail { + rewrite: Expression { + match_: List::from_iter([ExpressionMatch { + if_: concat!( + "ends_with(sender_domain, '.foobar.net') & ", + "matches('^([^.]+)@([^.]+)\\.(.+)$', sender)" + ) + .into(), + then: "$1 + '+' + $2 + '@' + $3".into(), + }]), + else_: "false".into(), + }, + script: Expression { + match_: List::from_iter([ExpressionMatch { + if_: "sender_domain = 'foobar.org'".into(), + then: "'mail'".into(), + }]), + else_: "false".into(), + }, + ..Default::default() + }) + .await; + admin .registry_create_object(MtaStageRcpt { rewrite: Expression { match_: List::from_iter([ExpressionMatch { @@ -93,81 +87,80 @@ fn address_rewrite() { ..Default::default() }) .await; - admin - .registry_create_object(SieveSystemInterpreter { - default_from_address: Expression { - else_: "'sieve@foobar.org'".into(), - ..Default::default() - }, + admin + .registry_create_object(SieveSystemInterpreter { + default_from_address: Expression { + else_: "'sieve@foobar.org'".into(), + ..Default::default() + }, - default_from_name: Expression { - else_: "'Sieve Daemon'".into(), - ..Default::default() - }, - default_return_path: Expression { - else_: "''".into(), - ..Default::default() - }, - message_id_hostname: Some("'mx.foobar.org'".into()), - duplicate_expiry: (86_400u64 * 100 * 7).into(), - max_cpu_cycles: 10000, - max_nested_includes: 5, - max_out_messages: 5, - max_received_headers: 50, - max_redirects: 3, - ..Default::default() - }) - .await; - for (name, contents) in [("mail", MAIL_SCRIPT), ("rcpt", MAIL_RCPT)] { - admin - .registry_create_object(SieveSystemScript { - name: name.to_string(), - contents: contents.to_string(), - is_active: true, - ..Default::default() - }) - .await; - } - admin.reload_settings().await; - test.reload_core(); + default_from_name: Expression { + else_: "'Sieve Daemon'".into(), + ..Default::default() + }, + default_return_path: Expression { + else_: "''".into(), + ..Default::default() + }, + message_id_hostname: Some("'mx.foobar.org'".into()), + duplicate_expiry: (86_400u64 * 100 * 7).into(), + max_cpu_cycles: 10000, + max_nested_includes: 5, + max_out_messages: 5, + max_received_headers: 50, + max_redirects: 3, + ..Default::default() + }) + .await; + for (name, contents) in [("mail", MAIL_SCRIPT), ("rcpt", MAIL_RCPT)] { + admin + .registry_create_object(SieveSystemScript { + name: name.to_string(), + contents: contents.to_string(), + is_active: true, + ..Default::default() + }) + .await; + } + admin.reload_settings().await; + test.reload_core(); - // Init session - let mut session = test.new_mta_session(); - session.data.remote_ip_str = "10.0.0.1".into(); - session.eval_session_params().await; - session.ehlo("mx.doe.org").await; + // Init session + let mut session = test.new_mta_session(); + session.data.remote_ip_str = "10.0.0.1".into(); + session.eval_session_params().await; + session.ehlo("mx.doe.org").await; - // Sender rewrite using regex - session.mail_from("bill@doe.foobar.net", "250").await; - assert_eq!( - session.data.mail_from.as_ref().unwrap().address, - "bill+doe@foobar.net" - ); - session.reset(); + // Sender rewrite using regex + session.mail_from("bill@doe.foobar.net", "250").await; + assert_eq!( + session.data.mail_from.as_ref().unwrap().address, + "bill+doe@foobar.net" + ); + session.reset(); - // Sender rewrite using sieve - session.mail_from("this_is_admin@foobar.org", "250").await; - assert_eq!( - session.data.mail_from.as_ref().unwrap().address_lcase, - "mailer-daemon@foobar.org" - ); + // Sender rewrite using sieve + session.mail_from("this_is_admin@foobar.org", "250").await; + assert_eq!( + session.data.mail_from.as_ref().unwrap().address_lcase, + "mailer-daemon@foobar.org" + ); - // Recipient rewrite using regex - session.rcpt_to("mary.smith@foobar.net", "250").await; - assert_eq!( - session.data.rcpt_to.last().unwrap().address, - "mary+smith@foobar.net" - ); + // Recipient rewrite using regex + session.rcpt_to("mary.smith@foobar.net", "250").await; + assert_eq!( + session.data.rcpt_to.last().unwrap().address, + "mary+smith@foobar.net" + ); - // Remove duplicates - session.rcpt_to("mary.smith@foobar.net", "250").await; - assert_eq!(session.data.rcpt_to.len(), 1); + // Remove duplicates + session.rcpt_to("mary.smith@foobar.net", "250").await; + assert_eq!(session.data.rcpt_to.len(), 1); - // Recipient rewrite using sieve - session.rcpt_to("m.a.r.y.s.m.i.t.h@foobar.org", "250").await; - assert_eq!( - session.data.rcpt_to.last().unwrap().address, - "marysmith@foobar.org" - ); - }); + // Recipient rewrite using sieve + session.rcpt_to("m.a.r.y.s.m.i.t.h@foobar.org", "250").await; + assert_eq!( + session.data.rcpt_to.last().unwrap().address, + "marysmith@foobar.org" + ); } diff --git a/tests/src/system/mod.rs b/tests/src/system/mod.rs index 16218c22..037f165f 100644 --- a/tests/src/system/mod.rs +++ b/tests/src/system/mod.rs @@ -21,65 +21,58 @@ pub mod tenant; use crate::utils::server::TestServerBuilder; use registry::schema::structs::{Expression, Imap, MtaStageAuth}; -#[test] -fn system_tests() { - tokio::runtime::Builder::new_multi_thread() - .thread_stack_size(8 * 1024 * 1024) // 8MB stack - .enable_all() +#[tokio::test(flavor = "multi_thread")] +pub async fn system_tests() { + let mut test = TestServerBuilder::new("system_tests") + .await + .with_default_listeners() + .await + .with_object(Imap { + allow_plain_text_auth: true, + ..Default::default() + }) + .await + .with_object(MtaStageAuth { + require: Expression { + else_: "false".to_string(), + ..Default::default() + }, + ..Default::default() + }) + .await .build() - .unwrap() - .block_on(async { - let mut test = TestServerBuilder::new("system_tests") - .await - .with_default_listeners() - .await - .with_object(Imap { - allow_plain_text_auth: true, - ..Default::default() - }) - .await - .with_object(MtaStageAuth { - require: Expression { - else_: "false".to_string(), - ..Default::default() - }, - ..Default::default() - }) - .await - .build() - .await; + .await; - // Create admin account - let admin = test - .create_user_account( - "admin", - "admin@example.org", - "these_pretzels_are_making_me_thirsty", - &[], - "Admin", - ) - .await; - test.account("admin") - .assign_roles_to_account(admin.id(), &["user", "system"]) - .await; - test.insert_account(admin); + // Create admin account + let admin = test + .create_user_account( + "admin", + "admin@example.org", + "these_pretzels_are_making_me_thirsty", + &[], + "Admin", + ) + .await; + test.account("admin") + .assign_roles_to_account(admin.id(), &["user", "system"]) + .await; + test.insert_account(admin); - directory::test(&test).await; - authentication::test(&test).await; - oidc::test(&mut test).await; - authorization::test(&mut test).await; - tenant::test(&mut test).await; - security::test(&mut test).await; - quota::test(&mut test).await; - purge::test(&mut test).await; - delivery::test(&mut test).await; - crypto::test(&mut test).await; - antispam::test(&mut test).await; - archiving::test(&mut test).await; - task::test(&mut test).await; + directory::test(&test).await; + authentication::test(&test).await; + oidc::test(&mut test).await; + authorization::test(&mut test).await; + tenant::test(&mut test).await; + security::test(&mut test).await; + quota::test(&mut test).await; + purge::test(&mut test).await; + delivery::test(&mut test).await; + crypto::test(&mut test).await; + antispam::test(&mut test).await; + archiving::test(&mut test).await; + task::test(&mut test).await; - if test.is_reset() { - test.temp_dir.delete(); - } - }); + if test.is_reset() { + test.temp_dir.delete(); + } } diff --git a/tests/src/webdav/mod.rs b/tests/src/webdav/mod.rs index f54d53d8..f3286a35 100644 --- a/tests/src/webdav/mod.rs +++ b/tests/src/webdav/mod.rs @@ -40,180 +40,173 @@ pub mod prop; pub mod put_get; pub mod sync; -#[test] -fn webdav_tests() { - tokio::runtime::Builder::new_multi_thread() - .thread_stack_size(8 * 1024 * 1024) // 8MB stack - .enable_all() +#[tokio::test(flavor = "multi_thread")] +pub async fn webdav_tests() { + // Prepare settings + let assisted_discovery = std::env::var("ASSISTED_DISCOVERY").unwrap_or_default() == "1"; + + let mut test = TestServerBuilder::new("webdav_tests") + .await + .with_default_listeners() + .await .build() - .unwrap() - .block_on(async { - // Prepare settings - let assisted_discovery = std::env::var("ASSISTED_DISCOVERY").unwrap_or_default() == "1"; + .await; - let mut test = TestServerBuilder::new("webdav_tests") - .await - .with_default_listeners() - .await - .build() - .await; + // Create admin account + let admin = test.create_admin_account("admin@example.com").await; - // Create admin account - let admin = test.create_admin_account("admin@example.com").await; - - // Create test users - for (name, secret, description, aliases) in [ - ( - "john@example.com", - "secret2 + some more text", - "John Doe", - &["jdoe@example.com"], - ), - ( - "jane@example.com", - "secret3 + some more text", - "Jane Doe-Smith", - &["jane.smith@example.com"], - ), - ( - "bill@example.com", - "secret4 + some more text", - "Bill Foobar", - &["bill@example.com"], - ), - ( - "mike@example.com", - "secret5 + some more text", - "Mike Noquota", - &["mike@example.com"], - ), - ] { - let account = admin - .create_user_account( - name, - secret, - description, - aliases, - vec![ - Permission::UnlimitedRequests, - Permission::UnlimitedUploads, - Permission::DavPrincipalList, - Permission::DavPrincipalSearch, - ], - ) - .await; - if name == "mike@example.com" { - admin - .registry_update_object( - ObjectType::Account, - account.id(), - json!({ - Property::Quotas: { StorageQuota::MaxDiskQuota.as_str(): 1024} - }), - ) - .await; - } - - test.insert_account(account); - } - - // Create test group - test.insert_account( - admin - .create_group_account("support@example.com", "Support Group", &[]) - .await, - ); - - // Add Jane to the Support group - let support_id = test.account("support@example.com").id(); + // Create test users + for (name, secret, description, aliases) in [ + ( + "john@example.com", + "secret2 + some more text", + "John Doe", + &["jdoe@example.com"], + ), + ( + "jane@example.com", + "secret3 + some more text", + "Jane Doe-Smith", + &["jane.smith@example.com"], + ), + ( + "bill@example.com", + "secret4 + some more text", + "Bill Foobar", + &["bill@example.com"], + ), + ( + "mike@example.com", + "secret5 + some more text", + "Mike Noquota", + &["mike@example.com"], + ), + ] { + let account = admin + .create_user_account( + name, + secret, + description, + aliases, + vec![ + Permission::UnlimitedRequests, + Permission::UnlimitedUploads, + Permission::DavPrincipalList, + Permission::DavPrincipalSearch, + ], + ) + .await; + if name == "mike@example.com" { admin .registry_update_object( ObjectType::Account, - test.account("jane@example.com").id(), + account.id(), json!({ - "memberGroupIds": { support_id: true }, + Property::Quotas: { StorageQuota::MaxDiskQuota.as_str(): 1024} }), ) .await; + } - // Add test settings - admin - .registry_update_setting( - SystemSettings { - default_hostname: "webdav.example.org".to_string(), - ..Default::default() - }, - &[Property::DefaultHostname], - ) - .await; - admin - .registry_create_object(MtaStageAuth { - require: Expression { - else_: "false".to_string(), - ..Default::default() - }, - ..Default::default() - }) - .await; - admin - .registry_create_object(CalendarAlarm { - min_trigger_interval: 1000u64.into(), - ..Default::default() - }) - .await; - admin - .registry_create_object(Sharing { - allow_directory_queries: true, - ..Default::default() - }) - .await; - admin - .registry_create_object(CalendarScheduling { - auto_add_invitations: true, - ..Default::default() - }) - .await; - admin - .registry_create_object(WebDav { - enable_assisted_discovery: assisted_discovery, - ..Default::default() - }) - .await; - admin.reload_settings().await; + test.insert_account(account); + } - test.insert_account(admin); + // Create test group + test.insert_account( + admin + .create_group_account("support@example.com", "Support Group", &[]) + .await, + ); - let start_time = Instant::now(); - //test_build_itip_templates(&test).await; - basic::test(&test).await; - put_get::test(&test).await; - mkcol::test(&test).await; - copy_move::test(&test, assisted_discovery).await; - prop::test(&test, assisted_discovery).await; - multiget::test(&test).await; - sync::test(&test).await; - lock::test(&test).await; - principals::test(&test, assisted_discovery).await; - acl::test(&test).await; - card_query::test(&test).await; - cal_query::test(&test).await; - cal_alarm::test(&test).await; - cal_itip::test(); - cal_scheduling::test(&test).await; + // Add Jane to the Support group + let support_id = test.account("support@example.com").id(); + admin + .registry_update_object( + ObjectType::Account, + test.account("jane@example.com").id(), + json!({ + "memberGroupIds": { support_id: true }, + }), + ) + .await; - // Print elapsed time - let elapsed = start_time.elapsed(); - println!( - "Elapsed: {}.{:03}s", - elapsed.as_secs(), - elapsed.subsec_millis() - ); + // Add test settings + admin + .registry_update_setting( + SystemSettings { + default_hostname: "webdav.example.org".to_string(), + ..Default::default() + }, + &[Property::DefaultHostname], + ) + .await; + admin + .registry_create_object(MtaStageAuth { + require: Expression { + else_: "false".to_string(), + ..Default::default() + }, + ..Default::default() + }) + .await; + admin + .registry_create_object(CalendarAlarm { + min_trigger_interval: 1000u64.into(), + ..Default::default() + }) + .await; + admin + .registry_create_object(Sharing { + allow_directory_queries: true, + ..Default::default() + }) + .await; + admin + .registry_create_object(CalendarScheduling { + auto_add_invitations: true, + ..Default::default() + }) + .await; + admin + .registry_create_object(WebDav { + enable_assisted_discovery: assisted_discovery, + ..Default::default() + }) + .await; + admin.reload_settings().await; - // Remove test data - if test.is_reset() { - test.temp_dir.delete(); - } - }); + test.insert_account(admin); + + let start_time = Instant::now(); + //test_build_itip_templates(&test).await; + basic::test(&test).await; + put_get::test(&test).await; + mkcol::test(&test).await; + copy_move::test(&test, assisted_discovery).await; + prop::test(&test, assisted_discovery).await; + multiget::test(&test).await; + sync::test(&test).await; + lock::test(&test).await; + principals::test(&test, assisted_discovery).await; + acl::test(&test).await; + card_query::test(&test).await; + cal_query::test(&test).await; + cal_alarm::test(&test).await; + cal_itip::test(); + cal_scheduling::test(&test).await; + + // Print elapsed time + let elapsed = start_time.elapsed(); + println!( + "Elapsed: {}.{:03}s", + elapsed.as_secs(), + elapsed.subsec_millis() + ); + + // Remove test data + if test.is_reset() { + test.temp_dir.delete(); + } } pub trait DavResourcesTest {