diff --git a/api/client.go b/api/client.go index 1129c3a871997c6c61af4c8a9f8269ef9ab927b2..458d4ed47196febd1f846ca8eaed29611c07f17f 100644 --- a/api/client.go +++ b/api/client.go @@ -15,6 +15,7 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/auth" + "gitlab.com/elixxir/client/backup" "gitlab.com/elixxir/client/cmix" "gitlab.com/elixxir/client/e2e" "gitlab.com/elixxir/client/event" @@ -24,7 +25,7 @@ import ( "gitlab.com/elixxir/client/storage" "gitlab.com/elixxir/client/storage/user" "gitlab.com/elixxir/comms/client" - "gitlab.com/elixxir/crypto/backup" + cryptoBackup "gitlab.com/elixxir/crypto/backup" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/primitives/version" @@ -68,10 +69,10 @@ type Client struct { clientErrorChannel chan interfaces.ClientError // Event reporting in event.go - events event.Manager + events *event.Manager // Handles the triggering and delivery of backups - backup *interfaces.BackupContainer + backup *backup.Backup } // NewClient creates client storage, generates keys, connects, and registers @@ -178,7 +179,7 @@ func NewClientFromBackup(ndfJSON, storageDir string, sessionPassword, backupPassphrase []byte, backupFileContents []byte) ([]*id.ID, string, error) { - backUp := &backup.Backup{} + backUp := &cryptoBackup.Backup{} err := backUp.Decrypt(string(backupPassphrase), backupFileContents) if err != nil { return nil, "", errors.WithMessage(err, @@ -220,7 +221,7 @@ func NewClientFromBackup(ndfJSON, storageDir string, sessionPassword, // OpenClient session, but don't connect to the network or log in func OpenClient(storageDir string, password []byte, - parameters cmix.Params) (*Client, error) { + parameters e2e.Params) (*Client, error) { jww.INFO.Printf("OpenClient()") rngStreamGen := fastRNG.NewStreamGenerator(12, 1024, @@ -248,7 +249,7 @@ func OpenClient(storageDir string, password []byte, parameters: parameters, clientErrorChannel: make(chan interfaces.ClientError, 1000), events: event.NewEventManager(), - backup: &interfaces.BackupContainer{}, + backup: &backup.Backup{}, } return c, nil @@ -304,7 +305,7 @@ func NewProtoClient_Unsafe(ndfJSON, storageDir string, password, // Login initializes a client object from existing storage. func Login(storageDir string, password []byte, - parameters cmix.Params) (*Client, error) { + authCallbacks auth.Callbacks, parameters e2e.Params) (*Client, error) { jww.INFO.Printf("Login()") c, err := OpenClient(storageDir, password, parameters) @@ -350,7 +351,7 @@ func Login(storageDir string, password []byte, } } - c.network, err = cmix.NewClient(parameters, c.comms, c.storage, + c.network, err = cmix.NewClient(parameters.Network, c.comms, c.storage, c.storage.GetNDF(), c.rng, c.events) if err != nil { return nil, err @@ -368,7 +369,7 @@ func Login(storageDir string, password []byte, // to the login call? authParams := auth.GetDefaultParams() c.auth, err = auth.NewState(c.storage.GetKV(), c.network, c.e2e, c.rng, - c.events, authParams, nil) + c.events, authParams, authCallbacks, c.backup.TriggerBackup) if err != nil { return nil, err } @@ -385,7 +386,8 @@ func Login(storageDir string, password []byte, // while replacing the base NDF. This is designed for some specific deployment // procedures and is generally unsafe. func LoginWithNewBaseNDF_UNSAFE(storageDir string, password []byte, - newBaseNdf string, parameters cmix.Params) (*Client, error) { + newBaseNdf string, authCallbacks auth.Callbacks, + parameters e2e.Params) (*Client, error) { jww.INFO.Printf("LoginWithNewBaseNDF_UNSAFE()") def, err := parseNDF(newBaseNdf) @@ -417,7 +419,7 @@ func LoginWithNewBaseNDF_UNSAFE(storageDir string, password []byte, "able to register or track network.") } - c.network, err = cmix.NewClient(parameters, c.comms, c.storage, + c.network, err = cmix.NewClient(parameters.Network, c.comms, c.storage, c.storage.GetNDF(), c.rng, c.events) if err != nil { return nil, err @@ -435,7 +437,7 @@ func LoginWithNewBaseNDF_UNSAFE(storageDir string, password []byte, // to the login call? authParams := auth.GetDefaultParams() c.auth, err = auth.NewState(c.storage.GetKV(), c.network, c.e2e, c.rng, - c.events, authParams, nil) + c.events, authParams, authCallbacks, c.backup.TriggerBackup) if err != nil { return nil, err } @@ -452,8 +454,8 @@ func LoginWithNewBaseNDF_UNSAFE(storageDir string, password []byte, // JSON containing the cryptographic primitives. This is designed for // some specific deployment procedures and is generally unsafe. func LoginWithProtoClient(storageDir string, password []byte, - protoClientJSON []byte, newBaseNdf string, - parameters cmix.Params) (*Client, error) { + protoClientJSON []byte, newBaseNdf string, authCallbacks auth.Callbacks, + parameters e2e.Params) (*Client, error) { jww.INFO.Printf("LoginWithProtoClient()") def, err := parseNDF(newBaseNdf) @@ -484,7 +486,7 @@ func LoginWithProtoClient(storageDir string, password []byte, return nil, err } - c.network, err = cmix.NewClient(parameters, c.comms, c.storage, + c.network, err = cmix.NewClient(parameters.Network, c.comms, c.storage, c.storage.GetNDF(), c.rng, c.events) if err != nil { return nil, err @@ -502,7 +504,7 @@ func LoginWithProtoClient(storageDir string, password []byte, // to the login call? authParams := auth.GetDefaultParams() c.auth, err = auth.NewState(c.storage.GetKV(), c.network, c.e2e, c.rng, - c.events, authParams, nil) + c.events, authParams, authCallbacks, c.backup.TriggerBackup) if err != nil { return nil, err } @@ -721,7 +723,7 @@ func (c *Client) GetNetworkInterface() cmix.Client { // GetBackup returns a pointer to the backup container so that the backup can be // set and triggered. -func (c *Client) GetBackup() *interfaces.BackupContainer { +func (c *Client) GetBackup() *backup.Backup { return c.backup } @@ -732,8 +734,8 @@ func (c *Client) GetBackup() *interfaces.BackupContainer { func (c *Client) GetNodeRegistrationStatus() (int, int, error) { // Return an error if the network is not healthy if !c.GetHealth().IsHealthy() { - return 0, 0, errors.New("Cannot get number of nodes registrations when " + - "network is not healthy") + return 0, 0, errors.New("Cannot get number of nodes " + + "registrations when network is not healthy") } nodes := c.network.GetInstance().GetFullNdf().Get().Nodes @@ -743,8 +745,8 @@ func (c *Client) GetNodeRegistrationStatus() (int, int, error) { for i, n := range nodes { nid, err := id.Unmarshal(n.ID) if err != nil { - return 0, 0, errors.Errorf("Failed to unmarshal nodes ID %v "+ - "(#%d): %s", n.ID, i, err.Error()) + return 0, 0, errors.Errorf("Failed to unmarshal nodes "+ + "ID %v (#%d): %s", n.ID, i, err.Error()) } if n.Status == ndf.Stale { numStale += 1 diff --git a/api/notifications.go b/api/notifications.go index 58e97190e469a7d21d9175b9b84ddaff89b75e2c..60355a48034572902905c876591004e039b2b0b0 100644 --- a/api/notifications.go +++ b/api/notifications.go @@ -34,20 +34,26 @@ func (c *Client) RegisterForNotifications(token string) error { if err != nil { return err } + + privKey := c.userState.CryptographicIdentity.GetTransmissionRSA() + pubPEM := rsa.CreatePublicKeyPem(privKey.GetPublic()) + regSig := c.userState.GetTransmissionRegistrationValidationSignature() + regTS := c.GetUser().RegistrationTimestamp + // Send the register message _, err = c.comms.RegisterForNotifications(notificationBotHost, &mixmessages.NotificationRegisterRequest{ Token: token, IntermediaryId: intermediaryReceptionID, - TransmissionRsa: rsa.CreatePublicKeyPem(c.GetStorage().User().GetCryptographicIdentity().GetTransmissionRSA().GetPublic()), + TransmissionRsa: pubPEM, TransmissionSalt: c.GetUser().TransmissionSalt, - TransmissionRsaSig: c.GetStorage().User().GetTransmissionRegistrationValidationSignature(), + TransmissionRsaSig: regSig, IIDTransmissionRsaSig: sig, - RegistrationTimestamp: c.GetUser().RegistrationTimestamp, + RegistrationTimestamp: regTS, }) if err != nil { - err := errors.Errorf( - "RegisterForNotifications: Unable to register for notifications! %s", err) + err := errors.Errorf("RegisterForNotifications: Unable to "+ + "register for notifications! %s", err) return err } @@ -96,7 +102,9 @@ func (c *Client) getIidAndSig() ([]byte, []byte, error) { stream := c.rng.GetStream() c.GetUser() - sig, err := rsa.Sign(stream, c.storage.User().GetCryptographicIdentity().GetTransmissionRSA(), hash.CMixHash, h.Sum(nil), nil) + sig, err := rsa.Sign(stream, + c.userState.GetTransmissionRSA(), + hash.CMixHash, h.Sum(nil), nil) if err != nil { return nil, nil, errors.WithMessage(err, "RegisterForNotifications: Failed to sign intermediary ID") } diff --git a/api/utilsInterfaces_test.go b/api/utilsInterfaces_test.go index 29b5f8eb9abbc2217c1713cc25764472087701fa..617bce08b96810b920fb6ceb9aaf9ef3990f8757 100644 --- a/api/utilsInterfaces_test.go +++ b/api/utilsInterfaces_test.go @@ -7,21 +7,21 @@ package api import ( + "time" + + "gitlab.com/elixxir/client/cmix" "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/event" - "gitlab.com/elixxir/client/interfaces" - "gitlab.com/elixxir/client/interfaces/message" - "gitlab.com/elixxir/client/interfaces/params" + "gitlab.com/elixxir/client/cmix/identity" + "gitlab.com/elixxir/client/cmix/message" + "gitlab.com/elixxir/client/cmix/rounds" "gitlab.com/elixxir/client/stoppable" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/comms/network" - cE2e "gitlab.com/elixxir/crypto/e2e" "gitlab.com/elixxir/primitives/format" "gitlab.com/elixxir/primitives/states" "gitlab.com/xx_network/comms/connect" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" - "time" ) // Mock comm struct which returns no historical round data @@ -82,46 +82,45 @@ func (ht *historicalRounds) GetHost(hostId *id.ID) (*connect.Host, bool) { // Contains a test implementation of the networkManager interface. type testNetworkManagerGeneric struct { instance *network.Instance - sender *gateway.Sender + sender gateway.Sender } type dummyEventMgr struct{} func (d *dummyEventMgr) Report(p int, a, b, c string) {} -func (t *testNetworkManagerGeneric) GetEventManager() event.Manager { - return &dummyEventMgr{} +func (d *dummyEventMgr) EventService() (stoppable.Stoppable, error) { + return nil, nil } /* Below methods built for interface adherence */ -func (t *testNetworkManagerGeneric) GetHealthTracker() interfaces.HealthTracker { - return nil -} -func (t *testNetworkManagerGeneric) Follow(report interfaces.ClientErrorReport) (stoppable.Stoppable, error) { +func (t *testNetworkManagerGeneric) Follow(report cmix.ClientErrorReport) (stoppable.Stoppable, error) { return nil, nil } -func (t *testNetworkManagerGeneric) CheckGarbledMessages() { +func (t *testNetworkManagerGeneric) GetMaxMessageLength() int { return 0 } + +func (t *testNetworkManagerGeneric) CheckInProgressMessages() { return } func (t *testNetworkManagerGeneric) GetVerboseRounds() string { return "" } -func (t *testNetworkManagerGeneric) SendE2E(message.Send, params.E2E, *stoppable.Single) ( - []id.Round, cE2e.MessageID, time.Time, error) { - rounds := []id.Round{id.Round(0), id.Round(1), id.Round(2)} - return rounds, cE2e.MessageID{}, time.Time{}, nil -} -func (t *testNetworkManagerGeneric) SendUnsafe(m message.Send, p params.Unsafe) ([]id.Round, error) { - return nil, nil +func (t *testNetworkManagerGeneric) AddFingerprint(identity *id.ID, fingerprint format.Fingerprint, mp message.Processor) error { + return nil } -func (t *testNetworkManagerGeneric) SendCMIX(message format.Message, rid *id.ID, p params.CMIX) (id.Round, ephemeral.Id, error) { + +func (t *testNetworkManagerGeneric) Send(*id.ID, format.Fingerprint, + message.Service, []byte, []byte, cmix.CMIXParams) (id.Round, + ephemeral.Id, error) { return id.Round(0), ephemeral.Id{}, nil } -func (t *testNetworkManagerGeneric) SendManyCMIX(messages []message.TargetedCmixMessage, p params.CMIX) (id.Round, []ephemeral.Id, error) { +func (t *testNetworkManagerGeneric) SendMany(messages []cmix.TargetedCmixMessage, + p cmix.CMIXParams) (id.Round, []ephemeral.Id, error) { return 0, []ephemeral.Id{}, nil } func (t *testNetworkManagerGeneric) GetInstance() *network.Instance { return t.instance } -func (t *testNetworkManagerGeneric) RegisterWithPermissioning(string) ([]byte, error) { +func (t *testNetworkManagerGeneric) RegisterWithPermissioning(string) ( + []byte, error) { return nil, nil } func (t *testNetworkManagerGeneric) GetRemoteVersion() (string, error) { @@ -135,7 +134,7 @@ func (t *testNetworkManagerGeneric) InProgressRegistrations() int { return 0 } -func (t *testNetworkManagerGeneric) GetSender() *gateway.Sender { +func (t *testNetworkManagerGeneric) GetSender() gateway.Sender { return t.sender } @@ -147,3 +146,66 @@ func (t *testNetworkManagerGeneric) RegisterAddressSizeNotification(string) (cha func (t *testNetworkManagerGeneric) UnregisterAddressSizeNotification(string) {} func (t *testNetworkManagerGeneric) SetPoolFilter(gateway.Filter) {} +func (t *testNetworkManagerGeneric) AddHealthCallback(f func(bool)) uint64 { + return 0 +} +func (t *testNetworkManagerGeneric) AddIdentity(id *id.ID, + validUntil time.Time, persistent bool) { +} +func (t *testNetworkManagerGeneric) RemoveIdentity(id *id.ID) {} +func (t *testNetworkManagerGeneric) AddService(clientID *id.ID, + newService message.Service, response message.Processor) { +} +func (t *testNetworkManagerGeneric) DeleteService(clientID *id.ID, + toDelete message.Service, processor message.Processor) { +} +func (t *testNetworkManagerGeneric) DeleteClientService(clientID *id.ID) { +} +func (t *testNetworkManagerGeneric) DeleteFingerprint(identity *id.ID, + fingerprint format.Fingerprint) { +} +func (t *testNetworkManagerGeneric) DeleteClientFingerprints(identity *id.ID) { +} +func (t *testNetworkManagerGeneric) GetAddressSpace() uint8 { return 0 } +func (t *testNetworkManagerGeneric) GetHostParams() connect.HostParams { + return connect.GetDefaultHostParams() +} +func (t *testNetworkManagerGeneric) GetIdentity(get *id.ID) ( + identity.TrackedID, error) { + return identity.TrackedID{}, nil +} +func (t *testNetworkManagerGeneric) GetRoundResults(timeout time.Duration, + roundCallback cmix.RoundEventCallback, roundList ...id.Round) error { + return nil +} +func (t *testNetworkManagerGeneric) HasNode(nid *id.ID) bool { return false } +func (t *testNetworkManagerGeneric) IsHealthy() bool { return true } +func (t *testNetworkManagerGeneric) WasHealthy() bool { return true } +func (t *testNetworkManagerGeneric) LookupHistoricalRound(rid id.Round, + callback rounds.RoundResultCallback) error { + return nil +} +func (t *testNetworkManagerGeneric) NumRegisteredNodes() int { return 0 } +func (t *testNetworkManagerGeneric) RegisterAddressSpaceNotification( + tag string) (chan uint8, error) { + return nil, nil +} +func (t *testNetworkManagerGeneric) RemoveHealthCallback(uint64) {} +func (t *testNetworkManagerGeneric) SendToAny( + sendFunc func(host *connect.Host) (interface{}, error), + stop *stoppable.Single) (interface{}, error) { + return nil, nil +} +func (t *testNetworkManagerGeneric) SendToPreferred(targets []*id.ID, + sendFunc gateway.SendToPreferredFunc, stop *stoppable.Single, + timeout time.Duration) (interface{}, error) { + return nil, nil +} +func (t *testNetworkManagerGeneric) SetGatewayFilter(f gateway.Filter) {} +func (t *testNetworkManagerGeneric) TrackServices( + tracker message.ServicesTracker) { +} +func (t *testNetworkManagerGeneric) TriggerNodeRegistration(nid *id.ID) {} +func (t *testNetworkManagerGeneric) UnregisterAddressSpaceNotification( + tag string) { +} diff --git a/api/utils_test.go b/api/utils_test.go index 2171ee98fb7645daef91c2fa2cb27c378c6e98a6..4496905d51eab7344b8d2fcde840a2cd3c862d11 100644 --- a/api/utils_test.go +++ b/api/utils_test.go @@ -9,12 +9,13 @@ package api import ( "bytes" - "gitlab.com/elixxir/client/cmix/gateway" "testing" + "gitlab.com/elixxir/client/cmix/gateway" + "gitlab.com/elixxir/client/e2e" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/interfaces/params" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/comms/testkeys" @@ -32,7 +33,8 @@ func newTestingClient(face interface{}) (*Client, error) { case *testing.T, *testing.M, *testing.B, *testing.PB: break default: - jww.FATAL.Panicf("InitTestingSession is restricted to testing only. Got %T", face) + jww.FATAL.Panicf("InitTestingSession is restricted to testing "+ + "only. Got %T", face) } def := getNDF(face) @@ -41,12 +43,14 @@ func newTestingClient(face interface{}) (*Client, error) { password := []byte("hunter2") err := NewClient(string(marshalledDef), storageDir, password, "AAAA") if err != nil { - return nil, errors.Errorf("Could not construct a mock client: %v", err) + return nil, errors.Errorf( + "Could not construct a mock client: %v", err) } - c, err := OpenClient(storageDir, password, params.GetDefaultNetwork()) + c, err := OpenClient(storageDir, password, e2e.GetDefaultParams()) if err != nil { - return nil, errors.Errorf("Could not open a mock client: %v", err) + return nil, errors.Errorf("Could not open a mock client: %v", + err) } commsManager := connect.NewManagerTesting(face) @@ -56,19 +60,22 @@ func newTestingClient(face interface{}) (*Client, error) { jww.FATAL.Panicf("Failed to create new test instance: %v", err) } - commsManager.AddHost(&id.Permissioning, "", cert, connect.GetDefaultHostParams()) + commsManager.AddHost(&id.Permissioning, "", cert, + connect.GetDefaultHostParams()) instanceComms := &connect.ProtoComms{ Manager: commsManager, } - thisInstance, err := network.NewInstanceTesting(instanceComms, def, def, nil, nil, face) + thisInstance, err := network.NewInstanceTesting(instanceComms, def, + def, nil, nil, face) if err != nil { return nil, err } p := gateway.DefaultPoolParams() p.MaxPoolSize = 1 - sender, err := gateway.NewSender(p, c.rng, def, commsManager, c.storage, nil) + sender, err := gateway.NewSender(p, c.rng, def, commsManager, + c.storage, nil) if err != nil { return nil, err } diff --git a/auth/confirm.go b/auth/confirm.go index ee89b8f1827546c740f8aa23634940e30d26deea..fc6c5b69c90fa6c5533fd26e570ad31c10e8e4a6 100644 --- a/auth/confirm.go +++ b/auth/confirm.go @@ -9,6 +9,7 @@ package auth import ( "fmt" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/auth/store" @@ -152,7 +153,7 @@ func (s *state) confirm(partner contact.Contact, serviceTag string) ( } func sendAuthConfirm(net cmixClient, partner *id.ID, - fp format.Fingerprint, payload, mac []byte, event event.Manager, + fp format.Fingerprint, payload, mac []byte, event event.Reporter, serviceTag string) ( id.Round, error) { svc := message.Service{ diff --git a/auth/request.go b/auth/request.go index 756a70197e032d7cce32f11422a92a5418dcefd5..a37839fd8eb065258a61867bc45a671bc3b55dc7 100644 --- a/auth/request.go +++ b/auth/request.go @@ -17,6 +17,7 @@ import ( jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/cmix" "gitlab.com/elixxir/client/cmix/message" + "gitlab.com/elixxir/client/e2e" "gitlab.com/elixxir/client/e2e/ratchet" util "gitlab.com/elixxir/client/storage/utility" "gitlab.com/elixxir/crypto/contact" @@ -201,6 +202,15 @@ func createRequestAuth(sender *id.ID, payload, ownership []byte, myDHPriv, return &baseFmt, mac, nil } +func (s *state) GetReceivedRequest(partner *id.ID) (contact.Contact, error) { + return s.store.GetReceivedRequest(partner) +} + +func (s *state) VerifyOwnership(received, verified contact.Contact, + e2e e2e.Handler) bool { + return VerifyOwnership(received, verified, e2e) +} + func (s *state) DeleteRequest(partnerID *id.ID) error { return s.store.DeleteRequest(partnerID) } diff --git a/auth/state.go b/auth/state.go index dfb6cb03ce7a7c8060800e7c233e5a7bcdf6a094..a3e3d59df1ff43bf8eb6ace2582a009aaedab191 100644 --- a/auth/state.go +++ b/auth/state.go @@ -9,6 +9,7 @@ package auth import ( "encoding/base64" + "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" "gitlab.com/elixxir/client/auth/store" @@ -38,7 +39,7 @@ type state struct { rng *fastRNG.StreamGenerator store *store.Store - event event.Manager + event event.Reporter params Param @@ -100,7 +101,7 @@ type Callbacks interface { // with a memory only versioned.KV) as well as a memory only versioned.KV for // NewState and use GetDefaultTemporaryParams() for the parameters func NewState(kv *versioned.KV, net cmix.Client, e2e e2e.Handler, - rng *fastRNG.StreamGenerator, event event.Manager, params Param, + rng *fastRNG.StreamGenerator, event event.Reporter, params Param, callbacks Callbacks, backupTrigger func(reason string)) (State, error) { kv = kv.Prefix(makeStorePrefix(e2e.GetReceptionID())) return NewStateLegacy( @@ -113,7 +114,7 @@ func NewState(kv *versioned.KV, net cmix.Client, e2e e2e.Handler, // Does not modify the kv prefix for backwards compatibility // Otherwise, acts the same as NewState func NewStateLegacy(kv *versioned.KV, net cmix.Client, e2e e2e.Handler, - rng *fastRNG.StreamGenerator, event event.Manager, params Param, + rng *fastRNG.StreamGenerator, event event.Reporter, params Param, callbacks Callbacks, backupTrigger func(reason string)) (State, error) { s := &state{ diff --git a/cmix/client.go b/cmix/client.go index af5f7dc13df08b65f6b0433e77ed4df862ac8297..1dd7cff35662ce48e696bd66e06c4ce4b8db4185 100644 --- a/cmix/client.go +++ b/cmix/client.go @@ -82,7 +82,7 @@ type client struct { verboseRounds *RoundTracker // Event reporting API - events event.Manager + events event.Reporter // Storage of the max message length maxMsgLen int @@ -91,7 +91,7 @@ type client struct { // NewClient builds a new reception client object using inputted key fields. func NewClient(params Params, comms *commClient.Comms, session storage.Session, ndf *ndf.NetworkDefinition, rng *fastRNG.StreamGenerator, - events event.Manager) (Client, error) { + events event.Reporter) (Client, error) { // Start network instance instance, err := commNetwork.NewInstance( diff --git a/cmix/message/pickup.go b/cmix/message/pickup.go index acba1c0382c1190c8f7524dbdba40852dfa7e415..29fbb95951aea7f4cffbd1c96ba9919ab0d27ee0 100644 --- a/cmix/message/pickup.go +++ b/cmix/message/pickup.go @@ -8,11 +8,12 @@ package message import ( + "strconv" + "gitlab.com/elixxir/client/event" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" - "strconv" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/stoppable" @@ -47,13 +48,13 @@ type handler struct { inProcess *MeteredCmixMessageBuffer - events event.Manager + events event.Reporter FingerprintsManager ServicesManager } -func NewHandler(param Params, kv *versioned.KV, events event.Manager, +func NewHandler(param Params, kv *versioned.KV, events event.Reporter, standardID *id.ID) Handler { garbled, err := NewOrLoadMeteredCmixMessageBuffer(kv, inProcessKey) diff --git a/cmix/params.go b/cmix/params.go index bfd0cd1a5011fabd45c06d971da6ddd7112f7527..d823632e199e021606a3414bc2403babcc3d17b9 100644 --- a/cmix/params.go +++ b/cmix/params.go @@ -3,13 +3,14 @@ package cmix import ( "encoding/base64" "encoding/json" + "time" + "gitlab.com/elixxir/client/cmix/message" "gitlab.com/elixxir/client/cmix/pickup" "gitlab.com/elixxir/client/cmix/rounds" "gitlab.com/elixxir/client/stoppable" "gitlab.com/elixxir/primitives/excludedRounds" "gitlab.com/xx_network/primitives/id" - "time" ) type Params struct { diff --git a/cmix/rounds/historical.go b/cmix/rounds/historical.go index 98522670faf6a2635e37d300f5df25db4c451b75..6b4ffbcd727c9b2e8c70b53769fb44c46761dca7 100644 --- a/cmix/rounds/historical.go +++ b/cmix/rounds/historical.go @@ -40,7 +40,7 @@ type manager struct { comms Comms sender gateway.Sender - events event.Manager + events event.Reporter c chan roundRequest } @@ -63,7 +63,7 @@ type roundRequest struct { } func NewRetriever(param Params, comms Comms, sender gateway.Sender, - events event.Manager) Retriever { + events event.Reporter) Retriever { return &manager{ params: param, comms: comms, @@ -200,7 +200,7 @@ func (m *manager) processHistoricalRounds(comm Comms, stop *stoppable.Single) { } func processHistoricalRoundsResponse(response *pb.HistoricalRoundsResponse, - roundRequests []roundRequest, maxRetries uint, events event.Manager) ( + roundRequests []roundRequest, maxRetries uint, events event.Reporter) ( []uint64, []roundRequest) { retries := make([]roundRequest, 0) rids := make([]uint64, 0) diff --git a/cmix/sendCmix.go b/cmix/sendCmix.go index 409ac2dfb34d198c8c8077baf1a27e6b91ff0354..892570a6c0770077720d9dce077a216e66db77d6 100644 --- a/cmix/sendCmix.go +++ b/cmix/sendCmix.go @@ -9,6 +9,9 @@ package cmix import ( "fmt" + "strings" + "time" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/cmix/gateway" @@ -28,8 +31,6 @@ import ( "gitlab.com/xx_network/primitives/id/ephemeral" "gitlab.com/xx_network/primitives/netTime" "gitlab.com/xx_network/primitives/rateLimiting" - "strings" - "time" ) // SendCMIX sends a "raw" cMix message payload to the provided recipient. @@ -95,7 +96,7 @@ func (c *client) Send(recipient *id.ID, fingerprint format.Fingerprint, // status. func sendCmixHelper(sender gateway.Sender, msg format.Message, recipient *id.ID, cmixParams CMIXParams, instance *network.Instance, grp *cyclic.Group, - nodes nodes.Registrar, rng *fastRNG.StreamGenerator, events event.Manager, + nodes nodes.Registrar, rng *fastRNG.StreamGenerator, events event.Reporter, senderId *id.ID, comms SendCmixCommsInterface) (id.Round, ephemeral.Id, error) { timeStart := netTime.Now() diff --git a/cmix/sendManyCmix.go b/cmix/sendManyCmix.go index 6e67eff24faa65b815b618d8c6cbef0d5a110b13..69713cd5ca187e1d52d77fe2b1b739598b5d324c 100644 --- a/cmix/sendManyCmix.go +++ b/cmix/sendManyCmix.go @@ -9,6 +9,9 @@ package cmix import ( "fmt" + "strings" + "time" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/cmix/gateway" @@ -27,8 +30,6 @@ import ( "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" "gitlab.com/xx_network/primitives/netTime" - "strings" - "time" ) // TargetedCmixMessage defines a recipient target pair in a sendMany cMix @@ -110,7 +111,7 @@ type assembledCmixMessage struct { func sendManyCmixHelper(sender gateway.Sender, msgs []assembledCmixMessage, param CMIXParams, instance *network.Instance, grp *cyclic.Group, registrar nodes.Registrar, - rng *fastRNG.StreamGenerator, events event.Manager, + rng *fastRNG.StreamGenerator, events event.Reporter, senderId *id.ID, comms SendCmixCommsInterface) ( id.Round, []ephemeral.Id, error) { diff --git a/dummy/utils_test.go b/dummy/utils_test.go index c6ecaf36b9906501bf1b1c8276c7dd464e2c85ef..73d3c5d0cc28b047ecea26d55e66f44c907069cb 100644 --- a/dummy/utils_test.go +++ b/dummy/utils_test.go @@ -8,6 +8,12 @@ package dummy import ( + "io" + "math/rand" + "sync" + "testing" + "time" + "github.com/pkg/errors" "gitlab.com/elixxir/client/cmix/gateway" "gitlab.com/elixxir/client/event" @@ -25,11 +31,6 @@ import ( "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" "gitlab.com/xx_network/primitives/ndf" - "io" - "math/rand" - "sync" - "testing" - "time" ) //////////////////////////////////////////////////////////////////////////////// @@ -143,7 +144,7 @@ func (tnm *testNetworkManager) SendManyCMIX([]message.TargetedCmixMessage, param type dummyEventMgr struct{} func (d *dummyEventMgr) Report(int, string, string, string) {} -func (tnm *testNetworkManager) GetEventManager() event.Manager { +func (tnm *testNetworkManager) GetEventManager() event.Reporter { return &dummyEventMgr{} } diff --git a/e2e/manager.go b/e2e/manager.go index cccf2d9694623db93a4c71e9b5491ce8db465fc3..853303bbe20633da76ff329ee6f6f4a99ec769e1 100644 --- a/e2e/manager.go +++ b/e2e/manager.go @@ -30,7 +30,7 @@ type manager struct { net cmix.Client myID *id.ID rng *fastRNG.StreamGenerator - events event.Manager + events event.Reporter grp *cyclic.Group crit *critical rekeyParams rekey.Params @@ -70,7 +70,7 @@ func initE2E(kv *versioned.KV, myID *id.ID, privKey *cyclic.Int, // You can use a memkv for an ephemeral e2e id func Load(kv *versioned.KV, net cmix.Client, myID *id.ID, grp *cyclic.Group, rng *fastRNG.StreamGenerator, - events event.Manager) (Handler, error) { + events event.Reporter) (Handler, error) { kv = kv.Prefix(makeE2ePrefix(myID)) return loadE2E(kv, net, myID, grp, rng, events) } @@ -83,7 +83,7 @@ func Load(kv *versioned.KV, net cmix.Client, myID *id.ID, // You can use a memkv for an ephemeral e2e id func LoadLegacy(kv *versioned.KV, net cmix.Client, myID *id.ID, grp *cyclic.Group, rng *fastRNG.StreamGenerator, - events event.Manager, params rekey.Params) (Handler, error) { + events event.Reporter, params rekey.Params) (Handler, error) { // Marshal the passed params data rekeyParamsData, err := json.Marshal(params) @@ -114,7 +114,7 @@ func LoadLegacy(kv *versioned.KV, net cmix.Client, myID *id.ID, func loadE2E(kv *versioned.KV, net cmix.Client, myDefaultID *id.ID, grp *cyclic.Group, rng *fastRNG.StreamGenerator, - events event.Manager) (Handler, error) { + events event.Reporter) (Handler, error) { m := &manager{ Switchboard: receive.New(), diff --git a/e2e/params.go b/e2e/params.go index ef54d50ee7cd1148a553055f04c53c4c2cbc9f92..52dd2d7b59f7ad6dffe999f56af84b75ed252bba 100644 --- a/e2e/params.go +++ b/e2e/params.go @@ -27,6 +27,9 @@ type Params struct { // system within e2e will be used which preserves privacy CMIX cmix.CMIXParams + // cMix network params + Network cmix.Params + //Authorizes the message to use a key reserved for rekeying. Do not use //unless sending a rekey Rekey bool diff --git a/e2e/rekey/rekey.go b/e2e/rekey/rekey.go index 91209bd741f62d039fc9a46276d13ab7727a2a92..8de7ef2daff692cc41914f67c3d8ea7974bb84c9 100644 --- a/e2e/rekey/rekey.go +++ b/e2e/rekey/rekey.go @@ -27,7 +27,7 @@ import ( ) func CheckKeyExchanges(instance *commsNetwork.Instance, grp *cyclic.Group, - sendE2E E2eSender, events event.Manager, manager partner.Manager, + sendE2E E2eSender, events event.Reporter, manager partner.Manager, param Params, sendTimeout time.Duration) { //get all sessions that may need a key exchange @@ -45,7 +45,7 @@ func CheckKeyExchanges(instance *commsNetwork.Instance, grp *cyclic.Group, // session. They run the same negotiation, the former does it on a newly created // session while the latter on an extant session func trigger(instance *commsNetwork.Instance, grp *cyclic.Group, sendE2E E2eSender, - events event.Manager, manager partner.Manager, inputSession *session.Session, + events event.Reporter, manager partner.Manager, inputSession *session.Session, sendTimeout time.Duration, params Params) { var negotiatingSession *session.Session diff --git a/event/event.go b/event/event.go index 84831d997c79eb44a2d5c11df7ffc55279d84b2f..1b017009e991c089bd9b7be930759bd2a1d3ffec 100644 --- a/event/event.go +++ b/event/event.go @@ -31,20 +31,20 @@ func (e reportableEvent) String() string { } // Holds state for the event reporting system -type eventManager struct { +type Manager struct { eventCh chan reportableEvent eventCbs sync.Map } -func NewEventManager() Manager { - return &eventManager{ +func NewEventManager() *Manager { + return &Manager{ eventCh: make(chan reportableEvent, 1000), } } // Report reports an event from the client to api users, providing a // priority, category, eventType, and details -func (e *eventManager) Report(priority int, category, evtType, details string) { +func (e *Manager) Report(priority int, category, evtType, details string) { re := reportableEvent{ Priority: priority, Category: category, @@ -62,7 +62,7 @@ func (e *eventManager) Report(priority int, category, evtType, details string) { // RegisterEventCallback records the given function to receive // ReportableEvent objects. It returns the internal index // of the callback so that it can be deleted later. -func (e *eventManager) RegisterEventCallback(name string, +func (e *Manager) RegisterEventCallback(name string, myFunc Callback) error { _, existsAlready := e.eventCbs.LoadOrStore(name, myFunc) if existsAlready { @@ -74,18 +74,18 @@ func (e *eventManager) RegisterEventCallback(name string, // UnregisterEventCallback deletes the callback identified by the // index. It returns an error if it fails. -func (e *eventManager) UnregisterEventCallback(name string) { +func (e *Manager) UnregisterEventCallback(name string) { e.eventCbs.Delete(name) } -func (e *eventManager) EventService() (stoppable.Stoppable, error) { +func (e *Manager) EventService() (stoppable.Stoppable, error) { stop := stoppable.NewSingle("EventReporting") go e.reportEventsHandler(stop) return stop, nil } // reportEventsHandler reports events to every registered event callback -func (e *eventManager) reportEventsHandler(stop *stoppable.Single) { +func (e *Manager) reportEventsHandler(stop *stoppable.Single) { jww.DEBUG.Print("reportEventsHandler routine started") for { select { diff --git a/event/event_test.go b/event/event_test.go index 302c0422453aece8e57b8484444ee65593b27939..d657206bac2cbf2ed761ab454e6728484931a6f6 100644 --- a/event/event_test.go +++ b/event/event_test.go @@ -26,7 +26,7 @@ func TestEventReporting(t *testing.T) { } evtMgr := NewEventManager() - stop, _ := evtMgr.eventService() + stop, _ := evtMgr.EventService() // Register a callback err := evtMgr.RegisterEventCallback("test", myCb) if err != nil { diff --git a/event/interface.go b/event/interface.go index 9de7af0741b16ca1bbd484a3504df6b351ae9e49..867e4dd9c11760474240c27a3661b910b8fe061d 100644 --- a/event/interface.go +++ b/event/interface.go @@ -7,13 +7,10 @@ package event -import "gitlab.com/elixxir/client/stoppable" - // Callback defines the callback functions for client event reports type Callback func(priority int, category, evtType, details string) -// Manager reporting api (used internally) -type Manager interface { +// Reporter reporting api (used internally) +type Reporter interface { Report(priority int, category, evtType, details string) - EventService() (stoppable.Stoppable, error) } diff --git a/groupChat/utils_test.go b/groupChat/utils_test.go index afbb0ec0604330cb27b35227dcacb93ff0a7f2aa..002dbb17f28fb5170d511b66126b926280beeb53 100644 --- a/groupChat/utils_test.go +++ b/groupChat/utils_test.go @@ -9,6 +9,11 @@ package groupChat import ( "encoding/base64" + "math/rand" + "sync" + "testing" + "time" + "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" "gitlab.com/elixxir/client/catalog" @@ -34,10 +39,6 @@ import ( "gitlab.com/xx_network/primitives/id/ephemeral" "gitlab.com/xx_network/primitives/ndf" "gitlab.com/xx_network/primitives/netTime" - "math/rand" - "sync" - "testing" - "time" ) // newTestManager creates a new Manager for testing. @@ -359,7 +360,7 @@ func (*testNetworkManager) DeleteService(clientID *id.ID, toDelete message.Servi type dummyEventMgr struct{} func (d *dummyEventMgr) Report(int, string, string, string) {} -func (tnm *testNetworkManager) GetEventManager() event.Manager { +func (tnm *testNetworkManager) GetEventManager() event.Reporter { return &dummyEventMgr{} } diff --git a/ud/utils_test.go b/ud/utils_test.go index 425d22d9ae31775bc13b2efe6391037ba3a63f93..7d3b3626c3b479e0a14d87746ac707f970a7327e 100644 --- a/ud/utils_test.go +++ b/ud/utils_test.go @@ -15,6 +15,9 @@ package ud import ( + "testing" + "time" + "gitlab.com/elixxir/client/cmix/gateway" "gitlab.com/elixxir/client/event" "gitlab.com/elixxir/client/interfaces" @@ -28,8 +31,6 @@ import ( "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" "gitlab.com/xx_network/primitives/ndf" - "testing" - "time" ) func newTestNetworkManager(t *testing.T) interfaces.NetworkManager { @@ -76,7 +77,7 @@ func (tnm *testNetworkManager) SendManyCMIX([]message.TargetedCmixMessage, param type dummyEventMgr struct{} func (d *dummyEventMgr) Report(int, string, string, string) {} -func (tnm *testNetworkManager) GetEventManager() event.Manager { +func (tnm *testNetworkManager) GetEventManager() event.Reporter { return &dummyEventMgr{} }