Publier un Lien public et créer un brouillon privé chiffré #148

Open
opened 2026-08-22 18:34:11 +02:00 by nessar · 7 comments
nessar commented 2026-08-22 18:34:11 +02:00 (Migrated from 172.24.0.1:8928)

Parent

#135

What to build

Depuis un Appartement, permettre au Bailleur authentifié de publier son premier Lien public de candidature après activation du coffre par Passkey de candidature. L'ouverture anonyme de ce lien crée un brouillon vide distinct et redirige vers un Lien privé de reprise dont le serveur ne possède pas la clé de chiffrement.

Acceptance criteria

  • La Passkey n'est demandée qu'au moment où un Bailleur sans coffre demande son premier Lien public ; la boîte de dialogue explique données sensibles, chiffrement, passkey et perte irrécupérable avant confirmation.
  • Une annulation, une erreur WebAuthn ou l'absence de PRF ne crée ni coffre ni lien et propose une aide de compatibilité, sans PIN, clé serveur ou effet sur les fonctions sans Candidature.
  • Le navigateur crée le matériel RSA-OAEP 3072/SHA-256 du Bailleur, protège sa clé privée par PRF, HKDF-SHA-256 et AES-256-GCM, puis n'envoie que la clé publique et l'enveloppe chiffrée.
  • Un Appartement possède au plus un Lien public actif, consultable par son seul Bailleur après OIDC et contrôle backend du portefeuille.
  • Le GET public est sans effet ; le client anonyme exécuté lance le POST de création, obtient un nouveau DRAFT et remplace l'URL par son Lien privé sans clic supplémentaire. Une prévisualisation sans JavaScript ne crée rien.
  • Le Lien privé contient dans son fragment un identifiant technique, une capacité d'accès et la clé aléatoire de la Candidature ; le client transmet seulement la capacité, le serveur n'en conserve qu'une empreinte et ne peut pas reconstruire un lien perdu.
  • La clé de Candidature est chiffrée sous la clé publique du Bailleur ; aucune clé privée, clé de dossier ou donnée personnelle ne rejoint le serveur en clair.
  • Les pages publiques et privées anonymes utilisent un shell accessible sans écran OIDC, exposent la Notice d'information de candidature complète et son résumé, ainsi que des états véridiques de chargement et d'erreur.
  • Les routes publiques, à capacité et OIDC sont distinctes ; les réponses sensibles utilisent Cache-Control: no-store et Referrer-Policy: no-referrer, et aucun fragment, capacité, en-tête sensible ou matériel de clé n'est journalisé.
  • La création est limitée par Lien public et IP avec 429, sans CAPTCHA ; l'IP reste transitoire et n'entre jamais dans les métadonnées de la Candidature.
  • Le brouillon vide n'apparaît pas au Bailleur et les tests couvrent l'isolation, les formats cryptographiques, les altérations et l'absence de mode dégradé.

Blocked by

  • None — can start immediately.
