package firewall import "strings" func geoMembers(code string) []string { code = strings.ToUpper(strings.TrimPrefix(strings.TrimPrefix(strings.TrimPrefix(strings.TrimPrefix(code, "!"), "geo:"), "geo_"), "!")) switch code { case "EU": return strings.Fields("AT BE BG HR CY CZ DK EE FI FR DE GR HU IE IT LV LT LU MT NL PL PT RO SK SI ES SE") case "BALKANS": return strings.Fields("GR CY AL BG RO RS MK ME BA HR SI TR") case "BLOCKLIST", "HIGHRISK": return strings.Fields("CN RU IR KP BY") } return []string{code} } func (m *FirewallManager) geoReferenced(code string) bool { m.mu.Lock() defer m.mu.Unlock() check := func(src, dst string) bool { for _, value := range []string{src, dst} { if value == "" { continue } for _, member := range geoMembers(value) { if member == code { return true } } } return false } for _, r := range m.filterRules { if !r.Disabled && check(r.SrcGeoIP, r.DstGeoIP) { return true } } for _, r := range m.natRules { if !r.Disabled && check(r.SrcGeoIP, r.DstGeoIP) { return true } } for _, r := range m.mangleRules { if !r.Disabled && check(r.SrcGeoIP, r.DstGeoIP) { return true } } return false }