Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
b1b2494
copy private.py from api/ooniapi/private.py
aagbsn Apr 22, 2026
284d89f
add private api router, logger
aagbsn Apr 22, 2026
0fa6b0d
remove current_app.logger
aagbsn Apr 22, 2026
b536469
migrate api/_/asn_by_month
aagbsn Apr 22, 2026
db3ff78
migrate api/_/countries_by_month
aagbsn Apr 22, 2026
2948eb7
migrate api/_/test_names
aagbsn Apr 22, 2026
1c63ab4
migrate api/_/countries
aagbsn Apr 22, 2026
4b629c9
import from clickhouse_utils
aagbsn Apr 22, 2026
430b5cd
TODO: compete. start migration of quotas_summary
aagbsn Apr 22, 2026
dcd788e
migrate api/_/check_report_id
aagbsn Apr 22, 2026
48a6c44
TODO: fix: migrate api/_/test_coverage
aagbsn Apr 22, 2026
20ef3da
TODO: fix: migrate api/_/website_networks
aagbsn Apr 22, 2026
a570f08
import fastapi Query, pydantic AnyUrl
aagbsn Apr 22, 2026
00b2ba3
squash: test_coverage fix query
aagbsn Apr 22, 2026
262800f
migrate api/_/website_stats
aagbsn Apr 23, 2026
9e54714
migrate api/_/website_urls
aagbsn Apr 23, 2026
5c50c67
migrate api/_/vanilla_tor_stats
aagbsn Apr 23, 2026
1d631b8
migrate api/_/im_networks
aagbsn Apr 23, 2026
c87143f
migrate api/_/im_stats
aagbsn Apr 23, 2026
75b8d71
migrate api/_/network_stats
aagbsn Apr 23, 2026
216f1f9
migrate api/_/country_overview
aagbsn Apr 23, 2026
da1cd6e
migrate api/_/global_overview
aagbsn Apr 23, 2026
a893f4c
migrate api/_/global_overview_by_month
aagbsn Apr 24, 2026
eb5303f
migrate api/_/circumvention_stats_by_country
aagbsn Apr 24, 2026
c541aa7
migrate api/_/circumvention_runtime_stats
aagbsn Apr 24, 2026
4d9717d
migrate api/_/domain_metadata
aagbsn Apr 24, 2026
ec9c590
migrate api/_/asnmeta
aagbsn Apr 24, 2026
65f4ce7
migrate api/_/networks
aagbsn Apr 24, 2026
1684c0b
migrate api/_/domains
aagbsn Apr 24, 2026
12652ea
remove unused imports
aagbsn Apr 24, 2026
a96c899
add TEST_GROUPS from old API
aagbsn Apr 24, 2026
c8a30b8
fix website_urls
aagbsn Apr 24, 2026
6567cf3
add data.py from old api
aagbsn Apr 24, 2026
dc60fe3
add countries from old api
aagbsn Apr 24, 2026
18e6df0
add pycountry for countries
aagbsn Apr 24, 2026
16f1af7
import types from typing
aagbsn Apr 24, 2026
3c60bf0
remove old api imports
aagbsn Apr 24, 2026
f06c0d4
import pydantic Field
aagbsn Apr 24, 2026
1b16703
fix deps from new api
aagbsn Apr 24, 2026
01c1e5a
fix types
aagbsn Apr 24, 2026
5597e4d
fix typos
aagbsn Apr 24, 2026
f54bbab
add pydantic_extra_types for country code validator
aagbsn Apr 24, 2026
bacbd06
fix conflicted field name
aagbsn Apr 24, 2026
5002c54
fix spacing
aagbsn Apr 24, 2026
2750091
fix model validator DomainStr
aagbsn Apr 24, 2026
b517b3e
fix type
aagbsn Apr 24, 2026
7e0c6fb
fix Field usage
aagbsn Apr 24, 2026
24fa684
remove check-in, not on migration list
aagbsn Apr 24, 2026
3154b86
add old api tests for private api
aagbsn Apr 24, 2026
0b52a71
add ClickhouseDep; update query_click usage
aagbsn Apr 27, 2026
a1a5478
add log fixture
aagbsn Apr 27, 2026
75400af
remove unused mock_load_json
aagbsn Apr 27, 2026
b146341
fix testclient api usage (httpx)
aagbsn Apr 27, 2026
0cd6343
remove test for private check-in API: unported
aagbsn Apr 27, 2026
6585852
remove unused validation methods
aagbsn Apr 27, 2026
9ac1693
update private_api client wrapper; TestClient uses httpx
aagbsn Apr 28, 2026
619ec49
update test fixture fastpath table definition
aagbsn Apr 28, 2026
fb76dd0
fix date format
aagbsn Apr 28, 2026
febb1a3
fix response type
aagbsn Apr 28, 2026
ba999b2
pass clickhouse to query_click
aagbsn Apr 28, 2026
9d7516f
remove old request.args
aagbsn Apr 28, 2026
172d833
fix response type
aagbsn Apr 28, 2026
eb92809
fix spacing
aagbsn Apr 28, 2026
084a317
fix results type
aagbsn Apr 28, 2026
ef3d468
fix datetime format
aagbsn Apr 28, 2026
7824990
fix typo: field name, class name
aagbsn Apr 28, 2026
bdce53d
fix bool value
aagbsn Apr 28, 2026
18fcc73
remove old request.args
aagbsn Apr 28, 2026
dbe4ca8
add sample fastpath data and tweak test values
aagbsn Apr 28, 2026
2525bab
FIXME: this exception isn't caught on input XY
aagbsn Apr 28, 2026
8232ecc
normalize api tags
aagbsn Apr 29, 2026
5ff6bd7
omit responses; let FastAPI generate docstring
aagbsn Apr 29, 2026
3f42239
omit responses docstring from legacy check_report_id
aagbsn Apr 29, 2026
8b651d1
add response model validation for /api/_/test_coverage
aagbsn Apr 29, 2026
a7ac388
add response model validation for /api/_/websites_networks
aagbsn Apr 29, 2026
8a2120e
add response model validation, method docstring for /api/_/website_stats
aagbsn Apr 29, 2026
b4aebff
add response model validation for /api/_/vanilla_tor_stats
aagbsn Apr 29, 2026
17514ef
add response model validation for /api/_/im_networks
aagbsn Apr 29, 2026
5fe4283
add response model descriptions for /api/_/im_stats
aagbsn Apr 29, 2026
d3cbbfc
add model description, pagination query parameters for /api/_/network…
aagbsn Apr 29, 2026
f84f051
let FastAPI generate response type from model
aagbsn Apr 29, 2026
553cc9a
add Field descriptions for FastAPI docs
aagbsn Apr 29, 2026
df5fef6
let FastAPI generate these response types docs
aagbsn Apr 29, 2026
c8fcf14
omint conint type; let FastAPI generate api response types
aagbsn Apr 29, 2026
9157dcc
remove deprecated Field example...
aagbsn Apr 29, 2026
8db3e45
fix default arg order
aagbsn Apr 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions ooniapi/services/ooniprobe/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ dependencies = [
"ujson ~= 5.9.0",
"urllib3 ~= 2.1.0",
"python-dateutil ~= 2.8.2",
"pycountry ~= 26.2.16",
"pydantic-settings ~= 2.1.0",
"pydantic_extra_types ~= 2.11.1",
"statsd ~= 4.0.1",
"uvicorn ~= 0.25.0",
"psycopg2 ~= 2.9.9",
Expand Down
273 changes: 273 additions & 0 deletions ooniapi/services/ooniprobe/src/ooniprobe/countries/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,273 @@
"""
CC to country name lookup table

Regenerate the dict with:

python3 ooniapi/countries/__init__.py

"""

_countries = {
"AD": "Andorra",
"AE": "United Arab Emirates",
"AF": "Afghanistan",
"AG": "Antigua & Barbuda",
"AI": "Anguilla",
"AL": "Albania",
"AM": "Armenia",
"AO": "Angola",
"AQ": "Antarctica",
"AR": "Argentina",
"AS": "American Samoa",
"AT": "Austria",
"AU": "Australia",
"AW": "Aruba",
"AX": "Åland Islands",
"AZ": "Azerbaijan",
"BA": "Bosnia",
"BB": "Barbados",
"BD": "Bangladesh",
"BE": "Belgium",
"BF": "Burkina Faso",
"BG": "Bulgaria",
"BH": "Bahrain",
"BI": "Burundi",
"BJ": "Benin",
"BL": "St. Barthélemy",
"BM": "Bermuda",
"BN": "Brunei",
"BO": "Bolivia",
"BQ": "Caribbean Netherlands",
"BR": "Brazil",
"BS": "Bahamas",
"BT": "Bhutan",
"BV": "Bouvet Island",
"BW": "Botswana",
"BY": "Belarus",
"BZ": "Belize",
"CA": "Canada",
"CC": "Cocos (Keeling) Islands",
"CD": "Congo - Kinshasa",
"CF": "Central African Republic",
"CG": "Congo - Brazzaville",
"CH": "Switzerland",
"CI": "Côte d’Ivoire",
"CK": "Cook Islands",
"CL": "Chile",
"CM": "Cameroon",
"CN": "China",
"CO": "Colombia",
"CR": "Costa Rica",
"CU": "Cuba",
"CV": "Cape Verde",
"CW": "Curaçao",
"CX": "Christmas Island",
"CY": "Cyprus",
"CZ": "Czechia",
"DE": "Germany",
"DJ": "Djibouti",
"DK": "Denmark",
"DM": "Dominica",
"DO": "Dominican Republic",
"DZ": "Algeria",
"EC": "Ecuador",
"EE": "Estonia",
"EG": "Egypt",
"EH": "Western Sahara",
"ER": "Eritrea",
"ES": "Spain",
"ET": "Ethiopia",
"FI": "Finland",
"FJ": "Fiji",
"FK": "Falkland Islands",
"FM": "Micronesia",
"FO": "Faroe Islands",
"FR": "France",
"GA": "Gabon",
"GB": "United Kingdom",
"GD": "Grenada",
"GE": "Georgia",
"GF": "French Guiana",
"GG": "Guernsey",
"GH": "Ghana",
"GI": "Gibraltar",
"GL": "Greenland",
"GM": "Gambia",
"GN": "Guinea",
"GP": "Guadeloupe",
"GQ": "Equatorial Guinea",
"GR": "Greece",
"GS": "South Georgia & South Sandwich Islands",
"GT": "Guatemala",
"GU": "Guam",
"GW": "Guinea-Bissau",
"GY": "Guyana",
"HK": "Hong Kong",
"HM": "Heard & McDonald Islands",
"HN": "Honduras",
"HR": "Croatia",
"HT": "Haiti",
"HU": "Hungary",
"ID": "Indonesia",
"IE": "Ireland",
"IL": "Israel",
"IM": "Isle of Man",
"IN": "India",
"IO": "British Indian Ocean Territory",
"IQ": "Iraq",
"IR": "Iran",
"IS": "Iceland",
"IT": "Italy",
"JE": "Jersey",
"JM": "Jamaica",
"JO": "Jordan",
"JP": "Japan",
"KE": "Kenya",
"KG": "Kyrgyzstan",
"KH": "Cambodia",
"KI": "Kiribati",
"KM": "Comoros",
"KN": "St. Kitts & Nevis",
"KP": "North Korea",
"KR": "South Korea",
"KW": "Kuwait",
"KY": "Cayman Islands",
"KZ": "Kazakhstan",
"LA": "Laos",
"LB": "Lebanon",
"LC": "St. Lucia",
"LI": "Liechtenstein",
"LK": "Sri Lanka",
"LR": "Liberia",
"LS": "Lesotho",
"LT": "Lithuania",
"LU": "Luxembourg",
"LV": "Latvia",
"LY": "Libya",
"MA": "Morocco",
"MC": "Monaco",
"MD": "Moldova",
"ME": "Montenegro",
"MF": "St. Martin",
"MG": "Madagascar",
"MH": "Marshall Islands",
"MK": "North Macedonia",
"ML": "Mali",
"MM": "Myanmar",
"MN": "Mongolia",
"MO": "Macao",
"MP": "Northern Mariana Islands",
"MQ": "Martinique",
"MR": "Mauritania",
"MS": "Montserrat",
"MT": "Malta",
"MU": "Mauritius",
"MV": "Maldives",
"MW": "Malawi",
"MX": "Mexico",
"MY": "Malaysia",
"MZ": "Mozambique",
"NA": "Namibia",
"NC": "New Caledonia",
"NE": "Niger",
"NF": "Norfolk Island",
"NG": "Nigeria",
"NI": "Nicaragua",
"NL": "Netherlands",
"NO": "Norway",
"NP": "Nepal",
"NR": "Nauru",
"NU": "Niue",
"NZ": "New Zealand",
"OM": "Oman",
"PA": "Panama",
"PE": "Peru",
"PF": "French Polynesia",
"PG": "Papua New Guinea",
"PH": "Philippines",
"PK": "Pakistan",
"PL": "Poland",
"PM": "St. Pierre & Miquelon",
"PN": "Pitcairn Islands",
"PR": "Puerto Rico",
"PS": "Palestine",
"PT": "Portugal",
"PW": "Palau",
"PY": "Paraguay",
"QA": "Qatar",
"RE": "Réunion",
"RO": "Romania",
"RS": "Serbia",
"RU": "Russia",
"RW": "Rwanda",
"SA": "Saudi Arabia",
"SB": "Solomon Islands",
"SC": "Seychelles",
"SD": "Sudan",
"SE": "Sweden",
"SG": "Singapore",
"SH": "St. Helena",
"SI": "Slovenia",
"SJ": "Svalbard & Jan Mayen",
"SK": "Slovakia",
"SL": "Sierra Leone",
"SM": "San Marino",
"SN": "Senegal",
"SO": "Somalia",
"SR": "Suriname",
"SS": "South Sudan",
"ST": "São Tomé & Príncipe",
"SV": "El Salvador",
"SX": "Sint Maarten",
"SY": "Syria",
"SZ": "Eswatini",
"TC": "Turks & Caicos Islands",
"TD": "Chad",
"TF": "French Southern Territories",
"TG": "Togo",
"TH": "Thailand",
"TJ": "Tajikistan",
"TK": "Tokelau",
"TL": "Timor-Leste",
"TM": "Turkmenistan",
"TN": "Tunisia",
"TO": "Tonga",
"TR": "Turkey",
"TT": "Trinidad & Tobago",
"TV": "Tuvalu",
"TW": "Taiwan",
"TZ": "Tanzania",
"UA": "Ukraine",
"UG": "Uganda",
"UM": "U.S. Outlying Islands",
"US": "United States",
"UY": "Uruguay",
"UZ": "Uzbekistan",
"VA": "Vatican City",
"VC": "St. Vincent & Grenadines",
"VE": "Venezuela",
"VG": "British Virgin Islands",
"VI": "U.S. Virgin Islands",
"VN": "Vietnam",
"VU": "Vanuatu",
"WF": "Wallis & Futuna",
"WS": "Samoa",
"YE": "Yemen",
"YT": "Mayotte",
"ZA": "South Africa",
"ZM": "Zambia",
"ZW": "Zimbabwe",
}


def lookup_country(probe_cc: str) -> str:
"""Translate 2-char country code into country name"""
return _countries[probe_cc.upper()]


if __name__ == "__main__":
import json

with open("ooniapi/countries/country-list.json") as f:
d = {e["iso3166_alpha2"].upper(): e["name"] for e in json.load(f)}
print(dict(sorted(d.items())))

Large diffs are not rendered by default.

56 changes: 56 additions & 0 deletions ooniapi/services/ooniprobe/src/ooniprobe/data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
dnscheck_inputs = [
"https://dns.google/dns-query",
"https://8.8.8.8/dns-query",
"dot://8.8.8.8:853/",
"dot://8.8.4.4:853/",
"https://8.8.4.4/dns-query",
"https://cloudflare-dns.com/dns-query",
"https://1.1.1.1/dns-query",
"https://1.0.0.1/dns-query",
"dot://1.1.1.1:853/",
"dot://1.0.0.1:853/",
"https://dns.quad9.net/dns-query",
"https://9.9.9.9/dns-query",
"dot://9.9.9.9:853/",
"dot://dns.quad9.net/",
"https://family.cloudflare-dns.com/dns-query",
"dot://family.cloudflare-dns.com/dns-query",
"https://dns11.quad9.net/dns-query",
"dot://dns11.quad9.net/dns-query",
"https://dns9.quad9.net/dns-query",
"dot://dns9.quad9.net/dns-query",
"https://dns12.quad9.net/dns-query",
"dot://dns12.quad9.net/dns-query",
"https://1dot1dot1dot1.cloudflare-dns.com/dns-query",
"dot://1dot1dot1dot1.cloudflare-dns.com/dns-query",
"https://dns.adguard.com/dns-query",
"dot://dns.adguard.com/dns-query",
"https://dns-family.adguard.com/dns-query",
"dot://dns-family.adguard.com/dns-query",
"https://dns.cloudflare.com/dns-query",
"https://adblock.doh.mullvad.net/dns-query",
"dot://adblock.doh.mullvad.net/dns-query",
"https://dns.alidns.com/dns-query",
"dot://dns.alidns.com/dns-query",
"https://doh.opendns.com/dns-query",
"https://dns.nextdns.io/dns-query",
"dot://dns.nextdns.io/dns-query",
"https://dns10.quad9.net/dns-query",
"dot://dns10.quad9.net/dns-query",
"https://security.cloudflare-dns.com/dns-query",
"dot://security.cloudflare-dns.com/dns-query",
"https://dns.switch.ch/dns-query",
"dot://dns.switch.ch/dns-query",
]
stunreachability_inputs = [
"stun://stun.voip.blackberry.com:3478",
"stun://stun.antisip.com:3478",
"stun://stun.bluesip.net:3478",
"stun://stun.dus.net:3478",
"stun://stun.epygi.com:3478",
"stun://stun.sonetel.com:3478",
"stun://stun.sonetel.net:3478",
"stun://stun.uls.co.za:3478",
"stun://stun.voipgate.com:3478",
"stun://stun.voys.nl:3478",
]
3 changes: 2 additions & 1 deletion ooniapi/services/ooniprobe/src/ooniprobe/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
from .common.version import get_build_label
from .dependencies import PostgresSessionDep, S3ClientDep, get_manifest
from .download_geoip import try_update
from .routers import bouncer, prio_crud, reports
from .routers import bouncer, prio_crud, reports, private
from .routers.v1 import probe_services
from .routers.v2 import vpn

Expand Down Expand Up @@ -92,6 +92,7 @@ def update_geoip_task():
app.include_router(reports.router)
app.include_router(bouncer.router)
app.include_router(prio_crud.router, prefix="/api")
app.include_router(private.router, prefix="/api")


@app.get("/version")
Expand Down
Loading
Loading