""" Configuration file for GeoIP Ban Generator """ import os from pathlib import Path # Base paths BASE_DIR = Path(__file__).parent STATIC_DIR = BASE_DIR / 'static' TEMPLATE_DIR = BASE_DIR / 'templates' GEOIP_DB_DIR = BASE_DIR / 'geoip_db' # Flask settings FLASK_HOST = os.getenv('FLASK_HOST', '0.0.0.0') FLASK_PORT = int(os.getenv('FLASK_PORT', 5000)) FLASK_DEBUG = os.getenv('FLASK_DEBUG', 'False').lower() == 'true' SECRET_KEY = os.getenv('SECRET_KEY', 'change-me-in-production') # Application settings APP_NAME = os.getenv('APP_NAME', 'GeoIP Ban Generator') APP_VERSION = '1.0.0' # Logo settings LOGO_URL = os.getenv('LOGO_URL', '') LOGO_LINK = os.getenv('LOGO_LINK', '/') # Footer settings FOOTER_TEXT = os.getenv('FOOTER_TEXT', '© 2026 GeoIP Ban Generator') FOOTER_LINK = os.getenv('FOOTER_LINK', '') FOOTER_LINK_TEXT = os.getenv('FOOTER_LINK_TEXT', 'Documentation') # MaxMind database settings MAXMIND_PRIMARY_URL = os.getenv( 'MAXMIND_PRIMARY_URL', 'https://github.com/P3TERX/GeoLite.mmdb/releases/download/2026.02.07/GeoLite2-Country.mmdb' ) MAXMIND_FALLBACK_URL = os.getenv( 'MAXMIND_FALLBACK_URL', 'https://git.io/GeoLite2-Country.mmdb' ) MAXMIND_UPDATE_INTERVAL_DAYS = int(os.getenv('MAXMIND_UPDATE_INTERVAL_DAYS', 7)) MAXMIND_AUTO_UPDATE = os.getenv('MAXMIND_AUTO_UPDATE', 'True').lower() == 'true' # IP range sources IP_RANGE_SOURCES = { 'github': 'https://raw.githubusercontent.com/herrbischoff/country-ip-blocks/master/ipv4/{country_lower}.cidr', 'ipdeny': 'https://www.ipdeny.com/ipblocks/data/aggregated/{country_lower}-aggregated.zone' } # Cache settings CACHE_ENABLED = os.getenv('CACHE_ENABLED', 'True').lower() == 'true' CACHE_TTL_SECONDS = int(os.getenv('CACHE_TTL_SECONDS', 3600)) # Static file cache busting ENABLE_CACHE_BUSTING = True def get_country_flag(country_code: str) -> str: """ Convert ISO 3166-1 alpha-2 country code to flag emoji. Uses Unicode Regional Indicator Symbols. Example: 'PL' -> '🇵🇱' """ if not country_code or len(country_code) != 2: return '' # Convert to uppercase and get Unicode regional indicators # Regional Indicator Symbol Letter A starts at 0x1F1E6 code = country_code.upper() return chr(0x1F1E6 + ord(code[0]) - ord('A')) + chr(0x1F1E6 + ord(code[1]) - ord('A')) # Available countries (ISO 3166-1 alpha-2) # Focus on high-risk scammer countries and commonly blocked regions COMMON_COUNTRIES = [ # High-risk Asian countries {'code': 'CN', 'name': 'China'}, {'code': 'IN', 'name': 'India'}, {'code': 'PK', 'name': 'Pakistan'}, {'code': 'BD', 'name': 'Bangladesh'}, {'code': 'ID', 'name': 'Indonesia'}, {'code': 'PH', 'name': 'Philippines'}, {'code': 'VN', 'name': 'Vietnam'}, {'code': 'TH', 'name': 'Thailand'}, {'code': 'MY', 'name': 'Malaysia'}, {'code': 'SG', 'name': 'Singapore'}, {'code': 'KH', 'name': 'Cambodia'}, {'code': 'MM', 'name': 'Myanmar'}, {'code': 'LA', 'name': 'Laos'}, {'code': 'NP', 'name': 'Nepal'}, {'code': 'LK', 'name': 'Sri Lanka'}, # Middle East {'code': 'IR', 'name': 'Iran'}, {'code': 'IQ', 'name': 'Iraq'}, {'code': 'SY', 'name': 'Syria'}, {'code': 'YE', 'name': 'Yemen'}, {'code': 'SA', 'name': 'Saudi Arabia'}, {'code': 'AE', 'name': 'United Arab Emirates'}, {'code': 'QA', 'name': 'Qatar'}, {'code': 'KW', 'name': 'Kuwait'}, {'code': 'BH', 'name': 'Bahrain'}, {'code': 'OM', 'name': 'Oman'}, {'code': 'JO', 'name': 'Jordan'}, {'code': 'LB', 'name': 'Lebanon'}, # Africa - West {'code': 'NG', 'name': 'Nigeria'}, {'code': 'GH', 'name': 'Ghana'}, {'code': 'CI', 'name': 'Ivory Coast'}, {'code': 'SN', 'name': 'Senegal'}, {'code': 'BJ', 'name': 'Benin'}, {'code': 'TG', 'name': 'Togo'}, {'code': 'ML', 'name': 'Mali'}, {'code': 'BF', 'name': 'Burkina Faso'}, {'code': 'NE', 'name': 'Niger'}, {'code': 'LR', 'name': 'Liberia'}, {'code': 'SL', 'name': 'Sierra Leone'}, # Africa - East {'code': 'KE', 'name': 'Kenya'}, {'code': 'ET', 'name': 'Ethiopia'}, {'code': 'TZ', 'name': 'Tanzania'}, {'code': 'UG', 'name': 'Uganda'}, {'code': 'SO', 'name': 'Somalia'}, {'code': 'SD', 'name': 'Sudan'}, {'code': 'SS', 'name': 'South Sudan'}, {'code': 'ER', 'name': 'Eritrea'}, {'code': 'DJ', 'name': 'Djibouti'}, # Africa - South {'code': 'ZA', 'name': 'South Africa'}, {'code': 'ZW', 'name': 'Zimbabwe'}, {'code': 'MZ', 'name': 'Mozambique'}, {'code': 'AO', 'name': 'Angola'}, {'code': 'ZM', 'name': 'Zambia'}, {'code': 'MW', 'name': 'Malawi'}, {'code': 'BW', 'name': 'Botswana'}, # Africa - Central {'code': 'CM', 'name': 'Cameroon'}, {'code': 'CD', 'name': 'DR Congo'}, {'code': 'CG', 'name': 'Congo'}, {'code': 'CF', 'name': 'Central African Republic'}, {'code': 'TD', 'name': 'Chad'}, {'code': 'GA', 'name': 'Gabon'}, # Africa - North {'code': 'EG', 'name': 'Egypt'}, {'code': 'DZ', 'name': 'Algeria'}, {'code': 'MA', 'name': 'Morocco'}, {'code': 'TN', 'name': 'Tunisia'}, {'code': 'LY', 'name': 'Libya'}, # Eastern Europe {'code': 'RU', 'name': 'Russia'}, {'code': 'UA', 'name': 'Ukraine'}, {'code': 'BY', 'name': 'Belarus'}, {'code': 'MD', 'name': 'Moldova'}, {'code': 'GE', 'name': 'Georgia'}, {'code': 'AM', 'name': 'Armenia'}, {'code': 'AZ', 'name': 'Azerbaijan'}, {'code': 'KZ', 'name': 'Kazakhstan'}, {'code': 'UZ', 'name': 'Uzbekistan'}, {'code': 'TM', 'name': 'Turkmenistan'}, {'code': 'KG', 'name': 'Kyrgyzstan'}, {'code': 'TJ', 'name': 'Tajikistan'}, # Balkans {'code': 'RO', 'name': 'Romania'}, {'code': 'BG', 'name': 'Bulgaria'}, {'code': 'AL', 'name': 'Albania'}, {'code': 'RS', 'name': 'Serbia'}, {'code': 'BA', 'name': 'Bosnia and Herzegovina'}, {'code': 'MK', 'name': 'North Macedonia'}, {'code': 'XK', 'name': 'Kosovo'}, {'code': 'ME', 'name': 'Montenegro'}, # Latin America {'code': 'BR', 'name': 'Brazil'}, {'code': 'MX', 'name': 'Mexico'}, {'code': 'CO', 'name': 'Colombia'}, {'code': 'VE', 'name': 'Venezuela'}, {'code': 'AR', 'name': 'Argentina'}, {'code': 'PE', 'name': 'Peru'}, {'code': 'CL', 'name': 'Chile'}, {'code': 'EC', 'name': 'Ecuador'}, {'code': 'BO', 'name': 'Bolivia'}, {'code': 'PY', 'name': 'Paraguay'}, # Caribbean {'code': 'CU', 'name': 'Cuba'}, {'code': 'HT', 'name': 'Haiti'}, {'code': 'DO', 'name': 'Dominican Republic'}, {'code': 'JM', 'name': 'Jamaica'}, {'code': 'TT', 'name': 'Trinidad and Tobago'}, # Other high-risk {'code': 'KP', 'name': 'North Korea'}, {'code': 'AF', 'name': 'Afghanistan'}, {'code': 'TR', 'name': 'Turkey'}, # Western countries (for reference/testing) {'code': 'US', 'name': 'United States'}, {'code': 'GB', 'name': 'United Kingdom'}, {'code': 'DE', 'name': 'Germany'}, {'code': 'FR', 'name': 'France'}, {'code': 'IT', 'name': 'Italy'}, {'code': 'ES', 'name': 'Spain'}, {'code': 'PL', 'name': 'Poland'}, {'code': 'NL', 'name': 'Netherlands'}, {'code': 'BE', 'name': 'Belgium'}, {'code': 'SE', 'name': 'Sweden'}, {'code': 'NO', 'name': 'Norway'}, {'code': 'DK', 'name': 'Denmark'}, {'code': 'FI', 'name': 'Finland'}, {'code': 'CH', 'name': 'Switzerland'}, {'code': 'AT', 'name': 'Austria'}, {'code': 'CA', 'name': 'Canada'}, {'code': 'AU', 'name': 'Australia'}, {'code': 'NZ', 'name': 'New Zealand'}, {'code': 'JP', 'name': 'Japan'}, {'code': 'KR', 'name': 'South Korea'}, ] # Sort countries by name COMMON_COUNTRIES = sorted(COMMON_COUNTRIES, key=lambda x: x['name']) # Add flags dynamically to countries for country in COMMON_COUNTRIES: country['flag'] = get_country_flag(country['code']) PRECACHE_APP_TYPES = [ 'nginx_geo', 'nginx_deny', 'apache_24', 'haproxy_acl', 'raw-cidr_txt', ] PRECACHE_AGGREGATE_VARIANTS = [True] # Redis Configuration REDIS_HOST = os.getenv('REDIS_HOST', 'localhost') REDIS_PORT = int(os.getenv('REDIS_PORT', '6379')) REDIS_DB = int(os.getenv('REDIS_DB', '0')) REDIS_PASSWORD = os.getenv('REDIS_PASSWORD', None) REDIS_CACHE_TTL = int(os.getenv('REDIS_CACHE_TTL', '86400')) # 24h default REDIS_ENABLED = os.getenv('REDIS_ENABLED', 'true').lower() == 'true' CACHE_MAX_AGE_HOURS = 168 # 7 dni (7 * 24h)