Skip to content

Commit b9e5d9b

Browse files
committed
invert yubikey logic
1 parent 5de0490 commit b9e5d9b

File tree

4 files changed

+17
-36
lines changed

4 files changed

+17
-36
lines changed

cmd/profiles_rotate.go

+1-7
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
func init() {
1212
profilesCmd.AddCommand(profilesRotateCmd)
1313
profilesRotateCmd.Flags().BoolP("yubikey", "y", false, "Store MFA on yubikey")
14-
profilesRotateCmd.Flags().String("serial", "", "Yubikey serial to use")
1514
}
1615

1716
var profilesRotateCmd = &cobra.Command{
@@ -31,15 +30,10 @@ func profilesRotateRunner(cmd *cobra.Command, args []string) error {
3130
return err
3231
}
3332

34-
serial, err := cmd.Flags().GetString("serial")
35-
if err != nil {
36-
return err
37-
}
38-
3933
var mfaPrompt creds.MfaPrompt
4034
if useYubikey {
4135
mfaPrompt = &creds.MultiMfaPrompt{Backends: []creds.MfaPrompt{
42-
yubikey.NewPromptWithSerial(serial),
36+
yubikey.NewPrompt(),
4337
&creds.DefaultMfaPrompt{},
4438
}}
4539
} else {

cmd/travel.go

+1-7
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ func init() {
2424
travelCmd.Flags().String("profile", "", "Choose source profile to use")
2525
travelCmd.Flags().StringP("prompt", "p", "", "Choose prompt to use")
2626
travelCmd.Flags().BoolP("yubikey", "y", false, "Use Yubikey for MFA")
27-
travelCmd.Flags().String("serial", "", "Yubikey serial to use")
2827
travelCmd.Flags().String("service", "", "Service path for console URL")
2928
}
3029

@@ -57,11 +56,6 @@ func travelRunner(cmd *cobra.Command, args []string) error {
5756
return err
5857
}
5958

60-
serial, err := cmd.Flags().GetString("serial")
61-
if err != nil {
62-
return err
63-
}
64-
6559
servicePath, err := flags.GetString("service")
6660
if err != nil {
6761
return err
@@ -85,7 +79,7 @@ func travelRunner(cmd *cobra.Command, args []string) error {
8579
opts := travel.DefaultTraverseOptions()
8680
if useYubikey {
8781
opts.MfaPrompt = &creds.MultiMfaPrompt{Backends: []creds.MfaPrompt{
88-
yubikey.NewPromptWithSerial(serial),
82+
yubikey.NewPrompt(),
8983
&creds.DefaultMfaPrompt{},
9084
}}
9185
}

cmd/xargs.go

+1-7
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ func init() {
2626
xargsCmd.Flags().String("profile", "", "Choose source profile to use")
2727
xargsCmd.Flags().StringP("prompt", "p", "", "Choose prompt to use")
2828
xargsCmd.Flags().BoolP("yubikey", "y", false, "Use Yubikey for MFA")
29-
xargsCmd.Flags().String("serial", "", "Yubikey serial to use")
3029
xargsCmd.Flags().StringP("command", "c", "", "Command to execute")
3130
xargsCmd.Flags().Bool("skipconfirm", false, "Skip confirmation prompt")
3231
}
@@ -60,11 +59,6 @@ func xargsRunner(cmd *cobra.Command, args []string) error {
6059
return err
6160
}
6261

63-
serial, err := cmd.Flags().GetString("serial")
64-
if err != nil {
65-
return err
66-
}
67-
6862
commandStr, err := flags.GetString("command")
6963
if err != nil {
7064
return err
@@ -91,7 +85,7 @@ func xargsRunner(cmd *cobra.Command, args []string) error {
9185
opts := travel.DefaultTraverseOptions()
9286
if useYubikey {
9387
opts.MfaPrompt = &creds.MultiMfaPrompt{Backends: []creds.MfaPrompt{
94-
yubikey.NewPromptWithSerial(serial),
88+
yubikey.NewPrompt(),
9589
&creds.DefaultMfaPrompt{},
9690
}}
9791
}

yubikey/main.go

+14-15
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const (
2222

2323
type config struct {
2424
Mapping map[string]string
25+
Serials map[string]string
2526
}
2627

2728
func mappingFile() (string, error) {
@@ -63,22 +64,13 @@ func homeDir() (string, error) {
6364
// Prompt defines a yubikey prompt object
6465
type Prompt struct {
6566
mapping map[string]string
66-
serial string
67+
serials map[string]string
6768
}
6869

6970
// NewPrompt populates the yubikey mapping from a dotfile, if it exists
7071
func NewPrompt() *Prompt {
71-
return NewPromptWithSerial("")
72-
}
73-
74-
// NewPromptWithSerial creates a new prompt with a specific serial
75-
func NewPromptWithSerial(serial string) *Prompt {
7672
logger.InfoMsg("creating new yubikey prompt object")
7773
p := Prompt{}
78-
if serial != "" {
79-
logger.InfoMsgf("setting yubikey serial to %s", serial)
80-
p.serial = serial
81-
}
8274
file, err := mappingFile()
8375
if err != nil {
8476
logger.InfoMsgf("failed to load mapping file: %s", err)
@@ -103,6 +95,7 @@ func (p *Prompt) AddMappingFromFile(file string) error {
10395
return err
10496
}
10597
p.AddMapping(c.Mapping)
98+
p.AddSerials(c.Serials)
10699
return nil
107100
}
108101

@@ -112,6 +105,12 @@ func (p *Prompt) AddMapping(mapping map[string]string) {
112105
p.mapping = mapping
113106
}
114107

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+
115114
// Prompt asks the yubikey for a code
116115
func (p *Prompt) Prompt(arn string) (string, error) {
117116
logger.InfoMsgf("prompting for yubikey mfa for %s", arn)
@@ -128,7 +127,7 @@ func (p *Prompt) Prompt(arn string) (string, error) {
128127
func (p *Prompt) Store(arn, base32seed string) error {
129128
logger.InfoMsgf("storing mfa for %s", arn)
130129
name := p.otpName(arn)
131-
oath, err := p.getDevice()
130+
oath, err := p.getDevice(name)
132131
if err != nil {
133132
logger.InfoMsgf("failed to access yubikey: %s", err)
134133
return err
@@ -174,7 +173,7 @@ func (p *Prompt) otpName(arn string) string {
174173

175174
func (p *Prompt) otpExists(name string) bool {
176175
logger.InfoMsgf("checking for existing of %s", name)
177-
oath, err := p.getDevice()
176+
oath, err := p.getDevice(name)
178177
if err != nil {
179178
logger.InfoMsgf("failed to access yubikey: %s", err)
180179
return false
@@ -200,7 +199,7 @@ func (p *Prompt) otpExists(name string) bool {
200199

201200
func (p *Prompt) otpCode(name string) (string, error) {
202201
logger.InfoMsgf("prompting for code for %s", name)
203-
oath, err := p.getDevice()
202+
oath, err := p.getDevice(name)
204203
if err != nil {
205204
logger.InfoMsgf("failed to access yubikey: %s", err)
206205
return "", err
@@ -213,9 +212,9 @@ func (p *Prompt) otpCode(name string) (string, error) {
213212
})
214213
}
215214

216-
func (p *Prompt) getDevice() (*ykoath.OATH, error) {
215+
func (p *Prompt) getDevice(name string) (*ykoath.OATH, error) {
217216
logger.InfoMsg("creating new yubikey oath device")
218-
oath, err := ykoath.NewFromSerial(p.serial)
217+
oath, err := ykoath.NewFromSerial(p.serials[name])
219218
if err != nil {
220219
return nil, err
221220
}

0 commit comments

Comments
 (0)