// Run implements Command.Run. func (c *changePasswordCommand) Run(ctx *cmd.Context) error { if c.api == nil { api, err := c.NewUserManagerAPIClient() if err != nil { return errors.Trace(err) } c.api = api defer c.api.Close() } password, err := c.generateOrReadPassword(ctx, c.Generate) if err != nil { return errors.Trace(err) } var writer EnvironInfoCredsWriter var creds configstore.APICredentials if c.User == "" { // We get the creds writer before changing the password just to // minimise the things that could go wrong after changing the password // in the server. if c.writer == nil { writer, err = c.ConnectionInfo() if err != nil { return errors.Trace(err) } } else { writer = c.writer } creds = writer.APICredentials() } else { creds.User = c.User } oldPassword := creds.Password creds.Password = password if err = c.api.SetPassword(creds.User, password); err != nil { return block.ProcessBlockedError(err, block.BlockChange) } if c.User != "" { return writeServerFile(c, ctx, c.User, password, c.OutPath) } writer.SetAPICredentials(creds) if err := writer.Write(); err != nil { logger.Errorf("updating the cached credentials failed, reverting to original password") setErr := c.api.SetPassword(creds.User, oldPassword) if setErr != nil { logger.Errorf("failed to set password back, you will need to edit your environments file by hand to specify the password: %q", password) return errors.Annotate(setErr, "failed to set password back") } return errors.Annotate(err, "failed to write new password to environments file") } ctx.Infof("Your password has been updated.") return nil }
// Run implements Command.Run. func (c *ChangePasswordCommand) Run(ctx *cmd.Context) error { var err error c.Password, err = c.generateOrReadPassword(ctx, c.Generate) if err != nil { return errors.Trace(err) } var credsWriter EnvironInfoCredsWriter var creds configstore.APICredentials if c.User == "" { // We get the creds writer before changing the password just to // minimise the things that could go wrong after changing the password // in the server. credsWriter, err = getEnvironInfoWriter(c) if err != nil { return errors.Trace(err) } creds, err = getConnectionCredentials(c) if err != nil { return errors.Trace(err) } } else { creds.User = c.User } client, err := getChangePasswordAPI(c) if err != nil { return err } defer client.Close() oldPassword := creds.Password creds.Password = c.Password err = client.SetPassword(creds.User, c.Password) if err != nil { return block.ProcessBlockedError(err, block.BlockChange) } if c.User != "" { return c.writeEnvironmentFile(ctx) } credsWriter.SetAPICredentials(creds) if err := credsWriter.Write(); err != nil { logger.Errorf("updating the environments file failed, reverting to original password") setErr := client.SetPassword(creds.User, oldPassword) if setErr != nil { logger.Errorf("failed to set password back, you will need to edit your environments file by hand to specify the password: %q", c.Password) return errors.Annotate(setErr, "failed to set password back") } return errors.Annotate(err, "failed to write new password to environments file") } ctx.Infof("Your password has been updated.") return nil }
func (s *interfaceSuite) TestWrite(c *gc.C) { store := s.NewStore(c) // Create the info. info := store.CreateInfo("somemodel") // Set it up with some actual data and write it out. expectCreds := configstore.APICredentials{ User: "******", Password: "******", } info.SetAPICredentials(expectCreds) expectEndpoint := configstore.APIEndpoint{ Addresses: []string{"0.1.2.3"}, Hostnames: []string{"example.invalid"}, CACert: "a cert", ModelUUID: "dead-beef", } info.SetAPIEndpoint(expectEndpoint) err := info.Write() c.Assert(err, jc.ErrorIsNil) c.Assert(info.Initialized(), jc.IsTrue) // Check we can read the information back info, err = store.ReadInfo("somemodel") c.Assert(err, jc.ErrorIsNil) c.Assert(info.APICredentials(), gc.DeepEquals, expectCreds) c.Assert(info.APIEndpoint(), gc.DeepEquals, expectEndpoint) // Change the information and write it again. expectCreds.User = "******" info.SetAPICredentials(expectCreds) err = info.Write() c.Assert(err, jc.ErrorIsNil) // Check we can read the information back info, err = store.ReadInfo("somemodel") c.Assert(err, jc.ErrorIsNil) c.Assert(info.APICredentials(), gc.DeepEquals, expectCreds) }