diff --git a/Makefile b/Makefile index c2aaee3c1b8d2bf065c2a75489f12ded0ef33bd3..56c26a706138bb2708cc87e086b3ef2d43084867 100644 --- a/Makefile +++ b/Makefile @@ -20,20 +20,20 @@ build: go mod tidy update_release: - GOFLAGS="" go get -u gitlab.com/elixxir/primitives@release - GOFLAGS="" go get -u gitlab.com/elixxir/crypto@release - GOFLAGS="" go get -u gitlab.com/xx_network/crypto@release - GOFLAGS="" go get -u gitlab.com/elixxir/comms@"Anne/FactCommsHotfix" - 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 7fb867a89f1601ac26c870e4278a3ebaedbc22d1..f1c2cc7ad37025d48fba7a0776e5107926cde051 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ 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.20201116215317-0febe6765554 + 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.3-0.20201116174806-97f190989704 diff --git a/go.sum b/go.sum index 6cdc407f14da17be8efb1ed402708a654df068a5..88aebaecc98ca197d77a91d93616c314b35d7185 100644 --- a/go.sum +++ b/go.sum @@ -226,10 +226,11 @@ github.com/zeebo/pcg v0.0.0-20181207190024-3cdc6b625a05/go.mod h1:Gr+78ptB0MwXxm 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.20201116214359-6714b02d2fad h1:jr/vHpuK9dbSMCydxWJ5fH6KshUTpH8L7LqotxPvQrs= -gitlab.com/elixxir/comms v0.0.4-0.20201116214359-6714b02d2fad/go.mod h1:spFKl7jsMy8M6NDvhJ27IJ+CnZ/07JHJCYpYsG8JQ4o= -gitlab.com/elixxir/comms v0.0.4-0.20201116215317-0febe6765554 h1:PGFYXmpv8vT7vYBvcynN9uDqMQArzgo88rlZ51NyaV4= -gitlab.com/elixxir/comms v0.0.4-0.20201116215317-0febe6765554/go.mod h1:spFKl7jsMy8M6NDvhJ27IJ+CnZ/07JHJCYpYsG8JQ4o= +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/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA= gitlab.com/elixxir/crypto v0.0.4/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA= 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