# Strip report: upstream v0.16.24 (af37a2349817) - Enterprise-only files removed or emptied: **63** - Enterprise-only snippets removed: **118** in 50 files - Cargo edits turning `enterprise` off: **25** - Dangling module declarations removed: **5** - Verification: **3 problems** - Left for the rebuilt features to replace: 19 `enterprise` feature gates in 18 files; 0 `is_enterprise_edition()` checks in 0 files - Third-party code: 14 files, **0** not in THIRD-PARTY.md - Renamed identifiers: 62 in 18 files - Build check: **3 errors**, 16 expected errors in 7 rebuilt-feature tests, 14 imports left unused - Upstream schema flags 9 objects and 30 fields as Enterprise ## Removed files - `crates/common/src/enterprise/alerts.rs` - `crates/common/src/enterprise/config.rs` - `crates/common/src/enterprise/license.rs` - `crates/common/src/enterprise/llm.rs` - `crates/common/src/enterprise/masked.rs` - `crates/common/src/enterprise/mod.rs` - `crates/common/src/telemetry/metrics/store.rs` - `crates/common/src/telemetry/metrics/test_data.rs` - `crates/common/src/telemetry/tracers/store.rs` - `crates/http/src/api/telemetry.rs` - `crates/jmap/src/registry/mapping/archived_item.rs` - `crates/jmap/src/registry/mapping/masked_email.rs` - `crates/jmap/src/registry/mapping/telemetry.rs` - `crates/scim-proto/src/attributes.rs` - `crates/scim-proto/src/etag.rs` - `crates/scim-proto/src/filter.rs` - `crates/scim-proto/src/json.rs` - `crates/scim-proto/src/lib.rs` - `crates/scim-proto/src/message/bulk.rs` - `crates/scim-proto/src/message/error.rs` - `crates/scim-proto/src/message/list.rs` - `crates/scim-proto/src/message/mod.rs` - `crates/scim-proto/src/message/patch.rs` - `crates/scim-proto/src/message/search.rs` - `crates/scim-proto/src/path.rs` - `crates/scim-proto/src/schema/group.rs` - `crates/scim-proto/src/schema/mod.rs` - `crates/scim-proto/src/schema/spc.rs` - `crates/scim-proto/src/schema/user.rs` - `crates/scim/src/auth.rs` - `crates/scim/src/bulk.rs` - `crates/scim/src/context.rs` - `crates/scim/src/discovery.rs` - `crates/scim/src/error.rs` - `crates/scim/src/groups/get.rs` - `crates/scim/src/groups/mod.rs` - `crates/scim/src/groups/patch.rs` - `crates/scim/src/groups/set.rs` - `crates/scim/src/lib.rs` - `crates/scim/src/query/cursor.rs` - `crates/scim/src/query/mod.rs` - `crates/scim/src/request.rs` - `crates/scim/src/users/get.rs` - `crates/scim/src/users/mod.rs` - `crates/scim/src/users/patch.rs` - `crates/scim/src/users/set.rs` - `crates/spam-filter/src/analysis/llm.rs` - `crates/store/src/backend/composite/mod.rs` - `crates/store/src/backend/composite/read_replica.rs` - `crates/store/src/backend/composite/sharded_blob.rs` - `crates/store/src/backend/composite/sharded_lookup.rs` - `crates/trc/src/serializers/binary.rs` - `tests/src/directory/oidc.rs` - `tests/src/scim/auth.rs` - `tests/src/scim/bulk.rs` - `tests/src/scim/discovery.rs` - `tests/src/scim/groups.rs` - `tests/src/scim/limits.rs` - `tests/src/scim/mod.rs` - `tests/src/scim/query.rs` - `tests/src/scim/users.rs` - `tests/src/system/archiving.rs` - `tests/src/system/tenant.rs` ## Removed snippets - `crates/common/src/auth/authentication.rs`: 3 - `crates/common/src/auth/mod.rs`: 2 - `crates/common/src/auth/permissions.rs`: 1 - `crates/common/src/cache/directory.rs`: 6 - `crates/common/src/cache/invalidate.rs`: 1 - `crates/common/src/cache/principals.rs`: 2 - `crates/common/src/cache/reload.rs`: 1 - `crates/common/src/config/mod.rs`: 2 - `crates/common/src/config/telemetry.rs`: 4 - `crates/common/src/lib.rs`: 2 - `crates/common/src/manager/boot.rs`: 1 - `crates/common/src/network/mta.rs`: 1 - `crates/common/src/scripts/plugins/llm_prompt.rs`: 1 - `crates/common/src/storage/quota.rs`: 2 - `crates/common/src/telemetry/metrics/mod.rs`: 1 - `crates/common/src/telemetry/metrics/prometheus.rs`: 1 - `crates/common/src/telemetry/mod.rs`: 1 - `crates/common/src/telemetry/tracers/mod.rs`: 1 - `crates/http/src/api/mod.rs`: 4 - `crates/http/src/auth/permissions.rs`: 1 - `crates/http/src/request.rs`: 4 - `crates/jmap/src/registry/get.rs`: 1 - `crates/jmap/src/registry/mapping/mod.rs`: 1 - `crates/jmap/src/registry/mapping/principal.rs`: 3 - `crates/jmap/src/registry/mapping/queued_message.rs`: 1 - `crates/jmap/src/registry/mapping/task.rs`: 1 - `crates/jmap/src/registry/mod.rs`: 1 - `crates/jmap/src/registry/query.rs`: 1 - `crates/jmap/src/registry/set.rs`: 2 - `crates/main/src/main.rs`: 1 - `crates/services/src/task_manager/alarm.rs`: 1 - `crates/services/src/task_manager/imip.rs`: 1 - `crates/services/src/task_manager/index.rs`: 2 - `crates/services/src/task_manager/maintenance.rs`: 3 - `crates/services/src/task_manager/scheduler.rs`: 8 - `crates/spam-filter/src/analysis/mod.rs`: 1 - `crates/spam-filter/src/analysis/score.rs`: 2 - `crates/store/src/backend/mod.rs`: 1 - `crates/store/src/backend/mysql/main.rs`: 1 - `crates/store/src/backend/postgres/main.rs`: 1 - `crates/store/src/build/blob.rs`: 2 - `crates/store/src/build/lookup.rs`: 1 - `crates/store/src/build/memory.rs`: 2 - `crates/store/src/dispatch/blob.rs`: 6 - `crates/store/src/dispatch/lookup.rs`: 10 - `crates/store/src/dispatch/mod.rs`: 1 - `crates/store/src/dispatch/search.rs`: 6 - `crates/store/src/dispatch/store.rs`: 8 - `crates/store/src/lib.rs`: 6 - `crates/trc/src/serializers/mod.rs`: 1 ## Dangling module declarations removed - `crates/common/src/telemetry/metrics/mod.rs:12`: `mod test_data` (#[cfg(any(feature = "dev_mode", feature = "test_mode"))] / pub mod test_data;) - `tests/src/directory/mod.rs:11`: `mod oidc` (pub mod oidc;) - `tests/src/lib.rs:27`: `mod scim` (#[cfg(test)] / pub mod scim;) - `tests/src/system/mod.rs:8`: `mod archiving` (pub mod archiving;) - `tests/src/system/mod.rs:19`: `mod tenant` (pub mod tenant;) ## Cargo edits - `crates/main/Cargo.toml:50`: `default = ["rocks", "enterprise"]` → `default = ["rocks"]` - `tests/Cargo.toml:22`: `store = { path = "../crates/store", features = ["test_mode", "enterprise"] }` → `store = { path = "../crates/store", features = ["test_mode"] }` - `tests/Cargo.toml:24`: `directory = { path = "../crates/directory", features = ["test_mode", "enterprise"] }` → `directory = { path = "../crates/directory", features = ["test_mode"] }` - `tests/Cargo.toml:25`: `coordinator = { path = "../crates/coordinator", features = ["test_mode", "enterprise"] }` → `coordinator = { path = "../crates/coordinator", features = ["test_mode"] }` - `tests/Cargo.toml:26`: `jmap = { path = "../crates/jmap", features = ["test_mode", "enterprise"] }` → `jmap = { path = "../crates/jmap", features = ["test_mode"] }` - `tests/Cargo.toml:35`: `http = { path = "../crates/http", features = ["test_mode", "enterprise"] }` → `http = { path = "../crates/http", features = ["test_mode"] }` - `tests/Cargo.toml:37`: `scim = { path = "../crates/scim", features = ["test_mode", "enterprise"] }` → `scim = { path = "../crates/scim", features = ["test_mode"] }` - `tests/Cargo.toml:39`: `services = { path = "../crates/services", features = ["test_mode", "enterprise"] }` → `services = { path = "../crates/services", features = ["test_mode"] }` - `tests/Cargo.toml:41`: `smtp = { path = "../crates/smtp", features = ["test_mode", "enterprise"] }` → `smtp = { path = "../crates/smtp", features = ["test_mode"] }` - `tests/Cargo.toml:42`: `common = { path = "../crates/common", features = ["test_mode", "enterprise"] }` → `common = { path = "../crates/common", features = ["test_mode"] }` - `tests/Cargo.toml:44`: `email = { path = "../crates/email", features = ["test_mode", "enterprise"] }` → `email = { path = "../crates/email", features = ["test_mode"] }` - `tests/Cargo.toml:45`: `spam-filter = { path = "../crates/spam-filter", features = ["test_mode", "enterprise"] }` → `spam-filter = { path = "../crates/spam-filter", features = ["test_mode"] }` - `tests/Cargo.toml:46`: `trc = { path = "../crates/trc", features = ["enterprise"] }` → `trc = { path = "../crates/trc", features = [] }` - `tests/Cargo.toml:47`: `managesieve = { path = "../crates/managesieve", features = ["test_mode", "enterprise"] }` → `managesieve = { path = "../crates/managesieve", features = ["test_mode"] }` - `.github/workflows/ci.yml:341`: `cargo build --release --target ${{matrix.target}} -p stalwart --no-default-features --features "sqlite postgres mysql rocks s3 redis azure nats enterprise"` → `cargo build --release --target ${{matrix.target}} -p stalwart --no-default-features --features "sqlite postgres mysql rocks s3 redis azure nats"` - `.github/workflows/ci.yml:379`: `# cargo build --release --target ${{matrix.target}} -p stalwart --no-default-features --features "foundationdb s3 redis nats enterprise"` → `# cargo build --release --target ${{matrix.target}} -p stalwart --no-default-features --features "foundationdb s3 redis nats"` - `.github/workflows/ci.yml:386`: `cargo build --release --target ${{matrix.target}} -p stalwart --no-default-features --features "sqlite postgres mysql rocks s3 redis azure nats enterprise"` → `cargo build --release --target ${{matrix.target}} -p stalwart --no-default-features --features "sqlite postgres mysql rocks s3 redis azure nats"` - `.github/workflows/ci.yml:442`: `cargo build --release -p stalwart --no-default-features --features "sqlite postgres mysql rocks s3 redis azure nats enterprise"` → `cargo build --release -p stalwart --no-default-features --features "sqlite postgres mysql rocks s3 redis azure nats"` - `Dockerfile:22`: `RUN RUSTFLAGS="$(cat /flags.txt)" cargo chef cook --target "$(cat /target.txt)" --release --no-default-features --features "sqlite postgres mysql rocks s3 redis azure nats enterprise" --recipe-path /recipe.json` → `RUN RUSTFLAGS="$(cat /flags.txt)" cargo chef cook --target "$(cat /target.txt)" --release --no-default-features --features "sqlite postgres mysql rocks s3 redis azure nats" --recipe-path /recipe.json` - `Dockerfile:24`: `RUN RUSTFLAGS="$(cat /flags.txt)" cargo build --target "$(cat /target.txt)" --release -p stalwart --no-default-features --features "sqlite postgres mysql rocks s3 redis azure nats enterprise"` → `RUN RUSTFLAGS="$(cat /flags.txt)" cargo build --target "$(cat /target.txt)" --release -p stalwart --no-default-features --features "sqlite postgres mysql rocks s3 redis azure nats"` - `Dockerfile.build:111`: `RUSTFLAGS="-L /usr/lib" cargo chef cook --recipe-path recipe.json --zigbuild --release --target ${TARGET} -p stalwart --no-default-features --features "foundationdb s3 redis nats enterprise"; \` → `RUSTFLAGS="-L /usr/lib" cargo chef cook --recipe-path recipe.json --zigbuild --release --target ${TARGET} -p stalwart --no-default-features --features "foundationdb s3 redis nats"; \` - `Dockerfile.build:119`: `cargo chef cook --recipe-path recipe.json --zigbuild --release --target ${TARGET} -p stalwart --no-default-features --features "sqlite postgres mysql rocks s3 redis azure nats enterprise"` → `cargo chef cook --recipe-path recipe.json --zigbuild --release --target ${TARGET} -p stalwart --no-default-features --features "sqlite postgres mysql rocks s3 redis azure nats"` - `Dockerfile.build:132`: `RUSTFLAGS="-L /usr/lib" cargo zigbuild --release --target ${TARGET} -p stalwart --no-default-features --features "foundationdb s3 redis nats enterprise" && \` → `RUSTFLAGS="-L /usr/lib" cargo zigbuild --release --target ${TARGET} -p stalwart --no-default-features --features "foundationdb s3 redis nats" && \` - `Dockerfile.build:142`: `cargo zigbuild --release --target ${TARGET} -p stalwart --no-default-features --features "sqlite postgres mysql rocks s3 redis azure nats enterprise" && \` → `cargo zigbuild --release --target ${TARGET} -p stalwart --no-default-features --features "sqlite postgres mysql rocks s3 redis azure nats" && \` - `Dockerfile.fdb:56`: `RUN cargo build -p stalwart --no-default-features --features "foundationdb s3 redis azure nats enterprise" --release` → `RUN cargo build -p stalwart --no-default-features --features "foundationdb s3 redis azure nats" --release` ## Flagged Enterprise in upstream's schema **Objects:** `x:AiModel`, `x:Alert`, `x:ArchivedItem`, `x:MaskedEmail`, `x:MetricsStore`, `x:SpamLlm`, `x:Tenant`, `x:Trace`, `x:TracingStore` **Fields:** `x:AcmeProvider.memberTenantId`, `x:ArfExternalReport.memberTenantId`, `x:Authentication.defaultTenantRoleIds`, `x:CalendarAlarm.template`, `x:CalendarScheduling.emailTemplate`, `x:CalendarScheduling.httpRsvpTemplate`, `x:DataRetention.archiveDeletedAccountsFor`, `x:DataRetention.archiveDeletedItemsFor`, `x:DataRetention.holdMetricsFor`, `x:DataRetention.holdTracesFor`, `x:DataRetention.metricsCollectionInterval`, `x:Dkim1Signature.memberTenantId`, `x:Dkim2Signature.memberTenantId`, `x:DmarcExternalReport.memberTenantId`, `x:Domain.allowScimProvisioning`, `x:Domain.directoryId`, `x:Domain.logo`, `x:Domain.memberTenantId`, `x:Email.maxMaskedAddresses`, `x:Enterprise.logoUrl`, `x:GroupAccount.externalId`, `x:LdapDirectory.memberTenantId`, `x:MySqlStore.readReplicas`, `x:OidcDirectory.memberTenantId`, `x:PostgreSqlStore.readReplicas`, `x:Search.indexTelemetry`, `x:Search.indexTracingFields`, `x:SqlDirectory.memberTenantId`, `x:TlsExternalReport.memberTenantId`, `x:UserAccount.externalId` ## Third-party code Comments in the stripped tree that name another copyright holder, another license, or a source the code came from. Files marked **new** aren't in THIRD-PARTY.md yet. - `crates/common/src/network/acme/directory.rs` - 7: Adapted from rustls-acme (https://github.com/FlorianUekermann/rustls-acme), licensed under MIT/Apache-2.0. - `crates/common/src/network/acme/jose.rs` - 7: Adapted from rustls-acme (https://github.com/FlorianUekermann/rustls-acme), licensed under MIT/Apache-2.0. - `crates/common/src/network/acme/order.rs` - 7: Adapted from rustls-acme (https://github.com/FlorianUekermann/rustls-acme), licensed under MIT/Apache-2.0. - `crates/common/src/scripts/functions/text.rs` - 239: MIT licensed. - 241: Copyright (c) 2016 Titus Wormer - `crates/common/src/telemetry/tracers/journald.rs` - 70: SPDX-FileCopyrightText: 2018 Benjamin Saunders - 71: SPDX-License-Identifier: MIT - `crates/imap-proto/src/utf7.rs` - 7: Ported from https://github.com/jstedfast/MailKit/blob/master/MailKit/Net/Imap/ImapEncoding.cs - `crates/jmap/src/registry/mapping/log.rs` - 341: SPDX-FileCopyrightText: 2017 Michael Coyne - 343: SPDX-License-Identifier: MIT - 346: Adapted from https://github.com/mjc-gh/rev_lines/blob/main/src/lib.rs - `crates/jmap-proto/src/types/date.rs` - 121: Ported from http://howardhinnant.github.io/date_algorithms.html#civil_from_days - 158: Ported from https://github.com/protocolbuffers/upb/blob/22182e6e/upb/json_decode.c#L982-L992 - `crates/nlp/src/tokenizers/japanese.rs` - 73: Ported from https://github.com/woxtu/rust-tinysegmenter, MIT license - `crates/nlp/src/tokenizers/types.rs` - 738: Credits: test suite from linkify crate - `crates/registry/src/types/datetime.rs` - 150: Ported from http://howardhinnant.github.io/date_algorithms.html#civil_from_days - 188: Ported from https://github.com/protocolbuffers/upb/blob/22182e6e/upb/json_decode.c#L982-L992 - `crates/store/src/backend/postgres/tls.rs` - 7: Credits: https://github.com/jbg/tokio-postgres-rustls - `crates/types/src/id.rs` - 69: From https://github.com/archer884/crockford by J/A - 70: License: MIT/Apache 2.0 - `crates/utils/src/glob.rs` - 107: Credits: Algorithm ported from https://research.swtch.com/glob ## Renamed identifiers - `"URL to download spam filter rules from" → "URL to download spam filter rules from. Empty uses the rules bundled with the server."`: `resources/schema/schema.json.gz` (1) - `"spamFilterRulesUrl":"https://github.com/stalwartlabs/spam-filter/releases/latest/download/spam-filter-rules.json.gz", → `: `resources/schema/schema.json.gz` (1) - `"stalwart" → "inbuxa"`: `resources/schema/schema.json.gz` (15) - `"stalwart".to_string() → "inbuxa".to_string()`: `crates/jmap/src/registry/mapping/bootstrap.rs` (1), `crates/registry/src/schema/structs_impl.rs` (12) - `STALWART_SPAM_ → INBUXA_SPAM_`: `crates/common/src/manager/mod.rs` (2) - `spam_filter_rules_url: Some("https://github.com/stalwartlabs/spam-filter/releases/latest/download/spam-filter-rules.json.gz".to_string()), → spam_filter_rules_url: None,`: `crates/registry/src/schema/structs_impl.rs` (1) - `stalwart-webui → inbuxa-webui`: `crates/common/src/manager/application.rs` (3) - `urn:stalwart: → urn:inbuxa:`: `crates/dav/src/common/lock.rs` (1), `crates/dav/src/common/uri.rs` (5), `tests/src/webdav/lock.rs` (2) - `urn:stalwart:jmap → urn:inbuxa:jmap:registry`: `crates/jmap-proto/src/request/capability.rs` (3), `tests/resources/scripts/stress_test_prepare.py` (1), `tests/src/jmap/principal/get.rs` (2), `tests/src/utils/jmap.rs` (1) - `vnd.stalwart → vnd.inbuxa`: `resources/schema/schema.json.gz` (2) - `vnd.stalwart. → vnd.inbuxa.`: `crates/registry/src/schema/enums_impl.rs` (4), `tests/resources/jmap/sieve/test_mailbox.sieve` (1), `tests/resources/smtp/sieve/awl.sieve` (1), `tests/resources/smtp/sieve/awl_include.sieve` (1), `tests/resources/smtp/sieve/stage_mail.sieve` (1), `tests/resources/smtp/sieve/stage_rcpt.sieve` (1) ## Build check Errors mean shared code calls something the strip removed: usually a dual-licensed file that only serves an Enterprise feature. Drop or rework it in the merge into `main`, never on `upstream`. - error `tests/src/directory/issuer.rs:8`: unresolved import `crate::directory::oidc` - error `tests/src/directory/issuer.rs:67`: the size for values of type `str` cannot be known at compilation time - error `tests/src/directory/issuer.rs:74`: the size for values of type `str` cannot be known at compilation time - unused `crates/common/src/cache/invalidate.rs:20`: unused imports: `registry::RegistryQuery` and `roaring::RoaringBitmap` - unused `crates/common/src/cache/principals.rs:31`: unused import: `MaskedEmail` - unused `crates/common/src/cache/principals.rs:41`: unused import: `now` - unused `crates/common/src/network/mta.rs:27`: unused import: `structs::MaskedEmail` - unused `crates/common/src/network/mta.rs:36`: unused import: `now` - unused `crates/common/src/network/mta.rs:39`: unused import: `types::id::Id` - unused `crates/common/src/scripts/plugins/llm_prompt.rs:7`: unused import: `compiler::Number` - unused `crates/common/src/scripts/plugins/llm_prompt.rs:8`: unused import: `std::time::Instant` - unused `crates/common/src/scripts/plugins/llm_prompt.rs:9`: unused imports: `AiEvent` and `SecurityEvent` - unused `crates/jmap/src/registry/mapping/principal.rs:24`: unused imports: `RegistryObjectCounter` and `RegistryQuery` - unused `crates/jmap/src/registry/mapping/queued_message.rs:25`: unused import: `ObjectType` - unused `crates/jmap/src/registry/mapping/queued_message.rs:43`: unused import: `RegistryQuery` - unused `crates/services/src/task_manager/index.rs:14`: unused imports: `ObjectType` and `Property` - unused `crates/services/src/task_manager/index.rs:32`: unused import: `blob_hash::BlobHash` Expected: upstream's tests of features the fork rebuilt on `main` (tools/fork/build-check-known.txt). - `tests/src/directory/mod.rs:19`: cannot find module or crate `oidc` in this scope - `tests/src/smtp/inbound/antispam.rs:17`: cannot find `enterprise` in `common` - `tests/src/smtp/inbound/antispam.rs:49`: unresolved import `spam_filter::analysis::llm` - `tests/src/smtp/inbound/antispam.rs:661`: no method named `spam_filter_analyze_llm` found for reference `&common::Server` in the current scope - `tests/src/system/mod.rs:63`: cannot find module or crate `tenant` in this scope - `tests/src/system/mod.rs:70`: cannot find module or crate `archiving` in this scope - `tests/src/telemetry/alerts.rs:89`: no method named `process_alerts` found for struct `common::Server` in the current scope - `tests/src/telemetry/metrics.rs:8`: unresolved import `common::telemetry::metrics::store` - `tests/src/telemetry/metrics.rs:33`: no method named `insert_test_metrics` found for struct `common::Server` in the current scope - `tests/src/telemetry/metrics.rs:190`: no method named `purge_metrics` found for reference `&store::Store` in the current scope - `tests/src/telemetry/tracing.rs:8`: unresolved import `common::telemetry::tracers::store` - `tests/src/telemetry/tracing.rs:35`: no method named `purge_spans` found for reference `&store::Store` in the current scope - `tests/src/telemetry/tracing.rs:89`: no method named `purge_spans` found for reference `&store::Store` in the current scope - `tests/src/telemetry/tracing.rs:152`: no method named `purge_spans` found for reference `&store::Store` in the current scope - `tests/src/telemetry/webhooks.rs:11`: unresolved import `common::telemetry::tracers::store` - `tests/src/telemetry/webhooks.rs:123`: no method named `purge_spans` found for reference `&store::Store` in the current scope ## Problems - tests/src/directory/issuer.rs:8: does not compile: unresolved import `crate::directory::oidc` - tests/src/directory/issuer.rs:67: does not compile: the size for values of type `str` cannot be known at compilation time - tests/src/directory/issuer.rs:74: does not compile: the size for values of type `str` cannot be known at compilation time