libs5-go/protocol/signed_handshake_done.go

166 lines
3.2 KiB
Go
Raw Permalink Normal View History

package protocol
2024-01-06 11:33:46 +00:00
import (
"bytes"
"errors"
"fmt"
"git.lumeweb.com/LumeWeb/libs5-go/types"
2024-01-08 03:35:41 +00:00
"git.lumeweb.com/LumeWeb/libs5-go/utils"
2024-01-06 11:33:46 +00:00
"github.com/vmihailenco/msgpack/v5"
"net/url"
2024-01-06 11:33:46 +00:00
)
var _ IncomingMessageSigned = (*HandshakeDone)(nil)
var _ EncodeableMessage = (*HandshakeDone)(nil)
2024-01-06 11:33:46 +00:00
type HandshakeDone struct {
challenge []byte
networkId string
2024-01-06 11:33:46 +00:00
supportedFeatures int
connectionUris []*url.URL
handshake []byte
HandshakeRequirement
}
func NewHandshakeDoneRequest(handshake []byte, supportedFeatures int, connectionUris []*url.URL) *HandshakeDone {
ho := &HandshakeDone{
handshake: handshake,
supportedFeatures: supportedFeatures,
connectionUris: connectionUris,
}
ho.SetRequiresHandshake(false)
return ho
}
func (m HandshakeDone) EncodeMsgpack(enc *msgpack.Encoder) error {
err := enc.EncodeUint(uint64(types.ProtocolMethodHandshakeDone))
if err != nil {
return err
}
err = enc.EncodeBytes(m.handshake)
if err != nil {
return err
}
err = enc.EncodeInt(int64(m.supportedFeatures))
if err != nil {
return err
}
2024-01-08 03:35:41 +00:00
err = utils.EncodeMsgpackArray(enc, m.connectionUris)
if err != nil {
return err
}
return nil
2024-01-06 11:33:46 +00:00
}
func (m *HandshakeDone) SetChallenge(challenge []byte) {
m.challenge = challenge
}
func (m *HandshakeDone) SetNetworkId(networkId string) {
m.networkId = networkId
}
2024-01-06 11:33:46 +00:00
func NewHandshakeDone() *HandshakeDone {
hn := &HandshakeDone{challenge: nil, networkId: "", supportedFeatures: -1}
hn.SetRequiresHandshake(false)
return hn
2024-01-06 11:33:46 +00:00
}
func (h HandshakeDone) HandleMessage(message IncomingMessageDataSigned) error {
mediator := message.Mediator
peer := message.Peer
verifyId := message.VerifyId
nodeId := message.NodeId
logger := message.Logger
if !mediator.ServicesStarted() {
err := peer.End()
2024-01-06 11:33:46 +00:00
if err != nil {
return nil
}
return nil
}
if !bytes.Equal(peer.Challenge(), h.challenge) {
2024-01-06 11:33:46 +00:00
return errors.New("Invalid challenge")
}
if !verifyId {
peer.SetId(nodeId)
} else {
if !peer.Id().Equals(nodeId) {
return fmt.Errorf("Invalid transports id on initial list")
2024-01-06 11:33:46 +00:00
}
}
2024-01-06 11:33:46 +00:00
peer.SetConnected(true)
peer.SetHandshakeDone(true)
2024-01-06 11:33:46 +00:00
if h.supportedFeatures != types.SupportedFeatures {
return fmt.Errorf("Remote node does not support required features")
}
err := mediator.AddPeer(peer)
if err != nil {
return err
}
2024-01-06 11:33:46 +00:00
if len(h.connectionUris) == 0 {
return nil
}
peerId, err := peer.Id().ToString()
2024-01-06 11:33:46 +00:00
if err != nil {
return err
}
2024-01-06 11:33:46 +00:00
for _, uri := range h.connectionUris {
uri.User = url.User(peerId)
}
peer.SetConnectionURIs(h.connectionUris)
logger.Info(fmt.Sprintf("[+] %s (%s)", peerId, peer.RenderLocationURI()))
2024-01-06 11:33:46 +00:00
err = mediator.ConnectToNode([]*url.URL{h.connectionUris[0]}, false, peer)
if err != nil {
return err
}
2024-01-06 11:33:46 +00:00
return nil
}
func (h *HandshakeDone) DecodeMessage(dec *msgpack.Decoder, message IncomingMessageDataSigned) error {
challenge, err := dec.DecodeBytes()
if err != nil {
return err
}
h.challenge = challenge
2024-01-06 11:33:46 +00:00
supportedFeatures, err := dec.DecodeInt()
if err != nil {
return err
}
h.supportedFeatures = supportedFeatures
2024-01-08 17:11:54 +00:00
connectionUris, err := utils.DecodeMsgpackURLArray(dec)
if err != nil {
return err
}
h.connectionUris = connectionUris
2024-01-06 11:33:46 +00:00
return nil
}