@@ -22,6 +22,7 @@ const (
22
22
23
23
type config struct {
24
24
Mapping map [string ]string
25
+ Serials map [string ]string
25
26
}
26
27
27
28
func mappingFile () (string , error ) {
@@ -63,22 +64,13 @@ func homeDir() (string, error) {
63
64
// Prompt defines a yubikey prompt object
64
65
type Prompt struct {
65
66
mapping map [string ]string
66
- serial string
67
+ serials map [ string ] string
67
68
}
68
69
69
70
// NewPrompt populates the yubikey mapping from a dotfile, if it exists
70
71
func NewPrompt () * Prompt {
71
- return NewPromptWithSerial ("" )
72
- }
73
-
74
- // NewPromptWithSerial creates a new prompt with a specific serial
75
- func NewPromptWithSerial (serial string ) * Prompt {
76
72
logger .InfoMsg ("creating new yubikey prompt object" )
77
73
p := Prompt {}
78
- if serial != "" {
79
- logger .InfoMsgf ("setting yubikey serial to %s" , serial )
80
- p .serial = serial
81
- }
82
74
file , err := mappingFile ()
83
75
if err != nil {
84
76
logger .InfoMsgf ("failed to load mapping file: %s" , err )
@@ -103,6 +95,7 @@ func (p *Prompt) AddMappingFromFile(file string) error {
103
95
return err
104
96
}
105
97
p .AddMapping (c .Mapping )
98
+ p .AddSerials (c .Serials )
106
99
return nil
107
100
}
108
101
@@ -112,6 +105,12 @@ func (p *Prompt) AddMapping(mapping map[string]string) {
112
105
p .mapping = mapping
113
106
}
114
107
108
+ // AddSerials adds a serial lookup for OTP names
109
+ func (p * Prompt ) AddSerials (serials map [string ]string ) {
110
+ logger .InfoMsgf ("adding serials: %+v" , serials )
111
+ p .serials = serials
112
+ }
113
+
115
114
// Prompt asks the yubikey for a code
116
115
func (p * Prompt ) Prompt (arn string ) (string , error ) {
117
116
logger .InfoMsgf ("prompting for yubikey mfa for %s" , arn )
@@ -128,7 +127,7 @@ func (p *Prompt) Prompt(arn string) (string, error) {
128
127
func (p * Prompt ) Store (arn , base32seed string ) error {
129
128
logger .InfoMsgf ("storing mfa for %s" , arn )
130
129
name := p .otpName (arn )
131
- oath , err := p .getDevice ()
130
+ oath , err := p .getDevice (name )
132
131
if err != nil {
133
132
logger .InfoMsgf ("failed to access yubikey: %s" , err )
134
133
return err
@@ -174,7 +173,7 @@ func (p *Prompt) otpName(arn string) string {
174
173
175
174
func (p * Prompt ) otpExists (name string ) bool {
176
175
logger .InfoMsgf ("checking for existing of %s" , name )
177
- oath , err := p .getDevice ()
176
+ oath , err := p .getDevice (name )
178
177
if err != nil {
179
178
logger .InfoMsgf ("failed to access yubikey: %s" , err )
180
179
return false
@@ -200,7 +199,7 @@ func (p *Prompt) otpExists(name string) bool {
200
199
201
200
func (p * Prompt ) otpCode (name string ) (string , error ) {
202
201
logger .InfoMsgf ("prompting for code for %s" , name )
203
- oath , err := p .getDevice ()
202
+ oath , err := p .getDevice (name )
204
203
if err != nil {
205
204
logger .InfoMsgf ("failed to access yubikey: %s" , err )
206
205
return "" , err
@@ -213,9 +212,9 @@ func (p *Prompt) otpCode(name string) (string, error) {
213
212
})
214
213
}
215
214
216
- func (p * Prompt ) getDevice () (* ykoath.OATH , error ) {
215
+ func (p * Prompt ) getDevice (name string ) (* ykoath.OATH , error ) {
217
216
logger .InfoMsg ("creating new yubikey oath device" )
218
- oath , err := ykoath .NewFromSerial (p .serial )
217
+ oath , err := ykoath .NewFromSerial (p .serials [ name ] )
219
218
if err != nil {
220
219
return nil , err
221
220
}
0 commit comments