fix: geoip wrong matching logic in fallback-filter

https://github.com/MetaCubeX/mihomo/issues/1478
This commit is contained in:
wwqgtxx
2024-08-29 22:00:55 +08:00
parent 4fecf68b8b
commit a96f72ade4
2 changed files with 31 additions and 2 deletions

View File

@@ -22,7 +22,6 @@ type GEOIP struct {
adapter string
noResolveIP bool
isSourceIP bool
geodata bool
}
var _ C.Rule = (*GEOIP)(nil)
@@ -115,6 +114,36 @@ func (g *GEOIP) MatchIp(ip netip.Addr) bool {
return slices.Contains(codes, g.country)
}
// MatchIp implements C.IpMatcher
func (g dnsFallbackFilter) MatchIp(ip netip.Addr) bool {
if !ip.IsValid() {
return false
}
if g.isLan(ip) { // compatible with original behavior
return false
}
if C.GeodataMode {
matcher, err := g.getIPMatcher()
if err != nil {
return false
}
return !matcher.Match(ip)
}
codes := mmdb.IPInstance().LookupCode(ip.AsSlice())
return !slices.Contains(codes, g.country)
}
type dnsFallbackFilter struct {
*GEOIP
}
func (g *GEOIP) DnsFallbackFilter() C.IpMatcher { // for dns.fallback-filter.geoip
return dnsFallbackFilter{GEOIP: g}
}
func (g *GEOIP) isLan(ip netip.Addr) bool {
return ip.IsPrivate() ||
ip.IsUnspecified() ||