diff --git a/Makefile b/Makefile index 60cdbe9c72c5f7d156b27637cbab21ecf1bb4b30..56c26a706138bb2708cc87e086b3ef2d43084867 100644 --- a/Makefile +++ b/Makefile @@ -20,20 +20,20 @@ build: go mod tidy update_release: - GOFLAGS="" go get -u gitlab.com/elixxir/primitives@peppa/newClient - GOFLAGS="" go get -u gitlab.com/elixxir/crypto@peppa/newClient - GOFLAGS="" go get -u gitlab.com/xx_network/crypto@release - GOFLAGS="" go get -u gitlab.com/elixxir/comms@hotfix/TestingFunction - GOFLAGS="" go get -u gitlab.com/xx_network/comms@release - GOFLAGS="" go get -u gitlab.com/xx_network/primitives@release + GOFLAGS="" go get gitlab.com/elixxir/primitives@release + GOFLAGS="" go get gitlab.com/elixxir/crypto@release + GOFLAGS="" go get gitlab.com/xx_network/crypto@release + GOFLAGS="" go get gitlab.com/elixxir/comms@release + GOFLAGS="" go get gitlab.com/xx_network/comms@release + GOFLAGS="" go get gitlab.com/xx_network/primitives@release update_master: - GOFLAGS="" go get -u gitlab.com/elixxir/primitives@master - GOFLAGS="" go get -u gitlab.com/elixxir/crypto@master - GOFLAGS="" go get -u gitlab.com/xx_network/crypto@master - GOFLAGS="" go get -u gitlab.com/elixxir/comms@master - GOFLAGS="" go get -u gitlab.com/xx_network/comms@master - GOFLAGS="" go get -u gitlab.com/xx_network/primitives@master + GOFLAGS="" go get gitlab.com/elixxir/primitives@master + GOFLAGS="" go get gitlab.com/elixxir/crypto@master + GOFLAGS="" go get gitlab.com/xx_network/crypto@master + GOFLAGS="" go get gitlab.com/elixxir/comms@master + GOFLAGS="" go get gitlab.com/xx_network/comms@master + GOFLAGS="" go get gitlab.com/xx_network/primitives@master master: clean update_master build version diff --git a/go.mod b/go.mod index dc769078af0a2987c147efb427caa1459c8935a6..f1c2cc7ad37025d48fba7a0776e5107926cde051 100644 --- a/go.mod +++ b/go.mod @@ -17,11 +17,11 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.7.1 - gitlab.com/elixxir/comms v0.0.4-0.20201103220934-c476c9282f30 - gitlab.com/elixxir/crypto v0.0.5-0.20201109203841-ba162a25be6e + gitlab.com/elixxir/comms v0.0.4-0.20201111205457-b073b28c367a + gitlab.com/elixxir/crypto v0.0.5-0.20201110193609-6b5e881867b4 gitlab.com/elixxir/ekv v0.1.3 - gitlab.com/elixxir/primitives v0.0.2 - gitlab.com/xx_network/comms v0.0.3 + gitlab.com/elixxir/primitives v0.0.3-0.20201116174806-97f190989704 + gitlab.com/xx_network/comms v0.0.4-0.20201110022115-4a6171cad07d gitlab.com/xx_network/crypto v0.0.4 gitlab.com/xx_network/primitives v0.0.2 golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 diff --git a/go.sum b/go.sum index d9ae59910cd23ec3a10019a0dc42c501e1cd8164..bbf4e62eae2e70384297cd73bac04c4687b5a6c0 100644 --- a/go.sum +++ b/go.sum @@ -252,6 +252,10 @@ github.com/zeebo/pcg v1.0.0 h1:dt+dx+HvX8g7Un32rY9XWoYnd0NmKmrIzpHF7qiTDj0= github.com/zeebo/pcg v1.0.0/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= gitlab.com/elixxir/comms v0.0.4-0.20201103220934-c476c9282f30 h1:9q+xVbu5m7XDvT1CVz8s1S/SOVpasWJOx7V/3rAY/pE= gitlab.com/elixxir/comms v0.0.4-0.20201103220934-c476c9282f30/go.mod h1:5p7oz4yFrK037rPap6ooaWrloJrzuVZ4jnzOdvgyqnU= +gitlab.com/elixxir/comms v0.0.4-0.20201111205457-b073b28c367a h1:GnZLdgn5ZSDtPFsiCUPgqQk2D+e7LmzVOZ9Rq/B8hCY= +gitlab.com/elixxir/comms v0.0.4-0.20201111205457-b073b28c367a/go.mod h1:5p7oz4yFrK037rPap6ooaWrloJrzuVZ4jnzOdvgyqnU= +gitlab.com/elixxir/comms v0.0.4-0.20201112000135-4147e270e129 h1:d4s9JGimUVmqdKlK4NhICayzWBUSM2XmKta821ZJTF0= +gitlab.com/elixxir/comms v0.0.4-0.20201112000135-4147e270e129/go.mod h1:5p7oz4yFrK037rPap6ooaWrloJrzuVZ4jnzOdvgyqnU= gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4 h1:28ftZDeYEko7xptCZzeFWS1Iam95dj46TWFVVlKmw6A= gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4/go.mod h1:ucm9SFKJo+K0N2GwRRpaNr+tKXMIOVWzmyUD0SbOu2c= gitlab.com/elixxir/crypto v0.0.3 h1:znCt/x2bL4y8czTPaaFkwzdgSgW3BJc/1+dxyf1jqVw= @@ -260,6 +264,8 @@ gitlab.com/elixxir/crypto v0.0.4 h1:8eWjvUepCU2PiqZM2NFYo6rFg1w8KWO1hMDwMNFEqoI= gitlab.com/elixxir/crypto v0.0.4/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA= gitlab.com/elixxir/crypto v0.0.5-0.20201109203841-ba162a25be6e h1:rkT8Pzjgo9oF3uS8ExHGNUQoJX/22qK3lU+vU8QsOCY= gitlab.com/elixxir/crypto v0.0.5-0.20201109203841-ba162a25be6e/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA= +gitlab.com/elixxir/crypto v0.0.5-0.20201110193609-6b5e881867b4 h1:1a1zZDuqZ56qU1EPgpc+Sqny1YFl0kAKJgQbsVc0WJQ= +gitlab.com/elixxir/crypto v0.0.5-0.20201110193609-6b5e881867b4/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA= gitlab.com/elixxir/ekv v0.1.3 h1:OE+LBMIhjGUMwc6hHJzYvEPNJQV7t1vMnJyIgxUMUo8= gitlab.com/elixxir/ekv v0.1.3/go.mod h1:e6WPUt97taFZe5PFLPb1Dupk7tqmDCTQu1kkstqJvw4= gitlab.com/elixxir/primitives v0.0.0-20200731184040-494269b53b4d/go.mod h1:OQgUZq7SjnE0b+8+iIAT2eqQF+2IFHn73tOo+aV11mg= @@ -269,9 +275,13 @@ gitlab.com/elixxir/primitives v0.0.1 h1:q61anawANlNAExfkeQEE1NCsNih6vNV1FFLoUQX6 gitlab.com/elixxir/primitives v0.0.1/go.mod h1:kNp47yPqja2lHSiS4DddTvFpB/4D9dB2YKnw5c+LJCE= gitlab.com/elixxir/primitives v0.0.2 h1:PvyOOp/A6tCtmU7YnGhCCPRdmEogEzCi0Li/WfiVjGo= gitlab.com/elixxir/primitives v0.0.2/go.mod h1:3fxFHSlQhkV4vs+S0dZEz3Om3m+40WX8L806yvSnNFc= +gitlab.com/elixxir/primitives v0.0.3-0.20201116174806-97f190989704 h1:JkFREumz8skDqkCjjzZnlf5tg+PBiMB9kfVn9z0VEfE= +gitlab.com/elixxir/primitives v0.0.3-0.20201116174806-97f190989704/go.mod h1:3fxFHSlQhkV4vs+S0dZEz3Om3m+40WX8L806yvSnNFc= gitlab.com/xx_network/comms v0.0.0-20200805174823-841427dd5023/go.mod h1:owEcxTRl7gsoM8c3RQ5KAm5GstxrJp5tn+6JfQ4z5Hw= gitlab.com/xx_network/comms v0.0.3 h1:ch1eJI4WXUE/Kz0Kp9uDWX16B+hfVFmdHY+EOai4Wzc= gitlab.com/xx_network/comms v0.0.3/go.mod h1:YViGbRj7FjJYoaO4NpALGEd9dK/l8uUT000FEBbUTL8= +gitlab.com/xx_network/comms v0.0.4-0.20201110022115-4a6171cad07d h1:wPsoqWNusbFJxvPB1Rvzu+TLZxth3G+ay8qkNrpAuzM= +gitlab.com/xx_network/comms v0.0.4-0.20201110022115-4a6171cad07d/go.mod h1:YViGbRj7FjJYoaO4NpALGEd9dK/l8uUT000FEBbUTL8= gitlab.com/xx_network/crypto v0.0.3/go.mod h1:DF2HYvvCw9wkBybXcXAgQMzX+MiGbFPjwt3t17VRqRE= gitlab.com/xx_network/crypto v0.0.4 h1:lpKOL5mTJ2awWMfgBy30oD/UvJVrWZzUimSHlOdZZxo= gitlab.com/xx_network/crypto v0.0.4/go.mod h1:+lcQEy+Th4eswFgQDwT0EXKp4AXrlubxalwQFH5O0Mk= diff --git a/ud/lookup.go b/ud/lookup.go index a2df280190e3ca48c4a03af31d1731113d15e368..1032c6a3e2af5446a0f376bf3f32fc7c6092c823 100644 --- a/ud/lookup.go +++ b/ud/lookup.go @@ -7,23 +7,71 @@ import ( "gitlab.com/elixxir/client/interfaces/message" "gitlab.com/elixxir/client/interfaces/params" "gitlab.com/elixxir/client/interfaces/utility" + "gitlab.com/elixxir/comms/network/dataStructures" + "gitlab.com/elixxir/primitives/states" "gitlab.com/xx_network/primitives/id" "google.golang.org/protobuf/runtime/protoimpl" "time" + jww "github.com/spf13/jwalterweatherman" ) -type lookupCallback func([]contact.Contact, error) +type lookupCallback func(contact.Contact, error) + + +func (m *Manager)lookupProcess(c chan message.Receive, quitCh <-chan struct{}){ + for true { + select { + case <-quitCh: + return + case response := <-c: + // edge check the encryption + if response.Encryption!=message.E2E{ + jww.WARN.Printf("Dropped a lookup response from user " + + "discovery due to incorrect encryption") + } + + // unmarshal the message + lookupResponse := &LookupResponse{} + if err :=proto.Unmarshal(response.Payload, lookupResponse); err!=nil{ + jww.WARN.Printf("Dropped a lookup response from user " + + "discovery due to failed unmarshal: %s", err) + } + + // get the appropriate channel from the lookup + m.inProgressMux.RLock() + ch, ok := m.inProgressLookup[lookupResponse.CommID] + m.inProgressMux.RUnlock() + if !ok{ + jww.WARN.Printf("Dropped a lookup response from user " + + "discovery due to unknown comm ID: %d", + lookupResponse.CommID) + } + + // send the response on the correct channel + // drop if the send cannot be completed + select{ + case ch<-lookupResponse: + default: + jww.WARN.Printf("Dropped a lookup response from user " + + "discovery due failure to transmit to handling thread: " + + "commID: %d", lookupResponse.CommID) + } + } + } +} + // returns the public key of the passed id as known by the user discovery system // or returns by the timeout func (m *Manager)Lookup(id *id.ID, callback lookupCallback, timeout time.Duration)error{ + //get the id of this comm so it can be connected to its responce commID, err := m.getCommID() if err!=nil{ return errors.WithMessage(err, "Random generation failed") } - + //build the request request := &LookupSend{ UserID: id.Marshal(), CommID: commID, @@ -40,20 +88,68 @@ func (m *Manager)Lookup(id *id.ID, callback lookupCallback, timeout time.Duratio MessageType: message.UdLookup, } - rounds, mid, err := m.net.SendE2E(msg, params.GetDefaultE2E()) + //register the request in the responce map so it can be procesed on return + responseChan := make(chan *LookupResponse, 1) + m.inProgressMux.Lock() + m.inProgressLookup[commID] = responseChan + m.inProgressMux.Unlock() + + //send the request + rounds, _, err := m.net.SendE2E(msg, params.GetDefaultE2E()) if err!=nil{ return errors.WithMessage(err, "Failed to send the lookup " + "request") } + //register the round event to capture if the round fails + roundFailChan := make(chan dataStructures.EventReturn, len(rounds)) - - go func(){ - results := - utility.TrackResults() + for _, round := range rounds{ + //subtract a millisecond to ensure this timeout will trigger before + // the one below + m.net.GetInstance().GetRoundEvents().AddRoundEventChan(round, + roundFailChan, timeout-1*time.Millisecond, states.FAILED) } - - + //start the go routine which will trigger the callback + go func(){ + timer := time.NewTimer(timeout) + + var err error + var c contact.Contact + + select{ + //return an error if the round fails + case <-roundFailChan: + err= errors.New("One or more rounds failed to " + + "resolve, lookup not delivered") + //return an error if the timeout is reached + case <-timer.C: + err= errors.New("Response from User Discovery" + + " did not come before timeout") + //return the contact if one is returned + case response := <-responseChan: + if response.Error!=""{ + err = errors.Errorf("User Discovery returned an " + + "error on Lookup: %s", response.Error) + }else{ + pubkey := m.grp.NewIntFromBytes(response.PubKey) + c = contact.Contact{ + ID: id, + DhPubKey: pubkey, + OwnershipProof: nil, + Facts: nil, + } + } + } + //delete the response channel from the map + m.inProgressMux.Lock() + delete(m.inProgressLookup, commID) + m.inProgressMux.Unlock() + //call the callback last in case it is blocking + callback(c, err) + }() + + return nil } \ No newline at end of file diff --git a/ud/manager.go b/ud/manager.go index f2f4f3cfb4009e505806b8cb5ec3a0afd8faeb53..a12e5f1fc1e7e698f0492575181525e02e948056 100644 --- a/ud/manager.go +++ b/ud/manager.go @@ -3,7 +3,10 @@ package ud import ( "encoding/binary" "gitlab.com/elixxir/client/interfaces" + "gitlab.com/elixxir/client/interfaces/message" + "gitlab.com/elixxir/client/stoppable" "gitlab.com/elixxir/comms/client" + "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/comms/connect" "gitlab.com/xx_network/crypto/signature/rsa" @@ -16,17 +19,20 @@ type Manager struct { host *connect.Host privKey *rsa.PrivateKey rng *fastRNG.StreamGenerator + grp *cyclic.Group + sw interfaces.Switchboard udID *id.ID - inProgressLookup map[int64]chan *LookupResponse + inProgressLookup map[uint64]chan *LookupResponse inProgressMux sync.RWMutex net interfaces.NetworkManager } func (m *Manager)getCommID()(uint64, error){ + //fixme: this should use incremenetation stream := m.rng.GetStream() idBytes := make([]byte, 8) @@ -35,4 +41,17 @@ func (m *Manager)getCommID()(uint64, error){ } return binary.BigEndian.Uint64(idBytes), nil +} + +func (m *Manager)StartProcessies()stoppable.Stoppable{ + + lookupStop := stoppable.NewSingle("UDLookup") + lookupChan := make(chan message.Receive, 100) + m.sw.RegisterChannel("UDLookupResponse", m.udID, message.UdLookupResponse, lookupChan) + go m.lookupProcess(lookupChan, lookupStop.Quit()) + + + udMulti := stoppable.NewMulti("UD") + udMulti.Add(lookupStop) + return lookupStop } \ No newline at end of file diff --git a/ud/register.go b/ud/register.go new file mode 100644 index 0000000000000000000000000000000000000000..6fdd2b54e1203bb3f82814f94f14f3101bfa8307 --- /dev/null +++ b/ud/register.go @@ -0,0 +1,24 @@ +package ud + +import ( + "gitlab.com/xx_network/comms/messages" + "gitlab.com/xx_network/primitives/id" +) + +func (m *Manager)Register(myID *id.ID, username string)error{ + + msg := &messages.AuthenticatedMessage{ + ID: myID.Bytes(), + Signature: nil, + Token: nil, + Client: nil, + Message: nil, + XXX_NoUnkeyedLiteral: struct{}{}, + XXX_unrecognized: nil, + XXX_sizecache: 0, + } + + m.comms.SendRegisterUser(m.host) + + +} \ No newline at end of file