package server
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
|
|
"github.com/gorilla/mux"
|
|
keys "github.com/tendermint/go-crypto/keys"
|
|
"github.com/tendermint/go-crypto/keys/server/types"
|
|
)
|
|
|
|
type Keys struct {
|
|
manager keys.Manager
|
|
algo string
|
|
}
|
|
|
|
func New(manager keys.Manager, algo string) Keys {
|
|
return Keys{
|
|
manager: manager,
|
|
algo: algo,
|
|
}
|
|
}
|
|
|
|
func (k Keys) GenerateKey(w http.ResponseWriter, r *http.Request) {
|
|
req := types.CreateKeyRequest{
|
|
Algo: k.algo, // default key type from cli
|
|
}
|
|
err := readRequest(r, &req)
|
|
if err != nil {
|
|
writeError(w, err)
|
|
return
|
|
}
|
|
|
|
key, seed, err := k.manager.Create(req.Name, req.Passphrase, req.Algo)
|
|
if err != nil {
|
|
writeError(w, err)
|
|
return
|
|
}
|
|
|
|
res := types.CreateKeyResponse{key, seed}
|
|
writeSuccess(w, &res)
|
|
}
|
|
|
|
func (k Keys) GetKey(w http.ResponseWriter, r *http.Request) {
|
|
vars := mux.Vars(r)
|
|
name := vars["name"]
|
|
key, err := k.manager.Get(name)
|
|
if err != nil {
|
|
writeError(w, err)
|
|
return
|
|
}
|
|
writeSuccess(w, &key)
|
|
}
|
|
|
|
func (k Keys) ListKeys(w http.ResponseWriter, r *http.Request) {
|
|
|
|
keys, err := k.manager.List()
|
|
if err != nil {
|
|
writeError(w, err)
|
|
return
|
|
}
|
|
writeSuccess(w, keys)
|
|
}
|
|
|
|
func (k Keys) UpdateKey(w http.ResponseWriter, r *http.Request) {
|
|
req := types.UpdateKeyRequest{}
|
|
err := readRequest(r, &req)
|
|
if err != nil {
|
|
writeError(w, err)
|
|
return
|
|
}
|
|
|
|
vars := mux.Vars(r)
|
|
name := vars["name"]
|
|
if name != req.Name {
|
|
writeError(w, errors.New("path and json key names don't match"))
|
|
return
|
|
}
|
|
|
|
err = k.manager.Update(req.Name, req.OldPass, req.NewPass)
|
|
if err != nil {
|
|
writeError(w, err)
|
|
return
|
|
}
|
|
|
|
key, err := k.manager.Get(req.Name)
|
|
if err != nil {
|
|
writeError(w, err)
|
|
return
|
|
}
|
|
writeSuccess(w, &key)
|
|
}
|
|
|
|
func (k Keys) DeleteKey(w http.ResponseWriter, r *http.Request) {
|
|
req := types.DeleteKeyRequest{}
|
|
err := readRequest(r, &req)
|
|
if err != nil {
|
|
writeError(w, err)
|
|
return
|
|
}
|
|
|
|
vars := mux.Vars(r)
|
|
name := vars["name"]
|
|
if name != req.Name {
|
|
writeError(w, errors.New("path and json key names don't match"))
|
|
return
|
|
}
|
|
|
|
err = k.manager.Delete(req.Name, req.Passphrase)
|
|
if err != nil {
|
|
writeError(w, err)
|
|
return
|
|
}
|
|
|
|
// not really an error, but something generic
|
|
resp := types.ErrorResponse{
|
|
Success: true,
|
|
}
|
|
writeSuccess(w, &resp)
|
|
}
|
|
|
|
func (k Keys) Register(r *mux.Router) {
|
|
r.HandleFunc("/", k.GenerateKey).Methods("POST")
|
|
r.HandleFunc("/", k.ListKeys).Methods("GET")
|
|
r.HandleFunc("/{name}", k.GetKey).Methods("GET")
|
|
r.HandleFunc("/{name}", k.UpdateKey).Methods("POST", "PUT")
|
|
r.HandleFunc("/{name}", k.DeleteKey).Methods("DELETE")
|
|
}
|