From 4e70593d63ae1598f9139eb6daa7c2250113b9d7 Mon Sep 17 00:00:00 2001
From: Wolfgang Welz <welzwo@gmail.com>
Date: Fri, 17 Jan 2020 09:14:33 +0100
Subject: [PATCH] Fix: Ignore rejected peering requests (#137)

* fix: ignore rejected peering requests

* Do not store local services in DB
---
 packages/autopeering/peer/local.go  | 19 +++-------------
 packages/autopeering/peer/mapdb.go  | 33 +++++----------------------
 packages/autopeering/peer/peerdb.go | 35 +----------------------------
 plugins/analysis/client/plugin.go   | 14 +++++++-----
 plugins/autopeering/plugin.go       |  8 +++++--
 plugins/gossip/plugin.go            |  6 +++++
 6 files changed, 31 insertions(+), 84 deletions(-)

diff --git a/packages/autopeering/peer/local.go b/packages/autopeering/peer/local.go
index 65638ae1..32a7a9df 100644
--- a/packages/autopeering/peer/local.go
+++ b/packages/autopeering/peer/local.go
@@ -50,18 +50,9 @@ func NewLocal(network string, address string, db DB) (*Local, error) {
 	if l := len(key); l != ed25519.PrivateKeySize {
 		return nil, fmt.Errorf("invalid key length: %d, need %d", l, ed25519.PublicKeySize)
 	}
-	services, err := db.LocalServices()
-	if err != nil {
-		return nil, err
-	}
-	serviceRecord := services.CreateRecord()
-
-	// update the external address used for the peering and store back in DB
+	// update the external address used for the peering
+	serviceRecord := service.New()
 	serviceRecord.Update(service.PeeringKey, network, address)
-	err = db.UpdateLocalServices(serviceRecord)
-	if err != nil {
-		return nil, err
-	}
 
 	return newLocal(key, serviceRecord, db), nil
 }
@@ -81,12 +72,8 @@ func (l *Local) UpdateService(key service.Key, network string, address string) e
 	l.mu.Lock()
 	defer l.mu.Unlock()
 
-	// update the service in the read protected map and store back in DB
+	// update the service in the read protected map
 	l.serviceRecord.Update(key, network, address)
-	err := l.db.UpdateLocalServices(l.serviceRecord)
-	if err != nil {
-		return err
-	}
 
 	// create a new peer with the corresponding services
 	l.Peer = *NewPeer(l.key.Public(), l.serviceRecord)
diff --git a/packages/autopeering/peer/mapdb.go b/packages/autopeering/peer/mapdb.go
index 03719614..df3ead3f 100644
--- a/packages/autopeering/peer/mapdb.go
+++ b/packages/autopeering/peer/mapdb.go
@@ -4,16 +4,14 @@ import (
 	"sync"
 	"time"
 
-	"github.com/iotaledger/goshimmer/packages/autopeering/peer/service"
 	"github.com/iotaledger/hive.go/logger"
 )
 
 // mapDB is a simple implementation of DB using a map.
 type mapDB struct {
-	mutex    sync.RWMutex
-	m        map[string]peerEntry
-	key      PrivateKey
-	services *service.Record
+	mutex sync.RWMutex
+	m     map[string]peerEntry
+	key   PrivateKey
 
 	log *logger.Logger
 
@@ -34,10 +32,9 @@ type peerPropEntry struct {
 // NewMemoryDB creates a new DB that uses a GO map.
 func NewMemoryDB(log *logger.Logger) DB {
 	db := &mapDB{
-		m:        make(map[string]peerEntry),
-		services: service.New(),
-		log:      log,
-		closing:  make(chan struct{}),
+		m:       make(map[string]peerEntry),
+		log:     log,
+		closing: make(chan struct{}),
 	}
 
 	// start the expirer routine
@@ -70,24 +67,6 @@ func (db *mapDB) LocalPrivateKey() (PrivateKey, error) {
 	return db.key, nil
 }
 
-// LocalServices returns the services stored in the database or creates an empty map.
-func (db *mapDB) LocalServices() (service.Service, error) {
-	db.mutex.RLock()
-	defer db.mutex.RUnlock()
-
-	return db.services, nil
-}
-
-// UpdateLocalServices updates the services stored in the database.
-func (db *mapDB) UpdateLocalServices(services service.Service) error {
-	record := services.CreateRecord()
-
-	db.mutex.Lock()
-	defer db.mutex.Unlock()
-	db.services = record
-	return nil
-}
-
 // LastPing returns that property for the given peer ID and address.
 func (db *mapDB) LastPing(id ID, address string) time.Time {
 	db.mutex.RLock()
diff --git a/packages/autopeering/peer/peerdb.go b/packages/autopeering/peer/peerdb.go
index b5cfcdfb..106517aa 100644
--- a/packages/autopeering/peer/peerdb.go
+++ b/packages/autopeering/peer/peerdb.go
@@ -7,7 +7,6 @@ import (
 	"sync"
 	"time"
 
-	"github.com/iotaledger/goshimmer/packages/autopeering/peer/service"
 	"github.com/iotaledger/goshimmer/packages/database"
 	"github.com/iotaledger/hive.go/logger"
 )
@@ -29,10 +28,6 @@ const (
 type DB interface {
 	// LocalPrivateKey returns the private key stored in the database or creates a new one.
 	LocalPrivateKey() (PrivateKey, error)
-	// LocalServices returns the services stored in the database or creates an empty services.
-	LocalServices() (service.Service, error)
-	// UpdateLocalServices updates the services stored in the database.
-	UpdateLocalServices(services service.Service) error
 
 	// Peer retrieves a peer from the database.
 	Peer(id ID) *Peer
@@ -72,8 +67,7 @@ const (
 	dbNodePong = "lastpong"
 
 	// Local information is keyed by ID only. Use localFieldKey to create those keys.
-	dbLocalKey      = "key"
-	dbLocalServices = "services"
+	dbLocalKey = "key"
 )
 
 // NewPersistentDB creates a new persistent DB.
@@ -192,33 +186,6 @@ func (db *persistentDB) LocalPrivateKey() (PrivateKey, error) {
 	return key, nil
 }
 
-// LocalServices returns the services stored in the database or creates an empty services.
-func (db *persistentDB) LocalServices() (service.Service, error) {
-	key, err := db.db.Get(localFieldKey(dbLocalServices))
-	if err == database.ErrKeyNotFound {
-		return service.New(), nil
-	}
-	if err != nil {
-		return nil, err
-	}
-
-	services, err := service.Unmarshal(key)
-	if err != nil {
-		return nil, err
-	}
-
-	return services, nil
-}
-
-// UpdateLocalServices updates the services stored in the database.
-func (db *persistentDB) UpdateLocalServices(services service.Service) error {
-	value, err := services.CreateRecord().CreateRecord().Marshal()
-	if err != nil {
-		return err
-	}
-	return db.db.Set(localFieldKey(dbLocalServices), value)
-}
-
 // LastPing returns that property for the given peer ID and address.
 func (db *persistentDB) LastPing(id ID, address string) time.Time {
 	return time.Unix(db.getInt64(nodeFieldKey(id, address, dbNodePing)), 0)
diff --git a/plugins/analysis/client/plugin.go b/plugins/analysis/client/plugin.go
index ccec3955..b9179be1 100644
--- a/plugins/analysis/client/plugin.go
+++ b/plugins/analysis/client/plugin.go
@@ -94,18 +94,22 @@ func setupHooks(plugin *node.Plugin, conn *network.ManagedConnection, eventDispa
 		eventDispatchers.RemoveNode(ev.Peer.ID().Bytes())
 	})
 
+	onAddChosenNeighbor := events.NewClosure(func(ev *selection.PeeringEvent) {
+		if ev.Status {
+			eventDispatchers.ConnectNodes(local.GetInstance().ID().Bytes(), ev.Peer.ID().Bytes())
+		}
+	})
+
 	onAddAcceptedNeighbor := events.NewClosure(func(ev *selection.PeeringEvent) {
-		eventDispatchers.ConnectNodes(ev.Peer.ID().Bytes(), local.GetInstance().ID().Bytes())
+		if ev.Status {
+			eventDispatchers.ConnectNodes(ev.Peer.ID().Bytes(), local.GetInstance().ID().Bytes())
+		}
 	})
 
 	onRemoveNeighbor := events.NewClosure(func(ev *selection.DroppedEvent) {
 		eventDispatchers.DisconnectNodes(ev.DroppedID.Bytes(), local.GetInstance().ID().Bytes())
 	})
 
-	onAddChosenNeighbor := events.NewClosure(func(ev *selection.PeeringEvent) {
-		eventDispatchers.ConnectNodes(local.GetInstance().ID().Bytes(), ev.Peer.ID().Bytes())
-	})
-
 	// setup hooks /////////////////////////////////////////////////////////////////////////////////////////////////////
 
 	discover.Events.PeerDiscovered.Attach(onDiscoverPeer)
diff --git a/plugins/autopeering/plugin.go b/plugins/autopeering/plugin.go
index f40c3746..4688b6b0 100644
--- a/plugins/autopeering/plugin.go
+++ b/plugins/autopeering/plugin.go
@@ -51,10 +51,14 @@ func configureEvents() {
 		log.Infof("Salt updated; expires=%s", ev.Public.GetExpiration().Format(time.RFC822))
 	}))
 	selection.Events.OutgoingPeering.Attach(events.NewClosure(func(ev *selection.PeeringEvent) {
-		log.Infof("Peering chosen: %s / %s", ev.Peer.Address(), ev.Peer.ID())
+		if ev.Status {
+			log.Infof("Peering chosen: %s / %s", ev.Peer.Address(), ev.Peer.ID())
+		}
 	}))
 	selection.Events.IncomingPeering.Attach(events.NewClosure(func(ev *selection.PeeringEvent) {
-		log.Infof("Peering accepted: %s / %s", ev.Peer.Address(), ev.Peer.ID())
+		if ev.Status {
+			log.Infof("Peering accepted: %s / %s", ev.Peer.Address(), ev.Peer.ID())
+		}
 	}))
 	selection.Events.Dropped.Attach(events.NewClosure(func(ev *selection.DroppedEvent) {
 		log.Infof("Peering dropped: %s", ev.DroppedID)
diff --git a/plugins/gossip/plugin.go b/plugins/gossip/plugin.go
index 6d84cd4f..f6f5717e 100644
--- a/plugins/gossip/plugin.go
+++ b/plugins/gossip/plugin.go
@@ -39,6 +39,9 @@ func configureEvents() {
 		}()
 	}))
 	selection.Events.IncomingPeering.Attach(events.NewClosure(func(ev *selection.PeeringEvent) {
+		if !ev.Status {
+			return // ignore rejected peering
+		}
 		go func() {
 			if err := mgr.AddInbound(ev.Peer); err != nil {
 				log.Debugw("error adding inbound", "id", ev.Peer.ID(), "err", err)
@@ -46,6 +49,9 @@ func configureEvents() {
 		}()
 	}))
 	selection.Events.OutgoingPeering.Attach(events.NewClosure(func(ev *selection.PeeringEvent) {
+		if !ev.Status {
+			return // ignore rejected peering
+		}
 		go func() {
 			if err := mgr.AddOutbound(ev.Peer); err != nil {
 				log.Debugw("error adding outbound", "id", ev.Peer.ID(), "err", err)
-- 
GitLab