diff --git a/api/client.go b/api/client.go index c47a4eb5f7e495ca3a24c5c66264c80a1f74e86e..37227372bfd21c14d5eff5ee88a3f909dbc819bf 100644 --- a/api/client.go +++ b/api/client.go @@ -180,53 +180,99 @@ func OpenClient(storageDir string, password []byte, parameters params.Network) ( func Login(storageDir string, password []byte, parameters params.Network) (*Client, error) { jww.INFO.Printf("Login()") + //Open the client c, err := OpenClient(storageDir, password, parameters) if err != nil { return nil, err } - //execute the rest of the loading as normal + //Attach the services interface c.services = newServiceProcessiesList(c.runner) - //get the user from session - u := c.storage.User() - cryptoUser := u.GetCryptographicIdentity() - - //start comms - c.comms, err = client.NewClientComms(cryptoUser.GetTransmissionID(), - rsa.CreatePublicKeyPem(cryptoUser.GetTransmissionRSA().GetPublic()), - rsa.CreatePrivateKeyPem(cryptoUser.GetTransmissionRSA()), - cryptoUser.GetTransmissionSalt()) + //initilize comms + err = c.initComms() if err != nil { - return nil, errors.WithMessage(err, "failed to load client") + return nil, err } //get the NDF to pass into permissioning and the network manager def := c.storage.GetBaseNDF() //initialize permissioning - c.permissioning, err = permissioning.Init(c.comms, def) + if def.Registration.Address != ""{ + err = c.initPermissioning(def) + if err != nil { + return nil, err + } + }else{ + jww.WARN.Printf("Registration with permissioning skipped due to " + + "blank permissionign address. Client will not be able to register " + + "or track network.") + } + + + // Initialize network and link it to context + c.network, err = network.NewManager(c.storage, c.switchboard, c.rng, c.comms, + parameters, def) if err != nil { - return nil, errors.WithMessage(err, "failed to init "+ - "permissioning handler") + return nil, err } - // check the client version is up to date to the network - err = c.checkVersion() + //update gateway connections + err = c.network.GetInstance().UpdateGatewayConnections() if err != nil { - return nil, errors.WithMessage(err, "failed to load client") + return nil, err } - //register with permissioning if necessary - if c.storage.GetRegistrationStatus() == storage.KeyGenComplete { - jww.INFO.Printf("Client has not registered yet, attempting registration") - err = c.registerWithPermissioning() + //initilize the auth tracker + c.auth = auth.NewManager(c.switchboard, c.storage, c.network) + + return c, nil +} + +// LoginWithNewBaseNDF_UNSAFE initializes a client object from existing storage +// 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 params.Network) (*Client, error) { + jww.INFO.Printf("LoginWithNewBaseNDF_UNSAFE()") + + // Parse the NDF + def, err := parseNDF(newBaseNdf) + if err != nil { + return nil, err + } + + //Open the client + c, err := OpenClient(storageDir, password, parameters) + + if err != nil { + return nil, err + } + + //Attach the services interface + c.services = newServiceProcessiesList(c.runner) + + //initialize comms + err = c.initComms() + if err != nil { + return nil, err + } + + //store the updated base NDF + c.storage.SetBaseNDF(def) + + //initialize permissioning + if def.Registration.Address != ""{ + err = c.initPermissioning(def) if err != nil { - jww.ERROR.Printf("Client has failed registration: %s", err) - return nil, errors.WithMessage(err, "failed to load client") + return nil, err } - jww.INFO.Printf("Client sucsecfully registered with the network") + }else{ + jww.WARN.Printf("Registration with permissioning skipped due to " + + "blank permissionign address. Client will not be able to register " + + "or track network.") } // Initialize network and link it to context @@ -236,6 +282,7 @@ func Login(storageDir string, password []byte, parameters params.Network) (*Clie return nil, err } + //update gateway connections err = c.network.GetInstance().UpdateGatewayConnections() if err != nil { return nil, err @@ -247,6 +294,52 @@ func Login(storageDir string, password []byte, parameters params.Network) (*Clie return c, nil } +func (c *Client)initComms()error{ + var err error + + //get the user from session + u := c.storage.User() + cryptoUser := u.GetCryptographicIdentity() + + //start comms + c.comms, err = client.NewClientComms(cryptoUser.GetTransmissionID(), + rsa.CreatePublicKeyPem(cryptoUser.GetTransmissionRSA().GetPublic()), + rsa.CreatePrivateKeyPem(cryptoUser.GetTransmissionRSA()), + cryptoUser.GetTransmissionSalt()) + if err != nil { + return errors.WithMessage(err, "failed to load client") + } + return nil +} + +func (c *Client)initPermissioning(def *ndf.NetworkDefinition)error{ + var err error + //initialize permissioning + c.permissioning, err = permissioning.Init(c.comms, def) + if err != nil { + return errors.WithMessage(err, "failed to init "+ + "permissioning handler") + } + + // check the client version is up to date to the network + err = c.checkVersion() + if err != nil { + return errors.WithMessage(err, "failed to load client") + } + + //register with permissioning if necessary + if c.storage.GetRegistrationStatus() == storage.KeyGenComplete { + jww.INFO.Printf("Client has not registered yet, attempting registration") + err = c.registerWithPermissioning() + if err != nil { + jww.ERROR.Printf("Client has failed registration: %s", err) + return errors.WithMessage(err, "failed to load client") + } + jww.INFO.Printf("Client sucsecfully registered with the network") + } + return nil +} + // ----- Client Functions ----- // StartNetworkFollower kicks off the tracking of the network. It starts // long running network client threads and returns an object for checking @@ -346,7 +439,7 @@ func (c *Client) GetHealth() interfaces.HealthTracker { return c.network.GetHealthTracker() } -// Returns the switchboard for Identity +// Returns the switchboard for Registration func (c *Client) GetSwitchboard() interfaces.Switchboard { jww.INFO.Printf("GetSwitchboard()") return c.switchboard diff --git a/go.mod b/go.mod index 6c1c2a6e5eac7b169defafc0591e629db454e3b5..1f39961060ebe7d93306f484fa55b7b8257e5c21 100644 --- a/go.mod +++ b/go.mod @@ -17,12 +17,12 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 github.com/spf13/viper v1.7.1 gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228 - gitlab.com/elixxir/comms v0.0.4-0.20210223182501-0b9a9fc80f48 - gitlab.com/elixxir/crypto v0.0.7-0.20210216174551-f806f79610eb + gitlab.com/elixxir/comms v0.0.4-0.20210223210438-35bdbcaf78be + gitlab.com/elixxir/crypto v0.0.7-0.20210223210315-b2072c080b0f gitlab.com/elixxir/ekv v0.1.4 - gitlab.com/elixxir/primitives v0.0.3-0.20210223180234-8e5d82635c20 - gitlab.com/xx_network/comms v0.0.4-0.20210216174438-0790d1f1f225 - gitlab.com/xx_network/crypto v0.0.5-0.20210216174356-e81e1ddf8fb7 + gitlab.com/elixxir/primitives v0.0.3-0.20210223210226-cccb5f7d4839 + gitlab.com/xx_network/comms v0.0.4-0.20210223210205-6d1cb7fde5d1 + gitlab.com/xx_network/crypto v0.0.5-0.20210223210125-9c1a8a8f1ec6 gitlab.com/xx_network/primitives v0.0.4-0.20210219231511-983054dbee36 golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad golang.org/x/net v0.0.0-20201224014010-6772e930b67b // indirect diff --git a/go.sum b/go.sum index e98dca2edef79fd0d9aa9dcc25ddb549683896d7..15d0acc8b72962ddf8c0015dd4ac85ff82628ebd 100644 --- a/go.sum +++ b/go.sum @@ -259,6 +259,8 @@ gitlab.com/elixxir/comms v0.0.4-0.20210218234550-f2e03b19bdb2 h1:p5GunVi5sP9atTw gitlab.com/elixxir/comms v0.0.4-0.20210218234550-f2e03b19bdb2/go.mod h1:GCbfPWB7VF5ZeDsLBCwfy0JiquG4OK6gsRjaIS66+yg= gitlab.com/elixxir/comms v0.0.4-0.20210223182501-0b9a9fc80f48 h1:fV6kL7PVZ+uR+TXGChGkCGdEM/DwThmQMcEhZTORt0w= gitlab.com/elixxir/comms v0.0.4-0.20210223182501-0b9a9fc80f48/go.mod h1:GCbfPWB7VF5ZeDsLBCwfy0JiquG4OK6gsRjaIS66+yg= +gitlab.com/elixxir/comms v0.0.4-0.20210223210438-35bdbcaf78be h1:+2OeULnvHDy52gP+KtyBwhOYO1Q3eJOIWI/cV4PRM1U= +gitlab.com/elixxir/comms v0.0.4-0.20210223210438-35bdbcaf78be/go.mod h1:NcZ0SiO2Lf/+nXK0weAgmTiocO6rz1Inl3mfL5go3Ac= 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= @@ -267,6 +269,8 @@ gitlab.com/elixxir/crypto v0.0.7-0.20210210215733-951b4e717763 h1:MUFs4H4kTdPm/f gitlab.com/elixxir/crypto v0.0.7-0.20210210215733-951b4e717763/go.mod h1:ucX9BoKoDlE6e3yjnTuVD2mc72nQUket44DxISyivUw= gitlab.com/elixxir/crypto v0.0.7-0.20210216174551-f806f79610eb h1:aPcrTC0QdrPqz4NgoAt5sfXt/+EFrNUwIns0s0VCQmg= gitlab.com/elixxir/crypto v0.0.7-0.20210216174551-f806f79610eb/go.mod h1:CLP8kULKW9A5oZHQ1zMCx4swMhBw2IMO68z4U/FkvcU= +gitlab.com/elixxir/crypto v0.0.7-0.20210223210315-b2072c080b0f h1:VQDGEmfw6CLfmiN2asiNOJrodkDEGYVXDBDNfXsjTmk= +gitlab.com/elixxir/crypto v0.0.7-0.20210223210315-b2072c080b0f/go.mod h1:onm3bf+h/yIza245YXHuUW2hUQ1Ga8K4doXk5AKnrgg= gitlab.com/elixxir/ekv v0.1.4 h1:NLVMwsFEKArWcsDHu2DbXlm9374iSgn7oIA3rVSsvjc= gitlab.com/elixxir/ekv v0.1.4/go.mod h1:e6WPUt97taFZe5PFLPb1Dupk7tqmDCTQu1kkstqJvw4= gitlab.com/elixxir/primitives v0.0.0-20200731184040-494269b53b4d/go.mod h1:OQgUZq7SjnE0b+8+iIAT2eqQF+2IFHn73tOo+aV11mg= @@ -280,11 +284,15 @@ gitlab.com/elixxir/primitives v0.0.3-0.20210216174458-2a23825c1eb1 h1:BfcaQtKgIb gitlab.com/elixxir/primitives v0.0.3-0.20210216174458-2a23825c1eb1/go.mod h1:Wpz7WGZ/CpO6oHNmVTgTNBETTRXi40arWjom1uwu/1s= gitlab.com/elixxir/primitives v0.0.3-0.20210223180234-8e5d82635c20 h1:76cC9BusM1hozdeEIosvfTXm/bYa/IVEY8Z9BvCrxq8= gitlab.com/elixxir/primitives v0.0.3-0.20210223180234-8e5d82635c20/go.mod h1:Wpz7WGZ/CpO6oHNmVTgTNBETTRXi40arWjom1uwu/1s= +gitlab.com/elixxir/primitives v0.0.3-0.20210223210226-cccb5f7d4839 h1:BvHO58ibn08sxll46vLIngFf37Ab76GV3xC+DM2m/Uo= +gitlab.com/elixxir/primitives v0.0.3-0.20210223210226-cccb5f7d4839/go.mod h1:LnvSPo0OMyHV4YMtnFelXwPu2UtU38h6DZrwUry6fjU= gitlab.com/xx_network/comms v0.0.0-20200805174823-841427dd5023/go.mod h1:owEcxTRl7gsoM8c3RQ5KAm5GstxrJp5tn+6JfQ4z5Hw= gitlab.com/xx_network/comms v0.0.4-0.20210210215624-622913c0a215 h1:f+cobRegYJH2x6cFkf1RfJEGFnX/vq2hGLltFC+g4Bk= gitlab.com/xx_network/comms v0.0.4-0.20210210215624-622913c0a215/go.mod h1:P81n1Rv0so+uIWGkGDEUt/bEvpksM6yfB0iB22rbFx4= gitlab.com/xx_network/comms v0.0.4-0.20210216174438-0790d1f1f225 h1:ZVxPD76xDLdTSGY2w/aGRMiiry7SauD8sq4c+see6aM= gitlab.com/xx_network/comms v0.0.4-0.20210216174438-0790d1f1f225/go.mod h1:e7dy2wznC4U4bG/U3xFGYYsnnd8zHOhoSxzFkGPQYX4= +gitlab.com/xx_network/comms v0.0.4-0.20210223210205-6d1cb7fde5d1 h1:AVKHbi69RA9DRIwgEPfRqCucmpsheskU9g+a4mGkDKo= +gitlab.com/xx_network/comms v0.0.4-0.20210223210205-6d1cb7fde5d1/go.mod h1:H10pJ7id+76aJeC1zP9F/N8cFBj1KtmkWHAmDILwZMw= 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= @@ -292,6 +300,8 @@ gitlab.com/xx_network/crypto v0.0.5-0.20210210215543-446333e9022e h1:wRRIu5sB+5t gitlab.com/xx_network/crypto v0.0.5-0.20210210215543-446333e9022e/go.mod h1:NiPI62thPru+eYlBucjl2/OLUND3wKLOhPrIHvK/nCA= gitlab.com/xx_network/crypto v0.0.5-0.20210216174356-e81e1ddf8fb7 h1:vyL+m7D7w+RgMPARzcKCR8UMGC2foqNU6cSb1J6Dkis= gitlab.com/xx_network/crypto v0.0.5-0.20210216174356-e81e1ddf8fb7/go.mod h1:8J+/VBcMlBj2sZuSDaVKI/i58awFZ5Zdb4JdEwGVrqo= +gitlab.com/xx_network/crypto v0.0.5-0.20210223210125-9c1a8a8f1ec6 h1:VOHKnXEeNsE7HV6jXRAnitaMz4Bk9+HNeGD65/Y14YM= +gitlab.com/xx_network/crypto v0.0.5-0.20210223210125-9c1a8a8f1ec6/go.mod h1:hv5iBFSfmrhTkS8cAu1+/SlXXDzpHhZou+cgBSf8hAI= gitlab.com/xx_network/primitives v0.0.0-20200803231956-9b192c57ea7c/go.mod h1:wtdCMr7DPePz9qwctNoAUzZtbOSHSedcK++3Df3psjA= gitlab.com/xx_network/primitives v0.0.0-20200804183002-f99f7a7284da h1:CCVslUwNC7Ul7NG5nu3ThGTSVUt1TxNRX+47f5TUwnk= gitlab.com/xx_network/primitives v0.0.0-20200804183002-f99f7a7284da/go.mod h1:OK9xevzWCaPO7b1wiluVJGk7R5ZsuC7pHY5hteZFQug=