Repository navigation
Conversation
* Remove deprecated pict field from user profile Starting with V18, UserProfile does not contain profilePict anymore, while for older versions the old schema will still be produced. Note that on federation side, older versioned UserProfiles with an empty pict field are still used as to not introduce a new federated version. Federated endpoints can be versioned in the future for UserProfile with the introduction of a new federated api version.
Master->Develop after release
* WPB-28216: add POST /meetings/{domain}/{id}/link/refresh * WPB-28216: lift effectful storedMeetingToMeetingWithConversation in refreshMeetingLinkImpl Fix rebase fallout so make c passes: - lift the now-effectful storedMeetingToMeetingWithConversation call in refreshMeetingLinkImpl's MaybeT block (matching updateMeetingImpl) - SetMeetingHasCode mock: StoredMeeting does not model the has_code column, so only bump updatedAt (mirrors the Postgres impl) - InterpreterSpec: Meeting.link is Maybe HttpsUrl; expect Just link * WPB-28216: address refresh-link review feedback (atomic rotation, drop has_code, optional password, revoke guest links) * WPB-28216: ormolu import ordering * WPB-28216: enforce meeting-link password via join-meeting-by-link route - Add POST /meetings/{domain}/{id}/join (V19, ZLocalUser, read-only): resolves a meeting join link and enforces its optional password (403 invalid-meeting-password on missing/wrong password, 404 for dead links). The live code row is the capability; a password supplied for an unprotected link is ignored, mirroring conversation join-by-code. - Return JoinMeetingResult from the subsystem (errors as values) so interpreter behavior stays observable in unit tests; the galley handler maps it to route errors. - GetMeetingCode now returns the stored hashed password alongside the code. - Unit tests (password set/clear/wrong/missing/ignored, dead link, foreign domain) and integration tests (refresh revokes guest links, creator-only, request-level join flows); nginz route + changelog. * WPB-28216: make meeting join links capability-bearing Embed the rotating join-code value in the link URL (<base>/<meetingId>/<code>) and require it on the join route (POST /meetings/{domain}/{id}/join/{code}). The presented value is compared constant-time against the live code row; a stale value (superseded by a link refresh) yields 404, so refreshing a link now genuinely revokes previously shared URLs. Password enforcement is unchanged (403 invalid-meeting-password). Also: unit + integration tests assert old-link revocation; changelog wording per review. * Potential fix for pull request finding 'Document the join endpoint's required code path segment' Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * WPB-28216: meeting join links as key/code/domain query params Renders meeting links as <base>/meeting-join/?key=<codeKey>&code=<codeValue>&domain=<domain> (mirroring conversation join links) and replaces the unreleased V19 POST /meetings/{domain}/{id}/join/{code} route with POST /meetings/join?key=...&code=...: the stable code key addresses the code row (new CodeStore.GetMeetingCodeByKey, Postgres-routed since meeting codes are Postgres-only), the rotating code value is the capability, so refreshing a link invalidates every previously issued URL. * WPB-28216: tolerate absent join-link config in Meetings integration tests The default integration stack configures no conversationCodeURI, so the V19 meeting object omits the link field entirely; read it via lookupField and skip the link assertions there (the postgres integration job, which configures the URI, exercises them). Also fix an hlint hint. * WPB-28216: drop the join-meeting-by-link endpoint Remove POST /meetings/join?key&code and everything only it used: the JoinMeetingByLink effect, joinMeetingByLinkImpl, the JoinMeetingResult type, the join-only GetMeetingCodeByKey store op (all interpreters), the MeetingJoinRequest type, the InvalidMeetingPassword error, the galley handler/wiring, the nginz route block, and their tests. The capability-bearing link format (<base>/meeting-join/?key=...&code=...) and password collection/storage on POST /meetings/{domain}/{id}/link/ refresh are kept; the stored password has no enforcer until a future join endpoint lands. * Update comments for refreshMeetingLinkImpl function Clarify behavior when code store cannot hold meeting codes. Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * WPB-28216: make meeting-link rotation and guest-link revocation atomic Replace the separate createMeetingCode + deleteConversationCode calls in refreshMeetingLinkImpl with a single CodeStore op, RotateMeetingCode: the meeting-code upsert and the conversation guest-code delete commit together in one Postgres transaction, so a crash can never leave the old guest link usable after the meeting link has been replaced. Routing spans both storage classes: meeting codes are Postgres-only, but conversation codes are still read from Cassandra during migration, so DualWrite revokes the Cassandra guest-code copy first (fail-safe: a failure leaves the old meeting link valid, never a live bypass) before the atomic Postgres rotate. Cassandra-only mode keeps revoking the guest code and reports unsupported (False) as before. The pure mock mirrors the semantics. * Hello CI --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
) Resolve a meeting join link (GET) and join the meeting's conversation like POST /conversations/join (POST, via CodeAccess). Unlike the regular meeting endpoints no creator or conversation membership is required; expired, remote, or code-less links return 404 meeting-not-found. Deliberately exempt from the guest-links policy: the meeting link is its own capability (documented in-code). Includes unit tests (MeetingsSubsystem.InterpreterSpec) and integration tests (testMeetingLinkJoin{,NotFound,RemoteDomain}) plus changelog entry.
Starting with API version V19, the meeting `type` is set at creation
only: `PUT /meetings/{domain}/{id}` no longer accepts it. A body with
`type` and no other field is rejected with 403 invalid-op; `type`
alongside other fields is ignored. V15–V18 request shapes are unchanged
(one `UpdateMeeting` type now serves all versions; the legacy aliases
are removed).
Also fixes meeting-update decoding: an update body that omitted
`recurrence` previously decoded as "unset recurrence", silently
clearing the stored recurrence on every update. Omitting it now leaves
it unchanged; "recurrence": null explicitly unsets it.
* WPB-27369 wire-ingress: HA, PDB, spreads across AZ The Envoy proxy fleet created by this chart now defaults to 2 replicas with a PodDisruptionBudget and advisory node/zone spread (`gateway.envoyProxy.replicas`, `.podDisruptionBudget`, `.topologySpreadKeys`). New opt-in `gateway.zoneAwareRouting.enabled` makes Envoy prefer backend pods in its own availability zone, cutting inter-AZ traffic cost on multi-zone clusters. New `gateway.annotations` and `gateway.infrastructure.labels`. See the wire-ingress README. * reduce verbosity of comments * changes * .. * tweak
…PI (#5582) * implement federated dev api * docs * little additon to the docs * changelog * addressed PR issues * Add federation API version regression tests * revert irrelevant doc change * addressing PR review comments * removed unused function * more issues addressed * v0 and v1 disabling not supported anymore * fixed log message * linter * make unversioned queries to galley federator in tests * remove redundant ToSchema instance
…test setup (#5583) * implement federated dev api * all fed versions smoke test * do not fail silently * improve redis cluster init * give healthchecks some more time * added rabbitmq health check * add some docs on how to run local legacy federation tests * fix redis init script * local docker configuration for v3 * support v3 in tests * updated docs * remove obsolete v3 settings * docs on how to add a new pinned local version. * add k8s integration configuration for federation v3 * documenting the CI setup for a new pinned legacy backend * changelog * addressed review comments * fix database name for v3 * added rabbitMQ credentials for v2/3 in envrc * fix local gundeck settings for fed v3 * update docs * restrict tests to relevant versions 1 and 2
* charts/wire-ingress: use ListenerSet by default --------- Co-authored-by: Jan Schumacher <jan.schumacher@wire.com>
--------- Co-authored-by: Gautier DI FOLCO <gautier.difolco@wire.com>
* Add backoffice endpoint to get csv of teammembers
* Use wire/mirror-images for minio in fake-aws-s3 Helm chart Move the fix from Helmfile deployment to the chart itself to fix it. * Use bitnamilegacy repo for legalhold's postgres image The bitnami repo is gone. * SBOM: Add missing Helm value placeholders Otherwise the charts cannot be rendered by the SBOMs scripts.
…ConversationSubsystem (#5348)
Show that the contactable status changes to `non-contactable` when a user deletes all of their clients. This dynamic behaviour wasn't described by any test.
…atch to all of them (#5600)
* nix: Upgrade to hasql 2.0.1.0 Broadly this required upgrading these things: * arbiter * hs-opentelemetry-* (due to arbiter) * QuickCheck (due to arbiter) Upgrading quickcheck caused a lot of version bound checks to fail, so a lot of jailbreaking was necessary. pqi-ffi and pqi-native are in haskell-pins but are not really used, this is because they're a dependency of hasql test suite, but the test suite is disabled. We will eventually need to use them anyway, so this will get fixed in the next commits. * wire-otel: Adapt for hs-opentelemetry-* 1.0 * extended: Adapt for hasql-2, use pqi-native first to try it out * JobSubsystem.Migrations: Adapt for hasql-2 * JobSubsystem: Adapt for arbiter upgrade * Replace deprecated withMaxSuccess with withNumTests QuickCheck upgrade * background-worker, galley: Adapt for arbiter upgrade * Use pqi-ffi instead of pqi-native pqi-native doesn't support some fields in config like `hostaddr`. * Upgrade hasql-resource-pool Inlcudes the fix for destroying dead connections * Changelog * Remove already done TODO
…ad access). (#5542) --------- Co-authored-by: Gautier DI FOLCO <gautier.difolco@wire.com>
* Clean up Envoy Gateway leftovers of integration test namespaces * Wait for Envoy Gateways to be programmed in integration setup * Apply suggestion from @blackheaven Co-authored-by: Gautier DI FOLCO <gautier.difolco@wire.com> --------- Co-authored-by: Gautier DI FOLCO <gautier.difolco@wire.com>
battermann
approved these changes
Oct 23, 2026
This branch has not been deployed
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-10-23] (Chart Release 5.38.0)
Release notes
[Only relevant if you have overwritten
oauth_scopedirectives inyour nginx config] The nginz route configuration syntax changed:
oauth_scope(a bare scope base, e.g.conversations_code) isdeprecated in favor of
oauth_scopes(whole scopes,e.g.
["read:conversations_code", "write-only:conversations_code"]).If you override nginz routes in your own values, migrate each
oauth_scopeentry to the equivalentoauth_scopeslist;oauth_scopeswins where a route has both. If you use the bundledchart, there is nothing to do, it is already updated.
The old directive and old oauth tokens remain valid with new
wire-server, but we will remove the deprecated functionality in some
future release.
See docs/src/developer/reference/config-options.md,
https://docs.wire.com/latest/developer/reference/oauth.html for more
context. ([WPB-28193] Disentangle oauth scopes (write access should not imply read access). #5542)
API changes
Remove deprecated field
profilePictfrom UserProfile. (Remove deprecated pict from user profile #5538)Meeting responses on V19 endpoints (create, get, list, update, link refresh) expose a
has_passwordfield indicating whether the meeting's join link is password-protected. (WPB-28126: Expose has_password on meeting responses #5595)Disentangle oauth scopes (write access should not imply read access).
{PUT,DELETE} /meetings/<domain>/<id>are now OAuth-accessible viawrite-only:meetings/delete-only:meetings. ([WPB-28193] Disentangle oauth scopes (write access should not imply read access). #5542)WPB-28222: add GET /calls/config/v3 with coturn native long-term TURN credentials #5590 API changes
GET /calls/config/v3serving TURN credentials in coturn's nativelong-term credential format instead of zauth:
usernameis<unix-expiry>:<uid>and
credentialis the base64-encoded HMAC-SHA1 of the username keyed with thecoturn
static-auth-secret. The endpoint is enabled by the new optional brigoption
turn.coturnSecret(path to the file containing the coturnstatic-auth-secret); while unset,
/calls/config/v3responds with500.Enabling
turn.coturnSecretrequires the entire advertised TURN fleet tovalidate coturn native long-term credentials;
turn.secret(zauth) remainsauthoritative for
/calls/configand/calls/config/v2.The meetings endpoints (POST /meetings, PUT /meetings/{domain}/{id}, GET /meetings/{domain}/{id}, GET /meetings/list) expose a
linkfield on the meeting object starting at API version V19: an https join link carrying the meeting's live join code askey/codequery parameters (<base>/meeting-join/?key=<codeKey>&code=<codeValue>&domain=<domain>). The field is present only when the meeting has a live join code; it is omitted otherwise (e.g. meetings created before this change, deployments whose code store cannot hold meeting codes, or multi-ingress deployments with no join-link URI configured for the user's domain). The V15-V18 endpoint shapes are unchanged. (WPB-28216: add POST /meetings/{domain}/{id}/link/refresh #5559)Added the
POST /mls/messages/targetedendpoint for persistent targeted MLS messages. (WPB-29005 persistent targeted MLS messages #5570, [fix] drop transient/targeted message if fed API version is unsupported #5634)Added
POST /mls/messages/transient-targetedfor submitting batches of transient targeted MLS messages. Messages are delivered to the specified recipient clients and are not persisted. (WPB-29006 transient targeted MLS messages #5599, [fix] drop transient/targeted message if fed API version is unsupported #5634)Added
POST /mls/messages/transientfor submitting a single transient broadcast MLS message. Messages are delivered to connected group members and are not persisted. (WPB-29007 transient broadcast MLS messages #5601, [fix] drop transient/targeted message if fed API version is unsupported #5634)The meeting
typeis no longer accepted onPUT /meetings/{domain}/{id}."recurrence": nullin an update body is now honored as "unset the recurrence" on all API versions (V15–V19); previously it was rejected with a 400 decode error. (WPB-29119: Meeting type is no longer updatable #5577)POST /meetings (V19) accepts an optional
passwordfield to password-protect the meeting's join link/code at creation time. (WPB-29268: optional password on POST /meetings #5588)Meeting join links are now capability-bearing query-parameter URLs (
<base>/meeting-join/?key=<codeKey>&code=<codeValue>&domain=<domain>), mirroring conversation join links. The join endpoints arePOST /meeting/{domain}/{key}/{code}/join?password=…and the unauthenticatedGET /meeting/{domain}/{key}/{code}/code-check?password=…: the stablekeyaddresses the code row and the rotatingcodevalue is the capability, so refreshing a link invalidates every previously issued URL. (WPB-28216: add POST /meetings/{domain}/{id}/link/refresh #5559)Add
GET /meeting/{domain}/{key}/{code}/code-check?password=…, which works without authentication and returns the metadata (title, time, recurrence) of the meeting a join link resolves to (404 meeting-not-foundfor unknown, stale, or expired codes and for keys addressing a conversation code;403 invalid-meeting-passwordwhen the link is password-protected and the password query param is missing or wrong). AddPOST /meeting/{domain}/{key}/{code}/join?password=…for authenticated users, which joins the meeting's conversation likePOST /conversations/joinvia the link's code access (re-joining is a no-op) and returns the meeting with its conversation view. Both replace the pre-releaseGET|POST /meeting-join?key=…&code=…routes. Known trade-off: the optionalpasswordtravels as a query parameter, so it can appear in access logs and browser history (nginz maskspassword=in its sanitized access log); it only gates joining a single meeting, not an account. (WPB-28989: add/meeting/{domain}/{key}/{code}/{code-check,join}#5560)Features
Added persistent targeted MLS messages. (WPB-29005 persistent targeted MLS messages #5570, [fix] drop transient/targeted message if fed API version is unsupported #5634)
Add support for transient targeted MLS messages. (WPB-29006 transient targeted MLS messages #5599, [fix] drop transient/targeted message if fed API version is unsupported #5634)
Added transient broadcast MLS messaging, including delivery to connected members of federated conversations. (WPB-29007 transient broadcast MLS messages #5601, [fix] drop transient/targeted message if fed API version is unsupported #5634)
SCIM: Allow calling /Users without a filter when the user store is backed by PostgreSQL. (SCIM: Allow GET /Users without filters #5627)
charts/wire-ingress: New
gateway.allowedListenerNamespacesadmits ListenerSets of companion charts (e.g. step-certificates) from other namespaces to the chart's Gateway; the release namespace is always admitted. WithFIPS_202205_tls_profile, the patch now also covers attached ListenerSets that have noClientTrafficPolicy. The README recommends theXDSNameSchemeV2runtime flag on Envoy Gateway 1.9 (withgateway.patchPolicies.xdsNameSchemeV2: true), because legacy listener names depend on ListenerSet creation order. The README no longer marks the chart as not ready for production. (wire-ingress: allow ListenerSets from other namespaces, extend FIPS patch to all of them #5600)charts/wire-ingress: The Envoy proxy fleet created by this chart now defaults to 3 replicas with advisory node/availability-zone spread. Adds a default PDB (except if replicas is set to 1). Default
gateway.zoneAwareRouting.enabledmakes Envoy prefer backend pods in its own availability zone, cutting inter-AZ traffic cost on multi-zone clusters. Newgateway.annotationsandgateway.infrastructure.labels. See the wire-ingress README. (WPB-27369 wire-ingress: HA, PDB, spreads across AZ #5574)Bug fixes and other updates
Remove nginz exposure of
/i/federation-status. (WPB-21058 [fix] nginz auth basic should not be active for /i/federation/status #5614)Stealth users are no longer returned by exact-handle searches, including
federated search and
POST /list-userswithqualified_handles. (WPB-25544 [fix] stealth users are searchable via federated search #5596)Fix suspended users blocking MLS messages and recovery. (WPB-29222 [fix] MLS group breaks with suspended users #5608)
fake-aws-s3 chart: minio and mc images now default to
quay.io/wire/mirror-images/minio/{minio,mc}. As the original repositorysources are gone, this avoids manual overrides in Helm values. (fix
make sboms-helm(SBOM creation) #5592)legalhold chart: postgresql subchart now pulls
bitnamilegacy/postgresql:11.10.0(docker.io/bitnamiwas deprovisioned).Fixes image pull failures. (fix
make sboms-helm(SBOM creation) #5592)Detect silent postgresql connection failures and discard connections. (Reconnect with postgresql when connections die silently #5547)
Documentation
Internal changes
Create new backoffice endpoint to export active users by TeamID (Add backoffice endpoint for team member csv #5594)
Galley conversation subsystem: throw
ConversationSubsystemErrorconstructorsdirectly instead of relying on
mapErrorsfor a set of standalone exceptions(
ChannelsNotEnabled,NotAnMlsConversation,MLSNonEmptyMemberList,NoBindingTeamMembers,BroadcastLimitExceeded,MLSFederatedOne2OneNotSupported,CreateConversationCodeConflict,InvalidTarget,MLSClientMismatch,MLSInvalidLeafNodeIndex,MLSUnsupportedProposal,MLSFederatedResetNotSupported,InvalidConversationPassword,AdminlessConversation). The correspondingErrorS/Errorentries andmapErrorlines are removed fromWire.ConversationSubsystem.Errors. No API, schema, or config change; themapped error responses are observationally identical.
Galley conversation subsystem: complete the ErrorS → ConversationSubsystemError migration. All remaining internal throws (conversation actions, MLS message path, OTR messages, codes/guest links, sub-conversations, NotConnected/MLSNotEnabled) now throw
ConversationSubsystemErrorconstructors directly; federation boundaries map via totalcseToGalleyError/galleyErrorToCSE. DeadErrorSchains (TooManyMembers,GroupIdVersionNotSupported), the per-tagHasConversationActionGalleyErrorsfamily, and a stray generatedlibs/wire-subsystems/configare removed. No API, schema, or config change.Remaining
ErrorSthrows inWire.ConversationSubsystemare migrated toConversationSubsystemError(MLSSubConvUnsupportedConvType, MLS message path,conversation delete, cells state, conversation-code URI, conversation creation,
MLS proposal failures). TeamSubsystem/TeamStore boundary functions
(
permissionCheck,lookupBindingTeam) are wrapped by local CSE variants(
permissionCheckCSE,lookupBindingTeamCSE). TheErrorSmachinery(
ConversationSubsystemErrorEffectsentries,mapErrorlines,RethrowErrors/ToGalleyRuntimeErrorinstances, deadgetMember, andUpdate.hs's-Wno-redundant-constraints) is removed, including the lastfour dead
ErrorSrows inConversationSubsystemErrorEffectsandUpdateConversationAccessEffects.No API, schema, or config change. (WPB-25033: throw ConversationSubsystemError constructors directly in ConversationSubsystem #5348)
Updated email templates to v1.0.160 (WPB-25931: Update email templates to v1.0.160 #5572)
Add meeting invitation, update and cancellation email operations to the email subsystem (WPB-25930: add meeting email operations to the EmailSubsystem effect #5605)
added tests for basic federation use cases across Fed API versions (WPB-29135 test basic federation use cases across Fed API versions #5589)
Envoy-mode integration tests: teardown and
hack/bin/integration-cleanup.shnow delete the Envoy Gateway proxies and federation Services that test runs create inenvoy-gateway-system(deleting the test namespaces alone leaked them), and setup waits until all Gateways are programmed, as helmfile does not wait for the Envoy proxies. (envoy orphan cleanup #5630)Add HIP-0015
helm.sh/imagesannotations to internal charts;hack/bin/set-wire-server-image-version.shstamps the:do-not-useplaceholder with the release version. (HIP-15 annotations for internal charts #5603)wire-ingress: Use ListenerSets for application listeners and traffic policies.
Requires Envoy Gateway >= 1.9; for 1.9, use Kubernetes 1.33–1.36 and Gateway API 1.6.1 standard CRDs plus matching Envoy Gateway extension CRDs.
Federation requires
extensionApis.enableLua: truein the controller configuration. (charts/wire-ingress: use ListenerSet by default #5591)SBOM generation: add placeholder Helm values so charts render without errors in
hack/bin/create-helm-sboms.sh. (fixmake sboms-helm(SBOM creation) #5592)Federation changes
Added the targeted MLS message notification to development Federation API V5. The recipient backend forwards each message only to the specified recipient client. (WPB-29005 persistent targeted MLS messages #5570, [fix] drop transient/targeted message if fed API version is unsupported #5634)
Federated transient targeted MLS messages through the targeted MLS message notification in development Federation API V5. Receiving backends deliver them only to the specified recipient clients and do not persist them. (WPB-29006 transient targeted MLS messages #5599, [fix] drop transient/targeted message if fed API version is unsupported #5634)
Added transient MLS broadcast message notifications to development Federation API V5. Receiving backends deliver them only to connected local clients and do not persist them. (WPB-29007 transient broadcast MLS messages #5601, [fix] drop transient/targeted message if fed API version is unsupported #5634)
Federation now has a runtime-controlled development API version. It is disabled by default.
Runtime disabling is supported for V2 and newer versions; legacy V0 and V1 cannot be disabled. (WPB-29133 add runtime controlled development version for federation API #5582)
Added a pinned Federation API V3 backend fixture and integration-test setup for local and Kubernetes CI testing. (WPB-29134 add pinned federation v3 artifact and fix local federation test setup #5583)