2018-04-19 20:18:42 +03:00
|
|
|
package rendezvous
|
|
|
|
|
|
|
|
|
|
import (
|
2018-04-23 11:54:25 +03:00
|
|
|
"errors"
|
2018-04-21 12:06:27 +03:00
|
|
|
"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"
|
2018-04-21 12:06:27 +03:00
|
|
|
|
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
|
|
|
|
2020-10-28 14:39:21 +01: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 (
|
2021-09-30 10:39:04 -04:00
|
|
|
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
|
|
|
)
|
|
|
|
|
|
2018-04-21 12:06:27 +03:00
|
|
|
type RendezvousError struct {
|
|
|
|
|
Status pb.Message_ResponseStatus
|
|
|
|
|
Text string
|
|
|
|
|
}
|
2018-04-20 14:38:12 +03:00
|
|
|
|
2018-04-21 12:06:27 +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)
|
2021-09-29 14:33:27 -04:00
|
|
|
msg.Type = pb.Message_REGISTER
|
2018-04-19 20:18:42 +03:00
|
|
|
msg.Register = new(pb.Message_Register)
|
|
|
|
|
if ns != "" {
|
2021-09-29 14:33:27 -04:00
|
|
|
msg.Register.Ns = ns
|
2018-04-19 20:18:42 +03:00
|
|
|
}
|
|
|
|
|
if ttl > 0 {
|
|
|
|
|
ttl64 := int64(ttl)
|
2021-09-29 14:33:27 -04:00
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
2021-10-15 11:22:46 -04:00
|
|
|
msg.Register.SignedPeerRecord = envPayload
|
2021-10-01 13:39:50 -04:00
|
|
|
|
|
|
|
|
return msg, nil
|
2018-04-19 20:18:42 +03:00
|
|
|
}
|
|
|
|
|
|
2021-09-29 14:33:27 -04:00
|
|
|
func newDiscoverMessage(ns string, limit int) *pb.Message {
|
2018-04-19 20:18:42 +03:00
|
|
|
msg := new(pb.Message)
|
2021-09-29 14:33:27 -04:00
|
|
|
msg.Type = pb.Message_DISCOVER
|
2018-04-19 20:18:42 +03:00
|
|
|
msg.Discover = new(pb.Message_Discover)
|
|
|
|
|
if ns != "" {
|
2021-09-29 14:33:27 -04:00
|
|
|
msg.Discover.Ns = ns
|
2018-04-19 20:18:42 +03:00
|
|
|
}
|
|
|
|
|
if limit > 0 {
|
|
|
|
|
limit64 := int64(limit)
|
2021-09-29 14:33:27 -04:00
|
|
|
msg.Discover.Limit = limit64
|
2018-04-19 22:29:52 +03:00
|
|
|
}
|
2018-04-19 20:18:42 +03:00
|
|
|
return msg
|
|
|
|
|
}
|
|
|
|
|
|
2021-10-15 11:22:46 -04:00
|
|
|
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)
|
2021-09-29 14:33:27 -04:00
|
|
|
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)
|
2021-09-29 14:33:27 -04:00
|
|
|
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)
|
2021-09-29 14:33:27 -04:00
|
|
|
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
|
2021-09-29 14:33:27 -04:00
|
|
|
rreg.Ns = rns
|
2021-10-15 11:22:46 -04:00
|
|
|
rreg.SignedPeerRecord = reg.PeerEnvelope
|
2018-04-23 11:54:25 +03:00
|
|
|
rttl := int64(reg.Ttl)
|
2021-09-29 14:33:27 -04:00
|
|
|
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)
|
2021-09-29 14:33:27 -04:00
|
|
|
r.Status = status
|
|
|
|
|
r.StatusText = text
|
2018-04-23 11:54:25 +03:00
|
|
|
return r
|
|
|
|
|
}
|