Skip to content

Commit

Permalink
Add support to switch out password source binary
Browse files Browse the repository at this point in the history
There is now a new configuration entry option `password-source-binary`,
which allows to use an alternate binary for the gopass/pass password
source.

If the option is not specified, we will fallback to `pass` (for `pass`)
and `gopass` (for `gopass`).
  • Loading branch information
Patrick Pichler committed Oct 21, 2019
1 parent 5902449 commit 659a5c8
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 4 deletions.
16 changes: 16 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -374,3 +374,19 @@ When `password-source` is set to `stdin`, the `jira login` command will read fro
```bash
$ ./password-generator | jira login --endpoint=https://my.jira.endpoint.com --user=USERNAME
```

#### Switch binary used for password source
For `gopass` and `pass` it is possible to switch the binary used for retrieval of the password. This can be accomplised
by setting the `password-source-binary` option in the configuration file.

E.g.
```yaml
password-source: gopass
password-name: jira.example.com/myuser
password-source-binary: my-special-gopass
```

This will cause go-jira to use the `gopass` style cli interaction with the `my-special-gopass` binary.

If you ommit the `password-source-binary` option, either `gopass` (for `gopass`) or `pass` (for `pass`)
will be used.
2 changes: 2 additions & 0 deletions jiracli/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ type GlobalOptions struct {
// location using the `pass` tool, if missing prompt the user and store in the PasswordDirectory
PasswordSource figtree.StringOption `yaml:"password-source,omitempty" json:"password-source,omitempty"`

PasswordSourceBinary figtree.StringOption `yaml:"password-source-binary,omitempty" json:"password-source-binary,omitempty"`

// PasswordDirectory is only used for the "pass" PasswordSource. It is the location for the encrypted password
// files used by `pass`. Effectively this overrides the "PASSWORD_STORE_DIR" environment variable
PasswordDirectory figtree.StringOption `yaml:"password-directory,omitempty" json:"password-directory,omitempty"`
Expand Down
25 changes: 21 additions & 4 deletions jiracli/password.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,20 @@ func (o *GlobalOptions) keyName() string {
return user
}

func (o *GlobalOptions) GetPasswordBinary() string {
binary := o.PasswordSourceBinary.Value

if binary == "" {
if o.PasswordSource.Value == "gopass" {
return "gopass"
} else if o.PasswordSource.Value == "pass" {
return "pass"
}
}

return binary
}

func (o *GlobalOptions) GetPass() string {
passwd := ""
if o.PasswordSource.Value != "" {
Expand All @@ -50,13 +64,15 @@ func (o *GlobalOptions) GetPass() string {
if err != nil {
panic(err)
}
} else if o.PasswordSource.Value == "gopass" {
} else if o.PasswordSource.Value == "gopass" && o.GetPasswordBinary() != "" {
binary := o.GetPasswordBinary()

if o.PasswordDirectory.Value != "" {
orig := os.Getenv("PASSWORD_STORE_DIR")
os.Setenv("PASSWORD_STORE_DIR", o.PasswordDirectory.Value)
defer os.Setenv("PASSWORD_STORE_DIR", orig)
}
if bin, err := exec.LookPath("gopass"); err == nil {
if bin, err := exec.LookPath(binary); err == nil {
buf := bytes.NewBufferString("")
cmd := exec.Command(bin, "show", "-o", o.keyName())
cmd.Stdout = buf
Expand All @@ -69,13 +85,14 @@ func (o *GlobalOptions) GetPass() string {
} else {
log.Warning("Gopass binary was not found! Fallback to default password behaviour!")
}
} else if o.PasswordSource.Value == "pass" {
} else if o.PasswordSource.Value == "pass" && o.GetPasswordBinary() != "" {
binary := o.GetPasswordBinary()
if o.PasswordDirectory.Value != "" {
orig := os.Getenv("PASSWORD_STORE_DIR")
os.Setenv("PASSWORD_STORE_DIR", o.PasswordDirectory.Value)
defer os.Setenv("PASSWORD_STORE_DIR", orig)
}
if bin, err := exec.LookPath("pass"); err == nil {
if bin, err := exec.LookPath(binary); err == nil {
buf := bytes.NewBufferString("")
cmd := exec.Command(bin, o.keyName())
cmd.Stdout = buf
Expand Down

0 comments on commit 659a5c8

Please sign in to comment.