( inv *serpent.Invocation, client *codersdk.Client, email, password string, )
| 101 | } |
| 102 | |
| 103 | func (r *RootCmd) loginWithPassword( |
| 104 | inv *serpent.Invocation, |
| 105 | client *codersdk.Client, |
| 106 | email, password string, |
| 107 | ) error { |
| 108 | resp, err := client.LoginWithPassword(inv.Context(), codersdk.LoginWithPasswordRequest{ |
| 109 | Email: email, |
| 110 | Password: password, |
| 111 | }) |
| 112 | if err != nil { |
| 113 | return xerrors.Errorf("login with password: %w", err) |
| 114 | } |
| 115 | |
| 116 | sessionToken := resp.SessionToken |
| 117 | err = r.ensureTokenBackend().Write(client.URL, sessionToken) |
| 118 | if err != nil { |
| 119 | if xerrors.Is(err, sessionstore.ErrNotImplemented) { |
| 120 | return errKeyringNotSupported |
| 121 | } |
| 122 | return xerrors.Errorf("write session token: %w", err) |
| 123 | } |
| 124 | |
| 125 | client.SetSessionToken(sessionToken) |
| 126 | |
| 127 | // Nice side-effect: validates the token. |
| 128 | u, err := client.User(inv.Context(), "me") |
| 129 | if err != nil { |
| 130 | return xerrors.Errorf("get user: %w", err) |
| 131 | } |
| 132 | |
| 133 | _, _ = fmt.Fprintf( |
| 134 | inv.Stdout, |
| 135 | "Welcome to Coder, %s! You're authenticated.", |
| 136 | pretty.Sprint(cliui.DefaultStyles.Keyword, u.Username), |
| 137 | ) |
| 138 | |
| 139 | return nil |
| 140 | } |
| 141 | |
| 142 | func (r *RootCmd) login() *serpent.Command { |
| 143 | const firstUserTrialEnv = "CODER_FIRST_USER_TRIAL" |
no test coverage detected