From ee9fee4d6b4cfc0a190033ea804964d7a6becc6e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 17 Dec 2024 13:50:48 +0000 Subject: [PATCH] Implementing mitm detection --- announce.py | 24 ++-- availability.py | 7 +- blocking.py | 14 ++- bookmarks.py | 15 ++- cache.py | 5 +- conversation.py | 27 +++-- daemon.py | 7 +- daemon_get.py | 139 ++++++++++++++-------- daemon_get_buttons.py | 17 ++- daemon_get_buttons_announce.py | 11 +- daemon_get_buttons_bookmark.py | 14 ++- daemon_get_buttons_like.py | 14 ++- daemon_get_buttons_mute.py | 14 ++- daemon_get_buttons_reaction.py | 14 ++- daemon_get_feeds.py | 30 +++-- daemon_get_hashtag.py | 6 +- daemon_get_post.py | 58 ++++++---- daemon_get_profile.py | 18 ++- daemon_get_reactions.py | 6 +- daemon_get_timeline.py | 72 ++++++++---- daemon_post.py | 19 +-- daemon_post_confirm.py | 9 +- daemon_post_moderator.py | 6 +- daemon_post_person_options.py | 39 ++++--- daemon_post_profile.py | 18 +-- daemon_post_receive.py | 63 ++++++---- daemon_post_search.py | 42 ++++--- daemon_utils.py | 38 +----- delete.py | 7 +- desktop_client.py | 146 +++++++++++++++-------- epicyon.py | 171 +++++++++++++++++---------- follow.py | 55 +++++---- importFollowing.py | 3 +- inbox.py | 111 +++++++++++------- inbox_receive.py | 61 ++++++---- inbox_receive_undo.py | 18 ++- like.py | 26 +++-- manualapprove.py | 55 +++++---- migrate.py | 20 ++-- outbox.py | 15 ++- person.py | 15 ++- pgp.py | 30 +++-- posts.py | 206 ++++++++++++++++++++------------- reaction.py | 26 +++-- schedule.py | 3 +- securemode.py | 3 +- session.py | 52 ++++++--- shares.py | 60 ++++++---- skills.py | 7 +- socnet.py | 10 +- tests.py | 94 ++++++++++----- utils.py | 34 ++++++ webapp_confirm.py | 5 +- webapp_conversation.py | 8 +- webapp_create_post.py | 6 +- webapp_frontscreen.py | 12 +- webapp_likers.py | 6 +- webapp_moderation.py | 17 ++- webapp_podcast.py | 10 +- webapp_post.py | 67 +++++++---- webapp_profile.py | 62 ++++++---- webapp_search.py | 22 ++-- webapp_timeline.py | 67 +++++++---- webapp_utils.py | 10 +- webfinger.py | 9 +- 65 files changed, 1457 insertions(+), 818 deletions(-) diff --git a/announce.py b/announce.py index a658e3e62..d8d57eeb3 100644 --- a/announce.py +++ b/announce.py @@ -172,7 +172,8 @@ def create_announce(session, base_dir: str, federation_list: [], curr_domain: str, onion_domain: str, i2p_domain: str, sites_unavailable: [], - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Creates an announce message Typically to_url will be https://www.w3.org/ns/activitystreams#Public and cc_url might be a specific person favorited or repeated and the @@ -241,7 +242,7 @@ def create_announce(session, base_dir: str, federation_list: [], signing_priv_key_pem, 639633, curr_domain, onion_domain, i2p_domain, extra_headers, sites_unavailable, - system_language) + system_language, mitm_servers) return new_announce @@ -256,7 +257,8 @@ def announce_public(session, base_dir: str, federation_list: [], curr_domain: str, onion_domain: str, i2p_domain: str, sites_unavailable: [], - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Makes a public announcement """ from_domain = get_full_domain(domain, port) @@ -273,7 +275,7 @@ def announce_public(session, base_dir: str, federation_list: [], signing_priv_key_pem, curr_domain, onion_domain, i2p_domain, sites_unavailable, - system_language) + system_language, mitm_servers) def send_announce_via_server(base_dir: str, session, @@ -283,7 +285,8 @@ def send_announce_via_server(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Creates an announce message via c2s """ if not session: @@ -319,7 +322,7 @@ def send_announce_via_server(base_dir: str, session, wf_request = webfinger_handle(session, handle, http_prefix, cached_webfingers, from_domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: announce webfinger failed for ' + handle) @@ -341,7 +344,7 @@ def send_announce_via_server(base_dir: str, session, project_version, http_prefix, from_nickname, from_domain, post_to_box, 73528, - system_language) + system_language, mitm_servers) if not inbox_url: if debug: @@ -379,7 +382,8 @@ def send_undo_announce_via_server(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Undo an announce message via c2s """ if not session: @@ -407,7 +411,7 @@ def send_undo_announce_via_server(base_dir: str, session, wf_request = webfinger_handle(session, handle, http_prefix, cached_webfingers, domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: undo announce webfinger failed for ' + handle) @@ -429,7 +433,7 @@ def send_undo_announce_via_server(base_dir: str, session, project_version, http_prefix, nickname, domain, post_to_box, 73528, - system_language) + system_language, mitm_servers) if not inbox_url: if debug: diff --git a/availability.py b/availability.py index 856831384..1297bcbd6 100644 --- a/availability.py +++ b/availability.py @@ -90,7 +90,8 @@ def send_availability_via_server(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Sets the availability for a person via c2s """ if not session: @@ -116,7 +117,7 @@ def send_availability_via_server(base_dir: str, session, wf_request = webfinger_handle(session, handle, http_prefix, cached_webfingers, domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: availability webfinger failed for ' + handle) @@ -137,7 +138,7 @@ def send_availability_via_server(base_dir: str, session, person_cache, project_version, http_prefix, nickname, domain, post_to_box, 57262, - system_language) + system_language, mitm_servers) if not inbox_url: if debug: diff --git a/blocking.py b/blocking.py index eff3eef99..2b2607cf3 100644 --- a/blocking.py +++ b/blocking.py @@ -1867,7 +1867,8 @@ def get_blocks_via_server(session, nickname: str, password: str, domain: str, port: int, http_prefix: str, page_number: int, debug: bool, version: str, - signing_priv_key_pem: str) -> {}: + signing_priv_key_pem: str, + mitm_servers: []) -> {}: """Returns the blocked collection for shared items via c2s https://codeberg.org/fediverse/fep/src/branch/main/fep/c648/fep-c648.md """ @@ -1889,7 +1890,7 @@ def get_blocks_via_server(session, nickname: str, password: str, if debug: print('Blocked collection request to: ' + url) blocked_json = get_json(signing_priv_key_pem, session, url, headers, None, - debug, version, http_prefix, None) + debug, mitm_servers, version, http_prefix, None) if not get_json_valid(blocked_json): if debug: print('DEBUG: GET blocked collection failed for c2s to ' + url) @@ -2115,7 +2116,8 @@ def _update_federated_blocks(session, base_dir: str, domain: str, debug: bool, version: str, signing_priv_key_pem: str, - max_api_blocks: int) -> []: + max_api_blocks: int, + mitm_servers: []) -> []: """Creates block_api.txt """ block_federated = [] @@ -2144,7 +2146,8 @@ def _update_federated_blocks(session, base_dir: str, if debug: print('federated blocklist Block API endpoint: ' + url) blocked_json = get_json(signing_priv_key_pem, session, url, headers, - None, debug, version, http_prefix, domain) + None, debug, mitm_servers, + version, http_prefix, domain) if not get_json_valid(blocked_json): print('DEBUG: federated blocklist ' + 'GET blocked json failed ' + url) @@ -2277,5 +2280,6 @@ def run_federated_blocks_daemon(base_dir: str, httpd, debug: bool) -> None: httpd.domain, debug, httpd.project_version, httpd.signing_priv_key_pem, - httpd.max_api_blocks) + httpd.max_api_blocks, + httpd.mitm_servers) time.sleep(seconds_per_hour * 6) diff --git a/bookmarks.py b/bookmarks.py index beec5fa56..f815308fd 100644 --- a/bookmarks.py +++ b/bookmarks.py @@ -394,7 +394,8 @@ def send_bookmark_via_server(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Creates a bookmark via c2s """ if not session: @@ -428,7 +429,7 @@ def send_bookmark_via_server(base_dir: str, session, webfinger_handle(session, handle, http_prefix, cached_webfingers, domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: bookmark webfinger failed for ' + handle) @@ -450,7 +451,7 @@ def send_bookmark_via_server(base_dir: str, session, project_version, http_prefix, nickname, domain, post_to_box, 58391, - system_language) + system_language, mitm_servers) if not inbox_url: if debug: @@ -490,7 +491,8 @@ def send_undo_bookmark_via_server(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Removes a bookmark via c2s """ if not session: @@ -524,7 +526,7 @@ def send_undo_bookmark_via_server(base_dir: str, session, webfinger_handle(session, handle, http_prefix, cached_webfingers, domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: unbookmark webfinger failed for ' + handle) @@ -546,7 +548,8 @@ def send_undo_bookmark_via_server(base_dir: str, session, project_version, http_prefix, nickname, domain, post_to_box, 52594, - system_language) + system_language, + mitm_servers) if not inbox_url: if debug: diff --git a/cache.py b/cache.py index 1497a9d87..e2e60effe 100644 --- a/cache.py +++ b/cache.py @@ -208,7 +208,8 @@ def get_person_pub_key(base_dir: str, session, person_url: str, project_version: str, http_prefix: str, domain: str, onion_domain: str, i2p_domain: str, - signing_priv_key_pem: str) -> str: + signing_priv_key_pem: str, + mitm_servers: []) -> str: """Get the public key for an actor """ original_person_url = person_url @@ -249,7 +250,7 @@ def get_person_pub_key(base_dir: str, session, person_url: str, person_json = \ get_json(signing_priv_key_pem, session, person_url, as_header, None, debug, - project_version, http_prefix, person_domain) + mitm_servers, project_version, http_prefix, person_domain) if not get_json_valid(person_json): if person_json is not None: if isinstance(person_json, dict): diff --git a/conversation.py b/conversation.py index 4c4f56d83..a6f9e4de9 100644 --- a/conversation.py +++ b/conversation.py @@ -131,7 +131,8 @@ def _get_replies_to_post(post_json_object: {}, session, as_header, debug: bool, http_prefix: str, base_dir: str, nickname: str, - domain: str, depth: int, ids: []) -> []: + domain: str, depth: int, ids: [], + mitm_servers: []) -> []: """Returns a list of reply posts to the given post as json """ result = [] @@ -156,7 +157,7 @@ def _get_replies_to_post(post_json_object: {}, replies_collection = \ get_json(signing_priv_key_pem, session, replies_collection_id, - as_header, None, debug, __version__, + as_header, None, debug, mitm_servers, __version__, http_prefix, domain) if not get_json_valid(replies_collection): return result @@ -183,7 +184,7 @@ def _get_replies_to_post(post_json_object: {}, return result replies_collection = \ get_json(signing_priv_key_pem, session, next_page_id, - as_header, None, debug, __version__, + as_header, None, debug, mitm_servers, __version__, http_prefix, domain) if debug: print('DEBUG: get_replies_to_post next replies_collection ' + @@ -212,8 +213,8 @@ def _get_replies_to_post(post_json_object: {}, print('Downloading conversation item ' + item) item_dict = \ get_json(signing_priv_key_pem, session, item, - as_header, None, debug, __version__, - http_prefix, domain) + as_header, None, debug, mitm_servers, + __version__, http_prefix, domain) if not get_json_valid(item_dict): continue item = item_dict @@ -283,14 +284,16 @@ def _get_replies_to_post(post_json_object: {}, debug, http_prefix, base_dir, nickname, domain, - depth + 1, ids) + depth + 1, ids, + mitm_servers) return result def download_conversation_posts(authorized: bool, session, http_prefix: str, base_dir: str, nickname: str, domain: str, - post_id: str, debug: bool) -> []: + post_id: str, debug: bool, + mitm_servers: []) -> []: """Downloads all posts for a conversation and returns a list of the json objects """ @@ -312,8 +315,8 @@ def download_conversation_posts(authorized: bool, session, else: post_json_object = \ get_json(signing_priv_key_pem, session, post_id, - as_header, None, debug, __version__, - http_prefix, domain) + as_header, None, debug, mitm_servers, + __version__, http_prefix, domain) if debug: if not get_json_valid(post_json_object): print(post_id + ' returned no json') @@ -330,7 +333,7 @@ def download_conversation_posts(authorized: bool, session, signing_priv_key_pem, session, as_header, debug, http_prefix, base_dir, nickname, - domain, 0, []) + domain, 0, [], mitm_servers) ids = [] while get_json_valid(post_json_object): @@ -418,8 +421,8 @@ def download_conversation_posts(authorized: bool, session, if authorized: post_json_object = \ get_json(signing_priv_key_pem, session, post_id, - as_header, None, debug, __version__, - http_prefix, domain) + as_header, None, debug, mitm_servers, + __version__, http_prefix, domain) if debug: if get_json_valid(post_json_object): diff --git a/daemon.py b/daemon.py index cd0504f56..25a69e13d 100644 --- a/daemon.py +++ b/daemon.py @@ -481,6 +481,7 @@ class EpicyonServer(ThreadingHTTPServer): instance_description_short = 'Epicyon' robots_txt = None last_llm_time = None + mitm_servers = [] watermark_width_percent = 0 watermark_position = 0 watermark_opacity = 0 @@ -710,6 +711,9 @@ def run_daemon(accounts_data_dir: str, # the last time when an LLM scraper was replied to httpd.last_llm_time = None + # servers with man-in-the-middle transport encryption + httpd.mitm_servers = [] + # default "searchable by" for new posts for each account httpd.searchable_by_default = load_searchable_by_default(base_dir) @@ -1362,7 +1366,8 @@ def run_daemon(accounts_data_dir: str, args=(base_dir, httpd, http_prefix, httpd.domain_full, proxy_type, debug, - httpd.system_language), daemon=True) + httpd.system_language, + httpd.mitm_servers), daemon=True) # flags used when restarting the inbox queue httpd.restart_inbox_queue_in_progress = False diff --git a/daemon_get.py b/daemon_get.py index 0a67367c5..bdea455ab 100644 --- a/daemon_get.py +++ b/daemon_get.py @@ -63,7 +63,6 @@ from fitnessFunctions import html_watch_points_graph from session import establish_session from session import get_session_for_domains from crawlers import blocked_user_agent -from daemon_utils import detect_mitm from daemon_utils import etag_exists from daemon_utils import has_accept from daemon_utils import show_person_options @@ -115,6 +114,7 @@ from utils import get_json_content_from_accept from utils import check_bad_path from utils import corp_servers from utils import decoded_host +from utils import detect_mitm from person import get_person_notes_endpoint from person import get_account_pub_key from shares import actor_attached_shares @@ -753,7 +753,8 @@ def daemon_http_get(self) -> None: self.server.blocked_cache, self.server.block_federated, self.server.auto_cw_cache, - self.server.default_timeline): + self.server.default_timeline, + self.server.mitm_servers): fitness_performance(getreq_start_time, self.server.fitness, '_GET', '_show_conversation_thread', self.server.debug) @@ -1676,7 +1677,8 @@ def daemon_http_get(self) -> None: self.server.session_onion, self.server.session_i2p, self.server.http_prefix, - self.server.debug) + self.server.debug, + self.server.mitm_servers) if html_str: msg = html_str.encode('utf-8') msglen = len(msg) @@ -3057,7 +3059,8 @@ def daemon_http_get(self) -> None: self.server.min_images_for_accounts, self.server.debug, self.server.buy_sites, - self.server.auto_cw_cache) + self.server.auto_cw_cache, + self.server.mitm_servers) if msg: msg = msg.encode('utf-8') msglen = len(msg) @@ -3160,7 +3163,7 @@ def daemon_http_get(self) -> None: self.server.min_images_for_accounts, self.server.buy_sites, self.server.auto_cw_cache, - ua_str) + ua_str, self.server.mitm_servers) self.server.getreq_busy = False return @@ -3470,7 +3473,8 @@ def daemon_http_get(self) -> None: self.server.bold_reading, self.server.min_images_for_accounts, self.server.session_onion, - self.server.session_i2p) + self.server.session_i2p, + self.server.mitm_servers) self.server.getreq_busy = False return @@ -3572,7 +3576,8 @@ def daemon_http_get(self) -> None: self.server.followers_sync_cache, self.server.session_onion, self.server.session_i2p, - self.server.session) + self.server.session, + self.server.mitm_servers) self.server.getreq_busy = False return @@ -3607,7 +3612,8 @@ def daemon_http_get(self) -> None: self.server.fitness, self.server.session, self.server.session_onion, - self.server.session_i2p) + self.server.session_i2p, + self.server.mitm_servers) self.server.getreq_busy = False return @@ -3657,7 +3663,8 @@ def daemon_http_get(self) -> None: self.server.bold_reading, self.server.min_images_for_accounts, self.server.session_onion, - self.server.session_i2p) + self.server.session_i2p, + self.server.mitm_servers) self.server.getreq_busy = False return @@ -3706,7 +3713,8 @@ def daemon_http_get(self) -> None: self.server.min_images_for_accounts, self.server.iconsCache, self.server.session_onion, - self.server.session_i2p) + self.server.session_i2p, + self.server.mitm_servers) self.server.getreq_busy = False return @@ -3757,7 +3765,8 @@ def daemon_http_get(self) -> None: self.server.bold_reading, self.server.min_images_for_accounts, self.server.session_onion, - self.server.session_i2p) + self.server.session_i2p, + self.server.mitm_servers) self.server.getreq_busy = False return @@ -3807,7 +3816,8 @@ def daemon_http_get(self) -> None: self.server.bold_reading, self.server.min_images_for_accounts, self.server.session_onion, - self.server.session_i2p) + self.server.session_i2p, + self.server.mitm_servers) self.server.getreq_busy = False return @@ -3857,7 +3867,8 @@ def daemon_http_get(self) -> None: self.server.bold_reading, self.server.min_images_for_accounts, self.server.session_onion, - self.server.session_i2p) + self.server.session_i2p, + self.server.mitm_servers) self.server.getreq_busy = False return @@ -3901,7 +3912,8 @@ def daemon_http_get(self) -> None: self.server.auto_cw_cache, self.server.account_timezone, self.server.bold_reading, - self.server.fitness) + self.server.fitness, + self.server.mitm_servers) self.server.getreq_busy = False return @@ -3951,7 +3963,8 @@ def daemon_http_get(self) -> None: self.server.bold_reading, self.server.min_images_for_accounts, self.server.session_onion, - self.server.session_i2p) + self.server.session_i2p, + self.server.mitm_servers) self.server.getreq_busy = False return @@ -3996,7 +4009,8 @@ def daemon_http_get(self) -> None: self.server.allow_deletion, self.server.session_onion, self.server.session_i2p, - self.server.default_timeline) + self.server.default_timeline, + self.server.mitm_servers) self.server.getreq_busy = False return @@ -4042,7 +4056,8 @@ def daemon_http_get(self) -> None: self.server.account_timezone, self.server.bold_reading, self.server.min_images_for_accounts, - self.server.default_timeline) + self.server.default_timeline, + self.server.mitm_servers) self.server.getreq_busy = False return @@ -4088,7 +4103,8 @@ def daemon_http_get(self) -> None: self.server.account_timezone, self.server.bold_reading, self.server.min_images_for_accounts, - self.server.default_timeline) + self.server.default_timeline, + self.server.mitm_servers) self.server.getreq_busy = False return @@ -4437,7 +4453,8 @@ def daemon_http_get(self) -> None: self.server.min_images_for_accounts, self.server.buy_sites, self.server.auto_cw_cache, - self.server.searchable_by_default): + self.server.searchable_by_default, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -4483,7 +4500,8 @@ def daemon_http_get(self) -> None: self.server.auto_cw_cache, self.server.onion_domain, self.server.i2p_domain, - self.server.bold_reading): + self.server.bold_reading, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -4521,7 +4539,8 @@ def daemon_http_get(self) -> None: self.server.min_images_for_accounts, self.server.buy_sites, self.server.auto_cw_cache, - self.server.fitness): + self.server.fitness, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -4559,7 +4578,8 @@ def daemon_http_get(self) -> None: self.server.min_images_for_accounts, self.server.buy_sites, self.server.auto_cw_cache, - self.server.fitness): + self.server.fitness, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -4607,7 +4627,8 @@ def daemon_http_get(self) -> None: self.server.auto_cw_cache, self.server.fitness, self.server.onion_domain, - self.server.i2p_domain): + self.server.i2p_domain, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -4663,7 +4684,8 @@ def daemon_http_get(self) -> None: self.server.auto_cw_cache, self.server.fitness, self.server.onion_domain, - self.server.i2p_domain): + self.server.i2p_domain, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -4720,7 +4742,8 @@ def daemon_http_get(self) -> None: self.server.fitness, self.server.domain_full, self.server.onion_domain, - self.server.i2p_domain): + self.server.i2p_domain, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -4765,7 +4788,8 @@ def daemon_http_get(self) -> None: self.server.auto_cw_cache, self.server.onion_domain, self.server.i2p_domain, - self.server.bold_reading): + self.server.bold_reading, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -4809,7 +4833,8 @@ def daemon_http_get(self) -> None: self.server.buy_sites, self.server.auto_cw_cache, self.server.onion_domain, - self.server.i2p_domain): + self.server.i2p_domain, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -4871,7 +4896,8 @@ def daemon_http_get(self) -> None: self.server.auto_cw_cache, self.server.onion_domain, self.server.i2p_domain, - self.server.hide_announces): + self.server.hide_announces, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -4931,7 +4957,8 @@ def daemon_http_get(self) -> None: self.server.auto_cw_cache, self.server.fitness, self.server.onion_domain, - self.server.i2p_domain): + self.server.i2p_domain, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -4991,7 +5018,8 @@ def daemon_http_get(self) -> None: self.server.auto_cw_cache, self.server.fitness, self.server.onion_domain, - self.server.i2p_domain): + self.server.i2p_domain, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -5053,7 +5081,8 @@ def daemon_http_get(self) -> None: self.server.full_width_tl_button_header, self.server.onion_domain, self.server.i2p_domain, - self.server.hide_announces): + self.server.hide_announces, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -5114,7 +5143,8 @@ def daemon_http_get(self) -> None: self.server.auto_cw_cache, self.server.fitness, self.server.onion_domain, - self.server.i2p_domain): + self.server.i2p_domain, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -5176,7 +5206,8 @@ def daemon_http_get(self) -> None: self.server.auto_cw_cache, self.server.fitness, self.server.onion_domain, - self.server.i2p_domain): + self.server.i2p_domain, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -5235,7 +5266,8 @@ def daemon_http_get(self) -> None: self.server.auto_cw_cache, self.server.fitness, self.server.onion_domain, - self.server.i2p_domain): + self.server.i2p_domain, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -5292,7 +5324,8 @@ def daemon_http_get(self) -> None: self.server.min_images_for_accounts, self.server.buy_sites, self.server.auto_cw_cache, - self.server.fitness): + self.server.fitness, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -5345,7 +5378,8 @@ def daemon_http_get(self) -> None: self.server.min_images_for_accounts, self.server.buy_sites, self.server.auto_cw_cache, - self.server.fitness): + self.server.fitness, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -5387,7 +5421,8 @@ def daemon_http_get(self) -> None: self.server.system_language, self.server.signing_priv_key_pem, None, - self.server.block_federated) + self.server.block_federated, + self.server.mitm_servers) if msg: msg = msg.encode('utf-8') msglen = len(msg) @@ -5429,7 +5464,8 @@ def daemon_http_get(self) -> None: self.server.system_language, self.server.signing_priv_key_pem, None, - self.server.block_federated) + self.server.block_federated, + self.server.mitm_servers) if msg: msg = msg.encode('utf-8') msglen = len(msg) @@ -5495,7 +5531,8 @@ def daemon_http_get(self) -> None: self.server.auto_cw_cache, self.server.fitness, self.server.onion_domain, - self.server.i2p_domain): + self.server.i2p_domain, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -5559,7 +5596,8 @@ def daemon_http_get(self) -> None: self.server.fitness, self.server.onion_domain, self.server.i2p_domain, - self.server.hide_announces): + self.server.hide_announces, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -5620,7 +5658,8 @@ def daemon_http_get(self) -> None: self.server.auto_cw_cache, self.server.fitness, self.server.onion_domain, - self.server.i2p_domain): + self.server.i2p_domain, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -5676,7 +5715,8 @@ def daemon_http_get(self) -> None: self.server.auto_cw_cache, self.server.fitness, self.server.onion_domain, - self.server.i2p_domain): + self.server.i2p_domain, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -5733,7 +5773,8 @@ def daemon_http_get(self) -> None: self.server.auto_cw_cache, self.server.fitness, self.server.onion_domain, - self.server.i2p_domain): + self.server.i2p_domain, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -5789,7 +5830,8 @@ def daemon_http_get(self) -> None: self.server.auto_cw_cache, self.server.fitness, self.server.onion_domain, - self.server.i2p_domain): + self.server.i2p_domain, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -5846,7 +5888,8 @@ def daemon_http_get(self) -> None: self.server.auto_cw_cache, self.server.fitness, self.server.onion_domain, - self.server.i2p_domain): + self.server.i2p_domain, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -5903,7 +5946,8 @@ def daemon_http_get(self) -> None: self.server.auto_cw_cache, self.server.fitness, self.server.onion_domain, - self.server.i2p_domain): + self.server.i2p_domain, + self.server.mitm_servers): self.server.getreq_busy = False return @@ -5959,7 +6003,8 @@ def daemon_http_get(self) -> None: self.server.content_license_url, self.server.buy_sites, self.server.no_of_books, - self.server.auto_cw_cache): + self.server.auto_cw_cache, + self.server.mitm_servers): self.server.getreq_busy = False return diff --git a/daemon_get_buttons.py b/daemon_get_buttons.py index 9173d15ce..c642e8b9e 100644 --- a/daemon_get_buttons.py +++ b/daemon_get_buttons.py @@ -44,7 +44,7 @@ def follow_approve_button(self, calling_domain: str, path: str, signing_priv_key_pem: str, followers_sync_cache: {}, session_onion, session_i2p, - session) -> None: + session, mitm_servers: []) -> None: """Follow approve button was pressed """ origin_path_str = path.split('/followapprove=')[0] @@ -101,7 +101,8 @@ def follow_approve_button(self, calling_domain: str, path: str, proxy_type, followers_sync_cache, sites_unavailable, - system_language) + system_language, + mitm_servers) origin_path_str_absolute = \ http_prefix + '://' + domain_full + origin_path_str if calling_domain.endswith('.onion') and onion_domain: @@ -133,7 +134,8 @@ def follow_deny_button(self, calling_domain: str, path: str, sites_unavailable: [], system_language: str, fitness: {}, - session, session_onion, session_i2p) -> None: + session, session_onion, session_i2p, + mitm_servers: []) -> None: """Follow deny button was pressed """ origin_path_str = path.split('/followdeny=')[0] @@ -169,7 +171,8 @@ def follow_deny_button(self, calling_domain: str, path: str, signing_priv_key_pem, followers_sync_cache, sites_unavailable, - system_language) + system_language, + mitm_servers) origin_path_str_absolute = \ http_prefix + '://' + domain_full + origin_path_str if calling_domain.endswith('.onion') and onion_domain: @@ -217,7 +220,8 @@ def delete_button(self, calling_domain: str, path: str, allow_deletion: bool, session_onion, session_i2p, - default_timeline: str) -> None: + default_timeline: str, + mitm_servers: []) -> None: """Delete button is pressed on a post """ if not cookie: @@ -311,7 +315,8 @@ def delete_button(self, calling_domain: str, path: str, dogwhistles, min_images_for_accounts, buy_sites, - auto_cw_cache) + auto_cw_cache, + mitm_servers) if delete_str: delete_str_len = len(delete_str) set_headers(self, 'text/html', delete_str_len, diff --git a/daemon_get_buttons_announce.py b/daemon_get_buttons_announce.py index 045ac28f5..25576f75a 100644 --- a/daemon_get_buttons_announce.py +++ b/daemon_get_buttons_announce.py @@ -18,13 +18,13 @@ from utils import remove_id_ending from utils import local_actor_url from utils import get_nickname_from_actor from utils import get_instance_url +from utils import detect_mitm from httpheaders import redirect_headers from session import establish_session from httpcodes import http_404 from announce import create_announce from posts import save_post_to_box from daemon_utils import post_to_outbox -from daemon_utils import detect_mitm from fitnessFunctions import fitness_performance from follow import follower_approval_active from webapp_post import individual_post_as_html @@ -69,7 +69,8 @@ def announce_button(self, calling_domain: str, path: str, account_timezone: {}, bold_reading_nicknames: {}, min_images_for_accounts: int, - session_onion, session_i2p) -> None: + session_onion, session_i2p, + mitm_servers: []) -> None: """The announce/repeat button was pressed on a post """ page_number = 1 @@ -167,7 +168,8 @@ def announce_button(self, calling_domain: str, path: str, domain, onion_domain, i2p_domain, sites_unavailable, - system_language) + system_language, + mitm_servers) announce_filename = None if announce_json: # save the announce straight to the outbox @@ -258,7 +260,8 @@ def announce_button(self, calling_domain: str, path: str, dogwhistles, minimize_all_images, None, buy_sites, - auto_cw_cache) + auto_cw_cache, + mitm_servers) actor_absolute = \ get_instance_url(calling_domain, diff --git a/daemon_get_buttons_bookmark.py b/daemon_get_buttons_bookmark.py index 20a80ac83..e064e8e81 100644 --- a/daemon_get_buttons_bookmark.py +++ b/daemon_get_buttons_bookmark.py @@ -17,6 +17,7 @@ from utils import is_dm from utils import get_nickname_from_actor from utils import get_instance_url from utils import local_actor_url +from utils import detect_mitm from session import establish_session from httpheaders import redirect_headers from httpcodes import http_404 @@ -25,7 +26,6 @@ from bookmarks import undo_bookmark_post from follow import follower_approval_active from webapp_post import individual_post_as_html from fitnessFunctions import fitness_performance -from daemon_utils import detect_mitm def bookmark_button(self, calling_domain: str, path: str, @@ -64,7 +64,8 @@ def bookmark_button(self, calling_domain: str, path: str, bold_reading_nicknames: {}, min_images_for_accounts: [], session_onion, - session_i2p) -> None: + session_i2p, + mitm_servers: []) -> None: """Bookmark button was pressed """ page_number = 1 @@ -214,7 +215,8 @@ def bookmark_button(self, calling_domain: str, path: str, dogwhistles, minimize_all_images, None, buy_sites, - auto_cw_cache) + auto_cw_cache, + mitm_servers) else: print('WARN: Bookmarked post not found: ' + bookmark_filename) actor_absolute = \ @@ -272,7 +274,8 @@ def bookmark_button_undo(self, calling_domain: str, path: str, bold_reading_nicknames: {}, min_images_for_accounts: [], session_onion, - session_i2p) -> None: + session_i2p, + mitm_servers: []) -> None: """Button pressed to undo a bookmark """ page_number = 1 @@ -421,7 +424,8 @@ def bookmark_button_undo(self, calling_domain: str, path: str, dogwhistles, minimize_all_images, None, buy_sites, - auto_cw_cache) + auto_cw_cache, + mitm_servers) else: print('WARN: Unbookmarked post not found: ' + bookmark_filename) diff --git a/daemon_get_buttons_like.py b/daemon_get_buttons_like.py index 72d4467bc..0beefe930 100644 --- a/daemon_get_buttons_like.py +++ b/daemon_get_buttons_like.py @@ -18,6 +18,7 @@ from utils import locate_post from utils import local_actor_url from utils import get_nickname_from_actor from utils import get_instance_url +from utils import detect_mitm from daemon_utils import post_to_outbox from follow import follower_approval_active from httpheaders import redirect_headers @@ -27,7 +28,6 @@ from posts import get_original_post_from_announce_url from fitnessFunctions import fitness_performance from like import update_likes_collection from webapp_post import individual_post_as_html -from daemon_utils import detect_mitm def like_button(self, calling_domain: str, path: str, @@ -66,7 +66,8 @@ def like_button(self, calling_domain: str, path: str, bold_reading_nicknames: {}, min_images_for_accounts: [], session_onion, - session_i2p) -> None: + session_i2p, + mitm_servers: []) -> None: """Press the like button """ page_number = 1 @@ -261,7 +262,8 @@ def like_button(self, calling_domain: str, path: str, dogwhistles, minimize_all_images, None, buy_sites, - auto_cw_cache) + auto_cw_cache, + mitm_servers) else: print('WARN: Liked post not found: ' + liked_post_filename) # clear the icon from the cache so that it gets updated @@ -326,7 +328,8 @@ def like_button_undo(self, calling_domain: str, path: str, min_images_for_accounts: [], icons_cache: {}, session_onion, - session_i2p) -> None: + session_i2p, + mitm_servers: []) -> None: """A button is pressed to undo """ page_number = 1 @@ -512,7 +515,8 @@ def like_button_undo(self, calling_domain: str, path: str, dogwhistles, minimize_all_images, None, buy_sites, - auto_cw_cache) + auto_cw_cache, + mitm_servers) else: print('WARN: Unliked post not found: ' + liked_post_filename) # clear the icon from the cache so that it gets updated diff --git a/daemon_get_buttons_mute.py b/daemon_get_buttons_mute.py index 5a4cece60..8a77af59d 100644 --- a/daemon_get_buttons_mute.py +++ b/daemon_get_buttons_mute.py @@ -15,6 +15,7 @@ from utils import get_cached_post_filename from utils import load_json from utils import locate_post from utils import get_nickname_from_actor +from utils import detect_mitm from httpcodes import http_404 from httpheaders import redirect_headers from blocking import unmute_post @@ -22,7 +23,6 @@ from blocking import mute_post from follow import follower_approval_active from webapp_post import individual_post_as_html from fitnessFunctions import fitness_performance -from daemon_utils import detect_mitm def mute_button(self, calling_domain: str, path: str, @@ -56,7 +56,8 @@ def mute_button(self, calling_domain: str, path: str, account_timezone: {}, bold_reading_nicknames: {}, min_images_for_accounts: [], - default_timeline: str) -> None: + default_timeline: str, + mitm_servers: []) -> None: """Mute button is pressed """ mute_url = path.split('?mute=')[1] @@ -177,7 +178,8 @@ def mute_button(self, calling_domain: str, path: str, dogwhistles, minimize_all_images, None, buy_sites, - auto_cw_cache) + auto_cw_cache, + mitm_servers) else: print('WARN: Muted post not found: ' + mute_filename) @@ -230,7 +232,8 @@ def mute_button_undo(self, calling_domain: str, path: str, account_timezone: {}, bold_reading_nicknames: {}, min_images_for_accounts: [], - default_timeline: str) -> None: + default_timeline: str, + mitm_servers: []) -> None: """Undo mute button is pressed """ mute_url = path.split('?unmute=')[1] @@ -351,7 +354,8 @@ def mute_button_undo(self, calling_domain: str, path: str, dogwhistles, minimize_all_images, None, buy_sites, - auto_cw_cache) + auto_cw_cache, + mitm_servers) else: print('WARN: Unmuted post not found: ' + mute_filename) if calling_domain.endswith('.onion') and onion_domain: diff --git a/daemon_get_buttons_reaction.py b/daemon_get_buttons_reaction.py index 5f280ed87..30f7a66a8 100644 --- a/daemon_get_buttons_reaction.py +++ b/daemon_get_buttons_reaction.py @@ -19,12 +19,12 @@ from utils import is_dm from utils import local_actor_url from utils import get_instance_url from utils import get_nickname_from_actor +from utils import detect_mitm from httpheaders import redirect_headers from session import establish_session from httpcodes import http_404 from posts import get_original_post_from_announce_url from daemon_utils import post_to_outbox -from daemon_utils import detect_mitm from fitnessFunctions import fitness_performance from reaction import update_reaction_collection from follow import follower_approval_active @@ -65,7 +65,8 @@ def reaction_button(self, calling_domain: str, path: str, account_timezone: {}, bold_reading_nicknames: {}, min_images_for_accounts: [], - session_onion, session_i2p) -> None: + session_onion, session_i2p, + mitm_servers: []) -> None: """Press an emoji reaction button Note that this is not the emoji reaction selection icon at the bottom of the post @@ -290,7 +291,8 @@ def reaction_button(self, calling_domain: str, path: str, dogwhistles, minimize_all_images, None, buy_sites, - auto_cw_cache) + auto_cw_cache, + mitm_servers) else: print('WARN: Emoji reaction post not found: ' + reaction_post_filename) @@ -352,7 +354,8 @@ def reaction_button_undo(self, calling_domain: str, path: str, bold_reading_nicknames: {}, min_images_for_accounts: [], session_onion, - session_i2p) -> None: + session_i2p, + mitm_servers: []) -> None: """A button is pressed to undo emoji reaction """ page_number = 1 @@ -563,7 +566,8 @@ def reaction_button_undo(self, calling_domain: str, path: str, dogwhistles, minimize_all_images, None, buy_sites, - auto_cw_cache) + auto_cw_cache, + mitm_servers) else: print('WARN: Unreaction post not found: ' + reaction_post_filename) diff --git a/daemon_get_feeds.py b/daemon_get_feeds.py index 375f807ee..9a4dd9140 100644 --- a/daemon_get_feeds.py +++ b/daemon_get_feeds.py @@ -69,7 +69,8 @@ def show_shares_feed(self, authorized: bool, auto_cw_cache: {}, fitness: {}, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """Shows the shares feed for a particular account/actor """ shares = \ @@ -169,7 +170,8 @@ def show_shares_feed(self, authorized: bool, sites_unavailable, no_of_books, auto_cw_cache, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) msg = msg.encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, @@ -251,7 +253,8 @@ def show_following_feed(self, authorized: bool, auto_cw_cache: {}, fitness: {}, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """Shows the following feed for a particular account/actor """ following = \ @@ -358,7 +361,8 @@ def show_following_feed(self, authorized: bool, sites_unavailable, no_of_books, auto_cw_cache, - known_epicyon_instances).encode('utf-8') + known_epicyon_instances, + mitm_servers).encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, cookie, calling_domain, False) @@ -446,7 +450,8 @@ def show_moved_feed(self, authorized: bool, auto_cw_cache: {}, fitness: {}, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """Shows the moved feed for a particular account/actor """ following = \ @@ -548,7 +553,8 @@ def show_moved_feed(self, authorized: bool, sites_unavailable, no_of_books, auto_cw_cache, - known_epicyon_instances).encode('utf-8') + known_epicyon_instances, + mitm_servers).encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, cookie, calling_domain, False) @@ -628,7 +634,8 @@ def show_inactive_feed(self, authorized: bool, auto_cw_cache: {}, fitness: {}, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """Shows the inactive accounts feed for a particular account/actor """ following = \ @@ -731,7 +738,8 @@ def show_inactive_feed(self, authorized: bool, sites_unavailable, no_of_books, auto_cw_cache, - known_epicyon_instances).encode('utf-8') + known_epicyon_instances, + mitm_servers).encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, cookie, calling_domain, False) @@ -813,7 +821,8 @@ def show_followers_feed(self, authorized: bool, auto_cw_cache: {}, fitness: {}, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """Shows the followers feed for a particular account/actor """ followers = \ @@ -917,7 +926,8 @@ def show_followers_feed(self, authorized: bool, sites_unavailable, no_of_books, auto_cw_cache, - known_epicyon_instances).encode('utf-8') + known_epicyon_instances, + mitm_servers).encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, cookie, calling_domain, False) diff --git a/daemon_get_hashtag.py b/daemon_get_hashtag.py index 182c58267..23f826025 100644 --- a/daemon_get_hashtag.py +++ b/daemon_get_hashtag.py @@ -169,7 +169,8 @@ def hashtag_search2(self, calling_domain: str, min_images_for_accounts: [], buy_sites: [], auto_cw_cache: {}, - ua_str: str) -> None: + ua_str: str, + mitm_servers: []) -> None: """Return the result of a hashtag search """ page_number = 1 @@ -236,7 +237,8 @@ def hashtag_search2(self, calling_domain: str, 'search', min_images_for_accounts, buy_sites, - auto_cw_cache, ua_str) + auto_cw_cache, ua_str, + mitm_servers) if hashtag_str: msg = hashtag_str.encode('utf-8') msglen = len(msg) diff --git a/daemon_get_post.py b/daemon_get_post.py index d44eee7cd..68a6dea09 100644 --- a/daemon_get_post.py +++ b/daemon_get_post.py @@ -25,6 +25,7 @@ from utils import get_json_content_from_accept from utils import convert_domains from utils import has_object_dict from utils import load_json +from utils import detect_mitm from session import establish_session from languages import get_understood_languages from languages import get_reply_language @@ -47,7 +48,6 @@ from fitnessFunctions import fitness_performance from securemode import secure_mode from context import get_individual_post_context from conversation import convthread_id_to_conversation_tag -from daemon_utils import detect_mitm def _show_post_from_file(self, post_filename: str, liked_by: str, @@ -84,7 +84,8 @@ def _show_post_from_file(self, post_filename: str, liked_by: str, auto_cw_cache: {}, fitness: {}, path: str, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """Shows an individual post from its filename """ if not os.path.isfile(post_filename): @@ -162,7 +163,8 @@ def _show_post_from_file(self, post_filename: str, liked_by: str, dogwhistles, min_images_for_accounts, buy_sites, - auto_cw_cache) + auto_cw_cache, + mitm_servers) msg = msg.encode('utf-8') msglen = len(msg) set_html_post_headers(self, msglen, @@ -241,7 +243,8 @@ def show_individual_post(self, ssml_getreq: bool, authorized: bool, buy_sites: [], auto_cw_cache: {}, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """Shows an individual post """ liked_by = None @@ -346,7 +349,8 @@ def show_individual_post(self, ssml_getreq: bool, authorized: bool, auto_cw_cache, fitness, path, onion_domain, - i2p_domain) + i2p_domain, + mitm_servers) fitness_performance(getreq_start_time, fitness, '_GET', 'show_individual_post', @@ -394,7 +398,8 @@ def show_new_post(self, edit_post_params: {}, min_images_for_accounts: [], buy_sites: [], auto_cw_cache: {}, - searchable_by_default_dict: []) -> bool: + searchable_by_default_dict: [], + mitm_servers: []) -> bool: """Shows the new post screen """ searchable_by_default = 'yourself' @@ -520,7 +525,8 @@ def show_new_post(self, edit_post_params: {}, buy_sites, default_buy_site, auto_cw_cache, - searchable_by_default) + searchable_by_default, + mitm_servers) if not msg: print('Error replying to ' + in_reply_to_url) http_404(self, 104) @@ -570,7 +576,8 @@ def show_individual_at_post(self, ssml_getreq: bool, authorized: bool, auto_cw_cache: {}, onion_domain: str, i2p_domain: str, - bold_reading_nicknames: {}) -> bool: + bold_reading_nicknames: {}, + mitm_servers: []) -> bool: """get an individual post from the path /@nickname/statusnumber """ if '/@' not in path: @@ -681,7 +688,8 @@ def show_individual_at_post(self, ssml_getreq: bool, authorized: bool, auto_cw_cache, fitness, path, onion_domain, - i2p_domain) + i2p_domain, + mitm_servers) fitness_performance(getreq_start_time, fitness, '_GET', 'show_individual_at_post', @@ -719,7 +727,8 @@ def show_likers_of_post(self, authorized: bool, min_images_for_accounts: [], buy_sites: [], auto_cw_cache: {}, - fitness: {}) -> bool: + fitness: {}, + mitm_servers: []) -> bool: """Show the likers of a post """ if not authorized: @@ -767,7 +776,8 @@ def show_likers_of_post(self, authorized: bool, dogwhistles, min_images_for_accounts, buy_sites, - auto_cw_cache, 'likes') + auto_cw_cache, 'likes', + mitm_servers) if not msg: http_404(self, 69) return True @@ -812,7 +822,8 @@ def show_announcers_of_post(self, authorized: bool, min_images_for_accounts: [], buy_sites: [], auto_cw_cache: {}, - fitness: {}) -> bool: + fitness: {}, + mitm_servers: []) -> bool: """Show the announcers of a post """ if not authorized: @@ -861,7 +872,7 @@ def show_announcers_of_post(self, authorized: bool, min_images_for_accounts, buy_sites, auto_cw_cache, - 'shares') + 'shares', mitm_servers) if not msg: http_404(self, 70) return True @@ -908,7 +919,8 @@ def show_replies_to_post(self, authorized: bool, auto_cw_cache: {}, fitness: {}, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """Shows the replies to a post """ if not ('/statuses/' in path and '/users/' in path): @@ -1008,7 +1020,8 @@ def show_replies_to_post(self, authorized: bool, dogwhistles, min_images_for_accounts, buy_sites, - auto_cw_cache) + auto_cw_cache, + mitm_servers) msg = msg.encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, @@ -1120,7 +1133,8 @@ def show_replies_to_post(self, authorized: bool, dogwhistles, min_images_for_accounts, buy_sites, - auto_cw_cache) + auto_cw_cache, + mitm_servers) msg = msg.encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, @@ -1187,7 +1201,8 @@ def show_notify_post(self, authorized: bool, auto_cw_cache: {}, onion_domain: str, i2p_domain: str, - bold_reading_nicknames: {}) -> bool: + bold_reading_nicknames: {}, + mitm_servers: []) -> bool: """Shows an individual post from an account which you are following and where you have the notify checkbox set on person options """ @@ -1245,7 +1260,8 @@ def show_notify_post(self, authorized: bool, auto_cw_cache, fitness, path, onion_domain, - i2p_domain) + i2p_domain, + mitm_servers) fitness_performance(getreq_start_time, fitness, '_GET', 'show_notify_post', debug) @@ -1287,7 +1303,8 @@ def show_conversation_thread(self, authorized: bool, blocked_cache: {}, block_federated: {}, auto_cw_cache: {}, - default_timeline: str) -> bool: + default_timeline: str, + mitm_servers: []) -> bool: """get conversation thread from the date link on a post """ if not path.startswith('/users/'): @@ -1369,7 +1386,8 @@ def show_conversation_thread(self, authorized: bool, block_federated, auto_cw_cache, ua_str, - default_timeline) + default_timeline, + mitm_servers) if conv_str: msg = conv_str.encode('utf-8') msglen = len(msg) diff --git a/daemon_get_profile.py b/daemon_get_profile.py index bf2634722..cbdf03c6b 100644 --- a/daemon_get_profile.py +++ b/daemon_get_profile.py @@ -78,7 +78,8 @@ def show_person_profile(self, authorized: bool, content_license_url: str, buy_sites: [], no_of_books: int, - auto_cw_cache: {}) -> bool: + auto_cw_cache: {}, + mitm_servers: []) -> bool: """Shows the profile for a person """ # look up a person @@ -150,7 +151,8 @@ def show_person_profile(self, authorized: bool, sites_unavailable, no_of_books, auto_cw_cache, - known_epicyon_instances).encode('utf-8') + known_epicyon_instances, + mitm_servers).encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, cookie, calling_domain, False) @@ -233,7 +235,8 @@ def show_roles(self, calling_domain: str, referer_domain: str, auto_cw_cache: {}, fitness: {}, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """Show roles within profile screen """ named_status = path.split('/users/')[1] @@ -308,7 +311,8 @@ def show_roles(self, calling_domain: str, referer_domain: str, sites_unavailable, no_of_books, auto_cw_cache, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) msg = msg.encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, @@ -383,7 +387,8 @@ def show_skills(self, calling_domain: str, referer_domain: str, fitness: {}, domain_full: str, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """Show skills on the profile screen """ named_status = path.split('/users/')[1] @@ -460,7 +465,8 @@ def show_skills(self, calling_domain: str, referer_domain: str, sites_unavailable, no_of_books, auto_cw_cache, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) msg = msg.encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, diff --git a/daemon_get_reactions.py b/daemon_get_reactions.py index aafead855..2bd15f399 100644 --- a/daemon_get_reactions.py +++ b/daemon_get_reactions.py @@ -47,7 +47,8 @@ def reaction_picker2(self, calling_domain: str, path: str, auto_cw_cache: {}, account_timezone: {}, bold_reading_nicknames: {}, - fitness: {}) -> None: + fitness: {}, + mitm_servers: []) -> None: """Press the emoji reaction picker icon at the bottom of the post """ page_number = 1 @@ -149,7 +150,8 @@ def reaction_picker2(self, calling_domain: str, path: str, dogwhistles, min_images_for_accounts, buy_sites, - auto_cw_cache) + auto_cw_cache, + mitm_servers) msg = msg.encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, diff --git a/daemon_get_timeline.py b/daemon_get_timeline.py index bd01f209e..88e9517fa 100644 --- a/daemon_get_timeline.py +++ b/daemon_get_timeline.py @@ -85,7 +85,8 @@ def show_media_timeline(self, authorized: bool, full_width_tl_button_header: bool, onion_domain: str, i2p_domain: str, - hide_announces: {}) -> bool: + hide_announces: {}, + mitm_servers: []) -> bool: """Shows the media timeline """ if '/users/' in path: @@ -203,7 +204,8 @@ def show_media_timeline(self, authorized: bool, buy_sites, auto_cw_cache, show_announces, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) msg = msg.encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, @@ -299,7 +301,8 @@ def show_blogs_timeline(self, authorized: bool, auto_cw_cache: {}, fitness: {}, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """Shows the blogs timeline """ if '/users/' in path: @@ -412,7 +415,8 @@ def show_blogs_timeline(self, authorized: bool, reverse_sequence, last_post_id, buy_sites, auto_cw_cache, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) msg = msg.encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, @@ -508,7 +512,8 @@ def show_news_timeline(self, authorized: bool, auto_cw_cache: {}, fitness: {}, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """Shows the news timeline """ if '/users/' in path: @@ -626,7 +631,8 @@ def show_news_timeline(self, authorized: bool, reverse_sequence, buy_sites, auto_cw_cache, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) msg = msg.encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, @@ -720,7 +726,8 @@ def show_features_timeline(self, authorized: bool, auto_cw_cache: {}, fitness: {}, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """Shows the features timeline (all local blogs) """ if '/users/' in path: @@ -835,7 +842,8 @@ def show_features_timeline(self, authorized: bool, reverse_sequence, buy_sites, auto_cw_cache, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) msg = msg.encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, @@ -926,7 +934,8 @@ def show_shares_timeline(self, authorized: bool, min_images_for_accounts: [], buy_sites: [], auto_cw_cache: {}, - fitness: {}) -> bool: + fitness: {}, + mitm_servers: []) -> bool: """Shows the shares timeline """ if '/users/' in path: @@ -1004,7 +1013,8 @@ def show_shares_timeline(self, authorized: bool, reverse_sequence, buy_sites, auto_cw_cache, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) msg = msg.encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, @@ -1072,7 +1082,8 @@ def show_wanted_timeline(self, authorized: bool, min_images_for_accounts: [], buy_sites: [], auto_cw_cache: {}, - fitness: {}) -> bool: + fitness: {}, + mitm_servers: []) -> bool: """Shows the wanted timeline """ if '/users/' in path: @@ -1149,7 +1160,8 @@ def show_wanted_timeline(self, authorized: bool, reverse_sequence, buy_sites, auto_cw_cache, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) msg = msg.encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, @@ -1221,7 +1233,8 @@ def show_bookmarks_timeline(self, authorized: bool, auto_cw_cache: {}, fitness: {}, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """Shows the bookmarks timeline """ if '/users/' in path: @@ -1330,7 +1343,8 @@ def show_bookmarks_timeline(self, authorized: bool, reverse_sequence, buy_sites, auto_cw_cache, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) msg = msg.encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, @@ -1428,7 +1442,8 @@ def show_outbox_timeline(self, authorized: bool, fitness: {}, onion_domain: str, i2p_domain: str, - hide_announces: {}) -> bool: + hide_announces: {}, + mitm_servers: []) -> bool: """Shows the outbox timeline """ # get outbox feed for a person @@ -1539,7 +1554,8 @@ def show_outbox_timeline(self, authorized: bool, buy_sites, auto_cw_cache, show_announces, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) msg = msg.encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, @@ -1622,7 +1638,8 @@ def show_mod_timeline(self, authorized: bool, auto_cw_cache: {}, fitness: {}, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """Shows the moderation timeline """ if '/users/' in path: @@ -1730,7 +1747,8 @@ def show_mod_timeline(self, authorized: bool, reverse_sequence, buy_sites, auto_cw_cache, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) msg = msg.encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, @@ -1823,7 +1841,8 @@ def show_dms(self, authorized: bool, auto_cw_cache: {}, fitness: {}, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """Shows the DMs timeline """ if '/users/' in path: @@ -1935,7 +1954,8 @@ def show_dms(self, authorized: bool, reverse_sequence, last_post_id, buy_sites, auto_cw_cache, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) msg = msg.encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, @@ -2031,7 +2051,8 @@ def show_replies(self, authorized: bool, auto_cw_cache: {}, fitness: {}, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """Shows the replies timeline """ if '/users/' in path: @@ -2144,7 +2165,8 @@ def show_replies(self, authorized: bool, reverse_sequence, last_post_id, buy_sites, auto_cw_cache, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) msg = msg.encode('utf-8') msglen = len(msg) set_headers(self, 'text/html', msglen, @@ -2240,7 +2262,8 @@ def show_inbox(self, authorized: bool, auto_cw_cache: {}, onion_domain: str, i2p_domain: str, - hide_announces: {}) -> bool: + hide_announces: {}, + mitm_servers: []) -> bool: """Shows the inbox timeline """ if '/users/' in path: @@ -2366,7 +2389,8 @@ def show_inbox(self, authorized: bool, buy_sites, auto_cw_cache, show_announces, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) if getreq_start_time: fitness_performance(getreq_start_time, fitness, '_GET', '_show_inbox3', diff --git a/daemon_post.py b/daemon_post.py index e99770ed6..691460d4a 100644 --- a/daemon_post.py +++ b/daemon_post.py @@ -21,6 +21,7 @@ from utils import local_actor_url from utils import contains_invalid_chars from utils import remove_id_ending from utils import check_bad_path +from utils import detect_mitm from blocking import contains_military_domain from blocking import contains_government_domain from blocking import contains_bluesky_domain @@ -41,7 +42,6 @@ from httpcodes import http_503 from httpheaders import contains_suspicious_headers from httpheaders import update_headers_catalog from httpheaders import redirect_headers -from daemon_utils import detect_mitm from daemon_utils import log_epicyon_instances from daemon_utils import get_user_agent from daemon_utils import post_to_outbox @@ -310,7 +310,8 @@ def daemon_http_post(self) -> None: self.server.translate, self.server.theme_name, self.server.dyslexic_font, - self.server.peertube_instances) + self.server.peertube_instances, + self.server.mitm_servers) self.server.postreq_busy = False return @@ -402,7 +403,8 @@ def daemon_http_post(self) -> None: self.server.access_keys, self.server.person_cache, self.server.recent_posts_cache, - self.server.blocked_cache) + self.server.blocked_cache, + self.server.mitm_servers) self.server.postreq_busy = False return @@ -474,7 +476,7 @@ def daemon_http_post(self) -> None: self.server.max_shares_on_profile, self.server.no_of_books, self.server.shared_items_federated_domains, - ua_str) + ua_str, self.server.mitm_servers) self.server.postreq_busy = False return @@ -602,7 +604,8 @@ def daemon_http_post(self) -> None: self.server.cached_webfingers, self.server.person_cache, self.server.project_version, - self.server.sites_unavailable) + self.server.sites_unavailable, + self.server.mitm_servers) self.server.postreq_busy = False return @@ -733,7 +736,8 @@ def daemon_http_post(self) -> None: self.server.auto_cw_cache, self.server.default_post_language, self.server.newswire, - self.server.block_federated) + self.server.block_federated, + self.server.mitm_servers) self.server.postreq_busy = False return @@ -903,7 +907,8 @@ def daemon_http_post(self) -> None: self.server.max_shares_on_profile, self.server.watermark_width_percent, self.server.watermark_position, - self.server.watermark_opacity) + self.server.watermark_opacity, + self.server.mitm_servers) if page_number: print(curr_post_type + ' post received') nickname = self.path.split('/users/')[1] diff --git a/daemon_post_confirm.py b/daemon_post_confirm.py index 01b6f2194..22ef71faf 100644 --- a/daemon_post_confirm.py +++ b/daemon_post_confirm.py @@ -153,7 +153,8 @@ def follow_confirm2(self, calling_domain: str, cookie: str, cached_webfingers: {}, person_cache: {}, project_version: str, - sites_unavailable: []) -> None: + sites_unavailable: [], + mitm_servers: []) -> None: """Confirm to follow """ users_path = path.split('/followconfirm')[0] @@ -214,7 +215,8 @@ def follow_confirm2(self, calling_domain: str, cookie: str, system_language, signing_priv_key_pem, users_path, - block_federated) + block_federated, + mitm_servers) if msg: msg = msg.encode('utf-8') msglen = len(msg) @@ -305,7 +307,8 @@ def follow_confirm2(self, calling_domain: str, cookie: str, onion_domain, i2p_domain, sites_unavailable, - system_language) + system_language, + mitm_servers) if '&submitUnblock=' in follow_confirm_params: blocking_actor = \ diff --git a/daemon_post_moderator.py b/daemon_post_moderator.py index e06363402..46906693c 100644 --- a/daemon_post_moderator.py +++ b/daemon_post_moderator.py @@ -48,7 +48,8 @@ def moderator_actions(self, path: str, calling_domain: str, cookie: str, theme_name: str, access_keys: {}, person_cache: {}, recent_posts_cache: {}, - blocked_cache: {}) -> None: + blocked_cache: {}, + mitm_servers: []) -> None: """Actions on the moderator screen """ users_path = path.replace('/moderationaction', '') @@ -165,7 +166,8 @@ def moderator_actions(self, path: str, calling_domain: str, cookie: str, system_language, signing_priv_key_pem, None, - block_federated) + block_federated, + mitm_servers) else: msg = \ html_moderation_info(translate, diff --git a/daemon_post_person_options.py b/daemon_post_person_options.py index b3cc81fec..af723be90 100644 --- a/daemon_post_person_options.py +++ b/daemon_post_person_options.py @@ -246,7 +246,8 @@ def _person_options_view(self, options_confirm_params: str, auto_cw_cache: {}, cookie: str, calling_domain: str, - curr_session, access_keys: {}) -> bool: + curr_session, access_keys: {}, + mitm_servers: []) -> bool: """Person options screen, view button See html_person_options """ @@ -326,7 +327,8 @@ def _person_options_view(self, options_confirm_params: str, buy_sites, max_shares_on_profile, no_of_books, - auto_cw_cache) + auto_cw_cache, + mitm_servers) if profile_str: msg = profile_str.encode('utf-8') msglen = len(msg) @@ -914,7 +916,8 @@ def _person_options_dm(self, options_confirm_params: str, buy_sites: [], auto_cw_cache: {}, cookie: str, calling_domain: str, - access_keys: {}) -> bool: + access_keys: {}, + mitm_servers: []) -> bool: """Person options screen, DM button See html_person_options """ @@ -995,7 +998,8 @@ def _person_options_dm(self, options_confirm_params: str, buy_sites, default_buy_site, auto_cw_cache, - searchable_by_default) + searchable_by_default, + mitm_servers) if msg: msg = msg.encode('utf-8') msglen = len(msg) @@ -1014,7 +1018,8 @@ def _person_options_info(self, options_confirm_params: str, domain: str, system_language: str, signing_priv_key_pem: str, block_federated: [], - cookie: str, calling_domain: str) -> bool: + cookie: str, calling_domain: str, + mitm_servers: []) -> bool: """Person options screen, Info button See html_person_options """ @@ -1033,7 +1038,8 @@ def _person_options_info(self, options_confirm_params: str, system_language, signing_priv_key_pem, None, - block_federated) + block_federated, + mitm_servers) if msg: msg = msg.encode('utf-8') msglen = len(msg) @@ -1149,7 +1155,8 @@ def _person_options_report(self, options_confirm_params: str, buy_sites: [], auto_cw_cache: {}, cookie: str, calling_domain: str, - access_keys: {}) -> bool: + access_keys: {}, + mitm_servers: []) -> bool: """Person options screen, report button See html_person_options """ @@ -1230,7 +1237,8 @@ def _person_options_report(self, options_confirm_params: str, buy_sites, default_buy_site, auto_cw_cache, - searchable_by_default) + searchable_by_default, + mitm_servers) if msg: msg = msg.encode('utf-8') msglen = len(msg) @@ -1280,7 +1288,8 @@ def person_options2(self, path: str, auto_cw_cache: {}, default_post_language: str, newswire: {}, - block_federated: []) -> None: + block_federated: [], + mitm_servers: []) -> None: """Receive POST from person options screen """ page_number = 1 @@ -1408,7 +1417,8 @@ def person_options2(self, path: str, auto_cw_cache, cookie, calling_domain, - curr_session, access_keys): + curr_session, access_keys, + mitm_servers): return if _person_option_receive_petname(self, options_confirm_params, @@ -1617,7 +1627,8 @@ def person_options2(self, path: str, buy_sites, auto_cw_cache, cookie, calling_domain, - access_keys): + access_keys, + mitm_servers): return if _person_options_info(self, options_confirm_params, @@ -1627,7 +1638,8 @@ def person_options2(self, path: str, domain, system_language, signing_priv_key_pem, block_federated, - cookie, calling_domain): + cookie, calling_domain, + mitm_servers): return if _person_options_snooze(self, options_confirm_params, @@ -1684,7 +1696,8 @@ def person_options2(self, path: str, buy_sites, auto_cw_cache, cookie, calling_domain, - access_keys): + access_keys, + mitm_servers): return # redirect back from person options screen diff --git a/daemon_post_profile.py b/daemon_post_profile.py index c9b7fc979..29ff003e5 100644 --- a/daemon_post_profile.py +++ b/daemon_post_profile.py @@ -1724,7 +1724,8 @@ def _profile_post_website(curr_session, base_dir: str, http_prefix: str, nickname: str, domain: str, actor_json: {}, fields: {}, actor_changed: bool, - translate: {}, debug: bool) -> bool: + translate: {}, debug: bool, + mitm_servers: []) -> bool: """ HTTP POST change website """ current_website = get_website(actor_json, translate) @@ -1739,7 +1740,8 @@ def _profile_post_website(curr_session, base_dir: str, http_prefix: str, http_prefix, nickname, domain, fields['websiteUrl'], - True, debug) + True, debug, + mitm_servers) else: if current_website: set_website(actor_json, '', translate) @@ -1991,7 +1993,8 @@ def _profile_post_blog_address(curr_session, nickname: str, domain: str, actor_json: {}, fields: {}, actor_changed: bool, - debug: bool) -> bool: + debug: bool, + mitm_servers: []) -> bool: """ HTTP POST change blog address """ current_blog_address = get_blog_address(actor_json) @@ -2004,7 +2007,7 @@ def _profile_post_blog_address(curr_session, base_dir, http_prefix, nickname, domain, fields['blogAddress'], - True, debug) + True, debug, mitm_servers) else: if current_blog_address: set_blog_address(actor_json, '') @@ -2698,7 +2701,8 @@ def profile_edit(self, calling_domain: str, cookie: str, person_cache: {}, project_version: str, translate: {}, theme_name: str, dyslexic_font: bool, - peertube_instances: []) -> None: + peertube_instances: [], + mitm_servers: []) -> None: """Updates your user profile after editing via the Edit button on the profile screen """ @@ -3075,7 +3079,7 @@ def profile_edit(self, calling_domain: str, cookie: str, nickname, domain, actor_json, fields, actor_changed, - debug) + debug, mitm_servers) actor_changed = \ _profile_post_show_languages(actor_json, fields, @@ -3134,7 +3138,7 @@ def profile_edit(self, calling_domain: str, cookie: str, actor_json, fields, actor_changed, translate, - debug) + debug, mitm_servers) actor_changed = \ _profile_post_gemini_link(actor_json, fields, diff --git a/daemon_post_receive.py b/daemon_post_receive.py index 3a7a993f2..549bfa042 100644 --- a/daemon_post_receive.py +++ b/daemon_post_receive.py @@ -111,7 +111,8 @@ def _receive_new_post_process_newpost(self, fields: {}, proxy_type: str, max_replies: int, onion_domain: str, - i2p_domain: str) -> int: + i2p_domain: str, + mitm_servers: []) -> int: """ A new post has been received from the New Post screen and is then sent to the outbox """ @@ -218,7 +219,8 @@ def _receive_new_post_process_newpost(self, fields: {}, max_hashtags, buy_sites, auto_cw_cache, - onion_domain, i2p_domain) + onion_domain, i2p_domain, + mitm_servers) print('DEBUG: sending edited public post ' + str(message_json)) if fields['schedulePost']: @@ -524,7 +526,8 @@ def _receive_new_post_process_newunlisted(self, fields: {}, proxy_type: str, max_replies: int, onion_domain: str, - i2p_domain: str) -> int: + i2p_domain: str, + mitm_servers: []) -> int: """Unlisted post has been received from New Post screen and is then sent to the outbox """ @@ -617,7 +620,8 @@ def _receive_new_post_process_newunlisted(self, fields: {}, max_hashtags, buy_sites, auto_cw_cache, - onion_domain, i2p_domain) + onion_domain, i2p_domain, + mitm_servers) print('DEBUG: sending edited unlisted post ' + str(message_json)) @@ -678,7 +682,8 @@ def _receive_new_post_process_newfollowers(self, fields: {}, proxy_type: str, max_replies: int, onion_domain: str, - i2p_domain: str) -> int: + i2p_domain: str, + mitm_servers: []) -> int: """Followers only post has been received from New Post screen and is then sent to the outbox """ @@ -781,7 +786,8 @@ def _receive_new_post_process_newfollowers(self, fields: {}, max_hashtags, buy_sites, auto_cw_cache, - onion_domain, i2p_domain) + onion_domain, i2p_domain, + mitm_servers) print('DEBUG: sending edited followers post ' + str(message_json)) @@ -843,7 +849,8 @@ def _receive_new_post_process_newdm(self, fields: {}, proxy_type: str, max_replies: int, onion_domain: str, - i2p_domain: str) -> int: + i2p_domain: str, + mitm_servers: []) -> int: """Direct message post has been received from New Post screen and is then sent to the outbox """ @@ -953,7 +960,8 @@ def _receive_new_post_process_newdm(self, fields: {}, max_hashtags, buy_sites, auto_cw_cache, - onion_domain, i2p_domain) + onion_domain, i2p_domain, + mitm_servers) print('DEBUG: sending edited dm post ' + str(message_json)) @@ -1014,7 +1022,8 @@ def _receive_new_post_process_newreminder(self, fields: {}, nickname: str, project_version: str, proxy_type: str, onion_domain: str, - i2p_domain: str) -> int: + i2p_domain: str, + mitm_servers: []) -> int: """Reminder post has been received from New Post screen and is then sent to the outbox """ @@ -1109,7 +1118,8 @@ def _receive_new_post_process_newreminder(self, fields: {}, nickname: str, max_hashtags, buy_sites, auto_cw_cache, - onion_domain, i2p_domain) + onion_domain, i2p_domain, + mitm_servers) print('DEBUG: sending edited reminder post ' + str(message_json)) if post_to_outbox(self, message_json, @@ -1314,7 +1324,8 @@ def _receive_new_post_process_newreading(self, fields: {}, proxy_type: str, max_replies: int, onion_domain: str, - i2p_domain: str) -> int: + i2p_domain: str, + mitm_servers: []) -> int: """Reading status post has been received from New Post screen and is then sent to the outbox """ @@ -1427,7 +1438,8 @@ def _receive_new_post_process_newreading(self, fields: {}, max_hashtags, buy_sites, auto_cw_cache, - onion_domain, i2p_domain) + onion_domain, i2p_domain, + mitm_servers) print('DEBUG: sending edited reading status post ' + str(message_json)) if fields['schedulePost']: @@ -1635,7 +1647,8 @@ def _receive_new_post_process(self, post_type: str, path: str, headers: {}, max_shares_on_profile: int, watermark_width_percent: int, watermark_position: str, - watermark_opacity: int) -> int: + watermark_opacity: int, + mitm_servers: []) -> int: # Note: this needs to happen synchronously # 0=this is not a new post # 1=new post success @@ -1894,7 +1907,8 @@ def _receive_new_post_process(self, post_type: str, path: str, headers: {}, proxy_type, max_replies, onion_domain, - i2p_domain) + i2p_domain, + mitm_servers) if post_type == 'newblog': return _receive_new_post_process_newblog( self, fields, @@ -1970,7 +1984,8 @@ def _receive_new_post_process(self, post_type: str, path: str, headers: {}, proxy_type, max_replies, onion_domain, - i2p_domain) + i2p_domain, + mitm_servers) if post_type == 'newfollowers': return _receive_new_post_process_newfollowers( self, fields, @@ -2015,7 +2030,8 @@ def _receive_new_post_process(self, post_type: str, path: str, headers: {}, project_version, proxy_type, max_replies, - onion_domain, i2p_domain) + onion_domain, i2p_domain, + mitm_servers) if post_type == 'newdm': return _receive_new_post_process_newdm( self, fields, @@ -2062,7 +2078,8 @@ def _receive_new_post_process(self, post_type: str, path: str, headers: {}, proxy_type, max_replies, onion_domain, - i2p_domain) + i2p_domain, + mitm_servers) if post_type == 'newreminder': return _receive_new_post_process_newreminder( self, fields, @@ -2106,7 +2123,8 @@ def _receive_new_post_process(self, post_type: str, path: str, headers: {}, buy_sites, project_version, proxy_type, - onion_domain, i2p_domain) + onion_domain, i2p_domain, + mitm_servers) if post_type == 'newreport': return _receive_new_post_process_newreport( self, fields, @@ -2179,7 +2197,8 @@ def _receive_new_post_process(self, post_type: str, path: str, headers: {}, project_version, proxy_type, max_replies, - onion_domain, i2p_domain) + onion_domain, i2p_domain, + mitm_servers) if post_type in ('newshare', 'newwanted'): return _receive_new_post_process_newshare( self, fields, @@ -2241,7 +2260,8 @@ def receive_new_post(self, post_type, path: str, max_shares_on_profile: int, watermark_width_percent: int, watermark_position: str, - watermark_opacity: int) -> int: + watermark_opacity: int, + mitm_servers: []) -> int: """A new post has been created This creates a thread to send the new post """ @@ -2382,7 +2402,8 @@ def receive_new_post(self, post_type, path: str, max_shares_on_profile, watermark_width_percent, watermark_position, - watermark_opacity) + watermark_opacity, + mitm_servers) if debug: print('DEBUG: _receive_new_post_process returned ' + str(retval)) diff --git a/daemon_post_search.py b/daemon_post_search.py index a0ff75259..3c54274ad 100644 --- a/daemon_post_search.py +++ b/daemon_post_search.py @@ -85,7 +85,8 @@ def _receive_search_hashtag(self, actor_str: str, buy_sites: [], auto_cw_cache: {}, calling_domain: str, - ua_str: str) -> bool: + ua_str: str, + mitm_servers: []) -> bool: """Receive a search for a hashtag from the search screen """ nickname = get_nickname_from_actor(actor_str) @@ -133,7 +134,8 @@ def _receive_search_hashtag(self, actor_str: str, 'search', min_images_for_accounts, buy_sites, - auto_cw_cache, ua_str) + auto_cw_cache, ua_str, + mitm_servers) if hashtag_str: msg = hashtag_str.encode('utf-8') msglen = len(msg) @@ -215,7 +217,8 @@ def _receive_search_my_posts(self, search_str: str, min_images_for_accounts: {}, buy_sites: [], auto_cw_cache: {}, - calling_domain: str) -> bool: + calling_domain: str, + mitm_servers: []) -> bool: """Receive a search for your own posts from the search screen """ # your post history search @@ -281,7 +284,8 @@ def _receive_search_my_posts(self, search_str: str, access_keys, min_images_for_accounts, buy_sites, - auto_cw_cache) + auto_cw_cache, + mitm_servers) if history_str: msg = history_str.encode('utf-8') msglen = len(msg) @@ -326,7 +330,8 @@ def _receive_search_bookmarks(self, search_str: str, min_images_for_accounts: {}, buy_sites: [], auto_cw_cache: {}, - calling_domain: str) -> bool: + calling_domain: str, + mitm_servers: []) -> bool: """Receive a search for bookmarked posts from the search screen """ # bookmark search @@ -392,7 +397,8 @@ def _receive_search_bookmarks(self, search_str: str, access_keys, min_images_for_accounts, buy_sites, - auto_cw_cache) + auto_cw_cache, + mitm_servers) if bookmarks_str: msg = bookmarks_str.encode('utf-8') msglen = len(msg) @@ -438,7 +444,8 @@ def _receive_search_handle(self, search_str: str, no_of_books: int, auto_cw_cache: {}, actor_str: str, - curr_session, access_keys: {}) -> bool: + curr_session, access_keys: {}, + mitm_servers: []) -> bool: """Receive a search for a fediverse handle or url from the search screen """ remote_only = False @@ -511,7 +518,8 @@ def _receive_search_handle(self, search_str: str, base_dir, http_prefix, actor, person_cache, None, True, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) profile_path_str += \ '?options=' + actor + ';1;' + avatar_url @@ -592,7 +600,8 @@ def _receive_search_handle(self, search_str: str, buy_sites, max_shares_on_profile, no_of_books, - auto_cw_cache) + auto_cw_cache, + mitm_servers) if profile_str: msg = profile_str.encode('utf-8') msglen = len(msg) @@ -754,7 +763,8 @@ def receive_search_query(self, calling_domain: str, cookie: str, max_shares_on_profile: int, no_of_books: int, shared_items_federated_domains: [], - ua_str: str) -> None: + ua_str: str, + mitm_servers: []) -> None: """Receive a search query """ # get the page number @@ -860,7 +870,8 @@ def receive_search_query(self, calling_domain: str, cookie: str, buy_sites, auto_cw_cache, calling_domain, - ua_str): + ua_str, + mitm_servers): return elif (search_str.startswith('*') or search_str.endswith(' skill')): @@ -908,7 +919,8 @@ def receive_search_query(self, calling_domain: str, cookie: str, min_images_for_accounts, buy_sites, auto_cw_cache, - calling_domain): + calling_domain, + mitm_servers): return elif (search_str.startswith('-') or string_ends_with(search_str, bookmark_endings)): @@ -945,7 +957,8 @@ def receive_search_query(self, calling_domain: str, cookie: str, min_images_for_accounts, buy_sites, auto_cw_cache, - calling_domain): + calling_domain, + mitm_servers): return elif ('@' in search_str or ('://' in search_str and @@ -983,7 +996,8 @@ def receive_search_query(self, calling_domain: str, cookie: str, max_shares_on_profile, no_of_books, auto_cw_cache, actor_str, - curr_session, access_keys): + curr_session, access_keys, + mitm_servers): return elif (search_str.startswith(':') or search_str.endswith(' emoji')): diff --git a/daemon_utils.py b/daemon_utils.py index 142d3f2c3..b722e0002 100644 --- a/daemon_utils.py +++ b/daemon_utils.py @@ -26,6 +26,7 @@ from blocking import is_blocked_nickname from blocking import is_blocked_domain from content import valid_url_lengths from posts import add_to_field +from utils import detect_mitm from utils import data_dir from utils import load_json from utils import save_json @@ -141,7 +142,8 @@ def post_to_outbox(self, message_json: {}, version: str, self.server.books_cache, self.server.max_cached_readers, self.server.auto_cw_cache, - self.server.block_federated) + self.server.block_federated, + self.server.mitm_servers) def _get_outbox_thread_index(self, nickname: str, @@ -207,40 +209,6 @@ def post_to_outbox_thread(self, message_json: {}, return True -def detect_mitm(self) -> bool: - """Detect if a request contains a MiTM - """ - mitm_domains = ['cloudflare'] - # look for domains within these headers - check_headers = ( - 'Server', 'Report-To', 'Report-to', 'report-to', - 'Expect-CT', 'Expect-Ct', 'expect-ct' - ) - for interloper in mitm_domains: - for header_name in check_headers: - if not self.headers.get(header_name): - continue - if interloper in str(self.headers[header_name]): - print('MITM: ' + header_name + ' = ' + - str(self.headers[header_name])) - return True - # The presence of these headers on their own indicates a MiTM - mitm_headers = ( - 'CF-Connecting-IP', 'CF-RAY', 'CF-IPCountry', 'CF-Visitor', - 'CDN-Loop', 'CF-Worker', 'CF-Cache-Status' - ) - for header_name in mitm_headers: - if self.headers.get(header_name): - print('MITM: ' + header_name + ' = ' + - self.headers[header_name]) - return True - if self.headers.get(header_name.lower()): - print('MITM: ' + header_name + ' = ' + - self.headers[header_name.lower()]) - return True - return False - - def update_inbox_queue(self, nickname: str, message_json: {}, message_bytes: str, debug: bool) -> int: """Update the inbox queue diff --git a/delete.py b/delete.py index 3a6976599..406aa3426 100644 --- a/delete.py +++ b/delete.py @@ -37,7 +37,8 @@ def send_delete_via_server(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Creates a delete request message via c2s """ if not session: @@ -68,7 +69,7 @@ def send_delete_via_server(base_dir: str, session, wf_request = \ webfinger_handle(session, handle, http_prefix, cached_webfingers, from_domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: delete webfinger failed for ' + handle) @@ -89,7 +90,7 @@ def send_delete_via_server(base_dir: str, session, project_version, http_prefix, from_nickname, from_domain, post_to_box, 53036, - system_language) + system_language, mitm_servers) if not inbox_url: if debug: diff --git a/desktop_client.py b/desktop_client.py index 622bc7d5f..4eb46716a 100644 --- a/desktop_client.py +++ b/desktop_client.py @@ -521,7 +521,8 @@ def _desktop_reply_to_post(session, post_id: str, content_license_url: str, media_license_url: str, media_creator: str, signing_priv_key_pem: str, - translate: {}) -> None: + translate: {}, + mitm_servers: []) -> None: """Use the desktop client to send a reply to the most recent post """ if '://' not in post_id: @@ -595,7 +596,7 @@ def _desktop_reply_to_post(session, post_id: str, translate, buy_url, chat_url, auto_cw_cache, debug, post_id, post_id, conversation_id, convthread_id, subject, - searchable_by) == 0: + searchable_by, mitm_servers) == 0: say_str = translate['Sent'] else: say_str = translate['Post failed'] @@ -613,7 +614,8 @@ def _desktop_new_post(session, content_license_url: str, media_license_url: str, media_creator: str, signing_priv_key_pem: str, - translate: {}) -> None: + translate: {}, + mitm_servers: []) -> None: """Use the desktop client to create a new post """ conversation_id = None @@ -680,7 +682,7 @@ def _desktop_new_post(session, translate, buy_url, chat_url, auto_cw_cache, debug, None, None, conversation_id, convthread_id, subject, - searchable_by) == 0: + searchable_by, mitm_servers) == 0: say_str = translate['Sent'] else: say_str = translate['Post failed'] @@ -816,7 +818,8 @@ def _read_local_box_post(session, nickname: str, domain: str, domain_full: str, person_cache: {}, signing_priv_key_pem: str, blocked_cache: {}, block_federated: [], - bold_reading: bool) -> {}: + bold_reading: bool, + mitm_servers: []) -> {}: """Reads a post from the given timeline Returns the post json """ @@ -868,7 +871,8 @@ def _read_local_box_post(session, nickname: str, domain: str, signing_priv_key_pem, blocked_cache, block_federated, bold_reading, show_vote_posts, - languages_understood) + languages_understood, + mitm_servers) if post_json_object2: if has_object_dict(post_json_object2): if post_json_object2['object'].get('attributedTo') and \ @@ -930,7 +934,8 @@ def _read_local_box_post(session, nickname: str, domain: str, if is_pgp_encrypted(content): say_str = translate['Encrypted message. Please enter your passphrase.'] _say_command(say_str, say_str, screenreader, system_language, espeak) - content = pgp_decrypt(domain, content, actor, signing_priv_key_pem) + content = pgp_decrypt(domain, content, actor, signing_priv_key_pem, + mitm_servers) if is_pgp_encrypted(content): say_str = translate['Message could not be decrypted'] _say_command(say_str, say_str, @@ -1023,7 +1028,8 @@ def _desktop_show_profile(session, nickname: str, screenreader: str, espeak, translate: {}, post_json_object: {}, signing_priv_key_pem: str, - http_prefix: str) -> {}: + http_prefix: str, + mitm_servers: []) -> {}: """Shows the profile of the actor for the given post Returns the actor json """ @@ -1058,7 +1064,8 @@ def _desktop_show_profile(session, nickname: str, is_ipns = False actor_json, _ = \ get_actor_json(domain, actor, is_http, is_gnunet, is_ipfs, is_ipns, - False, True, signing_priv_key_pem, session) + False, True, signing_priv_key_pem, session, + mitm_servers) _desktop_show_actor(http_prefix, nickname, domain, domain_full, @@ -1074,14 +1081,15 @@ def _desktop_show_profile_from_handle(session, nickname: str, domain: str, screenreader: str, espeak, translate: {}, signing_priv_key_pem: str, - http_prefix: str) -> {}: + http_prefix: str, + mitm_servers: []) -> {}: """Shows the profile for a handle Returns the actor json """ actor_json, _ = \ get_actor_json(domain, handle, False, False, False, False, False, True, - signing_priv_key_pem, session) + signing_priv_key_pem, session, mitm_servers) _desktop_show_actor(http_prefix, nickname, domain, domain_full, base_dir, actor_json, translate, @@ -1342,7 +1350,8 @@ def _desktop_new_dm(session, to_handle: str, content_license_url: str, media_license_url: str, media_creator: str, signing_priv_key_pem: str, - translate: {}) -> None: + translate: {}, + mitm_servers: []) -> None: """Use the desktop client to create a new direct message which can include multiple destination handles """ @@ -1367,7 +1376,8 @@ def _desktop_new_dm(session, to_handle: str, espeak, low_bandwidth, content_license_url, media_license_url, media_creator, - signing_priv_key_pem, translate) + signing_priv_key_pem, translate, + mitm_servers) def _desktop_new_dm_base(session, to_handle: str, @@ -1381,7 +1391,8 @@ def _desktop_new_dm_base(session, to_handle: str, content_license_url: str, media_license_url: str, media_creator: str, signing_priv_key_pem: str, - translate: {}) -> None: + translate: {}, + mitm_servers: []) -> None: """Use the desktop client to create a new direct message """ conversation_id = None @@ -1451,7 +1462,7 @@ def _desktop_new_dm_base(session, to_handle: str, padded_message += ' ' cipher_text = \ pgp_encrypt_to_actor(domain, padded_message, to_handle, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not cipher_text: say_str = \ to_handle + ' has no PGP public key. ' + \ @@ -1500,7 +1511,7 @@ def _desktop_new_dm_base(session, to_handle: str, translate, buy_url, chat_url, auto_cw_cache, debug, None, None, conversation_id, convthread_id, subject, - searchable_by) == 0: + searchable_by, mitm_servers) == 0: say_str = translate['Sent'] else: say_str = translate['Post failed'] @@ -1590,6 +1601,7 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, blocked_cache = {} block_federated = [] languages_understood = [] + mitm_servers = [] indent = ' ' if show_new_posts: @@ -1690,7 +1702,7 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, cached_webfingers, person_cache, debug, False, signing_priv_key_pem, - system_language) + system_language, mitm_servers) say_str = indent + translate['PGP Public Key'] + ' uploaded' _say_command(say_str, say_str, screenreader, system_language, espeak) @@ -1699,7 +1711,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, box_json = c2s_box_json(session, nickname, password, domain, port, http_prefix, curr_timeline, page_number, - debug, signing_priv_key_pem) + debug, signing_priv_key_pem, + mitm_servers) follow_requests_json = \ get_follow_requests_via_server(session, @@ -1707,14 +1720,16 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, domain, port, http_prefix, 1, debug, __version__, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) if not (curr_timeline == 'inbox' and page_number == 1): # monitor the inbox to generate notifications inbox_json = c2s_box_json(session, nickname, password, domain, port, http_prefix, 'inbox', 1, debug, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) else: inbox_json = box_json if inbox_json: @@ -1783,7 +1798,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, box_json = c2s_box_json(session, nickname, password, domain, port, http_prefix, curr_timeline, page_number, - debug, signing_priv_key_pem) + debug, signing_priv_key_pem, + mitm_servers) if box_json: _desktop_show_box(indent, follow_requests_json, your_actor, curr_timeline, box_json, @@ -1797,7 +1813,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, box_json = c2s_box_json(session, nickname, password, domain, port, http_prefix, curr_timeline, page_number, - debug, signing_priv_key_pem) + debug, signing_priv_key_pem, + mitm_servers) if box_json: _desktop_show_box(indent, follow_requests_json, your_actor, curr_timeline, box_json, @@ -1811,7 +1828,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, box_json = c2s_box_json(session, nickname, password, domain, port, http_prefix, curr_timeline, page_number, - debug, signing_priv_key_pem) + debug, signing_priv_key_pem, + mitm_servers) if box_json: _desktop_show_box(indent, follow_requests_json, your_actor, curr_timeline, box_json, @@ -1826,7 +1844,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, box_json = c2s_box_json(session, nickname, password, domain, port, http_prefix, curr_timeline, page_number, - debug, signing_priv_key_pem) + debug, signing_priv_key_pem, + mitm_servers) if box_json: _desktop_show_box(indent, follow_requests_json, your_actor, curr_timeline, box_json, @@ -1850,7 +1869,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, box_json = c2s_box_json(session, nickname, password, domain, port, http_prefix, curr_timeline, page_number, - debug, signing_priv_key_pem) + debug, signing_priv_key_pem, + mitm_servers) if box_json: _desktop_show_box(indent, follow_requests_json, your_actor, curr_timeline, box_json, @@ -1886,7 +1906,7 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, domain_full, person_cache, signing_priv_key_pem, blocked_cache, block_federated, - bold_reading) + bold_reading, mitm_servers) print('') say_str = translate['Press Enter to continue'] + '...' say_str2 = _highlight_text(say_str) @@ -1911,7 +1931,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, espeak, translate, post_json_object, signing_priv_key_pem, - http_prefix) + http_prefix, + mitm_servers) else: post_index_str = '1' else: @@ -1929,7 +1950,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, screenreader, espeak, translate, signing_priv_key_pem, - http_prefix) + http_prefix, + mitm_servers) say_str = translate['Press Enter to continue'] + '...' say_str2 = _highlight_text(say_str) _say_command(say_str2, say_str, @@ -1951,7 +1973,7 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, system_language, screenreader, espeak, translate, None, signing_priv_key_pem, - http_prefix) + http_prefix, mitm_servers) say_str = translate['Press Enter to continue'] + '...' say_str2 = _highlight_text(say_str) _say_command(say_str2, say_str, @@ -2006,7 +2028,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, media_license_url, media_creator, signing_priv_key_pem, - translate) + translate, + mitm_servers) refresh_timeline = True print('') elif (command_str == 'post' or command_str == 'p' or @@ -2047,7 +2070,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, espeak, low_bandwidth, content_license_url, media_license_url, media_creator, - signing_priv_key_pem, translate) + signing_priv_key_pem, translate, + mitm_servers) refresh_timeline = True else: # public post @@ -2061,7 +2085,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, espeak, low_bandwidth, content_license_url, media_license_url, media_creator, - signing_priv_key_pem, translate) + signing_priv_key_pem, translate, + mitm_servers) refresh_timeline = True print('') elif command_str == 'like' or command_str.startswith('like '): @@ -2095,7 +2120,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, person_cache, False, __version__, signing_priv_key_pem, - system_language) + system_language, + mitm_servers) refresh_timeline = True print('') elif (command_str == 'undo mute' or @@ -2142,7 +2168,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, person_cache, False, __version__, signing_priv_key_pem, - system_language) + system_language, + mitm_servers) refresh_timeline = True print('') elif (command_str == 'mute' or @@ -2180,7 +2207,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, person_cache, False, __version__, signing_priv_key_pem, - system_language) + system_language, + mitm_servers) refresh_timeline = True print('') elif (command_str == 'undo bookmark' or @@ -2230,7 +2258,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, person_cache, False, __version__, signing_priv_key_pem, - system_language) + system_language, + mitm_servers) refresh_timeline = True print('') elif (command_str == 'bookmark' or @@ -2267,7 +2296,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, person_cache, False, __version__, signing_priv_key_pem, - system_language) + system_language, + mitm_servers) refresh_timeline = True print('') elif (command_str.startswith('undo block ') or @@ -2313,7 +2343,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, False, __version__, sign_key_pem, - system_language) + system_language, + mitm_servers) refresh_timeline = True print('') elif command_str.startswith('block '): @@ -2365,7 +2396,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, person_cache, False, __version__, signing_priv_key_pem, - system_language) + system_language, + mitm_servers) refresh_timeline = True print('') elif command_str in ('unlike', 'undo like'): @@ -2402,7 +2434,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, person_cache, False, __version__, signing_priv_key_pem, - system_language) + system_language, + mitm_servers) refresh_timeline = True print('') elif (command_str.startswith('announce') or @@ -2454,7 +2487,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, + mitm_servers) refresh_timeline = True print('') elif (command_str.startswith('unannounce') or @@ -2495,7 +2529,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, + mitm_servers) refresh_timeline = True print('') elif (command_str == 'follow requests' or @@ -2513,7 +2548,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, domain, port, http_prefix, curr_page, debug, __version__, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) if follow_requests_json: if isinstance(follow_requests_json, dict): _desktop_show_follow_requests(follow_requests_json, @@ -2534,7 +2570,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, domain, port, http_prefix, curr_page, debug, __version__, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) if following_json: if isinstance(following_json, dict): _desktop_show_following(following_json, translate, @@ -2556,7 +2593,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, domain, port, http_prefix, curr_page, debug, __version__, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) if followers_json: if isinstance(followers_json, dict): _desktop_show_following(followers_json, translate, @@ -2597,7 +2635,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, person_cache, debug, __version__, signing_priv_key_pem, - system_language) + system_language, + mitm_servers) else: if follow_handle: say_str = follow_handle + ' is not valid' @@ -2634,7 +2673,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, person_cache, debug, __version__, signing_priv_key_pem, - system_language) + system_language, + mitm_servers) else: say_str = follow_handle + ' is not valid' _say_command(say_str, say_str, @@ -2662,7 +2702,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, approve_handle, debug, __version__, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) else: if approve_handle: say_str = approve_handle + ' is not valid' @@ -2693,7 +2734,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, deny_handle, debug, __version__, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) else: if deny_handle: say_str = deny_handle + ' is not valid' @@ -2790,7 +2832,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, block_federated, bold_reading, show_vote_posts, - languages_understood) + languages_understood, + mitm_servers) if post_json_object2: post_json_object = post_json_object2 if post_json_object: @@ -2883,7 +2926,8 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, person_cache, False, __version__, signing_priv_key_pem, - system_language) + system_language, + mitm_servers) refresh_timeline = True print('') diff --git a/epicyon.py b/epicyon.py index 68819116c..fdd5374b3 100644 --- a/epicyon.py +++ b/epicyon.py @@ -107,7 +107,7 @@ from reaction import valid_emoji_content from skills import send_skill_via_server from availability import set_availability from availability import send_availability_via_server -from manualapprove import manual_deny_follow_request +from manualapprove import manual_deny_follow_request2 from manualapprove import manual_approve_follow_request from shares import send_share_via_server from shares import send_undo_share_via_server @@ -996,10 +996,12 @@ def _command_options() -> None: if not argb.language: argb.language = 'en' signing_priv_key_pem = get_instance_actor_key(base_dir, origin_domain) + mitm_servers = [] get_public_posts_of_person(base_dir, nickname, domain, False, True, proxy_type, argb.port, http_prefix, debug, __version__, argb.language, - signing_priv_key_pem, origin_domain) + signing_priv_key_pem, origin_domain, + mitm_servers) sys.exit() if argb.moved: @@ -1084,6 +1086,7 @@ def _command_options() -> None: if argb.secure_mode: signing_priv_key_pem = \ get_instance_actor_key(base_dir, origin_domain) + mitm_servers = [] domain_list = \ get_public_post_domains(None, base_dir, nickname, domain, @@ -1093,7 +1096,8 @@ def _command_options() -> None: __version__, word_frequency, domain_list, argb.language, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) for post_domain in domain_list: print(post_domain) sys.exit() @@ -1137,6 +1141,7 @@ def _command_options() -> None: signing_priv_key_pem = None if argb.secure_mode: signing_priv_key_pem = get_instance_actor_key(base_dir, domain) + mitm_servers = [] domain_list = \ get_public_post_domains_blocked(None, base_dir, nickname, domain, @@ -1145,7 +1150,8 @@ def _command_options() -> None: __version__, word_frequency, domain_list, argb.language, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) for post_domain in domain_list: print(post_domain) sys.exit() @@ -1186,13 +1192,14 @@ def _command_options() -> None: signing_priv_key_pem = None if argb.secure_mode: signing_priv_key_pem = get_instance_actor_key(base_dir, domain) + mitm_servers = [] check_domains(None, base_dir, nickname, domain, proxy_type, argb.port, http_prefix, debug, __version__, max_blocked_domains, False, argb.language, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) sys.exit() if argb.socnet: @@ -1214,11 +1221,12 @@ def _command_options() -> None: signing_priv_key_pem = None if argb.secure_mode: signing_priv_key_pem = get_instance_actor_key(base_dir, domain) + mitm_servers = [] dot_graph = instances_graph(base_dir, argb.socnet, proxy_type, argb.port, http_prefix, debug, __version__, argb.language, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) try: with open('socnet.dot', 'w+', encoding='utf-8') as fp_soc: fp_soc.write(dot_graph) @@ -1272,10 +1280,12 @@ def _command_options() -> None: if not argb.language: argb.language = 'en' signing_priv_key_pem = get_instance_actor_key(base_dir, origin_domain) + mitm_servers = [] get_public_posts_of_person(base_dir, nickname, domain, False, False, proxy_type, argb.port, http_prefix, debug, __version__, argb.language, - signing_priv_key_pem, origin_domain) + signing_priv_key_pem, origin_domain, + mitm_servers) sys.exit() if argb.json: @@ -1301,9 +1311,10 @@ def _command_options() -> None: print('Obtained instance actor signing key') else: print('Did not obtain instance actor key for ' + domain) + mitm_servers = [] test_json = get_json(signing_priv_key_pem, session, argb.json, - as_header, None, debug, __version__, - http_prefix, domain) + as_header, None, debug, mitm_servers, + __version__, http_prefix, domain) if get_json_valid(test_json): pprint(test_json) session.close() @@ -1334,9 +1345,11 @@ def _command_options() -> None: if not nickname: print('Please specify a nickname with the --nickname option') sys.exit() + mitm_servers = [] conv_json = download_conversation_posts(True, session, http_prefix, base_dir, nickname, domain, - post_id, argb.debug) + post_id, argb.debug, + mitm_servers) if conv_json: pprint(conv_json) session.close() @@ -1360,9 +1373,10 @@ def _command_options() -> None: print('Obtained instance actor signing key') else: print('Did not obtain instance actor key for ' + domain) + mitm_servers = [] test_ssml = download_ssml(signing_priv_key_pem, session, argb.ssml, as_header, None, debug, __version__, - http_prefix, domain) + http_prefix, domain, mitm_servers) if test_ssml: print(str(test_ssml)) session.close() @@ -1414,9 +1428,10 @@ def _command_options() -> None: print('Obtained instance actor signing key') else: print('Did not obtain instance actor key for ' + domain) + mitm_servers = [] test_html = download_html(signing_priv_key_pem, session, argb.htmlpost, as_header, None, debug, __version__, - http_prefix, domain) + http_prefix, domain, mitm_servers) if test_html: print(test_html) session.close() @@ -1443,9 +1458,11 @@ def _command_options() -> None: '--domain option') sys.exit() session = create_session(None) + mitm_servers = [] verified = \ verify_html(session, argb.verifyurl, debug, __version__, - http_prefix, argb.nickname, domain) + http_prefix, argb.nickname, domain, + mitm_servers) session.close() if verified: print('Verified') @@ -1711,6 +1728,7 @@ def _command_options() -> None: followers_sync_cache = {} sites_unavailable = [] system_language = argb.language + mitm_servers = [] manual_approve_follow_request(session, session_onion, session_i2p, onion_domain, i2p_domain, base_dir, http_prefix, @@ -1722,7 +1740,8 @@ def _command_options() -> None: debug, __version__, signing_priv_key_pem, proxy_type, followers_sync_cache, - sites_unavailable, system_language) + sites_unavailable, system_language, + mitm_servers) session.close() sys.exit() @@ -1757,20 +1776,21 @@ def _command_options() -> None: session_i2p = create_session('i2p') followers_sync_cache = {} sites_unavailable = [] + mitm_servers = [] system_language = argb.language - manual_deny_follow_request(session, session_onion, session_i2p, - onion_domain, i2p_domain, - base_dir, http_prefix, - argb.nickname, domain, port, - argb.deny, - federation_list, - send_threads, post_log, - cached_webfingers, person_cache, - debug, __version__, - signing_priv_key_pem, - followers_sync_cache, - sites_unavailable, - system_language) + manual_deny_follow_request2(session, session_onion, session_i2p, + onion_domain, i2p_domain, + base_dir, http_prefix, + argb.nickname, domain, port, + argb.deny, + federation_list, + send_threads, post_log, + cached_webfingers, person_cache, + debug, __version__, + signing_priv_key_pem, + followers_sync_cache, + sites_unavailable, + system_language, mitm_servers) session.close() sys.exit() @@ -1882,6 +1902,7 @@ def _command_options() -> None: auto_cw_cache = {} # TODO searchable status searchable_by = [] + mitm_servers = [] print('Sending post to ' + argb.sendto) send_post_via_server(signing_priv_key_pem, __version__, @@ -1901,7 +1922,8 @@ def _command_options() -> None: argb.eventLocation, translate, argb.buyUrl, argb.chatUrl, auto_cw_cache, argb.debug, reply_to, reply_to, argb.conversationId, - argb.convthreadId, subject, searchable_by) + argb.convthreadId, subject, searchable_by, + mitm_servers) for _ in range(10): # TODO detect send success/fail time.sleep(1) @@ -1988,13 +2010,14 @@ def _command_options() -> None: system_language = argb.language print('Sending announce/repeat of ' + argb.announce) + mitm_servers = [] send_announce_via_server(base_dir, session, argb.nickname, argb.password, domain, port, http_prefix, argb.announce, cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(10): # TODO detect send success/fail time.sleep(1) @@ -2035,10 +2058,12 @@ def _command_options() -> None: signing_priv_key_pem = get_instance_actor_key(base_dir, domain) session = create_session(proxy_type) + mitm_servers = [] box_json = c2s_box_json(session, argb.nickname, argb.password, domain, port, http_prefix, argb.box, argb.pageNumber, - argb.debug, signing_priv_key_pem) + argb.debug, signing_priv_key_pem, + mitm_servers) if box_json: pprint(box_json) else: @@ -2098,6 +2123,7 @@ def _command_options() -> None: system_language = argb.language print('Sending shared item: ' + argb.itemName) + mitm_servers = [] send_share_via_server(base_dir, session, argb.nickname, argb.password, domain, port, @@ -2114,7 +2140,7 @@ def _command_options() -> None: debug, __version__, argb.itemPrice, argb.itemCurrency, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(10): # TODO detect send success/fail time.sleep(1) @@ -2144,6 +2170,7 @@ def _command_options() -> None: system_language = argb.language print('Sending undo of shared item: ' + argb.undoItemName) + mitm_servers = [] send_undo_share_via_server(base_dir, session, argb.nickname, argb.password, domain, port, @@ -2151,7 +2178,7 @@ def _command_options() -> None: argb.undoItemName, cached_webfingers, person_cache, debug, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(10): # TODO detect send success/fail time.sleep(1) @@ -2210,6 +2237,7 @@ def _command_options() -> None: system_language = argb.language print('Sending wanted item: ' + argb.wantedItemName) + mitm_servers = [] send_wanted_via_server(base_dir, session, argb.nickname, argb.password, domain, port, @@ -2226,7 +2254,7 @@ def _command_options() -> None: debug, __version__, argb.itemPrice, argb.itemCurrency, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(10): # TODO detect send success/fail time.sleep(1) @@ -2256,6 +2284,7 @@ def _command_options() -> None: system_language = argb.language print('Sending undo of wanted item: ' + argb.undoWantedItemName) + mitm_servers = [] send_undo_wanted_via_server(base_dir, session, argb.nickname, argb.password, domain, port, @@ -2263,7 +2292,7 @@ def _command_options() -> None: argb.undoWantedItemName, cached_webfingers, person_cache, debug, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(10): # TODO detect send success/fail time.sleep(1) @@ -2293,13 +2322,14 @@ def _command_options() -> None: system_language = argb.language print('Sending like of ' + argb.like) + mitm_servers = [] send_like_via_server(base_dir, session, argb.nickname, argb.password, domain, port, http_prefix, argb.like, cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(10): # TODO detect send success/fail time.sleep(1) @@ -2335,13 +2365,14 @@ def _command_options() -> None: system_language = argb.language print('Sending emoji reaction ' + argb.emoji + ' to ' + argb.react) + mitm_servers = [] send_reaction_via_server(base_dir, session, argb.nickname, argb.password, domain, port, http_prefix, argb.react, argb.emoji, cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(10): # TODO detect send success/fail time.sleep(1) @@ -2371,6 +2402,7 @@ def _command_options() -> None: system_language = argb.language print('Sending undo like of ' + argb.undolike) + mitm_servers = [] send_undo_like_via_server(base_dir, session, argb.nickname, argb.password, domain, port, @@ -2378,7 +2410,7 @@ def _command_options() -> None: cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(10): # TODO detect send success/fail time.sleep(1) @@ -2415,6 +2447,7 @@ def _command_options() -> None: print('Sending undo emoji reaction ' + argb.emoji + ' to ' + argb.react) + mitm_servers = [] send_undo_reaction_via_server(base_dir, session, argb.nickname, argb.password, domain, port, @@ -2422,7 +2455,7 @@ def _command_options() -> None: cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(10): # TODO detect send success/fail time.sleep(1) @@ -2452,6 +2485,7 @@ def _command_options() -> None: system_language = argb.language print('Sending bookmark of ' + argb.bookmark) + mitm_servers = [] send_bookmark_via_server(base_dir, session, argb.nickname, argb.password, domain, port, @@ -2459,7 +2493,7 @@ def _command_options() -> None: cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(10): # TODO detect send success/fail time.sleep(1) @@ -2489,13 +2523,14 @@ def _command_options() -> None: system_language = argb.language print('Sending undo bookmark of ' + argb.unbookmark) + mitm_servers = [] send_undo_bookmark_via_server(base_dir, session, argb.nickname, argb.password, domain, port, http_prefix, argb.unbookmark, cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(10): # TODO detect send success/fail time.sleep(1) @@ -2525,13 +2560,14 @@ def _command_options() -> None: system_language = argb.language print('Sending delete request of ' + argb.delete) + mitm_servers = [] send_delete_via_server(base_dir, session, argb.nickname, argb.password, domain, port, http_prefix, argb.delete, cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(10): # TODO detect send success/fail time.sleep(1) @@ -2575,6 +2611,7 @@ def _command_options() -> None: signing_priv_key_pem = get_instance_actor_key(base_dir, domain) system_language = argb.language + mitm_servers = [] send_follow_request_via_server(base_dir, session, argb.nickname, argb.password, domain, port, @@ -2583,7 +2620,7 @@ def _command_options() -> None: cached_webfingers, person_cache, debug, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(20): time.sleep(1) # TODO some method to know if it worked @@ -2628,6 +2665,7 @@ def _command_options() -> None: signing_priv_key_pem = get_instance_actor_key(base_dir, domain) system_language = argb.language + mitm_servers = [] send_unfollow_request_via_server(base_dir, session, argb.nickname, argb.password, domain, port, @@ -2636,7 +2674,7 @@ def _command_options() -> None: cached_webfingers, person_cache, debug, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(20): time.sleep(1) # TODO some method to know if it worked @@ -2667,12 +2705,14 @@ def _command_options() -> None: if argb.secure_mode: signing_priv_key_pem = get_instance_actor_key(base_dir, domain) + mitm_servers = [] following_json = \ get_following_via_server(session, argb.nickname, argb.password, domain, port, follow_http_prefix, argb.pageNumber, - debug, __version__, signing_priv_key_pem) + debug, __version__, signing_priv_key_pem, + mitm_servers) if following_json: pprint(following_json) session.close() @@ -2701,13 +2741,15 @@ def _command_options() -> None: if argb.secure_mode: signing_priv_key_pem = get_instance_actor_key(base_dir, domain) + mitm_servers = [] blocked_json = \ get_blocks_via_server(session, argb.nickname, argb.password, domain, port, blocked_http_prefix, argb.pageNumber, debug, __version__, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) if blocked_json: pprint(blocked_json) session.close() @@ -2735,14 +2777,14 @@ def _command_options() -> None: signing_priv_key_pem = None if argb.secure_mode: signing_priv_key_pem = get_instance_actor_key(base_dir, domain) - + mitm_servers = [] followers_json = \ get_followers_via_server(session, argb.nickname, argb.password, domain, port, follow_http_prefix, argb.pageNumber, debug, __version__, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if followers_json: pprint(followers_json) session.close() @@ -2771,13 +2813,15 @@ def _command_options() -> None: if argb.secure_mode: signing_priv_key_pem = get_instance_actor_key(base_dir, domain) + mitm_servers = [] follow_requests_json = \ get_follow_requests_via_server(session, argb.nickname, argb.password, domain, port, follow_http_prefix, argb.pageNumber, debug, __version__, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) if follow_requests_json: pprint(follow_requests_json) session.close() @@ -2836,10 +2880,11 @@ def _command_options() -> None: if argb.secure_mode: signing_priv_key_pem = get_instance_actor_key(base_dir, domain) block_federated = [] + mitm_servers = [] ctr = migrate_accounts(base_dir, session, http_prefix, cached_webfingers, True, signing_priv_key_pem, - block_federated) + block_federated, mitm_servers) if ctr == 0: print('No followed accounts have moved') else: @@ -2859,9 +2904,11 @@ def _command_options() -> None: print('Did not obtain instance actor key for ' + domain) if argb.actor.startswith('@'): argb.actor = argb.actor[1:] + mitm_servers = [] get_actor_json(domain, argb.actor, argb.http, argb.gnunet, argb.ipfs, argb.ipns, - debug, False, signing_priv_key_pem, None) + debug, False, signing_priv_key_pem, None, + mitm_servers) sys.exit() if argb.followers: @@ -2964,10 +3011,11 @@ def _command_options() -> None: signing_priv_key_pem = None if argb.secure_mode: signing_priv_key_pem = get_instance_actor_key(base_dir, domain) + mitm_servers = [] wf_request = webfinger_handle(session, handle, http_prefix, cached_webfingers, host_domain, __version__, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: print('Unable to webfinger ' + handle) session.close() @@ -3023,11 +3071,12 @@ def _command_options() -> None: signing_priv_key_pem = None if argb.secure_mode: signing_priv_key_pem = get_instance_actor_key(base_dir, domain) + mitm_servers = [] followers_list = \ download_follow_collection(signing_priv_key_pem, 'followers', session, http_prefix, person_url, 1, 3, - argb.debug) + argb.debug, mitm_servers) if followers_list: for actor in followers_list: print(actor) @@ -3317,6 +3366,7 @@ def _command_options() -> None: print('Sending ' + argb.skill + ' skill level ' + str(argb.skillLevelPercent) + ' for ' + nickname) + mitm_servers = [] send_skill_via_server(base_dir, session, nickname, argb.password, domain, port, @@ -3324,7 +3374,7 @@ def _command_options() -> None: argb.skill, argb.skillLevelPercent, cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for i in range(10): # TODO detect send success/fail time.sleep(1) @@ -3355,13 +3405,14 @@ def _command_options() -> None: print('Sending availability status of ' + nickname + ' as ' + argb.availability) + mitm_servers = [] send_availability_via_server(base_dir, session, nickname, argb.password, domain, port, http_prefix, argb.availability, cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for i in range(10): # TODO detect send success/fail time.sleep(1) @@ -3472,12 +3523,13 @@ def _command_options() -> None: system_language = argb.language print('Sending block of ' + argb.block) + mitm_servers = [] send_block_via_server(base_dir, session, nickname, argb.password, domain, port, http_prefix, argb.block, cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for i in range(10): # TODO detect send success/fail time.sleep(1) @@ -3507,12 +3559,13 @@ def _command_options() -> None: system_language = argb.language print('Sending mute of ' + argb.mute) + mitm_servers = [] send_mute_via_server(base_dir, session, nickname, argb.password, domain, port, http_prefix, argb.mute, cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for i in range(10): # TODO detect send success/fail time.sleep(1) @@ -3542,12 +3595,13 @@ def _command_options() -> None: system_language = argb.language print('Sending undo mute of ' + argb.unmute) + mitm_servers = [] send_undo_mute_via_server(base_dir, session, nickname, argb.password, domain, port, http_prefix, argb.unmute, cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for i in range(10): # TODO detect send success/fail time.sleep(1) @@ -3589,12 +3643,13 @@ def _command_options() -> None: system_language = argb.language print('Sending undo block of ' + argb.unblock) + mitm_servers = [] send_undo_block_via_server(base_dir, session, nickname, argb.password, domain, port, http_prefix, argb.unblock, cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for i in range(10): # TODO detect send success/fail time.sleep(1) diff --git a/follow.py b/follow.py index 4c5108d94..80114dba1 100644 --- a/follow.py +++ b/follow.py @@ -763,7 +763,8 @@ def followed_account_accepts(session, base_dir: str, http_prefix: str, onion_domain: str, i2p_domain: str, followers_sync_cache: {}, sites_unavailable: [], - system_language: str): + system_language: str, + mitm_servers: []): """The person receiving a follow request accepts the new follower and sends back an Accept activity """ @@ -820,7 +821,7 @@ def followed_account_accepts(session, base_dir: str, http_prefix: str, group_account, signing_priv_key_pem, 7856837, curr_domain, onion_domain, i2p_domain, extra_headers, sites_unavailable, - system_language) + system_language, mitm_servers) def followed_account_rejects(session, session_onion, session_i2p, @@ -836,7 +837,8 @@ def followed_account_rejects(session, session_onion, session_i2p, signing_priv_key_pem: str, followers_sync_cache: {}, sites_unavailable: [], - system_language: str): + system_language: str, + mitm_servers: []): """The person receiving a follow request rejects the new follower and sends back a Reject activity """ @@ -906,7 +908,7 @@ def followed_account_rejects(session, session_onion, session_i2p, 6393063, domain, onion_domain, i2p_domain, extra_headers, sites_unavailable, - system_language) + system_language, mitm_servers) def send_follow_request(session, base_dir: str, @@ -923,7 +925,8 @@ def send_follow_request(session, base_dir: str, curr_domain: str, onion_domain: str, i2p_domain: str, sites_unavailable: [], - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Gets the json object for sending a follow request """ if not signing_priv_key_pem: @@ -1012,7 +1015,7 @@ def send_follow_request(session, base_dir: str, signing_priv_key_pem, 8234389, curr_domain, onion_domain, i2p_domain, extra_headers, sites_unavailable, - system_language) + system_language, mitm_servers) return new_follow_json @@ -1026,7 +1029,8 @@ def send_follow_request_via_server(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Creates a follow request via c2s """ if not session: @@ -1060,7 +1064,7 @@ def send_follow_request_via_server(base_dir: str, session, wf_request = \ webfinger_handle(session, handle, http_prefix, cached_webfingers, from_domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: follow request webfinger failed for ' + handle) @@ -1081,7 +1085,7 @@ def send_follow_request_via_server(base_dir: str, session, project_version, http_prefix, from_nickname, from_domain, post_to_box, 52025, - system_language) + system_language, mitm_servers) if not inbox_url: if debug: @@ -1123,7 +1127,8 @@ def send_unfollow_request_via_server(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Creates a unfollow request via c2s """ if not session: @@ -1161,7 +1166,7 @@ def send_unfollow_request_via_server(base_dir: str, session, wf_request = \ webfinger_handle(session, handle, http_prefix, cached_webfingers, from_domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: unfollow webfinger failed for ' + handle) @@ -1183,7 +1188,8 @@ def send_unfollow_request_via_server(base_dir: str, session, project_version, http_prefix, from_nickname, from_domain, post_to_box, - 76536, system_language) + 76536, system_language, + mitm_servers) if not inbox_url: if debug: @@ -1220,7 +1226,8 @@ def get_following_via_server(session, nickname: str, password: str, domain: str, port: int, http_prefix: str, page_number: int, debug: bool, project_version: str, - signing_priv_key_pem: str) -> {}: + signing_priv_key_pem: str, + mitm_servers: []) -> {}: """Gets a page from the following collection as json """ if not session: @@ -1242,7 +1249,7 @@ def get_following_via_server(session, nickname: str, password: str, url = follow_actor + '/following?page=' + str(page_number) following_json = \ get_json(signing_priv_key_pem, session, url, headers, {}, debug, - project_version, http_prefix, domain, 10, True) + mitm_servers, project_version, http_prefix, domain, 10, True) if not get_json_valid(following_json): if debug: print('DEBUG: GET following list failed for c2s to ' + url) @@ -1258,7 +1265,8 @@ def get_followers_via_server(session, nickname: str, password: str, domain: str, port: int, http_prefix: str, page_number: int, debug: bool, project_version: str, - signing_priv_key_pem: str) -> {}: + signing_priv_key_pem: str, + mitm_servers: []) -> {}: """Gets a page from the followers collection as json """ if not session: @@ -1280,7 +1288,7 @@ def get_followers_via_server(session, nickname: str, password: str, url = follow_actor + '/followers?page=' + str(page_number) followers_json = \ get_json(signing_priv_key_pem, session, url, headers, {}, debug, - project_version, http_prefix, domain, 10, True) + mitm_servers, project_version, http_prefix, domain, 10, True) if not get_json_valid(followers_json): if debug: print('DEBUG: GET followers list failed for c2s to ' + url) @@ -1297,7 +1305,8 @@ def get_follow_requests_via_server(session, domain: str, port: int, http_prefix: str, page_number: int, debug: bool, project_version: str, - signing_priv_key_pem: str) -> {}: + signing_priv_key_pem: str, + mitm_servers: []) -> {}: """Gets a page from the follow requests collection as json """ if not session: @@ -1319,7 +1328,7 @@ def get_follow_requests_via_server(session, url = follow_actor + '/followrequests?page=' + str(page_number) followers_json = \ get_json(signing_priv_key_pem, session, url, headers, {}, debug, - project_version, http_prefix, domain, 10, True) + mitm_servers, project_version, http_prefix, domain, 10, True) if not get_json_valid(followers_json): if debug: print('DEBUG: GET follow requests list failed for c2s to ' + url) @@ -1336,7 +1345,8 @@ def approve_follow_request_via_server(session, domain: str, port: int, http_prefix: str, approve_handle: int, debug: bool, project_version: str, - signing_priv_key_pem: str) -> str: + signing_priv_key_pem: str, + mitm_servers: []) -> str: """Approves a follow request This is not exactly via c2s though. It simulates pressing the Approve button on the web interface @@ -1359,7 +1369,7 @@ def approve_follow_request_via_server(session, url = actor + '/followapprove=' + approve_handle approve_html = \ get_json(signing_priv_key_pem, session, url, headers, {}, debug, - project_version, http_prefix, domain, 10, True) + mitm_servers, project_version, http_prefix, domain, 10, True) if not get_json_valid(approve_html): if debug: print('DEBUG: GET approve follow request failed for c2s to ' + url) @@ -1376,7 +1386,8 @@ def deny_follow_request_via_server(session, domain: str, port: int, http_prefix: str, deny_handle: int, debug: bool, project_version: str, - signing_priv_key_pem: str) -> str: + signing_priv_key_pem: str, + mitm_servers: []) -> str: """Denies a follow request This is not exactly via c2s though. It simulates pressing the Deny button on the web interface @@ -1399,7 +1410,7 @@ def deny_follow_request_via_server(session, url = actor + '/followdeny=' + deny_handle deny_html = \ get_json(signing_priv_key_pem, session, url, headers, {}, debug, - project_version, http_prefix, domain, 10, True) + mitm_servers, project_version, http_prefix, domain, 10, True) if not get_json_valid(deny_html): if debug: print('DEBUG: GET deny follow request failed for c2s to ' + url) diff --git a/importFollowing.py b/importFollowing.py index 2c66cd9a6..7645b7e43 100644 --- a/importFollowing.py +++ b/importFollowing.py @@ -165,7 +165,8 @@ def _update_import_following(base_dir: str, httpd.onion_domain, httpd.i2p_domain, httpd.sites_unavailable, - httpd.system_language) + httpd.system_language, + httpd.mitm_servers) # remove the followed handle from the import list following_str = following_str.replace(orig_line + '\n', '') diff --git a/inbox.py b/inbox.py index 6e4067f22..23bfd322b 100644 --- a/inbox.py +++ b/inbox.py @@ -189,7 +189,8 @@ def _inbox_store_post_to_html_cache(recent_posts_cache: {}, dogwhistles: {}, min_images_for_accounts: [], buy_sites: {}, - auto_cw_cache: {}) -> None: + auto_cw_cache: {}, + mitm_servers: []) -> None: """Converts the json post into html and stores it in a cache This enables the post to be quickly displayed later """ @@ -219,7 +220,8 @@ def _inbox_store_post_to_html_cache(recent_posts_cache: {}, not_dm, True, True, False, True, False, cw_lists, lists_enabled, timezone, mitm, bold_reading, dogwhistles, minimize_all_images, - None, buy_sites, auto_cw_cache) + None, buy_sites, auto_cw_cache, + mitm_servers) def valid_inbox(base_dir: str, nickname: str, domain: str) -> bool: @@ -801,7 +803,8 @@ def update_edited_post(base_dir: str, buy_sites: {}, auto_cw_cache: {}, onion_domain: str, - i2p_domain: str) -> None: + i2p_domain: str, + mitm_servers: []) -> None: """ When an edited post is created this assigns a published and updated date to it, and uses the previous id @@ -851,7 +854,8 @@ def update_edited_post(base_dir: str, min_images_for_accounts, max_hashtags, buy_sites, auto_cw_cache, - onion_domain, i2p_domain) + onion_domain, i2p_domain, + mitm_servers) # update the index id_str = edited_postid.split('/')[-1] @@ -947,7 +951,8 @@ def _obtain_avatar_for_reply_post(session, base_dir: str, http_prefix: str, i2p_domain: str, person_cache: {}, post_json_object: {}, debug: bool, - signing_priv_key_pem: str) -> None: + signing_priv_key_pem: str, + mitm_servers: []) -> None: """Tries to obtain the actor for the person being replied to so that their avatar can later be shown """ @@ -980,7 +985,8 @@ def _obtain_avatar_for_reply_post(session, base_dir: str, http_prefix: str, person_cache, debug, __version__, http_prefix, domain, onion_domain, i2p_domain, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) if pub_key: if not isinstance(pub_key, dict): if debug: @@ -1096,7 +1102,8 @@ def _send_to_group_members(server, session, session_onion, session_i2p, onion_domain: str, i2p_domain: str, signing_priv_key_pem: str, sites_unavailable: [], - system_language: str) -> None: + system_language: str, + mitm_servers: []) -> None: """When a post arrives for a group send it out to the group members """ if debug: @@ -1153,7 +1160,8 @@ def _send_to_group_members(server, session, session_onion, session_i2p, person_cache, cached_webfingers, debug, __version__, signing_priv_key_pem, curr_domain, onion_domain, i2p_domain, - sites_unavailable, system_language) + sites_unavailable, system_language, + mitm_servers) send_to_followers_thread(server, session, session_onion, session_i2p, base_dir, nickname, domain, @@ -1165,7 +1173,8 @@ def _send_to_group_members(server, session, session_onion, session_i2p, shared_items_federated_domains, shared_item_federation_tokens, signing_priv_key_pem, - sites_unavailable, system_language) + sites_unavailable, system_language, + mitm_servers) def _inbox_update_calendar_from_tag(base_dir: str, handle: str, @@ -1299,7 +1308,8 @@ def _bounce_dm(sender_post_id: str, session, http_prefix: str, languages_understood: [], bounce_is_chat: bool, curr_domain: str, onion_domain: str, i2p_domain: str, - sites_unavailable: []) -> bool: + sites_unavailable: [], + mitm_servers: []) -> bool: """Sends a bounce message back to the sending handle if a DM has been rejected """ @@ -1383,7 +1393,8 @@ def _bounce_dm(sender_post_id: str, session, http_prefix: str, person_cache, debug, __version__, None, group_account, signing_priv_key_pem, 7238634, curr_domain, onion_domain, i2p_domain, - extra_headers, sites_unavailable, system_language) + extra_headers, sites_unavailable, system_language, + mitm_servers) return True @@ -1401,7 +1412,8 @@ def _is_valid_dm(base_dir: str, nickname: str, domain: str, port: int, dm_license_url: str, languages_understood: [], curr_domain: str, onion_domain: str, i2p_domain: str, - sites_unavailable: []) -> bool: + sites_unavailable: [], + mitm_servers: []) -> bool: """Is the given message a valid DM? """ if nickname == 'inbox': @@ -1506,7 +1518,8 @@ def _is_valid_dm(base_dir: str, nickname: str, domain: str, port: int, bounce_chat, curr_domain, onion_domain, i2p_domain, - sites_unavailable) + sites_unavailable, + mitm_servers) return False # dm index will be updated @@ -1785,7 +1798,8 @@ def _inbox_after_initial(server, inbox_start_time, mitm: bool, bold_reading: bool, dogwhistles: {}, max_hashtags: int, buy_sites: {}, - sites_unavailable: []) -> bool: + sites_unavailable: [], + mitm_servers: []) -> bool: """ Anything which needs to be done after initial checks have passed """ # if this is a clearnet instance then replace any onion/i2p @@ -1849,7 +1863,8 @@ def _inbox_after_initial(server, inbox_start_time, max_like_count, cw_lists, lists_enabled, bold_reading, dogwhistles, server.min_images_for_accounts, - buy_sites, server.auto_cw_cache): + buy_sites, server.auto_cw_cache, + mitm_servers): if debug: print('DEBUG: Like accepted from ' + actor) fitness_performance(inbox_start_time, server.fitness, @@ -1876,7 +1891,8 @@ def _inbox_after_initial(server, inbox_start_time, max_like_count, cw_lists, lists_enabled, bold_reading, dogwhistles, server.min_images_for_accounts, - buy_sites, server.auto_cw_cache): + buy_sites, server.auto_cw_cache, + mitm_servers): if debug: print('DEBUG: Undo like accepted from ' + actor) fitness_performance(inbox_start_time, server.fitness, @@ -1904,7 +1920,8 @@ def _inbox_after_initial(server, inbox_start_time, max_like_count, cw_lists, lists_enabled, bold_reading, dogwhistles, server.min_images_for_accounts, - buy_sites, server.auto_cw_cache): + buy_sites, server.auto_cw_cache, + mitm_servers): if debug: print('DEBUG: Reaction accepted from ' + actor) fitness_performance(inbox_start_time, server.fitness, @@ -1932,7 +1949,8 @@ def _inbox_after_initial(server, inbox_start_time, max_like_count, cw_lists, lists_enabled, bold_reading, dogwhistles, server.min_images_for_accounts, - buy_sites, server.auto_cw_cache): + buy_sites, server.auto_cw_cache, + mitm_servers): if debug: print('DEBUG: Zot reaction accepted from ' + actor) fitness_performance(inbox_start_time, server.fitness, @@ -1959,7 +1977,8 @@ def _inbox_after_initial(server, inbox_start_time, max_like_count, cw_lists, lists_enabled, bold_reading, dogwhistles, server.min_images_for_accounts, - buy_sites, server.auto_cw_cache): + buy_sites, server.auto_cw_cache, + mitm_servers): if debug: print('DEBUG: Undo reaction accepted from ' + actor) fitness_performance(inbox_start_time, server.fitness, @@ -1987,7 +2006,8 @@ def _inbox_after_initial(server, inbox_start_time, bold_reading, dogwhistles, server.min_images_for_accounts, server.buy_sites, - server.auto_cw_cache): + server.auto_cw_cache, + mitm_servers): if debug: print('DEBUG: Bookmark accepted from ' + actor) fitness_performance(inbox_start_time, server.fitness, @@ -2015,7 +2035,8 @@ def _inbox_after_initial(server, inbox_start_time, bold_reading, dogwhistles, server.min_images_for_accounts, server.buy_sites, - server.auto_cw_cache): + server.auto_cw_cache, + mitm_servers): if debug: print('DEBUG: Undo bookmark accepted from ' + actor) fitness_performance(inbox_start_time, server.fitness, @@ -2063,7 +2084,8 @@ def _inbox_after_initial(server, inbox_start_time, server.buy_sites, languages_understood, server.auto_cw_cache, - server.block_federated): + server.block_federated, + mitm_servers): if debug: print('DEBUG: Announce accepted from ' + actor) fitness_performance(inbox_start_time, server.fitness, @@ -2132,7 +2154,8 @@ def _inbox_after_initial(server, inbox_start_time, server.min_images_for_accounts, server.buy_sites, server.sites_unavailable, - server.auto_cw_cache) + server.auto_cw_cache, + mitm_servers) fitness_performance(inbox_start_time, server.fitness, 'INBOX', '_receive_question_vote', debug) @@ -2159,7 +2182,7 @@ def _inbox_after_initial(server, inbox_start_time, if not valid_sending_actor(session, base_dir, nickname, domain, person_cache, post_json_object, signing_priv_key_pem, debug, unit_test, - system_language): + system_language, mitm_servers): if debug: print('Inbox sending actor is not valid ' + str(post_json_object)) @@ -2233,7 +2256,8 @@ def _inbox_after_initial(server, inbox_start_time, languages_understood, domain, onion_domain, i2p_domain, - server.sites_unavailable): + server.sites_unavailable, + mitm_servers): if debug: print('Invalid DM ' + str(post_json_object)) return False @@ -2274,7 +2298,7 @@ def _inbox_after_initial(server, inbox_start_time, recent_posts_cache, debug, system_language, domain_full, person_cache, signing_priv_key_pem, bold_reading, show_vote_posts, - languages_understood): + languages_understood, mitm_servers): # media index will be updated update_index_list.append('tlmedia') fitness_performance(inbox_start_time, server.fitness, @@ -2290,7 +2314,7 @@ def _inbox_after_initial(server, inbox_start_time, http_prefix, domain, onion_domain, i2p_domain, person_cache, post_json_object, debug, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) fitness_performance(inbox_start_time, server.fitness, 'INBOX', '_obtain_avatar_for_reply_post', debug) @@ -2488,7 +2512,8 @@ def _inbox_after_initial(server, inbox_start_time, dogwhistles, min_img_for_accounts, buy_sites, - server.auto_cw_cache) + server.auto_cw_cache, + server.mitm_servers) fitness_performance(inbox_start_time, server.fitness, 'INBOX', @@ -2556,7 +2581,8 @@ def _inbox_after_initial(server, inbox_start_time, domain, onion_domain, i2p_domain, signing_priv_key_pem, sites_unavailable, - system_language) + system_language, + mitm_servers) fitness_performance(inbox_start_time, server.fitness, 'INBOX', '_send_to_group_members', @@ -2827,7 +2853,8 @@ def _receive_follow_request(session, session_onion, session_i2p, i2p_domain: str, signing_priv_key_pem: str, unit_test: bool, system_language: str, followers_sync_cache: {}, - sites_unavailable: []) -> bool: + sites_unavailable: [], + mitm_servers: []) -> bool: """Receives a follow request within the POST section of HTTPServer """ if not message_json['type'].startswith('Follow'): @@ -2958,7 +2985,7 @@ def _receive_follow_request(session, session_onion, session_i2p, nickname_to_follow, domain_to_follow, person_cache, message_json, signing_priv_key_pem, debug, unit_test, - system_language): + system_language, mitm_servers): print('REJECT spam follow request ' + approve_handle) return True @@ -2996,7 +3023,8 @@ def _receive_follow_request(session, session_onion, session_i2p, person_cache, debug, project_version, curr_http_prefix, this_domain, onion_domain, - i2p_domain, signing_priv_key_pem) + i2p_domain, signing_priv_key_pem, + mitm_servers) if not pubkey_result: if debug: print('Unable to obtain following actor: ' + @@ -3047,7 +3075,8 @@ def _receive_follow_request(session, session_onion, session_i2p, person_cache, debug, project_version, curr_http_prefix, this_domain, onion_domain, i2p_domain, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) if not pubkey_result: if debug: print('Unable to obtain following actor: ' + @@ -3111,7 +3140,7 @@ def _receive_follow_request(session, session_onion, session_i2p, signing_priv_key_pem, this_domain, onion_domain, i2p_domain, followers_sync_cache, sites_unavailable, - system_language) + system_language, mitm_servers) def run_inbox_queue(server, @@ -3381,7 +3410,8 @@ def run_inbox_queue(server, person_cache, debug, project_version, http_prefix, domain, onion_domain, i2p_domain, - signing_priv_key_pem) + signing_priv_key_pem, + server.mitm_servers) fitness_performance(inbox_start_time, server.fitness, 'INBOX', 'get_person_pub_key', debug) inbox_start_time = time.time() @@ -3552,7 +3582,8 @@ def run_inbox_queue(server, signing_priv_key_pem, unit_test, system_language, server.followers_sync_cache, - server.sites_unavailable): + server.sites_unavailable, + server.mitm_servers): if os.path.isfile(queue_filename): try: os.remove(queue_filename) @@ -3606,7 +3637,8 @@ def run_inbox_queue(server, server.sites_unavailable, server.blocked_cache, server.block_federated, - server.system_language): + server.system_language, + server.mitm_servers): if debug: print('Queue: _receive_move_activity ' + key_id) if os.path.isfile(queue_filename): @@ -3647,7 +3679,7 @@ def run_inbox_queue(server, max_hashtags, server.buy_sites, server.auto_cw_cache, onion_domain, - i2p_domain): + i2p_domain, server.mitm_servers): if debug: print('Queue: Update accepted from ' + key_id) if os.path.isfile(queue_filename): @@ -3777,7 +3809,8 @@ def run_inbox_queue(server, languages_understood, mitm, bold_reading, dogwhistles, max_hashtags, server.buy_sites, - server.sites_unavailable) + server.sites_unavailable, + server.mitm_servers) fitness_performance(inbox_start_time, server.fitness, 'INBOX', 'handle_after_initial', debug) diff --git a/inbox_receive.py b/inbox_receive.py index 8cb072906..333f1a4a0 100644 --- a/inbox_receive.py +++ b/inbox_receive.py @@ -374,7 +374,8 @@ def receive_edit_to_post(recent_posts_cache: {}, message_json: {}, buy_sites: {}, auto_cw_cache: {}, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """A post was edited """ if not has_object_dict(message_json): @@ -515,7 +516,8 @@ def receive_edit_to_post(recent_posts_cache: {}, message_json: {}, lists_enabled, timezone, mitm, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) return True @@ -533,7 +535,8 @@ def receive_move_activity(session, base_dir: str, sites_unavailable: [], blocked_cache: [], block_federated: [], - system_language: str) -> bool: + system_language: str, + mitm_servers: []) -> bool: """Receives a move activity within the POST section of HTTPServer https://codeberg.org/fediverse/fep/src/branch/main/fep/7628/fep-7628.md """ @@ -623,7 +626,8 @@ def receive_move_activity(session, base_dir: str, onion_domain, i2p_domain, sites_unavailable, - system_language) + system_language, + mitm_servers) return True @@ -649,7 +653,8 @@ def receive_update_activity(recent_posts_cache: {}, session, base_dir: str, buy_sites: {}, auto_cw_cache: {}, onion_domain: str, - i2p_domain: str) -> bool: + i2p_domain: str, + mitm_servers: []) -> bool: """Receives an Update activity within the POST section of HTTPServer """ if message_json['type'] != 'Update': @@ -695,7 +700,8 @@ def receive_update_activity(recent_posts_cache: {}, session, base_dir: str, min_images_for_accounts, max_hashtags, buy_sites, auto_cw_cache, - onion_domain, i2p_domain): + onion_domain, i2p_domain, + mitm_servers): print('EDITPOST: received ' + message_json['object']['id']) return True else: @@ -951,7 +957,8 @@ def receive_like(recent_posts_cache: {}, bold_reading: bool, dogwhistles: {}, min_images_for_accounts: [], buy_sites: {}, - auto_cw_cache: {}) -> bool: + auto_cw_cache: {}, + mitm_servers: []) -> bool: """Receives a Like activity within the POST section of HTTPServer """ if message_json['type'] != 'Like': @@ -1067,7 +1074,7 @@ def receive_like(recent_posts_cache: {}, lists_enabled, timezone, mitm, bold_reading, dogwhistles, minimize_all_images, None, buy_sites, - auto_cw_cache) + auto_cw_cache, mitm_servers) return True @@ -1091,7 +1098,8 @@ def receive_reaction(recent_posts_cache: {}, dogwhistles: {}, min_images_for_accounts: [], buy_sites: {}, - auto_cw_cache: {}) -> bool: + auto_cw_cache: {}, + mitm_servers: []) -> bool: """Receives an emoji reaction within the POST section of HTTPServer """ if message_json['type'] != 'EmojiReact': @@ -1228,7 +1236,7 @@ def receive_reaction(recent_posts_cache: {}, lists_enabled, timezone, mitm, bold_reading, dogwhistles, minimize_all_images, None, buy_sites, - auto_cw_cache) + auto_cw_cache, mitm_servers) return True @@ -1252,7 +1260,8 @@ def receive_zot_reaction(recent_posts_cache: {}, dogwhistles: {}, min_images_for_accounts: [], buy_sites: {}, - auto_cw_cache: {}) -> bool: + auto_cw_cache: {}, + mitm_servers: []) -> bool: """Receives an zot-style emoji reaction within the POST section of HTTPServer A zot style emoji reaction is an ordinary reply Note whose content is exactly one emoji @@ -1414,7 +1423,8 @@ def receive_zot_reaction(recent_posts_cache: {}, lists_enabled, timezone, mitm, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) return True @@ -1436,7 +1446,8 @@ def receive_bookmark(recent_posts_cache: {}, dogwhistles: {}, min_images_for_accounts: [], buy_sites: {}, - auto_cw_cache: {}) -> bool: + auto_cw_cache: {}, + mitm_servers: []) -> bool: """Receives a bookmark activity within the POST section of HTTPServer """ if not message_json.get('type'): @@ -1540,7 +1551,8 @@ def receive_bookmark(recent_posts_cache: {}, lists_enabled, timezone, mitm, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) return True @@ -1643,7 +1655,8 @@ def receive_announce(recent_posts_cache: {}, buy_sites: {}, languages_understood: [], auto_cw_cache: {}, - block_federated: []) -> bool: + block_federated: [], + mitm_servers: []) -> bool: """Receives an announce activity within the POST section of HTTPServer """ if message_json['type'] != 'Announce': @@ -1811,7 +1824,8 @@ def receive_announce(recent_posts_cache: {}, lists_enabled, timezone, mitm, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) if not announce_html: print('WARN: Unable to generate html for announce ' + str(message_json)) @@ -1835,7 +1849,8 @@ def receive_announce(recent_posts_cache: {}, blocked_cache, block_federated, bold_reading, show_vote_posts, - languages_understood) + languages_understood, + mitm_servers) # are annouced/boosted replies allowed? announce_denied = False if post_json_object: @@ -1920,7 +1935,8 @@ def receive_announce(recent_posts_cache: {}, __version__, http_prefix, domain, onion_domain, i2p_domain, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) if pub_key: if not isinstance(pub_key, dict): if debug: @@ -1964,7 +1980,8 @@ def receive_question_vote(server, base_dir: str, nickname: str, domain: str, min_images_for_accounts: [], buy_sites: {}, sites_unavailable: [], - auto_cw_cache: {}) -> None: + auto_cw_cache: {}, + mitm_servers: []) -> None: """Updates the votes on a Question/poll """ # if this is a reply to a question then update the votes @@ -2023,7 +2040,8 @@ def receive_question_vote(server, base_dir: str, nickname: str, domain: str, lists_enabled, timezone, mitm, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) # add id to inbox index inbox_update_index('inbox', base_dir, handle, @@ -2048,4 +2066,5 @@ def receive_question_vote(server, base_dir: str, nickname: str, domain: str, shared_items_federated_domains, shared_item_federation_tokens, signing_priv_key_pem, - sites_unavailable, system_language) + sites_unavailable, system_language, + mitm_servers) diff --git a/inbox_receive_undo.py b/inbox_receive_undo.py index e22c7ab8e..98ddc4562 100644 --- a/inbox_receive_undo.py +++ b/inbox_receive_undo.py @@ -175,7 +175,8 @@ def receive_undo_like(recent_posts_cache: {}, bold_reading: bool, dogwhistles: {}, min_images_for_accounts: [], buy_sites: {}, - auto_cw_cache: {}) -> bool: + auto_cw_cache: {}, + mitm_servers: []) -> bool: """Receives an undo like activity within the POST section of HTTPServer """ if message_json['type'] != 'Undo': @@ -278,7 +279,8 @@ def receive_undo_like(recent_posts_cache: {}, lists_enabled, timezone, mitm, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) return True @@ -301,7 +303,8 @@ def receive_undo_reaction(recent_posts_cache: {}, bold_reading: bool, dogwhistles: {}, min_images_for_accounts: [], buy_sites: {}, - auto_cw_cache: {}) -> bool: + auto_cw_cache: {}, + mitm_servers: []) -> bool: """Receives an undo emoji reaction within the POST section of HTTPServer """ if message_json['type'] != 'Undo': @@ -422,7 +425,8 @@ def receive_undo_reaction(recent_posts_cache: {}, lists_enabled, timezone, mitm, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) return True @@ -444,7 +448,8 @@ def receive_undo_bookmark(recent_posts_cache: {}, dogwhistles: {}, min_images_for_accounts: [], buy_sites: {}, - auto_cw_cache: {}) -> bool: + auto_cw_cache: {}, + mitm_servers: []) -> bool: """Receives an undo bookmark activity within the POST section of HTTPServer """ if not message_json.get('type'): @@ -549,7 +554,8 @@ def receive_undo_bookmark(recent_posts_cache: {}, False, True, False, cw_lists, lists_enabled, timezone, mitm, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) return True diff --git a/like.py b/like.py index 8f705227a..14e819ffb 100644 --- a/like.py +++ b/like.py @@ -82,7 +82,8 @@ def _create_like(recent_posts_cache: {}, curr_domain: str, onion_domain: str, i2p_domain: str, sites_unavailable: [], - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Creates a like actor is the person doing the liking 'to' might be a specific person (actor) whose post was liked @@ -155,7 +156,7 @@ def _create_like(recent_posts_cache: {}, signing_priv_key_pem, 7367374, curr_domain, onion_domain, i2p_domain, extra_headers, sites_unavailable, - system_language) + system_language, mitm_servers) return new_like_json @@ -172,7 +173,8 @@ def like_post(recent_posts_cache: {}, signing_priv_key_pem: str, curr_domain: str, onion_domain: str, i2p_domain: str, sites_unavailable: [], - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Likes a given status post. This is only used by unit tests """ like_domain = get_full_domain(like_domain, like_port) @@ -189,7 +191,8 @@ def like_post(recent_posts_cache: {}, cached_webfingers, debug, project_version, signing_priv_key_pem, curr_domain, onion_domain, i2p_domain, - sites_unavailable, system_language) + sites_unavailable, system_language, + mitm_servers) def send_like_via_server(base_dir: str, session, @@ -199,7 +202,8 @@ def send_like_via_server(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Creates a like via c2s """ if not session: @@ -226,7 +230,7 @@ def send_like_via_server(base_dir: str, session, wf_request = webfinger_handle(session, handle, http_prefix, cached_webfingers, from_domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: like webfinger failed for ' + handle) @@ -248,7 +252,7 @@ def send_like_via_server(base_dir: str, session, project_version, http_prefix, from_nickname, from_domain, post_to_box, 72873, - system_language) + system_language, mitm_servers) if not inbox_url: if debug: @@ -287,7 +291,8 @@ def send_undo_like_via_server(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Undo a like via c2s """ if not session: @@ -318,7 +323,7 @@ def send_undo_like_via_server(base_dir: str, session, wf_request = webfinger_handle(session, handle, http_prefix, cached_webfingers, from_domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: unlike webfinger failed for ' + handle) @@ -340,7 +345,8 @@ def send_undo_like_via_server(base_dir: str, session, person_cache, project_version, http_prefix, from_nickname, from_domain, post_to_box, - 72625, system_language) + 72625, system_language, + mitm_servers) if not inbox_url: if debug: diff --git a/manualapprove.py b/manualapprove.py index aa672393c..f588228b8 100644 --- a/manualapprove.py +++ b/manualapprove.py @@ -25,20 +25,21 @@ from threads import begin_thread from session import create_session -def manual_deny_follow_request(session, session_onion, session_i2p, - onion_domain: str, i2p_domain: str, - base_dir: str, http_prefix: str, - nickname: str, domain: str, port: int, - deny_handle: str, - federation_list: [], - send_threads: [], post_log: [], - cached_webfingers: {}, person_cache: {}, - debug: bool, - project_version: str, - signing_priv_key_pem: str, - followers_sync_cache: {}, - sites_unavailable: [], - system_language: str) -> None: +def manual_deny_follow_request2(session, session_onion, session_i2p, + onion_domain: str, i2p_domain: str, + base_dir: str, http_prefix: str, + nickname: str, domain: str, port: int, + deny_handle: str, + federation_list: [], + send_threads: [], post_log: [], + cached_webfingers: {}, person_cache: {}, + debug: bool, + project_version: str, + signing_priv_key_pem: str, + followers_sync_cache: {}, + sites_unavailable: [], + system_language: str, + mitm_servers: []) -> None: """Manually deny a follow request """ accounts_dir = acct_dir(base_dir, nickname, domain) @@ -61,7 +62,7 @@ def manual_deny_follow_request(session, session_onion, session_i2p, encoding='utf-8') as fp_rejects: fp_rejects.write(deny_handle + '\n') except OSError: - print('EX: manual_deny_follow_request unable to append ' + + print('EX: manual_deny_follow_request2 unable to append ' + rejected_follows_filename) deny_nickname = deny_handle.split('@')[0] @@ -82,7 +83,7 @@ def manual_deny_follow_request(session, session_onion, session_i2p, signing_priv_key_pem, followers_sync_cache, sites_unavailable, - system_language) + system_language, mitm_servers) print('Follow request from ' + deny_handle + ' was denied.') @@ -100,13 +101,14 @@ def manual_deny_follow_request_thread(session, session_onion, session_i2p, signing_priv_key_pem: str, followers_sync_cache: {}, sites_unavailable: [], - system_language: str) -> None: + system_language: str, + mitm_servers: []) -> None: """Manually deny a follow request, within a thread so that the user interface doesn't lag """ - print('THREAD: manual_deny_follow_request') + print('THREAD: manual_deny_follow_request2') thr = \ - thread_with_trace(target=manual_deny_follow_request, + thread_with_trace(target=manual_deny_follow_request2, args=(session, session_onion, session_i2p, onion_domain, i2p_domain, base_dir, http_prefix, @@ -120,7 +122,8 @@ def manual_deny_follow_request_thread(session, session_onion, session_i2p, signing_priv_key_pem, followers_sync_cache, sites_unavailable, - system_language), daemon=True) + system_language, + mitm_servers), daemon=True) begin_thread(thr, 'manual_deny_follow_request_thread') send_threads.append(thr) @@ -164,7 +167,8 @@ def manual_approve_follow_request(session, session_onion, session_i2p, proxy_type: str, followers_sync_cache: {}, sites_unavailable: [], - system_language: str) -> None: + system_language: str, + mitm_servers: []) -> None: """Manually approve a follow request """ handle = nickname + '@' + domain @@ -315,7 +319,8 @@ def manual_approve_follow_request(session, session_onion, session_i2p, i2p_domain, followers_sync_cache, sites_unavailable, - system_language) + system_language, + mitm_servers) update_approved_followers = True except OSError as exc: print('EX: manual_approve_follow_request unable to write ' + @@ -390,7 +395,8 @@ def manual_approve_follow_request_thread(session, session_onion, session_i2p, proxy_type: str, followers_sync_cache: {}, sites_unavailable: [], - system_language: str) -> None: + system_language: str, + mitm_servers: []) -> None: """Manually approve a follow request, in a thread so as not to cause the UI to lag """ @@ -411,6 +417,7 @@ def manual_approve_follow_request_thread(session, session_onion, session_i2p, proxy_type, followers_sync_cache, sites_unavailable, - system_language), daemon=True) + system_language, + mitm_servers), daemon=True) begin_thread(thr, 'manual_approve_follow_request_thread') send_threads.append(thr) diff --git a/migrate.py b/migrate.py index 1548dec11..e6ecdb814 100644 --- a/migrate.py +++ b/migrate.py @@ -28,7 +28,8 @@ def _move_following_handles_for_account(base_dir: str, cached_webfingers: {}, debug: bool, signing_priv_key_pem: str, - block_federated: []) -> int: + block_federated: [], + mitm_servers: []) -> int: """Goes through all follows for an account and updates any that have moved """ ctr = 0 @@ -46,7 +47,7 @@ def _move_following_handles_for_account(base_dir: str, follow_handle, session, http_prefix, cached_webfingers, debug, signing_priv_key_pem, - block_federated) + block_federated, mitm_servers) except OSError: print('EX: _move_following_handles_for_account unable to read ' + following_filename) @@ -57,7 +58,8 @@ def _update_moved_handle(base_dir: str, nickname: str, domain: str, handle: str, session, http_prefix: str, cached_webfingers: {}, debug: bool, signing_priv_key_pem: str, - block_federated: []) -> int: + block_federated: [], + mitm_servers: []) -> int: """Check if an account has moved, and if so then alter following.txt for each account. Returns 1 if moved, 0 otherwise @@ -72,7 +74,8 @@ def _update_moved_handle(base_dir: str, nickname: str, domain: str, wf_request = webfinger_handle(session, handle, http_prefix, cached_webfingers, domain, __version__, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) if not wf_request: print('updateMovedHandle unable to webfinger ' + handle) return ctr @@ -101,10 +104,11 @@ def _update_moved_handle(base_dir: str, nickname: str, domain: str, ipns = False if http_prefix == 'ipns': ipns = True + mitm_servers = [] person_json = \ get_actor_json(domain, person_url, http_prefix, gnunet, ipfs, ipns, debug, False, - signing_priv_key_pem, None) + signing_priv_key_pem, None, mitm_servers) if not person_json: return ctr if not person_json.get('movedTo'): @@ -221,7 +225,8 @@ def _update_moved_handle(base_dir: str, nickname: str, domain: str, def migrate_accounts(base_dir: str, session, http_prefix: str, cached_webfingers: {}, debug: bool, signing_priv_key_pem: str, - block_federated: []) -> int: + block_federated: [], + mitm_servers: []) -> int: """If followed accounts change then this modifies the following lists for each account accordingly. Returns the number of accounts migrated @@ -240,6 +245,7 @@ def migrate_accounts(base_dir: str, session, session, http_prefix, cached_webfingers, debug, signing_priv_key_pem, - block_federated) + block_federated, + mitm_servers) break return ctr diff --git a/outbox.py b/outbox.py index 2c764edb7..63f59c9ef 100644 --- a/outbox.py +++ b/outbox.py @@ -299,7 +299,8 @@ def post_message_to_outbox(session, translate: {}, books_cache: {}, max_cached_readers: int, auto_cw_cache: {}, - block_federated: []) -> bool: + block_federated: [], + mitm_servers: []) -> bool: """post is received by the outbox Client to server message post https://www.w3.org/TR/activitypub/#client-to-server-outbox-delivery @@ -618,7 +619,8 @@ def post_message_to_outbox(session, translate: {}, signing_priv_key_pem, bold_reading, show_vote_posts, - languages_understood): + languages_understood, + mitm_servers): inbox_update_index('tlmedia', base_dir, post_to_nickname + '@' + domain, saved_filename, debug) @@ -679,7 +681,8 @@ def post_message_to_outbox(session, translate: {}, timezone, mitm, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) if is_edited_post: message_json['type'] = 'Update' @@ -728,7 +731,8 @@ def post_message_to_outbox(session, translate: {}, shared_item_federation_tokens, signing_priv_key_pem, sites_unavailable, - system_language) + system_language, + mitm_servers) followers_threads.append(followers_thread) if debug: @@ -864,6 +868,7 @@ def post_message_to_outbox(session, translate: {}, proxy_type, server.followers_sync_cache, server.sites_unavailable, - server.system_language) + server.system_language, + server.mitm_servers) followers_threads.append(named_addresses_thread) return True diff --git a/person.py b/person.py index bb3fdd2e3..424c6cc64 100644 --- a/person.py +++ b/person.py @@ -1758,7 +1758,7 @@ def get_actor_json(host_domain: str, handle: str, http: bool, gnunet: bool, ipfs: bool, ipns: bool, debug: bool, quiet: bool, signing_priv_key_pem: str, - existing_session) -> ({}, {}): + existing_session, mitm_servers: []) -> ({}, {}): """Returns the actor json """ if debug: @@ -1887,7 +1887,8 @@ def get_actor_json(host_domain: str, handle: str, http: bool, gnunet: bool, wf_request = webfinger_handle(session, handle, http_prefix, cached_webfingers, host_domain, __version__, debug, - group_account, signing_priv_key_pem) + group_account, signing_priv_key_pem, + mitm_servers) if not wf_request: if not quiet: print('get_actor_json Unable to webfinger ' + handle + @@ -1949,8 +1950,8 @@ def get_actor_json(host_domain: str, handle: str, http: bool, gnunet: bool, } person_json = \ get_json(signing_priv_key_pem, session, person_url, as_header, - None, debug, __version__, http_prefix, host_domain, - 20, quiet) + None, debug, mitm_servers, __version__, http_prefix, + host_domain, 20, quiet) if get_json_valid(person_json): if not quiet: pprint(person_json) @@ -2018,7 +2019,8 @@ def valid_sending_actor(session, base_dir: str, post_json_object: {}, signing_priv_key_pem: str, debug: bool, unit_test: bool, - system_language: str) -> bool: + system_language: str, + mitm_servers: []) -> bool: """When a post arrives in the inbox this is used to check that the sending actor is valid """ @@ -2049,7 +2051,8 @@ def valid_sending_actor(session, base_dir: str, actor_json, _ = get_actor_json(domain, sending_actor, True, gnunet, ipfs, ipns, debug, True, - signing_priv_key_pem, session) + signing_priv_key_pem, session, + mitm_servers) if not actor_json: # if the actor couldn't be obtained then proceed anyway return True diff --git a/pgp.py b/pgp.py index 1696b5365..643696c01 100644 --- a/pgp.py +++ b/pgp.py @@ -442,21 +442,24 @@ def has_local_pg_pkey() -> bool: return False -def pgp_encrypt_to_actor(domain: str, content: str, toHandle: str, - signing_priv_key_pem: str) -> str: +def pgp_encrypt_to_actor(domain: str, content: str, to_handle: str, + signing_priv_key_pem: str, + mitm_servers: []) -> str: """PGP encrypt a message to the given actor or handle """ # get the actor and extract the pgp public key from it recipient_pub_key = \ - _get_pgp_public_key_from_actor(signing_priv_key_pem, domain, toHandle) + _get_pgp_public_key_from_actor(signing_priv_key_pem, domain, to_handle, + mitm_servers) if not recipient_pub_key: return None # encrypt using the recipient public key return _pgp_encrypt(content, recipient_pub_key) -def pgp_decrypt(domain: str, content: str, fromHandle: str, - signing_priv_key_pem: str) -> str: +def pgp_decrypt(domain: str, content: str, from_handle: str, + signing_priv_key_pem: str, + mitm_servers: []) -> str: """ Encrypt using your default pgp key to the given recipient fromHandle can be a handle or actor url """ @@ -469,7 +472,8 @@ def pgp_decrypt(domain: str, content: str, fromHandle: str, else: pub_key = \ _get_pgp_public_key_from_actor(signing_priv_key_pem, - domain, content, fromHandle) + domain, content, from_handle, + mitm_servers) if pub_key: _pgp_import_pub_key(pub_key) @@ -522,6 +526,7 @@ def pgp_local_public_key() -> str: def _get_pgp_public_key_from_actor(signing_priv_key_pem: str, domain: str, handle: str, + mitm_servers: [], actor_json: {} = None) -> str: """Searches tags on the actor to see if there is any PGP public key specified @@ -529,7 +534,8 @@ def _get_pgp_public_key_from_actor(signing_priv_key_pem: str, if not actor_json: actor_json, _ = \ get_actor_json(domain, handle, False, False, False, False, - False, True, signing_priv_key_pem, None) + False, True, signing_priv_key_pem, None, + mitm_servers) if not actor_json: return None if not actor_json.get('attachment'): @@ -557,7 +563,8 @@ def pgp_public_key_upload(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, test: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: if debug: print('pgp_public_key_upload') @@ -590,7 +597,8 @@ def pgp_public_key_upload(base_dir: str, session, actor_json, _ = \ get_actor_json(domain_full, handle, False, False, False, False, - debug, True, signing_priv_key_pem, session) + debug, True, signing_priv_key_pem, session, + mitm_servers) if not actor_json: if debug: print('No actor returned for ' + handle) @@ -661,7 +669,7 @@ def pgp_public_key_upload(base_dir: str, session, wf_request = \ webfinger_handle(session, handle, http_prefix, cached_webfingers, domain, __version__, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: pgp actor update webfinger failed for ' + @@ -683,7 +691,7 @@ def pgp_public_key_upload(base_dir: str, session, person_cache, __version__, http_prefix, nickname, domain, post_to_box, 35725, - system_language) + system_language, mitm_servers) if not inbox_url: if debug: diff --git a/posts.py b/posts.py index 11a4793dc..1833f61dd 100644 --- a/posts.py +++ b/posts.py @@ -261,7 +261,8 @@ def get_user_url(wf_request: {}, source_id: int, debug: bool) -> str: def parse_user_feed(signing_priv_key_pem: str, session, feed_url: str, as_header: {}, project_version: str, http_prefix: str, - origin_domain: str, debug: bool, depth: int) -> []: + origin_domain: str, debug: bool, depth: int, + mitm_servers: []) -> []: """Returns a feed of posts for an account url """ if depth > 10: @@ -277,7 +278,8 @@ def parse_user_feed(signing_priv_key_pem: str, feed_json = \ get_json(signing_priv_key_pem, session, feed_url, as_header, None, - debug, project_version, http_prefix, origin_domain) + debug, mitm_servers, project_version, http_prefix, + origin_domain) if not get_json_valid(feed_json): profile_str = 'https://www.w3.org/ns/activitystreams' accept_str = 'application/ld+json; profile="' + profile_str + '"' @@ -286,8 +288,8 @@ def parse_user_feed(signing_priv_key_pem: str, 'Accept': accept_str } feed_json = get_json(signing_priv_key_pem, session, feed_url, - as_header, None, debug, project_version, - http_prefix, origin_domain) + as_header, None, debug, mitm_servers, + project_version, http_prefix, origin_domain) if not get_json_valid(feed_json): if debug: print('No user feed was returned') @@ -318,7 +320,8 @@ def parse_user_feed(signing_priv_key_pem: str, parse_user_feed(signing_priv_key_pem, session, next_url, as_header, project_version, http_prefix, - origin_domain, debug, depth + 1) + origin_domain, debug, depth + 1, + mitm_servers) if user_feed: return user_feed elif isinstance(next_url, dict): @@ -336,7 +339,8 @@ def _get_person_box_actor(session, base_dir: str, actor: str, http_prefix: str, origin_domain: str, person_cache: {}, signing_priv_key_pem: str, - source_id: int) -> {}: + source_id: int, + mitm_servers: []) -> {}: """Returns the actor json for the given actor url """ person_json = \ @@ -350,7 +354,8 @@ def _get_person_box_actor(session, base_dir: str, actor: str, } person_json = \ get_json(signing_priv_key_pem, session, actor, as_header, None, - debug, project_version, http_prefix, origin_domain) + debug, mitm_servers, project_version, http_prefix, + origin_domain) if get_json_valid(person_json): return person_json as_header = { @@ -358,7 +363,8 @@ def _get_person_box_actor(session, base_dir: str, actor: str, } person_json = \ get_json(signing_priv_key_pem, session, actor, as_header, None, - debug, project_version, http_prefix, origin_domain) + debug, mitm_servers, project_version, http_prefix, + origin_domain) if get_json_valid(person_json): return person_json print('Unable to get actor for ' + actor + ' ' + str(source_id)) @@ -372,8 +378,9 @@ def get_person_box(signing_priv_key_pem: str, origin_domain: str, project_version: str, http_prefix: str, nickname: str, domain: str, box_name: str, source_id: int, - system_language: str) -> (str, str, str, str, str, - str, str, bool): + system_language: str, + mitm_servers: []) -> (str, str, str, str, str, + str, str, bool): debug = False profile_str = 'https://www.w3.org/ns/activitystreams' as_header = { @@ -408,7 +415,7 @@ def get_person_box(signing_priv_key_pem: str, origin_domain: str, debug, project_version, http_prefix, origin_domain, person_cache, signing_priv_key_pem, - source_id) + source_id, mitm_servers) if not person_json: return None, None, None, None, None, None, None, None @@ -597,7 +604,8 @@ def _get_posts(session, outbox_url: str, max_posts: int, simple: bool, debug: bool, project_version: str, http_prefix: str, origin_domain: str, system_language: str, - signing_priv_key_pem: str) -> {}: + signing_priv_key_pem: str, + mitm_servers: []) -> {}: """Gets public posts from an outbox """ if debug: @@ -627,7 +635,8 @@ def _get_posts(session, outbox_url: str, max_posts: int, user_feed = parse_user_feed(signing_priv_key_pem, session, outbox_url, as_header, project_version, http_prefix, - origin_domain, debug, 0) + origin_domain, debug, 0, + mitm_servers) if user_feed: for item in user_feed: result.append(item) @@ -642,7 +651,8 @@ def _get_posts(session, outbox_url: str, max_posts: int, user_feed = parse_user_feed(signing_priv_key_pem, session, outbox_url, as_header, project_version, http_prefix, - origin_domain, debug, 0) + origin_domain, debug, 0, + mitm_servers) if not user_feed: return person_posts @@ -668,8 +678,8 @@ def _get_posts(session, outbox_url: str, max_posts: int, } this_item = \ get_json(signing_priv_key_pem, session, this_item, - as_header2, None, debug, __version__, - http_prefix, origin_domain) + as_header2, None, debug, mitm_servers, + __version__, http_prefix, origin_domain) if not get_json_valid(this_item): continue @@ -834,7 +844,8 @@ def _update_word_frequency(content: str, word_frequency: {}) -> None: def get_post_domains(session, outbox_url: str, max_posts: int, debug: bool, project_version: str, http_prefix: str, domain: str, word_frequency: {}, domain_list: [], - system_language: str, signing_priv_key_pem: str) -> []: + system_language: str, signing_priv_key_pem: str, + mitm_servers: []) -> []: """Returns a list of domains referenced within public posts """ if not outbox_url: @@ -860,7 +871,7 @@ def get_post_domains(session, outbox_url: str, max_posts: int, debug: bool, user_feed = parse_user_feed(signing_priv_key_pem, session, outbox_url, as_header, project_version, http_prefix, domain, - debug, 0) + debug, 0, mitm_servers) if not user_feed: return post_domains @@ -906,7 +917,8 @@ def _get_posts_for_blocked_domains(base_dir: str, debug: bool, project_version: str, http_prefix: str, domain: str, - signing_priv_key_pem: str) -> {}: + signing_priv_key_pem: str, + mitm_servers: []) -> {}: """Returns a dictionary of posts for blocked domains """ if not outbox_url: @@ -932,7 +944,7 @@ def _get_posts_for_blocked_domains(base_dir: str, user_feed = parse_user_feed(signing_priv_key_pem, session, outbox_url, as_header, project_version, http_prefix, domain, - debug, 0) + debug, 0, mitm_servers) if not user_feed: return blocked_posts @@ -3090,7 +3102,8 @@ def send_post(signing_priv_key_pem: str, project_version: str, auto_cw_cache: {}, debug: bool, in_reply_to: str, in_reply_to_atom_uri: str, subject: str, - searchable_by: []) -> int: + searchable_by: [], + mitm_servers: []) -> int: """Post to another inbox. Used by unit tests. """ with_digest = True @@ -3109,7 +3122,7 @@ def send_post(signing_priv_key_pem: str, project_version: str, wf_request = webfinger_handle(session, handle, http_prefix, cached_webfingers, domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: return 1 if not isinstance(wf_request, dict): @@ -3133,7 +3146,8 @@ def send_post(signing_priv_key_pem: str, project_version: str, person_cache, project_version, http_prefix, nickname, domain, post_to_box, - 72533, system_language) + 72533, system_language, + mitm_servers) if not inbox_url: return 3 @@ -3299,7 +3313,8 @@ def send_post_via_server(signing_priv_key_pem: str, project_version: str, debug: bool, in_reply_to: str, in_reply_to_atom_uri: str, conversation_id: str, convthread_id: str, - subject: str, searchable_by: []) -> int: + subject: str, searchable_by: [], + mitm_servers: []) -> int: """Send a post via a proxy (c2s) """ if not session: @@ -3314,7 +3329,7 @@ def send_post_via_server(signing_priv_key_pem: str, project_version: str, wf_request = \ webfinger_handle(session, handle, http_prefix, cached_webfingers, from_domain_full, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: post webfinger failed for ' + handle) @@ -3338,7 +3353,8 @@ def send_post_via_server(signing_priv_key_pem: str, project_version: str, project_version, http_prefix, from_nickname, from_domain_full, post_to_box, - 82796, system_language) + 82796, system_language, + mitm_servers) if not inbox_url: if debug: print('DEBUG: post no ' + post_to_box + @@ -3519,7 +3535,8 @@ def send_signed_json(post_json_object: {}, session, base_dir: str, source_id: int, curr_domain: str, onion_domain: str, i2p_domain: str, extra_headers: {}, sites_unavailable: [], - system_language: str) -> int: + system_language: str, + mitm_servers: []) -> int: """Sends a signed json object to an inbox/outbox """ if debug: @@ -3565,7 +3582,8 @@ def send_signed_json(post_json_object: {}, session, base_dir: str, wf_request = webfinger_handle(session, handle, http_prefix, cached_webfingers, ua_domain, project_version, debug, - group_account, signing_priv_key_pem) + group_account, signing_priv_key_pem, + mitm_servers) if not wf_request: if debug: print('DEBUG: send_signed_json webfinger for ' + @@ -3595,7 +3613,8 @@ def send_signed_json(post_json_object: {}, session, base_dir: str, person_cache, project_version, http_prefix, nickname, domain, post_to_box, - source_id, system_language) + source_id, system_language, + mitm_servers) print("send_signed_json inbox_url: " + str(inbox_url)) print("send_signed_json to_person_id: " + str(to_person_id)) @@ -3841,7 +3860,8 @@ def _send_to_named_addresses(server, session, session_onion, session_i2p, proxy_type: str, followers_sync_cache: {}, sites_unavailable: [], - system_language: str) -> None: + system_language: str, + mitm_servers: []) -> None: """sends a post to the specific named addresses in to/cc """ if not session: @@ -4039,7 +4059,7 @@ def _send_to_named_addresses(server, session, session_onion, session_i2p, signing_priv_key_pem, 34436782, domain, onion_domain, i2p_domain, extra_headers, sites_unavailable, - system_language) + system_language, mitm_servers) def send_to_named_addresses_thread(server, session, session_onion, session_i2p, @@ -4057,7 +4077,8 @@ def send_to_named_addresses_thread(server, session, session_onion, session_i2p, proxy_type: str, followers_sync_cache: {}, sites_unavailable: [], - system_language: str): + system_language: str, + mitm_servers: []): """Returns a thread used to send a post to named addresses """ print('THREAD: _send_to_named_addresses') @@ -4077,7 +4098,8 @@ def send_to_named_addresses_thread(server, session, session_onion, session_i2p, proxy_type, followers_sync_cache, sites_unavailable, - system_language), daemon=True) + system_language, + mitm_servers), daemon=True) if not begin_thread(send_thread, 'send_to_named_addresses_thread'): print('WARN: socket error while starting ' + 'thread to send to named addresses.') @@ -4087,7 +4109,7 @@ def send_to_named_addresses_thread(server, session, session_onion, session_i2p, def _has_shared_inbox(session, http_prefix: str, domain: str, debug: bool, signing_priv_key_pem: str, - ua_domain: str) -> bool: + ua_domain: str, mitm_servers: []) -> bool: """Returns true if the given domain has a shared inbox This tries the new and the old way of webfingering the shared inbox """ @@ -4098,7 +4120,7 @@ def _has_shared_inbox(session, http_prefix: str, domain: str, for handle in try_handles: wf_request = webfinger_handle(session, handle, http_prefix, {}, ua_domain, __version__, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if wf_request: if isinstance(wf_request, dict): if not wf_request.get('errors'): @@ -4131,7 +4153,8 @@ def send_to_followers(server, session, session_onion, session_i2p, shared_item_federation_tokens: {}, signing_priv_key_pem: str, sites_unavailable: [], - system_language: str) -> None: + system_language: str, + mitm_servers: []) -> None: """sends a post to the followers of the given nickname """ print('send_to_followers') @@ -4223,7 +4246,8 @@ def send_to_followers(server, session, session_onion, session_i2p, with_shared_inbox = \ _has_shared_inbox(curr_session, curr_http_prefix, follower_domain, - debug, signing_priv_key_pem, ua_domain) + debug, signing_priv_key_pem, ua_domain, + mitm_servers) if debug: if with_shared_inbox: print(follower_domain + ' has shared inbox') @@ -4304,7 +4328,7 @@ def send_to_followers(server, session, session_onion, session_i2p, signing_priv_key_pem, 639342, domain, onion_domain, i2p_domain, extra_headers, sites_unavailable, - system_language) + system_language, mitm_servers) else: # randomize the order of handles, so that we are not # favoring any particular account in terms of its delivery time @@ -4339,7 +4363,7 @@ def send_to_followers(server, session, session_onion, session_i2p, signing_priv_key_pem, 634219, domain, onion_domain, i2p_domain, extra_headers, sites_unavailable, - system_language) + system_language, mitm_servers) time.sleep(4) @@ -4364,7 +4388,8 @@ def send_to_followers_thread(server, session, session_onion, session_i2p, shared_item_federation_tokens: {}, signing_priv_key_pem: str, sites_unavailable: [], - system_language: str): + system_language: str, + mitm_servers: []): """Returns a thread used to send a post to followers """ print('THREAD: send_to_followers') @@ -4382,7 +4407,8 @@ def send_to_followers_thread(server, session, session_onion, session_i2p, shared_item_federation_tokens, signing_priv_key_pem, sites_unavailable, - system_language), daemon=True) + system_language, + mitm_servers), daemon=True) if not begin_thread(send_thread, 'send_to_followers_thread'): print('WARN: error while starting ' + 'thread to send to followers.') @@ -4577,7 +4603,8 @@ def is_image_media(session, base_dir: str, http_prefix: str, signing_priv_key_pem: str, bold_reading: bool, show_vote_posts: bool, - languages_understood: []) -> bool: + languages_understood: [], + mitm_servers: []) -> bool: """Returns true if the given post has attached image media """ if post_json_object['type'] == 'Announce': @@ -4597,7 +4624,8 @@ def is_image_media(session, base_dir: str, http_prefix: str, blocked_cache, block_federated, bold_reading, show_vote_posts, - languages_understood) + languages_understood, + mitm_servers) if post_json_announce: post_json_object = post_json_announce if post_json_object['type'] != 'Create': @@ -5721,7 +5749,8 @@ def get_public_posts_of_person(base_dir: str, nickname: str, domain: str, debug: bool, project_version: str, system_language: str, signing_priv_key_pem: str, - origin_domain: str) -> None: + origin_domain: str, + mitm_servers: []) -> None: """ This is really just for test purposes """ if debug: @@ -5750,7 +5779,7 @@ def get_public_posts_of_person(base_dir: str, nickname: str, domain: str, wf_request = \ webfinger_handle(session, handle, http_prefix, cached_webfingers, origin_domain, project_version, debug, group_account, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('No webfinger result was returned for ' + handle) @@ -5769,7 +5798,8 @@ def get_public_posts_of_person(base_dir: str, nickname: str, domain: str, person_cache, project_version, http_prefix, nickname, domain, 'outbox', - 62524, system_language) + 62524, system_language, + mitm_servers) if debug: print('Actor url: ' + str(person_id)) if not person_id: @@ -5781,7 +5811,7 @@ def get_public_posts_of_person(base_dir: str, nickname: str, domain: str, _get_posts(session, person_url, 30, max_mentions, max_emoji, max_attachments, federation_list, raw, simple, debug, project_version, http_prefix, origin_domain, system_language, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) def get_public_post_domains(session, base_dir: str, nickname: str, domain: str, @@ -5790,7 +5820,8 @@ def get_public_post_domains(session, base_dir: str, nickname: str, domain: str, debug: bool, project_version: str, word_frequency: {}, domain_list: [], system_language: str, - signing_priv_key_pem: str) -> []: + signing_priv_key_pem: str, + mitm_servers: []) -> []: """ Returns a list of domains referenced within public posts """ if not session: @@ -5805,7 +5836,7 @@ def get_public_post_domains(session, base_dir: str, nickname: str, domain: str, wf_request = \ webfinger_handle(session, handle, http_prefix, cached_webfingers, domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: return domain_list if not isinstance(wf_request, dict): @@ -5820,12 +5851,13 @@ def get_public_post_domains(session, base_dir: str, nickname: str, domain: str, person_cache, project_version, http_prefix, nickname, domain, 'outbox', - 92522, system_language) + 92522, system_language, + mitm_servers) post_domains = \ get_post_domains(session, person_url, 64, debug, project_version, http_prefix, domain, word_frequency, domain_list, system_language, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) post_domains.sort() return post_domains @@ -5834,7 +5866,8 @@ def download_follow_collection(signing_priv_key_pem: str, follow_type: str, session, http_prefix: str, actor: str, page_number: int, - no_of_pages: int, debug: bool) -> []: + no_of_pages: int, debug: bool, + mitm_servers: []) -> []: """Returns a list of following/followers for the given actor by downloading the json for their following/followers collection """ @@ -5859,7 +5892,7 @@ def download_follow_collection(signing_priv_key_pem: str, actor + '/' + follow_type + '?page=' + str(page_number + page_ctr) followers_json = \ get_json(signing_priv_key_pem, session, url, session_headers, None, - debug, __version__, http_prefix, None) + debug, mitm_servers, __version__, http_prefix, None) if get_json_valid(followers_json): if followers_json.get('orderedItems'): for follower_actor in followers_json['orderedItems']: @@ -5881,7 +5914,8 @@ def get_public_post_info(session, base_dir: str, nickname: str, domain: str, proxy_type: str, port: int, http_prefix: str, debug: bool, project_version: str, word_frequency: {}, system_language: str, - signing_priv_key_pem: str) -> []: + signing_priv_key_pem: str, + mitm_servers: []) -> []: """ Returns a dict of domains referenced within public posts """ if not session: @@ -5896,7 +5930,7 @@ def get_public_post_info(session, base_dir: str, nickname: str, domain: str, wf_request = \ webfinger_handle(session, handle, http_prefix, cached_webfingers, domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: return {} if not isinstance(wf_request, dict): @@ -5911,13 +5945,14 @@ def get_public_post_info(session, base_dir: str, nickname: str, domain: str, person_cache, project_version, http_prefix, nickname, domain, 'outbox', - 13863, system_language) + 13863, system_language, + mitm_servers) max_posts = 64 post_domains = \ get_post_domains(session, person_url, max_posts, debug, project_version, http_prefix, domain, word_frequency, [], system_language, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) post_domains.sort() domains_info = {} for pdomain in post_domains: @@ -5929,7 +5964,8 @@ def get_public_post_info(session, base_dir: str, nickname: str, domain: str, person_url, max_posts, debug, project_version, http_prefix, - domain, signing_priv_key_pem) + domain, signing_priv_key_pem, + mitm_servers) for blocked_domain, post_url_list in blocked_posts.items(): domains_info[blocked_domain] += post_url_list @@ -5943,7 +5979,8 @@ def get_public_post_domains_blocked(session, base_dir: str, debug: bool, project_version: str, word_frequency: {}, domain_list: [], system_language: str, - signing_priv_key_pem: str) -> []: + signing_priv_key_pem: str, + mitm_servers: []) -> []: """ Returns a list of domains referenced within public posts which are globally blocked on this instance """ @@ -5954,7 +5991,7 @@ def get_public_post_domains_blocked(session, base_dir: str, proxy_type, port, http_prefix, debug, project_version, word_frequency, domain_list, system_language, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not post_domains: return [] @@ -6008,7 +6045,8 @@ def check_domains(session, base_dir: str, debug: bool, project_version: str, max_blocked_domains: int, single_check: bool, system_language: str, - signing_priv_key_pem: str) -> None: + signing_priv_key_pem: str, + mitm_servers: []) -> None: """Checks follower accounts for references to globally blocked domains """ word_frequency = {} @@ -6043,7 +6081,8 @@ def check_domains(session, base_dir: str, debug, project_version, word_frequency, [], system_language, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) if blocked_domains: if len(blocked_domains) > max_blocked_domains: follower_warning_str += handle + '\n' @@ -6065,7 +6104,8 @@ def check_domains(session, base_dir: str, debug, project_version, word_frequency, [], system_language, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) if blocked_domains: print(handle) for bdomain in blocked_domains: @@ -6187,7 +6227,8 @@ def download_announce(session, base_dir: str, http_prefix: str, blocked_cache: {}, block_federated: [], bold_reading: bool, show_vote_posts: bool, - languages_understood: []) -> {}: + languages_understood: [], + mitm_servers: []) -> {}: """Download the post referenced by an announce """ if not post_json_object.get('object'): @@ -6277,8 +6318,8 @@ def download_announce(session, base_dir: str, http_prefix: str, announced_json = \ get_json(signing_priv_key_pem, session, post_json_object['object'], - as_header, None, debug, project_version, - http_prefix, domain) + as_header, None, debug, mitm_servers, + project_version, http_prefix, domain) if not get_json_valid(announced_json): return None @@ -6549,7 +6590,8 @@ def send_block_via_server(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Creates a block via c2s """ if not session: @@ -6580,7 +6622,7 @@ def send_block_via_server(base_dir: str, session, wf_request = webfinger_handle(session, handle, http_prefix, cached_webfingers, from_domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: block webfinger failed for ' + handle) @@ -6602,7 +6644,7 @@ def send_block_via_server(base_dir: str, session, project_version, http_prefix, from_nickname, from_domain, post_to_box, 72652, - system_language) + system_language, mitm_servers) if not inbox_url: if debug: @@ -6640,7 +6682,8 @@ def send_mute_via_server(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Creates a mute via c2s """ if not session: @@ -6667,7 +6710,7 @@ def send_mute_via_server(base_dir: str, session, wf_request = webfinger_handle(session, handle, http_prefix, cached_webfingers, from_domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: mute webfinger failed for ' + handle) @@ -6689,7 +6732,7 @@ def send_mute_via_server(base_dir: str, session, project_version, http_prefix, from_nickname, from_domain, post_to_box, 72652, - system_language) + system_language, mitm_servers) if not inbox_url: if debug: @@ -6726,7 +6769,8 @@ def send_undo_mute_via_server(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Undoes a mute via c2s """ if not session: @@ -6758,7 +6802,7 @@ def send_undo_mute_via_server(base_dir: str, session, wf_request = webfinger_handle(session, handle, http_prefix, cached_webfingers, from_domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: undo mute webfinger failed for ' + handle) @@ -6780,7 +6824,7 @@ def send_undo_mute_via_server(base_dir: str, session, project_version, http_prefix, from_nickname, from_domain, post_to_box, 72652, - system_language) + system_language, mitm_servers) if not inbox_url: if debug: @@ -6818,7 +6862,8 @@ def send_undo_block_via_server(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Creates a block via c2s """ if not session: @@ -6853,7 +6898,7 @@ def send_undo_block_via_server(base_dir: str, session, wf_request = webfinger_handle(session, handle, http_prefix, cached_webfingers, from_domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: unblock webfinger failed for ' + handle) @@ -6875,7 +6920,7 @@ def send_undo_block_via_server(base_dir: str, session, project_version, http_prefix, from_nickname, from_domain, post_to_box, 53892, - system_language) + system_language, mitm_servers) if not inbox_url: if debug: @@ -6941,7 +6986,8 @@ def c2s_box_json(session, nickname: str, password: str, domain: str, port: int, http_prefix: str, box_name: str, page_number: int, - debug: bool, signing_priv_key_pem: str) -> {}: + debug: bool, signing_priv_key_pem: str, + mitm_servers: []) -> {}: """C2S Authenticated GET of posts for a timeline """ if not session: @@ -6964,7 +7010,7 @@ def c2s_box_json(session, nickname: str, password: str, # GET json url = actor + '/' + box_name + '?page=' + str(page_number) box_json = get_json(signing_priv_key_pem, session, url, headers, None, - debug, __version__, http_prefix, None) + debug, mitm_servers, __version__, http_prefix, None) if get_json_valid(box_json) and debug: print('DEBUG: GET c2s_box_json success') diff --git a/reaction.py b/reaction.py index 41f32ac1f..5ce2788cc 100644 --- a/reaction.py +++ b/reaction.py @@ -77,7 +77,8 @@ def _reactionpost(recent_posts_cache: {}, curr_domain: str, onion_domain: str, i2p_domain: str, sites_unavailable: [], - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Creates an emoji reaction actor is the person doing the reacting 'to' might be a specific person (actor) whose post was reaction @@ -157,7 +158,7 @@ def _reactionpost(recent_posts_cache: {}, signing_priv_key_pem, 7165392, curr_domain, onion_domain, i2p_domain, extra_headers, sites_unavailable, - system_language) + system_language, mitm_servers) return new_reaction_json @@ -174,7 +175,8 @@ def reaction_post(recent_posts_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, curr_domain: str, onion_domain: str, i2p_domain: str, - sites_unavailable: [], system_language: str) -> {}: + sites_unavailable: [], system_language: str, + mitm_servers: []) -> {}: """Adds a reaction to a given status post. This is only used by unit tests """ reaction_domain = get_full_domain(reaction_domain, reaction_port) @@ -192,7 +194,8 @@ def reaction_post(recent_posts_cache: {}, cached_webfingers, debug, project_version, signing_priv_key_pem, curr_domain, onion_domain, i2p_domain, - sites_unavailable, system_language) + sites_unavailable, system_language, + mitm_servers) def send_reaction_via_server(base_dir: str, session, @@ -203,7 +206,8 @@ def send_reaction_via_server(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Creates a reaction via c2s """ if not session: @@ -235,7 +239,7 @@ def send_reaction_via_server(base_dir: str, session, wf_request = webfinger_handle(session, handle, http_prefix, cached_webfingers, from_domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: reaction webfinger failed for ' + handle) @@ -257,7 +261,7 @@ def send_reaction_via_server(base_dir: str, session, project_version, http_prefix, from_nickname, from_domain, post_to_box, 72873, - system_language) + system_language, mitm_servers) if not inbox_url: if debug: @@ -298,7 +302,8 @@ def send_undo_reaction_via_server(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Undo a reaction via c2s """ if not session: @@ -330,7 +335,7 @@ def send_undo_reaction_via_server(base_dir: str, session, wf_request = webfinger_handle(session, handle, http_prefix, cached_webfingers, from_domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: unreaction webfinger failed for ' + handle) @@ -352,7 +357,8 @@ def send_undo_reaction_via_server(base_dir: str, session, person_cache, project_version, http_prefix, from_nickname, from_domain, post_to_box, - 72625, system_language) + 72625, system_language, + mitm_servers) if not inbox_url: if debug: diff --git a/schedule.py b/schedule.py index f757d96c2..74fdad4cc 100644 --- a/schedule.py +++ b/schedule.py @@ -164,7 +164,8 @@ def _update_post_schedule(base_dir: str, handle: str, httpd, httpd.books_cache, httpd.max_cached_readers, httpd.auto_cw_cache, - httpd.block_federated): + httpd.block_federated, + httpd.mitm_servers): index_lines.remove(line) try: os.remove(post_filename) diff --git a/securemode.py b/securemode.py index 84dde22f3..5d3b04939 100644 --- a/securemode.py +++ b/securemode.py @@ -61,7 +61,8 @@ def secure_mode(curr_session, proxy_type: str, server.domain, server.onion_domain, server.i2p_domain, - server.signing_priv_key_pem) + server.signing_priv_key_pem, + server.mitm_servers) if not pub_key: if server.debug: print('AUTH: secure mode failed to ' + diff --git a/session.py b/session.py index 3f55f9f58..ad796656a 100644 --- a/session.py +++ b/session.py @@ -19,6 +19,8 @@ from utils import text_in_file from utils import acct_dir from utils import binary_is_image from utils import image_mime_types_dict +from utils import detect_mitm +from utils import get_domain_from_actor from httpsig import create_signed_header @@ -126,13 +128,30 @@ def get_resolved_url(session, url: str, timeout_sec: int = 20) -> {}: def _get_json_request(session, url: str, session_headers: {}, session_params: {}, timeout_sec: int, quiet: bool, debug: bool, - return_json: bool) -> {}: + return_json: bool, + mitm_servers: []) -> {}: """http GET for json """ try: result = session.get(url, headers=session_headers, params=session_params, timeout=timeout_sec, allow_redirects=True) + mitm = False + try: + mitm = detect_mitm(result) + except BaseException: + pass + url_domain, _ = get_domain_from_actor(url) + if mitm: + if url_domain: + if url_domain not in mitm_servers: + mitm_servers.append(url_domain) + print('DEBUG: _get_json_request MITM ' + + str(result.headers)) + else: + if url_domain in mitm_servers: + mitm_servers.remove(url_domain) + if result.status_code != 200: if result.status_code == 401: print("WARN: get_json " + url + ' rejected by secure mode') @@ -188,7 +207,7 @@ def _get_json_request(session, url: str, session_headers: {}, if session_headers2.get('Authorization'): session_headers2['Authorization'] = 'REDACTED' if debug and not quiet: - print('EX: get_json failed, url: ' + str(url) + ', ' + + print('EX: get_json failed2, url: ' + str(url) + ', ' + 'headers: ' + str(session_headers2) + ', ' + 'params: ' + str(session_params) + ', ' + str(exc)) except SocketError as exc: @@ -202,7 +221,7 @@ def _get_json_request(session, url: str, session_headers: {}, def _get_json_signed(session, url: str, domain_full: str, session_headers: {}, session_params: {}, timeout_sec: int, signing_priv_key_pem: str, quiet: bool, - debug: bool) -> {}: + debug: bool, mitm_servers: []) -> {}: """Authorized fetch - a signed version of GET """ if not domain_full: @@ -271,7 +290,7 @@ def _get_json_signed(session, url: str, domain_full: str, session_headers: {}, return_json = False return _get_json_request(session, url, session_headers, session_params, timeout_sec, quiet, - debug, return_json) + debug, return_json, mitm_servers) def get_json_valid(test_json: {}) -> bool: @@ -286,6 +305,7 @@ def get_json_valid(test_json: {}) -> bool: def get_json(signing_priv_key_pem: str, session, url: str, headers: {}, params: {}, debug: bool, + mitm_servers: [], version: str = __version__, http_prefix: str = 'https', domain: str = 'testdomain', timeout_sec: int = 20, quiet: bool = False) -> {}: @@ -318,10 +338,10 @@ def get_json(signing_priv_key_pem: str, return _get_json_signed(session, url, domain, session_headers, session_params, timeout_sec, signing_priv_key_pem, - quiet, debug) + quiet, debug, mitm_servers) return _get_json_request(session, url, session_headers, session_params, timeout_sec, - quiet, debug, True) + quiet, debug, True, mitm_servers) def get_vcard(xml_format: bool, @@ -407,6 +427,7 @@ def get_vcard(xml_format: bool, def download_html(signing_priv_key_pem: str, session, url: str, headers: {}, params: {}, debug: bool, version: str, http_prefix: str, domain: str, + mitm_servers: [], timeout_sec: int = 20, quiet: bool = False) -> {}: """Download a html document """ @@ -439,14 +460,15 @@ def download_html(signing_priv_key_pem: str, return _get_json_signed(session, url, domain, session_headers, session_params, timeout_sec, signing_priv_key_pem, - quiet, debug) + quiet, debug, mitm_servers) return _get_json_request(session, url, session_headers, session_params, timeout_sec, - quiet, debug, False) + quiet, debug, False, mitm_servers) def verify_html(session, url: str, debug: bool, version: str, http_prefix: str, nickname: str, domain: str, + mitm_servers: [], timeout_sec: int = 20, quiet: bool = False) -> bool: """Verify that the handle for nickname@domain exists within the given url @@ -464,7 +486,8 @@ def verify_html(session, url: str, debug: bool, verification_site_html = \ download_html(None, session, url, as_header, None, debug, version, - http_prefix, domain, timeout_sec, quiet) + http_prefix, domain, mitm_servers, + timeout_sec, quiet) if not verification_site_html: if debug: print('Verification site could not be contacted ' + @@ -512,7 +535,8 @@ def verify_html(session, url: str, debug: bool, def site_is_verified(session, base_dir: str, http_prefix: str, nickname: str, domain: str, - url: str, update: bool, debug: bool) -> bool: + url: str, update: bool, debug: bool, + mitm_servers: []) -> bool: """Is the given website verified? """ verified_sites_filename = \ @@ -527,7 +551,8 @@ def site_is_verified(session, base_dir: str, http_prefix: str, verified = \ verify_html(session, url, debug, - __version__, http_prefix, nickname, domain) + __version__, http_prefix, nickname, domain, + mitm_servers) if verified: write_type = 'a+' if not verified_file_exists: @@ -545,6 +570,7 @@ def site_is_verified(session, base_dir: str, http_prefix: str, def download_ssml(signing_priv_key_pem: str, session, url: str, headers: {}, params: {}, debug: bool, version: str, http_prefix: str, domain: str, + mitm_servers: [], timeout_sec: int = 20, quiet: bool = False) -> {}: """Download a ssml document """ @@ -576,10 +602,10 @@ def download_ssml(signing_priv_key_pem: str, return _get_json_signed(session, url, domain, session_headers, session_params, timeout_sec, signing_priv_key_pem, - quiet, debug) + quiet, debug, mitm_servers) return _get_json_request(session, url, session_headers, session_params, timeout_sec, - quiet, debug, False) + quiet, debug, False, mitm_servers) def _set_user_agent(session, http_prefix: str, domain_full: str) -> None: diff --git a/shares.py b/shares.py index 9aaa75d51..588fe0a5d 100644 --- a/shares.py +++ b/shares.py @@ -634,7 +634,8 @@ def send_share_via_server(base_dir, session, debug: bool, project_version: str, item_price: str, item_currency: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Creates an item share via c2s """ if not session: @@ -688,7 +689,7 @@ def send_share_via_server(base_dir, session, webfinger_handle(session, handle, http_prefix, cached_webfingers, from_domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: share webfinger failed for ' + handle) @@ -709,7 +710,8 @@ def send_share_via_server(base_dir, session, person_cache, project_version, http_prefix, from_nickname, from_domain, post_to_box, - 83653, system_language) + 83653, system_language, + mitm_servers) if not inbox_url: if debug: @@ -759,7 +761,8 @@ def send_undo_share_via_server(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Undoes a share via c2s """ if not session: @@ -796,7 +799,7 @@ def send_undo_share_via_server(base_dir: str, session, wf_request = \ webfinger_handle(session, handle, http_prefix, cached_webfingers, from_domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: unshare webfinger failed for ' + handle) @@ -817,7 +820,8 @@ def send_undo_share_via_server(base_dir: str, session, person_cache, project_version, http_prefix, from_nickname, from_domain, post_to_box, - 12663, system_language) + 12663, system_language, + mitm_servers) if not inbox_url: if debug: @@ -862,7 +866,8 @@ def send_wanted_via_server(base_dir, session, debug: bool, project_version: str, item_max_price: str, item_currency: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Creates a wanted item via c2s """ if not session: @@ -917,7 +922,7 @@ def send_wanted_via_server(base_dir, session, webfinger_handle(session, handle, http_prefix, cached_webfingers, from_domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: share webfinger failed for ' + handle) @@ -938,7 +943,8 @@ def send_wanted_via_server(base_dir, session, person_cache, project_version, http_prefix, from_nickname, from_domain, post_to_box, - 23653, system_language) + 23653, system_language, + mitm_servers) if not inbox_url: if debug: @@ -988,7 +994,8 @@ def send_undo_wanted_via_server(base_dir: str, session, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Undoes a wanted item via c2s """ if not session: @@ -1025,7 +1032,7 @@ def send_undo_wanted_via_server(base_dir: str, session, wf_request = \ webfinger_handle(session, handle, http_prefix, cached_webfingers, from_domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: unwant webfinger failed for ' + handle) @@ -1046,7 +1053,8 @@ def send_undo_wanted_via_server(base_dir: str, session, person_cache, project_version, http_prefix, from_nickname, from_domain, post_to_box, - 12693, system_language) + 12693, system_language, + mitm_servers) if not inbox_url: if debug: @@ -1083,7 +1091,8 @@ def send_undo_wanted_via_server(base_dir: str, session, def get_shared_items_catalog_via_server(session, nickname: str, password: str, domain: str, port: int, http_prefix: str, debug: bool, - signing_priv_key_pem: str) -> {}: + signing_priv_key_pem: str, + mitm_servers: []) -> {}: """Returns the shared items catalog via c2s """ if not session: @@ -1103,7 +1112,8 @@ def get_shared_items_catalog_via_server(session, nickname: str, password: str, if debug: print('Shared items catalog request to: ' + url) catalog_json = get_json(signing_priv_key_pem, session, url, headers, None, - debug, __version__, http_prefix, None) + debug, mitm_servers, __version__, http_prefix, + None) if not get_json_valid(catalog_json): if debug: print('DEBUG: GET shared items catalog failed for c2s to ' + url) @@ -1118,7 +1128,8 @@ def get_shared_items_catalog_via_server(session, nickname: str, password: str, def get_offers_via_server(session, nickname: str, password: str, domain: str, port: int, http_prefix: str, debug: bool, - signing_priv_key_pem: str) -> {}: + signing_priv_key_pem: str, + mitm_servers: []) -> {}: """Returns the offers collection for shared items via c2s """ if not session: @@ -1138,7 +1149,7 @@ def get_offers_via_server(session, nickname: str, password: str, if debug: print('Offers collection request to: ' + url) offers_json = get_json(signing_priv_key_pem, session, url, headers, None, - debug, __version__, http_prefix, None) + debug, mitm_servers, __version__, http_prefix, None) if not get_json_valid(offers_json): if debug: print('DEBUG: GET offers collection failed for c2s to ' + url) @@ -1153,7 +1164,8 @@ def get_offers_via_server(session, nickname: str, password: str, def get_wanted_via_server(session, nickname: str, password: str, domain: str, port: int, http_prefix: str, debug: bool, - signing_priv_key_pem: str) -> {}: + signing_priv_key_pem: str, + mitm_servers: []) -> {}: """Returns the wanted collection for shared items via c2s """ if not session: @@ -1173,7 +1185,7 @@ def get_wanted_via_server(session, nickname: str, password: str, if debug: print('Wanted collection request to: ' + url) wanted_json = get_json(signing_priv_key_pem, session, url, headers, None, - debug, __version__, http_prefix, None) + debug, mitm_servers, __version__, http_prefix, None) if not get_json_valid(wanted_json): if debug: print('DEBUG: GET wanted collection failed for c2s to ' + url) @@ -1708,7 +1720,8 @@ def _update_federated_shares_cache(session, shared_items_federated_domains: [], tokens_json: {}, debug: bool, system_language: str, shares_file_type: str, - sites_unavailable: []) -> None: + sites_unavailable: [], + mitm_servers: []) -> None: """Updates the cache of federated shares for the instance. This enables shared items to be available even when other instances might not be online @@ -1746,7 +1759,8 @@ def _update_federated_shares_cache(session, shared_items_federated_domains: [], url = http_prefix + '://' + federated_domain_full + '/wantedItems' as_header['Authorization'] = tokens_json[federated_domain_full] catalog_json = get_json(session, url, as_header, None, - debug, __version__, http_prefix, None) + debug, mitm_servers, __version__, http_prefix, + None) if not get_json_valid(catalog_json): print('WARN: failed to download shared items catalog for ' + federated_domain_full) @@ -1880,7 +1894,8 @@ def _regenerate_shares_token(base_dir: str, domain_full: str, def run_federated_shares_daemon(base_dir: str, httpd, http_prefix: str, domain_full: str, proxy_type: str, debug: bool, - system_language: str) -> None: + system_language: str, + mitm_servers: []) -> None: """Runs the daemon used to update federated shared items """ seconds_per_hour = 60 * 60 @@ -1930,7 +1945,8 @@ def run_federated_shares_daemon(base_dir: str, httpd, http_prefix: str, shared_items_federated_domains, base_dir, domain_full, http_prefix, tokens_json, debug, system_language, - shares_file_type, sites_unavailable) + shares_file_type, sites_unavailable, + mitm_servers) time.sleep(seconds_per_hour * 6) diff --git a/skills.py b/skills.py index 6e2a1da02..e9b1b6ddd 100644 --- a/skills.py +++ b/skills.py @@ -183,7 +183,8 @@ def send_skill_via_server(base_dir: str, session, nickname: str, password: str, cached_webfingers: {}, person_cache: {}, debug: bool, project_version: str, signing_priv_key_pem: str, - system_language: str) -> {}: + system_language: str, + mitm_servers: []) -> {}: """Sets a skill for a person via c2s """ if not session: @@ -216,7 +217,7 @@ def send_skill_via_server(base_dir: str, session, nickname: str, password: str, webfinger_handle(session, handle, http_prefix, cached_webfingers, domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: if debug: print('DEBUG: skill webfinger failed for ' + handle) @@ -237,7 +238,7 @@ def send_skill_via_server(base_dir: str, session, nickname: str, password: str, person_cache, project_version, http_prefix, nickname, domain, post_to_box, 76121, - system_language) + system_language, mitm_servers) if not inbox_url: if debug: diff --git a/socnet.py b/socnet.py index 3bc230f9f..73cd8d7d4 100644 --- a/socnet.py +++ b/socnet.py @@ -18,7 +18,8 @@ def instances_graph(base_dir: str, handles: str, proxy_type: str, port: int, http_prefix: str, debug: bool, project_version: str, - system_language: str, signing_priv_key_pem: str) -> str: + system_language: str, signing_priv_key_pem: str, + mitm_servers: []) -> str: """ Returns a dot graph of federating instances based upon a few sample handles. The handles argument should contain a comma separated list @@ -51,7 +52,7 @@ def instances_graph(base_dir: str, handles: str, webfinger_handle(session, handle, http_prefix, cached_webfingers, domain, project_version, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) if not wf_request: return dot_graph_str + '}\n' if not isinstance(wf_request, dict): @@ -67,13 +68,14 @@ def instances_graph(base_dir: str, handles: str, person_cache, project_version, http_prefix, nickname, domain, 'outbox', - 27261, system_language) + 27261, system_language, + mitm_servers) word_frequency = {} post_domains = \ get_post_domains(session, person_url, 64, debug, project_version, http_prefix, domain, word_frequency, [], system_language, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) post_domains.sort() for fed_domain in post_domains: dot_line_str = ' "' + domain + '" -> "' + fed_domain + '";\n' diff --git a/tests.py b/tests.py index 24fc6d446..17c85910d 100644 --- a/tests.py +++ b/tests.py @@ -1472,6 +1472,7 @@ def test_post_message_between_servers(base_dir: str) -> None: chat_url = '' auto_cw_cache = {} searchable_by = [] + mitm_servers = [] send_result = \ send_post(signing_priv_key_pem, __version__, session_alice, alice_dir, 'alice', alice_domain, alice_port, @@ -1490,7 +1491,7 @@ def test_post_message_between_servers(base_dir: str) -> None: content_license_url, media_license_url, media_creator, translate, buy_url, chat_url, auto_cw_cache, True, in_reply_to, in_reply_to_atom_uri, subject, - searchable_by) + searchable_by, mitm_servers) print('send_result: ' + str(send_result)) queue_path = data_dir(bob_dir) + '/bob@' + bob_domain + '/queue' @@ -1602,6 +1603,7 @@ def test_post_message_between_servers(base_dir: str) -> None: outbox_post_filename = outbox_path + '/' + name assert status_number > 0 assert outbox_post_filename + mitm_servers = [] assert like_post({}, session_bob, bob_dir, federation_list, 'bob', bob_domain, bob_port, http_prefix, 'alice', alice_domain, alice_port, [], @@ -1609,7 +1611,7 @@ def test_post_message_between_servers(base_dir: str) -> None: bob_person_cache, bob_cached_webfingers, True, __version__, signing_priv_key_pem, bob_domain, None, None, sites_unavailable, - system_language) + system_language, mitm_servers) for _ in range(20): if text_in_file('likes', outbox_post_filename): @@ -1626,6 +1628,7 @@ def test_post_message_between_servers(base_dir: str) -> None: print("Bob reacts to Alice's post") sites_unavailable = [] + mitm_servers = [] assert reaction_post({}, session_bob, bob_dir, federation_list, 'bob', bob_domain, bob_port, http_prefix, 'alice', alice_domain, alice_port, [], @@ -1634,7 +1637,7 @@ def test_post_message_between_servers(base_dir: str) -> None: bob_person_cache, bob_cached_webfingers, True, __version__, signing_priv_key_pem, bob_domain, None, None, sites_unavailable, - system_language) + system_language, mitm_servers) for _ in range(20): if text_in_file('reactions', outbox_post_filename): @@ -1667,6 +1670,7 @@ def test_post_message_between_servers(base_dir: str) -> None: assert outbox_before_announce_count == 0 assert before_announce_count == 0 sites_unavailable = [] + mitm_servers = [] announce_public(session_bob, bob_dir, federation_list, 'bob', bob_domain, bob_port, http_prefix, object_url, @@ -1674,7 +1678,7 @@ def test_post_message_between_servers(base_dir: str) -> None: bob_person_cache, bob_cached_webfingers, True, __version__, signing_priv_key_pem, bob_domain, None, None, sites_unavailable, - system_language) + system_language, mitm_servers) announce_message_arrived = False outbox_message_arrived = False for _ in range(20): @@ -1813,6 +1817,7 @@ def test_follow_between_servers(base_dir: str) -> None: sites_unavailable = [] bob_actor = http_prefix + '://' + bob_address + '/users/bob' signing_priv_key_pem = None + mitm_servers = [] send_result = \ send_follow_request(session_alice, alice_dir, 'alice', alice_domain, @@ -1824,7 +1829,7 @@ def test_follow_between_servers(base_dir: str) -> None: alice_cached_webfingers, alice_person_cache, True, __version__, signing_priv_key_pem, alice_domain, None, None, sites_unavailable, - system_language) + system_language, mitm_servers) print('send_result: ' + str(send_result)) alice_dir_str = data_dir(alice_dir) @@ -1871,6 +1876,7 @@ def test_follow_between_servers(base_dir: str) -> None: video_transcript = None auto_cw_cache = {} searchable_by = [] + mitm_servers = [] send_result = \ send_post(signing_priv_key_pem, __version__, session_alice, alice_dir, 'alice', alice_domain, alice_port, @@ -1886,7 +1892,7 @@ def test_follow_between_servers(base_dir: str) -> None: content_license_url, media_license_url, media_creator, translate, buy_url, chat_url, auto_cw_cache, True, in_reply_to, in_reply_to_atom_uri, subject, - searchable_by) + searchable_by, mitm_servers) print('send_result: ' + str(send_result)) queue_path = data_dir(bob_dir) + '/bob@' + bob_domain + '/queue' @@ -2015,9 +2021,11 @@ def test_shared_items_federation(base_dir: str) -> None: 'host': bob_address, 'Accept': 'application/ld+json; profile="' + profile_str + '"' } + mitm_servers = [] bob_instance_actor_json = \ get_json(signing_priv_key_pem, session_client, 'http://' + bob_address + '/@actor', test_headers, {}, True, + mitm_servers, __version__, 'http', 'somedomain.or.other', 10, False) if not get_json_valid(bob_instance_actor_json): print('Unable to get json for ' + 'http://' + bob_address + '/@actor') @@ -2049,6 +2057,7 @@ def test_shared_items_federation(base_dir: str) -> None: alice_cached_webfingers = {} alice_post_log = [] sites_unavailable = [] + mitm_servers = [] bob_actor = http_prefix + '://' + bob_address + '/users/bob' send_result = \ send_follow_request(session_alice, alice_dir, @@ -2061,7 +2070,7 @@ def test_shared_items_federation(base_dir: str) -> None: alice_cached_webfingers, alice_person_cache, True, __version__, signing_priv_key_pem, alice_domain, None, None, sites_unavailable, - system_language) + system_language, mitm_servers) print('send_result: ' + str(send_result)) alice_dir_str = data_dir(alice_dir) @@ -2124,6 +2133,7 @@ def test_shared_items_federation(base_dir: str) -> None: shared_item_price = "1.30" shared_item_currency = "EUR" signing_priv_key_pem = None + mitm_servers = [] session_bob = create_session(proxy_type) share_json = \ send_share_via_server(bob_dir, session_bob, @@ -2138,7 +2148,8 @@ def test_shared_items_federation(base_dir: str) -> None: bob_cached_webfingers, bob_person_cache, True, __version__, shared_item_price, shared_item_currency, - signing_priv_key_pem, system_language) + signing_priv_key_pem, system_language, + mitm_servers) assert share_json assert isinstance(share_json, dict) shared_item_name = 'Epicyon T-shirt' @@ -2164,7 +2175,8 @@ def test_shared_items_federation(base_dir: str) -> None: bob_cached_webfingers, bob_person_cache, True, __version__, shared_item_price, shared_item_currency, - signing_priv_key_pem, system_language) + signing_priv_key_pem, system_language, + mitm_servers) assert share_json assert isinstance(share_json, dict) shared_item_name = 'Soldering iron' @@ -2190,7 +2202,8 @@ def test_shared_items_federation(base_dir: str) -> None: bob_cached_webfingers, bob_person_cache, True, __version__, shared_item_price, shared_item_currency, - signing_priv_key_pem, system_language) + signing_priv_key_pem, system_language, + mitm_servers) assert share_json assert isinstance(share_json, dict) @@ -2213,33 +2226,39 @@ def test_shared_items_federation(base_dir: str) -> None: print('\n\n*********************************************************') print('Bob can read the shared items catalog on his own instance') signing_priv_key_pem = None + mitm_servers = [] catalog_json = \ get_shared_items_catalog_via_server(session_bob, 'bob', bob_password, bob_domain, bob_port, http_prefix, True, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) assert catalog_json pprint(catalog_json) assert 'DFC:supplies' in catalog_json assert len(catalog_json.get('DFC:supplies')) == 3 + mitm_servers = [] offers_json = \ get_offers_via_server(session_bob, 'bob', bob_password, bob_domain, bob_port, http_prefix, True, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) assert offers_json print('Offers collection:') pprint(offers_json) assert isinstance(offers_json, dict) assert len(offers_json['orderedItems']) >= 1 + mitm_servers = [] wanted_json = \ get_wanted_via_server(session_bob, 'bob', bob_password, bob_domain, bob_port, http_prefix, True, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) print('Wanted collection:') pprint(wanted_json) assert isinstance(wanted_json, dict) @@ -2272,6 +2291,7 @@ def test_shared_items_federation(base_dir: str) -> None: video_transcript = None auto_cw_cache = {} searchable_by = [] + mitm_servers = [] send_result = \ send_post(signing_priv_key_pem, __version__, session_alice, alice_dir, 'alice', alice_domain, alice_port, @@ -2287,7 +2307,7 @@ def test_shared_items_federation(base_dir: str) -> None: content_license_url, media_license_url, media_creator, translate, buy_url, chat_url, auto_cw_cache, True, in_reply_to, in_reply_to_atom_uri, subject, - searchable_by) + searchable_by, mitm_servers) print('send_result: ' + str(send_result)) queue_path = data_dir(bob_dir) + '/bob@' + bob_domain + '/queue' @@ -2342,8 +2362,9 @@ def test_shared_items_federation(base_dir: str) -> None: } url = http_prefix + '://' + bob_address + '/catalog' signing_priv_key_pem = None + mitm_servers: [] catalog_json = get_json(signing_priv_key_pem, session_alice, url, headers, - None, True) + None, True, mitm_servers) assert get_json_valid(catalog_json) pprint(catalog_json) assert 'DFC:supplies' in catalog_json @@ -2493,8 +2514,10 @@ def test_group_follow(base_dir: str) -> None: 'Accept': 'application/ld+json; profile="' + profile_str + '"' } signing_priv_key_pem = None + mitm_servers = [] outbox_json = get_json(signing_priv_key_pem, session, alice_outbox, - as_header, None, True, __version__, 'http', None) + as_header, None, True, mitm_servers, + __version__, 'http', None) assert get_json_valid(outbox_json) pprint(outbox_json) assert outbox_json['type'] == 'OrderedCollection' @@ -2504,9 +2527,10 @@ def test_group_follow(base_dir: str) -> None: print('Alice outbox totalItems: ' + str(outbox_json['totalItems'])) assert outbox_json['totalItems'] == 3 + mitm_servers = [] outbox_json = get_json(signing_priv_key_pem, session, first_page, as_header, - None, True, __version__, 'http', None) + None, True, mitm_servers, __version__, 'http', None) assert get_json_valid(outbox_json) pprint(outbox_json) assert 'orderedItems' in outbox_json @@ -2539,6 +2563,7 @@ def test_group_follow(base_dir: str) -> None: testgroup_actor = \ http_prefix + '://' + testgroupAddress + '/users/testgroup' signing_priv_key_pem = None + mitm_servers = [] send_result = \ send_follow_request(session_alice, alice_dir, 'alice', alice_domain, @@ -2550,7 +2575,7 @@ def test_group_follow(base_dir: str) -> None: alice_cached_webfingers, alice_person_cache, True, __version__, signing_priv_key_pem, alice_domain, None, None, sites_unavailable, - system_language) + system_language, mitm_servers) print('send_result: ' + str(send_result)) alice_following_filename = \ @@ -2619,6 +2644,7 @@ def test_group_follow(base_dir: str) -> None: testgroup_actor = \ http_prefix + '://' + testgroupAddress + '/users/testgroup' signing_priv_key_pem = None + mitm_servers = [] send_result = \ send_follow_request(session_bob, bob_dir, 'bob', bob_domain, @@ -2630,7 +2656,7 @@ def test_group_follow(base_dir: str) -> None: bob_cached_webfingers, bob_person_cache, True, __version__, signing_priv_key_pem, bob_domain, None, None, sites_unavailable, - system_language) + system_language, mitm_servers) print('send_result: ' + str(send_result)) bob_following_filename = \ @@ -2715,6 +2741,7 @@ def test_group_follow(base_dir: str) -> None: video_transcript = None auto_cw_cache = {} searchable_by = [] + mitm_servers = [] send_result = \ send_post(signing_priv_key_pem, __version__, session_alice, alice_dir, 'alice', alice_domain, alice_port, @@ -2730,7 +2757,7 @@ def test_group_follow(base_dir: str) -> None: content_license_url, media_license_url, media_creator, translate, buy_url, chat_url, auto_cw_cache, True, in_reply_to, in_reply_to_atom_uri, subject, - searchable_by) + searchable_by, mitm_servers) print('send_result: ' + str(send_result)) for _ in range(20): @@ -3370,6 +3397,7 @@ def test_client_to_server(base_dir: str): video_transcript = None auto_cw_cache = {} searchable_by = [] + mitm_servers = [] send_result = \ send_post_via_server(signing_priv_key_pem, __version__, alice_dir, session_alice, 'alice', password, @@ -3386,7 +3414,7 @@ def test_client_to_server(base_dir: str): event_date, event_time, event_end_time, location, translate, buy_url, chat_url, auto_cw_cache, True, None, None, conversation_id, convthread_id, - None, searchable_by) + None, searchable_by, mitm_servers) print('send_result: ' + str(send_result)) for _ in range(30): @@ -3455,6 +3483,7 @@ def test_client_to_server(base_dir: str): print('\n\nAlice follows Bob') signing_priv_key_pem = None + mitm_servers = [] send_follow_request_via_server(alice_dir, session_alice, 'alice', password, alice_domain, alice_port, @@ -3462,7 +3491,7 @@ def test_client_to_server(base_dir: str): http_prefix, cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) alice_petnames_filename = data_dir(alice_dir) + '/' + \ 'alice@' + alice_domain + '/petnames.txt' alice_following_filename = \ @@ -3497,6 +3526,7 @@ def test_client_to_server(base_dir: str): alice_domain, alice_port) print('\n\nEVENT: Bob follows Alice') + mitm_servers = [] send_follow_request_via_server(alice_dir, session_alice, 'bob', 'bobpass', bob_domain, bob_port, @@ -3504,7 +3534,7 @@ def test_client_to_server(base_dir: str): http_prefix, cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) alice_dir_str = data_dir(alice_dir) bob_dir_str = data_dir(bob_dir) for _ in range(20): @@ -3590,13 +3620,14 @@ def test_client_to_server(base_dir: str): assert 'VEVENT' not in str(result) print('\n\nEVENT: Bob likes the post') + mitm_servers = [] send_like_via_server(bob_dir, session_bob, 'bob', 'bobpass', bob_domain, bob_port, http_prefix, outbox_post_id, cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(20): if os.path.isdir(outbox_path) and os.path.isdir(inbox_path): if len([name for name in os.listdir(outbox_path) @@ -3621,13 +3652,14 @@ def test_client_to_server(base_dir: str): print('EVENT: Post liked') print('\n\nEVENT: Bob reacts to the post') + mitm_servers = [] send_reaction_via_server(bob_dir, session_bob, 'bob', 'bobpass', bob_domain, bob_port, http_prefix, outbox_post_id, '😃', cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(20): if os.path.isdir(outbox_path) and os.path.isdir(inbox_path): if len([name for name in os.listdir(outbox_path) @@ -3669,13 +3701,14 @@ def test_client_to_server(base_dir: str): show_test_boxes('bob', bob_inbox_path, bob_outbox_path) print('\n\nEVENT: Bob repeats the post') signing_priv_key_pem = None + mitm_servers = [] send_announce_via_server(bob_dir, session_bob, 'bob', password, bob_domain, bob_port, http_prefix, outbox_post_id, cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(30): if os.path.isdir(outbox_path) and os.path.isdir(inbox_path): if len([name for name in os.listdir(outbox_path) @@ -3711,12 +3744,13 @@ def test_client_to_server(base_dir: str): print('\n\nEVENT: Alice deletes her post: ' + outbox_post_id + ' ' + str(alice_posts_before)) password = 'alicepass' + mitm_servers = [] send_delete_via_server(alice_dir, session_alice, 'alice', password, alice_domain, alice_port, http_prefix, outbox_post_id, cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(30): if os.path.isdir(inbox_path): test = len([name for name in os.listdir(inbox_path) @@ -3741,6 +3775,7 @@ def test_client_to_server(base_dir: str): print('\n\nEVENT: Alice unfollows Bob') password = 'alicepass' + mitm_servers = [] send_unfollow_request_via_server(base_dir, session_alice, 'alice', password, alice_domain, alice_port, @@ -3748,7 +3783,7 @@ def test_client_to_server(base_dir: str): http_prefix, cached_webfingers, person_cache, True, __version__, signing_priv_key_pem, - system_language) + system_language, mitm_servers) for _ in range(10): test_str = 'alice@' + alice_domain + ':' + str(alice_port) if not text_in_file(test_str, bob_followers_filename): @@ -6592,6 +6627,7 @@ def test_update_actor(base_dir: str): '=gv5G\n' + \ '-----END PGP PUBLIC KEY BLOCK-----' signing_priv_key_pem = None + mitm_servers = [] actor_update = \ pgp_public_key_upload(alice_dir, session_alice, 'alice', password, @@ -6599,7 +6635,7 @@ def test_update_actor(base_dir: str): http_prefix, cached_webfingers, person_cache, True, pub_key, signing_priv_key_pem, - system_language) + system_language, mitm_servers) print('actor update result: ' + str(actor_update)) assert actor_update diff --git a/utils.py b/utils.py index 91ad2cf5c..ac78a9cab 100644 --- a/utils.py +++ b/utils.py @@ -5325,3 +5325,37 @@ def browser_supports_download_filename(ua_str: str) -> bool: if 'mozilla' in ua_str or 'firefox' in ua_str: return True return False + + +def detect_mitm(self) -> bool: + """Detect if a request contains a MiTM + """ + mitm_domains = ['cloudflare'] + # look for domains within these headers + check_headers = ( + 'Server', 'Report-To', 'Report-to', 'report-to', + 'Expect-CT', 'Expect-Ct', 'expect-ct' + ) + for interloper in mitm_domains: + for header_name in check_headers: + if not self.headers.get(header_name): + continue + if interloper in str(self.headers[header_name]): + print('MITM: ' + header_name + ' = ' + + str(self.headers[header_name])) + return True + # The presence of these headers on their own indicates a MiTM + mitm_headers = ( + 'CF-Connecting-IP', 'CF-RAY', 'CF-IPCountry', 'CF-Visitor', + 'CDN-Loop', 'CF-Worker', 'CF-Cache-Status' + ) + for header_name in mitm_headers: + if self.headers.get(header_name): + print('MITM: ' + header_name + ' = ' + + self.headers[header_name]) + return True + if self.headers.get(header_name.lower()): + print('MITM: ' + header_name + ' = ' + + self.headers[header_name.lower()]) + return True + return False diff --git a/webapp_confirm.py b/webapp_confirm.py index 07366cae3..24e86703e 100644 --- a/webapp_confirm.py +++ b/webapp_confirm.py @@ -44,7 +44,8 @@ def html_confirm_delete(server, dogwhistles: {}, min_images_for_accounts: [], buy_sites: {}, - auto_cw_cache: {}) -> str: + auto_cw_cache: {}, + mitm_servers: []) -> str: """Shows a screen asking to confirm the deletion of a post """ if '/statuses/' not in message_id: @@ -105,7 +106,7 @@ def html_confirm_delete(server, cw_lists, lists_enabled, timezone, mitm, bold_reading, dogwhistles, minimize_all_images, None, buy_sites, - auto_cw_cache) + auto_cw_cache, mitm_servers) delete_post_str += '
' delete_post_str += \ '

' + \ diff --git a/webapp_conversation.py b/webapp_conversation.py index 92a01d058..dcdbb1050 100644 --- a/webapp_conversation.py +++ b/webapp_conversation.py @@ -55,14 +55,15 @@ def html_conversation_view(authorized: bool, post_id: str, block_federated: [], auto_cw_cache: {}, ua_str: str, - default_timeline: str) -> str: + default_timeline: str, + mitm_servers: []) -> str: """Show a page containing a conversation thread """ conv_posts = \ download_conversation_posts(authorized, session, http_prefix, base_dir, nickname, domain, - post_id, debug) + post_id, debug, mitm_servers) if not conv_posts: return None @@ -154,7 +155,8 @@ def html_conversation_view(authorized: bool, post_id: str, timezone, False, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) if post_str: conv_str += \ current_reading_str + text_mode_separator + \ diff --git a/webapp_create_post.py b/webapp_create_post.py index 824a22743..50bbc994e 100644 --- a/webapp_create_post.py +++ b/webapp_create_post.py @@ -273,7 +273,8 @@ def html_new_post(edit_post_params: {}, buy_sites: {}, default_buy_site: str, auto_cw_cache: {}, - searchable_by_default: str) -> str: + searchable_by_default: str, + mitm_servers: []) -> str: """New post screen """ # get the json if this is an edited post @@ -466,7 +467,8 @@ def html_new_post(edit_post_params: {}, timezone, False, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) new_post_text += \ open_content_warning(replied_to_post, translate) # about the author diff --git a/webapp_frontscreen.py b/webapp_frontscreen.py index a7886af74..36dd689fc 100644 --- a/webapp_frontscreen.py +++ b/webapp_frontscreen.py @@ -42,7 +42,8 @@ def _html_front_screen_posts(recent_posts_cache: {}, max_recent_posts: int, dogwhistles: {}, min_images_for_accounts: [], buy_sites: {}, - auto_cw_cache: {}) -> str: + auto_cw_cache: {}, + mitm_servers: []) -> str: """Shows posts on the front screen of a news instance These should only be public blog posts from the features timeline which is the blog timeline of the news actor @@ -99,7 +100,8 @@ def _html_front_screen_posts(recent_posts_cache: {}, max_recent_posts: int, timezone, False, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) if post_str: profile_str += post_str + separator_str ctr += 1 @@ -132,7 +134,8 @@ def html_front_screen(signing_priv_key_pem: str, min_images_for_accounts: [], buy_sites: {}, auto_cw_cache: {}, - known_epicyon_instances: []) -> str: + known_epicyon_instances: [], + mitm_servers: []) -> str: """Show the news instance front screen """ bold_reading = False @@ -211,7 +214,8 @@ def html_front_screen(signing_priv_key_pem: str, bold_reading, dogwhistles, min_images_for_accounts, buy_sites, - auto_cw_cache) + license_str + auto_cw_cache, + mitm_servers) + license_str # Footer which is only used for system accounts profile_footer_str = ' \n' diff --git a/webapp_likers.py b/webapp_likers.py index 42c77e5af..11efa78d9 100644 --- a/webapp_likers.py +++ b/webapp_likers.py @@ -45,7 +45,8 @@ def html_likers_of_post(base_dir: str, nickname: str, bold_reading: bool, dogwhistles: {}, min_images_for_accounts: [], buy_sites: {}, auto_cw_cache: {}, - dict_name: str) -> str: + dict_name: str, + mitm_servers: []) -> str: """Returns html for a screen showing who liked a post """ css_filename = base_dir + '/epicyon-profile.css' @@ -118,7 +119,8 @@ def html_likers_of_post(base_dir: str, nickname: str, timezone, mitm, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) # show likers beneath the post obj = post_json_object diff --git a/webapp_moderation.py b/webapp_moderation.py index 8a2bc3a49..0bb2b624e 100644 --- a/webapp_moderation.py +++ b/webapp_moderation.py @@ -67,7 +67,8 @@ def html_moderation(default_timeline: str, reverse_sequence: bool, buy_sites: {}, auto_cw_cache: {}, - known_epicyon_instances: []) -> str: + known_epicyon_instances: [], + mitm_servers: []) -> str: """Show the moderation feed as html This is what you see when selecting the "mod" timeline """ @@ -97,7 +98,7 @@ def html_moderation(default_timeline: str, timezone, bold_reading, dogwhistles, ua_str, min_images_for_accounts, reverse_sequence, None, buy_sites, auto_cw_cache, show_announces, - known_epicyon_instances) + known_epicyon_instances, mitm_servers) def html_account_info(translate: {}, @@ -106,7 +107,8 @@ def html_account_info(translate: {}, search_handle: str, debug: bool, system_language: str, signing_priv_key_pem: str, back_url: str, - block_federated: []) -> str: + block_federated: [], + mitm_servers: []) -> str: """Shows which domains a search handle interacts with. This screen is shown if a moderator enters a handle and selects info on the moderation screen @@ -162,13 +164,15 @@ def html_account_info(translate: {}, http_prefix, debug, __version__, word_frequency, system_language, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) # get a list of any blocked followers followers_list = \ download_follow_collection(signing_priv_key_pem, 'followers', session, - http_prefix, search_actor, 1, 5, debug) + http_prefix, search_actor, 1, 5, debug, + mitm_servers) blocked_followers = [] for follower_actor in followers_list: follower_nickname = get_nickname_from_actor(follower_actor) @@ -187,7 +191,8 @@ def html_account_info(translate: {}, following_list = \ download_follow_collection(signing_priv_key_pem, 'following', session, - http_prefix, search_actor, 1, 5, debug) + http_prefix, search_actor, 1, 5, debug, + mitm_servers) blocked_following = [] for following_actor in following_list: following_nickname = get_nickname_from_actor(following_actor) diff --git a/webapp_podcast.py b/webapp_podcast.py index ae0c779ce..c4f3fb81e 100644 --- a/webapp_podcast.py +++ b/webapp_podcast.py @@ -35,7 +35,8 @@ def _html_podcast_chapters(link_url: str, session, session_onion, session_i2p, http_prefix: str, domain: str, podcast_properties: {}, - debug: bool) -> str: + debug: bool, + mitm_servers: []) -> str: """Returns html for chapters of a podcast """ if not podcast_properties: @@ -69,7 +70,7 @@ def _html_podcast_chapters(link_url: str, if 'json' in url_type: chapters_json = \ get_json(None, curr_session, chapters_url, - as_header, None, debug, __version__, + as_header, None, debug, mitm_servers, __version__, http_prefix, domain) if not get_json_valid(chapters_json): return '' @@ -309,7 +310,8 @@ def html_podcast_episode(translate: {}, newswire_item: [], text_mode_banner: str, session, session_onion, session_i2p, - http_prefix: str, debug: bool) -> str: + http_prefix: str, debug: bool, + mitm_servers: []) -> str: """Returns html for a podcast episode, an item from the newswire """ css_filename = base_dir + '/epicyon-podcast.css' @@ -513,7 +515,7 @@ def html_podcast_episode(translate: {}, _html_podcast_chapters(link_url, session, session_onion, session_i2p, http_prefix, domain, - podcast_properties, debug) + podcast_properties, debug, mitm_servers) podcast_str += '

\n' podcast_str += '\n' diff --git a/webapp_post.py b/webapp_post.py index 0a4775438..f04fa4f6b 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -490,7 +490,8 @@ def _get_post_from_recent_cache(session, signing_priv_key_pem: str, first_post_id: str, ua_str: str, - translate: {}) -> str: + translate: {}, + mitm_servers: []) -> str: """Attempts to get the html post from the recent posts cache in memory """ if box_name == 'tlmedia': @@ -517,7 +518,7 @@ def _get_post_from_recent_cache(session, update_avatar_image_cache(signing_priv_key_pem, session, base_dir, http_prefix, post_actor, avatar_url, person_cache, - allow_downloads) + allow_downloads, mitm_servers) _log_post_timing(enable_timing_log, post_start_time, '2.2') @@ -1395,7 +1396,8 @@ def _get_post_title_announce_html(base_dir: str, message_id_str: str, container_class_icons: str, container_class: str, - mitm: bool) -> (str, str, str, str): + mitm: bool, + mitm_servers: []) -> (str, str, str, str): """Returns the announce title of a post containing names of participants x announces y """ @@ -1464,7 +1466,7 @@ def _get_post_title_announce_html(base_dir: str, announce_display_name, nickname, announce_handle) - if mitm: + if mitm or announce_domain in mitm_servers: title_str += _mitm_warning_html(translate) # show avatar of person replied to @@ -1621,7 +1623,8 @@ def _get_post_title_reply_html(base_dir: str, container_class: str, mitm: bool, signing_priv_key_pem: str, - session, debug: bool) -> (str, str, str, str): + session, debug: bool, + mitm_servers: []) -> (str, str, str, str): """Returns the reply title of a post containing names of participants x replies to y """ @@ -1663,7 +1666,7 @@ def _get_post_title_reply_html(base_dir: str, reply_post_json = \ get_json(signing_priv_key_pem, session, reply_url, - headers, None, debug, + headers, None, debug, mitm_servers, __version__, http_prefix, domain) if get_json_valid(reply_post_json): if isinstance(reply_post_json, dict): @@ -1742,7 +1745,7 @@ def _get_post_title_reply_html(base_dir: str, _get_reply_html(translate, in_reply_to, reply_display_name, nickname, post_json_object, reply_handle) - if mitm: + if mitm or reply_domain in mitm_servers: title_str += _mitm_warning_html(translate) _log_post_timing(enable_timing_log, post_start_time, '13.7') @@ -1792,7 +1795,8 @@ def _get_post_title_html(base_dir: str, mitm: bool, signing_priv_key_pem: str, session, - debug: bool) -> (str, str, str, str): + debug: bool, + mitm_servers: []) -> (str, str, str, str): """Returns the title of a post containing names of participants x replies to y, x announces y, etc """ @@ -1835,7 +1839,8 @@ def _get_post_title_html(base_dir: str, container_class_icons, container_class, mitm, signing_priv_key_pem, - session, debug) + session, debug, + mitm_servers) def _get_footer_with_icons(show_icons: bool, @@ -2127,7 +2132,8 @@ def individual_post_as_html(signing_priv_key_pem: str, minimize_all_images: bool, first_post_id: str, buy_sites: {}, - auto_cw_cache: {}) -> str: + auto_cw_cache: {}, + mitm_servers: []) -> str: """ Shows a single post as html """ if not post_json_object: @@ -2197,7 +2203,8 @@ def individual_post_as_html(signing_priv_key_pem: str, max_recent_posts, signing_priv_key_pem, first_post_id, ua_str, - translate) + translate, + mitm_servers) if post_html: return post_html if use_cache_only and post_json_object['type'] != 'Announce': @@ -2210,7 +2217,8 @@ def individual_post_as_html(signing_priv_key_pem: str, base_dir, http_prefix, post_actor, person_cache, avatar_url, allow_downloads, - signing_priv_key_pem) + signing_priv_key_pem, + mitm_servers) _log_post_timing(enable_timing_log, post_start_time, '5') @@ -2230,7 +2238,7 @@ def individual_post_as_html(signing_priv_key_pem: str, webfinger_handle(session, post_actor_handle, http_prefix, cached_webfingers, domain, __version__, False, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) avatar_url2 = None display_name = None @@ -2246,7 +2254,8 @@ def individual_post_as_html(signing_priv_key_pem: str, http_prefix, nickname, domain, 'outbox', 72367, - system_language) + system_language, + mitm_servers) _log_post_timing(enable_timing_log, post_start_time, '6') @@ -2318,7 +2327,8 @@ def individual_post_as_html(signing_priv_key_pem: str, blocked_cache, block_federated, bold_reading, show_vote_posts, - languages_understood) + languages_understood, + mitm_servers) if not post_json_announce: # if the announce could not be downloaded then mark it as rejected announced_post_id = remove_id_ending(post_json_object['id']) @@ -2346,7 +2356,8 @@ def individual_post_as_html(signing_priv_key_pem: str, max_recent_posts, signing_priv_key_pem, first_post_id, ua_str, - translate) + translate, + mitm_servers) if post_html: return post_html @@ -2652,7 +2663,8 @@ def individual_post_as_html(signing_priv_key_pem: str, container_class_icons, container_class, mitm, signing_priv_key_pem, - session, False) + session, False, + mitm_servers) title_str += title_str2 _log_post_timing(enable_timing_log, post_start_time, '14') @@ -3095,7 +3107,7 @@ def html_individual_post(recent_posts_cache: {}, max_recent_posts: int, bold_reading: bool, dogwhistles: {}, min_images_for_accounts: [], buy_sites: {}, - auto_cw_cache: {}) -> str: + auto_cw_cache: {}, mitm_servers: []) -> str: """Show an individual post as html """ original_post_json = post_json_object @@ -3182,7 +3194,7 @@ def html_individual_post(recent_posts_cache: {}, max_recent_posts: int, cw_lists, lists_enabled, timezone, mitm, bold_reading, dogwhistles, minimize_all_images, None, buy_sites, - auto_cw_cache) + auto_cw_cache, mitm_servers) message_id = remove_id_ending(post_json_object['id']) # show the previous posts @@ -3234,7 +3246,8 @@ def html_individual_post(recent_posts_cache: {}, max_recent_posts: int, dogwhistles, minimize_all_images, None, buy_sites, - auto_cw_cache) + post_str + auto_cw_cache, + mitm_servers) + post_str # show the following posts post_filename = locate_post(base_dir, nickname, domain, message_id) @@ -3275,7 +3288,8 @@ def html_individual_post(recent_posts_cache: {}, max_recent_posts: int, timezone, False, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) css_filename = base_dir + '/epicyon-profile.css' if os.path.isfile(base_dir + '/epicyon.css'): css_filename = base_dir + '/epicyon.css' @@ -3327,7 +3341,8 @@ def html_post_replies(recent_posts_cache: {}, max_recent_posts: int, dogwhistles: {}, min_images_for_accounts: [], buy_sites: {}, - auto_cw_cache: {}) -> str: + auto_cw_cache: {}, + mitm_servers: []) -> str: """Show the replies to an individual post as html """ replies_str = '' @@ -3359,7 +3374,8 @@ def html_post_replies(recent_posts_cache: {}, max_recent_posts: int, timezone, False, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) css_filename = base_dir + '/epicyon-profile.css' if os.path.isfile(base_dir + '/epicyon.css'): @@ -3394,7 +3410,8 @@ def html_emoji_reaction_picker(recent_posts_cache: {}, max_recent_posts: int, dogwhistles: {}, min_images_for_accounts: [], buy_sites: {}, - auto_cw_cache: {}) -> str: + auto_cw_cache: {}, + mitm_servers: []) -> str: """Returns the emoji picker screen """ minimize_all_images = False @@ -3423,7 +3440,7 @@ def html_emoji_reaction_picker(recent_posts_cache: {}, max_recent_posts: int, cw_lists, lists_enabled, timezone, False, bold_reading, dogwhistles, minimize_all_images, None, buy_sites, - auto_cw_cache) + auto_cw_cache, mitm_servers) reactions_filename = base_dir + '/emoji/reactions.json' if not os.path.isfile(reactions_filename): diff --git a/webapp_profile.py b/webapp_profile.py index 192ab9d9c..16fb5a1bd 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -248,7 +248,8 @@ def html_profile_after_search(authorized: bool, buy_sites: {}, max_shares_on_profile: int, no_of_books: int, - auto_cw_cache: {}) -> str: + auto_cw_cache: {}, + mitm_servers: []) -> str: """Show a profile page after a search for a fediverse address """ http = False @@ -275,7 +276,8 @@ def html_profile_after_search(authorized: bool, profile_json, as_header = \ get_actor_json(from_domain, profile_handle, http, gnunet, ipfs, ipns, debug, False, - signing_priv_key_pem, session) + signing_priv_key_pem, session, + mitm_servers) if not profile_json: return None if not profile_json.get('id'): @@ -542,7 +544,8 @@ def html_profile_after_search(authorized: bool, user_feed = \ parse_user_feed(signing_priv_key_pem, session, outbox_url, as_header, project_version, - http_prefix, from_domain, debug, 0) + http_prefix, from_domain, debug, 0, + mitm_servers) if not user_feed: if debug: print('DEBUG: no user feed in profile preview') @@ -566,8 +569,8 @@ def html_profile_after_search(authorized: bool, } item = \ get_json(signing_priv_key_pem, session, item['object'], - as_header2, None, debug, __version__, - http_prefix, from_domain) + as_header2, None, debug, mitm_servers, + __version__, http_prefix, from_domain) if debug: print('DEBUG: resolved public feed announce ' + str(item)) @@ -609,7 +612,8 @@ def html_profile_after_search(authorized: bool, timezone, False, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) if not profile_post_html: if debug: print('DEBUG: no html produced for profile post: ' + @@ -1032,7 +1036,8 @@ def html_profile(signing_priv_key_pem: str, sites_unavailable: [], no_of_books: int, auto_cw_cache: {}, - known_epicyon_instances: []) -> str: + known_epicyon_instances: [], + mitm_servers: []) -> str: """Show the profile page as html """ show_moved_accounts = False @@ -1065,7 +1070,8 @@ def html_profile(signing_priv_key_pem: str, lists_enabled, {}, min_images_for_accounts, buy_sites, auto_cw_cache, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) domain, port = get_domain_from_actor(profile_json['id']) if not domain: @@ -1172,7 +1178,8 @@ def html_profile(signing_priv_key_pem: str, if website_url: if site_is_verified(session, base_dir, http_prefix, nickname, domain, - website_url, False, debug): + website_url, False, debug, + mitm_servers): donate_section += \ '

' + \ translate['Website'] + ': ' + \ @@ -1202,7 +1209,8 @@ def html_profile(signing_priv_key_pem: str, if blog_address: if site_is_verified(session, base_dir, http_prefix, nickname, domain, - blog_address, False, debug): + blog_address, False, debug, + mitm_servers): donate_section += \ '

' + \ 'Blog: ' + verified_site_checkmark + \ @@ -1637,7 +1645,8 @@ def html_profile(signing_priv_key_pem: str, min_images_for_accounts, max_profile_posts, buy_sites, - auto_cw_cache) + license_str + auto_cw_cache, + mitm_servers) + license_str if not is_group: if selected == 'following': profile_str += \ @@ -1653,7 +1662,8 @@ def html_profile(signing_priv_key_pem: str, dormant_months, debug, signing_priv_key_pem, sites_unavailable, - system_language) + system_language, + mitm_servers) if show_moved_accounts and selected == 'moved': profile_str += \ _html_profile_following(translate, base_dir, http_prefix, @@ -1668,7 +1678,8 @@ def html_profile(signing_priv_key_pem: str, dormant_months, debug, signing_priv_key_pem, sites_unavailable, - system_language) + system_language, + mitm_servers) if selected == 'followers': profile_str += \ _html_profile_following(translate, base_dir, http_prefix, @@ -1680,7 +1691,7 @@ def html_profile(signing_priv_key_pem: str, selected, users_path, page_number, max_items_per_page, dormant_months, debug, signing_priv_key_pem, sites_unavailable, - system_language) + system_language, mitm_servers) if authorized and selected == 'inactive': profile_str += \ _html_profile_following(translate, base_dir, http_prefix, @@ -1692,7 +1703,7 @@ def html_profile(signing_priv_key_pem: str, selected, users_path, page_number, max_items_per_page, dormant_months, debug, signing_priv_key_pem, sites_unavailable, - system_language) + system_language, mitm_servers) if not is_group: if selected == 'roles': profile_str += \ @@ -1745,7 +1756,8 @@ def _html_profile_posts(recent_posts_cache: {}, max_recent_posts: int, min_images_for_accounts: [], max_profile_posts: int, buy_sites: {}, - auto_cw_cache: {}) -> str: + auto_cw_cache: {}, + mitm_servers: []) -> str: """Shows posts on the profile screen These should only be public posts """ @@ -1804,7 +1816,8 @@ def _html_profile_posts(recent_posts_cache: {}, max_recent_posts: int, timezone, False, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) if post_str and item_id not in shown_items: profile_str += post_str + separator_str shown_items.append(item_id) @@ -1826,7 +1839,8 @@ def _html_profile_following(translate: {}, base_dir: str, http_prefix: str, dormant_months: int, debug: bool, signing_priv_key_pem: str, sites_unavailable: [], - system_language: str) -> str: + system_language: str, + mitm_servers: []) -> str: """Shows following on the profile screen """ profile_str = '' @@ -1874,7 +1888,9 @@ def _html_profile_following(translate: {}, base_dir: str, http_prefix: str, authorized, nickname, http_prefix, project_version, dormant, offline, - debug, system_language, buttons) + debug, system_language, + mitm_servers, + buttons) if authorized and max_items_per_page and page_number: if len(following_json['orderedItems']) >= max_items_per_page: @@ -3657,7 +3673,8 @@ def _individual_follow_as_html(signing_priv_key_pem: str, offline: bool, debug: bool, system_language: str, - buttons=[]) -> str: + mitm_servers: [], + buttons: list = []) -> str: """An individual follow entry on the profile screen """ follow_url_nickname = get_nickname_from_actor(follow_url) @@ -3683,7 +3700,7 @@ def _individual_follow_as_html(signing_priv_key_pem: str, webfinger_handle(session, follow_url_handle, http_prefix, cached_webfingers, domain, __version__, debug, False, - signing_priv_key_pem) + signing_priv_key_pem, mitm_servers) origin_domain = domain (_, _, _, _, _, avatar_url2, @@ -3696,7 +3713,8 @@ def _individual_follow_as_html(signing_priv_key_pem: str, http_prefix, follow_url_nickname, domain, 'outbox', 43036, - system_language) + system_language, + mitm_servers) if avatar_url2: avatar_url = avatar_url2 diff --git a/webapp_search.py b/webapp_search.py index 701328747..f5f804074 100644 --- a/webapp_search.py +++ b/webapp_search.py @@ -734,7 +734,8 @@ def html_history_search(translate: {}, base_dir: str, dogwhistles: {}, access_keys: {}, min_images_for_accounts: [], buy_sites: {}, - auto_cw_cache: {}) -> str: + auto_cw_cache: {}, + mitm_servers: []) -> str: """Show a page containing search results for your post history """ if historysearch.startswith("'"): @@ -851,7 +852,8 @@ def html_history_search(translate: {}, base_dir: str, timezone, False, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) if post_str: history_search_form += separator_str + post_str index += 1 @@ -881,7 +883,8 @@ def html_hashtag_search(nickname: str, domain: str, port: int, access_keys: {}, box_name: str, min_images_for_accounts: [], buy_sites: {}, auto_cw_cache: {}, - ua_str: str) -> str: + ua_str: str, + mitm_servers: []) -> str: """Show a page containing search results for a hashtag or after selecting a hashtag from the swarm """ @@ -1080,7 +1083,8 @@ def html_hashtag_search(nickname: str, domain: str, port: int, lists_enabled, timezone, False, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) if post_str: hashtag_search_form += \ text_mode_separator + separator_str + post_str @@ -1124,7 +1128,8 @@ def html_hashtag_search_remote(nickname: str, domain: str, port: int, dogwhistles: {}, min_images_for_accounts: [], debug: bool, buy_sites: {}, - auto_cw_cache: {}) -> str: + auto_cw_cache: {}, + mitm_servers: []) -> str: """Show a page containing search results for a remote hashtag """ hashtag = urllib.parse.unquote(hashtag_url.split('/')[-1]) @@ -1139,7 +1144,7 @@ def html_hashtag_search_remote(nickname: str, domain: str, port: int, hashtag_json = \ get_json(signing_priv_key_pem, session, hashtag_url_with_page, as_header, None, debug, - __version__, http_prefix, domain) + mitm_servers, __version__, http_prefix, domain) lines = [] if get_json_valid(hashtag_json): if 'orderedItems' in hashtag_json: @@ -1213,7 +1218,7 @@ def html_hashtag_search_remote(nickname: str, domain: str, port: int, post_json_object = \ get_json(signing_priv_key_pem, session, post_id, as_header, None, debug, - __version__, http_prefix, domain) + mitm_servers, __version__, http_prefix, domain) if not get_json_valid(post_json_object): print('No hashtag post for ' + post_id) continue @@ -1287,7 +1292,8 @@ def html_hashtag_search_remote(nickname: str, domain: str, port: int, lists_enabled, timezone, False, bold_reading, dogwhistles, minimize_all_images, None, - buy_sites, auto_cw_cache) + buy_sites, auto_cw_cache, + mitm_servers) if post_str: hashtag_search_form += \ text_mode_separator + separator_str + post_str diff --git a/webapp_timeline.py b/webapp_timeline.py index f27fe0e66..127df0d63 100644 --- a/webapp_timeline.py +++ b/webapp_timeline.py @@ -523,7 +523,8 @@ def html_timeline(default_timeline: str, buy_sites: {}, auto_cw_cache: {}, show_announces: bool, - known_epicyon_instances: []) -> str: + known_epicyon_instances: [], + mitm_servers: []) -> str: """Show the timeline as html """ enable_timing_log = False @@ -1136,7 +1137,8 @@ def html_timeline(default_timeline: str, bold_reading, dogwhistles, minimize_all_images, first_post_id, buy_sites, - auto_cw_cache) + auto_cw_cache, + mitm_servers) _log_timeline_timing(enable_timing_log, timeline_start_time, box_name, '12') @@ -1418,7 +1420,8 @@ def html_shares(default_timeline: str, reverse_sequence: bool, buy_sites: {}, auto_cw_cache: {}, - known_epicyon_instances: []) -> str: + known_epicyon_instances: [], + mitm_servers: []) -> str: """Show the shares timeline as html """ manually_approve_followers = \ @@ -1454,7 +1457,8 @@ def html_shares(default_timeline: str, min_images_for_accounts, reverse_sequence, None, buy_sites, auto_cw_cache, show_announces, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) def html_wanted(default_timeline: str, @@ -1489,7 +1493,8 @@ def html_wanted(default_timeline: str, reverse_sequence: bool, buy_sites: {}, auto_cw_cache: {}, - known_epicyon_instances: []) -> str: + known_epicyon_instances: [], + mitm_servers: []) -> str: """Show the wanted timeline as html """ manually_approve_followers = \ @@ -1525,7 +1530,8 @@ def html_wanted(default_timeline: str, min_images_for_accounts, reverse_sequence, None, buy_sites, auto_cw_cache, show_announces, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) def html_inbox(default_timeline: str, @@ -1563,7 +1569,8 @@ def html_inbox(default_timeline: str, buy_sites: {}, auto_cw_cache: {}, show_announces: bool, - known_epicyon_instances: []) -> str: + known_epicyon_instances: [], + mitm_servers: []) -> str: """Show the inbox as html """ manually_approve_followers = \ @@ -1598,7 +1605,8 @@ def html_inbox(default_timeline: str, min_images_for_accounts, reverse_sequence, last_post_id, buy_sites, auto_cw_cache, show_announces, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) def html_bookmarks(default_timeline: str, @@ -1634,7 +1642,8 @@ def html_bookmarks(default_timeline: str, reverse_sequence: bool, buy_sites: {}, auto_cw_cache: {}, - known_epicyon_instances: []) -> str: + known_epicyon_instances: [], + mitm_servers: []) -> str: """Show the bookmarks as html """ manually_approve_followers = \ @@ -1669,7 +1678,8 @@ def html_bookmarks(default_timeline: str, min_images_for_accounts, reverse_sequence, None, buy_sites, auto_cw_cache, show_announces, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) def html_inbox_dms(default_timeline: str, @@ -1706,7 +1716,8 @@ def html_inbox_dms(default_timeline: str, last_post_id: str, buy_sites: {}, auto_cw_cache: {}, - known_epicyon_instances: []) -> str: + known_epicyon_instances: [], + mitm_servers: []) -> str: """Show the DM timeline as html """ artist = is_artist(base_dir, nickname) @@ -1737,7 +1748,8 @@ def html_inbox_dms(default_timeline: str, min_images_for_accounts, reverse_sequence, last_post_id, buy_sites, auto_cw_cache, show_announces, - known_epicyon_instances) + known_epicyon_instances, + mitm_servers) def html_inbox_replies(default_timeline: str, @@ -1774,7 +1786,8 @@ def html_inbox_replies(default_timeline: str, last_post_id: str, buy_sites: {}, auto_cw_cache: {}, - known_epicyon_instances: []) -> str: + known_epicyon_instances: [], + mitm_servers: []) -> str: """Show the replies timeline as html """ artist = is_artist(base_dir, nickname) @@ -1803,7 +1816,7 @@ def html_inbox_replies(default_timeline: str, dogwhistles, ua_str, min_images_for_accounts, reverse_sequence, last_post_id, buy_sites, auto_cw_cache, show_announces, - known_epicyon_instances) + known_epicyon_instances, mitm_servers) def html_inbox_media(default_timeline: str, @@ -1841,7 +1854,8 @@ def html_inbox_media(default_timeline: str, buy_sites: {}, auto_cw_cache: {}, show_announces: bool, - known_epicyon_instances: []) -> str: + known_epicyon_instances: [], + mitm_servers: []) -> str: """Show the media timeline as html """ artist = is_artist(base_dir, nickname) @@ -1869,7 +1883,7 @@ def html_inbox_media(default_timeline: str, dogwhistles, ua_str, min_images_for_accounts, reverse_sequence, last_post_id, buy_sites, auto_cw_cache, show_announces, - known_epicyon_instances) + known_epicyon_instances, mitm_servers) def html_inbox_blogs(default_timeline: str, @@ -1906,7 +1920,8 @@ def html_inbox_blogs(default_timeline: str, last_post_id: str, buy_sites: {}, auto_cw_cache: {}, - known_epicyon_instances: []) -> str: + known_epicyon_instances: [], + mitm_servers: []) -> str: """Show the blogs timeline as html """ artist = is_artist(base_dir, nickname) @@ -1935,7 +1950,7 @@ def html_inbox_blogs(default_timeline: str, dogwhistles, ua_str, min_images_for_accounts, reverse_sequence, last_post_id, buy_sites, auto_cw_cache, show_announces, - known_epicyon_instances) + known_epicyon_instances, mitm_servers) def html_inbox_features(default_timeline: str, @@ -1972,7 +1987,8 @@ def html_inbox_features(default_timeline: str, reverse_sequence: bool, buy_sites: {}, auto_cw_cache: {}, - known_epicyon_instances: []) -> str: + known_epicyon_instances: [], + mitm_servers: []) -> str: """Show the features timeline as html """ show_announces = True @@ -2000,7 +2016,7 @@ def html_inbox_features(default_timeline: str, dogwhistles, ua_str, min_images_for_accounts, reverse_sequence, None, buy_sites, auto_cw_cache, show_announces, - known_epicyon_instances) + known_epicyon_instances, mitm_servers) def html_inbox_news(default_timeline: str, @@ -2036,7 +2052,8 @@ def html_inbox_news(default_timeline: str, reverse_sequence: bool, buy_sites: {}, auto_cw_cache: {}, - known_epicyon_instances: []) -> str: + known_epicyon_instances: [], + mitm_servers: []) -> str: """Show the news timeline as html """ show_announces = True @@ -2064,7 +2081,7 @@ def html_inbox_news(default_timeline: str, dogwhistles, ua_str, min_images_for_accounts, reverse_sequence, None, buy_sites, auto_cw_cache, show_announces, - known_epicyon_instances) + known_epicyon_instances, mitm_servers) def html_outbox(default_timeline: str, @@ -2101,7 +2118,8 @@ def html_outbox(default_timeline: str, buy_sites: {}, auto_cw_cache: {}, show_announces: bool, - known_epicyon_instances: []) -> str: + known_epicyon_instances: [], + mitm_servers: []) -> str: """Show the Outbox as html """ manually_approve_followers = \ @@ -2130,4 +2148,5 @@ def html_outbox(default_timeline: str, cw_lists, lists_enabled, timezone, bold_reading, dogwhistles, ua_str, min_images_for_accounts, reverse_sequence, None, buy_sites, auto_cw_cache, - show_announces, known_epicyon_instances) + show_announces, known_epicyon_instances, + mitm_servers) diff --git a/webapp_utils.py b/webapp_utils.py index ddefa1b10..9412b465e 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -379,6 +379,7 @@ def update_avatar_image_cache(signing_priv_key_pem: str, session, base_dir: str, http_prefix: str, actor: str, avatar_url: str, person_cache: {}, allow_downloads: bool, + mitm_servers: [], force: bool = False, debug: bool = False) -> str: """Updates the cached avatar for the given actor """ @@ -451,7 +452,7 @@ def update_avatar_image_cache(signing_priv_key_pem: str, person_json = \ get_json(signing_priv_key_pem, session, actor, session_headers, None, - debug, __version__, http_prefix, None) + debug, mitm_servers, __version__, http_prefix, None) if get_json_valid(person_json): if not person_json.get('id'): return None @@ -1765,7 +1766,8 @@ def html_highlight_label(label: str, highlight: bool) -> str: def get_avatar_image_url(session, base_dir: str, http_prefix: str, post_actor: str, person_cache: {}, avatar_url: str, allow_downloads: bool, - signing_priv_key_pem: str) -> str: + signing_priv_key_pem: str, + mitm_servers: []) -> str: """Returns the avatar image url """ # get the avatar image url for the post actor @@ -1776,12 +1778,12 @@ def get_avatar_image_url(session, base_dir: str, http_prefix: str, update_avatar_image_cache(signing_priv_key_pem, session, base_dir, http_prefix, post_actor, avatar_url, person_cache, - allow_downloads) + allow_downloads, mitm_servers) else: update_avatar_image_cache(signing_priv_key_pem, session, base_dir, http_prefix, post_actor, avatar_url, person_cache, - allow_downloads) + allow_downloads, mitm_servers) if not avatar_url: avatar_url = post_actor + '/avatar.png' diff --git a/webfinger.py b/webfinger.py index 8e56115b5..0a65985fb 100644 --- a/webfinger.py +++ b/webfinger.py @@ -72,7 +72,8 @@ def webfinger_handle(session, handle: str, http_prefix: str, cached_webfingers: {}, from_domain: str, project_version: str, debug: bool, group_account: bool, - signing_priv_key_pem: str) -> {}: + signing_priv_key_pem: str, + mitm_servers: []) -> {}: """Gets webfinger result for the given ActivityPub handle NOTE: in earlier implementations group_account modified the acct prefix. This has been left in, because currently there is still no consensus @@ -106,7 +107,8 @@ def webfinger_handle(session, handle: str, http_prefix: str, try: result = \ get_json(signing_priv_key_pem, session, url, hdr, par, - debug, project_version, http_prefix, from_domain) + debug, mitm_servers, + project_version, http_prefix, from_domain) except BaseException as ex: print('ERROR: webfinger_handle ' + wf_handle + ' ' + str(ex)) return None @@ -126,7 +128,8 @@ def webfinger_handle(session, handle: str, http_prefix: str, try: result = \ get_json(signing_priv_key_pem, session, url, hdr, par, - debug, project_version, http_prefix, from_domain) + debug, mitm_servers, + project_version, http_prefix, from_domain) except BaseException as ex: print('ERROR: webfinger_handle ' + wf_handle + ' ' + str(ex)) return None