// Run starts the engine. func (e *LoginCurrentDevice) Run(ctx *Context) error { // already logged in? in, err := e.G().LoginState().LoggedInProvisionedLoad() if err == nil && in { if len(e.username) == 0 || e.G().Env.GetUsername() == libkb.NewNormalizedUsername(e.username) { return nil } } var config *libkb.UserConfig if len(e.username) == 0 { config, err = e.G().Env.GetConfig().GetUserConfig() } else { nu := libkb.NewNormalizedUsername(e.username) config, err = e.G().Env.GetConfig().GetUserConfigForUsername(nu) } if err != nil { e.G().Log.Debug("error getting user config: %s (%T)", err, err) return errNoConfig } if config == nil { e.G().Log.Debug("user config is nil") return errNoConfig } if config.GetDeviceID().IsNil() { e.G().Log.Debug("no device in user config") return errNoDevice } // at this point, there is a user config either for the current user or for e.username // and it has a device id, so this should be a provisioned device. Thus, they should // just login normally. var afterLogin = func(lctx libkb.LoginContext) error { if err := lctx.LocalSession().SetDeviceProvisioned(e.G().Env.GetDeviceID()); err != nil { // not a fatal error, session will stay in memory e.G().Log.Warning("error saving session file: %s", err) } return nil } return e.G().LoginState().LoginWithPrompt(e.username, ctx.LoginUI, ctx.SecretUI, afterLogin) }
func (e *loginProvisionedDevice) Run(ctx *Context) error { // already logged in? in, err := e.G().LoginState().LoggedInProvisionedLoad() if err == nil && in { if len(e.username) == 0 || e.G().Env.GetUsername() == libkb.NewNormalizedUsername(e.username) { // already logged in, make sure to unlock device keys return e.unlockDeviceKeys(ctx, nil) } } var config *libkb.UserConfig loadUserArg := libkb.LoadUserArg{ PublicKeyOptional: true, ForceReload: true, } if len(e.username) == 0 { e.G().Log.Debug("| using current username") config, err = e.G().Env.GetConfig().GetUserConfig() loadUserArg.Self = true } else { e.G().Log.Debug("| using new username %s", e.username) nu := libkb.NewNormalizedUsername(e.username) config, err = e.G().Env.GetConfig().GetUserConfigForUsername(nu) loadUserArg.Name = e.username } if err != nil { e.G().Log.Debug("error getting user config: %s (%T)", err, err) return errNoConfig } if config == nil { e.G().Log.Debug("user config is nil") return errNoConfig } deviceID := config.GetDeviceID() if deviceID.IsNil() { e.G().Log.Debug("no device in user config") return errNoDevice } // Make sure the device ID is still valid. me, err := libkb.LoadUser(loadUserArg) if err != nil { e.G().Log.Debug("error loading user profile: %#v", err) return err } if !me.HasDeviceInCurrentInstall(deviceID) { e.G().Log.Debug("current device is not valid") return errNoDevice } // set e.username so that LoginUI never needs to ask for it e.username = me.GetName() // at this point, there is a user config either for the current user or for e.username // and it has a device id, so this should be a provisioned device. Thus, they should // just login normally. var afterLogin = func(lctx libkb.LoginContext) error { if err := lctx.LocalSession().SetDeviceProvisioned(e.G().Env.GetDeviceID()); err != nil { // not a fatal error, session will stay in memory e.G().Log.Warning("error saving session file: %s", err) } return nil } if err := e.G().LoginState().LoginWithPrompt(e.username, ctx.LoginUI, ctx.SecretUI, afterLogin); err != nil { return err } // login was successful, unlock the device keys return e.unlockDeviceKeys(ctx, me) }