mirror of
https://github.com/netbirdio/netbird.git
synced 2026-10-01 19:19:07 +02:00
fix: signal key transfer
This commit is contained in:
+21
-2
@@ -21,7 +21,7 @@ type PeerAgent struct {
|
||||
// Actual peer-to-peer connection
|
||||
conn *ice.Conn
|
||||
// a signal.Client to negotiate initial connection
|
||||
signal signal.Client
|
||||
signal *signal.Client
|
||||
// a connection to a local Wireguard instance to proxy data
|
||||
wgConn net.Conn
|
||||
// an address of local Wireguard instance
|
||||
@@ -29,7 +29,7 @@ type PeerAgent struct {
|
||||
}
|
||||
|
||||
// NewPeerAgent creates a new PeerAgent with give local and remote Wireguard public keys and initializes an ICE Agent
|
||||
func NewPeerAgent(localKey string, remoteKey string, stunTurnURLS []*ice.URL, wgAddr string) (*PeerAgent, error) {
|
||||
func NewPeerAgent(localKey string, remoteKey string, stunTurnURLS []*ice.URL, wgAddr string, signal *signal.Client) (*PeerAgent, error) {
|
||||
|
||||
// init ICE Agent
|
||||
iceAgent, err := ice.NewAgent(&ice.AgentConfig{
|
||||
@@ -47,6 +47,7 @@ func NewPeerAgent(localKey string, remoteKey string, stunTurnURLS []*ice.URL, wg
|
||||
wgAddr: wgAddr,
|
||||
conn: nil,
|
||||
wgConn: nil,
|
||||
signal: signal,
|
||||
}
|
||||
|
||||
err = peerAgent.onConnectionStateChange()
|
||||
@@ -217,6 +218,24 @@ func (pa *PeerAgent) onConnectionStateChange() error {
|
||||
})
|
||||
}
|
||||
|
||||
func (pa *PeerAgent) Start() error {
|
||||
localUFrag, localPwd, err := pa.iceAgent.GetLocalUserCredentials()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
offer := signal.MarshalCredential(pa.LocalKey, pa.RemoteKey, &signal.Credential{
|
||||
UFrag: localUFrag,
|
||||
Pwd: localPwd}, sProto.Message_OFFER)
|
||||
|
||||
err = pa.signal.Send(offer)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// authenticate sets the signal.Credential of the remote peer
|
||||
// and returns local Credentials
|
||||
func (pa *PeerAgent) Authenticate(credential *signal.Credential) (*signal.Credential, error) {
|
||||
|
||||
+15
-8
@@ -34,12 +34,13 @@ func NewEngine(signal *signal.Client, stunsTurns []*ice.URL, wgIface string, wgA
|
||||
}
|
||||
}
|
||||
|
||||
func (e *Engine) Start(localKey string, peers []string) error {
|
||||
func (e *Engine) Start(privateKey string, peers []string) error {
|
||||
|
||||
// setup wireguard
|
||||
myKey, err := wgtypes.ParseKey(localKey)
|
||||
myKey, err := wgtypes.ParseKey(privateKey)
|
||||
myPubKey := myKey.PublicKey().String()
|
||||
if err != nil {
|
||||
log.Errorf("error parsing Wireguard key %s: [%s]", localKey, err.Error())
|
||||
log.Errorf("error parsing Wireguard key %s: [%s]", privateKey, err.Error())
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -63,17 +64,23 @@ func (e *Engine) Start(localKey string, peers []string) error {
|
||||
|
||||
// initialize peer agents
|
||||
for _, peer := range peers {
|
||||
peerAgent, err := NewPeerAgent(localKey, peer, e.stunsTurns, fmt.Sprintf("127.0.0.1:%d", *wgPort))
|
||||
peerAgent, err := NewPeerAgent(myPubKey, peer, e.stunsTurns, fmt.Sprintf("127.0.0.1:%d", *wgPort), e.signal)
|
||||
if err != nil {
|
||||
log.Fatalf("failed creating peer agent for pair %s - %s", localKey, peer)
|
||||
log.Fatalf("failed creating peer agent for pair %s - %s", myPubKey, peer)
|
||||
return err
|
||||
}
|
||||
e.agents[localKey] = peerAgent
|
||||
e.agents[myPubKey] = peerAgent
|
||||
}
|
||||
|
||||
e.receiveSignal(localKey)
|
||||
e.receiveSignal(myPubKey)
|
||||
|
||||
// todo send offer to each peer
|
||||
for _, pa := range e.agents {
|
||||
err := pa.Start()
|
||||
if err != nil {
|
||||
log.Fatalf("failed starting agent %s %s", myPubKey, err)
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user