Skip to content

Release 2026-08-21 - (expected chart version 5.35.0) - #5470

Closed
zebot wants to merge 105 commits into
masterfrom
release_2026-08-21_13_10
Closed

Release 2026-08-21 - (expected chart version 5.35.0)#5470
zebot wants to merge 105 commits into
masterfrom
release_2026-08-21_13_10

Conversation

@zebot

@zebot zebot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

[2026-08-21] (Chart Release 5.35.0)

Release notes

  • The PostgreSQL connection pool implementation was switched to hasql-resource-pool.
    The agingTimeout setting 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 jobs settings configure the dispatcher, worker, retry, shutdown, and reaper behavior, with defaults matching the existing behavior. The initial queues are meetings and conversations, with one worker pool assigned to each queue.

    Operators should size the background-worker PostgreSQL pool and PostgreSQL max_connections for this workload and the transient connection used while acquiring the migration lock; that connection is closed after migrations complete. jobs.workerThreads defaults to 1.

    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.terminationGracePeriodSeconds to 40, providing a margin over the default jobs.gracefulShutdownTimeout of 30s. Adjust both settings together if changing the shutdown timeout. (WPB-26489 backend adminless scheduled jobs model for deletion and reminder #5289)

    • The backgroundEffects team feature flag is deprecated (WPB-27912). Its
      default is now enabled and locked, and the Helm configuration override for
      backgroundEffects has been removed from charts/wire-server. The flag's
      data type and its public/internal HTTP endpoints are retained for backward
      compatibility; any Helm overrides for backgroundEffects are now ignored and
      can 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-configs and GET /teams/:tid/features endpoints
      continue to include backgroundEffects at 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):

    {
      "code": 400,
      "label": "scim-error",
      "message": "{\"detail\":\"[...]\",\"schemas\":[\"urn:ietf:params:scim:api:messages:2.0:Error\"],\"scimType\":\"invalidValue\",\"status\":\"400\"}"
    }
    

    New schema (RFC-compliant):

    {
      "schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"],
      "status": "400"
      "scimType": "invalidValue",
      "detail": "[...]",
    }
    ``` (#5439)
    
    
  • 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):

    {
      ...
      "roles": ["member"],
      "entitlements": ["some entitlement"],
      ...
    }
    

    New schema (RFC-compliant):

    {
      ...
      "roles": [{"value" : "member"}],
      "entitlements": [{"value" : "some entitlement"}],
      ...
    }
    

    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 past PUT /meetings/{domain}/{id} may move a meeting's start_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 if pastEditPeriod is negative or greater than settings.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 reaper chart no longer grants itself cluster-admin and no longer uses an
    unmaintained container image. Upgrading is a drop-in helm upgrade; no manual steps.

    Two cases need action:

    • If you override image in your values, update the override: the default changed from
      docker.io/bitnamilegacy/kubectl:1.32.4 to docker.io/alpine/kubectl:1.36.3. The
      image must contain a POSIX shell at /bin/sh — distroless kubectl images do not work.
    • If you mirror images into a private registry (airgapped installs), add the new image.

    See charts/reaper/README.md for the image settings, the RBAC the chart now creates,
    and the rest of the changes. (reaper: updating kubectl image, detection script, rbac #5444)

    • The meetingsPremium team feature flag is deprecated (WPB-26771). It no
      longer 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 meetingsPremium has been removed from
      charts/wire-server. The flag's data type and its public/internal HTTP
      endpoints are retained for backward compatibility but have no behavioural
      effect; any Helm overrides for meetingsPremium are now ignored and can be
      removed. 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-configs and GET /teams/:tid/features endpoints continue to include meetingsPremium at all API versions, including v17. (WPB-26771: deprecate meetingsPremium feature flag #5326)
    • Galley has a new optional settings.meetings.email configuration block
      (WPB-27175) for sending meeting-invitation emails to invited external
      addresses. It takes a required from sender, an optional replyTo address,
      and a transport that 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 point
      settings.meetings.email.smtp.passwordFile at that path; the Galley ConfigMap
      injects it into transport.smtpCredentials.smtpPassword, the same pattern
      Brig uses for smtp.passwordFile. This change adds the
      configuration 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 Meeting type returned and accepted by the
    meetings endpoints carries tzid (IANA time zone) and drops the deprecated
    trial field; end_time is retained on both V17 and V16. The operator config
    galley.config.settings.meetings.legacyTimeZone (default Europe/Berlin) now
    applies only to meetings created by legacy clients (API < V17); reads no longer
    need it, as tzid is persisted NOT NULL (backfilled to Europe/Berlin). (WPB-27553: add tzid to meetings #5391)

API changes

  • SCIM user resources returned by spar now include type on stored email
    addresses. Previously spar persisted no type, so SCIM PATCH operations with a
    value-path filter like emails[type eq "work"].value (as sent by Microsoft
    Entra 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
    emails array) will see the additional type member. (WPB-23434) (WPB-23434: Support SCIM PATCH of multi-valued emails attribute #5419)

  • Introduced meeting-specific conversation lifecycle events: conversation.create-meeting and conversation.delete-meeting. When a conversation of type meeting (group_conv_type: "meeting") is created or deleted, clients receive these instead of conversation.create / conversation.delete. The payloads are identical to their non-meeting counterparts (conversation.delete-meeting, like conversation.delete, carries no data); only the event type differs, so clients can handle meetings distinctly. (WPB-26626) (WPB-26626: emit conversation.delete-meeting for meeting conversations #5421)

  • POST /meetings (create) and PUT /meetings/{domain}/{id} (update) now return a full conversation object alongside the existing meeting fields. The legacy qualified_conversation field is retained for backward compatibility. (WPB-26704: add full conversation to POST /meetings (create) and PUT /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 backgroundEffects team feature endpoints are deprecated and return 404 for
    clients on API version v17: the public GET/PUT /teams/:tid/features/backgroundEffects
    and the internal legacy lock PUT /i/teams/:tid/features/backgroundEffects/(un)?locked.
    They remain available through v16. The aggregate endpoints
    GET /feature-configs and GET /teams/:tid/features are unaffected and continue
    to include backgroundEffects at all API versions: the aggregate feature list is
    version-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 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. (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 for
    multi-ingress SSO. This will break existing multi-ingress SSO flows until
    idpCertFingerprintAllowlist is configured!
    This breakage is unfortunately
    necessary, 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 legacy GET /conversations/{id} now return 404 (no-conversation) when the conversation is a meeting, on API versions prior to V16, instead of returning the conversation with group_conv_type: null. The legacy batch endpoint GET /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 meetingsPremium team feature endpoints are deprecated and return 404 for
    clients on API version v17: the public GET/PUT /teams/:tid/features/meetingsPremium
    and 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-configs and GET /teams/:tid/features are unaffected and continue
    to include meetingsPremium at all API versions: the aggregate feature list is
    version-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 meetings feature 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 trial field from the Meeting response starting at API version V17. On V15–V16 the field is still present but always returns false (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 Meeting type carries a tzid (IANA time
    zone) and drops the deprecated trial field; end_time is retained on both V17
    and V16. A V17 update that supplies only start_time leaves end_time
    unchanged — pass end_time to reschedule the end. (WPB-27553: add tzid to meetings #5391)

Features

Bug fixes and other updates

Internal changes

Federation changes

blackheaven and others added 30 commits July 7, 2026 10:12
Master->Develop after release
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.
Also move collaborator CRUD api to galley.
…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.
jschaul and others added 25 commits August 11, 2026 15:40
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>
Co-authored-by: Sven Tennie <sven.tennie@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>
Also introduces unit test to find deviations between oauth scope rules and docs.
The password is already scattered around this repo, no need to not use
it here.
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)
@zebot
zebot requested review from a team as code owners August 21, 2026 13:11
@zebot zebot added the ok-to-test Approved for running tests in CI, overrides not-ok-to-test if both labels exist label Aug 21, 2026
@fisx fisx closed this Aug 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ok-to-test Approved for running tests in CI, overrides not-ok-to-test if both labels exist

Projects

None yet

Development

Successfully merging this pull request may close these issues.