Add a CensorshipCircumventionError class that is raised if there's a requests exception connecting to the Tor API

This commit is contained in:
Miguel Jacq 2021-12-20 14:50:09 +11:00
parent 5d8300df10
commit a385e1ffed
No known key found for this signature in database
GPG Key ID: EEA4341C6D97A0B6

View File

@ -22,6 +22,12 @@ import requests
from .meek import MeekNotRunning from .meek import MeekNotRunning
class CensorshipCircumventionError(Exception):
"""
There was a problem connecting to the Tor CensorshipCircumvention API.
"""
class CensorshipCircumvention(object): class CensorshipCircumvention(object):
""" """
Connect to the Tor Moat APIs to retrieve censorship Connect to the Tor Moat APIs to retrieve censorship
@ -84,31 +90,34 @@ class CensorshipCircumvention(object):
if country: if country:
data = {"country": country} data = {"country": country}
r = requests.post( try:
endpoint, r = requests.post(
json=data, endpoint,
headers={"Content-Type": "application/vnd.api+json"}, json=data,
proxies=self.api_proxies, headers={"Content-Type": "application/vnd.api+json"},
) proxies=self.api_proxies,
if r.status_code != 200:
self.common.log(
"CensorshipCircumvention",
"censorship_obtain_map",
f"status_code={r.status_code}",
) )
return False if r.status_code != 200:
self.common.log(
"CensorshipCircumvention",
"censorship_obtain_map",
f"status_code={r.status_code}",
)
return False
result = r.json() result = r.json()
if "errors" in result: if "errors" in result:
self.common.log( self.common.log(
"CensorshipCircumvention", "CensorshipCircumvention",
"censorship_obtain_map", "censorship_obtain_map",
f"errors={result['errors']}", f"errors={result['errors']}",
) )
return False return False
return result return result
except requests.exceptions.RequestException as e:
raise CensorshipCircumventionError(e)
def request_settings(self, country=False, transports=False): def request_settings(self, country=False, transports=False):
""" """
@ -135,42 +144,45 @@ class CensorshipCircumvention(object):
data = {"country": country} data = {"country": country}
if transports: if transports:
data.append({"transports": transports}) data.append({"transports": transports})
r = requests.post( try:
endpoint, r = requests.post(
json=data, endpoint,
headers={"Content-Type": "application/vnd.api+json"}, json=data,
proxies=self.api_proxies, headers={"Content-Type": "application/vnd.api+json"},
) proxies=self.api_proxies,
if r.status_code != 200:
self.common.log(
"CensorshipCircumvention",
"censorship_obtain_settings",
f"status_code={r.status_code}",
) )
return False if r.status_code != 200:
self.common.log(
"CensorshipCircumvention",
"censorship_obtain_settings",
f"status_code={r.status_code}",
)
return False
result = r.json() result = r.json()
if "errors" in result: if "errors" in result:
self.common.log( self.common.log(
"CensorshipCircumvention", "CensorshipCircumvention",
"censorship_obtain_settings", "censorship_obtain_settings",
f"errors={result['errors']}", f"errors={result['errors']}",
) )
return False return False
# There are no settings - perhaps this country doesn't require censorship circumvention? # There are no settings - perhaps this country doesn't require censorship circumvention?
# This is not really an error, so we can just check if False and assume direct Tor # This is not really an error, so we can just check if False and assume direct Tor
# connection will work. # connection will work.
if not "settings" in result: if not "settings" in result:
self.common.log( self.common.log(
"CensorshipCircumvention", "CensorshipCircumvention",
"censorship_obtain_settings", "censorship_obtain_settings",
"No settings found for this country", "No settings found for this country",
) )
return False return False
return result return result
except requests.exceptions.RequestException as e:
raise CensorshipCircumventionError(e)
def request_builtin_bridges(self): def request_builtin_bridges(self):
""" """
@ -179,30 +191,33 @@ class CensorshipCircumvention(object):
if not self.api_proxies: if not self.api_proxies:
return False return False
endpoint = "https://bridges.torproject.org/moat/circumvention/builtin" endpoint = "https://bridges.torproject.org/moat/circumvention/builtin"
r = requests.post( try:
endpoint, r = requests.post(
headers={"Content-Type": "application/vnd.api+json"}, endpoint,
proxies=self.api_proxies, headers={"Content-Type": "application/vnd.api+json"},
) proxies=self.api_proxies,
if r.status_code != 200:
self.common.log(
"CensorshipCircumvention",
"censorship_obtain_builtin_bridges",
f"status_code={r.status_code}",
) )
return False if r.status_code != 200:
self.common.log(
"CensorshipCircumvention",
"censorship_obtain_builtin_bridges",
f"status_code={r.status_code}",
)
return False
result = r.json() result = r.json()
if "errors" in result: if "errors" in result:
self.common.log( self.common.log(
"CensorshipCircumvention", "CensorshipCircumvention",
"censorship_obtain_builtin_bridges", "censorship_obtain_builtin_bridges",
f"errors={result['errors']}", f"errors={result['errors']}",
) )
return False return False
return result return result
except requests.exceptions.RequestException as e:
raise CensorshipCircumventionError(e)
def save_settings(self, settings, bridge_settings): def save_settings(self, settings, bridge_settings):
""" """