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)

Reply via email to