Skip to content

Commit 7894e98

Browse files
committed
Merge branch 'main' into fix/ip-filtering
2 parents 0738492 + 0770c57 commit 7894e98

File tree

4 files changed

+119
-63
lines changed

4 files changed

+119
-63
lines changed

cmd/integration-test/mapcidr.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ var mapcidrTestcases = map[string]TestCase{
4141
"Match IP's(file) from CIDR": &mapCidrQuery{question: "192.168.1.0/24", expectedOutput: []string{"192.168.1.253", "192.168.1.252"}, args: "-mi ./tests/ip_list_to_match.txt"},
4242
"Filter IP's(args) from CIDR": &mapCidrQuery{question: "192.168.1.0/30", expectedOutput: []string{"192.168.1.0", "192.168.1.2"}, args: "-fi 192.168.1.1,192.168.1.3"},
4343
"Filter IP's(file) from CIDR": &mapCidrQuery{question: "192.168.1.0/30", expectedOutput: []string{"192.168.1.0", "192.168.1.2"}, args: "-fi ./tests/ip_list_to_filter.txt"},
44+
"Filter IP with CIDR range": &mapCidrQuery{question: "192.168.0.0/24", expectedOutput: []string{"192.168.0.0", "192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4", "192.168.0.5", "192.168.0.6", "192.168.0.7", "192.168.0.8", "192.168.0.9", "192.168.0.10", "192.168.0.11", "192.168.0.12", "192.168.0.13", "192.168.0.14", "192.168.0.15", "192.168.0.16", "192.168.0.17", "192.168.0.18", "192.168.0.19", "192.168.0.20", "192.168.0.21", "192.168.0.22", "192.168.0.23", "192.168.0.24", "192.168.0.25", "192.168.0.26", "192.168.0.27", "192.168.0.28", "192.168.0.29", "192.168.0.30", "192.168.0.31", "192.168.0.32", "192.168.0.33", "192.168.0.34", "192.168.0.35", "192.168.0.36", "192.168.0.37", "192.168.0.38", "192.168.0.39", "192.168.0.40", "192.168.0.41", "192.168.0.42", "192.168.0.43", "192.168.0.44", "192.168.0.45", "192.168.0.46", "192.168.0.47", "192.168.0.48", "192.168.0.49", "192.168.0.50", "192.168.0.51", "192.168.0.52", "192.168.0.53", "192.168.0.54", "192.168.0.55", "192.168.0.56", "192.168.0.57", "192.168.0.58", "192.168.0.59", "192.168.0.60", "192.168.0.61", "192.168.0.62", "192.168.0.63", "192.168.0.64", "192.168.0.65", "192.168.0.66", "192.168.0.67", "192.168.0.68", "192.168.0.69", "192.168.0.70", "192.168.0.71", "192.168.0.72", "192.168.0.73", "192.168.0.74", "192.168.0.75", "192.168.0.76", "192.168.0.77", "192.168.0.78", "192.168.0.79", "192.168.0.80", "192.168.0.81", "192.168.0.82", "192.168.0.83", "192.168.0.84", "192.168.0.85", "192.168.0.86", "192.168.0.87", "192.168.0.88", "192.168.0.89", "192.168.0.90", "192.168.0.91", "192.168.0.92", "192.168.0.93", "192.168.0.94", "192.168.0.95", "192.168.0.96", "192.168.0.97", "192.168.0.98", "192.168.0.99", "192.168.0.100", "192.168.0.101", "192.168.0.102", "192.168.0.103", "192.168.0.104", "192.168.0.105", "192.168.0.106", "192.168.0.107", "192.168.0.108", "192.168.0.109", "192.168.0.110", "192.168.0.111", "192.168.0.112", "192.168.0.113", "192.168.0.114", "192.168.0.115", "192.168.0.116", "192.168.0.117", "192.168.0.118", "192.168.0.119", "192.168.0.120", "192.168.0.121", "192.168.0.122", "192.168.0.123", "192.168.0.124", "192.168.0.125", "192.168.0.126", "192.168.0.127"}, args: "-fi 192.168.0.128/25"},
45+
"Filter IP with slicing": &mapCidrQuery{question: "192.168.0.0/24", expectedOutput: []string{"192.168.0.0/26", "192.168.0.64/26"}, args: "-fi 192.168.0.128/25 -sbc 2"},
46+
"Filter IP IPv6": &mapCidrQuery{question: "2001:db8::/126", expectedOutput: []string{"2001:db8::", "2001:db8::1", "2001:db8::3"}, args: "-fi 2001:db8::2"},
4447
"Convert IPs to IPv6": &mapCidrQuery{question: "192.168.0.0/30", expectedOutput: []string{"00:00:00:00:00:ffff:c0a8:0000", "00:00:00:00:00:ffff:c0a8:0001", "00:00:00:00:00:ffff:c0a8:0002", "00:00:00:00:00:ffff:c0a8:0003"}, args: "-t6"},
4548
"CIDR Skip Base": &mapCidrQuery{question: "192.168.1.0/30", expectedOutput: []string{"192.168.1.1", "192.168.1.2", "192.168.1.3"}, args: "-skip-base"},
4649
"CIDR Skip Broadcast": &mapCidrQuery{question: "192.168.0.255/30", expectedOutput: []string{"192.168.0.252", "192.168.0.253", "192.168.0.254"}, args: "-skip-broadcast"},
@@ -57,7 +60,7 @@ var mapcidrTestcases = map[string]TestCase{
5760
"Multiple IPRange Aggregation": &mapCidrQuery{question: "192.168.0.0-192.168.0.128,192.168.0.129-192.168.0.255", expectedOutput: []string{"192.168.0.0/24"}, args: "-a"},
5861
"IPRange IP count": &mapCidrQuery{question: "192.168.0.0-192.168.0.255", expectedOutput: []string{"256"}, args: "-c"},
5962
"Match IP's(args) from IPRange": &mapCidrQuery{question: "192.168.0.0-192.168.0.3", expectedOutput: []string{"192.168.0.1", "192.168.0.3"}, args: "-mi 192.168.0.1,192.168.0.3"},
60-
"Filter IP's(file) from IPRange": &mapCidrQuery{question: "192.168.0.0-192.168.0.3", expectedOutput: []string{"192.168.0.0", "192.168.0.2"}, args: "-fi 192.168.0.1,192.168.0.3"},
63+
"Filter IP's(file) from IPRange": &mapCidrQuery{question: "192.168.1.0-192.168.1.3", expectedOutput: []string{"192.168.1.0", "192.168.1.2"}, args: "-fi ./tests/ip_list_to_filter.txt"},
6164
"Convert IPs to IPv6 from IPRange": &mapCidrQuery{question: "192.168.0.0-192.168.0.3", expectedOutput: []string{"00:00:00:00:00:ffff:c0a8:0000", "00:00:00:00:00:ffff:c0a8:0001", "00:00:00:00:00:ffff:c0a8:0002", "00:00:00:00:00:ffff:c0a8:0003"}, args: "-t6"},
6265
"Slice IPRange by given CIDR count": &mapCidrQuery{question: "173.0.84.0-173.0.84.255", expectedOutput: []string{"173.0.84.0/27", "173.0.84.32/27", "173.0.84.64/27", "173.0.84.96/27", "173.0.84.128/27", "173.0.84.160/27", "173.0.84.192/27", "173.0.84.224/28", "173.0.84.240/29", "173.0.84.248/29"}, args: "-sbc 10"},
6366
"Slice IPRange by given host count": &mapCidrQuery{question: "173.0.0.0-173.0.255.255", expectedOutput: []string{"173.0.0.0/17", "173.0.128.0/18", "173.0.192.0/18"}, args: "-sbh 20000"},

cmd/mapcidr/main.go

Lines changed: 94 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,31 @@ func prepareIPsFromCidrFlagList(items []string) []string {
346346
}
347347
return flagIPList
348348
}
349+
func cidrsToNetworks(cidrs []string) ([]*net.IPNet, error) {
350+
networks := make([]*net.IPNet, 0, len(cidrs))
351+
for _, cidr := range cidrs {
352+
_, network, err := net.ParseCIDR(cidr)
353+
if err != nil {
354+
// try to parse as ip
355+
if ip := net.ParseIP(cidr); ip != nil {
356+
if ip.To4() != nil {
357+
cidr += "/32"
358+
} else {
359+
cidr += "/128"
360+
}
361+
_, network, err = net.ParseCIDR(cidr)
362+
if err != nil {
363+
return nil, err
364+
}
365+
} else {
366+
return nil, err
367+
}
368+
}
369+
networks = append(networks, network)
370+
}
371+
return networks, nil
372+
}
373+
349374
func process(wg *sync.WaitGroup, chancidr, outputchan chan string) {
350375
defer wg.Done()
351376
var (
@@ -373,55 +398,83 @@ func process(wg *sync.WaitGroup, chancidr, outputchan chan string) {
373398
cidr += "/128"
374399
}
375400
}
376-
// Add IPs into ipRangeList which are passed as input. Example - "192.168.0.0-192.168.0.5"
377-
if strings.Contains(cidr, "-") {
378-
var ipRange []net.IP
379-
for _, ipstr := range strings.Split(cidr, "-") {
380-
ipRange = append(ipRange, net.ParseIP(ipstr))
401+
402+
cidrsToProcess := []string{cidr}
403+
if len(options.FilterIP) > 0 && strings.Contains(cidr, "/") {
404+
inputNetworks, err := cidrsToNetworks([]string{cidr})
405+
if err != nil {
406+
gologger.Fatal().Msgf("%s\n", err)
381407
}
382-
//check if ipRange has more than 2 values
383-
if len(ipRange) > 2 {
384-
gologger.Fatal().Msgf("IP range can not have more than 2 values.")
408+
filterNetworks, err := cidrsToNetworks(options.FilterIP)
409+
if err != nil {
410+
gologger.Fatal().Msgf("%s\n", err)
411+
}
412+
newNetworks, err := mapcidr.RemoveCIDRs(inputNetworks, filterNetworks)
413+
if err != nil {
414+
gologger.Fatal().Msgf("%s\n", err)
415+
}
416+
cidrsToProcess = make([]string, 0, len(newNetworks))
417+
for _, newNet := range newNetworks {
418+
cidrsToProcess = append(cidrsToProcess, newNet.String())
385419
}
386-
ipRangeList = append(ipRangeList, ipRange)
387-
continue
388-
}
389-
// Add ASN number
390-
if asn.IsASN(cidr) {
391-
asnNumberList = append(asnNumberList, cidr)
392-
continue
393-
}
394-
// test if we have a cidr
395-
if _, pCidr, err = net.ParseCIDR(cidr); err != nil {
396-
gologger.Fatal().Msgf("%s\n", err)
397420
}
398421

399-
// filters ip4|ip6, by default do not filter
400-
_, bits := pCidr.Mask.Size()
401-
isCidr4 := bits == mapcidr.DefaultMaskSize4
402-
isCidr6 := bits > mapcidr.DefaultMaskSize4
403-
isWrongIpType := (options.FilterIP4 && isCidr6) || (options.FilterIP6 && isCidr4)
404-
if isWrongIpType {
405-
continue
406-
}
422+
for _, cidr := range cidrsToProcess {
423+
// Add IPs into ipRangeList which are passed as input. Example - "192.168.0.0-192.168.0.5"
424+
if strings.Contains(cidr, "-") {
425+
var ipRange []net.IP
426+
for _, ipstr := range strings.Split(cidr, "-") {
427+
ipRange = append(ipRange, net.ParseIP(ipstr))
428+
}
429+
if len(ipRange) > 2 {
430+
gologger.Fatal().Msgf("IP range can not have more than 2 values.")
431+
}
432+
ipRangeList = append(ipRangeList, ipRange)
433+
continue
434+
}
435+
436+
// Add ASN number
437+
if asn.IsASN(cidr) {
438+
asnNumberList = append(asnNumberList, cidr)
439+
continue
440+
}
441+
442+
// test if we have a cidr
443+
if _, pCidr, err = net.ParseCIDR(cidr); err != nil {
444+
gologger.Fatal().Msgf("%s\n", err)
445+
}
407446

408-
if len(options.FilterIP) != 0 {
409-
for _, ip := range getIPList([]*net.IPNet{pCidr}) {
410-
if options.FilterIP != nil && sliceutil.Contains(options.FilterIP, ip.String()) {
411-
continue
447+
// filters ip4|ip6, by default do not filter
448+
_, bits := pCidr.Mask.Size()
449+
isCidr4 := bits == mapcidr.DefaultMaskSize4
450+
isCidr6 := bits > mapcidr.DefaultMaskSize4
451+
isWrongIpType := (options.FilterIP4 && isCidr6) || (options.FilterIP6 && isCidr4)
452+
if isWrongIpType {
453+
continue
454+
}
455+
456+
if len(options.FilterIP) != 0 {
457+
for _, ip := range getIPList([]*net.IPNet{pCidr}) {
458+
if options.FilterIP != nil && sliceutil.Contains(options.FilterIP, ip.String()) {
459+
continue
460+
}
461+
singleCIDR := &net.IPNet{
462+
IP: ip,
463+
Mask: net.CIDRMask(len(ip)*8, len(ip)*8),
464+
}
465+
allCidrs = append(allCidrs, singleCIDR)
412466
}
413-
singleCIDR := &net.IPNet{
414-
IP: ip,
415-
Mask: net.CIDRMask(len(ip)*8, len(ip)*8),
467+
if options.Aggregate || options.Shuffle || hasSort || options.AggregateApprox || options.Count {
468+
_ = ranger.Add(cidr)
416469
}
417-
allCidrs = append(allCidrs, singleCIDR)
470+
471+
} else if options.Aggregate || options.Shuffle || hasSort || options.AggregateApprox || options.Count {
472+
// In case of coalesce/shuffle we need to know all the cidrs and aggregate them by calling the proper function
473+
_ = ranger.Add(cidr)
474+
allCidrs = append(allCidrs, pCidr)
475+
} else {
476+
commonFunc(cidr, outputchan)
418477
}
419-
} else if options.Aggregate || options.Shuffle || hasSort || options.AggregateApprox || options.Count {
420-
// In case of coalesce/shuffle we need to know all the cidrs and aggregate them by calling the proper function
421-
_ = ranger.Add(cidr)
422-
allCidrs = append(allCidrs, pCidr)
423-
} else {
424-
commonFunc(cidr, outputchan)
425478
}
426479
}
427480

go.mod

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ require (
1010
github.com/projectdiscovery/goflags v0.1.74
1111
github.com/projectdiscovery/gologger v1.1.54
1212
github.com/projectdiscovery/ipranger v0.0.53
13-
github.com/projectdiscovery/utils v0.4.23
14-
github.com/stretchr/testify v1.10.0
13+
github.com/projectdiscovery/utils v0.5.0
14+
github.com/stretchr/testify v1.11.0
1515
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8
1616
)
1717

@@ -74,12 +74,12 @@ require (
7474
github.com/pierrec/lz4/v4 v4.1.21 // indirect
7575
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
7676
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
77-
github.com/projectdiscovery/fastdialer v0.4.7 // indirect
77+
github.com/projectdiscovery/fastdialer v0.4.9 // indirect
7878
github.com/projectdiscovery/hmap v0.0.93 // indirect
7979
github.com/projectdiscovery/machineid v0.0.0-20240226150047-2e2c51e35983 // indirect
80-
github.com/projectdiscovery/networkpolicy v0.1.22 // indirect
81-
github.com/projectdiscovery/retryabledns v1.0.106 // indirect
82-
github.com/projectdiscovery/retryablehttp-go v1.0.121 // indirect
80+
github.com/projectdiscovery/networkpolicy v0.1.23 // indirect
81+
github.com/projectdiscovery/retryabledns v1.0.107 // indirect
82+
github.com/projectdiscovery/retryablehttp-go v1.0.123 // indirect
8383
github.com/refraction-networking/utls v1.7.1 // indirect
8484
github.com/rivo/uniseg v0.4.7 // indirect
8585
github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d // indirect
@@ -98,7 +98,7 @@ require (
9898
github.com/tidwall/tinyqueue v0.1.1 // indirect
9999
github.com/tklauser/go-sysconf v0.3.12 // indirect
100100
github.com/tklauser/numcpus v0.6.1 // indirect
101-
github.com/ulikunitz/xz v0.5.12 // indirect
101+
github.com/ulikunitz/xz v0.5.15 // indirect
102102
github.com/weppos/publicsuffix-go v0.40.3-0.20250408071509-6074bbe7fd39 // indirect
103103
github.com/yl2chen/cidranger v1.0.2 // indirect
104104
github.com/yuin/goldmark v1.7.4 // indirect

go.sum

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -245,8 +245,8 @@ github.com/projectdiscovery/asnmap v1.1.1 h1:ImJiKIaACOT7HPx4Pabb5dksolzaFYsD1kI
245245
github.com/projectdiscovery/asnmap v1.1.1/go.mod h1:QT7jt9nQanj+Ucjr9BqGr1Q2veCCKSAVyUzLXfEcQ60=
246246
github.com/projectdiscovery/blackrock v0.0.1 h1:lHQqhaaEFjgf5WkuItbpeCZv2DUIE45k0VbGJyft6LQ=
247247
github.com/projectdiscovery/blackrock v0.0.1/go.mod h1:ANUtjDfaVrqB453bzToU+YB4cUbvBRpLvEwoWIwlTss=
248-
github.com/projectdiscovery/fastdialer v0.4.7 h1:fErLAppGZtZMGLLyeInMh4Kw/N0FXlTVh35v07dpS7I=
249-
github.com/projectdiscovery/fastdialer v0.4.7/go.mod h1:0Nm8GgU3Ds2Ac3/Fg59mVG40eMFYNA426PAcYqeNioM=
248+
github.com/projectdiscovery/fastdialer v0.4.9 h1:/CTzoEsayQOrYJjB0CCa/0iNX7LSMeml6XmeyxX8ZVA=
249+
github.com/projectdiscovery/fastdialer v0.4.9/go.mod h1:/4f7ELi6M5sr5XOpt+q0OpP4sQV36f3bOG23n7GOQUw=
250250
github.com/projectdiscovery/goflags v0.1.74 h1:n85uTRj5qMosm0PFBfsvOL24I7TdWRcWq/1GynhXS7c=
251251
github.com/projectdiscovery/goflags v0.1.74/go.mod h1:UMc9/7dFz2oln+10tv6cy+7WZKTHf9UGhaNkF95emh4=
252252
github.com/projectdiscovery/gologger v1.1.54 h1:WMzvJ8j/4gGfPKpCttSTaYCVDU1MWQSJnk3wU8/U6Ws=
@@ -257,14 +257,14 @@ github.com/projectdiscovery/ipranger v0.0.53 h1:gb4yEqtC2MJl1tSdx/ycao1A1wl7sHqj
257257
github.com/projectdiscovery/ipranger v0.0.53/go.mod h1:r6R0DFKQRo4QR2zjZXqLRCp0ovbco8F/NmOI+pK4db8=
258258
github.com/projectdiscovery/machineid v0.0.0-20240226150047-2e2c51e35983 h1:ZScLodGSezQVwsQDtBSMFp72WDq0nNN+KE/5DHKY5QE=
259259
github.com/projectdiscovery/machineid v0.0.0-20240226150047-2e2c51e35983/go.mod h1:3G3BRKui7nMuDFAZKR/M2hiOLtaOmyukT20g88qRQjI=
260-
github.com/projectdiscovery/networkpolicy v0.1.22 h1:TGiPm2nsUIUQO8f4cezU6yC0tM0G4ERXE0GtUG8OXTw=
261-
github.com/projectdiscovery/networkpolicy v0.1.22/go.mod h1:tK2CNkROdXowWwDn/jdYwXHjZYLetBSe2KSbNbABKxg=
262-
github.com/projectdiscovery/retryabledns v1.0.106 h1:repm5aGq5ge6fNJQbPNux7vyUhtUju7aIMEXZD9FX0A=
263-
github.com/projectdiscovery/retryabledns v1.0.106/go.mod h1:1W3ogENvt3Pb+Ju4AN0aE2lZy+D76Yzxsz51DqFCIk8=
264-
github.com/projectdiscovery/retryablehttp-go v1.0.121 h1:KQcMS7z5k3xnrTnD5G+HOVp1YRIbaB/iA+moc2lkR4c=
265-
github.com/projectdiscovery/retryablehttp-go v1.0.121/go.mod h1:15Usp6eLzNM/mI/jd+ucYRiyUuvm7vg2ymWRylG/Zss=
266-
github.com/projectdiscovery/utils v0.4.23 h1:fi6AVPIh2laomWO+Yy6G8YhvM4c2fDmQ/Viio6VZgyw=
267-
github.com/projectdiscovery/utils v0.4.23/go.mod h1:2K2ymMPnp4/Zao5QulCDJzKjxdyZPsucQm6Fyo09JlA=
260+
github.com/projectdiscovery/networkpolicy v0.1.23 h1:+MVm9xHCfzmZG5WhUtjAGFvNiQNKOgxZDDed1QfpLXI=
261+
github.com/projectdiscovery/networkpolicy v0.1.23/go.mod h1:ILun9d4jgAfLOYf/NYjV+sKyW3tZTLMl+HyvaZuXZo0=
262+
github.com/projectdiscovery/retryabledns v1.0.107 h1:Rd1JK7hfL68xRg3RzXmw9Q6B6WSNv9bdPhUoGvvebyg=
263+
github.com/projectdiscovery/retryabledns v1.0.107/go.mod h1:XddeOhDpwS0qR8/T4GXRGgDQsLhtRHw3TRdMsgJs28o=
264+
github.com/projectdiscovery/retryablehttp-go v1.0.123 h1:jnbNlYJ64ScyMIiPNpyXXX7fVpOfoII20knO2xHH+4s=
265+
github.com/projectdiscovery/retryablehttp-go v1.0.123/go.mod h1:lv7L70Q/Lc+LARjk6ji+Ihd4Bjb9c/qmqLcdCH8Gzbo=
266+
github.com/projectdiscovery/utils v0.5.0 h1:DN7mg2DpyObLByuObXzAFEkdNRDoPUnqE5N2szd3b3c=
267+
github.com/projectdiscovery/utils v0.5.0/go.mod h1:eCAWMmyaNxyPWbiKv1oeYJLIKpxceHE2+NWx3Jodhqk=
268268
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
269269
github.com/refraction-networking/utls v1.7.1 h1:dxg+jla3uocgN8HtX+ccwDr68uCBBO3qLrkZUbqkcw0=
270270
github.com/refraction-networking/utls v1.7.1/go.mod h1:TUhh27RHMGtQvjQq+RyO11P6ZNQNBb3N0v7wsEjKAIQ=
@@ -301,8 +301,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
301301
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
302302
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
303303
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
304-
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
305-
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
304+
github.com/stretchr/testify v1.11.0 h1:ib4sjIrwZKxE5u/Japgo/7SJV3PvgjGiRNAvTVGqQl8=
305+
github.com/stretchr/testify v1.11.0/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
306306
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
307307
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
308308
github.com/therootcompany/xz v1.0.1 h1:CmOtsn1CbtmyYiusbfmhmkpAAETj0wBIH6kCYaX+xzw=
@@ -336,8 +336,8 @@ github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ
336336
github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
337337
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
338338
github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
339-
github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
340-
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
339+
github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY=
340+
github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
341341
github.com/weppos/publicsuffix-go v0.13.0/go.mod h1:z3LCPQ38eedDQSwmsSRW4Y7t2L8Ln16JPQ02lHAdn5k=
342342
github.com/weppos/publicsuffix-go v0.30.1-0.20230422193905-8fecedd899db/go.mod h1:aiQaH1XpzIfgrJq3S1iw7w+3EDbRP7mF5fmwUhWyRUs=
343343
github.com/weppos/publicsuffix-go v0.40.3-0.20250408071509-6074bbe7fd39 h1:Bz/zVM/LoGZ9IztGBHrq2zlFQQbEG8dBYnxb4hamIHM=

0 commit comments

Comments
 (0)