diff --git a/Gopkg.lock b/Gopkg.lock index c679450b9c0e..06a17d015b6c 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -671,6 +671,7 @@ "github.com/spf13/viper", "github.com/stretchr/testify/assert", "github.com/stretchr/testify/require", + "github.com/syndtr/goleveldb/leveldb/opt", "github.com/tendermint/go-amino", "github.com/tendermint/iavl", "github.com/tendermint/tendermint/abci/server", diff --git a/PENDING.md b/PENDING.md index 3a92041c333a..4f3e03b21c20 100644 --- a/PENDING.md +++ b/PENDING.md @@ -159,6 +159,7 @@ IMPROVEMENTS * Gaia CLI (`gaiacli`) * [cli] #2060 removed `--select` from `block` command * [cli] #2128 fixed segfault when exporting directly after `gaiad init` + * [cli] [\#1255](https://github.com/cosmos/cosmos-sdk/issues/1255) make keybase opened with readonly option for query-purpose cli commands * Gaia * [x/stake] [#2023](https://github.com/cosmos/cosmos-sdk/pull/2023) Terminate iteration loop in `UpdateBondedValidators` and `UpdateBondedValidatorsFull` when the first revoked validator is encountered and perform a sanity check. diff --git a/client/keys/add.go b/client/keys/add.go index f13fac547b05..6b6e381174ec 100644 --- a/client/keys/add.go +++ b/client/keys/add.go @@ -63,7 +63,7 @@ func runAddCmd(cmd *cobra.Command, args []string) error { return errMissingName() } name = args[0] - kb, err = GetKeyBase() + kb, err = GetKeyBaseWithWritePerm() if err != nil { return err } @@ -174,7 +174,7 @@ func AddNewKeyRequestHandler(indent bool) http.HandlerFunc { var kb keys.Keybase var m NewKeyBody - kb, err := GetKeyBase() + kb, err := GetKeyBaseWithWritePerm() if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) @@ -311,7 +311,7 @@ func RecoverRequestHandler(indent bool) http.HandlerFunc { return } - kb, err := GetKeyBase() + kb, err := GetKeyBaseWithWritePerm() if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) diff --git a/client/keys/delete.go b/client/keys/delete.go index 23fc41ffd6ae..84adc00204ca 100644 --- a/client/keys/delete.go +++ b/client/keys/delete.go @@ -25,7 +25,7 @@ func deleteKeyCommand() *cobra.Command { func runDeleteCmd(cmd *cobra.Command, args []string) error { name := args[0] - kb, err := GetKeyBase() + kb, err := GetKeyBaseWithWritePerm() if err != nil { return err } @@ -73,7 +73,7 @@ func DeleteKeyRequestHandler(w http.ResponseWriter, r *http.Request) { return } - kb, err = GetKeyBase() + kb, err = GetKeyBaseWithWritePerm() if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) diff --git a/client/keys/update.go b/client/keys/update.go index 9416e9b0b45a..abf616a65353 100644 --- a/client/keys/update.go +++ b/client/keys/update.go @@ -26,7 +26,7 @@ func runUpdateCmd(cmd *cobra.Command, args []string) error { name := args[0] buf := client.BufferStdin() - kb, err := GetKeyBase() + kb, err := GetKeyBaseWithWritePerm() if err != nil { return err } @@ -74,7 +74,7 @@ func UpdateKeyRequestHandler(w http.ResponseWriter, r *http.Request) { return } - kb, err = GetKeyBase() + kb, err = GetKeyBaseWithWritePerm() if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) diff --git a/client/keys/utils.go b/client/keys/utils.go index 4ca8fc8f4279..f2ea638d9bc6 100644 --- a/client/keys/utils.go +++ b/client/keys/utils.go @@ -2,6 +2,7 @@ package keys import ( "fmt" + "github.com/syndtr/goleveldb/leveldb/opt" "path/filepath" "github.com/spf13/viper" @@ -25,14 +26,6 @@ var keybase keys.Keybase type bechKeyOutFn func(keyInfo keys.Info) (KeyOutput, error) -// TODO make keybase take a database not load from the directory - -// initialize a keybase based on the configuration -func GetKeyBase() (keys.Keybase, error) { - rootDir := viper.GetString(cli.HomeFlag) - return GetKeyBaseFromDir(rootDir) -} - // GetKeyInfo returns key info for a given name. An error is returned if the // keybase cannot be retrieved or getting the info fails. func GetKeyInfo(name string) (keys.Info, error) { @@ -82,10 +75,28 @@ func ReadPassphraseFromStdin(name string) (string, error) { return passphrase, nil } +// TODO make keybase take a database not load from the directory + // initialize a keybase based on the configuration -func GetKeyBaseFromDir(rootDir string) (keys.Keybase, error) { +func GetKeyBase() (keys.Keybase, error) { + rootDir := viper.GetString(cli.HomeFlag) + return getKeyBaseFromDirWithOpts(rootDir, &opt.Options{ReadOnly: true}) +} + +// initialize a keybase based on the configuration with write permission +func GetKeyBaseWithWritePerm() (keys.Keybase, error) { + rootDir := viper.GetString(cli.HomeFlag) + return GetKeyBaseFromDirWithWritePerm(rootDir) +} + +// initialize a keybase at particular dir with write permission +func GetKeyBaseFromDirWithWritePerm(rootDir string) (keys.Keybase, error) { + return getKeyBaseFromDirWithOpts(rootDir, &opt.Options{ReadOnly: false}) +} + +func getKeyBaseFromDirWithOpts(rootDir string, o *opt.Options) (keys.Keybase, error) { if keybase == nil { - db, err := dbm.NewGoLevelDB(KeyDBName, filepath.Join(rootDir, "keys")) + db, err := dbm.NewGoLevelDBWithOpts(KeyDBName, filepath.Join(rootDir, "keys"), o) if err != nil { return nil, err } diff --git a/client/lcd/test_helpers.go b/client/lcd/test_helpers.go index ee7fdbdef5f7..2a81239ac69c 100644 --- a/client/lcd/test_helpers.go +++ b/client/lcd/test_helpers.go @@ -94,7 +94,7 @@ func GetKeyBase(t *testing.T) crkeys.Keybase { viper.Set(cli.HomeFlag, dir) - keybase, err := keys.GetKeyBase() + keybase, err := keys.GetKeyBaseWithWritePerm() require.NoError(t, err) return keybase diff --git a/server/init.go b/server/init.go index 65a896e2ac19..6a5d821c1729 100644 --- a/server/init.go +++ b/server/init.go @@ -115,7 +115,7 @@ func GenerateCoinKey() (sdk.AccAddress, string, error) { func GenerateSaveCoinKey(clientRoot, keyName, keyPass string, overwrite bool) (sdk.AccAddress, string, error) { // get the keystore from the client - keybase, err := clkeys.GetKeyBaseFromDir(clientRoot) + keybase, err := clkeys.GetKeyBaseFromDirWithWritePerm(clientRoot) if err != nil { return sdk.AccAddress([]byte{}), "", err }