feat: geo-restriction via Cloudflare WAF custom rules
Add country-based access control managed through the Settings page.
Global allow-list with per-app overrides, searchable country selector,
automatic sync to Cloudflare WAF on settings change / deploy / remove,
plus periodic 6-hour verification.
New package: internal/cloudflare/ (client, zone, waf, countries, geosync)
New API: /api/geo/* (6 endpoints) + /api/stacks/{name}/geo/override
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,276 @@
|
||||
package cloudflare
|
||||
|
||||
import "sort"
|
||||
|
||||
// Country represents a country for the geo selector UI.
|
||||
type Country struct {
|
||||
Code string `json:"code"` // ISO 3166-1 alpha-2
|
||||
Name string `json:"name"` // Hungarian name
|
||||
}
|
||||
|
||||
// countries maps ISO 3166-1 alpha-2 codes to Hungarian country names.
|
||||
var countries = map[string]string{
|
||||
"AF": "Afganisztán",
|
||||
"AL": "Albánia",
|
||||
"DZ": "Algéria",
|
||||
"AS": "Amerikai Szamoa",
|
||||
"AD": "Andorra",
|
||||
"AO": "Angola",
|
||||
"AI": "Anguilla",
|
||||
"AQ": "Antarktisz",
|
||||
"AG": "Antigua és Barbuda",
|
||||
"AR": "Argentína",
|
||||
"AM": "Örményország",
|
||||
"AW": "Aruba",
|
||||
"AU": "Ausztrália",
|
||||
"AT": "Ausztria",
|
||||
"AZ": "Azerbajdzsán",
|
||||
"BS": "Bahama-szigetek",
|
||||
"BH": "Bahrein",
|
||||
"BD": "Banglades",
|
||||
"BB": "Barbados",
|
||||
"BY": "Fehéroroszország",
|
||||
"BE": "Belgium",
|
||||
"BZ": "Belize",
|
||||
"BJ": "Benin",
|
||||
"BM": "Bermuda",
|
||||
"BT": "Bhután",
|
||||
"BO": "Bolívia",
|
||||
"BA": "Bosznia-Hercegovina",
|
||||
"BW": "Botswana",
|
||||
"BR": "Brazília",
|
||||
"BN": "Brunei",
|
||||
"BG": "Bulgária",
|
||||
"BF": "Burkina Faso",
|
||||
"BI": "Burundi",
|
||||
"CV": "Cabo Verde",
|
||||
"KH": "Kambodzsa",
|
||||
"CM": "Kamerun",
|
||||
"CA": "Kanada",
|
||||
"KY": "Kajmán-szigetek",
|
||||
"CF": "Közép-afrikai Köztársaság",
|
||||
"TD": "Csád",
|
||||
"CL": "Chile",
|
||||
"CN": "Kína",
|
||||
"CO": "Kolumbia",
|
||||
"KM": "Comore-szigetek",
|
||||
"CG": "Kongó",
|
||||
"CD": "Kongói Demokratikus Köztársaság",
|
||||
"CK": "Cook-szigetek",
|
||||
"CR": "Costa Rica",
|
||||
"CI": "Elefántcsontpart",
|
||||
"HR": "Horvátország",
|
||||
"CU": "Kuba",
|
||||
"CW": "Curaçao",
|
||||
"CY": "Ciprus",
|
||||
"CZ": "Csehország",
|
||||
"DK": "Dánia",
|
||||
"DJ": "Dzsibuti",
|
||||
"DM": "Dominika",
|
||||
"DO": "Dominikai Köztársaság",
|
||||
"EC": "Ecuador",
|
||||
"EG": "Egyiptom",
|
||||
"SV": "Salvador",
|
||||
"GQ": "Egyenlítői-Guinea",
|
||||
"ER": "Eritrea",
|
||||
"EE": "Észtország",
|
||||
"SZ": "Eswatini",
|
||||
"ET": "Etiópia",
|
||||
"FK": "Falkland-szigetek",
|
||||
"FO": "Feröer-szigetek",
|
||||
"FJ": "Fidzsi-szigetek",
|
||||
"FI": "Finnország",
|
||||
"FR": "Franciaország",
|
||||
"GF": "Francia Guyana",
|
||||
"PF": "Francia Polinézia",
|
||||
"GA": "Gabon",
|
||||
"GM": "Gambia",
|
||||
"GE": "Grúzia",
|
||||
"DE": "Németország",
|
||||
"GH": "Ghána",
|
||||
"GI": "Gibraltár",
|
||||
"GR": "Görögország",
|
||||
"GL": "Grönland",
|
||||
"GD": "Grenada",
|
||||
"GP": "Guadeloupe",
|
||||
"GU": "Guam",
|
||||
"GT": "Guatemala",
|
||||
"GG": "Guernsey",
|
||||
"GN": "Guinea",
|
||||
"GW": "Bissau-Guinea",
|
||||
"GY": "Guyana",
|
||||
"HT": "Haiti",
|
||||
"HN": "Honduras",
|
||||
"HK": "Hongkong",
|
||||
"HU": "Magyarország",
|
||||
"IS": "Izland",
|
||||
"IN": "India",
|
||||
"ID": "Indonézia",
|
||||
"IR": "Irán",
|
||||
"IQ": "Irak",
|
||||
"IE": "Írország",
|
||||
"IM": "Man-sziget",
|
||||
"IL": "Izrael",
|
||||
"IT": "Olaszország",
|
||||
"JM": "Jamaica",
|
||||
"JP": "Japán",
|
||||
"JE": "Jersey",
|
||||
"JO": "Jordánia",
|
||||
"KZ": "Kazahsztán",
|
||||
"KE": "Kenya",
|
||||
"KI": "Kiribati",
|
||||
"KP": "Észak-Korea",
|
||||
"KR": "Dél-Korea",
|
||||
"KW": "Kuvait",
|
||||
"KG": "Kirgizisztán",
|
||||
"LA": "Laosz",
|
||||
"LV": "Lettország",
|
||||
"LB": "Libanon",
|
||||
"LS": "Lesotho",
|
||||
"LR": "Libéria",
|
||||
"LY": "Líbia",
|
||||
"LI": "Liechtenstein",
|
||||
"LT": "Litvánia",
|
||||
"LU": "Luxemburg",
|
||||
"MO": "Makaó",
|
||||
"MG": "Madagaszkár",
|
||||
"MW": "Malawi",
|
||||
"MY": "Malajzia",
|
||||
"MV": "Maldív-szigetek",
|
||||
"ML": "Mali",
|
||||
"MT": "Málta",
|
||||
"MH": "Marshall-szigetek",
|
||||
"MQ": "Martinique",
|
||||
"MR": "Mauritánia",
|
||||
"MU": "Mauritius",
|
||||
"YT": "Mayotte",
|
||||
"MX": "Mexikó",
|
||||
"FM": "Mikronézia",
|
||||
"MD": "Moldova",
|
||||
"MC": "Monaco",
|
||||
"MN": "Mongólia",
|
||||
"ME": "Montenegró",
|
||||
"MS": "Montserrat",
|
||||
"MA": "Marokkó",
|
||||
"MZ": "Mozambik",
|
||||
"MM": "Mianmar",
|
||||
"NA": "Namíbia",
|
||||
"NR": "Nauru",
|
||||
"NP": "Nepál",
|
||||
"NL": "Hollandia",
|
||||
"NC": "Új-Kaledónia",
|
||||
"NZ": "Új-Zéland",
|
||||
"NI": "Nicaragua",
|
||||
"NE": "Niger",
|
||||
"NG": "Nigéria",
|
||||
"NU": "Niue",
|
||||
"NF": "Norfolk-sziget",
|
||||
"MK": "Észak-Macedónia",
|
||||
"MP": "Északi-Mariana-szigetek",
|
||||
"NO": "Norvégia",
|
||||
"OM": "Omán",
|
||||
"PK": "Pakisztán",
|
||||
"PW": "Palau",
|
||||
"PS": "Palesztina",
|
||||
"PA": "Panama",
|
||||
"PG": "Pápua Új-Guinea",
|
||||
"PY": "Paraguay",
|
||||
"PE": "Peru",
|
||||
"PH": "Fülöp-szigetek",
|
||||
"PL": "Lengyelország",
|
||||
"PT": "Portugália",
|
||||
"PR": "Puerto Rico",
|
||||
"QA": "Katar",
|
||||
"RE": "Réunion",
|
||||
"RO": "Románia",
|
||||
"RU": "Oroszország",
|
||||
"RW": "Ruanda",
|
||||
"BL": "Saint-Barthélemy",
|
||||
"SH": "Szent Ilona",
|
||||
"KN": "Saint Kitts és Nevis",
|
||||
"LC": "Saint Lucia",
|
||||
"MF": "Saint-Martin",
|
||||
"PM": "Saint-Pierre és Miquelon",
|
||||
"VC": "Saint Vincent és a Grenadine-szigetek",
|
||||
"WS": "Szamoa",
|
||||
"SM": "San Marino",
|
||||
"ST": "São Tomé és Príncipe",
|
||||
"SA": "Szaúd-Arábia",
|
||||
"SN": "Szenegál",
|
||||
"RS": "Szerbia",
|
||||
"SC": "Seychelle-szigetek",
|
||||
"SL": "Sierra Leone",
|
||||
"SG": "Szingapúr",
|
||||
"SX": "Sint Maarten",
|
||||
"SK": "Szlovákia",
|
||||
"SI": "Szlovénia",
|
||||
"SB": "Salamon-szigetek",
|
||||
"SO": "Szomália",
|
||||
"ZA": "Dél-afrikai Köztársaság",
|
||||
"SS": "Dél-Szudán",
|
||||
"ES": "Spanyolország",
|
||||
"LK": "Srí Lanka",
|
||||
"SD": "Szudán",
|
||||
"SR": "Suriname",
|
||||
"SE": "Svédország",
|
||||
"CH": "Svájc",
|
||||
"SY": "Szíria",
|
||||
"TW": "Tajvan",
|
||||
"TJ": "Tádzsikisztán",
|
||||
"TZ": "Tanzánia",
|
||||
"TH": "Thaiföld",
|
||||
"TL": "Kelet-Timor",
|
||||
"TG": "Togo",
|
||||
"TK": "Tokelau",
|
||||
"TO": "Tonga",
|
||||
"TT": "Trinidad és Tobago",
|
||||
"TN": "Tunézia",
|
||||
"TR": "Törökország",
|
||||
"TM": "Türkmenisztán",
|
||||
"TC": "Turks- és Caicos-szigetek",
|
||||
"TV": "Tuvalu",
|
||||
"UG": "Uganda",
|
||||
"UA": "Ukrajna",
|
||||
"AE": "Egyesült Arab Emírségek",
|
||||
"GB": "Egyesült Királyság",
|
||||
"US": "Egyesült Államok",
|
||||
"UY": "Uruguay",
|
||||
"UZ": "Üzbegisztán",
|
||||
"VU": "Vanuatu",
|
||||
"VA": "Vatikán",
|
||||
"VE": "Venezuela",
|
||||
"VN": "Vietnám",
|
||||
"VG": "Brit Virgin-szigetek",
|
||||
"VI": "Amerikai Virgin-szigetek",
|
||||
"WF": "Wallis és Futuna",
|
||||
"EH": "Nyugat-Szahara",
|
||||
"YE": "Jemen",
|
||||
"ZM": "Zambia",
|
||||
"ZW": "Zimbabwe",
|
||||
}
|
||||
|
||||
// AllCountries returns all countries sorted by Hungarian name.
|
||||
func AllCountries() []Country {
|
||||
result := make([]Country, 0, len(countries))
|
||||
for code, name := range countries {
|
||||
result = append(result, Country{Code: code, Name: name})
|
||||
}
|
||||
sort.Slice(result, func(i, j int) bool {
|
||||
return result[i].Name < result[j].Name
|
||||
})
|
||||
return result
|
||||
}
|
||||
|
||||
// CountryName returns the Hungarian name for a country code, or the code itself if unknown.
|
||||
func CountryName(code string) string {
|
||||
if name, ok := countries[code]; ok {
|
||||
return name
|
||||
}
|
||||
return code
|
||||
}
|
||||
|
||||
// ValidCountryCode returns true if code is a valid ISO 3166-1 alpha-2 code.
|
||||
func ValidCountryCode(code string) bool {
|
||||
_, ok := countries[code]
|
||||
return ok
|
||||
}
|
||||
Reference in New Issue
Block a user