diff --git a/editor/server/.gitignore b/editor/server/.gitignore new file mode 100644 index 0000000..8155a7e --- /dev/null +++ b/editor/server/.gitignore @@ -0,0 +1 @@ +cf-colos.json \ No newline at end of file diff --git a/editor/server/__init__.py b/editor/server/__init__.py index 441de34..397a956 100644 --- a/editor/server/__init__.py +++ b/editor/server/__init__.py @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MIT +import json import os import secrets import string @@ -52,6 +53,7 @@ def create_app(test_config=None) -> Flask: url_prefix = os.getenv('URL_PREFIX', '') + from . import utils from . import models from . import examples from . import editor @@ -86,19 +88,5 @@ def create_app(test_config=None) -> Flask: return app -def get_common_cf_template_params(): - # Get real Ray ID from Cloudflare header - ray_id = request.headers.get('Cf-Ray') - if ray_id: - ray_id = ray_id[:16] - # Get real client ip from Cloudflare header or request.remote_addr - client_ip = request.headers.get('X-Forwarded-For') - if not client_ip: - client_ip = request.remote_addr - return { - 'ray_id': ray_id, - 'client_ip': client_ip, - } - __all__ = ['create_app', 'db', 'get_common_cf_template_params', 'render_cf_error_page'] diff --git a/editor/server/cf-colos.bundled.json b/editor/server/cf-colos.bundled.json new file mode 100644 index 0000000..cab5653 --- /dev/null +++ b/editor/server/cf-colos.bundled.json @@ -0,0 +1,2883 @@ +{ + "AAE": { + "cca2": "DZ", + "city": "Annaba", + "country": "Algeria", + "lat": 36.85596, + "lon": 7.79207, + "name": "Annaba, Algeria", + "region": "Africa" + }, + "ABJ": { + "cca2": "CI", + "city": "Abidjan", + "country": "Ivory Coast", + "lat": 5.292598, + "lon": -3.999133, + "name": "Abidjan, Ivory Coast", + "region": "Africa" + }, + "ABQ": { + "cca2": "US", + "city": "Albuquerque", + "country": "United States", + "lat": 35.0844, + "lon": -106.6504, + "name": "Albuquerque, United States", + "region": "North America" + }, + "ACC": { + "cca2": "GH", + "city": "Accra", + "country": "Ghana", + "lat": 5.614818, + "lon": -0.205874, + "name": "Accra, Ghana", + "region": "Africa" + }, + "ADB": { + "cca2": "TR", + "city": "Izmir", + "country": "Turkey", + "lat": 38.32377, + "lon": 27.14317, + "name": "Izmir, Turkey", + "region": "Europe" + }, + "ADD": { + "cca2": "ET", + "city": "Addis Ababa", + "country": "Ethiopia", + "lat": 9.00005, + "lon": 38.78446, + "name": "Addis Ababa, Ethiopia", + "region": "Africa" + }, + "ADL": { + "cca2": "AU", + "city": "Adelaide", + "country": "Australia", + "lat": -34.9431729, + "lon": 138.5335637, + "name": "Adelaide, SA, Australia", + "region": "Oceania" + }, + "AKL": { + "cca2": "NZ", + "city": "Auckland", + "country": "New Zealand", + "lat": -37.0080986023, + "lon": 174.792007446, + "name": "Auckland, New Zealand", + "region": "Oceania" + }, + "AKX": { + "cca2": "KZ", + "city": "Aktobe", + "country": "Kazakhstan", + "lat": 50.286922, + "lon": 57.224121, + "name": "Aktobe, Kazakhstan", + "region": "Asia Pacific" + }, + "ALA": { + "cca2": "KZ", + "city": "Almaty", + "country": "Kazakhstan", + "lat": 43.3521003723, + "lon": 77.0404968262, + "name": "Almaty, Kazakhstan", + "region": "Asia Pacific" + }, + "ALG": { + "cca2": "DZ", + "city": "Algiers", + "country": "Algeria", + "lat": 36.6910018921, + "lon": 3.2154099941, + "name": "Algiers, Algeria", + "region": "Africa" + }, + "AMD": { + "cca2": "IN", + "city": "Ahmedabad", + "country": "India", + "lat": 23.0225, + "lon": 72.5714, + "name": "Ahmedabad, India", + "region": "Asia Pacific" + }, + "AMM": { + "cca2": "JO", + "city": "Amman", + "country": "Jordan", + "lat": 31.7226009369, + "lon": 35.9931983948, + "name": "Amman, Jordan", + "region": "Middle East" + }, + "AMS": { + "cca2": "NL", + "city": "Amsterdam", + "country": "Netherlands", + "lat": 52.3086013794, + "lon": 4.7638897896, + "name": "Amsterdam, Netherlands", + "region": "Europe" + }, + "ANC": { + "cca2": "US", + "city": "Anchorage", + "country": "United States", + "lat": 61.158555, + "lon": -149.890208, + "name": "Anchorage, United States", + "region": "North America" + }, + "ARI": { + "cca2": "CL", + "city": "Arica", + "country": "Chile", + "lat": -18.348611, + "lon": -70.338889, + "name": "Arica, Chile", + "region": "South America" + }, + "ARN": { + "cca2": "SE", + "city": "Stockholm", + "country": "Sweden", + "lat": 59.6519012451, + "lon": 17.9186000824, + "name": "Stockholm, Sweden", + "region": "Europe" + }, + "ARU": { + "cca2": "BR", + "city": "Aracatuba", + "country": "Brazil", + "lat": -21.1413002014, + "lon": -50.4247016907, + "name": "Aracatuba, Brazil", + "region": "South America" + }, + "ASK": { + "cca2": "CI", + "city": "Yamoussoukro", + "country": "Ivory Coast", + "lat": 6.842178, + "lon": -5.259932, + "name": "Yamoussoukro, Ivory Coast", + "region": "Africa" + }, + "ASU": { + "cca2": "PY", + "city": "Asunción", + "country": "Paraguay", + "lat": -25.2399997711, + "lon": -57.5200004578, + "name": "Asunción, Paraguay", + "region": "South America" + }, + "ATH": { + "cca2": "GR", + "city": "Athens", + "country": "Greece", + "lat": 37.9364013672, + "lon": 23.9444999695, + "name": "Athens, Greece", + "region": "Europe" + }, + "ATL": { + "cca2": "US", + "city": "Atlanta", + "country": "United States", + "lat": 33.6366996765, + "lon": -84.4281005859, + "name": "Atlanta, GA, United States", + "region": "North America" + }, + "AUS": { + "cca2": "US", + "city": "Austin", + "country": "United States", + "lat": 30.1975, + "lon": -97.6664, + "name": "Austin, United States", + "region": "North America" + }, + "BAH": { + "cca2": "BH", + "city": "Manama", + "country": "Bahrain", + "lat": 26.2707996368, + "lon": 50.6335983276, + "name": "Manama, Bahrain", + "region": "Middle East" + }, + "BAQ": { + "cca2": "CO", + "city": "Barranquilla", + "country": "Colombia", + "lat": 10.8896, + "lon": -74.7808, + "name": "Barranquilla, Colombia", + "region": "South America" + }, + "BCN": { + "cca2": "ES", + "city": "Barcelona", + "country": "Spain", + "lat": 41.2971000671, + "lon": 2.0784599781, + "name": "Barcelona, Spain", + "region": "Europe" + }, + "BEG": { + "cca2": "RS", + "city": "Belgrade", + "country": "Serbia", + "lat": 44.8184013367, + "lon": 20.3090991974, + "name": "Belgrade, Serbia", + "region": "Europe" + }, + "BEL": { + "cca2": "BR", + "city": "Belém", + "country": "Brazil", + "lat": -1.4563, + "lon": -48.5013, + "name": "Belém, Brazil", + "region": "South America" + }, + "BEY": { + "cca2": "LB", + "city": "Beirut", + "country": "Lebanon", + "lat": 33.8208999634, + "lon": 35.4883995056, + "name": "Beirut, Lebanon", + "region": "Middle East" + }, + "BGI": { + "cca2": "BB", + "city": "Bridgetown", + "country": "Barbados", + "lat": 13.103562, + "lon": -59.603226, + "name": "Bridgetown, Barbados", + "region": "North America" + }, + "BGR": { + "cca2": "US", + "city": "Bangor", + "country": "United States", + "lat": 44.8081, + "lon": -68.795, + "name": "Bangor, United States", + "region": "North America" + }, + "BGW": { + "cca2": "IQ", + "city": "Baghdad", + "country": "Iraq", + "lat": 33.2625007629, + "lon": 44.2346000671, + "name": "Baghdad, Iraq", + "region": "Middle East" + }, + "BHY": { + "cca2": "CN", + "city": "Beihai", + "country": "China", + "name": "Beihai, China", + "region": "Asia" + }, + "BKK": { + "cca2": "TH", + "city": "Bangkok", + "country": "Thailand", + "lat": 13.6810998917, + "lon": 100.747001648, + "name": "Bangkok, Thailand", + "region": "Asia Pacific" + }, + "BLR": { + "cca2": "IN", + "city": "Bangalore", + "country": "India", + "lat": 13.7835719, + "lon": 76.6165937, + "name": "Bangalore, India", + "region": "Asia Pacific" + }, + "BNA": { + "cca2": "US", + "city": "Nashville", + "country": "United States", + "lat": 36.1245002747, + "lon": -86.6781997681, + "name": "Nashville, United States", + "region": "North America" + }, + "BNE": { + "cca2": "AU", + "city": "Brisbane", + "country": "Australia", + "lat": -27.3841991425, + "lon": 153.117004394, + "name": "Brisbane, QLD, Australia", + "region": "Oceania" + }, + "BNU": { + "cca2": "BR", + "city": "Blumenau", + "country": "Brazil", + "lat": -26.89245, + "lon": -49.07696, + "name": "Blumenau, Brazil", + "region": "South America" + }, + "BOD": { + "cca2": "FR", + "city": "Bordeaux", + "country": "France", + "lat": 44.82946, + "lon": -0.58355, + "name": "Bordeaux, France", + "region": "Europe" + }, + "BOG": { + "cca2": "CO", + "city": "Bogota", + "country": "Colombia", + "lat": 4.70159, + "lon": -74.1469, + "name": "Bogota, Colombia", + "region": "South America" + }, + "BOM": { + "cca2": "IN", + "city": "Mumbai", + "country": "India", + "lat": 19.0886993408, + "lon": 72.8678970337, + "name": "Mumbai, India", + "region": "Asia Pacific" + }, + "BOS": { + "cca2": "US", + "city": "Boston", + "country": "United States", + "lat": 42.36429977, + "lon": -71.00520325, + "name": "Boston, MA, United States", + "region": "North America" + }, + "BRU": { + "cca2": "BE", + "city": "Brussels", + "country": "Belgium", + "lat": 50.9014015198, + "lon": 4.4844398499, + "name": "Brussels, Belgium", + "region": "Europe" + }, + "BSB": { + "cca2": "BR", + "city": "Brasilia", + "country": "Brazil", + "lat": -15.79824, + "lon": -47.90859, + "name": "Brasilia, Brazil", + "region": "South America" + }, + "BSR": { + "cca2": "IQ", + "city": "Basra", + "country": "Iraq", + "lat": 30.5491008759, + "lon": 47.6621017456, + "name": "Basra, Iraq", + "region": "Middle East" + }, + "BTS": { + "cca2": "SK", + "city": "Bratislava", + "country": "Slovakia", + "lat": 48.1486, + "lon": 17.1077, + "name": "Bratislava, Slovakia", + "region": "Europe" + }, + "BUD": { + "cca2": "HU", + "city": "Budapest", + "country": "Hungary", + "lat": 47.4369010925, + "lon": 19.2555999756, + "name": "Budapest, Hungary", + "region": "Europe" + }, + "BUF": { + "cca2": "US", + "city": "Buffalo", + "country": "United States", + "lat": 42.94049835, + "lon": -78.73220062, + "name": "Buffalo, NY, United States", + "region": "North America" + }, + "BWN": { + "cca2": "BN", + "city": "Bandar Seri Begawan", + "country": "Brunei", + "lat": 4.903052, + "lon": 114.939819, + "name": "Bandar Seri Begawan, Brunei", + "region": "Asia Pacific" + }, + "CAI": { + "cca2": "EG", + "city": "Cairo", + "country": "Egypt", + "lat": 30.1219005585, + "lon": 31.4055995941, + "name": "Cairo, Egypt", + "region": "Africa" + }, + "CAN": { + "cca2": "CN", + "city": "Guangzhou", + "country": "China", + "name": "Guangzhou, China", + "region": "Asia" + }, + "CAW": { + "cca2": "BR", + "city": "Campos dos Goytacazes", + "country": "Brazil", + "lat": -21.698299408, + "lon": -41.301700592, + "name": "Campos dos Goytacazes, Brazil", + "region": "South America" + }, + "CBR": { + "cca2": "AU", + "city": "Canberra", + "country": "Australia", + "lat": -35.3069000244, + "lon": 149.1950073242, + "name": "Canberra, ACT, Australia", + "region": "Oceania" + }, + "CCP": { + "cca2": "CL", + "city": "Concepción", + "country": "Chile", + "lat": -36.8201, + "lon": -73.0444, + "name": "Concepción, Chile", + "region": "South America" + }, + "CCU": { + "cca2": "IN", + "city": "Kolkata", + "country": "India", + "lat": 22.6476933, + "lon": 88.4349249, + "name": "Kolkata, India", + "region": "Asia Pacific" + }, + "CDG": { + "cca2": "FR", + "city": "Paris", + "country": "France", + "lat": 49.0127983093, + "lon": 2.5499999523, + "name": "Paris, France", + "region": "Europe" + }, + "CEB": { + "cca2": "PH", + "city": "Cebu", + "country": "Philippines", + "lat": 10.3074998856, + "lon": 123.978996277, + "name": "Cebu, Philippines", + "region": "Asia Pacific" + }, + "CFC": { + "cca2": "BR", + "city": "Cacador", + "country": "Brazil", + "lat": -26.7762, + "lon": -51.0125, + "name": "Cacador, Brazil", + "region": "South America" + }, + "CGB": { + "cca2": "BR", + "city": "Cuiaba", + "country": "Brazil", + "lat": -15.59611, + "lon": -56.09667, + "name": "Cuiaba, Brazil", + "region": "South America" + }, + "CGD": { + "cca2": "CN", + "city": "Changde", + "country": "China", + "name": "Changde, China", + "region": "Asia" + }, + "CGK": { + "cca2": "ID", + "city": "Jakarta", + "country": "Indonesia", + "lat": -6.1275229, + "lon": 106.6515118, + "name": "Jakarta, Indonesia", + "region": "Asia Pacific" + }, + "CGO": { + "cca2": "CN", + "city": "Zhengzhou", + "country": "China", + "name": "Zhengzhou, China", + "region": "Asia" + }, + "CGP": { + "cca2": "BD", + "city": "Chittagong", + "country": "Bangladesh", + "lat": 22.2495995, + "lon": 91.8133011, + "name": "Chittagong, Bangladesh", + "region": "Asia Pacific" + }, + "CGY": { + "cca2": "PH", + "city": "Cagayan de Oro", + "country": "Philippines", + "lat": 8.4156198502, + "lon": 124.611000061, + "name": "Cagayan de Oro, Philippines", + "region": "Asia Pacific" + }, + "CHC": { + "cca2": "NZ", + "city": "Christchurch", + "country": "New Zealand", + "lat": -43.4893989563, + "lon": 172.5319976807, + "name": "Christchurch, New Zealand", + "region": "Oceania" + }, + "CKG": { + "cca2": "CN", + "city": "Chongqing", + "country": "China", + "name": "Chongqing, China", + "region": "Asia" + }, + "CLE": { + "cca2": "US", + "city": "Cleveland", + "country": "United States", + "lat": 41.50069, + "lon": -81.68412, + "name": "Cleveland, United States", + "region": "North America" + }, + "CLO": { + "cca2": "CO", + "city": "Cali", + "country": "Colombia", + "lat": 3.54322, + "lon": -76.3816, + "name": "Cali, Colombia", + "region": "South America" + }, + "CLT": { + "cca2": "US", + "city": "Charlotte", + "country": "United States", + "lat": 35.2140007019, + "lon": -80.9430999756, + "name": "Charlotte, NC, United States", + "region": "North America" + }, + "CMB": { + "cca2": "LK", + "city": "Colombo", + "country": "Sri Lanka", + "lat": 7.1807599068, + "lon": 79.8841018677, + "name": "Colombo, Sri Lanka", + "region": "Asia Pacific" + }, + "CMH": { + "cca2": "US", + "city": "Columbus", + "country": "United States", + "lat": 39.9980010986, + "lon": -82.8918991089, + "name": "Columbus, OH, United States", + "region": "North America" + }, + "CNF": { + "cca2": "BR", + "city": "Belo Horizonte", + "country": "Brazil", + "lat": -19.624444, + "lon": -43.971944, + "name": "Belo Horizonte, Brazil", + "region": "South America" + }, + "CNN": { + "cca2": "IN", + "city": "Kannur", + "country": "India", + "lat": 11.915858, + "lon": 75.55094, + "name": "Kannur, India", + "region": "Asia Pacific" + }, + "CNX": { + "cca2": "TH", + "city": "Chiang Mai", + "country": "Thailand", + "lat": 18.7667999268, + "lon": 98.962600708, + "name": "Chiang Mai, Thailand", + "region": "Asia Pacific" + }, + "COK": { + "cca2": "IN", + "city": "Kochi", + "country": "India", + "lat": 9.9312, + "lon": 76.2673, + "name": "Kochi, India", + "region": "Asia Pacific" + }, + "COR": { + "cca2": "AR", + "city": "Córdoba", + "country": "Argentina", + "lat": -31.31, + "lon": -64.208333, + "name": "Córdoba, Argentina", + "region": "South America" + }, + "CPH": { + "cca2": "DK", + "city": "Copenhagen", + "country": "Denmark", + "lat": 55.6179008484, + "lon": 12.6560001373, + "name": "Copenhagen, Denmark", + "region": "Europe" + }, + "CPT": { + "cca2": "ZA", + "city": "Cape Town", + "country": "South Africa", + "lat": -33.9648017883, + "lon": 18.6016998291, + "name": "Cape Town, South Africa", + "region": "Africa" + }, + "CRK": { + "cca2": "PH", + "city": "Tarlac City", + "country": "Philippines", + "lat": 15.1859, + "lon": 120.5599, + "name": "Tarlac City, Philippines", + "region": "Asia Pacific" + }, + "CSX": { + "cca2": "CN", + "city": "Changsha", + "country": "China", + "name": "Changsha, China", + "region": "Asia" + }, + "CWB": { + "cca2": "BR", + "city": "Curitiba", + "country": "Brazil", + "lat": -25.5284996033, + "lon": -49.1758003235, + "name": "Curitiba, Brazil", + "region": "South America" + }, + "CZL": { + "cca2": "DZ", + "city": "Constantine", + "country": "Algeria", + "lat": 36.335972, + "lon": 6.598562, + "name": "Constantine, Algeria", + "region": "Africa" + }, + "CZX": { + "cca2": "CN", + "city": "Changzhou", + "country": "China", + "name": "Changzhou, China", + "region": "Asia" + }, + "DAC": { + "cca2": "BD", + "city": "Dhaka", + "country": "Bangladesh", + "lat": 23.843347, + "lon": 90.397783, + "name": "Dhaka, Bangladesh", + "region": "Asia Pacific" + }, + "DAD": { + "cca2": "VN", + "city": "Da Nang", + "country": "Vietnam", + "lat": 16.02636, + "lon": 108.20869, + "name": "Da Nang, Vietnam", + "region": "Asia Pacific" + }, + "DAR": { + "cca2": "TZ", + "city": "Dar es Salaam", + "country": "Tanzania", + "lat": -6.8781099319, + "lon": 39.2025985718, + "name": "Dar es Salaam, Tanzania", + "region": "Africa" + }, + "DEL": { + "cca2": "IN", + "city": "New Delhi", + "country": "India", + "lat": 28.5664997101, + "lon": 77.1031036377, + "name": "New Delhi, India", + "region": "Asia Pacific" + }, + "DEN": { + "cca2": "US", + "city": "Denver", + "country": "United States", + "lat": 39.8616981506, + "lon": -104.672996521, + "name": "Denver, CO, United States", + "region": "North America" + }, + "DFW": { + "cca2": "US", + "city": "Dallas", + "country": "United States", + "lat": 32.8968009949, + "lon": -97.0380020142, + "name": "Dallas, TX, United States", + "region": "North America" + }, + "DKR": { + "cca2": "SN", + "city": "Dakar", + "country": "Senegal", + "lat": 14.7412099, + "lon": -17.4889771, + "name": "Dakar, Senegal", + "region": "Africa" + }, + "DLC": { + "cca2": "CN", + "city": "Dalian", + "country": "China", + "name": "Dalian, China", + "region": "Asia" + }, + "DME": { + "cca2": "RU", + "city": "Moscow", + "country": "Russia", + "lat": 55.4087982178, + "lon": 37.9062995911, + "name": "Moscow, Russia", + "region": "Europe" + }, + "DMM": { + "cca2": "SA", + "city": "Dammam", + "country": "Saudi Arabia", + "lat": 26.471200943, + "lon": 49.7979011536, + "name": "Dammam, Saudi Arabia", + "region": "Middle East" + }, + "DOH": { + "cca2": "QA", + "city": "Doha", + "country": "Qatar", + "lat": 25.2605946, + "lon": 51.6137665, + "name": "Doha, Qatar", + "region": "Middle East" + }, + "DPS": { + "cca2": "ID", + "city": "Denpasar", + "country": "Indonesia", + "lat": -8.748169899, + "lon": 115.1669998169, + "name": "Denpasar, Indonesia", + "region": "Asia Pacific" + }, + "DTW": { + "cca2": "US", + "city": "Detroit", + "country": "United States", + "lat": 42.2123985291, + "lon": -83.3534011841, + "name": "Detroit, MI, United States", + "region": "North America" + }, + "DUB": { + "cca2": "IE", + "city": "Dublin", + "country": "Ireland", + "lat": 53.4212989807, + "lon": -6.270070076, + "name": "Dublin, Ireland", + "region": "Europe" + }, + "DUR": { + "cca2": "ZA", + "city": "Durban", + "country": "South Africa", + "lat": -29.6144444444, + "lon": 31.1197222222, + "name": "Durban, South Africa", + "region": "Africa" + }, + "DUS": { + "cca2": "DE", + "city": "Düsseldorf", + "country": "Germany", + "lat": 51.2895011902, + "lon": 6.7667798996, + "name": "Düsseldorf, Germany", + "region": "Europe" + }, + "DXB": { + "cca2": "AE", + "city": "Dubai", + "country": "United Arab Emirates", + "lat": 25.2527999878, + "lon": 55.3643989563, + "name": "Dubai, United Arab Emirates", + "region": "Middle East" + }, + "EBB": { + "cca2": "UG", + "city": "Kampala", + "country": "Uganda", + "lat": 0.3152, + "lon": 32.5816, + "name": "Kampala, Uganda", + "region": "Africa" + }, + "EBL": { + "cca2": "IQ", + "city": "Erbil", + "country": "Iraq", + "lat": 36.1901, + "lon": 43.993, + "name": "Erbil, Iraq", + "region": "Middle East" + }, + "EVN": { + "cca2": "AM", + "city": "Yerevan", + "country": "Armenia", + "lat": 40.1473007202, + "lon": 44.3959007263, + "name": "Yerevan, Armenia", + "region": "Middle East" + }, + "EWR": { + "cca2": "US", + "city": "Newark", + "country": "United States", + "lat": 40.6925010681, + "lon": -74.1687011719, + "name": "Newark, NJ, United States", + "region": "North America" + }, + "EZE": { + "cca2": "AR", + "city": "Buenos Aires", + "country": "Argentina", + "lat": -34.8222, + "lon": -58.5358, + "name": "Buenos Aires, Argentina", + "region": "South America" + }, + "FCO": { + "cca2": "IT", + "city": "Rome", + "country": "Italy", + "lat": 41.8045005798, + "lon": 12.2508001328, + "name": "Rome, Italy", + "region": "Europe" + }, + "FIH": { + "cca2": "CD", + "city": "Kinshasa", + "country": "DR Congo", + "lat": -4.3857498169, + "lon": 15.4446001053, + "name": "Kinshasa, DR Congo", + "region": "Africa" + }, + "FLN": { + "cca2": "BR", + "city": "Florianopolis", + "country": "Brazil", + "lat": -27.6702785492, + "lon": -48.5525016785, + "name": "Florianopolis, Brazil", + "region": "South America" + }, + "FOC": { + "cca2": "CN", + "city": "Fuzhou", + "country": "China", + "name": "Fuzhou, China", + "region": "Asia" + }, + "FOR": { + "cca2": "BR", + "city": "Fortaleza", + "country": "Brazil", + "lat": -3.7762799263, + "lon": -38.5326004028, + "name": "Fortaleza, Brazil", + "region": "South America" + }, + "FRA": { + "cca2": "DE", + "city": "Frankfurt", + "country": "Germany", + "lat": 50.0264015198, + "lon": 8.543129921, + "name": "Frankfurt, Germany", + "region": "Europe" + }, + "FRU": { + "cca2": "KG", + "city": "Bishkek", + "country": "Kyrgyzstan", + "lat": 42.875608, + "lon": 74.604613, + "name": "Bishkek, Kyrgyzstan", + "region": "Asia Pacific" + }, + "FSD": { + "cca2": "US", + "city": "Sioux Falls", + "country": "United States", + "lat": 43.540819819502, + "lon": -96.65511577730963, + "name": "Sioux Falls, SD, United States", + "region": "North America" + }, + "FUK": { + "cca2": "JP", + "city": "Fukuoka", + "country": "Japan", + "lat": 33.5902, + "lon": 130.4017, + "name": "Fukuoka, Japan", + "region": "Asia Pacific" + }, + "FUO": { + "cca2": "CN", + "city": "Foshan", + "country": "China", + "name": "Foshan, China", + "region": "Asia" + }, + "GBE": { + "cca2": "BW", + "city": "Gaborone", + "country": "Botswana", + "lat": -24.6282, + "lon": 25.9231, + "name": "Gaborone, Botswana", + "region": "Africa" + }, + "GDL": { + "cca2": "MX", + "city": "Guadalajara", + "country": "Mexico", + "lat": 20.5217990875, + "lon": -103.3109970093, + "name": "Guadalajara, Mexico", + "region": "North America" + }, + "GEO": { + "cca2": "GY", + "city": "Georgetown", + "country": "Guyana", + "lat": 6.825648, + "lon": -58.163756, + "name": "Georgetown, Guyana", + "region": "South America" + }, + "GIG": { + "cca2": "BR", + "city": "Rio de Janeiro", + "country": "Brazil", + "lat": -22.8099994659, + "lon": -43.2505569458, + "name": "Rio de Janeiro, Brazil", + "region": "South America" + }, + "GND": { + "cca2": "GD", + "city": "St. George's", + "country": "Grenada", + "lat": 12.007116, + "lon": -61.7882288, + "name": "St. George's, Grenada", + "region": "South America" + }, + "GOT": { + "cca2": "SE", + "city": "Gothenburg", + "country": "Sweden", + "lat": 57.6627998352, + "lon": 12.279800415, + "name": "Gothenburg, Sweden", + "region": "Europe" + }, + "GRU": { + "cca2": "BR", + "city": "São Paulo", + "country": "Brazil", + "lat": -23.4355564117, + "lon": -46.4730567932, + "name": "São Paulo, Brazil", + "region": "South America" + }, + "GUA": { + "cca2": "GT", + "city": "Guatemala City", + "country": "Guatemala", + "lat": 14.5832996368, + "lon": -90.5274963379, + "name": "Guatemala City, Guatemala", + "region": "North America" + }, + "GUM": { + "cca2": "GU", + "city": "Hagatna", + "country": "Guam", + "lat": 13.4834003448, + "lon": 144.796005249, + "name": "Hagatna, Guam", + "region": "Asia Pacific" + }, + "GVA": { + "cca2": "CH", + "city": "Geneva", + "country": "Switzerland", + "lat": 46.2380981445, + "lon": 6.1089501381, + "name": "Geneva, Switzerland", + "region": "Europe" + }, + "GYD": { + "cca2": "AZ", + "city": "Baku", + "country": "Azerbaijan", + "lat": 40.4674987793, + "lon": 50.0466995239, + "name": "Baku, Azerbaijan", + "region": "Middle East" + }, + "GYE": { + "cca2": "EC", + "city": "Guayaquil", + "country": "Ecuador", + "lat": -2.1894, + "lon": -79.8891, + "name": "Guayaquil, Ecuador", + "region": "South America" + }, + "GYN": { + "cca2": "BR", + "city": "Goiania", + "country": "Brazil", + "lat": -16.69727, + "lon": -49.26851, + "name": "Goiania, Brazil", + "region": "South America" + }, + "HAK": { + "cca2": "CN", + "city": "Chengmai", + "country": "China", + "name": "Chengmai, China", + "region": "Asia" + }, + "HAM": { + "cca2": "DE", + "city": "Hamburg", + "country": "Germany", + "lat": 53.6304016113, + "lon": 9.9882297516, + "name": "Hamburg, Germany", + "region": "Europe" + }, + "HAN": { + "cca2": "VN", + "city": "Hanoi", + "country": "Vietnam", + "lat": 21.221200943, + "lon": 105.806999206, + "name": "Hanoi, Vietnam", + "region": "Asia Pacific" + }, + "HBA": { + "cca2": "AU", + "city": "Hobart", + "country": "Australia", + "lat": -42.883209, + "lon": 147.331665, + "name": "Hobart, Australia", + "region": "Oceania" + }, + "HEL": { + "cca2": "FI", + "city": "Helsinki", + "country": "Finland", + "lat": 60.317199707, + "lon": 24.963300705, + "name": "Helsinki, Finland", + "region": "Europe" + }, + "HFA": { + "cca2": "IL", + "city": "Haifa", + "country": "Israel", + "lat": 32.78492, + "lon": 34.96069, + "name": "Haifa, Israel", + "region": "Middle East" + }, + "HGH": { + "cca2": "CN", + "city": "Shaoxing", + "country": "China", + "name": "Shaoxing, China", + "region": "Asia" + }, + "HKG": { + "cca2": "HK", + "city": "Hong Kong", + "lat": 22.3089008331, + "lon": 113.915000916, + "name": "Hong Kong", + "region": "Asia Pacific" + }, + "HNL": { + "cca2": "US", + "city": "Honolulu", + "country": "United States", + "lat": 21.3187007904, + "lon": -157.9219970703, + "name": "Honolulu, HI, United States", + "region": "North America" + }, + "HRE": { + "cca2": "ZW", + "city": "Harare", + "country": "Zimbabwe", + "lat": -17.9318008423, + "lon": 31.0928001404, + "name": "Harare, Zimbabwe", + "region": "Africa" + }, + "HYD": { + "cca2": "IN", + "city": "Hyderabad", + "country": "India", + "lat": 17.2313175201, + "lon": 78.4298553467, + "name": "Hyderabad, India", + "region": "Asia Pacific" + }, + "HYN": { + "cca2": "CN", + "city": "Taizhou", + "country": "China", + "name": "Taizhou, China", + "region": "Asia" + }, + "IAD": { + "cca2": "US", + "city": "Ashburn", + "country": "United States", + "lat": 38.94449997, + "lon": -77.45580292, + "name": "Ashburn, VA, United States", + "region": "North America" + }, + "IAH": { + "cca2": "US", + "city": "Houston", + "country": "United States", + "lat": 29.9843997955, + "lon": -95.3414001465, + "name": "Houston, TX, United States", + "region": "North America" + }, + "ICN": { + "cca2": "KR", + "city": "Seoul", + "country": "South Korea", + "lat": 37.4691009521, + "lon": 126.450996399, + "name": "Seoul, South Korea", + "region": "Asia Pacific" + }, + "IND": { + "cca2": "US", + "city": "Indianapolis", + "country": "United States", + "lat": 39.717300415, + "lon": -86.2944030762, + "name": "Indianapolis, IN, United States", + "region": "North America" + }, + "ISB": { + "cca2": "PK", + "city": "Islamabad", + "country": "Pakistan", + "lat": 33.6166992188, + "lon": 73.0991973877, + "name": "Islamabad, Pakistan", + "region": "Asia Pacific" + }, + "IST": { + "cca2": "TR", + "city": "Istanbul", + "country": "Turkey", + "lat": 40.9768981934, + "lon": 28.8145999908, + "name": "Istanbul, Turkey", + "region": "Europe" + }, + "ISU": { + "cca2": "IQ", + "city": "Sulaymaniyah", + "country": "Iraq", + "lat": 35.5668, + "lon": 45.4161, + "name": "Sulaymaniyah, Iraq", + "region": "Middle East" + }, + "IXC": { + "cca2": "IN", + "city": "Chandigarh", + "country": "India", + "lat": 30.673500061, + "lon": 76.7884979248, + "name": "Chandigarh, India", + "region": "Asia Pacific" + }, + "JAX": { + "cca2": "US", + "city": "Jacksonville", + "country": "United States", + "lat": 30.4941005707, + "lon": -81.6878967285, + "name": "Jacksonville, FL, United States", + "region": "North America" + }, + "JDO": { + "cca2": "BR", + "city": "Juazeiro do Norte", + "country": "Brazil", + "lat": -7.2242, + "lon": -39.313, + "name": "Juazeiro do Norte, Brazil", + "region": "South America" + }, + "JED": { + "cca2": "SA", + "city": "Jeddah", + "country": "Saudi Arabia", + "lat": 21.679599762, + "lon": 39.15650177, + "name": "Jeddah, Saudi Arabia", + "region": "Middle East" + }, + "JHB": { + "cca2": "MY", + "city": "Johor Bahru", + "country": "Malaysia", + "lat": 1.635848, + "lon": 103.665943, + "name": "Johor Bahru, Malaysia", + "region": "Asia Pacific" + }, + "JIB": { + "cca2": "DJ", + "city": "Djibouti", + "country": "Djibouti", + "lat": 11.5473003387, + "lon": 43.1595001221, + "name": "Djibouti, Djibouti", + "region": "Africa" + }, + "JNB": { + "cca2": "ZA", + "city": "Johannesburg", + "country": "South Africa", + "lat": -26.133333, + "lon": 28.25, + "name": "Johannesburg, South Africa", + "region": "Africa" + }, + "JOG": { + "cca2": "ID", + "city": "Yogyakarta", + "country": "Indonesia", + "lat": -7.7881798744, + "lon": 110.4319992065, + "name": "Yogyakarta, Indonesia", + "region": "Asia Pacific" + }, + "JOI": { + "cca2": "BR", + "city": "Joinville", + "country": "Brazil", + "lat": -26.304408, + "lon": -48.846383, + "name": "Joinville, Brazil", + "region": "South America" + }, + "JXG": { + "cca2": "CN", + "city": "Jiaxing", + "country": "China", + "name": "Jiaxing, China", + "region": "Asia" + }, + "KBP": { + "cca2": "UA", + "city": "Kyiv", + "country": "Ukraine", + "lat": 50.3450012207, + "lon": 30.8946990967, + "name": "Kyiv, Ukraine", + "region": "Europe" + }, + "KCH": { + "cca2": "MY", + "city": "Kuching", + "country": "Malaysia", + "lat": 1.709727, + "lon": 110.353455, + "name": "Kuching, Malaysia", + "region": "Asia Pacific" + }, + "KEF": { + "cca2": "IS", + "city": "Reykjavík", + "country": "Iceland", + "lat": 63.9850006104, + "lon": -22.6056003571, + "name": "Reykjavík, Iceland", + "region": "Europe" + }, + "KGL": { + "cca2": "RW", + "city": "Kigali", + "country": "Rwanda", + "lat": -1.9686299563, + "lon": 30.1394996643, + "name": "Kigali, Rwanda", + "region": "Africa" + }, + "KHH": { + "cca2": "TW", + "city": "Kaohsiung City", + "country": "Taiwan", + "lat": 22.5771007538, + "lon": 120.3499984741, + "name": "Kaohsiung City, Taiwan", + "region": "Asia Pacific" + }, + "KHI": { + "cca2": "PK", + "city": "Karachi", + "country": "Pakistan", + "lat": 24.9064998627, + "lon": 67.1607971191, + "name": "Karachi, Pakistan", + "region": "Asia Pacific" + }, + "KHN": { + "cca2": "CN", + "city": "Nanchang", + "country": "China", + "name": "Nanchang, China", + "region": "Asia" + }, + "KIN": { + "cca2": "JM", + "city": "Kingston", + "country": "Jamaica", + "lat": 17.9951, + "lon": -76.7846, + "name": "Kingston, Jamaica", + "region": "North America" + }, + "KIV": { + "cca2": "MD", + "city": "Chișinău", + "country": "Moldova", + "lat": 46.9277000427, + "lon": 28.9309997559, + "name": "Chișinău, Moldova", + "region": "Europe" + }, + "KIX": { + "cca2": "JP", + "city": "Osaka", + "country": "Japan", + "lat": 34.4272994995, + "lon": 135.244003296, + "name": "Osaka, Japan", + "region": "Asia Pacific" + }, + "KJA": { + "cca2": "RU", + "city": "Krasnoyarsk", + "country": "Russia", + "lat": 56.0153, + "lon": 92.8932, + "name": "Krasnoyarsk, Russia", + "region": "Asia Pacific" + }, + "KMG": { + "cca2": "CN", + "city": "Kunming", + "country": "China", + "name": "Kunming, China", + "region": "Asia" + }, + "KNU": { + "cca2": "IN", + "city": "Kanpur", + "country": "India", + "lat": 26.4499, + "lon": 80.3319, + "name": "Kanpur, India", + "region": "Asia Pacific" + }, + "KTM": { + "cca2": "NP", + "city": "Kathmandu", + "country": "Nepal", + "lat": 27.6965999603, + "lon": 85.3591003418, + "name": "Kathmandu, Nepal", + "region": "Asia Pacific" + }, + "KUL": { + "cca2": "MY", + "city": "Kuala Lumpur", + "country": "Malaysia", + "lat": 2.745579958, + "lon": 101.709999084, + "name": "Kuala Lumpur, Malaysia", + "region": "Asia Pacific" + }, + "KWE": { + "cca2": "CN", + "city": "Guiyang", + "country": "China", + "name": "Guiyang, China", + "region": "Asia" + }, + "KWI": { + "cca2": "KW", + "city": "Kuwait City", + "country": "Kuwait", + "lat": 29.226600647, + "lon": 47.9688987732, + "name": "Kuwait City, Kuwait", + "region": "Middle East" + }, + "LAD": { + "cca2": "AO", + "city": "Luanda", + "country": "Angola", + "lat": -8.8583698273, + "lon": 13.2312002182, + "name": "Luanda, Angola", + "region": "Africa" + }, + "LAS": { + "cca2": "US", + "city": "Las Vegas", + "country": "United States", + "lat": 36.08010101, + "lon": -115.1520004, + "name": "Las Vegas, NV, United States", + "region": "North America" + }, + "LAX": { + "cca2": "US", + "city": "Los Angeles", + "country": "United States", + "lat": 33.94250107, + "lon": -118.4079971, + "name": "Los Angeles, CA, United States", + "region": "North America" + }, + "LCA": { + "cca2": "CY", + "city": "Nicosia", + "country": "Cyprus", + "lat": 34.8750991821, + "lon": 33.6249008179, + "name": "Nicosia, Cyprus", + "region": "Europe" + }, + "LED": { + "cca2": "RU", + "city": "Saint Petersburg", + "country": "Russia", + "lat": 59.8003005981, + "lon": 30.2625007629, + "name": "Saint Petersburg, Russia", + "region": "Europe" + }, + "LHR": { + "cca2": "GB", + "city": "London", + "country": "United Kingdom", + "lat": 51.4706001282, + "lon": -0.4619410038, + "name": "London, United Kingdom", + "region": "Europe" + }, + "LIM": { + "cca2": "PE", + "city": "Lima", + "country": "Peru", + "lat": -12.021900177, + "lon": -77.1143035889, + "name": "Lima, Peru", + "region": "South America" + }, + "LIS": { + "cca2": "PT", + "city": "Lisbon", + "country": "Portugal", + "lat": 38.7812995911, + "lon": -9.1359195709, + "name": "Lisbon, Portugal", + "region": "Europe" + }, + "LLK": { + "cca2": "AZ", + "city": "Astara", + "country": "Azerbaijan", + "lat": 38.7463989258, + "lon": 48.8180007935, + "name": "Astara, Azerbaijan", + "region": "Middle East" + }, + "LLW": { + "cca2": "MW", + "city": "Lilongwe", + "country": "Malawi", + "lat": -13.980935, + "lon": 33.761462, + "name": "Lilongwe, Malawi", + "region": "Africa" + }, + "LOS": { + "cca2": "NG", + "city": "Lagos", + "country": "Nigeria", + "lat": 6.5773701668, + "lon": 3.321160078, + "name": "Lagos, Nigeria", + "region": "Africa" + }, + "LPB": { + "cca2": "BO", + "city": "La Paz", + "country": "Bolivia", + "lat": -16.4897, + "lon": -68.1193, + "name": "La Paz, Bolivia", + "region": "South America" + }, + "LUN": { + "cca2": "ZM", + "city": "Lusaka", + "country": "Zambia", + "lat": -15.371446, + "lon": 28.317837, + "name": "Lusaka, Zambia", + "region": "Africa" + }, + "LUX": { + "cca2": "LU", + "city": "Luxembourg City", + "country": "Luxembourg", + "lat": 49.6265983582, + "lon": 6.211520195, + "name": "Luxembourg City, Luxembourg", + "region": "Europe" + }, + "LYS": { + "cca2": "FR", + "city": "Lyon", + "country": "France", + "lat": 45.7263, + "lon": 5.0908, + "name": "Lyon, France", + "region": "Europe" + }, + "MAA": { + "cca2": "IN", + "city": "Chennai", + "country": "India", + "lat": 12.9900054932, + "lon": 80.1692962646, + "name": "Chennai, India", + "region": "Asia Pacific" + }, + "MAD": { + "cca2": "ES", + "city": "Madrid", + "country": "Spain", + "lat": 40.4936, + "lon": -3.56676, + "name": "Madrid, Spain", + "region": "Europe" + }, + "MAN": { + "cca2": "GB", + "city": "Manchester", + "country": "United Kingdom", + "lat": 53.3536987305, + "lon": -2.2749500275, + "name": "Manchester, United Kingdom", + "region": "Europe" + }, + "MAO": { + "cca2": "BR", + "city": "Manaus", + "country": "Brazil", + "lat": -3.11286, + "lon": -60.01949, + "name": "Manaus, Brazil", + "region": "South America" + }, + "MBA": { + "cca2": "KE", + "city": "Mombasa", + "country": "Kenya", + "lat": -4.0348300934, + "lon": 39.5942001343, + "name": "Mombasa, Kenya", + "region": "Africa" + }, + "MCI": { + "cca2": "US", + "city": "Kansas City", + "country": "United States", + "lat": 39.2975997925, + "lon": -94.7138977051, + "name": "Kansas City, MO, United States", + "region": "North America" + }, + "MCT": { + "cca2": "OM", + "city": "Muscat", + "country": "Oman", + "lat": 23.5932998657, + "lon": 58.2844009399, + "name": "Muscat, Oman", + "region": "Middle East" + }, + "MDE": { + "cca2": "CO", + "city": "Medellín", + "country": "Colombia", + "lat": 6.16454, + "lon": -75.4231, + "name": "Medellín, Colombia", + "region": "South America" + }, + "MEL": { + "cca2": "AU", + "city": "Melbourne", + "country": "Australia", + "lat": -37.6733016968, + "lon": 144.843002319, + "name": "Melbourne, VIC, Australia", + "region": "Oceania" + }, + "MEM": { + "cca2": "US", + "city": "Memphis", + "country": "United States", + "lat": 35.0424003601, + "lon": -89.9766998291, + "name": "Memphis, TN, United States", + "region": "North America" + }, + "MEX": { + "cca2": "MX", + "city": "Mexico City", + "country": "Mexico", + "lat": 19.4363002777, + "lon": -99.0720977783, + "name": "Mexico City, Mexico", + "region": "North America" + }, + "MFM": { + "cca2": "MO", + "city": "Macau", + "lat": 22.1495990753, + "lon": 113.592002869, + "name": "Macau", + "region": "Asia Pacific" + }, + "MIA": { + "cca2": "US", + "city": "Miami", + "country": "United States", + "lat": 25.7931995392, + "lon": -80.2906036377, + "name": "Miami, FL, United States", + "region": "North America" + }, + "MLE": { + "cca2": "MV", + "city": "Male", + "country": "Maldives", + "lat": 4.1748, + "lon": 73.50888, + "name": "Male, Maldives", + "region": "Asia Pacific" + }, + "MLG": { + "cca2": "ID", + "city": "Malang", + "country": "Indonesia", + "lat": -8.100347, + "lon": 112.186641, + "name": "Malang, Indonesia", + "region": "Asia Pacific" + }, + "MNL": { + "cca2": "PH", + "city": "Manila", + "country": "Philippines", + "lat": 14.508600235, + "lon": 121.019996643, + "name": "Manila, Philippines", + "region": "Asia Pacific" + }, + "MPM": { + "cca2": "MZ", + "city": "Maputo", + "country": "Mozambique", + "lat": -25.9207992554, + "lon": 32.5726013184, + "name": "Maputo, Mozambique", + "region": "Africa" + }, + "MRS": { + "cca2": "FR", + "city": "Marseille", + "country": "France", + "lat": 43.439271922, + "lon": 5.2214241028, + "name": "Marseille, France", + "region": "Europe" + }, + "MRU": { + "cca2": "MU", + "city": "Port Louis", + "country": "Mauritius", + "lat": -20.4302005768, + "lon": 57.6836013794, + "name": "Port Louis, Mauritius", + "region": "Africa" + }, + "MSP": { + "cca2": "US", + "city": "Minneapolis", + "country": "United States", + "lat": 44.8819999695, + "lon": -93.2218017578, + "name": "Minneapolis, MN, United States", + "region": "North America" + }, + "MSQ": { + "cca2": "BY", + "city": "Minsk", + "country": "Belarus", + "lat": 53.9006, + "lon": 27.599, + "name": "Minsk, Belarus", + "region": "Europe" + }, + "MUC": { + "cca2": "DE", + "city": "Munich", + "country": "Germany", + "lat": 48.3538017273, + "lon": 11.7861003876, + "name": "Munich, Germany", + "region": "Europe" + }, + "MXP": { + "cca2": "IT", + "city": "Milan", + "country": "Italy", + "lat": 45.6305999756, + "lon": 8.7281103134, + "name": "Milan, Italy", + "region": "Europe" + }, + "NAG": { + "cca2": "IN", + "city": "Nagpur", + "country": "India", + "lat": 21.1610714, + "lon": 79.0024702, + "name": "Nagpur, India", + "region": "Asia Pacific" + }, + "NBO": { + "cca2": "KE", + "city": "Nairobi", + "country": "Kenya", + "lat": -1.319239974, + "lon": 36.9277992249, + "name": "Nairobi, Kenya", + "region": "Africa" + }, + "NJF": { + "cca2": "IQ", + "city": "Najaf", + "country": "Iraq", + "lat": 31.989722, + "lon": 44.404167, + "name": "Najaf, Iraq", + "region": "Middle East" + }, + "NNG": { + "cca2": "CN", + "city": "Nanning", + "country": "China", + "name": "Nanning, China", + "region": "Asia" + }, + "NOU": { + "cca2": "NC", + "city": "Noumea", + "country": "New Caledonia", + "lat": -22.0146007538, + "lon": 166.212997436, + "name": "Noumea, New Caledonia", + "region": "Oceania" + }, + "NQN": { + "cca2": "AR", + "city": "Neuquen", + "country": "Argentina", + "lat": -38.9490013123, + "lon": -68.1557006836, + "name": "Neuquen, Argentina", + "region": "South America" + }, + "NQZ": { + "cca2": "KZ", + "city": "Astana", + "country": "Kazakhstan", + "lat": 51.167801, + "lon": 71.418893, + "name": "Astana, Kazakhstan", + "region": "Asia Pacific" + }, + "NRT": { + "cca2": "JP", + "city": "Tokyo", + "country": "Japan", + "lat": 35.7647018433, + "lon": 140.386001587, + "name": "Tokyo, Japan", + "region": "Asia Pacific" + }, + "NVT": { + "cca2": "BR", + "city": "Timbo", + "country": "Brazil", + "lat": -26.8251, + "lon": -49.2695, + "name": "Timbo, Brazil", + "region": "South America" + }, + "OKA": { + "cca2": "JP", + "city": "Naha", + "country": "Japan", + "lat": 26.1958, + "lon": 127.646, + "name": "Naha, Japan", + "region": "Asia Pacific" + }, + "OKC": { + "cca2": "US", + "city": "Oklahoma City", + "country": "United States", + "lat": 35.46655, + "lon": -97.65373, + "name": "Oklahoma City, United States", + "region": "North America" + }, + "OMA": { + "cca2": "US", + "city": "Omaha", + "country": "United States", + "lat": 41.3031997681, + "lon": -95.8940963745, + "name": "Omaha, NE, United States", + "region": "North America" + }, + "ORD": { + "cca2": "US", + "city": "Chicago", + "country": "United States", + "lat": 41.97859955, + "lon": -87.90480042, + "name": "Chicago, IL, United States", + "region": "North America" + }, + "ORF": { + "cca2": "US", + "city": "Norfolk", + "country": "United States", + "lat": 36.8945999146, + "lon": -76.2012023926, + "name": "Norfolk, VA, United States", + "region": "North America" + }, + "ORN": { + "cca2": "DZ", + "city": "Oran", + "country": "Algeria", + "lat": 35.6911, + "lon": -0.6416, + "name": "Oran, Algeria", + "region": "Africa" + }, + "OSL": { + "cca2": "NO", + "city": "Oslo", + "country": "Norway", + "lat": 60.193901062, + "lon": 11.100399971, + "name": "Oslo, Norway", + "region": "Europe" + }, + "OTP": { + "cca2": "RO", + "city": "Bucharest", + "country": "Romania", + "lat": 44.5722007751, + "lon": 26.1021995544, + "name": "Bucharest, Romania", + "region": "Europe" + }, + "OUA": { + "cca2": "BF", + "city": "Ouagadougou", + "country": "Burkina Faso", + "lat": 12.3531999588, + "lon": -1.5124200583, + "name": "Ouagadougou, Burkina Faso", + "region": "Africa" + }, + "PAT": { + "cca2": "IN", + "city": "Patna", + "country": "India", + "lat": 25.591299057, + "lon": 85.0879974365, + "name": "Patna, India", + "region": "Asia Pacific" + }, + "PBH": { + "cca2": "BT", + "city": "Thimphu", + "country": "Bhutan", + "lat": 27.4712, + "lon": 89.6339, + "name": "Thimphu, Bhutan", + "region": "Asia Pacific" + }, + "PBM": { + "cca2": "SR", + "city": "Paramaribo", + "country": "Suriname", + "lat": 5.452831, + "lon": -55.187783, + "name": "Paramaribo, Suriname", + "region": "South America" + }, + "PDX": { + "cca2": "US", + "city": "Portland", + "country": "United States", + "lat": 45.58869934, + "lon": -122.5979996, + "name": "Portland, OR, United States", + "region": "North America" + }, + "PER": { + "cca2": "AU", + "city": "Perth", + "country": "Australia", + "lat": -31.9402999878, + "lon": 115.967002869, + "name": "Perth, WA, Australia", + "region": "Oceania" + }, + "PHL": { + "cca2": "US", + "city": "Philadelphia", + "country": "United States", + "lat": 39.8718986511, + "lon": -75.2410964966, + "name": "Philadelphia, United States", + "region": "North America" + }, + "PHX": { + "cca2": "US", + "city": "Phoenix", + "country": "United States", + "lat": 33.434299469, + "lon": -112.012001038, + "name": "Phoenix, AZ, United States", + "region": "North America" + }, + "PIT": { + "cca2": "US", + "city": "Pittsburgh", + "country": "United States", + "lat": 40.49150085, + "lon": -80.23290253, + "name": "Pittsburgh, PA, United States", + "region": "North America" + }, + "PKX": { + "cca2": "CN", + "city": "Langfang", + "country": "China", + "name": "Langfang, China", + "region": "Asia" + }, + "PMO": { + "cca2": "IT", + "city": "Palermo", + "country": "Italy", + "lat": 38.16114, + "lon": 13.31546, + "name": "Palermo, Italy", + "region": "Europe" + }, + "PMW": { + "cca2": "BR", + "city": "Palmas", + "country": "Brazil", + "lat": -10.2915000916, + "lon": -48.3569984436, + "name": "Palmas, Brazil", + "region": "South America" + }, + "PNH": { + "cca2": "KH", + "city": "Phnom Penh", + "country": "Cambodia", + "lat": 11.5466003418, + "lon": 104.84400177, + "name": "Phnom Penh, Cambodia", + "region": "Asia Pacific" + }, + "POA": { + "cca2": "BR", + "city": "Porto Alegre", + "country": "Brazil", + "lat": -29.9944000244, + "lon": -51.1713981628, + "name": "Porto Alegre, Brazil", + "region": "South America" + }, + "POS": { + "cca2": "TT", + "city": "Port of Spain", + "country": "Trinidad and Tobago", + "lat": 10.5953998566, + "lon": -61.3372001648, + "name": "Port of Spain, Trinidad and Tobago", + "region": "South America" + }, + "PPT": { + "cca2": "PF", + "city": "Tahiti", + "country": "French Polynesia", + "lat": -17.5536994934, + "lon": -149.606994629, + "name": "Tahiti, French Polynesia", + "region": "Oceania" + }, + "PRG": { + "cca2": "CZ", + "city": "Prague", + "country": "Czech Republic", + "lat": 50.1007995605, + "lon": 14.2600002289, + "name": "Prague, Czech Republic", + "region": "Europe" + }, + "PTY": { + "cca2": "PA", + "city": "Panama City", + "country": "Panama", + "lat": 9.0713596344, + "lon": -79.3834991455, + "name": "Panama City, Panama", + "region": "South America" + }, + "QRO": { + "cca2": "MX", + "city": "Queretaro", + "country": "Mexico", + "lat": 20.6173000336, + "lon": -100.185997009, + "name": "Queretaro, MX, Mexico", + "region": "North America" + }, + "QWJ": { + "cca2": "BR", + "city": "Americana", + "country": "Brazil", + "lat": -22.738, + "lon": -47.334, + "name": "Americana, Brazil", + "region": "South America" + }, + "RAO": { + "cca2": "BR", + "city": "Ribeirao Preto", + "country": "Brazil", + "lat": -21.1363887787, + "lon": -47.7766685486, + "name": "Ribeirao Preto, Brazil", + "region": "South America" + }, + "RDU": { + "cca2": "US", + "city": "Durham", + "country": "United States", + "lat": 35.93543, + "lon": -78.88075, + "name": "Durham, United States", + "region": "North America" + }, + "REC": { + "cca2": "BR", + "city": "Recife", + "country": "Brazil", + "lat": -8.1264896393, + "lon": -34.9235992432, + "name": "Recife, Brazil", + "region": "South America" + }, + "RIC": { + "cca2": "US", + "city": "Richmond", + "country": "United States", + "lat": 37.5051994324, + "lon": -77.3197021484, + "name": "Richmond, VA, United States", + "region": "North America" + }, + "RIX": { + "cca2": "LV", + "city": "Riga", + "country": "Latvia", + "lat": 56.9235992432, + "lon": 23.9710998535, + "name": "Riga, Latvia", + "region": "Europe" + }, + "RUH": { + "cca2": "SA", + "city": "Riyadh", + "country": "Saudi Arabia", + "lat": 24.9575996399, + "lon": 46.6987991333, + "name": "Riyadh, Saudi Arabia", + "region": "Middle East" + }, + "RUN": { + "cca2": "RE", + "city": "Saint-Denis", + "country": "Réunion", + "lat": -20.8871002197, + "lon": 55.5102996826, + "name": "Saint-Denis, Réunion", + "region": "Africa" + }, + "SAN": { + "cca2": "US", + "city": "San Diego", + "country": "United States", + "lat": 32.7336006165, + "lon": -117.190002441, + "name": "San Diego, CA, United States", + "region": "North America" + }, + "SAP": { + "cca2": "HN", + "city": "San Pedro Sula", + "country": "Honduras", + "lat": 15.4525995255, + "lon": -87.9235992432, + "name": "San Pedro Sula, Honduras", + "region": "South America" + }, + "SAT": { + "cca2": "US", + "city": "San Antonio", + "country": "United States", + "lat": 29.429461, + "lon": -98.487061, + "name": "San Antonio, United States", + "region": "North America" + }, + "SCL": { + "cca2": "CL", + "city": "Santiago", + "country": "Chile", + "lat": -33.3930015564, + "lon": -70.7857971191, + "name": "Santiago, Chile", + "region": "South America" + }, + "SDQ": { + "cca2": "DO", + "city": "Santo Domingo", + "country": "Dominican Republic", + "lat": 18.4297008514, + "lon": -69.6688995361, + "name": "Santo Domingo, Dominican Republic", + "region": "North America" + }, + "SEA": { + "cca2": "US", + "city": "Seattle", + "country": "United States", + "lat": 47.4490013123, + "lon": -122.308998108, + "name": "Seattle, WA, United States", + "region": "North America" + }, + "SFO": { + "cca2": "US", + "city": "San Francisco", + "country": "United States", + "lat": 37.6189994812, + "lon": -122.375, + "name": "San Francisco, United States", + "region": "North America" + }, + "SGN": { + "cca2": "VN", + "city": "Ho Chi Minh City", + "country": "Vietnam", + "lat": 10.8187999725, + "lon": 106.652000427, + "name": "Ho Chi Minh City, Vietnam", + "region": "Asia Pacific" + }, + "SHA": { + "cca2": "CN", + "city": "Shanghai", + "country": "China", + "name": "Shanghai, China", + "region": "Asia" + }, + "SIN": { + "cca2": "SG", + "city": "Singapore", + "country": "Singapore", + "lat": 1.3501900434, + "lon": 103.994003296, + "name": "Singapore, Singapore", + "region": "Asia Pacific" + }, + "SJC": { + "cca2": "US", + "city": "San Jose", + "country": "United States", + "lat": 37.3625984192, + "lon": -121.929000855, + "name": "San Jose, CA, United States", + "region": "North America" + }, + "SJK": { + "cca2": "BR", + "city": "São José dos Campos", + "country": "Brazil", + "lat": -23.1791, + "lon": -45.8872, + "name": "São José dos Campos, Brazil", + "region": "South America" + }, + "SJO": { + "cca2": "CR", + "city": "San José", + "country": "Costa Rica", + "lat": 9.9938602448, + "lon": -84.2088012695, + "name": "San José, Costa Rica", + "region": "South America" + }, + "SJP": { + "cca2": "BR", + "city": "São José do Rio Preto", + "country": "Brazil", + "lat": -20.807157, + "lon": -49.378994, + "name": "São José do Rio Preto, Brazil", + "region": "South America" + }, + "SJU": { + "cca2": "PR", + "city": "San Juan", + "country": "Puerto Rico", + "lat": 18.411391, + "lon": -66.102793, + "name": "San Juan, Puerto Rico", + "region": "North America" + }, + "SJW": { + "cca2": "CN", + "city": "Shijiazhuang", + "country": "China", + "name": "Shijiazhuang, China", + "region": "Asia" + }, + "SKG": { + "cca2": "GR", + "city": "Thessaloniki", + "country": "Greece", + "lat": 40.5196990967, + "lon": 22.9708995819, + "name": "Thessaloniki, Greece", + "region": "Europe" + }, + "SKP": { + "cca2": "MK", + "city": "Skopje", + "country": "North Macedonia", + "lat": 41.9616012573, + "lon": 21.6214008331, + "name": "Skopje, North Macedonia", + "region": "Europe" + }, + "SLC": { + "cca2": "US", + "city": "Salt Lake City", + "country": "United States", + "lat": 40.7883987427, + "lon": -111.977996826, + "name": "Salt Lake City, UT, United States", + "region": "North America" + }, + "SMF": { + "cca2": "US", + "city": "Sacramento", + "country": "United States", + "lat": 38.695400238, + "lon": -121.591003418, + "name": "Sacramento, CA, United States", + "region": "North America" + }, + "SOD": { + "cca2": "BR", + "city": "Sorocaba", + "country": "Brazil", + "lat": -23.54389, + "lon": -46.63445, + "name": "Sorocaba, Brazil", + "region": "South America" + }, + "SOF": { + "cca2": "BG", + "city": "Sofia", + "country": "Bulgaria", + "lat": 42.6966934204, + "lon": 23.4114360809, + "name": "Sofia, Bulgaria", + "region": "Europe" + }, + "SSA": { + "cca2": "BR", + "city": "Salvador", + "country": "Brazil", + "lat": -12.9086112976, + "lon": -38.3224983215, + "name": "Salvador, Brazil", + "region": "South America" + }, + "STI": { + "cca2": "DO", + "city": "Santiago de los Caballeros", + "country": "Dominican Republic", + "lat": 19.4060993195, + "lon": -70.6046981812, + "name": "Santiago de los Caballeros, Dominican Republic", + "region": "North America" + }, + "STL": { + "cca2": "US", + "city": "St. Louis", + "country": "United States", + "lat": 38.7486991882, + "lon": -90.3700027466, + "name": "St. Louis, MO, United States", + "region": "North America" + }, + "STR": { + "cca2": "DE", + "city": "Stuttgart", + "country": "Germany", + "lat": 48.783333, + "lon": 9.183333, + "name": "Stuttgart, Germany", + "region": "Europe" + }, + "SUV": { + "cca2": "FJ", + "city": "Suva", + "country": "Fiji", + "lat": -18.11319, + "lon": 178.43859, + "name": "Suva, Fiji", + "region": "Oceania" + }, + "SYD": { + "cca2": "AU", + "city": "Sydney", + "country": "Australia", + "lat": -33.9460983276, + "lon": 151.177001953, + "name": "Sydney, NSW, Australia", + "region": "Oceania" + }, + "SZX": { + "cca2": "CN", + "city": "Shenzhen", + "country": "China", + "name": "Shenzhen, China", + "region": "Asia" + }, + "TAO": { + "cca2": "CN", + "city": "Qingdao", + "country": "China", + "name": "Qingdao, China", + "region": "Asia" + }, + "TBS": { + "cca2": "GE", + "city": "Tbilisi", + "country": "Georgia", + "lat": 41.6692008972, + "lon": 44.95470047, + "name": "Tbilisi, Georgia", + "region": "Europe" + }, + "TEN": { + "cca2": "CN", + "city": "Tongren", + "country": "China", + "name": "Tongren, China", + "region": "Asia" + }, + "TGU": { + "cca2": "HN", + "city": "Tegucigalpa", + "country": "Honduras", + "lat": 14.0608, + "lon": -87.2172, + "name": "Tegucigalpa, Honduras", + "region": "South America" + }, + "TIA": { + "cca2": "AL", + "city": "Tirana", + "country": "Albania", + "lat": 41.4146995544, + "lon": 19.7206001282, + "name": "Tirana, Albania", + "region": "Europe" + }, + "TLH": { + "cca2": "US", + "city": "Tallahassee", + "country": "United States", + "lat": 30.3964996338, + "lon": -84.3503036499, + "name": "Tallahassee, FL, United States", + "region": "North America" + }, + "TLL": { + "cca2": "EE", + "city": "Tallinn", + "country": "Estonia", + "lat": 59.4132995605, + "lon": 24.8327999115, + "name": "Tallinn, Estonia", + "region": "Europe" + }, + "TLV": { + "cca2": "IL", + "city": "Tel Aviv", + "country": "Israel", + "lat": 32.0113983154, + "lon": 34.8866996765, + "name": "Tel Aviv, Israel", + "region": "Middle East" + }, + "TNA": { + "cca2": "CN", + "city": "Zibo", + "country": "China", + "name": "Zibo, China", + "region": "Asia" + }, + "TNR": { + "cca2": "MG", + "city": "Antananarivo", + "country": "Madagascar", + "lat": -18.91368, + "lon": 47.53613, + "name": "Antananarivo, Madagascar", + "region": "Africa" + }, + "TPA": { + "cca2": "US", + "city": "Tampa", + "country": "United States", + "lat": 27.9755001068, + "lon": -82.533203125, + "name": "Tampa, United States", + "region": "North America" + }, + "TPE": { + "cca2": "TW", + "city": "Taipei", + "lat": 25.0776996613, + "lon": 121.233001709, + "name": "Taipei", + "region": "Asia Pacific" + }, + "TUN": { + "cca2": "TN", + "city": "Tunis", + "country": "Tunisia", + "lat": 36.8510017395, + "lon": 10.2271995544, + "name": "Tunis, Tunisia", + "region": "Africa" + }, + "TXL": { + "cca2": "DE", + "city": "Berlin", + "country": "Germany", + "lat": 52.5597000122, + "lon": 13.2876996994, + "name": "Berlin, Germany", + "region": "Europe" + }, + "TYN": { + "cca2": "CN", + "city": "Yangquan", + "country": "China", + "name": "Yangquan, China", + "region": "Asia" + }, + "UDI": { + "cca2": "BR", + "city": "Uberlandia", + "country": "Brazil", + "lat": -18.8836116791, + "lon": -48.225276947, + "name": "Uberlandia, Brazil", + "region": "South America" + }, + "UIO": { + "cca2": "EC", + "city": "Quito", + "country": "Ecuador", + "lat": -0.1291666667, + "lon": -78.3575, + "name": "Quito, Ecuador", + "region": "South America" + }, + "ULN": { + "cca2": "MN", + "city": "Ulaanbaatar", + "country": "Mongolia", + "lat": 47.8431015015, + "lon": 106.766998291, + "name": "Ulaanbaatar, Mongolia", + "region": "Asia Pacific" + }, + "URT": { + "cca2": "TH", + "city": "Surat Thani", + "country": "Thailand", + "lat": 9.1325998306, + "lon": 99.135597229, + "name": "Surat Thani, Thailand", + "region": "Asia Pacific" + }, + "VCP": { + "cca2": "BR", + "city": "Campinas", + "country": "Brazil", + "lat": -22.90662, + "lon": -47.08576, + "name": "Campinas, Brazil", + "region": "South America" + }, + "VIE": { + "cca2": "AT", + "city": "Vienna", + "country": "Austria", + "lat": 48.1102981567, + "lon": 16.5697002411, + "name": "Vienna, Austria", + "region": "Europe" + }, + "VIX": { + "cca2": "BR", + "city": "Vitoria", + "country": "Brazil", + "lat": -20.64871, + "lon": -41.90857, + "name": "Vitoria, Brazil", + "region": "South America" + }, + "VNO": { + "cca2": "LT", + "city": "Vilnius", + "country": "Lithuania", + "lat": 54.6341018677, + "lon": 25.2858009338, + "name": "Vilnius, Lithuania", + "region": "Europe" + }, + "VTE": { + "cca2": "LA", + "city": "Vientiane", + "country": "Laos", + "lat": 17.9757, + "lon": 102.5683, + "name": "Vientiane, Laos", + "region": "Asia Pacific" + }, + "WAW": { + "cca2": "PL", + "city": "Warsaw", + "country": "Poland", + "lat": 52.1656990051, + "lon": 20.9671001434, + "name": "Warsaw, Poland", + "region": "Europe" + }, + "WDH": { + "cca2": "NA", + "city": "Windhoek", + "country": "Namibia", + "lat": -22.565587, + "lon": 17.085334, + "name": "Windhoek, Namibia", + "region": "Africa" + }, + "XAP": { + "cca2": "BR", + "city": "Chapeco", + "country": "Brazil", + "lat": -27.1341991425, + "lon": -52.6566009521, + "name": "Chapeco, Brazil", + "region": "South America" + }, + "XFN": { + "cca2": "CN", + "city": "Xiangyang", + "country": "China", + "name": "Xiangyang, China", + "region": "Asia" + }, + "XIY": { + "cca2": "CN", + "city": "Baoji", + "country": "China", + "name": "Baoji, China", + "region": "Asia" + }, + "XNH": { + "cca2": "IQ", + "city": "Nasiriyah", + "country": "Iraq", + "lat": 30.9358005524, + "lon": 46.0900993347, + "name": "Nasiriyah, Iraq", + "region": "Middle East" + }, + "XNN": { + "cca2": "CN", + "city": "Xining", + "country": "China", + "name": "Xining, China", + "region": "Asia" + }, + "YHZ": { + "cca2": "CA", + "city": "Halifax", + "country": "Canada", + "lat": 44.64601, + "lon": -63.66844, + "name": "Halifax, Canada", + "region": "North America" + }, + "YOW": { + "cca2": "CA", + "city": "Ottawa", + "country": "Canada", + "lat": 45.3224983215, + "lon": -75.6691970825, + "name": "Ottawa, Canada", + "region": "North America" + }, + "YUL": { + "cca2": "CA", + "city": "Montréal", + "country": "Canada", + "lat": 45.4706001282, + "lon": -73.7407989502, + "name": "Montréal, QC, Canada", + "region": "North America" + }, + "YVR": { + "cca2": "CA", + "city": "Vancouver", + "country": "Canada", + "lat": 49.193901062, + "lon": -123.183998108, + "name": "Vancouver, BC, Canada", + "region": "North America" + }, + "YWG": { + "cca2": "CA", + "city": "Winnipeg", + "country": "Canada", + "lat": 49.9099998474, + "lon": -97.2398986816, + "name": "Winnipeg, MB, Canada", + "region": "North America" + }, + "YXE": { + "cca2": "CA", + "city": "Saskatoon", + "country": "Canada", + "lat": 52.1707992554, + "lon": -106.699996948, + "name": "Saskatoon, SK, Canada", + "region": "North America" + }, + "YYC": { + "cca2": "CA", + "city": "Calgary", + "country": "Canada", + "lat": 51.113899231, + "lon": -114.019996643, + "name": "Calgary, AB, Canada", + "region": "North America" + }, + "YYZ": { + "cca2": "CA", + "city": "Toronto", + "country": "Canada", + "lat": 43.6772003174, + "lon": -79.6305999756, + "name": "Toronto, ON, Canada", + "region": "North America" + }, + "ZAG": { + "cca2": "HR", + "city": "Zagreb", + "country": "Croatia", + "lat": 45.7429008484, + "lon": 16.0687999725, + "name": "Zagreb, Croatia", + "region": "Europe" + }, + "ZDM": { + "cca2": "PS", + "city": "Ramallah", + "lat": 32.2719, + "lon": 35.0194, + "name": "Ramallah", + "region": "Middle East" + }, + "ZRH": { + "cca2": "CH", + "city": "Zurich", + "country": "Switzerland", + "lat": 47.4646987915, + "lon": 8.5491695404, + "name": "Zurich, Switzerland", + "region": "Europe" + } +} \ No newline at end of file diff --git a/editor/server/examples.py b/editor/server/examples.py index ca21f16..bc3f80f 100644 --- a/editor/server/examples.py +++ b/editor/server/examples.py @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MIT +import copy import os import re @@ -10,8 +11,8 @@ from flask import ( redirect, ) -from . import get_common_cf_template_params from cloudflare_error_page import render as render_cf_error_page +from .utils import fill_cf_template_params root_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../') examples_dir = os.path.join(root_dir, 'examples') @@ -25,12 +26,12 @@ def get_page_params(name: str) -> dict: name = re.sub(r'[^\w]', '', name) params = param_cache.get(name) if params is not None: - return params + return copy.deepcopy(params) try: with open(os.path.join(examples_dir, f'{name}.json')) as f: params = json.load(f) param_cache[name] = params - return params + return copy.deepcopy(params) except Exception as _: return None @@ -49,10 +50,7 @@ def index(name: str): if params is None: abort(404) - params = { - **params, - **get_common_cf_template_params(), - } + fill_cf_template_params(params) # Render the error page - return render_cf_error_page(params, use_cdn=True), 500 + return render_cf_error_page(params, use_cdn=True) diff --git a/editor/server/share.py b/editor/server/share.py index b89e2d2..028d2af 100644 --- a/editor/server/share.py +++ b/editor/server/share.py @@ -13,12 +13,18 @@ from flask import ( ) from jinja2 import Environment, select_autoescape -from cloudflare_error_page import render as render_cf_error_page, fill_params, default_template as cf_template +from cloudflare_error_page import ( + fill_params as fill_template_params, + default_template as cf_template +) -from . import get_common_cf_template_params -from . import db -from . import limiter -from . import models +from . import ( + db, + limiter, + models +) + +from .utils import fill_cf_template_params # root_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../') # examples_dir = os.path.join(root_dir, 'examples') @@ -89,7 +95,7 @@ def get(name: str): if not item: if is_json: return jsonify({ - 'status': 'not-found' + 'status': 'notfound' }) else: return abort(404) @@ -104,22 +110,19 @@ def get(name: str): 'parameters': params, }) else: - params = { - **params, - **get_common_cf_template_params(), - } params['creator_info'] = { 'hidden': False, 'text': 'CF Error Page Editor', 'link': f'https://virt.moe/cloudflare-error-page/editor/#from={name}', } - fill_params(params) + # Always escape HTML params['what_happened'] = html.escape(params.get('what_happened', '')) # TODO: common render function? params['what_can_i_do'] = html.escape(params.get('what_can_i_do', '')) + fill_cf_template_params(params) + fill_template_params(params) return template.render(base=cf_template, params=params, url=request.url, description='Cloudflare error page', resources_use_cdn=True) - # return render_cf_error_page(params=params, allow_html=False, use_cdn=True), 200 diff --git a/editor/server/utils.py b/editor/server/utils.py new file mode 100644 index 0000000..d2c0f9f --- /dev/null +++ b/editor/server/utils.py @@ -0,0 +1,50 @@ +import json +import os + +from flask import request +from . import root_dir + + +loc_data: dict = None + +def read_loc_file(path: str): + try: + with open(os.path.join(root_dir, path)) as f: + return json.load(f) + except: + return + + +def get_cf_location(loc: str): + global loc_data + loc = loc.upper() + if loc_data is None: + loc_data = read_loc_file('editor/server/cf-colos.json') + if loc_data is None: + # From https://github.com/Netrvin/cloudflare-colo-list/blob/main/DC-Colos.json + loc_data = read_loc_file('editor/server/cf-colos.bundled.json') + if loc_data is None: + return + data: dict = loc_data.get(loc) + if not data: + return + return data.get('city') + + +def fill_cf_template_params(params: dict): + # Get real Ray ID / data center location from Cloudflare header + ray_id_loc = request.headers.get('Cf-Ray') + if ray_id_loc: + params['ray_id'] = ray_id_loc[:16] + + cf_status: dict = params.get('cloudflare_status', {}) + if not cf_status.get('location'): + loc = get_cf_location() + if loc: + cf_status['location'] = loc + + # Get real client ip from Cloudflare header or request.remote_addr + client_ip = request.headers.get('X-Forwarded-For') + if not client_ip: + client_ip = request.remote_addr + params['client_ip'] = client_ip