From 916a1baf3aeef56fd22c2f9846ce48683ac695df Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 30 Jan 2022 10:05:43 +0000 Subject: [PATCH 01/12] debug --- newsdaemon.py | 1 + 1 file changed, 1 insertion(+) diff --git a/newsdaemon.py b/newsdaemon.py index 9397ff5de..4532549c1 100644 --- a/newsdaemon.py +++ b/newsdaemon.py @@ -791,6 +791,7 @@ def run_newswire_daemon(base_dir: str, httpd, newswire_state_filename = base_dir + '/accounts/.newswirestate.json' refresh_filename = base_dir + '/accounts/.refresh_newswire' + print('Starting newswire daemon') # initial sleep to allow the system to start up time.sleep(50) while True: From 220e04283a0d4fe1fa0822a6879344425f4f90ca Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 30 Jan 2022 11:46:40 +0000 Subject: [PATCH 02/12] Shortened youtube url --- webapp_media.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/webapp_media.py b/webapp_media.py index 03cb19faa..6cb1dde8b 100644 --- a/webapp_media.py +++ b/webapp_media.py @@ -65,6 +65,23 @@ def _add_embedded_video_from_sites(translate: {}, content: str, "allowfullscreen>\n\n" return content + video_site = 'https://youtu.be/' + if '"' + video_site in content: + url = content.split('"' + video_site)[1] + if '"' in url: + url = 'embed/' + url.split('"')[0] + if '&' in url: + url = url.split('&')[0] + if '?utm_' in url: + url = url.split('?utm_')[0] + content += \ + "
\n\n
\n" + return content + invidious_sites = ( 'https://invidious.snopyta.org', 'https://yewtu.be', From cda663297377c03b0416866f472552874daea442 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 30 Jan 2022 15:13:00 +0000 Subject: [PATCH 03/12] Ignore self calls to nodeinfo --- daemon.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/daemon.py b/daemon.py index 0dcd6da04..8e0b715bd 100644 --- a/daemon.py +++ b/daemon.py @@ -1134,6 +1134,9 @@ class PubServer(BaseHTTPRequestHandler): def _nodeinfo(self, ua_str: str, calling_domain: str) -> bool: if not self.path.startswith('/nodeinfo/2.0'): return False + if calling_domain == self.server.domain_full: + self._404() + return True if self.server.debug: print('DEBUG: nodeinfo ' + self.path) self._update_known_crawlers(ua_str) From 152babab4ce6529d59e3678cab0c33f79cc8e756 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 30 Jan 2022 16:19:07 +0000 Subject: [PATCH 04/12] Check that nodeinfo request comes from a real website --- daemon.py | 24 ++++++++++++++++++++++-- posts.py | 7 +++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/daemon.py b/daemon.py index 8e0b715bd..8cb9cc354 100644 --- a/daemon.py +++ b/daemon.py @@ -365,6 +365,7 @@ from fitnessFunctions import fitness_performance from fitnessFunctions import fitness_thread from fitnessFunctions import sorted_watch_points from fitnessFunctions import html_watch_points_graph +from siteactive import site_is_active import os @@ -1131,12 +1132,26 @@ class PubServer(BaseHTTPRequestHandler): project_version, custom_emoji, show_node_info_accounts) - def _nodeinfo(self, ua_str: str, calling_domain: str) -> bool: + def _nodeinfo(self, ua_str: str, calling_domain: str, + httpPrefix: str, calling_site_timeout: int, + debug: bool) -> bool: if not self.path.startswith('/nodeinfo/2.0'): return False if calling_domain == self.server.domain_full: self._404() return True + if self.server.nodeinfo_is_active: + print('nodeinfo is busy') + self._404() + return True + self.server.nodeinfo_is_active = True + # is this a real website making the call ? + if not debug: + if not site_is_active(httpPrefix + '://' + calling_domain, + calling_site_timeout): + self._404() + self.server.nodeinfo_is_active = False + return True if self.server.debug: print('DEBUG: nodeinfo ' + self.path) self._update_known_crawlers(ua_str) @@ -1179,8 +1194,10 @@ class PubServer(BaseHTTPRequestHandler): None, calling_domain, True) self._write(msg) print('nodeinfo sent to ' + calling_domain) + self.server.nodeinfo_is_active = False return True self._404() + self.server.nodeinfo_is_active = False return True def _webfinger(self, calling_domain: str) -> bool: @@ -13510,7 +13527,8 @@ class PubServer(BaseHTTPRequestHandler): # Since fediverse crawlers are quite active, # make returning info to them high priority # get nodeinfo endpoint - if self._nodeinfo(ua_str, calling_domain): + if self._nodeinfo(ua_str, calling_domain, + self.server.http_prefix, 5, self.server.debug): return fitness_performance(getreq_start_time, self.server.fitness, @@ -18813,6 +18831,8 @@ def run_daemon(dyslexic_font: bool, httpd.post_to_nickname = None + httpd.nodeinfo_is_active = False + httpd.dyslexic_font = dyslexic_font # license for content of the instance diff --git a/posts.py b/posts.py index 781134d44..a39c0cd4d 100644 --- a/posts.py +++ b/posts.py @@ -2427,7 +2427,8 @@ def send_post(signing_priv_key_pem: str, project_version: str, generate_json_signature(signed_post_json_object, private_key_pem) post_json_object = signed_post_json_object except Exception as ex: - print('WARN: failed to JSON-LD sign post, ' + str(ex)) + print('WARN: send_post failed to JSON-LD sign post, ' + str(ex)) + pprint(signed_post_json_object) # convert json to string so that there are no # subsequent conversions after creating message body digest @@ -2806,7 +2807,9 @@ def send_signed_json(post_json_object: {}, session, base_dir: str, generate_json_signature(signed_post_json_object, private_key_pem) post_json_object = signed_post_json_object except BaseException as ex: - print('WARN: failed to JSON-LD sign post, ' + str(ex)) + print('WARN: send_signed_json failed to JSON-LD sign post, ' + + str(ex)) + pprint(signed_post_json_object) # convert json to string so that there are no # subsequent conversions after creating message body digest From ee49df680563f84b1be4177d2b23f89ded63616d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 30 Jan 2022 16:25:47 +0000 Subject: [PATCH 05/12] Don't send with summaryMap, since this breaks json-ld signatures --- posts.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/posts.py b/posts.py index a39c0cd4d..05646fd31 100644 --- a/posts.py +++ b/posts.py @@ -1122,9 +1122,6 @@ def _create_post_s2s(base_dir: str, nickname: str, domain: str, port: int, 'conversation': conversation_id, 'type': post_object_type, 'summary': summary, - 'summaryMap': { - system_language: summary - }, 'inReplyTo': in_reply_to, 'published': published, 'url': new_post_url, @@ -1191,9 +1188,6 @@ def _create_post_c2s(base_dir: str, nickname: str, domain: str, port: int, 'conversation': conversation_id, 'type': post_object_type, 'summary': summary, - 'summaryMap': { - system_language: summary - }, 'inReplyTo': in_reply_to, 'published': published, 'url': new_post_url, @@ -1728,9 +1722,6 @@ def get_pinned_post_as_json(base_dir: str, http_prefix: str, 'replies': {}, 'sensitive': False, 'summary': None, - 'summaryMap': { - system_language: None - }, 'tag': [], 'to': ['https://www.w3.org/ns/activitystreams#Public'], 'type': 'Note', From 10696e12c1451c2d349a954a45bd2cd83aeb8f49 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 30 Jan 2022 17:21:28 +0000 Subject: [PATCH 06/12] Extra checks for nodeinfo calling domain --- daemon.py | 28 +++++++++++++++++++++++++--- utils.py | 4 ++-- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/daemon.py b/daemon.py index 8cb9cc354..4924532e3 100644 --- a/daemon.py +++ b/daemon.py @@ -245,6 +245,7 @@ from languages import set_actor_languages from languages import get_understood_languages from like import update_likes_collection from reaction import update_reaction_collection +from utils import local_network_host from utils import undo_reaction_collection_entry from utils import get_new_post_endpoints from utils import has_actor @@ -1135,6 +1136,9 @@ class PubServer(BaseHTTPRequestHandler): def _nodeinfo(self, ua_str: str, calling_domain: str, httpPrefix: str, calling_site_timeout: int, debug: bool) -> bool: + if self.path.startswith('/nodeinfo/1.0'): + self._400() + return True if not self.path.startswith('/nodeinfo/2.0'): return False if calling_domain == self.server.domain_full: @@ -1142,14 +1146,32 @@ class PubServer(BaseHTTPRequestHandler): return True if self.server.nodeinfo_is_active: print('nodeinfo is busy') - self._404() + self._503() return True self.server.nodeinfo_is_active = True # is this a real website making the call ? - if not debug: + if not debug and not self.server.unit_test: + # Does calling_domain look like a domain? + if ' ' in calling_domain or \ + ';' in calling_domain or \ + '.' not in calling_domain: + print('nodeinfo calling domain does not look like a domain ' + + calling_domain) + self._400() + self.server.nodeinfo_is_active = False + return True + if not self.server.allow_local_network_access: + if local_network_host(calling_domain): + print('nodeinfo calling domain is from the ' + + 'local network ' + calling_domain) + self._400() + self.server.nodeinfo_is_active = False + return True if not site_is_active(httpPrefix + '://' + calling_domain, calling_site_timeout): - self._404() + print('nodeinfo calling domain is not active ' + + calling_domain) + self._400() self.server.nodeinfo_is_active = False return True if self.server.debug: diff --git a/utils.py b/utils.py index 702a6e892..5f89e315c 100644 --- a/utils.py +++ b/utils.py @@ -179,7 +179,7 @@ def get_sha_512(msg: str): return digest.finalize() -def _local_network_host(host: str) -> bool: +def local_network_host(host: str) -> bool: """Returns true if the given host is on the local network """ if host.startswith('localhost') or \ @@ -196,7 +196,7 @@ def decoded_host(host: str) -> str: """ if ':' not in host: # eg. mydomain:8000 - if not _local_network_host(host): + if not local_network_host(host): if not host.endswith('.onion'): if not host.endswith('.i2p'): return idna.decode(host) From a11ab2a5b545d5785a925d078b0d6c029d0151b2 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 30 Jan 2022 17:54:54 +0000 Subject: [PATCH 07/12] xmpp emoji --- emoji/default_emoji.json | 4 +++- emoji/xmpp.png | Bin 0 -> 15241 bytes 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 emoji/xmpp.png diff --git a/emoji/default_emoji.json b/emoji/default_emoji.json index 85a1c07d4..3db25deea 100644 --- a/emoji/default_emoji.json +++ b/emoji/default_emoji.json @@ -773,5 +773,7 @@ "kde": "kde", "ohno": "ohno", "lavabit": "lavabit", - "libreoffice": "libreoffice" + "libreoffice": "libreoffice", + "xmpp": "xmpp", + "jabber": "xmpp", } diff --git a/emoji/xmpp.png b/emoji/xmpp.png new file mode 100644 index 0000000000000000000000000000000000000000..a1d7364dccb4e9e7cd5f819e18aec5421996941e GIT binary patch literal 15241 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 literal 0 HcmV?d00001 From 7adcb33d61d6f708c0216f8966b87f0826453f46 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 30 Jan 2022 18:03:55 +0000 Subject: [PATCH 08/12] Handle emoji combine errors --- content.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/content.py b/content.py index 40b380487..4448d0d5d 100644 --- a/content.py +++ b/content.py @@ -939,7 +939,10 @@ def add_html_tags(base_dir: str, http_prefix: str, custom_emoji_dict = \ load_json(base_dir + '/emojicustom/emoji.json') if custom_emoji_dict: - emoji_dict = dict(emoji_dict, **custom_emoji_dict) + try: + emoji_dict = dict(emoji_dict, **custom_emoji_dict) + except BaseException: + pass # print('TAG: looking up emoji for :' + word_str2 + ':') _add_emoji(base_dir, ':' + word_str2 + ':', http_prefix, From f896bef6c6deca50414bf2eb725709463ce7f7ce Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 30 Jan 2022 18:07:20 +0000 Subject: [PATCH 09/12] Combine emoji sets one by one --- content.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/content.py b/content.py index 4448d0d5d..7faad7783 100644 --- a/content.py +++ b/content.py @@ -939,10 +939,17 @@ def add_html_tags(base_dir: str, http_prefix: str, custom_emoji_dict = \ load_json(base_dir + '/emojicustom/emoji.json') if custom_emoji_dict: + emojis_combined = True try: emoji_dict = dict(emoji_dict, **custom_emoji_dict) except BaseException: - pass + emojis_combined = False + if not emojis_combined: + # combine emoji dicts one by one + for emoji_name, emoji_item in \ + custom_emoji_dict.items(): + if not emoji_dict.get(emoji_name): + emoji_dict[emoji_name] = emoji_item # print('TAG: looking up emoji for :' + word_str2 + ':') _add_emoji(base_dir, ':' + word_str2 + ':', http_prefix, From d179b1749a59acdd4fe424712eba582f1fe9ac34 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 30 Jan 2022 18:08:37 +0000 Subject: [PATCH 10/12] Combine emoji sets one by one --- content.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/content.py b/content.py index 7faad7783..405d17291 100644 --- a/content.py +++ b/content.py @@ -946,10 +946,9 @@ def add_html_tags(base_dir: str, http_prefix: str, emojis_combined = False if not emojis_combined: # combine emoji dicts one by one - for emoji_name, emoji_item in \ - custom_emoji_dict.items(): - if not emoji_dict.get(emoji_name): - emoji_dict[emoji_name] = emoji_item + for ename, eitem in custom_emoji_dict.items(): + if not emoji_dict.get(ename): + emoji_dict[ename] = eitem # print('TAG: looking up emoji for :' + word_str2 + ':') _add_emoji(base_dir, ':' + word_str2 + ':', http_prefix, From 42e53b5cefdc81032ca86ff52920489caa7d9663 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 30 Jan 2022 18:13:02 +0000 Subject: [PATCH 11/12] Extra comma --- content.py | 5 +++-- emoji/default_emoji.json | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/content.py b/content.py index 405d17291..fbc3101f0 100644 --- a/content.py +++ b/content.py @@ -947,8 +947,9 @@ def add_html_tags(base_dir: str, http_prefix: str, if not emojis_combined: # combine emoji dicts one by one for ename, eitem in custom_emoji_dict.items(): - if not emoji_dict.get(ename): - emoji_dict[ename] = eitem + if ename and eitem: + if not emoji_dict.get(ename): + emoji_dict[ename] = eitem # print('TAG: looking up emoji for :' + word_str2 + ':') _add_emoji(base_dir, ':' + word_str2 + ':', http_prefix, diff --git a/emoji/default_emoji.json b/emoji/default_emoji.json index 3db25deea..9968dcbce 100644 --- a/emoji/default_emoji.json +++ b/emoji/default_emoji.json @@ -775,5 +775,5 @@ "lavabit": "lavabit", "libreoffice": "libreoffice", "xmpp": "xmpp", - "jabber": "xmpp", + "jabber": "xmpp" } From d67e602b5514b1a5bc769dbddbf360918bf7216f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 30 Jan 2022 18:54:26 +0000 Subject: [PATCH 12/12] Switch http code --- daemon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index 4924532e3..83cde0893 100644 --- a/daemon.py +++ b/daemon.py @@ -1142,7 +1142,7 @@ class PubServer(BaseHTTPRequestHandler): if not self.path.startswith('/nodeinfo/2.0'): return False if calling_domain == self.server.domain_full: - self._404() + self._400() return True if self.server.nodeinfo_is_active: print('nodeinfo is busy')