Skip to content

Commit

Permalink
Merge pull request #57 from 99designs/cocoa-dialog
Browse files Browse the repository at this point in the history
Support different dialog types
  • Loading branch information
lox committed Dec 3, 2015
2 parents dfb9246 + 474ec48 commit dccbcf8
Show file tree
Hide file tree
Showing 9 changed files with 83 additions and 19 deletions.
5 changes: 3 additions & 2 deletions add.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"os"

"github.com/99designs/aws-vault/keyring"
"github.com/99designs/aws-vault/prompt"
"github.com/aws/aws-sdk-go/aws/credentials"
)

Expand All @@ -25,10 +26,10 @@ func AddCommand(ui Ui, input AddCommandInput) {
}
} else {
var err error
if accessKeyId, err = prompt("Enter Access Key ID: "); err != nil {
if accessKeyId, err = prompt.TerminalPrompt("Enter Access Key ID: "); err != nil {
ui.Error.Fatal(err)
}
if secretKey, err = promptPassword("Enter Secret Access Key: "); err != nil {
if secretKey, err = prompt.TerminalPrompt("Enter Secret Access Key: "); err != nil {
ui.Error.Fatal(err)
}
}
Expand Down
3 changes: 3 additions & 0 deletions exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"time"

"github.com/99designs/aws-vault/keyring"
"github.com/99designs/aws-vault/prompt"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/credentials"
)
Expand All @@ -20,6 +21,7 @@ type ExecCommandInput struct {
Keyring keyring.Keyring
Duration time.Duration
MfaToken string
MfaPrompt prompt.PromptFunc
StartServer bool
Signals chan os.Signal
NoSession bool
Expand Down Expand Up @@ -51,6 +53,7 @@ func ExecCommand(ui Ui, input ExecCommandInput) {
creds, err := NewVaultCredentials(input.Keyring, input.Profile, VaultOptions{
SessionDuration: input.Duration,
MfaToken: input.MfaToken,
MfaPrompt: input.MfaPrompt,
})
if err != nil {
ui.Error.Fatal(err)
Expand Down
9 changes: 6 additions & 3 deletions login.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,24 @@ import (
"net/url"

"github.com/99designs/aws-vault/keyring"
"github.com/99designs/aws-vault/prompt"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/skratchdot/open-golang/open"
)

type LoginCommandInput struct {
Profile string
Keyring keyring.Keyring
MfaToken string
Profile string
Keyring keyring.Keyring
MfaToken string
MfaPrompt prompt.PromptFunc
}

func LoginCommand(ui Ui, input LoginCommandInput) {
provider, err := NewVaultProvider(input.Keyring, input.Profile, VaultOptions{
AssumeRoleDuration: MaxAssumeRoleDuration,
MfaToken: input.MfaToken,
MfaPrompt: input.MfaPrompt,
})
if err != nil {
ui.Error.Fatal(err)
Expand Down
12 changes: 9 additions & 3 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package main

import (
"fmt"
"io/ioutil"
"log"
"os"
"os/signal"

"github.com/99designs/aws-vault/keyring"
"github.com/99designs/aws-vault/prompt"
"gopkg.in/alecthomas/kingpin.v2"
)

Expand All @@ -29,7 +31,9 @@ func (w logWriter) Write(b []byte) (int, error) {

func main() {
var (
prompts = prompt.Available()
debug = kingpin.Flag("debug", "Show debugging output").Bool()
promptDriver = kingpin.Flag("prompt", fmt.Sprintf("Prompt driver to use %v", prompts)).Default("terminal").OverrideDefaultFromEnvar("AWS_VAULT_PROMPT").Enum(prompts...)
add = kingpin.Command("add", "Adds credentials, prompts if none provided")
addProfile = add.Arg("profile", "Name of the profile").Required().String()
addFromEnv = add.Flag("env", "Read the credentials from the environment").Bool()
Expand Down Expand Up @@ -109,15 +113,17 @@ func main() {
Duration: *execSessDuration,
Signals: signals,
MfaToken: *execMfaToken,
MfaPrompt: prompt.Method(*promptDriver),
StartServer: *execServer,
NoSession: *execNoSession,
})

case login.FullCommand():
LoginCommand(ui, LoginCommandInput{
Profile: *loginProfile,
Keyring: keyring,
MfaToken: *loginMfaToken,
Profile: *loginProfile,
Keyring: keyring,
MfaToken: *loginMfaToken,
MfaPrompt: prompt.Method(*promptDriver),
})

case server.FullCommand():
Expand Down
28 changes: 28 additions & 0 deletions prompt/osascript.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// +build darwin

package prompt

import (
"fmt"
"os/exec"
"strings"
)

func OSAScriptPrompt(prompt string) (string, error) {
cmd := exec.Command("/usr/bin/osascript", "-e", fmt.Sprintf(`
display dialog "%s" default answer "" buttons {"OK", "Cancel"} default button 1
text returned of the result
return result`,
prompt))

out, err := cmd.Output()
if err != nil {
return "", err
}

return strings.TrimSpace(string(out)), nil
}

func init() {
Methods["osascript"] = OSAScriptPrompt
}
25 changes: 25 additions & 0 deletions prompt/prompt.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package prompt

import "fmt"

type PromptFunc func(string) (string, error)

var Methods = map[string]PromptFunc{
"terminal": TerminalPrompt,
}

func Available() []string {
methods := []string{}
for k := range Methods {
methods = append(methods, k)
}
return methods
}

func Method(s string) PromptFunc {
m, ok := Methods[s]
if !ok {
panic(fmt.Sprintf("Prompt method %q doesn't exist", s))
}
return m
}
13 changes: 4 additions & 9 deletions prompt.go → prompt/terminal.go
Original file line number Diff line number Diff line change
@@ -1,24 +1,19 @@
package main
package prompt

import (
"bufio"
"fmt"
"os"
"strings"

"github.com/bgentry/speakeasy"
)

func prompt(prompt string) (string, error) {
func TerminalPrompt(prompt string) (string, error) {
fmt.Fprint(os.Stderr, prompt)

reader := bufio.NewReader(os.Stdin)
fmt.Print(prompt)
text, err := reader.ReadString('\n')
if err != nil {
return "", err
}
return strings.TrimSpace(text), nil
}

func promptPassword(prompt string) (string, error) {
return speakeasy.Ask(prompt)
}
4 changes: 3 additions & 1 deletion provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"time"

"github.com/99designs/aws-vault/keyring"
"github.com/99designs/aws-vault/prompt"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/service/sts"
Expand All @@ -33,6 +34,7 @@ type VaultOptions struct {
AssumeRoleDuration time.Duration
ExpiryWindow time.Duration
MfaToken string
MfaPrompt prompt.PromptFunc
}

func (o VaultOptions) Validate() error {
Expand Down Expand Up @@ -171,7 +173,7 @@ func (p *VaultProvider) getSessionToken(creds *credentials.Value) (sts.Credentia
if mfa, ok := p.profiles[p.profile]["mfa_serial"]; ok {
params.SerialNumber = aws.String(mfa)
if p.MfaToken == "" {
token, err := prompt(fmt.Sprintf("Enter token for %s: ", mfa))
token, err := p.MfaPrompt(fmt.Sprintf("Enter token for %s: ", mfa))
if err != nil {
return sts.Credentials{}, err
}
Expand Down
3 changes: 2 additions & 1 deletion rm.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"fmt"

"github.com/99designs/aws-vault/keyring"
"github.com/99designs/aws-vault/prompt"
)

type RemoveCommandInput struct {
Expand All @@ -15,7 +16,7 @@ type RemoveCommandInput struct {
func RemoveCommand(ui Ui, input RemoveCommandInput) {
if !input.SessionsOnly {
provider := &KeyringProvider{Keyring: input.Keyring, Profile: input.Profile}
r, err := prompt(fmt.Sprintf("Delete credentials for profile %q? (Y|n)", input.Profile))
r, err := prompt.TerminalPrompt(fmt.Sprintf("Delete credentials for profile %q? (Y|n)", input.Profile))
if err != nil {
ui.Error.Fatal(err)
} else if r == "N" || r == "n" {
Expand Down

0 comments on commit dccbcf8

Please sign in to comment.