Set-OPS-Public/roles/serveur_keycloak/tasks/courriel-realm.yml
Daniel Allaire 775df924cb identite : « mot de passe oublie » — raccord SMTP derive du plan
Le realm portait une politique d'acces complete et aucun moyen d'ecrire a qui
que ce soit. Tout oubli remontait donc a l'exploitant, qui n'avait d'autre
choix que de manipuler le mot de passe d'autrui.

- serveur_keycloak/tasks/courriel-realm.yml : reconcilie smtpServer et
  resetPasswordAllowed ; hote du relais DERIVE de applications.postfix.hote,
  et refus explicite si le plan ne declare pas de MTA.
- passe par l'API d'administration : kcadm.sh accepte les deux formes -s sur
  une map, sort en succes et n'ecrit rien (smtpServer reste vide).
- amorcage_acces_courriel redevient a declarer : cette adresse designe une
  personne, hors du systeme qu'on amorce ; une boite interne serait illisible
  tant qu'on n'a pas l'acces qu'on cherche justement a recuperer.
- autorisation.md §6.6 : le mecanisme, ses deux conditions, et l'ecart
  d'adresse laisse par l'ancien mode READ_ONLY de la federation.

Preuve : banniere SMTP lue depuis idm-01, RCPT TO accepte, execute-actions-email
declenche, MTA en starttls -> relay=mx.chezlepro.ca status=sent (250). Second
deploiement changed=0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-08 06:08:06 -04:00

76 lines
3.1 KiB
YAML

---
# Courriel du realm + « mot de passe oublie ». Voir defaults/main.yml.
#
# API d'administration et NON `kcadm.sh` : sur `smtpServer` (une map), kcadm
# accepte `-s smtpServer.host=…` COMME `-s 'smtpServer={"host":…}'`, sort en
# succes, n'ecrit rien — le champ restait `{ }` apres deux deploiements verts.
# Constate le 2026-08-08. Meme famille que le reste : une valeur declaree d'un
# cote, jamais verifiee de l'autre.
- name: Dériver l'hôte du relais SMTP depuis le plan
ansible.builtin.set_fact:
serveur_keycloak_smtp_hote: "{{ applications[serveur_keycloak_smtp_app].hote ~ '.' ~ domaine_interne }}"
when:
- serveur_keycloak_smtp_actif | bool
- ((applications | default({})).get(serveur_keycloak_smtp_app, {}).get('hote') | default('')) | length > 0
- name: Exiger un relais SMTP résolu
ansible.builtin.assert:
that:
- serveur_keycloak_smtp_hote | length > 0
fail_msg: >-
Aucun relais SMTP : l'application « {{ serveur_keycloak_smtp_app }} » n'est pas
déclarée au plan et `serveur_keycloak_smtp_hote` est vide. Activer
« mot de passe oublié » sans relais donnerait un écran qui promet un courriel
que personne n'enverrait.
when: serveur_keycloak_smtp_actif | bool
- name: Obtenir un jeton d'administration
ansible.builtin.uri:
url: "http://localhost:8080/realms/master/protocol/openid-connect/token"
method: POST
body_format: form-urlencoded
body:
grant_type: password
client_id: admin-cli
username: "{{ serveur_keycloak_admin_user }}"
password: "{{ serveur_keycloak_admin_password }}"
register: serveur_keycloak_smtp_jeton
no_log: true
- name: Lire la strophe courriel en place
ansible.builtin.uri:
url: "http://localhost:8080/admin/realms/{{ serveur_keycloak_realm }}"
headers:
Authorization: "Bearer {{ serveur_keycloak_smtp_jeton.json.access_token }}"
register: serveur_keycloak_realm_actuel
no_log: true
- name: Composer la strophe courriel attendue
ansible.builtin.set_fact:
serveur_keycloak_smtp_attendu:
host: "{{ serveur_keycloak_smtp_hote }}"
port: "{{ serveur_keycloak_smtp_port | string }}"
from: "{{ serveur_keycloak_smtp_expediteur }}"
fromDisplayName: "{{ serveur_keycloak_smtp_nom_expediteur }}"
starttls: "{{ serveur_keycloak_smtp_starttls | bool | string | lower }}"
auth: "false"
ssl: "false"
- name: Configurer le courriel du realm et le « mot de passe oublié »
ansible.builtin.uri:
url: "http://localhost:8080/admin/realms/{{ serveur_keycloak_realm }}"
method: PUT
status_code: [204]
headers:
Authorization: "Bearer {{ serveur_keycloak_smtp_jeton.json.access_token }}"
body_format: json
body:
smtpServer: "{{ serveur_keycloak_smtp_attendu }}"
resetPasswordAllowed: "{{ serveur_keycloak_reset_mot_de_passe | bool }}"
no_log: true
changed_when: true
when: >-
(serveur_keycloak_realm_actuel.json.smtpServer | default({})) != serveur_keycloak_smtp_attendu
or (serveur_keycloak_realm_actuel.json.resetPasswordAllowed | default(false) | bool)
!= (serveur_keycloak_reset_mot_de_passe | bool)