diff --git a/bindings/channels.go b/bindings/channels.go index ab47f58ab97d2122afb7b00690fa7b2c6ff9f15f..21a375527730b4e6485afb54a564600c59684331 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 0000000000000000000000000000000000000000..6b0bd7c2daec61286292b9fbb6f8333d2ce5a6b9 --- /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 0884cb9ec31205f0d952a6f93248a5ffde5d701b..f1d93b876228e6c13aae6fb6e2147cd82d076787 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