-
Notifications
You must be signed in to change notification settings - Fork 162
/
basic_login_strategy.go
105 lines (81 loc) · 1.97 KB
/
basic_login_strategy.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package cmd
import (
bosherr "github.com/cloudfoundry/bosh-utils/errors"
cmdconf "github.com/cloudfoundry/bosh-cli/cmd/config"
boshui "github.com/cloudfoundry/bosh-cli/ui"
)
type BasicLoginStrategy struct {
sessionFactory func(cmdconf.Config) Session
config cmdconf.Config
ui boshui.UI
}
func NewBasicLoginStrategy(
sessionFactory func(cmdconf.Config) Session,
config cmdconf.Config,
ui boshui.UI,
) BasicLoginStrategy {
return BasicLoginStrategy{
sessionFactory: sessionFactory,
config: config,
ui: ui,
}
}
func (s BasicLoginStrategy) Try() error {
sess := s.sessionFactory(s.config)
initialCreds := sess.Credentials()
for {
authed, err := s.tryOnce(sess.Environment(), initialCreds)
if err != nil {
return err
}
if authed {
return nil
}
if initialCreds.IsBasicComplete() {
return bosherr.Error("Invalid credentials")
}
}
}
func (s BasicLoginStrategy) tryOnce(environment string, creds cmdconf.Creds) (bool, error) {
creds, err := s.askForCreds(creds)
if err != nil {
return false, err
}
updatedConfig := s.config.SetCredentials(environment, creds)
sess := s.sessionFactory(updatedConfig)
director, err := sess.Director()
if err != nil {
return false, err
}
authed, err := director.IsAuthenticated()
if err != nil {
return false, err
}
if !authed {
s.ui.ErrorLinef("Failed to login to '%s'", environment)
return false, nil
}
err = updatedConfig.Save()
if err != nil {
return false, err
}
s.ui.PrintLinef("Logged in to '%s'", environment)
return true, nil
}
func (s BasicLoginStrategy) askForCreds(creds cmdconf.Creds) (cmdconf.Creds, error) {
if len(creds.Username) == 0 {
username, err := s.ui.AskForText("Username")
if err != nil {
return cmdconf.Creds{}, err
}
creds.Username = username
}
if len(creds.Password) == 0 {
password, err := s.ui.AskForPassword("Password")
if err != nil {
return cmdconf.Creds{}, err
}
creds.Password = password
}
return creds, nil
}