From 53837894e0b659c07f3faff6771f34f99d23b72c Mon Sep 17 00:00:00 2001
From: Benjamin Wenger <ben@elixxir.ioo>
Date: Mon, 19 Sep 2022 13:01:08 -0700
Subject: [PATCH] added a dummy name server and added bindings. tests needed

---
 bindings/channels.go        | 32 +++++++++++++++
 channels/dummyNameServer.go | 78 +++++++++++++++++++++++++++++++++++++
 channels/nameService.go     |  2 +-
 3 files changed, 111 insertions(+), 1 deletion(-)
 create mode 100644 channels/dummyNameServer.go

diff --git a/bindings/channels.go b/bindings/channels.go
index ab47f58ab..21a375527 100644
--- a/bindings/channels.go
+++ b/bindings/channels.go
@@ -167,6 +167,38 @@ func NewChannelsManagerGoEventModel(e2eID, udID int,
 	return channelManagerTrackerSingleton.make(m), nil
 }
 
+// NewChannelsManagerGoEventModelDummyNameService constructs a
+// ChannelsManager. This is not compatible with GoMobile Bindings because
+// it receives the go event model. This uses the dummy name service
+// and is for debugging only
+// Parameters:
+//  - e2eID - The tracked e2e object ID. This can be retrieved using
+//    [E2e.GetID].
+//  - udID - The tracked UD object ID. This can be retrieved using
+//    [UserDiscovery.GetID].
+func NewChannelsManagerGoEventModelDummyNameService(e2eID int, username string,
+	goEvent channels.EventModel) (*ChannelsManager, error) {
+	// Get user from singleton
+	user, err := e2eTrackerSingleton.get(e2eID)
+	if err != nil {
+		return nil, err
+	}
+
+	rng := user.api.GetRng().GetStream()
+	defer rng.Close()
+
+	nameService, err := channels.NewDummyNameService(username, rng)
+	if err != nil {
+		return nil, err
+	}
+	// Construct new channels manager
+	m := channels.NewManager(user.api.GetStorage().GetKV(), user.api.GetCmix(),
+		user.api.GetRng(), nameService, goEvent)
+
+	// Add channel to singleton and return
+	return channelManagerTrackerSingleton.make(m), nil
+}
+
 type ChannelGeneration struct {
 	Channel    string
 	PrivateKey string
diff --git a/channels/dummyNameServer.go b/channels/dummyNameServer.go
new file mode 100644
index 000000000..6b0bd7c2d
--- /dev/null
+++ b/channels/dummyNameServer.go
@@ -0,0 +1,78 @@
+package channels
+
+import (
+	"crypto/ed25519"
+	jww "github.com/spf13/jwalterweatherman"
+	"gitlab.com/elixxir/crypto/channel"
+	"io"
+	"time"
+)
+
+// NewDummyNameService returns a dummy object adhering to the name service
+// This neither produces valid signatures or validates passed signature
+// is is for Development and Debugging purposes only
+func NewDummyNameService(username string, rng io.Reader) (NameService, error) {
+	jww.WARN.Printf("Creating a Dummy Name Service. This is for " +
+		"development and debugging only. It does not produce valid " +
+		"signatures or verify passed signatures. YOU SHOULD NEVER SEE THIS " +
+		"MESSAGE IN PRODUCTION")
+
+	dns := &dummyNameService{
+		username: username,
+		lease:    time.Now().Add(35 * 24 * time.Hour),
+	}
+
+	//generate the private key
+	var err error
+	dns.public, dns.private, err = ed25519.GenerateKey(rng)
+	if err != nil {
+		return nil, err
+	}
+
+	//generate a dummy user discover identity to produce a validation signature
+	//just sign with our own key, it wont be evaluated anyhow
+	dns.validationSig = channel.SignChannelLease(dns.public, dns.username,
+		dns.lease, dns.private)
+
+	return dns, nil
+}
+
+type dummyNameService struct {
+	private       ed25519.PrivateKey
+	public        ed25519.PublicKey
+	username      string
+	validationSig []byte
+	lease         time.Time
+}
+
+func (dns *dummyNameService) GetUsername() string {
+	return dns.username
+}
+
+func (dns *dummyNameService) GetChannelValidationSignature() ([]byte, time.Time) {
+	jww.WARN.Printf("GetChannelValidationSignature called on Dummy Name " +
+		"Service, dummy signature from a random key returned - identity not " +
+		"proven. YOU SHOULD NEVER SEE THIS MESSAGE IN PRODUCTION")
+	return dns.validationSig, dns.lease
+}
+
+func (dns *dummyNameService) GetChannelPubkey() ed25519.PublicKey {
+	return dns.public
+}
+
+func (dns *dummyNameService) SignChannelMessage(message []byte) (signature []byte, err error) {
+	jww.WARN.Printf("SignChannelMessage called on Dummy Name Service, " +
+		"signature from a random key - identity not proven. YOU SHOULD " +
+		"NEVER SEE THIS MESSAGE IN PRODUCTION")
+	sig := ed25519.Sign(dns.private, message)
+	return sig, nil
+}
+
+func (dns *dummyNameService) ValidateChannelMessage(username string, lease time.Time,
+	pubKey ed25519.PublicKey, authorIDSignature []byte) bool {
+	//ignore the authorIDSignature
+	jww.WARN.Printf("ValidateChannelMessage called on Dummy Name Service, " +
+		"no validation done - identity not validated. YOU SHOULD NEVER SEE " +
+		"THIS MESSAGE IN PRODUCTION")
+	return true
+}
diff --git a/channels/nameService.go b/channels/nameService.go
index 0884cb9ec..f1d93b876 100644
--- a/channels/nameService.go
+++ b/channels/nameService.go
@@ -21,7 +21,7 @@ type NameService interface {
 
 	// GetChannelValidationSignature returns the validation
 	// signature and the time it was signed.
-	GetChannelValidationSignature() (signature []byte, lease time.Time)
+	GetChannelValidationSignature() ([]byte, time.Time)
 
 	// GetChannelPubkey returns the user's public key.
 	GetChannelPubkey() ed25519.PublicKey
-- 
GitLab