Skip to content

Notifications sur l'appareil des membres - #37

Merged
flocom merged 1 commit into
mainfrom
claude/remove-apel-sensitive-data-73l5iu
Aug 23, 2026
Merged

Notifications sur l'appareil des membres#37
flocom merged 1 commit into
mainfrom
claude/remove-apel-sensitive-data-73l5iu

Conversation

@flocom

@flocom flocom commented Aug 23, 2026

Copy link
Copy Markdown
Owner

Un message envoyé depuis Notifications arrive sur le téléphone ou l'ordinateur des membres visés, même site fermé.

Rien à configurer

La paire de clés VAPID est engendrée au premier abonnement et conservée chiffrée, comme les autres secrets. L'écriture n'a lieu que si la colonne est vide : deux abonnements simultanés sur une installation neuve retiennent la même paire.

Le membre garde la main, à deux niveaux

Réglage Portée
Interrupteur du compte coupe tout, sur tous les appareils
Activation par appareil le navigateur exige une autorisation explicite, et on peut vouloir être prévenu sur son téléphone mais pas sur l'ordinateur familial

Le choix du membre prime sur celui de l'expéditeur : un membre qui a coupé ne reçoit rien, même nommément visé.

Qui l'a reçu

L'écran d'envoi dit qui est joignable avant d'écrire — « 3 appareils », « aucun appareil activé », « a coupé les notifications ». L'historique dit ensuite ce qu'il est advenu de chaque envoi, appareil par appareil :

État Ce qu'il signifie
Transmise le service du navigateur a pris le message en charge — ne prouve rien de l'appareil
Reçue le service worker l'a effectivement reçu sur l'appareil
Ouverte la personne a cliqué dessus
Échec avec la raison

« Reçue » et « Ouverte » viennent du service worker lui-même : c'est la seule façon honnête de répondre à la question. L'accusé s'authentifie par un jeton propre à l'envoi glissé dans la charge utile — une notification peut arriver longtemps après une déconnexion, et exiger une session la perdrait.

Un abonnement révoqué par le navigateur (404/410) est retiré sur-le-champ.

Vérifications

Instance réelle, faux service de notification en HTTPS, vraies clés de chiffrement :

Test Résultat
Charge utile et en-tête VAPID 264 octets chiffrés, Authorization présent
Membre à deux appareils les deux servis, tracés séparément
Membre ayant coupé écarté, motif disabled
Abonnement périmé (410) envoi en échec et abonnement retiré
Accusés reçu / ouvert, sans session enregistrés
Accusé de réception tardif ne rétrograde pas une ouverture
Jeton inconnu sans effet
Les deux écrans dans un navigateur conformes, compteurs justes

Défaut trouvé par ce test et corrigé : le contact VAPID était transmis tel quel, or seules les adresses mailto: et https: sont acceptées — une instance sans e-mail de contact n'aurait rien pu envoyer.

Ajoute la dépendance web-push, un manifeste d'application (condition posée par iOS pour recevoir des notifications) et un service worker qui ne met rien en cache.

tsc --noEmit, npm run lint et next build passent.


Generated by Claude Code

Un message envoyé depuis « Notifications » arrive sur le téléphone ou
l'ordinateur des membres visés, même site fermé, via les notifications web du
navigateur.

Rien à configurer : la paire de clés VAPID est engendrée au premier abonnement
et conservée chiffrée, comme les autres secrets de l'application. L'écriture
n'a lieu que si la colonne est vide, si bien que deux abonnements simultanés
sur une installation neuve retiennent la même paire.

Chaque membre garde la main, à deux niveaux volontairement distincts. Un
interrupteur sur son compte coupe tout, partout ; l'activation, elle, se fait
appareil par appareil, puisque le navigateur exige une autorisation explicite
et qu'on peut vouloir être prévenu sur son téléphone mais pas sur
l'ordinateur familial. Le choix du membre prime sur celui de l'expéditeur : un
membre qui a coupé ne reçoit rien, même nommément visé.

L'écran d'envoi dit qui est joignable avant d'écrire, et l'historique dit ce
qu'il est advenu de chaque envoi, appareil par appareil. « Transmise » signifie
que le service du navigateur a pris le message en charge — ce qui ne prouve
rien de l'appareil. « Reçue » et « Ouverte » viennent du service worker
lui-même, qui accuse réception puis ouverture ; c'est la seule façon honnête de
répondre à « qui l'a reçu ». L'accusé s'authentifie par un jeton propre à
l'envoi, glissé dans la charge utile : une notification peut arriver longtemps
après une déconnexion.

Un abonnement révoqué par le navigateur (404 ou 410) est retiré sur-le-champ,
sans quoi il échouerait à chaque envoi.

Vérifié sur une instance réelle, avec un faux service de notification en HTTPS
et de vraies clés de chiffrement : charge utile chiffrée et en-tête VAPID
présents, deux appareils servis pour un même membre, membre ayant coupé écarté,
abonnement périmé retiré après un 410, accusés de réception et d'ouverture
enregistrés sans session, accusé tardif qui ne rétrograde pas une ouverture,
jeton inconnu sans effet, et les deux écrans conformes dans un navigateur.

Corrige au passage un défaut trouvé par ce test : le contact VAPID était
transmis tel quel, or seules les adresses `mailto:` et `https:` sont acceptées
— une instance sans e-mail de contact n'aurait rien pu envoyer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014SfQYBU4xXTeSEHKhHQXdD
@flocom
flocom merged commit 266f53f into main Aug 23, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants