diff --git a/daemon.py b/daemon.py index 72a0da08a..4ec5de574 100644 --- a/daemon.py +++ b/daemon.py @@ -1118,7 +1118,7 @@ class PubServer(BaseHTTPRequestHandler): return False if not referer_domain: - if not debug and not self.server.unit_test: + if not (debug and self.server.unit_test): print('mastodon api request has no referer domain ' + str(ua_str)) self._400() diff --git a/languages.py b/languages.py index 1dc2fcb82..621c94c72 100644 --- a/languages.py +++ b/languages.py @@ -7,7 +7,6 @@ __email__ = "bob@libreserver.org" __status__ = "Production" __module_group__ = "Core" -import os import json from urllib import request, parse from utils import get_actor_languages_list @@ -49,22 +48,15 @@ def get_understood_languages(base_dir: str, http_prefix: str, def set_actor_languages(base_dir: str, actor_json: {}, languages_str: str) -> None: - """Sets the languages used by the given actor + """Sets the languages understood by the given actor """ languages_str = languages_str.strip() separator = None - if ',' in languages_str: - separator = ',' - elif '/' in languages_str: - separator = '/' - elif ',' in languages_str: - separator = ',' - elif ';' in languages_str: - separator = ';' - elif '+' in languages_str: - separator = '+' - elif ' ' in languages_str: - separator = ' ' + possible_separators = (',', '/', ';', '+', ' ') + for poss in possible_separators: + if poss in languages_str: + separator = poss + break if separator: lang_list = languages_str.lower().split(separator) else: @@ -72,18 +64,11 @@ def set_actor_languages(base_dir: str, actor_json: {}, lang_list2 = '' for lang in lang_list: lang = lang.strip() - if base_dir: - language_filename = base_dir + '/translations/' + lang + '.json' - if os.path.isfile(language_filename): - if lang_list2: - lang_list2 += ', ' + lang.strip() - else: - lang_list2 += lang.strip() + if lang_list2: + if ' ' + lang not in lang_list2: + lang_list2 += ', ' + lang else: - if lang_list2: - lang_list2 += ', ' + lang.strip() - else: - lang_list2 += lang.strip() + lang_list2 += lang # remove any existing value property_found = None diff --git a/webfinger.py b/webfinger.py index 0393c1140..fa0497513 100644 --- a/webfinger.py +++ b/webfinger.py @@ -78,6 +78,8 @@ def webfinger_handle(session, handle: str, http_prefix: str, wf_domain = remove_domain_port(domain) wf_handle = nickname + '@' + wf_domain + if debug: + print('Parsed webfinger handle: ' + handle + ' -> ' + wf_handle) wfg = get_webfinger_from_cache(wf_handle, cached_webfingers) if wfg: if debug: @@ -95,15 +97,37 @@ def webfinger_handle(session, handle: str, http_prefix: str, get_json(signing_priv_key_pem, session, url, hdr, par, debug, project_version, http_prefix, from_domain) except Exception as ex: - print('ERROR: webfinger_handle ' + str(ex)) + print('ERROR: webfinger_handle ' + wf_handle + ' ' + str(ex)) return None + # if the first attempt fails then try specifying the webfinger + # resource in a different way + if not result: + resource = handle + if handle == wf_handle: + # reconstruct the actor + resource = http_prefix + '://' + wf_domain + '/users/' + nickname + # try again using the actor as the resource + # See https://datatracker.ietf.org/doc/html/rfc7033 section 4.5 + par = { + 'resource': '{}'.format(resource) + } + try: + result = \ + get_json(signing_priv_key_pem, session, url, hdr, par, + debug, project_version, http_prefix, from_domain) + except Exception as ex: + print('ERROR: webfinger_handle ' + wf_handle + ' ' + str(ex)) + return None + if result: store_webfinger_in_cache(wf_handle, result, cached_webfingers) else: if debug: print("WARN: Unable to webfinger " + url + ' ' + 'nickname: ' + str(nickname) + ' ' + + 'handle: ' + str(handle) + ' ' + + 'wf_handle: ' + str(wf_handle) + ' ' + 'domain: ' + str(wf_domain) + ' ' + 'headers: ' + str(hdr) + ' ' + 'params: ' + str(par))