ncantu f9fe0e3419 Website-skeleton partie connectée, contrat en dur, navigate-login; UserWallet pairing-relay-status, redirect; website-data, proxy data, cryptographie, fixKnowledge
**Motivations:**
- Partie connectée du skeleton accessible seulement si pairing satisfait + relais OK, avec page type skeleton (avatar, notifications).
- Éviter « Aucun service disponible » : contrat présent en dur dans la page, transmis à l’iframe ; navigation évidente ou automatique vers login.
- Sécuriser postMessage (origine UserWallet uniquement) ; déployer data sur le proxy et certificat data.certificator.4nkweb.com.
- Vulgariser cryptographie (ECDH, AES-GCM, Schnorr, workflow, collecte signatures) ; documenter correctifs et architecture.

**Root causes:**
- Section connectée affichée sans vérifier pairing/relay ; possibilité de forger pairing-relay-status depuis la console.
- Iframe masquée ou /login chargé avant réception du contrat → graphe vide, redirection vers /services.
- Pas de contrôle d’origine sur les messages reçus ; pas de projet website-data ni config Nginx/certificat pour data.

**Correctifs:**
- Vérification msg.origin === USERWALLET_ORIGIN dans handleMessage (skeleton).
- Si session mais pas pairingRelayStatus : afficher iframe pour réception du statut, message « Vérification du statut… ».
- Contrat envoyé dès load iframe (init iframe.src = USERWALLET_ORIGIN) ; au clic « Se connecter », envoi contract + navigate-login (service, membre).
- UserWallet : écoute navigate-login → navigation /login?service=&membre= ; LoginScreen avec service+membre en URL ne redirige plus vers /services, dispatch E_SELECT_SERVICE / E_SELECT_MEMBER.

**Evolutions:**
- Message pairing-relay-status (iframe → parent) ; canShowConnectedSection exige login + pairing OK + relay OK ; page connectée avec header avatar + icône notifications.
- Skeleton : getLoginContext, sendNavigateLoginToIframe, onIframeLoad, loginRequested/iframeLoaded ; contrat envoyé avec serviceUuid, membreUuid.
- UserWallet : PairingRelayStatusMessage, envoi depuis HomeScreen/LoginScreen ; type navigate-login, handleNavigateLogin dans useChannel.
- Page cryptographie.html (workflow, algorithmes, collecte signatures) ; liens nav, build.
- website-data (Vite, channel, config), start/service/install ; configure-nginx-proxy + Certbot pour data.certificator.4nkweb.com.
- fixKnowledge (postmessage-origin, section-connectee-non-affichee) ; features (partie-connectee-pairing-relay, userwallet-iframe-key-isolation).

**Pages affectées:**
- website-skeleton (index, main, config, serviceContract, cryptographie, technique, membre, contrat, vite.config, README).
- userwallet (HomeScreen, LoginScreen, useChannel, iframeChannel, relay, crypto, iframe, Pairing*, RelaySettings, WordInputGrid, syncUpdateGraph, specs/synthese).
- website-data (nouveau), configure-nginx-proxy, docs DOMAINS_AND_PORTS README, features, fixKnowledge, userwallet features/docs.
2026-01-29 00:55:58 +01:00

