2017-06-01 11:26:43 -07:00
|
|
|
package handlers
|
|
|
|
|
|
|
|
import (
|
|
|
|
crypto "github.com/tendermint/go-crypto"
|
|
|
|
|
|
|
|
"github.com/tendermint/basecoin"
|
|
|
|
"github.com/tendermint/basecoin/errors"
|
|
|
|
"github.com/tendermint/basecoin/types"
|
|
|
|
)
|
|
|
|
|
2017-06-27 09:33:35 -07:00
|
|
|
// app name for auth
|
2017-06-27 10:22:25 -07:00
|
|
|
const (
|
|
|
|
NameSigs = "sigs"
|
|
|
|
)
|
2017-06-27 09:33:35 -07:00
|
|
|
|
2017-06-01 11:26:43 -07:00
|
|
|
type SignedHandler struct {
|
|
|
|
AllowMultiSig bool
|
|
|
|
Inner basecoin.Handler
|
|
|
|
}
|
|
|
|
|
2017-06-27 10:22:25 -07:00
|
|
|
func (_ SignedHandler) Name() string {
|
|
|
|
return NameSigs
|
|
|
|
}
|
|
|
|
|
2017-06-01 11:26:43 -07:00
|
|
|
func (h SignedHandler) Next() basecoin.Handler {
|
|
|
|
return h.Inner
|
|
|
|
}
|
|
|
|
|
|
|
|
var _ basecoin.Handler = SignedHandler{}
|
|
|
|
|
|
|
|
type Signed interface {
|
|
|
|
basecoin.TxLayer
|
|
|
|
Signers() ([]crypto.PubKey, error)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h SignedHandler) CheckTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
|
|
|
|
var sigs []crypto.PubKey
|
|
|
|
|
|
|
|
stx, ok := tx.Unwrap().(Signed)
|
|
|
|
if !ok {
|
|
|
|
return res, errors.Unauthorized()
|
|
|
|
}
|
|
|
|
|
|
|
|
sigs, err = stx.Signers()
|
|
|
|
if err != nil {
|
|
|
|
return res, err
|
|
|
|
}
|
|
|
|
|
2017-06-27 09:33:35 -07:00
|
|
|
ctx2 := addSigners(ctx, sigs)
|
2017-06-01 11:26:43 -07:00
|
|
|
return h.Next().CheckTx(ctx2, store, stx.Next())
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h SignedHandler) DeliverTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
|
|
|
|
var sigs []crypto.PubKey
|
|
|
|
|
|
|
|
stx, ok := tx.Unwrap().(Signed)
|
|
|
|
if !ok {
|
|
|
|
return res, errors.Unauthorized()
|
|
|
|
}
|
|
|
|
|
|
|
|
sigs, err = stx.Signers()
|
|
|
|
if err != nil {
|
|
|
|
return res, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// add the signers to the context and continue
|
2017-06-27 09:33:35 -07:00
|
|
|
ctx2 := addSigners(ctx, sigs)
|
2017-06-01 11:26:43 -07:00
|
|
|
return h.Next().DeliverTx(ctx2, store, stx.Next())
|
|
|
|
}
|
2017-06-27 09:33:35 -07:00
|
|
|
|
|
|
|
func addSigners(ctx basecoin.Context, sigs []crypto.PubKey) basecoin.Context {
|
|
|
|
perms := make([]basecoin.Permission, len(sigs))
|
|
|
|
for i, s := range sigs {
|
2017-06-27 10:22:25 -07:00
|
|
|
perms[i] = basecoin.Permission{App: NameSigs, Address: s.Address()}
|
2017-06-27 09:33:35 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// add the signers to the context and continue
|
|
|
|
return ctx.AddPermissions(perms...)
|
|
|
|
}
|