140 lines
3.2 KiB
Go
Raw Normal View History

2018-04-19 20:18:42 +03:00
package rendezvous
import (
2018-04-23 11:54:25 +03:00
"errors"
"fmt"
2021-10-01 13:39:50 -04:00
"time"
2022-10-19 14:47:17 -04:00
libp2pCrypto "github.com/libp2p/go-libp2p/core/crypto"
"github.com/libp2p/go-libp2p/core/record"
2022-10-27 09:06:46 -04:00
pb "github.com/waku-org/go-waku-rendezvous/pb"
2018-04-19 20:18:42 +03:00
logging "github.com/ipfs/go-log/v2"
2022-10-19 14:47:17 -04:00
"github.com/libp2p/go-libp2p/core/peer"
"github.com/libp2p/go-libp2p/core/protocol"
2018-04-19 20:18:42 +03:00
)
2018-04-23 11:54:25 +03:00
var log = logging.Logger("rendezvous")
2018-04-19 20:18:42 +03:00
const (
RendezvousID_v001 = protocol.ID("/vac/waku/rendezvous/0.0.1")
2021-10-03 09:44:44 -04:00
DefaultTTL = 20 // 20 seconds
2018-04-19 20:18:42 +03:00
)
type RendezvousError struct {
Status pb.Message_ResponseStatus
Text string
}
2018-04-20 14:38:12 +03:00
func (e RendezvousError) Error() string {
return fmt.Sprintf("Rendezvous error: %s (%s)", e.Text, pb.Message_ResponseStatus(e.Status).String())
2018-04-20 14:38:12 +03:00
}
2021-10-01 13:39:50 -04:00
func newRegisterMessage(privKey libp2pCrypto.PrivKey, ns string, pi peer.AddrInfo, ttl int) (*pb.Message, error) {
2018-04-19 20:18:42 +03:00
msg := new(pb.Message)
msg.Type = pb.Message_REGISTER
2018-04-19 20:18:42 +03:00
msg.Register = new(pb.Message_Register)
if ns != "" {
msg.Register.Ns = ns
2018-04-19 20:18:42 +03:00
}
if ttl > 0 {
ttl64 := int64(ttl)
msg.Register.Ttl = ttl64
2018-04-19 20:18:42 +03:00
}
2021-10-01 13:39:50 -04:00
2021-10-03 09:44:44 -04:00
peerRecord := &peer.PeerRecord{
2021-10-01 13:39:50 -04:00
PeerID: pi.ID,
Addrs: pi.Addrs,
Seq: uint64(time.Now().Unix()),
2018-04-19 20:18:42 +03:00
}
2021-10-03 09:44:44 -04:00
envelope, err := record.Seal(peerRecord, privKey)
2021-10-01 13:39:50 -04:00
if err != nil {
return nil, err
2018-04-19 20:18:42 +03:00
}
2021-10-01 13:39:50 -04:00
envPayload, err := envelope.Marshal()
if err != nil {
return nil, err
}
msg.Register.SignedPeerRecord = envPayload
2021-10-01 13:39:50 -04:00
return msg, nil
2018-04-19 20:18:42 +03:00
}
func newDiscoverMessage(ns string, limit int) *pb.Message {
2018-04-19 20:18:42 +03:00
msg := new(pb.Message)
msg.Type = pb.Message_DISCOVER
2018-04-19 20:18:42 +03:00
msg.Discover = new(pb.Message_Discover)
if ns != "" {
msg.Discover.Ns = ns
2018-04-19 20:18:42 +03:00
}
if limit > 0 {
limit64 := int64(limit)
msg.Discover.Limit = limit64
2018-04-19 22:29:52 +03:00
}
2018-04-19 20:18:42 +03:00
return msg
}
func unmarshalSignedPeerRecord(envelopeBytes []byte) (peer.AddrInfo, error) {
2021-10-04 21:36:46 -04:00
envelope, rec, err := record.ConsumeEnvelope(envelopeBytes, peer.PeerRecordEnvelopeDomain)
2021-10-01 13:39:50 -04:00
if err != nil {
return peer.AddrInfo{}, err
2018-04-19 20:18:42 +03:00
}
2021-10-03 09:44:44 -04:00
peerRecord, ok := rec.(*peer.PeerRecord)
2021-10-01 13:39:50 -04:00
if !ok {
return peer.AddrInfo{}, errors.New("invalid peer record")
}
2021-10-04 21:36:46 -04:00
if !peerRecord.PeerID.MatchesPublicKey(envelope.PublicKey) {
return peer.AddrInfo{}, errors.New("signing key does not match peer record")
}
2021-10-03 09:44:44 -04:00
return peer.AddrInfo{ID: peerRecord.PeerID, Addrs: peerRecord.Addrs}, nil
2018-04-19 20:18:42 +03:00
}
2018-04-23 11:54:25 +03:00
2019-01-18 15:31:50 +02:00
func newRegisterResponse(ttl int) *pb.Message_RegisterResponse {
ttl64 := int64(ttl)
2018-04-23 11:54:25 +03:00
r := new(pb.Message_RegisterResponse)
r.Status = pb.Message_OK
r.Ttl = ttl64
2018-04-23 11:54:25 +03:00
return r
}
func newRegisterResponseError(status pb.Message_ResponseStatus, text string) *pb.Message_RegisterResponse {
r := new(pb.Message_RegisterResponse)
r.Status = status
r.StatusText = text
2018-04-23 11:54:25 +03:00
return r
}
2021-10-01 13:39:50 -04:00
func newDiscoverResponse(regs []RegistrationRecord) (*pb.Message_DiscoverResponse, error) {
2018-04-23 11:54:25 +03:00
r := new(pb.Message_DiscoverResponse)
r.Status = pb.Message_OK
2018-04-23 11:54:25 +03:00
rregs := make([]*pb.Message_Register, len(regs))
for i, reg := range regs {
rreg := new(pb.Message_Register)
rns := reg.Ns
rreg.Ns = rns
rreg.SignedPeerRecord = reg.PeerEnvelope
2018-04-23 11:54:25 +03:00
rttl := int64(reg.Ttl)
rreg.Ttl = rttl
2018-04-23 11:54:25 +03:00
rregs[i] = rreg
}
r.Registrations = rregs
2021-10-01 13:39:50 -04:00
return r, nil
2018-04-23 11:54:25 +03:00
}
func newDiscoverResponseError(status pb.Message_ResponseStatus, text string) *pb.Message_DiscoverResponse {
r := new(pb.Message_DiscoverResponse)
r.Status = status
r.StatusText = text
2018-04-23 11:54:25 +03:00
return r
}