git-bug/repository/keyring.go

61 lines
1.7 KiB
Go

package repository
import (
"os"
"path/filepath"
"github.com/99designs/keyring"
)
type Item = keyring.Item
var ErrKeyringKeyNotFound = keyring.ErrKeyNotFound
// Keyring provides the uniform interface over the underlying backends
type Keyring interface {
// Get returns an Item matching the key or ErrKeyringKeyNotFound
Get(key string) (Item, error)
// Set stores an Item on the keyring. Set is idempotent.
Set(item Item) error
// Remove removes the item with matching key
Remove(key string) error
// Keys provides a slice of all keys stored on the keyring
Keys() ([]string, error)
}
func defaultKeyring() (Keyring, error) {
ucd, err := os.UserConfigDir()
if err != nil {
return nil, err
}
return keyring.Open(keyring.Config{
// only use the file backend until https://github.com/99designs/keyring/issues/74 is resolved
AllowedBackends: []keyring.BackendType{
keyring.FileBackend,
},
ServiceName: "git-bug",
// Fallback encrypted file
FileDir: filepath.Join(ucd, "git-bug", "keyring"),
// As we write the file in the user's config directory, this file should already be protected by the OS against
// other user's access. We actually don't terribly need to protect it further and a password prompt across all
// UI's would be a pain. Therefore we use here a constant password so the file will be unreadable by generic file
// scanners if the user's machine get compromised.
FilePasswordFunc: func(string) (string, error) {
return "git-bug", nil
},
})
}
// replaceKeyring allow to replace the Keyring of the underlying repo
type replaceKeyring struct {
TestedRepo
keyring Keyring
}
func (rk replaceKeyring) Keyring() Keyring {
return rk.keyring
}