forked from filecoin-project/go-fil-markets
/
unified_request_validator.go
90 lines (75 loc) · 3.39 KB
/
unified_request_validator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package requestvalidation
import (
"github.com/ipfs/go-cid"
"github.com/ipld/go-ipld-prime/datamodel"
"github.com/libp2p/go-libp2p/core/peer"
datatransfer "github.com/filecoin-project/go-data-transfer/v2"
"github.com/brossetti1/go-fil-markets/storagemarket"
)
// PushDeals gets deal states for Push validations
type PushDeals interface {
Get(cid.Cid) (storagemarket.MinerDeal, error)
}
// PullDeals gets deal states for Pull validations
type PullDeals interface {
Get(cid.Cid) (storagemarket.ClientDeal, error)
}
// UnifiedRequestValidator is a data transfer request validator that validates
// StorageDataTransferVoucher from the given state store
// It can be made to only accept push requests (Provider) or pull requests (Client)
// by passing nil for the statestore value for pushes or pulls
type UnifiedRequestValidator struct {
pushDeals PushDeals
pullDeals PullDeals
}
// NewUnifiedRequestValidator returns a new instance of UnifiedRequestValidator
func NewUnifiedRequestValidator(pushDeals PushDeals, pullDeals PullDeals) *UnifiedRequestValidator {
return &UnifiedRequestValidator{
pushDeals: pushDeals,
pullDeals: pullDeals,
}
}
// SetPushDeals sets the store to look up push deals with
func (v *UnifiedRequestValidator) SetPushDeals(pushDeals PushDeals) {
v.pushDeals = pushDeals
}
// SetPullDeals sets the store to look up pull deals with
func (v *UnifiedRequestValidator) SetPullDeals(pullDeals PullDeals) {
v.pullDeals = pullDeals
}
// ValidatePush implements the ValidatePush method of a data transfer request validator.
// If no pushStore exists, it rejects the request
// Otherwise, it calls the ValidatePush function to validate the deal
func (v *UnifiedRequestValidator) ValidatePush(_ datatransfer.ChannelID, sender peer.ID, voucher datamodel.Node, baseCid cid.Cid, selector datamodel.Node) (datatransfer.ValidationResult, error) {
if v.pushDeals == nil {
return datatransfer.ValidationResult{}, ErrNoPushAccepted
}
err := ValidatePush(v.pushDeals, sender, voucher, baseCid, selector)
if err != nil {
return datatransfer.ValidationResult{Accepted: false}, nil
}
return datatransfer.ValidationResult{Accepted: true}, nil
}
// ValidatePull implements the ValidatePull method of a data transfer request validator.
// If no pullStore exists, it rejects the request
// Otherwise, it calls the ValidatePull function to validate the deal
func (v *UnifiedRequestValidator) ValidatePull(_ datatransfer.ChannelID, receiver peer.ID, voucher datamodel.Node, baseCid cid.Cid, selector datamodel.Node) (datatransfer.ValidationResult, error) {
if v.pullDeals == nil {
return datatransfer.ValidationResult{}, ErrNoPullAccepted
}
err := ValidatePull(v.pullDeals, receiver, voucher, baseCid, selector)
if err != nil {
return datatransfer.ValidationResult{Accepted: false}, nil
}
return datatransfer.ValidationResult{Accepted: true}, nil
}
func (v *UnifiedRequestValidator) ValidateRestart(chid datatransfer.ChannelID, channelState datatransfer.ChannelState) (datatransfer.ValidationResult, error) {
if channelState.IsPull() {
voucher := channelState.Voucher()
return v.ValidatePull(chid, channelState.Recipient(), voucher.Voucher, channelState.BaseCID(), channelState.Selector())
} else {
voucher := channelState.Voucher()
return v.ValidatePush(chid, channelState.Sender(), voucher.Voucher, channelState.BaseCID(), channelState.Selector())
}
}
var _ datatransfer.RequestValidator = &UnifiedRequestValidator{}