243 lines
13 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Le contrat 4NK un nouveau web</title>
<style>
* { box-sizing: border-box; }
body {
font-family: system-ui, -apple-system, sans-serif;
max-width: 900px;
margin: 0 auto;
padding: 1rem;
line-height: 1.6;
color: #333;
}
h1 { font-size: 1.5rem; margin-bottom: 1rem; color: #222; }
h2 { font-size: 1.2rem; margin-top: 1.5rem; margin-bottom: 0.5rem; color: #333; }
h3 { font-size: 1rem; margin-top: 1rem; margin-bottom: 0.35rem; font-weight: 600; }
h4 { font-size: 0.95rem; margin-top: 0.75rem; margin-bottom: 0.25rem; font-weight: 600; color: #555; }
p { margin: 0.75rem 0; }
ul { margin: 0.5rem 0; padding-left: 1.5rem; }
li { margin: 0.4rem 0; }
a { color: #007bff; }
a:hover { text-decoration: underline; }
.highlight { background: #e8f4fd; padding: 1rem; border-radius: 8px; border-left: 4px solid #007bff; margin: 1rem 0; }
.commitment { background: #d4edda; padding: 1rem; border-radius: 8px; border-left: 4px solid #28a745; margin: 1rem 0; }
.your-part { background: #fff3cd; padding: 1rem; border-radius: 8px; border-left: 4px solid #ffc107; margin: 1rem 0; }
details { margin: 1rem 0; }
summary { cursor: pointer; font-weight: 600; color: #555; }
.meta { font-family: ui-monospace, monospace; font-size: 0.85rem; color: #666; background: #f5f5f5; padding: 0.2em 0.4em; border-radius: 4px; word-break: break-all; }
.member-list { list-style: none; padding-left: 0; }
.member-list > li { background: #f8f9fa; padding: 0.75rem 1rem; border-radius: 8px; border: 1px solid #e0e0e0; margin: 0.5rem 0; }
.member-list > li > em { color: #666; font-size: 0.9rem; }
.pair-list { list-style: none; margin-top: 0.5rem; padding-left: 1rem; border-left: 3px solid #007bff; }
.pair-list > li { background: #fff; padding: 0.5rem 0.75rem; border-radius: 6px; margin: 0.4rem 0; border: 1px solid #e8e8e8; }
.roles-intro { margin-bottom: 1rem; }
.role-block { background: #f8f9fa; border: 1px solid #e0e0e0; border-radius: 8px; padding: 0.75rem 1rem; margin: 0.5rem 0; }
.role-block h4 { margin-top: 0; }
.role-block .usage, .role-block .validation { font-size: 0.9rem; color: #555; margin: 0.25rem 0; }
.role-block .usage strong, .role-block .validation strong { color: #333; }
@media (max-width: 768px) {
body { padding: 0.75rem; }
h1 { font-size: 1.25rem; }
}
</style>
</head>
<body>
<h1>Le contrat</h1>
<p><a href="index.html">← Retour à l'accueil</a> · <a href="membre.html">Qui êtes-vous ?</a> · <a href="technique.html">Réseau P2P</a> · <a href="cryptographie.html">Cryptographie</a></p>
<div class="highlight">
<strong>En résumé :</strong> Ce contrat définit les règles de confiance entre vous et le service.
Il précise <strong>qui peut faire quoi</strong> et <strong>comment prouver son identité</strong>.
Tout est vérifiable et transparent.
</div>
<h2>Qu'est-ce que ce contrat ?</h2>
<p>
Ce n'est pas un contrat papier, mais un <strong>accord numérique</strong> qui établit les règles du jeu.
Il définit :
</p>
<ul>
<li><strong>Le service</strong> : Website Skeleton (ce site de démonstration).</li>
<li><strong>Les actions possibles</strong> : se connecter (login).</li>
<li><strong>Les validateurs</strong> : qui a le droit de vérifier les connexions.</li>
</ul>
<h2>Ce que le service s'engage à faire</h2>
<div class="commitment">
<ul>
<li><strong>Ne jamais stocker vos clés privées</strong> — elles restent sur votre appareil.</li>
<li><strong>Vérifier votre identité de façon transparente</strong> — via une preuve cryptographique que vous fournissez.</li>
<li><strong>Respecter les règles du contrat</strong> — publiquement vérifiables.</li>
<li><strong>Utiliser une clé de service déclarée</strong> — jamais exposée, mais vérifiable.</li>
</ul>
</div>
<h2>Ce que vous vous engagez à faire</h2>
<div class="your-part">
<ul>
<li><strong>Protéger votre appareil</strong> — c'est votre coffre-fort numérique.</li>
<li><strong>Fournir une preuve valide</strong> — en signant avec vos clés lors de la connexion.</li>
<li><strong>Être responsable de vos clés</strong> — si vous les perdez, personne ne peut les récupérer.</li>
</ul>
</div>
<h2>Les parties prenantes</h2>
<h3>Le service (Website Skeleton)</h3>
<p>
C'est le site que vous utilisez. Il possède sa propre identité (un « validateur ») qui permet
de vérifier que les connexions sont légitimes.
</p>
<h3>Vous (le membre connecté)</h3>
<p>
Vous êtes l'utilisateur qui souhaite accéder au service. Votre identité est prouvée par
la signature de votre appareil (<a href="membre.html">en savoir plus</a>).
</p>
<h2>Comment fonctionne la validation ?</h2>
<ol>
<li>Vous demandez à vous connecter.</li>
<li>Votre appareil crée une <strong>preuve</strong> (login-proof) signée avec vos clés.</li>
<li>Le service vérifie cette preuve grâce aux règles définies dans ce contrat.</li>
<li>Si la preuve est valide, vous êtes connecté. Sinon, l'accès est refusé.</li>
</ol>
<p>
Ce système est <strong>plus sûr</strong> qu'un mot de passe classique car il n'y a rien à voler côté serveur.
</p>
<h2>Pourquoi c'est plus sûr ?</h2>
<ul>
<li><strong>Pas de base de mots de passe</strong> à pirater.</li>
<li><strong>Vos clés ne transitent jamais</strong> sur le réseau.</li>
<li><strong>Chaque connexion est unique</strong> (signature à usage unique).</li>
<li><strong>Vérifiable par tous</strong> — les règles du contrat sont publiques.</li>
</ul>
<h2>Infrastructure, gouvernance et preuves</h2>
<p>
L'<strong>infrastructure</strong> (relais, stockage des messages et des signatures) est <strong>décentralisée et neutre</strong> :
elle ne dépend pas d'un acteur unique.
</p>
<p>
Les <strong>membres</strong> ont une <strong>liberté de gouvernance</strong>. Certains peuvent choisir une organisation
<strong>centralisée</strong> lorsque c'est préférable (équipe, processus, conformité). D'autres restent décentralisés.
</p>
<p>
L'important est d'avoir les <strong>preuves de la bonne exécution du contrat entre les parties</strong> :
signatures, nonces, règles publiques. Ces preuves restent vérifiables quelle que soit l'organisation
(décentralisée ou centralisée) des membres.
</p>
<details>
<summary>Détails techniques du contrat</summary>
<h3>Identifiants</h3>
<ul>
<li>Contrat UUID : <span class="meta">f9b9b336-4282-4c1c-b70b-e5197aeae3fa</span></li>
<li>Service UUID : <span class="meta">32b9095a-562d-4239-ae45-2d7ffb1a40de</span></li>
<li>Action login UUID : <span class="meta">0ac7de59-9e81-4bdc-bd19-c07750fad48e</span></li>
<li>Validateur (membre) : <span class="meta">0e865301-362f-4951-bfbc-531b7bddf820</span></li>
</ul>
<h3>Rôles par défaut (types de Champ)</h3>
<p class="roles-intro">
Les <strong>11 rôles</strong> cidessous existent par défaut. Chacun peut être <strong>vide</strong> (aucun membre)
ou <strong>plein</strong> (membres et pairs définis). Tous sont <strong>connus des participants</strong> ;
les conditions d'usage et de validation s'appliquent dès qu'un rôle est rempli.
</p>
<div class="role-block">
<h4>1. Partage avec les institutions</h4>
<p class="usage"><strong>Usage :</strong> Partager des données avec des institutions.</p>
<p class="validation"><strong>Validation :</strong> Conformité aux validateurs du champ ; signatures requises selon <code>membres_du_role</code>.</p>
</div>
<div class="role-block">
<h4>2. Messages au RSSI</h4>
<p class="usage"><strong>Usage :</strong> Messages au RSSI de la société responsable du service.</p>
<p class="validation"><strong>Validation :</strong> Signatures des membres du rôle conformes aux <code>signatures_obligatoires</code>.</p>
</div>
<div class="role-block">
<h4>3. Messages au Correspondant CNIL</h4>
<p class="usage"><strong>Usage :</strong> Messages au Correspondant CNIL de la société responsable du service.</p>
<p class="validation"><strong>Validation :</strong> Signatures des membres du rôle ; attributs CNIL requis si applicables.</p>
</div>
<div class="role-block">
<h4>4. Messages au Responsable cybersécurité</h4>
<p class="usage"><strong>Usage :</strong> Messages au Responsable cybersécurité de la société responsable du service.</p>
<p class="validation"><strong>Validation :</strong> Signatures conformes aux validateurs du champ.</p>
</div>
<div class="role-block">
<h4>5. Messages de support infogérant</h4>
<p class="usage"><strong>Usage :</strong> Support infogérant du service (peut inclure un membre du miner pour la gestion des clés API).</p>
<p class="validation"><strong>Validation :</strong> Signatures des membres du rôle ; <code>membre_miner_uuid</code> optionnel dans <code>datajson</code> si applicable.</p>
</div>
<div class="role-block">
<h4>6. Messages de support administrateur système</h4>
<p class="usage"><strong>Usage :</strong> Support administrateur système du service.</p>
<p class="validation"><strong>Validation :</strong> Signatures conformes aux validateurs du champ.</p>
</div>
<div class="role-block">
<h4>7. Messages de support niveau 1</h4>
<p class="usage"><strong>Usage :</strong> Support niveau 1 du service.</p>
<p class="validation"><strong>Validation :</strong> Signatures conformes aux validateurs du champ.</p>
</div>
<div class="role-block">
<h4>8. Messages de support niveau 2</h4>
<p class="usage"><strong>Usage :</strong> Support niveau 2 du service.</p>
<p class="validation"><strong>Validation :</strong> Signatures conformes aux validateurs du champ.</p>
</div>
<div class="role-block">
<h4>9. Messages de support niveau 3</h4>
<p class="usage"><strong>Usage :</strong> Support niveau 3 du service.</p>
<p class="validation"><strong>Validation :</strong> Signatures conformes aux validateurs du champ.</p>
</div>
<div class="role-block">
<h4>10. Validation (contrat)</h4>
<p class="usage"><strong>Usage :</strong> Valider le contrat ; définir qui peut signer pour le contrat (<code>contrat.validateurs.membres_du_role</code>).</p>
<p class="validation"><strong>Validation :</strong> Au moins une signature valide par membre du rôle ; clés publiques autorisées dans <code>signatures_obligatoires</code>.</p>
</div>
<div class="role-block">
<h4>11. Validation du login</h4>
<p class="usage"><strong>Usage :</strong> Valider le login ; définir qui peut signer pour l'action login (<code>action.validateurs_action.membres_du_role</code>).</p>
<p class="validation"><strong>Validation :</strong> Preuve de login (hash, nonce) signée par les pairs des membres du rôle ; nonce unique ; clés autorisées.</p>
</div>
<h3>Membres par rôles (ce contrat)</h3>
<p>Ce contrat skeleton remplit uniquement les rôles <strong>Validation (contrat)</strong> et <strong>Validation du login</strong>. Les autres rôles sont vides mais connus.</p>
<h4>Validation (contrat)</h4>
<ul class="member-list">
<li>
<strong>Membre</strong> : <span class="meta">0e865301-362f-4951-bfbc-531b7bddf820</span>
<br><em>Signatures obligatoires : 1</em>
<ul class="pair-list">
<li>
<strong>Pair 1</strong> : <span class="meta">f2779304-0d9b-4139-9aee-8d3347819d98</span>
<br>Clé publique : <span class="meta">0244f299538f4a091d93561dcee0c77de3e0d8bb917c9378405653c57f7800f174</span>
</li>
</ul>
</li>
</ul>
<h4>Validation du login</h4>
<ul class="member-list">
<li>
<strong>Membre</strong> : <span class="meta">0e865301-362f-4951-bfbc-531b7bddf820</span>
<br><em>Signatures obligatoires : 1</em>
<ul class="pair-list">
<li>
<strong>Pair 1</strong> : <span class="meta">f2779304-0d9b-4139-9aee-8d3347819d98</span>
<br>Clé publique : <span class="meta">0244f299538f4a091d93561dcee0c77de3e0d8bb917c9378405653c57f7800f174</span>
</li>
</ul>
</li>
</ul>
</details>
<p><a href="index.html">← Retour à l'accueil</a> · <a href="membre.html">Qui êtes-vous ?</a> · <a href="technique.html">Réseau P2P</a> · <a href="cryptographie.html">Cryptographie</a></p>
</body>
</html>