@@ -19,27 +19,15 @@ var (
19
19
ErrInvalidLimit = errors .New ("unsupported recursive selector limit" )
20
20
)
21
21
22
- // SelectorValidator returns an OnRequestReceivedHook that only validates
23
- // requests if their selector only has no recursions that are greater than
24
- // maxAcceptedDepth
25
- func SelectorValidator (maxAcceptedDepth int ) graphsync.OnIncomingRequestHook {
26
- return func (p peer.ID , request graphsync.RequestData , hookActions graphsync.IncomingRequestHookActions ) {
27
- err := ValidateMaxRecursionDepth (request .Selector (), maxAcceptedDepth )
28
- if err == nil {
29
- hookActions .ValidateRequest ()
30
- }
31
- }
32
- }
22
+ var maxDepthSelector selector.Selector
33
23
34
- // ValidateMaxRecursionDepth examines the given selector node and verifies
35
- // recursive selectors are limited to the given fixed depth
36
- func ValidateMaxRecursionDepth (node ipld.Node , maxAcceptedDepth int ) error {
24
+ func init () {
37
25
ssb := builder .NewSelectorSpecBuilder (basicnode .Prototype .Map )
38
26
39
27
// this selector is a selector for traversing selectors...
40
28
// it traverses the various selector types looking for recursion limit fields
41
29
// and matches them
42
- s , err : = ssb .ExploreRecursive (selector .RecursionLimitNone (), ssb .ExploreFields (func (efsb builder.ExploreFieldsSpecBuilder ) {
30
+ maxDepthSelector , _ = ssb .ExploreRecursive (selector .RecursionLimitNone (), ssb .ExploreFields (func (efsb builder.ExploreFieldsSpecBuilder ) {
43
31
efsb .Insert (selector .SelectorKey_ExploreRecursive , ssb .ExploreFields (func (efsb builder.ExploreFieldsSpecBuilder ) {
44
32
efsb .Insert (selector .SelectorKey_Limit , ssb .Matcher ())
45
33
efsb .Insert (selector .SelectorKey_Sequence , ssb .ExploreRecursiveEdge ())
@@ -61,12 +49,25 @@ func ValidateMaxRecursionDepth(node ipld.Node, maxAcceptedDepth int) error {
61
49
efsb .Insert (selector .SelectorKey_Next , ssb .ExploreRecursiveEdge ())
62
50
}))
63
51
})).Selector ()
52
+ }
64
53
65
- if err != nil {
66
- return err
54
+ // SelectorValidator returns an OnRequestReceivedHook that only validates
55
+ // requests if their selector only has no recursions that are greater than
56
+ // maxAcceptedDepth
57
+ func SelectorValidator (maxAcceptedDepth int ) graphsync.OnIncomingRequestHook {
58
+ return func (p peer.ID , request graphsync.RequestData , hookActions graphsync.IncomingRequestHookActions ) {
59
+ err := ValidateMaxRecursionDepth (request .Selector (), maxAcceptedDepth )
60
+ if err == nil {
61
+ hookActions .ValidateRequest ()
62
+ }
67
63
}
64
+ }
65
+
66
+ // ValidateMaxRecursionDepth examines the given selector node and verifies
67
+ // recursive selectors are limited to the given fixed depth
68
+ func ValidateMaxRecursionDepth (node ipld.Node , maxAcceptedDepth int ) error {
68
69
69
- return traversal .WalkMatching (node , s , func (progress traversal.Progress , visited ipld.Node ) error {
70
+ return traversal .WalkMatching (node , maxDepthSelector , func (progress traversal.Progress , visited ipld.Node ) error {
70
71
if visited .ReprKind () != ipld .ReprKind_Map || visited .Length () != 1 {
71
72
return ErrInvalidLimit
72
73
}
0 commit comments