This is an automated email from the ASF dual-hosted git repository. cmorris pushed a commit to branch beneficary-dupbug in repository https://gitbox.apache.org/repos/asf/incubator-milagro-dta.git
commit df9838bc54c471140d8a371415e1ded76ae31c22 Author: Christopher Morris <[email protected]> AuthorDate: Fri Aug 30 08:44:30 2019 +0100 Add order/secret request validation --- pkg/bitcoinplugin/service.go | 25 +++++++++++++++++++++---- pkg/defaultservice/order.go | 11 +++++++++++ pkg/defaultservice/plugable.go | 1 + 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/pkg/bitcoinplugin/service.go b/pkg/bitcoinplugin/service.go index 0b9a5c1..f087855 100644 --- a/pkg/bitcoinplugin/service.go +++ b/pkg/bitcoinplugin/service.go @@ -66,6 +66,27 @@ func (s *Service) ValidateOrderRequest(req *api.OrderRequest) error { return nil } +//ValidateOrderSecretRequest - checks incoming OrderSecret fields for Error, comparing to the Original Order +func (s *Service) ValidateOrderSecretRequest(req *api.OrderSecretRequest, order documents.OrderDoc) error { + //These are deliberately overly long winded, but it makes the case I'm trapping more obvious to the reader + + //There is no beneficiary supplided in either the Deposit or Redemption + if order.BeneficiaryCID == "" && req.BeneficiaryIDDocumentCID == "" { + return errors.New("Beneficiary must be supplied") + } + + //A beneficiary is specified in both, but they aren't the same + if order.BeneficiaryCID != "" && req.BeneficiaryIDDocumentCID != "" && order.BeneficiaryCID != req.BeneficiaryIDDocumentCID { + return errors.New("Beneficiaries in order & order/secret don't match") + } + + //order & order/secret beneficiary are the same order/secret is not required - discard + if order.BeneficiaryCID != "" && req.BeneficiaryIDDocumentCID != "" && order.BeneficiaryCID == req.BeneficiaryIDDocumentCID { + req.BeneficiaryIDDocumentCID = "" + } + return nil +} + // PrepareOrderPart1 adds the coin type to the order func (s *Service) PrepareOrderPart1(order *documents.OrderDoc, reqExtension map[string]string) (fulfillExtension map[string]string, err error) { coin, err := strconv.ParseInt(reqExtension["coin"], 10, 64) @@ -87,10 +108,6 @@ func (s *Service) PrepareOrderResponse(orderPart2 *documents.OrderDoc, reqExtens // ProduceBeneficiaryEncryptedData - func (s *Service) ProduceBeneficiaryEncryptedData(blsSK []byte, order *documents.OrderDoc, req *api.OrderSecretRequest) (encrypted []byte, extension map[string]string, err error) { - //There is no beneficiary supplided in either the Deposit or Redemption - if order.BeneficiaryCID == "" && req.BeneficiaryIDDocumentCID == "" { - return nil, nil, errors.New("Beneficiary must be supplied") - } enc, err := adhocEncryptedEnvelopeEncode(s, s.NodeID(), req.BeneficiaryIDDocumentCID, *order, blsSK) return enc, nil, err diff --git a/pkg/defaultservice/order.go b/pkg/defaultservice/order.go index 00e98f3..97a28c7 100644 --- a/pkg/defaultservice/order.go +++ b/pkg/defaultservice/order.go @@ -92,6 +92,11 @@ func (s *Service) ValidateOrderRequest(req *api.OrderRequest) error { return nil } +//ValidateOrderSecretRequest - Validate fields in the Order Secret +func (s *Service) ValidateOrderSecretRequest(req *api.OrderRequest) error { + return nil +} + // PrepareOrderPart1 is called before the order is send func (s *Service) PrepareOrderPart1(order *documents.OrderDoc, reqExtension map[string]string) (fulfillExtension map[string]string, err error) { return nil, nil @@ -214,6 +219,12 @@ func (s *Service) OrderSecret(req *api.OrderSecretRequest) (*api.OrderSecretResp return nil, errors.Wrap(err, "Fail to retrieve Order from IPFS") } + if err := s.Plugin.ValidateOrderSecretRequest(req, *order); err != nil { + return nil, err + } + + //Create a piece of data that is destined for the beneficiary, passed via the Master Fiduciary + beneficiaryEncryptedData, extension, err := s.Plugin.ProduceBeneficiaryEncryptedData(blsSK, order, req) if err != nil { return nil, err diff --git a/pkg/defaultservice/plugable.go b/pkg/defaultservice/plugable.go index b4f4bbf..65014f1 100644 --- a/pkg/defaultservice/plugable.go +++ b/pkg/defaultservice/plugable.go @@ -30,6 +30,7 @@ type Plugable interface { // order ValidateOrderRequest(req *api.OrderRequest) error + ValidateOrderSecretRequest(req *api.OrderSecretRequest, order documents.OrderDoc) error PrepareOrderPart1(order *documents.OrderDoc, reqExtension map[string]string) (fulfillExtension map[string]string, err error) PrepareOrderResponse(orderPart2 *documents.OrderDoc, reqExtension, fulfillExtension map[string]string) (commitment string, extension map[string]string, err error) ProduceBeneficiaryEncryptedData(blsSK []byte, order *documents.OrderDoc, req *api.OrderSecretRequest) (encrypted []byte, extension map[string]string, err error)
