@@ -3,20 +3,20 @@ package expressions
3
3
import (
4
4
"fmt"
5
5
"math/rand/v2"
6
- "net"
6
+ "net/netip "
7
7
"strings"
8
8
9
9
"github.com/TecharoHQ/anubis/internal"
10
+ "github.com/gaissmai/bart"
10
11
"github.com/google/cel-go/cel"
11
12
"github.com/google/cel-go/common/types"
12
13
"github.com/google/cel-go/common/types/ref"
13
14
"github.com/google/cel-go/common/types/traits"
14
15
"github.com/google/cel-go/ext"
15
- "github.com/yl2chen/cidranger"
16
16
)
17
17
18
- // pre-parsed CIDR ranger map. Hash of CIDR IP list is key
19
- var CIDRMap = make (map [string ]cidranger. Ranger )
18
+ // pre-parsed CIDR bart tables map. Hash of CIDR IP list is key
19
+ var CIDRMap = make (map [string ]* bart. Lite )
20
20
21
21
// buildCacheKey creates a deterministic cache key from the IP list
22
22
func buildCacheKey (ipList traits.Lister ) string {
@@ -31,21 +31,21 @@ func buildCacheKey(ipList traits.Lister) string {
31
31
cidrs = append (cidrs , string (cidr ))
32
32
}
33
33
// Join them to create a unique key
34
- return internal .SHA256sum (strings .Join (cidrs , "|" ))
34
+ return internal .FastHash (strings .Join (cidrs , "|" ))
35
35
}
36
36
37
- // getCachedRanger returns a cached ranger or builds a new one
38
- func getCachedRanger (ipList traits.Lister ) (cidranger. Ranger , error ) {
37
+ // getCachedPrefixTable returns a cached bart table or builds a new one
38
+ func getCachedPrefixTable (ipList traits.Lister ) (* bart. Lite , error ) {
39
39
// Build cache key
40
40
cacheKey := buildCacheKey (ipList )
41
41
42
42
// Check cache
43
- if ranger , ok := CIDRMap [cacheKey ]; ok {
44
- return ranger , nil
43
+ if prefixtable , ok := CIDRMap [cacheKey ]; ok {
44
+ return prefixtable , nil
45
45
}
46
46
47
- // Build new ranger
48
- ranger := cidranger . NewPCTrieRanger ( )
47
+ // Build new bart table
48
+ prefixtable := new (bart. Lite )
49
49
50
50
it := ipList .Iterator ()
51
51
for it .HasNext () == types .True {
@@ -54,33 +54,30 @@ func getCachedRanger(ipList traits.Lister) (cidranger.Ranger, error) {
54
54
if ! ok {
55
55
continue
56
56
}
57
- _ , rng , err := net . ParseCIDR (string (cidr ))
57
+ prefix , err := netip . ParsePrefix (string (cidr ))
58
58
if err != nil {
59
59
return nil , fmt .Errorf ("address %s CIDR parse error: %w" , cidr , err )
60
60
}
61
- ranger .Insert (cidranger . NewBasicRangerEntry ( * rng ) )
61
+ prefixtable .Insert (prefix )
62
62
}
63
63
64
64
// Store in map
65
- CIDRMap [cacheKey ] = ranger
66
- return ranger , nil
65
+ CIDRMap [cacheKey ] = prefixtable
66
+ return prefixtable , nil
67
67
}
68
68
69
69
func remoteAddrInList (remoteAddr types.String , ipList traits.Lister ) (bool , error ) {
70
- ipAddr := net . ParseIP (string (remoteAddr ))
71
- if ipAddr = = nil {
70
+ ipAddr , err := netip . ParseAddr (string (remoteAddr ))
71
+ if err ! = nil {
72
72
return false , fmt .Errorf ("remoteAddrInList: %s is not a valid IP address" , remoteAddr )
73
73
}
74
74
75
- ranger , err := getCachedRanger (ipList )
75
+ prefixtable , err := getCachedPrefixTable (ipList )
76
76
if err != nil {
77
77
return false , fmt .Errorf ("remoteAddrInList: %v" , err )
78
78
}
79
79
80
- ok , err := ranger .Contains (ipAddr )
81
- if err != nil {
82
- return false , fmt .Errorf ("remoteAddrInList: error checking if %s is in range: %v" , remoteAddr , err )
83
- }
80
+ ok := prefixtable .Contains (ipAddr )
84
81
return ok , nil
85
82
}
86
83
0 commit comments