Skip to content

Release 2026-08-27 - (expected chart version 5.35.0) - #5489

Open
zebot wants to merge 114 commits into
masterfrom
release_2026-08-27_14_57
Open

Release 2026-08-27 - (expected chart version 5.35.0)#5489
zebot wants to merge 114 commits into
masterfrom
release_2026-08-27_14_57

Conversation

@zebot

@zebot zebot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

[2026-08-27] (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 prevent adminless groups feature has known bugs. Disable and lock it by
    Helm configuration for now. Development of this feature will continue, it
    should just not be used in production as-is. (Disable and LOCK preventAdminlessGroups #5472)

  • 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)

  • PUT /meetings/{domain}/{id} now accepts an optional tzid field to update a
    meeting's IANA time zone. (WPB-28272: Make meeting tzid updatable via PUT /meetings/{domain}/{id} #5479)

  • Finalize api version 17. ([WPB-28299] Finalize api version 17. #5482)

  • 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

  • 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 emails multi-valued attribute (e.g. Entra's
    emails[type eq "work"].value), so user emails can be updated via SCIM. Identity
    providers that previously hit a can not lens into multi-valued attributes yet
    error 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
    type and primary sub-attributes of the SCIM email entry it keeps (in
    spar.scim_user_times) and echoes them back on GET/POST/PATCH exactly as the
    IdP sent them, instead of synthesizing a hardcoded type of "work" (email
    type values are limited to 64 characters). As a result, PATCH value-path
    filters like Entra's emails[type eq "work"].value and Okta's
    emails[primary eq true].value match the stored entry for an in-place update
    when (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 Add on a non-existing target creates it, a type-filter PATCH
    against 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 picked
    one 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-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. (fix /sso/get-by-email rate 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: Avoid assigning an already claimed handle to a user.

    Before this if SCIM created a user with a handle already claimed by another user
    the handle would get stored for the user even if the overall SCIM call fails. (NewStoredUser: Remove handle #5475)

  • SCIM PATCH on emails now handles the email type and primary
    sub-attributes per RFC 7644 §3.5.2.2 and RFC 7643 §2.5:
    remove emails[type eq "work"].type (or .primary) unassigns just that
    sub-attribute and keeps the entry (including the address and the other
    sub-attribute) instead of deleting the whole record; replace/add with an
    explicit "value": null unassigns the sub-attribute the same way; and a
    filterless remove emails clears all email entries. Removing or nulling the
    .value sub-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 null values in PATCH operations, replace with null on
    displayName/externalId/active now unassigns the attribute (RFC 7643 §2.5)
    like the corresponding remove already 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 searchVisibility feature key used in runtime JSON and the legacy teamSearchVisibility key 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

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.
fisx and others added 26 commits August 18, 2026 09:47
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)
The feature has known bugs and should thus not be used in production.

This commit unblocks releasing wire-server while letting us quickly
resume development on this feature afterwards.
The cassandra interpreter was storing the handle without "claiming" it,
expecting the caller to make a subsequent call to claim the handle.

The postgresql interpreter was claiming it unsafely, so it'd throw a 500 if the
handle was already claimed.

Removing the handle from this type seems the more correct way where the calling
party must make a subsequent call to claim the handle and deal with this partial
failure in creating a user.
…rch. (#5452)

* Changelog.

* Failing integration test.

* Include team collaborators in contact search.

* Implement TeamCollaboratorsSubsystem interpreter with BrigAPIAccess.

Was previously UserSubsystem, but since it TeamCollaboratorsSubsystem
is also used outside of Brig, that is not always available.

Further changes:

- Support BrigAPIAccess locally in Brig.
- Change collaborator field type in UserDoc to collapse `Nothing` and
  `Just []` (remove the Maybe).

* Remove stray TODO.

(I don't understand what it is about, and there is no author to ask.)

* Remove bogus TODO.

(This end-point only updates searchability settings, nothing else.)

* Make BrigAPIAccess.Local interpreter fall back on RPC.

This is only where we don't expect to use it.  if we're wrong about
this, a warning will be logged.

* Test users collaborating with more than one team.

* make sanitize-pr
* Changelog.

* Clean up headroom setup.

- Re-add headroom to treefmt;
- make old license headers static;
- make new license headers reference _current_year, not 2025.

* Run treefmt.

* Remove (newly) deprecated add-license rule from Makefile.

NB: legally it is not important that the year or year span in the license header has any relation to the file age, but otherwise the header needs to be present and intact.
---------

Co-authored-by: Gautier DI FOLCO <gautier.difolco@wire.com>
@zebot
zebot requested review from a team as code owners August 27, 2026 14:58
@zebot zebot added the ok-to-test Approved for running tests in CI, overrides not-ok-to-test if both labels exist label Aug 27, 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.