Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
f77dbf6
Merge pull request #5491 from wireapp/master
fisx Aug 28, 2026
01d80e8
[WPB-28089] Treat team collaborators like team members in contact sea…
fisx Aug 29, 2026
d63125f
Fix: active team invitation after SCIM user deletion (#5492)
supersven Aug 31, 2026
7cd8378
Fix: Fail on invalid Postgresql connection string combinations (#5494)
supersven Aug 31, 2026
4cc2948
WPB-28237 unlock prevent adminless groups feature (#5496)
battermann Aug 31, 2026
57bf3e1
[WPB-28448] Bump headroom to unreleased 0.5.0.0. (#5503)
fisx Sep 1, 2026
faaec63
treefmt: Remove headroom (#5506)
akshaymankar Sep 1, 2026
6fb1308
UserStore: Add migration logic and migration interpreter (#5324)
akshaymankar Sep 1, 2026
ef740c6
WPB-18929 [fix] SCIM cannot re invite user if initial invitation was …
battermann Sep 2, 2026
033a654
Revert "[WPB-28089] Treat team collaborators like team members in con…
battermann Sep 2, 2026
9a39b9c
WPB-28377: migrate gundeck presence from redis to PostGreSQL (#5493)
blackheaven Sep 3, 2026
990b4aa
WPB-23427 Adjust uncommon request flow (#5517)
battermann Sep 4, 2026
2c2fedb
WPB-28484 change default total limit bytes value to -1 (#5519)
VeryMilkyJoe Sep 7, 2026
b248725
fix the v17 swagger docs (#5529)
battermann Sep 9, 2026
915f304
WPB-28565 Finalize API version v18 (#5531)
battermann Sep 9, 2026
109ec41
Update developer docs (#5523)
VeryMilkyJoe Sep 9, 2026
946e277
WPB-28246: expose ssoIdpChangeDetectionEnabled via GET /system/settin…
blackheaven Sep 9, 2026
02557c5
WPB-28422 reconcile stale local memberships for deleted remote conver…
battermann Sep 10, 2026
ca0f6b6
WPB-28421 add an opt in policy for dropping unsupported federated not…
battermann Sep 10, 2026
d7dd619
WPB-26650 federate senderless adminless events (#5525)
battermann Sep 10, 2026
f57865f
WPB-28483: remove serial per-user round trips from MLS commit-bundle …
blackheaven Sep 10, 2026
47a8f02
WPB-27964 use CSP header of account pages (#5534)
battermann Sep 11, 2026
c6136fc
WPB-28565: rebump api v18 swagger docs (#5536)
blackheaven Sep 11, 2026
da4e4ba
WPB-28645: presence cleanup must not swallow async exceptions (#5535)
blackheaven Sep 11, 2026
628bd2c
WPB-28685 :Deliver meeting events via native push (APNs/FCM) (#5537)
blackheaven Sep 11, 2026
8e9310f
[WPB-27169] Script listing all commits and releases in which given fi…
fisx Sep 14, 2026
caa2b39
WPB-28697 add federated reminder events with origin user (#5540)
battermann Sep 14, 2026
435d343
WPB-28709 additional logging on failed mls commits (#5544)
battermann Sep 18, 2026
1dc34ef
revert redis retirement (#5545)
battermann Sep 18, 2026
bdf8e66
Add changelog for Release 2026-09-18
zebot Sep 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,74 @@
# [2026-09-18] (Chart Release 5.36.0)

## Release notes


* `preventAdminlessGroups` is unlocked by default (#5496)


## API changes


* Finalize API version v18 and create development version v19. (#5531, #5536)


## Features


* Add federation support for `preventAdminlessGroups` system notifications, with capability-aware handling for older remote backends. (#5525, #5540)

* Add `ssoIdpChangeDetectionEnabled` to `GET /system/settings`. (#5527)

* Change the default value of totalLimitBytes from one terrabyte to unlimited (#5519)

* Meeting events (`meeting.create`, `meeting.update`, `meeting.delete`, `meeting.member-add`) are now delivered to all push channels, including native push (APNs/FCM), so offline or backgrounded clients learn about meeting changes via native push instead of waiting for the next foreground sync. (#5537)

* Support migrating user data to postgresql from cassandra (#5324)


## Bug fixes and other updates


* Revoking a pending SCIM invitation now removes the associated Brig account and
Spar SCIM metadata synchronously, allowing the same SCIM user to be invited
again. (#5510)

* MLS message validation has been hardened. (#5517)

* Account pages now use the correct backend URL and CSP header on each multi-ingress domain. This applies to both ingress charts: `nginx-ingress-services` no longer includes the account-pages host in its generic CSP snippet, and `wire-ingress` (envoy-gateway) no longer injects a Content-Security-Policy response header on the account-pages route. The same fix is applied to the webapp route in `wire-ingress`, which had the same problem (`nginx-ingress-services` already skipped it). (#5534)

* Deleted SCIM users could still have pending team invitations. These are now
deleted (invalidated) with the SCIM user. (#5492)

* Postgresql connection strings with mismatched host/port counts in service
configurations now lead to immediate failure with a clear error message instead
of silently producing an erroneous connection. (#5494)


## Documentation


* Remove cabal update from build steps and fix some typos in developer docs (#5523)


## Internal changes


* Script listing all commits and releases in which given files have been touched. (#5509)

* MLS commit-bundles are processed with less sequential I/O: proposal references are resolved from a single store read, client and client-store updates fan out concurrently, and welcome pushes no longer block the response. (#5528)

* Add diagnostic logging for failed MLS commit-bundle operations, including typed failures and exceptions during commit-lock handling. (#5544)


## Federation changes


* Add an opt-in policy for dropping queued federation notifications when the target backend supports no compatible API version. (#5501)

* Remove stale local memberships when a remote conversation is definitively reported as not found. (#5504)


# [2026-08-27] (Chart Release 5.35.0)

## Release notes
Expand Down
10 changes: 5 additions & 5 deletions cassandra-schema.cql
Original file line number Diff line number Diff line change
Expand Up @@ -738,7 +738,7 @@ CREATE TABLE brig_test.rich_info (
AND crc_check_chance = 1.0
AND default_time_to_live = 0
AND extensions = {}
AND gc_grace_seconds = 864000
AND gc_grace_seconds = 86400
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
Expand Down Expand Up @@ -848,7 +848,7 @@ CREATE TABLE brig_test.service_team (
AND crc_check_chance = 1.0
AND default_time_to_live = 0
AND extensions = {}
AND gc_grace_seconds = 864000
AND gc_grace_seconds = 86400
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
Expand All @@ -874,7 +874,7 @@ CREATE TABLE brig_test.service_user (
AND crc_check_chance = 1.0
AND default_time_to_live = 0
AND extensions = {}
AND gc_grace_seconds = 864000
AND gc_grace_seconds = 86400
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
Expand Down Expand Up @@ -1088,7 +1088,7 @@ CREATE TABLE brig_test.user (
AND crc_check_chance = 1.0
AND default_time_to_live = 0
AND extensions = {}
AND gc_grace_seconds = 864000
AND gc_grace_seconds = 86400
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
Expand Down Expand Up @@ -1137,7 +1137,7 @@ CREATE TABLE brig_test.user_handle (
AND crc_check_chance = 1.0
AND default_time_to_live = 0
AND extensions = {}
AND gc_grace_seconds = 864000
AND gc_grace_seconds = 86400
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
Expand Down
15 changes: 13 additions & 2 deletions charts/nginx-ingress-services/templates/ingress.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
{{- $accountPagesDns := "" -}}
{{- if .Values.accountPages.enabled -}}
{{- $accountPagesDns = required "Need a 'config.dns.accountPages' name when accountPages.enabled is true." .Values.config.dns.accountPages -}}
{{- end -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
Expand Down Expand Up @@ -46,6 +50,13 @@ metadata:
if ($http_host = "{{ .Values.config.dns.webapp }}") {
set $skip_csp 1;
}
{{ if .Values.accountPages.enabled }}
# Like the webapp, account-pages provides multi-ingress aware CSP headers
# itself, so the approximation below must not overwrite them.
if ($http_host = "{{ $accountPagesDns }}") {
set $skip_csp 1;
}
{{ end }}
if ($uri ~ "^(/v[0-9]+)?/sso/(finalize-login|initiate-login)(/[a-zA-Z0-9-]*)?$|^/favicon\.ico$") {
set $skip_csp 1;
}
Expand Down Expand Up @@ -91,7 +102,7 @@ spec:
- {{ .Values.config.dns.teamSettings }}
{{- end }}
{{- if .Values.accountPages.enabled }}
- {{ .Values.config.dns.accountPages }}
- {{ $accountPagesDns }}
{{- end }}
secretName: {{ include "nginx-ingress-services.getCertificateSecretName" . | quote }}
rules:
Expand Down Expand Up @@ -142,7 +153,7 @@ spec:
number: {{ .Values.service.teamSettings.externalPort }}
{{- end }}
{{- if .Values.accountPages.enabled }}
- host: {{ .Values.config.dns.accountPages }}
- host: {{ $accountPagesDns }}
http:
paths:
- path: /
Expand Down
10 changes: 7 additions & 3 deletions charts/wire-ingress/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ name overrides, etc.) can be found in `values.yaml`.
| `config.ingressClass` | |
| `ingressName` | Replaced by `config.domains[].name` — see [Multi-ingress (multiple backend domains)](#multi-ingress-multiple-backend-domains) |
| `config.isAdditionalIngress` | Implicit — every `config.domains` entry after the first is an additional ingress |
| `config.renderCSPInIngress` | CSP is injected automatically on additional domains; opt out per-domain with `config.domains[].renderCSP: false` |
| `config.renderCSPInIngress` | CSP is injected automatically on additional domains (team-settings route only); opt out per-domain with `config.domains[].renderCSP: false` |
| `config.dns.base` | Replaced by `config.domains[].base` (used for the per-domain CSP wildcard) |
| `tls.verify_depth` | Envoy Gateway `ClientTrafficPolicy` does not expose a direct verify-depth knob; the CA chain itself controls this |
| `tls.enabled` | Removed — had no effect; all routes are always TLS-terminated |
Expand Down Expand Up @@ -250,8 +250,12 @@ config:

First entry = primary (listener `https`, un-suffixed names, no injected CSP — apps set their own).
Each additional entry gets its own listener `https-<name>`, cert/secret, suffixed routes, and an
injected per-domain CSP header on the webapp/team-settings/account-pages routes (opt out with
`renderCSP: false`).
injected per-domain CSP header on the team-settings route (opt out with `renderCSP: false`).

The webapp and account-pages routes never get an injected CSP, on any domain: both apps emit
correct per-domain headers themselves, and the injected header would replace them with a weaker
approximation. This matches the hosts the legacy `nginx-ingress-services` chart skips in its CSP
snippet. Team-settings does not yet support this, hence the approximation there.

Multi-ingress is mutually exclusive with federation: `config.domains` cannot be
combined with `federator.enabled: true`. Use federation with a single backend
Expand Down
8 changes: 7 additions & 1 deletion charts/wire-ingress/templates/_helpers.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,9 @@ Multi-domain: `config.domains` is a list; the FIRST entry is the primary
(its resources keep the un-suffixed names, and its frontend apps set their own
CSP so no CSP is injected). Every additional entry gets a `-<name>` suffix, its
own Gateway listener (`https-<name>`), its own certificate/secret, and — being
an "additional ingress" — a per-domain CSP header injected on the app routes.
an "additional ingress" — a per-domain CSP header injected on the team-settings
route. The webapp and account-pages routes never get an injected CSP: those
apps set multi-ingress aware headers themselves (see the httproute templates).

Each entry has: suffix, section, hostname, https, ssl, webapp, teamSettings,
accountPages, fakeS3, base, secretName, certName, issuerName, issuerKind,
Expand Down Expand Up @@ -183,6 +185,10 @@ for multi-ingress domains (charts/nginx-ingress-services/templates/ingress.yaml)
where the primary domain's frontend apps set CSP themselves but additional
domains need the header set at the front door.

Only the team-settings route uses this. The webapp and account-pages routes are
excluded, matching the `$skip_csp` hosts in the nginx chart's snippet, because
those apps emit correct per-domain headers on their own.

Call with a dict: {https, ssl, base, websockets (bool)}.
*/}}
{{- define "wire-ingress.cspHeader" -}}
Expand Down
13 changes: 5 additions & 8 deletions charts/wire-ingress/templates/httproute-account-pages.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,11 @@ spec:
- path:
type: PathPrefix
value: /
{{- if $domain.csp }}
filters:
- type: ResponseHeaderModifier
responseHeaderModifier:
set:
- name: Content-Security-Policy
value: {{ include "wire-ingress.cspHeader" (dict "https" $domain.https "ssl" $domain.ssl "base" $domain.base "websockets" $root.Values.websockets.enabled) | quote }}
{{- end }}
{{/* No CSP header is injected here. Unlike team-settings, account-pages
sets multi-ingress aware CSP headers itself, and a ResponseHeaderModifier
"set" filter would replace them with the weaker approximation from
wire-ingress.cspHeader. This mirrors the legacy nginx-ingress-services
chart, which skips its CSP snippet for this host. */}}
backendRefs:
- name: account-pages-http
port: {{ $root.Values.service.accountPages.externalPort }}
Expand Down
13 changes: 5 additions & 8 deletions charts/wire-ingress/templates/httproute-webapp.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,11 @@ spec:
- path:
type: PathPrefix
value: /
{{- if $domain.csp }}
filters:
- type: ResponseHeaderModifier
responseHeaderModifier:
set:
- name: Content-Security-Policy
value: {{ include "wire-ingress.cspHeader" (dict "https" $domain.https "ssl" $domain.ssl "base" $domain.base "websockets" $root.Values.websockets.enabled) | quote }}
{{- end }}
{{/* No CSP header is injected here. Unlike team-settings, the webapp
sets multi-ingress aware CSP headers itself, and a ResponseHeaderModifier
"set" filter would replace them with the weaker approximation from
wire-ingress.cspHeader. This mirrors the legacy nginx-ingress-services
chart, which skips its CSP snippet for this host. */}}
backendRefs:
- name: webapp-http
port: {{ $root.Values.service.webapp.externalPort }}
Expand Down
8 changes: 5 additions & 3 deletions charts/wire-ingress/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -125,8 +125,10 @@ gateway:
# the un-suffixed names, and its frontend apps set their own CSP). Every
# additional entry gets its own Gateway HTTPS listener (`https-<name>`), its own
# certificate/secret, and — being an "additional ingress" — a per-domain
# Content-Security-Policy header injected on the webapp/team-settings/
# account-pages routes (mirrors the legacy nginx-ingress-services behaviour).
# Content-Security-Policy header injected on the team-settings route (mirrors
# the legacy nginx-ingress-services behaviour). The webapp and account-pages
# routes are left alone: those apps set multi-ingress aware CSP headers
# themselves, and injecting here would overwrite them.
#
# config.dns and config.domains are mutually exclusive; config.domains wins.
#
Expand All @@ -153,7 +155,7 @@ gateway:
# https: nginz-https.red.example.org
# ssl: nginz-ssl.red.example.org
# webapp: webapp.red.example.org
# # renderCSP: false # optional: disable the injected CSP for this domain
# # renderCSP: false # optional: disable the injected CSP (team-settings) for this domain
# tls:
# # secretName: "" # optional TLS secret name override (defaults to a per-domain name)
# issuer: # optional per-domain cert-manager issuer override (defaults to tls.issuer)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ data:
migrateConversationCodes: {{ .migrateConversationCodes }}
migrateTeamFeatures: {{ .migrateTeamFeatures }}
migrateDomainRegistration: {{ .migrateDomainRegistration }}
migrateUsers: {{ .migrateUsers }}
migrationOptions:
{{ toYaml .migrationOptions | indent 6 }}

Expand Down
11 changes: 11 additions & 0 deletions charts/wire-server/templates/brig/configmap.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -396,5 +396,16 @@ data:
setNomadProfiles: {{ index . "setNomadProfiles" }}
{{- end }}
setConsumableNotifications: false
{{- /* Raw spar multi-ingress inputs (schema: spar.config in values.yaml).
Brig derives ssoIdpChangeDetectionEnabled from them at runtime
(see Brig.Options.deriveSsoIdpChangeDetectionEnabled). Keep the
rendered keys in sync with its FromJSON instance. */}}
{{- with $.Values.spar }}
{{- with .config }}
setSsoIdpChangeDetectionInputs:
multiIngressDomainConfigs: {{ .domainConfigs | default (dict) | toJson }}
idpCertFingerprintAllowlist: {{ .idpCertFingerprintAllowlist | default (list) | toJson }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
8 changes: 8 additions & 0 deletions charts/wire-server/templates/gundeck/configmap.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,14 @@ data:
{{- end }}
{{- end }}

{{- if .postgresql }}
postgresql: {{ toYaml .postgresql | nindent 6 }}
postgresqlPool: {{ toYaml .postgresqlPool | nindent 6 }}
{{- if hasKey $.Values.gundeck.secrets "pgPassword" }}
postgresqlPassword: /etc/wire/gundeck/secrets/pgPassword
{{- end }}
{{- end }}

# Gundeck uses discovery for AWS access key / secrets
# For more details, check amazonka's documentation at:
# https://hackage.haskell.org/package/amazonka-1.4.5/docs/Network-AWS.html#t:Credentials
Expand Down
3 changes: 3 additions & 0 deletions charts/wire-server/templates/gundeck/secret.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,8 @@ data:
{{- if hasKey . "redisAdditionalWritePassword" }}
redisAdditionalWritePassword: {{ .redisAdditionalWritePassword | b64enc | quote }}
{{- end }}
{{- if hasKey . "pgPassword" }}
pgPassword: {{ .pgPassword | b64enc | quote }}
{{- end }}
{{- end }}
{{- end }}
9 changes: 6 additions & 3 deletions charts/wire-server/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -260,10 +260,9 @@ galley:
allowed_to_open_channels: team-members
lockStatus: locked
preventAdminlessGroups:
# This feature has known errors. Thus, it must stay disabled for now.
defaults:
status: disabled
lockStatus: locked
lockStatus: unlocked
config:
promotionStrategy: alphabetical
deletionTimeoutDuration: 7d
Expand Down Expand Up @@ -314,7 +313,7 @@ galley:
collabora:
edition: COOL
storage:
totalLimitBytes: "1000000000000"
totalLimitBytes: "-1"
perUserQuotaBytes: "-1"
allowedGlobalOperations:
status: enabled
Expand Down Expand Up @@ -1026,6 +1025,10 @@ background-worker:
# It's important to set `settings.postgresMigration.domainRegistration` to `migration-to-postgresql`
# before starting the migration.
migrateDomainRegistration: false
# This will start the migration of users
# It's important to set `settings.postgresMigration.users` to `migration-to-postgresql`
# before starting the migration.
migrateUsers: false

backendNotificationPusher:
pushBackoffMinWait: 10000 # in microseconds, so 10ms
Expand Down
2 changes: 1 addition & 1 deletion deploy/dockerephemeral/docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ services:
POSTGRES_PASSWORD: "posty-the-gres"
POSTGRES_USER: "wire-server"
POSTGRES_DB: "backendA"
command: postgres -c max_connections=150
command: postgres -c max_connections=1000

cassandra:
container_name: demo_wire_cassandra
Expand Down
2 changes: 1 addition & 1 deletion docs/src/developer/developer/api-versioning.md
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ When invoking an endpoint as a federation client, we need to make sure that all
supported versions are covered. The `FederatorClient` monad has an
`Alternative` instance which can be useful for this purpose: an action will fail
(before even performing any request) if it refers to an endpoint whose version
range does not contain the version that was negotiatted.
range does not contain the version that was negotiated.

For example, suppose that `get-user-clients` disappears in version 2, and
clients are now supposed to use an endpoint called `get-clients-ng`, with
Expand Down
Loading