70 lines
2.2 KiB
Plaintext
70 lines
2.2 KiB
Plaintext
@startuml connection_gater
|
|
title ConnectionGater — Vérification à l'admission (InterceptSecured)
|
|
|
|
participant "Remote Peer\n(inbound)" as Remote
|
|
participant "libp2p\nhost A" as Host
|
|
participant "OCConnectionGater" as Gater
|
|
participant "DB (oc-lib)" as DB
|
|
participant "Indexer X\n(joignable)" as IX
|
|
participant "Indexer Y\n(injoignable)" as IY
|
|
|
|
Remote -> Host: inbound connection (post-PSK, post-TLS)
|
|
Host -> Gater: InterceptSecured(dir=Inbound, id=RemotePeerID, conn)
|
|
|
|
alt dir == Outbound
|
|
Gater --> Host: true (outbound toujours autorisé)
|
|
end
|
|
|
|
== Étape 1 : Vérification base de données ==
|
|
|
|
Gater -> DB: NewRequestAdmin(PEER).Search(\n Filter: peer_id = RemotePeerID\n)
|
|
DB --> Gater: []peer.Peer
|
|
|
|
alt trouvé AND relation == BLACKLIST
|
|
Gater --> Host: false (refusé — blacklisté)
|
|
Host ->x Remote: connexion fermée
|
|
end
|
|
|
|
alt trouvé AND relation != BLACKLIST
|
|
Gater --> Host: true (connu et non blacklisté)
|
|
end
|
|
|
|
== Étape 2 : Vérification DHT (peer inconnu en DB) ==
|
|
|
|
note over Gater: Peer inconnu → vérifier qu'il existe\ndans le réseau DHT
|
|
|
|
Gater -> Gater: getReq = GetValue{PeerID: RemotePeerID}
|
|
|
|
loop Pour chaque indexeur (ordre aléatoire — Shuffle)
|
|
|
|
alt Indexer IY injoignable (transport error)
|
|
Gater -> IY: h.Connect(ctxTTL, IY_AddrInfo)
|
|
IY -->x Gater: connexion échouée
|
|
note over Gater: reachable=false\n→ essaie le suivant
|
|
end
|
|
|
|
alt Indexer IX joignable
|
|
Gater -> IX: h.Connect(ctxTTL, IX_AddrInfo)
|
|
IX --> Gater: OK
|
|
Gater -> IX: TempStream /opencloud/record/get/1.0
|
|
Gater -> IX: stream.Encode(GetValue{PeerID: RemotePeerID})
|
|
IX -> IX: Recherche locale + DHT si absent
|
|
IX --> Gater: GetResponse{Found: true/false, Records}
|
|
note over Gater: reachable=true → réponse autoritaire\n(DHT distribué : un seul indexeur suffit)
|
|
|
|
alt Found == true
|
|
Gater --> Host: true (pair connu du réseau)
|
|
else Found == false
|
|
Gater --> Host: false (refusé — inconnu du réseau)
|
|
Host ->x Remote: connexion fermée
|
|
end
|
|
end
|
|
end
|
|
|
|
alt Aucun indexeur joignable
|
|
note over Gater: Réseau naissant ou tous isolés.\nAutorisation par défaut.
|
|
Gater --> Host: true
|
|
end
|
|
|
|
@enduml
|