## Parent #135 ## What to build Depuis un Appartement, permettre au Bailleur authentifié de publier son premier Lien public de candidature après activation du coffre par Passkey de candidature. L'ouverture anonyme de ce lien crée un brouillon vide distinct et redirige vers un Lien privé de reprise dont le serveur ne possède pas la clé de chiffrement. ## Acceptance criteria - [ ] La Passkey n'est demandée qu'au moment où un Bailleur sans coffre demande son premier Lien public ; la boîte de dialogue explique données sensibles, chiffrement, passkey et perte irrécupérable avant confirmation. - [ ] Une annulation, une erreur WebAuthn ou l'absence de PRF ne crée ni coffre ni lien et propose une aide de compatibilité, sans PIN, clé serveur ou effet sur les fonctions sans Candidature. - [ ] Le navigateur crée le matériel RSA-OAEP 3072/SHA-256 du Bailleur, protège sa clé privée par PRF, HKDF-SHA-256 et AES-256-GCM, puis n'envoie que la clé publique et l'enveloppe chiffrée. - [ ] Un Appartement possède au plus un Lien public actif, consultable par son seul Bailleur après OIDC et contrôle backend du portefeuille. - [ ] Le `GET` public est sans effet ; le client anonyme exécuté lance le `POST` de création, obtient un nouveau `DRAFT` et remplace l'URL par son Lien privé sans clic supplémentaire. Une prévisualisation sans JavaScript ne crée rien. - [ ] Le Lien privé contient dans son fragment un identifiant technique, une capacité d'accès et la clé aléatoire de la Candidature ; le client transmet seulement la capacité, le serveur n'en conserve qu'une empreinte et ne peut pas reconstruire un lien perdu. - [ ] La clé de Candidature est chiffrée sous la clé publique du Bailleur ; aucune clé privée, clé de dossier ou donnée personnelle ne rejoint le serveur en clair. - [ ] Les pages publiques et privées anonymes utilisent un shell accessible sans écran OIDC, exposent la Notice d'information de candidature complète et son résumé, ainsi que des états véridiques de chargement et d'erreur. - [ ] Les routes publiques, à capacité et OIDC sont distinctes ; les réponses sensibles utilisent `Cache-Control: no-store` et `Referrer-Policy: no-referrer`, et aucun fragment, capacité, en-tête sensible ou matériel de clé n'est journalisé. - [ ] La création est limitée par Lien public et IP avec `429`, sans CAPTCHA ; l'IP reste transitoire et n'entre jamais dans les métadonnées de la Candidature. - [ ] Le brouillon vide n'apparaît pas au Bailleur et les tests couvrent l'isolation, les formats cryptographiques, les altérations et l'absence de mode dégradé. ## Blocked by - None — can start immediately.
nessar commented 2026-08-22 18:34:12 +02:00 (Migrated from 172.24.0.1:8928)

mentioned in issue #149

mentioned in issue #149
nessar commented 2026-08-22 18:34:15 +02:00 (Migrated from 172.24.0.1:8928)

mentioned in issue #153

mentioned in issue #153
nessar commented 2026-09-05 13:34:27 +02:00 (Migrated from 172.24.0.1:8928)

mentioned in commit 06a8037ad9

mentioned in commit 06a8037ad930467f0e486d1b5ebc16198be551fb
nessar commented 2026-09-05 13:34:28 +02:00 (Migrated from 172.24.0.1:8928)

mentioned in commit 6afb2f68c3

mentioned in commit 6afb2f68c3deaf34163e488c172a554ecd817632
nessar commented 2026-09-05 13:34:33 +02:00 (Migrated from 172.24.0.1:8928)

mentioned in commit 48c903d7cb

mentioned in commit 48c903d7cb8cfa9145215a83c9d48ac4cf85b1ae
nessar commented 2026-09-05 13:34:33 +02:00 (Migrated from 172.24.0.1:8928)

mentioned in commit 6459d7b1d3

mentioned in commit 6459d7b1d3d684b1d166cc256c3d250e374e0e52

Preserved GitLab #148 history: source attribution, exact timestamps, discussion grouping and review positions. Historical diff snapshots: 0; visible source notes: 6.

gitlab-47-issue-148.md (SHA-256 24997578958605cbe4561a8c3faad965e75aabfa269b9a5b5809c681f361f523)

gitlab-47-issue-148.json (SHA-256 44ff72871781c117bac47075039b46c0a7e9834c9e20d5fbb69d96b4ca7b19e3)

Old CI job execution and reports are omitted. Original source files and rollback backups remain protected.

<!-- gitlab-to-gitea-history:47:Issue:148 --> Preserved GitLab #148 history: source attribution, exact timestamps, discussion grouping and review positions. Historical diff snapshots: 0; visible source notes: 6. [gitlab-47-issue-148.md](https://gitea.nessar.fr/attachments/c471ad34-f45e-4b10-8264-056d95e6a4fa) (SHA-256 `24997578958605cbe4561a8c3faad965e75aabfa269b9a5b5809c681f361f523`) [gitlab-47-issue-148.json](https://gitea.nessar.fr/attachments/f355f790-163e-4325-be60-105957e840a9) (SHA-256 `44ff72871781c117bac47075039b46c0a7e9834c9e20d5fbb69d96b4ca7b19e3`) Old CI job execution and reports are omitted. Original source files and rollback backups remain protected.
gitea-emergency added this to the Development project 2026-10-11 22:14:35 +02:00
gitea-emergency moved this to need-human-test in Development on 2026-10-11 22:14:35 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: nessar/lmnp-organizer#148