# KConnect — connexion et découverte Berkios

Source : https://docs.berkios.online/modules/kconnect/ · Section : Modules · Documentation officielle BERKIOS (https://docs.berkios.online)


KConnect donne à **KPartage** son transport réseau : il trouve les appareils voisins, échange les cartes pour l'appairage et
achemine les messages de partage. Il s'appuie sur **TCP + UDP sur une adresse IP locale**, donc sur toute liaison qui en
fournit une. Il est branché sur le moteur KPartage du même dossier de travail (même identité, mêmes appareils).

## Ce que KConnect fait et ne fait pas

| Liaison | Statut | Précision |
|---|---|---|
| Wi-Fi (même réseau) | ✅ disponible | découverte par balises UDP + TCP |
| Ethernet | ✅ disponible | idem |
| Point d'accès mobile (hotspot) | ⚠️ indirect | **le système** crée le point d'accès ; KConnect l'utilise ensuite comme un réseau IP. Berkios ne le crée pas : cela demande des droits système et une commande système, que les commandes Berkios n'exécutent pas |
| Wi-Fi Direct | ⚠️ indirect | une fois le groupe formé **par le système**, l'interface a une IP et KConnect la voit. La négociation du groupe n'est pas pilotable depuis Node : plugin d'hôte requis |
| Bluetooth | ❌ hôte requis | pas de pile Bluetooth dans le Bridge Node. Option immédiate : partage de connexion Bluetooth (PAN) du système → IP. Option native : l'application hôte fournit un transport respectant le contrat de KPartage (`send`, `onReceive`) |

`connect-liaisons` classe les interfaces (wifi, ethernet, hotspot, wifi-direct, bluetooth) d'après leur **nom et sous-réseau**
— c'est une estimation, marquée `estime: true`. `connect-liaison-instructions <type>` donne la marche à suivre exacte.
KConnect n'inclut pas non plus de transfert de gros fichiers : c'est KTransfer.

## Sécurité

- **Invisible par défaut.** Aucune balise n'est émise tant que `visible` n'est pas activé ; un appareil invisible refuse même les demandes de carte.
- **Réseau local uniquement** (10/8, 172.16/12, 192.168/16, lien local, boucle locale, IPv6 ULA) en entrant comme en sortant ; adresses IP littérales seulement (pas de noms d'hôte).
- **Appairage par fenêtre** : un voisin ne peut échanger sa carte que pendant une fenêtre ouverte par l'utilisateur (10 s à 10 min, 10 échanges maximum). Les appareils s'affichent ensuite le même code à 6 chiffres à confirmer (voir KPartage).
- **Trames chiffrées** (AES-256-GCM, clé dérivée de la clé de lien, direction liée) pour tout appareil *vérifié* : un faux point d'accès ne lit rien, et sa réponse non authentifiée est rejetée (`reponse_non_authentique`).
- **Balises usurpables, donc jamais crues** : si l'adresse d'un appareil vérifié change, KConnect ne bascule qu'après un ping scellé réussi.
- Limites : 32 connexions simultanées, 120 requêtes/min/adresse, trames ≤ 2 Mio, délai 10 s, longueur annoncée contrôlée avant toute allocation.

**Non protégé :** les échanges avec un appareil **non vérifié** circulent en clair (ils ne sont ni chiffrés ni signés) : n'y envoyez rien de sensible. Un pair malveillant du réseau local peut aussi saturer un port d'écoute ouvert (déni de service) ; n'activez `connect-demarrer` que quand l'utilisateur partage.

## Utilisation

Commandes : voir `COMMANDES.md` (14 commandes, permissions `connect.read` / `connect.manage`).

```js
import { KPartage } from '../kpartage/src/index.mjs';
import { KConnect } from './src/index.mjs';

const partage = new KPartage({ workspace: './mon-dossier', nom: 'Mon PC' });
const kc = new KConnect(partage);
await kc.demarrer({ visible: true });      // TCP 47600, UDP 47601
kc.ouvrirAppairage(120);                   // côté receveur
const voisins = await kc.rechercher();     // côté émetteur
const appareil = await kc.appairer(voisins[0].id);   // → { codeAppairage: '123 456', … } à comparer
```

Événements : `demarre`, `arrete`, `voisin`, `appairage-recu` (avec le code à afficher).

## Intégration

KConnect est le transport de KPartage (`attacherTransport`). Il n'est pas compatible avec les appareils simulés de KPartage
(transport mémoire) : l'un des deux à la fois (`transport_actif`). Le transfert des fichiers acceptés (`fetch`) est fourni par
KTransfer ; en attendant, `partage-recu-element-terminer` vérifie un fichier déposé par un autre moyen.

Tests : `npm test` (vrais sockets TCP/UDP sur la boucle locale). Non testé : réseaux réels, plusieurs interfaces, pare-feux, IPv6.
