Files
computer-playbook/roles/web-app-stalwart/tasks/07_antivirus.yml
kevinveenbirkenbachandClaude Opus 5.5 c75648ccdd fix(web-app-stalwart): port the role to server v1.0.0 and guard 0.16 stores
Stalwart v1.0.0 rejects unknown JMAP properties ("Invalid property" ->
notCreated/notUpdated), validates OIDC tokens more strictly and refuses to
open a data store from before 1.0. Port the role and protect existing
installs:

- Milter: hostname/timeoutConnect/timeoutCommand/timeoutData become
  host/connectTimeout/commandTimeout/dataTimeout; the existing milter is
  looked up by host.
- Onion relay route: address becomes host.
- OIDC directory: requireAudience is gone. Set skipAudienceValidation and
  unscopedTokens=interoperable on create and update, so Keycloak tokens
  (no Stalwart audience, no mail scope) keep working for the WebUI and
  Roundcube XOAUTH2.
- WebUI: send oauthClientId only with SSO enabled; without SSO the WebUI
  falls back to its own client metadata document.
- Store guard: before anything changes, a running Stalwart whose table u
  still has the 0.16 bigint layout stops the deploy and points to the
  stalwart-migrate steps, which the README now documents under
  "Upgrading from 0.16".
- Updater: pin the WebUI git_tags source to v2.* to match server 1.x.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 13:46:08 +01:00

28 lines
1.1 KiB
YAML

---
# Register the ClamAV container as a DATA-stage milter (idempotent by host).
# Short timeouts + fail-open keep mail flowing while clamd warms up.
# JMAP request bodies live in templates/jmap/*.json.j2.
- name: "📖 List existing Stalwart milters"
include_tasks: jmap_call.yml
vars:
stalwart_jmap_body: "{{ lookup('template', 'jmap/milter/get.json.j2') }}"
- name: "🔍 Resolve existing ClamAV milter id (if any)"
ansible.builtin.set_fact:
stalwart_av_milter_id: >-
{{ (stalwart_jmap.methodResponses[0][1].list
| selectattr('host', 'equalto', STALWART_CLAMAV_HOST)
| map(attribute='id') | first) | default('') }}
- name: "📁 Create the ClamAV milter"
include_tasks: jmap_call.yml
vars:
stalwart_jmap_body: "{{ lookup('template', 'jmap/milter/create.json.j2') }}"
when: stalwart_av_milter_id | length == 0
- name: "🔄 Update the ClamAV milter timeouts (fail-open on slow/cold clamd)"
include_tasks: jmap_call.yml
vars:
stalwart_jmap_body: "{{ lookup('template', 'jmap/milter/update.json.j2') }}"
when: stalwart_av_milter_id | length > 0