~shulhan/gotp

a31b534b36eda669bab99819e4b45fa343ff38d9 — Shulhan 6 months ago dded88b
all: load private key only when needed

In case the configuration use private key with passphrase, the bash
completion will hang due to the command ask for passphrase.

This changes fix this issue by loading private key only when doing add,
generate, import, or remote-private-key.
3 files changed, 28 insertions(+), 11 deletions(-)

M cli.go
M cli_test.go
M config.go
M cli.go => cli.go +23 -4
@@ 134,9 134,12 @@ func (cli *Cli) Add(issuer *Issuer) (err error) {
		return nil
	}

	var (
		logp = `Add`
	)
	var logp = `Add`

	cli.cfg.privateKey, err = loadPrivateKey(cli.cfg.PrivateKey, nil)
	if err != nil {
		return fmt.Errorf(`%s: %w`, logp, err)
	}

	err = cli.add(issuer)
	if err != nil {


@@ 163,6 166,11 @@ func (cli *Cli) Generate(label string, n int) (listOtp []string, err error) {
		proto      totp.Protocol
	)

	cli.cfg.privateKey, err = loadPrivateKey(cli.cfg.PrivateKey, nil)
	if err != nil {
		return nil, fmt.Errorf(`%s: %w`, logp, err)
	}

	issuer, err = cli.cfg.get(label)
	if err != nil {
		return nil, fmt.Errorf(`%s: %w`, logp, err)


@@ 201,6 209,11 @@ func (cli *Cli) Import(providerName, file string) (n int, err error) {
		issuer  *Issuer
	)

	cli.cfg.privateKey, err = loadPrivateKey(cli.cfg.PrivateKey, nil)
	if err != nil {
		return 0, fmt.Errorf(`%s: %w`, logp, err)
	}

	providerName = strings.ToLower(providerName)
	switch providerName {
	case providerNameAegis:


@@ 278,8 291,14 @@ func (cli *Cli) RemovePrivateKey() (err error) {
		return nil
	}

	var logp = `RemovePrivateKey`

	cli.cfg.privateKey, err = loadPrivateKey(cli.cfg.PrivateKey, nil)
	if err != nil {
		return fmt.Errorf(`%s: %w`, logp, err)
	}

	var (
		logp          = `RemovePrivateKey`
		oldPrivateKey = cli.cfg.privateKey
		oldIssuers    = cli.cfg.Issuers


M cli_test.go => cli_test.go +5 -0
@@ 191,6 191,11 @@ func TestCli_SetPrivateKey(t *testing.T) {
	}
	cli.cfg = cfg

	cli.cfg.privateKey, err = loadPrivateKey(cli.cfg.PrivateKey, nil)
	if err != nil {
		t.Fatal(err)
	}

	var (
		gotLabels []string = cli.List()
		label     string

M config.go => config.go +0 -7
@@ 77,13 77,6 @@ func loadConfig(content []byte) (cfg *config, err error) {
		return nil, fmt.Errorf(`%s: %w`, logp, err)
	}

	if len(cfg.PrivateKey) > 0 {
		cfg.privateKey, err = loadPrivateKey(cfg.PrivateKey, nil)
		if err != nil {
			return nil, fmt.Errorf(`%s: %w`, logp, err)
		}
	}

	return cfg, nil
}