From 70008ab8c0ed207e4369679cb25a3fa1e7a25d28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D1=85=D0=B5=D1=80=D0=B5=D1=82=D0=B8=D0=BA?= <херетик@indra.org> Date: Fri, 16 Jun 2023 12:25:22 +0100 Subject: [PATCH] service made plural for easier database key --- pkg/engine/peerstore.go | 8 +-- pkg/engine/peerstore_test.go | 2 +- .../adservice.go => adservices/adservices.go} | 49 ++++++++++++------- .../adservices_test.go} | 20 +++++--- 4 files changed, 48 insertions(+), 31 deletions(-) rename pkg/onions/{adservice/adservice.go => adservices/adservices.go} (78%) rename pkg/onions/{adservice/adservice_test.go => adservices/adservices_test.go} (70%) diff --git a/pkg/engine/peerstore.go b/pkg/engine/peerstore.go index fe3806d7..1c564383 100644 --- a/pkg/engine/peerstore.go +++ b/pkg/engine/peerstore.go @@ -11,7 +11,7 @@ import ( "github.com/indra-labs/indra/pkg/onions/adaddress" "github.com/indra-labs/indra/pkg/onions/adintro" "github.com/indra-labs/indra/pkg/onions/adpeer" - "github.com/indra-labs/indra/pkg/onions/adservice" + "github.com/indra-labs/indra/pkg/onions/adservices" "github.com/indra-labs/indra/pkg/onions/ont" "github.com/indra-labs/indra/pkg/onions/reg" "github.com/indra-labs/indra/pkg/util/splice" @@ -82,11 +82,11 @@ func (ng *Engine) HandleAd(p *pubsub.Message, ctx context.Context) (e error) { _ = intr } - case *adservice.Ad: + case *adservices.Ad: log.D.Ln("received", reflect.TypeOf(c), "from gossip network") - if serv, ok := c.(*adservice.Ad); !ok { + if serv, ok := c.(*adservices.Ad); !ok { return fmt.Errorf(ErrWrongTypeDecode, - adservice.Magic, reflect.TypeOf(c).String()) + adservices.Magic, reflect.TypeOf(c).String()) } else { // If we got to here now we can add to the PeerStore. log.D.S("new ad for service:", c) diff --git a/pkg/engine/peerstore_test.go b/pkg/engine/peerstore_test.go index d904a490..2e3247d1 100644 --- a/pkg/engine/peerstore_test.go +++ b/pkg/engine/peerstore_test.go @@ -55,7 +55,7 @@ func TestEngine_PeerStore(t *testing.T) { t.FailNow() } //time.Sleep(time.Second) - //newServiceAd := adservice.NewServiceAd(nonce.NewID(), + //newServiceAd := adservices.NewServiceAd(nonce.NewID(), // engines[0].Manager.GetLocalNodeIdentityPrv(), // 20000, 54321, time.Now().Add(time.Hour*24*7)) //ss := splice.New(newServiceAd.Len()) diff --git a/pkg/onions/adservice/adservice.go b/pkg/onions/adservices/adservices.go similarity index 78% rename from pkg/onions/adservice/adservice.go rename to pkg/onions/adservices/adservices.go index dc11f221..d0407be3 100644 --- a/pkg/onions/adservice/adservice.go +++ b/pkg/onions/adservices/adservices.go @@ -1,4 +1,4 @@ -package adservice +package adservices import ( "fmt" @@ -24,12 +24,15 @@ var ( ) const ( - Magic = "svad" - Len = adproto.Len + - slice.Uint16Len + - slice.Uint32Len + Magic = "svad" + ServiceLen = slice.Uint16Len + slice.Uint32Len ) +type Service struct { + Port uint16 + RelayRate uint32 +} + // Ad stores a specification for the fee rate and the service port, which // must be a well known port to match with a type of service, eg 80 for web, 53 // for DNS, etc. These are also attached to the PeerAd entry via concatenating @@ -37,19 +40,18 @@ const ( // signals to stop scanning for more subsequent values. type Ad struct { adproto.Ad - Port uint16 - RelayRate uint32 + Services []Service } var _ coding.Codec = &Ad{} // NewServiceAd ... -func NewServiceAd(id nonce.ID, key *crypto.Prv, relayRate uint32, port uint16, +func NewServiceAd(id nonce.ID, key *crypto.Prv, services []Service, expiry time.Time) (sv *Ad) { s := splice.New(adintro.Len) k := crypto.DerivePub(key) - ServiceSplice(s, id, k, relayRate, port, expiry) + ServiceSplice(s, id, k, services, expiry) hash := sha256.Single(s.GetUntil(s.GetCursor())) var e error var sign crypto.SigBytes @@ -63,17 +65,22 @@ func NewServiceAd(id nonce.ID, key *crypto.Prv, relayRate uint32, port uint16, Expiry: time.Now().Add(adproto.TTL), Sig: sign, }, - RelayRate: relayRate, - Port: port, + Services: services, } return } func (x *Ad) Decode(s *splice.Splice) (e error) { + var i, count uint32 s.ReadID(&x.ID). ReadPubkey(&x.Key). - ReadUint16(&x.Port). - ReadUint32(&x.RelayRate). + ReadUint32(&count) + x.Services = make([]Service, count) + for ; i < count; i++ { + s.ReadUint16(&x.Services[i].Port). + ReadUint32(&x.Services[i].RelayRate) + } + s. ReadTime(&x.Expiry). ReadSignature(&x.Sig) return @@ -88,7 +95,7 @@ func (x *Ad) GetOnion() interface{} { return nil } func (x *Ad) Gossip(sm *sess.Manager, c qu.C) {} -func (x *Ad) Len() int { return Len } +func (x *Ad) Len() int { return adproto.Len + len(x.Services)*ServiceLen + slice.Uint32Len } func (x *Ad) Magic() string { return "" } @@ -115,7 +122,7 @@ func (x *Ad) Splice(s *splice.Splice) { } func (x *Ad) SpliceNoSig(s *splice.Splice) { - ServiceSplice(s, x.ID, x.Key, x.RelayRate, x.Port, x.Expiry) + ServiceSplice(s, x.ID, x.Key, x.Services, x.Expiry) } func (x *Ad) Validate() (valid bool) { @@ -132,14 +139,18 @@ func (x *Ad) Validate() (valid bool) { return false } -func ServiceSplice(s *splice.Splice, id nonce.ID, key *crypto.Pub, relayRate uint32, port uint16, expiry time.Time) { +func ServiceSplice(s *splice.Splice, id nonce.ID, key *crypto.Pub, services []Service, expiry time.Time) { s.Magic(Magic). ID(id). Pubkey(key). - Uint16(port). - Uint32(relayRate). - Time(expiry) + Uint32(uint32(len(services))) + for i := range services { + s. + Uint16(services[i].Port). + Uint32(services[i].RelayRate) + } + s.Time(expiry) } func init() { reg.Register(Magic, serviceAdGen) } diff --git a/pkg/onions/adservice/adservice_test.go b/pkg/onions/adservices/adservices_test.go similarity index 70% rename from pkg/onions/adservice/adservice_test.go rename to pkg/onions/adservices/adservices_test.go index 2220f107..1dc58d39 100644 --- a/pkg/onions/adservice/adservice_test.go +++ b/pkg/onions/adservices/adservices_test.go @@ -1,4 +1,4 @@ -package adservice +package adservices import ( "github.com/indra-labs/indra" @@ -19,7 +19,7 @@ func TestServiceAd(t *testing.T) { var e error pr, _, _ := crypto.NewSigner() id := nonce.NewID() - sv := NewServiceAd(id, pr, 20000, 80, time.Now().Add(time.Hour)) + sv := NewServiceAd(id, pr, []Service{{80, 50000},{443, 50000}}, time.Now().Add(time.Hour)) log.D.S("service", sv) s := splice.New(sv.Len()) if e = sv.Encode(s); fails(e) { @@ -42,13 +42,19 @@ func TestServiceAd(t *testing.T) { t.Error("did not unwrap expected type") t.FailNow() } - if svcAd.RelayRate != sv.RelayRate { - t.Errorf("relay rate did not decode correctly") + if len(sv.Services) != len(svcAd.Services) { + t.Errorf("number of services incorrectly decoded") t.FailNow() } - if svcAd.Port != sv.Port { - t.Errorf("port did not decode correctly") - t.FailNow() + for i := range sv.Services { + if svcAd.Services[i].RelayRate != sv.Services[i].RelayRate { + t.Errorf("relay rate did not decode correctly") + t.FailNow() + } + if svcAd.Services[i].Port != sv.Services[i].Port { + t.Errorf("port did not decode correctly") + t.FailNow() + } } if !svcAd.Key.Equals(crypto.DerivePub(pr)) { t.Errorf("public key did not decode correctly")