diff --git a/client/keys/add.go b/client/keys/add.go index c4cce57dd9..c421728196 100644 --- a/client/keys/add.go +++ b/client/keys/add.go @@ -1,6 +1,7 @@ package keys import ( + "encoding/json" "fmt" "io/ioutil" "net/http" @@ -164,59 +165,47 @@ type NewKeyBody struct { Seed string `json:"seed"` } -func paramCheck(name, password string, kb keys.Keybase) (int, string) { - if name == "" { - return http.StatusBadRequest, "You have to specify a name for the locally stored account." - } - if password == "" { - return http.StatusBadRequest, "You have to specify a password for the locally stored account." - } - - // check if already exists - infos, err := kb.List() - if err != nil { - return http.StatusInternalServerError, err.Error() - } - for _, i := range infos { - if i.GetName() == name { - return http.StatusConflict, fmt.Sprintf("Account with name %s already exists.", name) - } - } - return http.StatusOK, "" -} - -// AddNewKeyRequestHandler add new key REST handler +// add new key REST handler func AddNewKeyRequestHandler(w http.ResponseWriter, r *http.Request) { var kb keys.Keybase var m NewKeyBody kb, err := GetKeyBase() if err != nil { - w.WriteHeader(http.StatusInternalServerError) + w.WriteHeader(500) w.Write([]byte(err.Error())) return } body, err := ioutil.ReadAll(r.Body) + err = json.Unmarshal(body, &m) + if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) return } - - err = cdc.UnmarshalJSON(body, &m) - if err != nil { + if m.Name == "" { w.WriteHeader(http.StatusBadRequest) - w.Write([]byte(err.Error())) + w.Write([]byte("You have to specify a name for the locally stored account.")) + return + } + if m.Password == "" { + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte("You have to specify a password for the locally stored account.")) return } - code, errMsg := paramCheck(m.Name, m.Password, kb) - if code != http.StatusOK { - w.WriteHeader(code) - w.Write([]byte(errMsg)) - return + // check if already exists + infos, err := kb.List() + for _, i := range infos { + if i.GetName() == m.Name { + w.WriteHeader(http.StatusConflict) + w.Write([]byte(fmt.Sprintf("Account with name %s already exists.", m.Name))) + return + } } + // create account seed := m.Seed if seed == "" { @@ -238,7 +227,7 @@ func AddNewKeyRequestHandler(w http.ResponseWriter, r *http.Request) { keyOutput.Seed = seed - bz, err := cdc.MarshalJSON(keyOutput) + bz, err := json.Marshal(keyOutput) if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) @@ -270,67 +259,3 @@ func SeedRequestHandler(w http.ResponseWriter, r *http.Request) { seed := getSeed(algo) w.Write([]byte(seed)) } - -// RecoverKeyBody is recover key request REST body -type RecoverKeyBody struct { - Password string `json:"password"` - Seed string `json:"seed"` -} - -// RecoverKeyResuestHandler is the handler of creating seed in swagger rest server -func RecoverKeyRequestHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - name := vars["name"] - var m RecoverKeyBody - - body, err := ioutil.ReadAll(r.Body) - if err != nil { - w.WriteHeader(http.StatusBadRequest) - w.Write([]byte(err.Error())) - return - } - - err = cdc.UnmarshalJSON(body, &m) - if err != nil { - w.WriteHeader(http.StatusBadRequest) - w.Write([]byte(err.Error())) - return - } - - kb, err := GetKeyBase() - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(err.Error())) - return - } - - code, errMsg := paramCheck(name, m.Password, kb) - if code != http.StatusOK { - w.WriteHeader(code) - w.Write([]byte(errMsg)) - return - } - - info, err := kb.CreateKey(name, m.Seed, m.Password) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(err.Error())) - return - } - - keyOutput, err := Bech32KeyOutput(info) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(err.Error())) - return - } - - bz, err := cdc.MarshalJSON(keyOutput) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(err.Error())) - return - } - - w.Write(bz) -} diff --git a/client/keys/delete.go b/client/keys/delete.go index 522e3fb100..944feb4b19 100644 --- a/client/keys/delete.go +++ b/client/keys/delete.go @@ -1,15 +1,15 @@ package keys import ( + "encoding/json" "fmt" "net/http" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/crypto/keys" + keys "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/gorilla/mux" "github.com/spf13/cobra" - "io/ioutil" ) func deleteKeyCommand() *cobra.Command { @@ -65,23 +65,17 @@ func DeleteKeyRequestHandler(w http.ResponseWriter, r *http.Request) { var kb keys.Keybase var m DeleteKeyBody - body, err := ioutil.ReadAll(r.Body) + decoder := json.NewDecoder(r.Body) + err := decoder.Decode(&m) if err != nil { - w.WriteHeader(http.StatusBadRequest) - w.Write([]byte(err.Error())) - return - } - - err = cdc.UnmarshalJSON(body, &m) - if err != nil { - w.WriteHeader(http.StatusBadRequest) + w.WriteHeader(400) w.Write([]byte(err.Error())) return } kb, err = GetKeyBase() if err != nil { - w.WriteHeader(http.StatusInternalServerError) + w.WriteHeader(500) w.Write([]byte(err.Error())) return } @@ -89,10 +83,10 @@ func DeleteKeyRequestHandler(w http.ResponseWriter, r *http.Request) { // TODO handle error if key is not available or pass is wrong err = kb.Delete(name, m.Password) if err != nil { - w.WriteHeader(http.StatusInternalServerError) + w.WriteHeader(500) w.Write([]byte(err.Error())) return } - w.WriteHeader(http.StatusOK) + w.WriteHeader(200) } diff --git a/client/keys/list.go b/client/keys/list.go index 003c72ff8a..22f163f1d8 100644 --- a/client/keys/list.go +++ b/client/keys/list.go @@ -1,6 +1,7 @@ package keys import ( + "encoding/json" "net/http" "github.com/spf13/cobra" @@ -37,13 +38,13 @@ func runListCmd(cmd *cobra.Command, args []string) error { func QueryKeysRequestHandler(w http.ResponseWriter, r *http.Request) { kb, err := GetKeyBase() if err != nil { - w.WriteHeader(http.StatusInternalServerError) + w.WriteHeader(500) w.Write([]byte(err.Error())) return } infos, err := kb.List() if err != nil { - w.WriteHeader(http.StatusInternalServerError) + w.WriteHeader(500) w.Write([]byte(err.Error())) return } @@ -54,13 +55,13 @@ func QueryKeysRequestHandler(w http.ResponseWriter, r *http.Request) { } keysOutput, err := Bech32KeysOutput(infos) if err != nil { - w.WriteHeader(http.StatusInternalServerError) + w.WriteHeader(500) w.Write([]byte(err.Error())) return } - output, err := cdc.MarshalJSONIndent(keysOutput, "", " ") + output, err := json.MarshalIndent(keysOutput, "", " ") if err != nil { - w.WriteHeader(http.StatusInternalServerError) + w.WriteHeader(500) w.Write([]byte(err.Error())) return } diff --git a/client/keys/root.go b/client/keys/root.go index 1533bd49c2..f2a27dc0c8 100644 --- a/client/keys/root.go +++ b/client/keys/root.go @@ -33,7 +33,7 @@ func Commands() *cobra.Command { func RegisterRoutes(r *mux.Router) { r.HandleFunc("/keys", QueryKeysRequestHandler).Methods("GET") r.HandleFunc("/keys", AddNewKeyRequestHandler).Methods("POST") - r.HandleFunc("/keys/{name}/recover", RecoverKeyRequestHandler).Methods("POST") + r.HandleFunc("/keys/seed", SeedRequestHandler).Methods("GET") r.HandleFunc("/keys/{name}", GetKeyRequestHandler).Methods("GET") r.HandleFunc("/keys/{name}", UpdateKeyRequestHandler).Methods("PUT") r.HandleFunc("/keys/{name}", DeleteKeyRequestHandler).Methods("DELETE") diff --git a/client/keys/show.go b/client/keys/show.go index 85e123d36a..c7cae1f7cc 100644 --- a/client/keys/show.go +++ b/client/keys/show.go @@ -1,6 +1,7 @@ package keys import ( + "encoding/json" "fmt" "net/http" @@ -101,7 +102,7 @@ func GetKeyRequestHandler(w http.ResponseWriter, r *http.Request) { bechKeyOut, err := getBechKeyOut(bechPrefix) if err != nil { - w.WriteHeader(http.StatusBadRequest) + w.WriteHeader(400) w.Write([]byte(err.Error())) return } @@ -110,21 +111,21 @@ func GetKeyRequestHandler(w http.ResponseWriter, r *http.Request) { // TODO: check for the error if key actually does not exist, instead of // assuming this as the reason if err != nil { - w.WriteHeader(http.StatusNotFound) + w.WriteHeader(404) w.Write([]byte(err.Error())) return } keyOutput, err := bechKeyOut(info) if err != nil { - w.WriteHeader(http.StatusInternalServerError) + w.WriteHeader(500) w.Write([]byte(err.Error())) return } - output, err := cdc.MarshalJSONIndent(keyOutput, "", " ") + output, err := json.MarshalIndent(keyOutput, "", " ") if err != nil { - w.WriteHeader(http.StatusInternalServerError) + w.WriteHeader(500) w.Write([]byte(err.Error())) return } diff --git a/client/keys/update.go b/client/keys/update.go index 98c21f64e2..78a81bf0e6 100644 --- a/client/keys/update.go +++ b/client/keys/update.go @@ -1,15 +1,15 @@ package keys import ( + "encoding/json" "fmt" "net/http" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/crypto/keys" + keys "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/gorilla/mux" "github.com/spf13/cobra" - "io/ioutil" ) func updateKeyCommand() *cobra.Command { @@ -66,23 +66,17 @@ func UpdateKeyRequestHandler(w http.ResponseWriter, r *http.Request) { var kb keys.Keybase var m UpdateKeyBody - body, err := ioutil.ReadAll(r.Body) + decoder := json.NewDecoder(r.Body) + err := decoder.Decode(&m) if err != nil { - w.WriteHeader(http.StatusBadRequest) - w.Write([]byte(err.Error())) - return - } - - err = cdc.UnmarshalJSON(body, &m) - if err != nil { - w.WriteHeader(http.StatusBadRequest) + w.WriteHeader(400) w.Write([]byte(err.Error())) return } kb, err = GetKeyBase() if err != nil { - w.WriteHeader(http.StatusInternalServerError) + w.WriteHeader(500) w.Write([]byte(err.Error())) return } @@ -92,10 +86,10 @@ func UpdateKeyRequestHandler(w http.ResponseWriter, r *http.Request) { // TODO check if account exists and if password is correct err = kb.Update(name, m.OldPassword, getNewpass) if err != nil { - w.WriteHeader(http.StatusUnauthorized) + w.WriteHeader(401) w.Write([]byte(err.Error())) return } - w.WriteHeader(http.StatusOK) + w.WriteHeader(200) }