mirror of
https://github.com/safing/portmaster
synced 2025-09-02 10:39:22 +00:00
504 lines
7.5 KiB
Go
504 lines
7.5 KiB
Go
package geoip
|
|
|
|
import (
|
|
"github.com/safing/portbase/utils"
|
|
)
|
|
|
|
// AddRegion adds the region based on the country.
|
|
func (l *Location) AddRegion() {
|
|
if regionID, ok := countryRegions[l.Country.ISOCode]; ok {
|
|
l.Continent.Code = regionID
|
|
}
|
|
}
|
|
|
|
// IsRegionalNeighbor returns whether the supplied location is a regional neighbor.
|
|
func (l *Location) IsRegionalNeighbor(other *Location) bool {
|
|
if l.Continent.Code == "" || other.Continent.Code == "" {
|
|
return false
|
|
}
|
|
if region, ok := regions[l.Continent.Code]; ok {
|
|
return utils.StringInSlice(region.Neighbors, other.Continent.Code)
|
|
}
|
|
return false
|
|
}
|
|
|
|
// Region defines a geographic region and neighboring regions.
|
|
type Region struct {
|
|
ID string
|
|
Name string
|
|
Neighbors []string
|
|
}
|
|
|
|
var regions = map[string]*Region{
|
|
"AF-C": {
|
|
ID: "AF-C",
|
|
Name: "Africa, Sub-Saharan Africa, Middle Africa",
|
|
Neighbors: []string{
|
|
"AF-E",
|
|
"AF-N",
|
|
"AF-S",
|
|
"AF-W",
|
|
},
|
|
},
|
|
"AF-E": {
|
|
ID: "AF-E",
|
|
Name: "Africa, Sub-Saharan Africa, Eastern Africa",
|
|
Neighbors: []string{
|
|
"AF-C",
|
|
"AF-N",
|
|
"AF-S",
|
|
},
|
|
},
|
|
"AF-N": {
|
|
ID: "AF-N",
|
|
Name: "Africa, Northern Africa",
|
|
Neighbors: []string{
|
|
"AF-C",
|
|
"AF-E",
|
|
"AF-W",
|
|
"AS-W",
|
|
"EU-S",
|
|
},
|
|
},
|
|
"AF-S": {
|
|
ID: "AF-S",
|
|
Name: "Africa, Sub-Saharan Africa, Southern Africa",
|
|
Neighbors: []string{
|
|
"AF-C",
|
|
"AF-E",
|
|
"AF-W",
|
|
},
|
|
},
|
|
"AF-W": {
|
|
ID: "AF-W",
|
|
Name: "Africa, Sub-Saharan Africa, Western Africa",
|
|
Neighbors: []string{
|
|
"AF-C",
|
|
"AF-N",
|
|
"AF-S",
|
|
},
|
|
},
|
|
"AN": {
|
|
ID: "AN",
|
|
Name: "Antarctica",
|
|
Neighbors: []string{},
|
|
},
|
|
"AS-C": {
|
|
ID: "AS-C",
|
|
Name: "Asia, Central Asia",
|
|
Neighbors: []string{
|
|
"AS-E",
|
|
"AS-S",
|
|
"AS-SE",
|
|
"AS-W",
|
|
},
|
|
},
|
|
"AS-E": {
|
|
ID: "AS-E",
|
|
Name: "Asia, Eastern Asia",
|
|
Neighbors: []string{
|
|
"AS-C",
|
|
"AS-S",
|
|
"AS-SE",
|
|
},
|
|
},
|
|
"AS-S": {
|
|
ID: "AS-S",
|
|
Name: "Asia, Southern Asia",
|
|
Neighbors: []string{
|
|
"AS-C",
|
|
"AS-E",
|
|
"AS-SE",
|
|
"AS-W",
|
|
},
|
|
},
|
|
"AS-SE": {
|
|
ID: "AS-SE",
|
|
Name: "Asia, South-eastern Asia",
|
|
Neighbors: []string{
|
|
"AS-C",
|
|
"AS-E",
|
|
"AS-S",
|
|
"OC-C",
|
|
"OC-E",
|
|
"OC-N",
|
|
"OC-S",
|
|
},
|
|
},
|
|
"AS-W": {
|
|
ID: "AS-W",
|
|
Name: "Asia, Western Asia",
|
|
Neighbors: []string{
|
|
"AF-N",
|
|
"AS-C",
|
|
"AS-S",
|
|
"EU-E",
|
|
},
|
|
},
|
|
"EU-E": {
|
|
ID: "EU-E",
|
|
Name: "Europe, Eastern Europe",
|
|
Neighbors: []string{
|
|
"AS-W",
|
|
"EU-N",
|
|
"EU-S",
|
|
"EU-W",
|
|
},
|
|
},
|
|
"EU-N": {
|
|
ID: "EU-N",
|
|
Name: "Europe, Northern Europe",
|
|
Neighbors: []string{
|
|
"EU-E",
|
|
"EU-S",
|
|
"EU-W",
|
|
},
|
|
},
|
|
"EU-S": {
|
|
ID: "EU-S",
|
|
Name: "Europe, Southern Europe",
|
|
Neighbors: []string{
|
|
"AF-N",
|
|
"EU-E",
|
|
"EU-N",
|
|
"EU-W",
|
|
},
|
|
},
|
|
"EU-W": {
|
|
ID: "EU-W",
|
|
Name: "Europe, Western Europe",
|
|
Neighbors: []string{
|
|
"EU-E",
|
|
"EU-N",
|
|
"EU-S",
|
|
},
|
|
},
|
|
"NA-E": {
|
|
ID: "NA-E",
|
|
Name: "North America, Caribbean",
|
|
Neighbors: []string{
|
|
"NA-N",
|
|
"NA-S",
|
|
"SA",
|
|
},
|
|
},
|
|
"NA-N": {
|
|
ID: "NA-N",
|
|
Name: "North America, Northern America",
|
|
Neighbors: []string{
|
|
"NA-E",
|
|
"NA-N",
|
|
"NA-S",
|
|
},
|
|
},
|
|
"NA-S": {
|
|
ID: "NA-S",
|
|
Name: "North America, Central America",
|
|
Neighbors: []string{
|
|
"NA-E",
|
|
"NA-N",
|
|
"NA-S",
|
|
"SA",
|
|
},
|
|
},
|
|
"OC-C": {
|
|
ID: "OC-C",
|
|
Name: "Oceania, Melanesia",
|
|
Neighbors: []string{
|
|
"AS-SE",
|
|
"OC-E",
|
|
"OC-N",
|
|
"OC-S",
|
|
},
|
|
},
|
|
"OC-E": {
|
|
ID: "OC-E",
|
|
Name: "Oceania, Polynesia",
|
|
Neighbors: []string{
|
|
"AS-SE",
|
|
"OC-C",
|
|
"OC-N",
|
|
"OC-S",
|
|
},
|
|
},
|
|
"OC-N": {
|
|
ID: "OC-N",
|
|
Name: "Oceania, Micronesia",
|
|
Neighbors: []string{
|
|
"AS-SE",
|
|
"OC-C",
|
|
"OC-E",
|
|
"OC-S",
|
|
},
|
|
},
|
|
"OC-S": {
|
|
ID: "OC-S",
|
|
Name: "Oceania, Australia and New Zealand",
|
|
Neighbors: []string{
|
|
"AS-SE",
|
|
"OC-C",
|
|
"OC-E",
|
|
"OC-N",
|
|
},
|
|
},
|
|
"SA": { // TODO: Split up
|
|
ID: "SA",
|
|
Name: "South America",
|
|
Neighbors: []string{
|
|
"NA-E",
|
|
"NA-S",
|
|
},
|
|
},
|
|
}
|
|
|
|
var countryRegions = map[string]string{
|
|
"AF": "AS-S",
|
|
"AX": "EU-N",
|
|
"AL": "EU-S",
|
|
"DZ": "AF-N",
|
|
"AS": "OC-E",
|
|
"AD": "EU-S",
|
|
"AO": "AF-C",
|
|
"AI": "NA-E",
|
|
"AQ": "AN",
|
|
"AG": "NA-E",
|
|
"AR": "SA",
|
|
"AM": "AS-W",
|
|
"AW": "NA-E",
|
|
"AU": "OC-S",
|
|
"AT": "EU-W",
|
|
"AZ": "AS-W",
|
|
"BS": "NA-E",
|
|
"BH": "AS-W",
|
|
"BD": "AS-S",
|
|
"BB": "NA-E",
|
|
"BY": "EU-E",
|
|
"BE": "EU-W",
|
|
"BZ": "NA-S",
|
|
"BJ": "AF-W",
|
|
"BM": "NA-N",
|
|
"BT": "AS-S",
|
|
"BO": "SA",
|
|
"BQ": "NA-E",
|
|
"BA": "EU-S",
|
|
"BW": "AF-S",
|
|
"BV": "SA",
|
|
"BR": "SA",
|
|
"IO": "AF-E",
|
|
"BN": "AS-SE",
|
|
"BG": "EU-E",
|
|
"BF": "AF-W",
|
|
"BI": "AF-E",
|
|
"CV": "AF-W",
|
|
"KH": "AS-SE",
|
|
"CM": "AF-C",
|
|
"CA": "NA-N",
|
|
"KY": "NA-E",
|
|
"CF": "AF-C",
|
|
"TD": "AF-C",
|
|
"CL": "SA",
|
|
"CN": "AS-E",
|
|
"CX": "OC-S",
|
|
"CC": "OC-S",
|
|
"CO": "SA",
|
|
"KM": "AF-E",
|
|
"CG": "AF-C",
|
|
"CD": "AF-C",
|
|
"CK": "OC-E",
|
|
"CR": "NA-S",
|
|
"CI": "AF-W",
|
|
"HR": "EU-S",
|
|
"CU": "NA-E",
|
|
"CW": "NA-E",
|
|
"CY": "AS-W",
|
|
"CZ": "EU-E",
|
|
"DK": "EU-N",
|
|
"DJ": "AF-E",
|
|
"DM": "NA-E",
|
|
"DO": "NA-E",
|
|
"EC": "SA",
|
|
"EG": "AF-N",
|
|
"SV": "NA-S",
|
|
"GQ": "AF-C",
|
|
"ER": "AF-E",
|
|
"EE": "EU-N",
|
|
"SZ": "AF-S",
|
|
"ET": "AF-E",
|
|
"FK": "SA",
|
|
"FO": "EU-N",
|
|
"FJ": "OC-C",
|
|
"FI": "EU-N",
|
|
"FR": "EU-W",
|
|
"GF": "SA",
|
|
"PF": "OC-E",
|
|
"TF": "AF-E",
|
|
"GA": "AF-C",
|
|
"GM": "AF-W",
|
|
"GE": "AS-W",
|
|
"DE": "EU-W",
|
|
"GH": "AF-W",
|
|
"GI": "EU-S",
|
|
"GR": "EU-S",
|
|
"GL": "NA-N",
|
|
"GD": "NA-E",
|
|
"GP": "NA-E",
|
|
"GU": "OC-N",
|
|
"GT": "NA-S",
|
|
"GG": "EU-N",
|
|
"GN": "AF-W",
|
|
"GW": "AF-W",
|
|
"GY": "SA",
|
|
"HT": "NA-E",
|
|
"HM": "OC-S",
|
|
"VA": "EU-S",
|
|
"HN": "NA-S",
|
|
"HK": "AS-E",
|
|
"HU": "EU-E",
|
|
"IS": "EU-N",
|
|
"IN": "AS-S",
|
|
"ID": "AS-SE",
|
|
"IR": "AS-S",
|
|
"IQ": "AS-W",
|
|
"IE": "EU-N",
|
|
"IM": "EU-N",
|
|
"IL": "AS-W",
|
|
"IT": "EU-S",
|
|
"JM": "NA-E",
|
|
"JP": "AS-E",
|
|
"JE": "EU-N",
|
|
"JO": "AS-W",
|
|
"KZ": "AS-C",
|
|
"KE": "AF-E",
|
|
"KI": "OC-N",
|
|
"KP": "AS-E",
|
|
"KR": "AS-E",
|
|
"KW": "AS-W",
|
|
"KG": "AS-C",
|
|
"LA": "AS-SE",
|
|
"LV": "EU-N",
|
|
"LB": "AS-W",
|
|
"LS": "AF-S",
|
|
"LR": "AF-W",
|
|
"LY": "AF-N",
|
|
"LI": "EU-W",
|
|
"LT": "EU-N",
|
|
"LU": "EU-W",
|
|
"MO": "AS-E",
|
|
"MG": "AF-E",
|
|
"MW": "AF-E",
|
|
"MY": "AS-SE",
|
|
"MV": "AS-S",
|
|
"ML": "AF-W",
|
|
"MT": "EU-S",
|
|
"MH": "OC-N",
|
|
"MQ": "NA-E",
|
|
"MR": "AF-W",
|
|
"MU": "AF-E",
|
|
"YT": "AF-E",
|
|
"MX": "NA-S",
|
|
"FM": "OC-N",
|
|
"MD": "EU-E",
|
|
"MC": "EU-W",
|
|
"MN": "AS-E",
|
|
"ME": "EU-S",
|
|
"MS": "NA-E",
|
|
"MA": "AF-N",
|
|
"MZ": "AF-E",
|
|
"MM": "AS-SE",
|
|
"NA": "AF-S",
|
|
"NR": "OC-N",
|
|
"NP": "AS-S",
|
|
"NL": "EU-W",
|
|
"NC": "OC-C",
|
|
"NZ": "OC-S",
|
|
"NI": "NA-S",
|
|
"NE": "AF-W",
|
|
"NG": "AF-W",
|
|
"NU": "OC-E",
|
|
"NF": "OC-S",
|
|
"MK": "EU-S",
|
|
"MP": "OC-N",
|
|
"NO": "EU-N",
|
|
"OM": "AS-W",
|
|
"PK": "AS-S",
|
|
"PW": "OC-N",
|
|
"PS": "AS-W",
|
|
"PA": "NA-S",
|
|
"PG": "OC-C",
|
|
"PY": "SA",
|
|
"PE": "SA",
|
|
"PH": "AS-SE",
|
|
"PN": "OC-E",
|
|
"PL": "EU-E",
|
|
"PT": "EU-S",
|
|
"PR": "NA-E",
|
|
"QA": "AS-W",
|
|
"RE": "AF-E",
|
|
"RO": "EU-E",
|
|
"RU": "EU-E",
|
|
"RW": "AF-E",
|
|
"BL": "NA-E",
|
|
"SH": "AF-W",
|
|
"KN": "NA-E",
|
|
"LC": "NA-E",
|
|
"MF": "NA-E",
|
|
"PM": "NA-N",
|
|
"VC": "NA-E",
|
|
"WS": "OC-E",
|
|
"SM": "EU-S",
|
|
"ST": "AF-C",
|
|
"SA": "AS-W",
|
|
"SN": "AF-W",
|
|
"RS": "EU-S",
|
|
"SC": "AF-E",
|
|
"SL": "AF-W",
|
|
"SG": "AS-SE",
|
|
"SX": "NA-E",
|
|
"SK": "EU-E",
|
|
"SI": "EU-S",
|
|
"SB": "OC-C",
|
|
"SO": "AF-E",
|
|
"ZA": "AF-S",
|
|
"GS": "SA",
|
|
"SS": "AF-E",
|
|
"ES": "EU-S",
|
|
"LK": "AS-S",
|
|
"SD": "AF-N",
|
|
"SR": "SA",
|
|
"SJ": "EU-N",
|
|
"SE": "EU-N",
|
|
"CH": "EU-W",
|
|
"SY": "AS-W",
|
|
"TW": "AS-E",
|
|
"TJ": "AS-C",
|
|
"TZ": "AF-E",
|
|
"TH": "AS-SE",
|
|
"TL": "AS-SE",
|
|
"TG": "AF-W",
|
|
"TK": "OC-E",
|
|
"TO": "OC-E",
|
|
"TT": "NA-E",
|
|
"TN": "AF-N",
|
|
"TR": "AS-W",
|
|
"TM": "AS-C",
|
|
"TC": "NA-E",
|
|
"TV": "OC-E",
|
|
"UG": "AF-E",
|
|
"UA": "EU-E",
|
|
"AE": "AS-W",
|
|
"GB": "EU-N",
|
|
"US": "NA-N",
|
|
"UM": "OC-N",
|
|
"UY": "SA",
|
|
"UZ": "AS-C",
|
|
"VU": "OC-C",
|
|
"VE": "SA",
|
|
"VN": "AS-SE",
|
|
"VG": "NA-E",
|
|
"VI": "NA-E",
|
|
"WF": "OC-E",
|
|
"EH": "AF-N",
|
|
"YE": "AS-W",
|
|
"ZM": "AF-E",
|
|
"ZW": "AF-E",
|
|
}
|