Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prevent AddPeerInfo to override existing server information #1752

Merged
merged 4 commits into from
Feb 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion be1-go/hub/standard_hub/hub_state/Peers.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package hub_state

import (
"golang.org/x/xerrors"
"popstellar/message/query/method"
"sync"

Expand All @@ -26,10 +27,19 @@ func NewPeers() Peers {
}

// AddPeerInfo adds a peer's info to the table
func (p *Peers) AddPeerInfo(socketId string, info method.ServerInfo) {
func (p *Peers) AddPeerInfo(socketId string, info method.ServerInfo) error {
p.Lock()
defer p.Unlock()

currentInfo, ok := p.peersInfo[socketId]
if ok {
return xerrors.Errorf(
"cannot add %s because peersInfo[%s] already contains %s",
info, socketId, currentInfo)
}

p.peersInfo[socketId] = info
return nil
}

// AddPeerGreeted adds a peer's socket ID to the slice of peers greeted
Expand Down
5 changes: 4 additions & 1 deletion be1-go/hub/standard_hub/message_handling.go
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,10 @@ func (h *Hub) handleGreetServer(socket socket.Socket, byteMessage []byte) error
}

// store information about the server
h.peers.AddPeerInfo(socket.ID(), greetServer.Params)
err = h.peers.AddPeerInfo(socket.ID(), greetServer.Params)
if err != nil {
return xerrors.Errorf("failed to add peer info: %v", err)
}

if h.peers.IsPeerGreeted(socket.ID()) {
return nil
Expand Down
70 changes: 70 additions & 0 deletions be1-go/hub/standard_hub/mod_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1877,6 +1877,76 @@ func Test_Handle_GreetServer_Already_Greeted(t *testing.T) {
require.Nil(t, sock.msg)
}

// Test that receiving multiple greet server messages from the same source will
// not override the existing server information and that an error is raised
func Test_Handle_GreetServer_Already_Received(t *testing.T) {
keypair := generateKeyPair(t)

hub, err := NewHub(keypair.public, "", "", nolog, nil)
require.NoError(t, err)

serverInfo1 := method.ServerInfo{
PublicKey: "",
ServerAddress: "ws://localhost:9003/server",
ClientAddress: "ws://localhost:9002/client",
}

serverInfo2 := method.ServerInfo{
PublicKey: "",
ServerAddress: "ws://localhost:9005/server",
ClientAddress: "ws://localhost:9004/client",
}

serverGreet1 := method.GreetServer{
Base: query.Base{
JSONRPCBase: jsonrpc.JSONRPCBase{
JSONRPC: "2.0",
},
Method: query.MethodGreetServer,
},
Params: serverInfo1,
}

serverGreet2 := method.GreetServer{
Base: query.Base{
JSONRPCBase: jsonrpc.JSONRPCBase{
JSONRPC: "2.0",
},
Method: query.MethodGreetServer,
},
Params: serverInfo2,
}

sock := &fakeSocket{id: "fakeID"}

msg1, err := json.Marshal(serverGreet1)
require.NoError(t, err)

msg2, err := json.Marshal(serverGreet2)
require.NoError(t, err)

err = hub.handleMessageFromServer(&socket.IncomingMessage{
Socket: sock,
Message: msg1,
})
require.NoError(t, err)
require.NoError(t, sock.err)

// check that handling GreetServer from the same source twice throw an error
err = hub.handleMessageFromServer(&socket.IncomingMessage{
Socket: sock,
Message: msg2,
})
require.Error(t, err)
require.Error(t, sock.err)

// check that the peersInfo were not modified by the second GreetServer
peersInfo := hub.GetPeersInfo()
require.Len(t, peersInfo, 1)
require.Equal(t, serverInfo1, peersInfo[0])
require.NotEqual(t, serverInfo2, peersInfo[0])
}

// -----------------------------------------------------------------------------
// Utility functions

Expand Down
Loading