Release 2026-08-21 - (expected chart version 5.35.0) - #5470
Closed
zebot wants to merge 105 commits into
Closed
Conversation
Master->Develop after release
…PUT /meetings/{domain}/{id}` (#5301)
The Z-Host header has been treated as domain, but used as Text. De-serializing and thus using it as Domain increases type-safety and ensures domain related semantics; e.g. case insensitivity in equality checks. This solves a FUTUREWORK remark which was around for quite some time. CodeStore GetConversationCodeURI interpreters only do a state map lookup with this domain value, so this is not a database migration case. Do we change the API? Not really, as this is not client facing: Z-Host is set by nginx to $host.
As IdP <-> user relationships will become more flexible in multi-ingress setups
("automatic cross-IdP migration"), we need to be more strict regarding IdP
management.
This commit enforces the usage of `idpCertFingerprintAllowlist` in
multi-ingress setups: If it is not set, all IdP management and SAML
authentication actions are denied.
Regular (non-multi-ingress) setups stay unaffected.
) Refactors the PostgreSQL connection pooling across multiple services/libraries by switching from hasql-pool to hasql-resource-pool, introducing a new Hasql.Pool.Extended.Pool wrapper that carries metrics and a rawPool accessor for code paths that still need the underlying pool (notably migrations). Changes: - Replace hasql-pool with hasql-resource-pool across Cabal and Nix, including pin/override updates. - Update service/library effect stacks to use Hasql.Pool.Extended.Pool (and rawPool where a raw Hasql.Pool.Pool is required). - Rework pool metrics collection (session/acquisition latency histograms + periodic pool stats snapshots).
The order of members in a SCIM group doesn't matter and exists only accidentally; because JSON has no notion of sets. So, ordering members' list entries by their `Ord` instance leads to stable comparisons.
1.7.4 wasn't compatible to nixpkgs 26.05 and thus broke the `#sbom` env. Upgrading to latest stable solves this issue.
…CIM control (#5333) When a user's managed_by transitioned from Wire to SCIM, a pending email-address update was left dangling: team settings kept offering a "resend verification" action that failed with 403 managed-by-scim, and a stale activation link could still change a SCIM-managed user's email outside of SCIM. - Add internal brig endpoint DELETE /i/users/:uid/pending-email-update that removes the user's unvalidated email and its activation token. - Call it from spar's two Wire->SCIM transition sites (lazy SCIM adoption via GET /Users/:id and getUserById). - Add defense-in-depth: brig's email-activation path now rejects SCIM-managed users (InvalidActivationManagedByScim -> 403 managed-by-scim). - Add ActivationCodeStore.deleteActivationCode (effect + Cassandra + in-memory impls). * Hello CI * fix(sven): add tests * Hello CI
`/sso/get-by-email` needs to appear before `/sso` in nginx's config, because regex locations are matched in order (first-match), not by specificity. In previous order `/sso` caught before `/sso/get-by-email` applied the specific 5r/m rate limit, leaving it on the generic 50r/s limit.
--------- Co-authored-by: Leif Battermann <leif.battermann@wire.com>
…eams/:tid/apps". (#5343) * Drive-by improvement: move access control from brig to wire-subsystems.
`public.ecr.aws/bitnami/` is gone: https://aws.amazon.com/blogs/containers/bitnami-image-removal-from-ecr-public/ docker.io has tight rate-limiting. So, in lieu of better options, we're resorting to our own cache.
The webapp provides several config settings for CSP headers. Duplicating them here would be pretty tedious and confusing. As the webapp provides multi-ingress support: Use it!
…#5425) Senderless conversation deletes are not sent to remote backends. The owning backend would delete the conversation, but a remote backend would keep a stale membership row. The conversation would then still appear in POST /conversations/list-ids, while GET would return 404 and POST would /conversations/list omit it. To be safe, we skip "prevent adminless groups" deletions for groups that have remote members. --------- Co-authored-by: Gautier DI FOLCO <gautier.difolco@wire.com>
* reaper: updating kubectl image, detection script, rbac * list images (hip-15) * updating release notes & readme --------- Co-authored-by: Stefan Matting <stefan@wire.com>
Instead of silently closing the WebSocket, log that the call to Gundeck failed. This helps operators to debug related issues (by pointing them to Gundeck's logs).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
The `mlsMigration` team feature config now includes an `allowManualMigration` boolean field (default `false`) that controls whether clients are permitted to perform single-group (manual) MLS migrations. The field only steers client behaviour (e.g. if a migration button is shown or not). It does not enforce checks in the backend.
…part 1) (#5462) * [drive-by] Better error rendering in oauth scopes test. * [drive-by] Implement FromByteString OAuthScope using ToByteString. (This way we only have to change one instance in the FUTURE for update to the type.) * Fix: support for implied oauth scopes in unit test. (This will change again in https://wearezeta.atlassian.net/browse/WPB-28193)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
[2026-08-21] (Chart Release 5.35.0)
Release notes
The PostgreSQL connection pool implementation was switched to
hasql-resource-pool.The
agingTimeoutsetting is now ignored and should be treated as deprecated.Pool metrics now include acquisition/session latency. (WPB-26487 backend background jobs hasql resource pool refactoring #5323)
Background-worker now runs additional jobs and has new settings. The
jobssettings configure the dispatcher, worker, retry, shutdown, and reaper behavior, with defaults matching the existing behavior. The initial queues aremeetingsandconversations, with one worker pool assigned to each queue.Operators should size the background-worker PostgreSQL pool and PostgreSQL
max_connectionsfor this workload and the transient connection used while acquiring the migration lock; that connection is closed after migrations complete.jobs.workerThreadsdefaults to1.Both worker pools use the same PostgreSQL pool. Connections are borrowed for active job transactions and short-lived worker operations, rather than being reserved permanently per pool. LISTEN/NOTIFY is disabled, so the job runner does not open an additional listener connection.
The Helm chart sets
background-worker.terminationGracePeriodSecondsto40, providing a margin over the defaultjobs.gracefulShutdownTimeoutof30s. Adjust both settings together if changing the shutdown timeout. (WPB-26489 backend adminless scheduled jobs model for deletion and reminder #5289)backgroundEffectsteam feature flag is deprecated (WPB-27912). Itsdefault is now enabled and locked, and the Helm configuration override for
backgroundEffectshas been removed fromcharts/wire-server. The flag'sdata type and its public/internal HTTP endpoints are retained for backward
compatibility; any Helm overrides for
backgroundEffectsare now ignored andcan be removed. The public/internal HTTP endpoints return 404 at API version
v17 and remain available through v16; the flag type remains deprecated. The
aggregate
GET /feature-configsandGET /teams/:tid/featuresendpointscontinue to include
backgroundEffectsat all API versions, including v17. (WPB-27912: Deprecate backgroundEffects feature flag at API v17 #5431)Make SCIM error responses comply with RFC7644. Any code that processes SCIM error responses must be changed to follow the standard, instead of the previous Wire implementation.
Previous schema (incompatible with RFC):
New schema (RFC-compliant):
SCIM: Make role and entitlements fields in user schema comply with RFC. Any code that processes SCIM users must be changed to follow the standard, instead of the previous Wire implementation.
Previous User schema (incompatible with RFC):
New schema (RFC-compliant):
For backwards compatibility, both fields still accept the old bare-string form on input. ([WPB-27953] SCIM: Make role field in user schema comply with RFC. #5440)
Added a new galley setting
settings.meetings.pastEditPeriod(default 24h): how far into the pastPUT /meetings/{domain}/{id}may move a meeting'sstart_time/end_time, so past and ongoing meetings can be corrected after the fact. Previously any start time in the past (beyond a 60s tolerance) was rejected while a meeting was still upcoming. Galley refuses to start ifpastEditPeriodis negative or greater thansettings.meetings.validityPeriod. (WPB-28080: relax Meeting editing from start time #5451)Update meeting conversations from
{private, invite}to{invite, code}so meetings can be joined by code. (WPB-28155: create meeting conversations with access [invite, code] #5464)The
reaperchart no longer grants itselfcluster-adminand no longer uses anunmaintained container image. Upgrading is a drop-in
helm upgrade; no manual steps.Two cases need action:
imagein your values, update the override: the default changed fromdocker.io/bitnamilegacy/kubectl:1.32.4todocker.io/alpine/kubectl:1.36.3. Theimage must contain a POSIX shell at
/bin/sh— distroless kubectl images do not work.See
charts/reaper/README.mdfor the image settings, the RBAC the chart now creates,and the rest of the changes. (reaper: updating kubectl image, detection script, rbac #5444)
meetingsPremiumteam feature flag is deprecated (WPB-26771). It nolonger affects meeting behaviour: team meetings are always non-trial
regardless of its value. Its default is now enabled and locked, and the
Helm configuration override for
meetingsPremiumhas been removed fromcharts/wire-server. The flag's data type and its public/internal HTTPendpoints are retained for backward compatibility but have no behavioural
effect; any Helm overrides for
meetingsPremiumare now ignored and can beremoved. The public/internal HTTP endpoints now return 404 at API version v17
and remain available through v16; the flag type remains deprecated. The aggregate
GET /feature-configsandGET /teams/:tid/featuresendpoints continue to includemeetingsPremiumat all API versions, including v17. (WPB-26771: deprecate meetingsPremium feature flag #5326)settings.meetings.emailconfiguration block(WPB-27175) for sending meeting-invitation emails to invited external
addresses. It takes a required
fromsender, an optionalreplyToaddress,and a
transportthat selects AWS SES or SMTP (the same shape Brig uses).When the block is unset, meeting invitation emails are disabled. For SMTP,
set
galley.secrets.smtpPassword(mounted at/etc/wire/galley/secrets/smtp-password.txt) and pointsettings.meetings.email.smtp.passwordFileat that path; the Galley ConfigMapinjects it into
transport.smtpCredentials.smtpPassword, the same patternBrig uses for
smtp.passwordFile. This change adds theconfiguration plumbing only; email sending itself lands in a follow-up. (WPB-27175: Add Galley meetings email config plumbing #5346)
Starting at API version V17, the
Meetingtype returned and accepted by themeetings endpoints carries
tzid(IANA time zone) and drops the deprecatedtrialfield;end_timeis retained on both V17 and V16. The operator configgalley.config.settings.meetings.legacyTimeZone(defaultEurope/Berlin) nowapplies only to meetings created by legacy clients (API < V17); reads no longer
need it, as
tzidis persistedNOT NULL(backfilled toEurope/Berlin). (WPB-27553: add tzid to meetings #5391)API changes
SCIM user resources returned by spar now include
typeon stored emailaddresses. Previously spar persisted no
type, so SCIM PATCH operations with avalue-path filter like
emails[type eq "work"].value(as sent by MicrosoftEntra ID) never matched the stored entry and silently appended a duplicate
email instead of updating the address in place. Clients that compare full SCIM
user payloads rather than individual fields (e.g. strict equality on the
emailsarray) will see the additionaltypemember. (WPB-23434) (WPB-23434: Support SCIM PATCH of multi-valued emails attribute #5419)Introduced meeting-specific conversation lifecycle events:
conversation.create-meetingandconversation.delete-meeting. When a conversation of type meeting (group_conv_type: "meeting") is created or deleted, clients receive these instead ofconversation.create/conversation.delete. The payloads are identical to their non-meeting counterparts (conversation.delete-meeting, likeconversation.delete, carries nodata); only the eventtypediffers, so clients can handle meetings distinctly. (WPB-26626) (WPB-26626: emit conversation.delete-meeting for meeting conversations #5421)POST /meetings(create) andPUT /meetings/{domain}/{id}(update) now return a fullconversationobject alongside the existing meeting fields. The legacyqualified_conversationfield is retained for backward compatibility. (WPB-26704: add fullconversationtoPOST /meetings(create) andPUT /meetings/{domain}/{id}#5301)Roll back: do not include collaborator apps in get-apps end-point. ([WPB-27705] Roll back: do *not* include collaborator apps in get-apps end-point. #5402)
The
backgroundEffectsteam feature endpoints are deprecated and return 404 forclients on API version v17: the public
GET/PUT /teams/:tid/features/backgroundEffectsand the internal legacy lock
PUT /i/teams/:tid/features/backgroundEffects/(un)?locked.They remain available through v16. The aggregate endpoints
GET /feature-configsandGET /teams/:tid/featuresare unaffected and continueto include
backgroundEffectsat all API versions: the aggregate feature list isversion-agnostic, like other version-gated features such as MLS. (WPB-27912: Deprecate backgroundEffects feature flag at API v17 #5431)
Make scim error responses comply with RFC7644. ([WPB-27953] Make scim error responses comply with RFC7644. #5439)
SCIM: advertise all schemas used in User (fixes RFC compliance issue). ([WPB-27953] SCIM: advertise all schemas used in User (fixes RFC compliance issue). #5441)
SCIM: Make role and entitlements fields in user schema comply with RFC. ([WPB-27953] SCIM: Make role field in user schema comply with RFC. #5440)
The
mlsMigrationteam feature config now includes anallowManualMigrationboolean field (default
false) that controls whether clients are permitted toperform single-group (manual) MLS migrations. The field only steers client
behaviour (e.g. if a migration button is shown or not). It does not enforce
checks in the backend. (Add allowManualMigration flag to mlsMigration.config #5456)
New oauth scopes for meetings for calendar integration. ([WPB-28050] New oauth scopes for meetings for calendar integration. (part 1) #5462)
Meeting endpoints (
POST /meetings,PUT/DELETE /meetings/:domain/:id, meeting invitation endpoints): errors have dedicated descriptions. (WPB-28093: add dedicated Meeting errors description #5455)To prevent security-relevant configuration mistakes, make configuration of
allowed IdP certificate fingerprints (
idpCertFingerprintAllowlist) mandatory formulti-ingress SSO. This will break existing multi-ingress SSO flows until
idpCertFingerprintAllowlistis configured! This breakage is unfortunatelynecessary, because we're getting more lenient regarding the IdPs a user can use
to log in ("auto IdP migration"). Regular (non-multi-ingress) use cases are
unaffected. ( idpCertFingerprintAllowlist mandatory for multi-ingress SSO #5327)
+
GET /conversations/{domain}/{id}and the legacyGET /conversations/{id}now return 404 (no-conversation) when the conversation is a meeting, on API versions prior to V16, instead of returning the conversation withgroup_conv_type: null. The legacy batch endpointGET /conversations?ids=…— itself removed at V3, so only ever available on V1–V2 — likewise omits meeting conversations from its results. Meeting conversations remain fully accessible from V16 onwards. (WPB-26626) (WPB-26626: hide meeting conversations from legacy (< V16) GET endpoints #5382)The
meetingsPremiumteam feature endpoints are deprecated and return 404 forclients on API version v17: the public
GET/PUT /teams/:tid/features/meetingsPremiumand the internal legacy lock
PUT /i/teams/:tid/features/meetingsPremium/(un)?locked.They remain available through v16. The flag has had no behavioural effect since
WPB-26771 (team meetings are always non-trial). The aggregate endpoints
GET /feature-configsandGET /teams/:tid/featuresare unaffected and continueto include
meetingsPremiumat all API versions: the aggregate feature list isversion-agnostic, like other version-gated features such as MLS. (WPB-26771) (WPB-26771: Deprecate meetingsPremium endpoints at API v17 #5364)
Reject meeting creation and update when the start time is in the past (with a 60-second tolerance for clock skew). Previously, meetings could be created with arbitrary past start times. (WPB-26773: reject meetings with start time in the past #5325)
GET /meetings/list and GET /meetings/{domain}/{id} no longer return 403 invalid-op when the caller's team has the
meetingsfeature disabled. The read endpoints now treat a disabled feature as "no meetings": GET /meetings/list returns 200 [], and GET /meetings/{domain}/{id} returns 404 meeting-not-found. Write operations (create, update, delete, invitation mutations) still return 403 invalid-op when the feature is disabled. Previously these read endpoints returned an undocumented 403 invalid-op for members of teams with the meetings feature disabled. (WPB-27329: meetings read endpoints no longer 403 when feature disabled #5353)The meetings endpoints (POST /meetings, PUT /meetings/{domain}/{id}, GET /meetings/{domain}/{id}, GET /meetings/list) drop the deprecated
trialfield from theMeetingresponse starting at API version V17. On V15–V16 the field is still present but always returnsfalse(team meetings are never trial; see WPB-26771). The underlying storage is unchanged. (WPB-27373: drop trial from Meeting at API version V17 #5363)PUT /meetings/{domain}/{id} can now edit a meeting that has already started (an ongoing meeting). The start-time-not-in-the-past validation added by WPB-26773 previously rejected any update whose start_time was in the past, which also blocked legitimate edits to ongoing meetings — whose start time is naturally in the past; the check now applies only to meetings that have not started yet. Creating a meeting with a past start time, and moving an upcoming meeting's start time into the past, remain rejected (WPB-27465). (WPB-27465: allow editing ongoing (already-started) meetings #5373)
Starting at API version V17, the
Meetingtype carries atzid(IANA timezone) and drops the deprecated
trialfield;end_timeis retained on both V17and V16. A V17 update that supplies only
start_timeleavesend_timeunchanged — pass
end_timeto reschedule the end. (WPB-27553: add tzid to meetings #5391)Features
Manual team invitations now conflict when a matching pending SCIM invitation already exists for the same team and email address. (WPB-23177 [fix] duplicate user accounts created after expired SCIM invitation and manual re-invite #5400)
Add user contact-status enrichment to user listings based on available Proteus and MLS contact methods. (WPB-26101 add contact status enrichment to
POST /list-users#5371)Introduce schedulable background jobs, migrate meetings cleanup to the new job runner, and add the initial adminless reminder and deletion jobs. (WPB-26489 backend adminless scheduled jobs model for deletion and reminder #5289)
Skip senderless prevent-adminless deletion for federated conversations with remote members to prevent remote state drift. (WPB-26650 prevent fed state drift on prevent adminless groups actions #5425)
Add adminless-group reconciliation, teardown, and system events for member updates, reminders, and deletion. (WPB-27017 reconcile adminless groups on feature toggle #5357, WPB-27017 [fix] member-update event target user #5390)
Filter Wire Meetings lifecycle events only on the originating client connection. (WPB-27907: filter Wire Meetings events only on connection #5428)
When a team uses multiple SAML IdPs (one per ingress domain) in a multi-ingress
setup, users can now authenticate via any of the team's IdPs even if their
account was originally provisioned under a different one. Spar resolves the
correct account by email-based NameID lookup across all team IdPs and migrates
the user's SSO identity to the authenticating IdP transparently.
Important: Email addresses (
NameIDs) must be unique across configuredIdPs! Otherwise, users may be logged into wrong accounts!
Please refer to the documentation for further information. (multi-ingress: cross-IdP SSO #5212)
meeting.create,meeting.update, andmeeting.delete(WPB-26705). These websocket notifications are pushed to alllocal members of the meeting's conversation on every successful create, update,
and delete operation. Each payload carries the event
type, the meeting'squalified ID in the top-level
qualified_idfield, thequalified_conversation,qualified_from,via,time, and optionalteam.Meeting events use a dedicated event envelope (not the conversation event
envelope). (WPB-26705: add meeting.create/update/delete lifecycle events #5330)
Added
meeting.member-addwebsocket event (WPB-27620). When a user becomes amember of an MLS meeting conversation, a
meeting.member-addlifecycle event ispushed to the newly-added local members, alongside the existing
meeting.create,meeting.update, andmeeting.deleteevents. The payload uses the same meetingevent structure as the other meeting lifecycle events. (Add meeting.member-add notifications #5383)
Bug fixes and other updates
When a user is put under SCIM control, any pending email-address update is now invalidated (the unvalidated email and its activation token are removed). Previously, team settings kept offering a "resend verification" action that could not succeed (failing with
403 managed-by-scim), and a stale activation link could still change a SCIM-managed user's email outside of SCIM. (WPB-21744: invalidate pending email update when a user is put under SCIM control #5333)Release a handle claimed after a SCIM invitation expired, before cleanup, preventing a subsequent team invitation from using that handle. (WPB-23177 [fix] duplicate user accounts created after expired SCIM invitation and manual re-invite #5400)
SCIM PATCH now supports the
emailsmulti-valued attribute (e.g. Entra'semails[type eq "work"].value), so user emails can be updated via SCIM. Identityproviders that previously hit a
can not lens into multi-valued attributes yeterror when provisioning emails now succeed. (WPB-23434: Support SCIM PATCH of multi-valued emails attribute #5419)
SCIM email metadata is now persisted and echoed verbatim. spar stores the
typeandprimarysub-attributes of the SCIM email entry it keeps (inspar.scim_user_times) and echoes them back on GET/POST/PATCH exactly as theIdP sent them, instead of synthesizing a hardcoded
typeof"work"(emailtypevalues are limited to 64 characters). As a result, PATCH value-pathfilters like Entra's
emails[type eq "work"].valueand Okta'semails[primary eq true].valuematch the stored entry for an in-place updatewhen (and only when) the IdP actually supplied that metadata at provisioning
time; users provisioned without it echo neither field. Since per RFC 7644
§3.5.2 an
Addon a non-existing target creates it, a type-filter PATCHagainst a user whose stored email carries no such metadata appends a new
entry (which the single-email reduction collapses back to the old address,
i.e. no visible change), while a primary-filter PATCH is a complete no-op. (WPB-23434: Support SCIM PATCH of multi-valued emails attribute #5419)
SCIM user provisioning now rejects requests (HTTP 400) that mark more than one
email as
primary, an RFC 7643 §2.4 violation. Previously spar silently pickedone primary and dropped the rest, masking client-side misconfiguration. Requests
with zero or one primary email are unchanged. (WPB-23434: Support SCIM PATCH of multi-valued emails attribute #5419)
Fixed asset uploads with non-ASCII filenames when audit logging is enabled. Audit-log metadata is now percent-encoded before being stored in S3 metadata headers and decoded when read back. (WPB-24669 [fix] upload of files with umlaut when audit log enabled #5359)
Fix nginz routes for delete / update collaborator. Move collaborator CRUD api to galley. ([WPB-25521] Fix update / delete collaborator routes #5334)
Users marked non-searchable are no longer returned across federation. (WPB-25544 fix: stealth users are searchable via federated search #5282)
If apps are re-enabled in the team, DO NOT re-activate any apps in the team. ([WPB-25579] If apps are re-enabled in the team, DO NOT re-activate any apps in the team. #5347)
Wire Meetings lifecycle events (meeting.create, meeting.update, meeting.delete) are no longer delivered to the user who triggered the action, consistent with how other event types avoid echoing back to the originator. Previously the creator/updater/deleter received their own meeting event. (WPB-27857: exclude the initiator from Wire Meetings lifecycle events #5426)
Allow team admin to remove bot from all conversations, instead of crashing. (This is how it's already done in 'finishDeleteService'.) ([WPB-28083] Allow team admin to remove bot from all conversations, instead of crashing. #5450)
Fix openapi3 docs for oauth scopes. ([WPB-28132] Fix openapi3 docs for oauth scopes. #5457)
Enable claiming key packages for ephemeral users ([fix] claim key packages for ephemeral users #5339)
The federator internal listener's /i/status health check now correctly verifies the external listener is ready instead of checking itself, so readiness no longer reports up before the external federation listener is bound. (fix(federator): cross-check external listener in internal /i/status #5403)
Reorder SSO nginx locations to enforce correct rate limiting:
/sso/get-by-emailneeds to appear before/ssoin nginx's config, becauseregex locations are matched in order (first-match), not by specificity. In
previous order
/ssocaught before/sso/get-by-emailapplied the specific5r/m rate limit, leaving it on the generic 50r/s limit. (fix
/sso/get-by-emailrate limiting #5341)Fixed Content Security Policy header scoping in multi-ingress Kubernetes configuration. CSP headers set via the Ingress nginx configuration-snippet are now properly scoped to exclude the webapp domain, preventing conflicts with the webapp's own CSP headers that are set independently. (multi-ingress: Use webapp CSP headers #5432)
SCIM PATCH on
emailsnow handles the emailtypeandprimarysub-attributes per RFC 7644 §3.5.2.2 and RFC 7643 §2.5:
remove emails[type eq "work"].type(or.primary) unassigns just thatsub-attribute and keeps the entry (including the address and the other
sub-attribute) instead of deleting the whole record;
replace/addwith anexplicit
"value": nullunassigns the sub-attribute the same way; and afilterless
remove emailsclears all email entries. Removing or nulling the.valuesub-attribute is rejected with a 400 pointing at whole-entry removal,since the address is the record's identity. As a consequence of preserving
explicit
nullvalues in PATCH operations,replacewithnullondisplayName/externalId/activenow unassigns the attribute (RFC 7643 §2.5)like the corresponding
removealready did, instead of failing with"No value was provided". (WPB-23434: Support SCIM PATCH of multi-valued emails attribute #5419)
Fixed a discrepancy between the canonical
searchVisibilityfeature key used in runtime JSON and the legacyteamSearchVisibilitykey used in YAML configuration. Both names are now accepted; no configuration changes or other operator actions are required. ([fix] team search visibility JSON parser #5338)Internal changes
Fix integration test cleanup on federation instance V2. (Fix integration test cleanup on federation instance V2. #5447)
Update postgres schema dump. ([WPB--] Update postgres schema dump. #5461)
Move email template completeness tests from brig to wire-subsystems. ([WPB-18127] Move email template completeness tests from brig to wire-subsystems. #5429)
Rename
Wire.ScimUserTimesStoretoWire.ScimUserMetaStore(ScimUserTimes->ScimUserMeta); the store also holds SCIM email metadata now. The Cassandra tablespar.scim_user_timesis unchanged. (WPB-23434: Support SCIM PATCH of multi-valued emails attribute #5419)Move
Spar.Sem.ReportertoWire.Reporter(WPB-23631: MoveSpar.Sem.SamlProtocolSettingstoWire.SamlProtocolSettings#5377)Move
Spar.Sem.SamlProtocolSettingstoWire.SamlProtocolSettings(WPB-23631: MoveSpar.Sem.SamlProtocolSettingstoWire.SamlProtocolSettings#5377)Move
Brig.Effects.JwtToolsinWire.JwtTools. (WPB-23631: MoveBrig.Effects.JwtToolsinWire.JwtTools#5396)Move
Brig.BudgetinWire.BudgetStore. (WPB-23631: MoveBrig.BudgetinWire.BudgetStore#5397)Move
Galley.Effects.QueueinWire.BoundedQueue. (WPB-23631: MoveGalley.Effects.QueueinWire.BoundedQueue#5398)Move
Spar.Sem.ScimUserTimesStoretoWire.ScimUserTimesStore. (WPB-23631: MoveSpar.Sem.ScimUserTimesStoreinWire.ScimUserTimesStore#5378)Move
Spar.Sem.DefaultSsoCodeinWire.DefaultSsoStore(WPB-23631:Spar.Sem.DefaultSsoCodeinWire.DefaultSsoStore#5379)Move
Spar.Sem.IdPRawMetadataStoretoWire.IdPRawMetadataStore. (WPB-23631: MoveSpar.Sem.IdPRawMetadataStoretoWire.IdPRawMetadataStore#5380)Move
Spar.Sem.VerdictFormatStoreinWire.VerdictFormatStore. (WPB-23631: MoveSpar.Sem.VerdictFormatStoreinWire.VerdictFormatStore#5388)Move
Spar.Sem.ScimExternalIdStoreinWire.ScimExternalIdStore. (WPB-23631: MoveSpar.Sem.ScimExternalIdStoreinWire.ScimExternalIdStore#5392, WPB-23631: move ScimExternalIdStore law tests from library to test-suite #5423)Read the DPoP public key bundle once at startup and cache it, instead of
re-reading the file on every request; the
PublicKeyBundleeffect is removed. (WPB-23631: Cache the public key bundle at startup instead of an effect #5393)Move
Brig.Effects.UserPendingActivationStoreinWire.UserPendingActivationStore. (WPB-23631: MoveBrig.Effects.UserPendingActivationStoreinWire.UserPendingActivationStore#5394)Move
Brig.Effects.SFTinWire.SFT. (WPB-23631: MoveBrig.Effects.SFTinWire.SFT#5395)In multi-domain (multi-ingress) mode, the
wire-ingresschart now applies thehttpRoute.annotationspassthrough to every per-domain HTTPRoute, so external-dnsweighted-record annotations (set-identifier/aws-weight) work across all backend
domains. The
service.createtoggle also applies in multi-domain deployments. (feat: add multi-ingress-support for envoy gw #5307)Extract MLS key-package handling into a subsystem and split Cassandra access into a dedicated store. (WPB-26101 move code from KeyPackage into subsystem and store #5368)
Added partial indexes and rewrote the meetings cleanup query so the background
worker stays fully index-backed as the
meetingstable grows:idx_meetings_recurrence_eff_endonGREATEST(end_time, recurrence_until)for bounded recurring meetings (covers the recurring branches of the list and
cleanup queries).
idx_meetings_end_time_nonrecurringonend_timefor non-recurring meetings,so cleanup can find expired non-recurring meetings without scanning
not-yet-expired recurring rows whose original slot is long past.
getOldMeetingsImplnow issues one bounded, index-backed query per meeting kindand merges the two batches. (WPB-26823: make meetings cleanup fully index-driven #5328)
Added a
meetings_recurrence_consistencyCHECK constraint so the recurrencecolumns can never be left in a partially-set state (frequency is the master
switch; interval is required when set; recurrence_until stays optional for
open-ended recurring meetings). (WPB-26823: make meetings cleanup fully index-driven #5328)
The wire-ingress and nginx-ingress-services charts now expose annotation
passthroughs (
httpRoute.annotationson the HTTPRoutes,ingress.annotationsonthe Ingresses), so external-dns weighted records (set-identifier/aws-weight) can
be attached to both routers for a zero-downtime nginx-to-Envoy DNS cutover.
wire-ingress also gains a
service.createtoggle (default true) to reuse thebackend Services owned by nginx-ingress-services while both run in parallel. (Envoy: add annotations to httpRoutes and Ingress #5358)
When using the wire-ingress provided EnvoyProxy, ensure the request path's query string is removed from the logs, to ensure access_tokens passed as query string are not logged. Browsers are required to pass them on a query string on some endpoints such as /await. (charts/wire-ingress: remove query param from logs #5361)
Moved the following endpoints from development version V17 to the new development version V18:
PUT /conversations/:domain/:cnv/members(rejection of replacements that would leave a group adminless),PUT /teams/:tid/features/preventAdminlessGroups(duration-string request body), andPOST /register(403 for SCIM-managed users changing their name). V17 behaves like V16 for these endpoints. API version V18 was created as a development version; V17 remains a development version until finalized. The changelog entry for the moved members endpoint is parked inchangelog.d/99-pending/, whichmk-changelog.shandmk-cleanup.shnow skip. (WPB-28163: move V17 endpoints to V18 #5468)Cannon now logs an error when registering a client's remote presence with
Gundeck fails, so operators can tell this apart from an actual
websocket/network issue (e.g.
PongTimeoutcaused by Gundeck losing its Redisconnection). (cannon: log unavailable gundeck #5454)
The alpine base images used by the
cannon-configuratorinitContainer (wire-serverchart) and the
job-donecontainer (cassandra-migrationschart) are no longerhard-coded. They can now be set via
cannon.configuratorImage.{repository,tag,pullPolicy}in the
wire-serverchart andjobDoneImage.{repository,tag}in thecassandra-migrationschart.The default was bumped from
alpine:3.21.3toalpine:3.24.1, since alpine 3.21reaches end-of-support on 2026-11-01. The local integration stack's
init_vhostscontainer also moved from
alpine/curl:3.14(an Alpine 3.14 image last publishedin 2021) to
alpine/curl:8.21.0.Operators who mirror images into a private registry should make sure the new
alpine:3.24.1tag is cached, or overriderepositoryto point at their mirror.The chart release tooling (
hack/bin/set-wire-server-image-version.sh,hack/bin/set-chart-image-version.sh) now anchors its version stamping torepository: quay.io/wire/lines instead of matchingtag:by indentation, sothird-party image tags in
values.yamlare no longer overwritten with thewire-server release version. (WPB-18320: make alpine images configurable #5408)
Updated email templates to v1.0.155 ([WPB-18127] Update email templates to v1.0.155. #5344)
Fix
#sbomNix env / sbomnix usage by upgrading to latest stable version ofthe latter. The issue was introduced by upgrading
nixpkgsto 26.05.brig: Remove /i/users/rich-info (UserStore,brig: Remove unused code to get rich infos in bulk #5384)
remove sftd_disco (now lives in wireapp/wire-avs-service) (WPB-23564: move sftd_disco to wireapp/wire-avs-service #5056)
Use wire image mirror for integration tests as
public.ecr.aws/bitnami/is nolonger available
(https://aws.amazon.com/blogs/containers/bitnami-image-removal-from-ecr-public/).
Docker Hub has strict rate-limiting. So, in lieu of better options, we now use
our own image cache at
quay.io/wire/mirror-images. (Replace gone bitnami image cache #5360)Internal:
meetings.tzidis nowNOT NULL, backfilled toEurope/Berlin.end_timeis the source of truth (there are noduration/duration_originalcolumns). (WPB-27553) (WPB-27553: add tzid to meetings #5391)
The
Z-Hostheader has been treated as domain, but used asText.De-serializing and thus using it as
Domainincreases type-safety and ensuresdomain related semantics; e.g. case insensitivity in equality checks.
This solves a
FUTUREWORKremark which was around for quite some time. (make multi-ingress domains case agnostic #5320)Federation changes
deeplink.jsonnow contains a new optional fieldsupportEmailthat may be used by clients. (WPB-27060 Add optional fieldsupportEmailtodeeplink.json#5351)