diff --git a/daemon.py b/daemon.py index 54a5b6d51..86d5fb8df 100644 --- a/daemon.py +++ b/daemon.py @@ -7862,21 +7862,33 @@ class PubServer(BaseHTTPRequestHandler): if actor_json.get('alsoKnownAs'): also_known_as = actor_json['alsoKnownAs'] - if curr_session: - check_for_changed_actor(curr_session, - self.server.base_dir, - self.server.http_prefix, - self.server.domain_full, - options_actor, options_profile_url, - self.server.person_cache, 5) - access_keys = self.server.access_keys + nickname = 'instance' if '/users/' in path: nickname = path.split('/users/')[1] if '/' in nickname: nickname = nickname.split('/')[0] if self.server.key_shortcuts.get(nickname): access_keys = self.server.key_shortcuts[nickname] + + if curr_session: + # because this is slow, do it in a separate thread + if self.server.thrCheckActor.get(nickname): + # kill existing thread + self.server.thrCheckActor[nickname].kill() + + self.server.thrCheckActor[nickname] = \ + thread_with_trace(target=check_for_changed_actor, + args=(curr_session, + self.server.base_dir, + self.server.http_prefix, + self.server.domain_full, + options_actor, options_profile_url, + self.server.person_cache, + self.server.check_actor_timeout), + daemon=True) + self.server.thrCheckActor[nickname].start() + msg = \ html_person_options(self.server.default_timeline, self.server.css_cache, @@ -20620,7 +20632,8 @@ def load_tokens(base_dir: str, tokens_dict: {}, tokens_lookup: {}) -> None: break -def run_daemon(crawlers_allowed: [], +def run_daemon(check_actor_timeout: int, + crawlers_allowed: [], dyslexic_font: bool, content_license_url: str, lists_enabled: str, @@ -20786,6 +20799,12 @@ def run_daemon(crawlers_allowed: [], 'Reminder': 'r' } + # timeout used when checking for actor changes when clicking an avatar + # and entering person options screen + if check_actor_timeout < 2: + check_actor_timeout = 2 + httpd.check_actor_timeout = check_actor_timeout + # how many hours after a post was publushed can a reply be made default_reply_interval_hrs = 9999999 httpd.default_reply_interval_hrs = default_reply_interval_hrs @@ -21211,6 +21230,10 @@ def run_daemon(crawlers_allowed: [], # this is the instance actor private key httpd.signing_priv_key_pem = get_instance_actor_key(base_dir, domain) + # threads used for checking for actor changes when clicking on + # avatar icon / person options + httpd.thrCheckActor = {} + if not unit_test: print('THREAD: Creating inbox queue watchdog') httpd.thrWatchdog = \ diff --git a/epicyon.py b/epicyon.py index f8dba4b1f..ea96d7330 100644 --- a/epicyon.py +++ b/epicyon.py @@ -195,6 +195,10 @@ parser.add_argument('--i2p_domain', dest='i2p_domain', type=str, parser.add_argument('-p', '--port', dest='port', type=int, default=None, help='Port number to run on') +parser.add_argument('--check-actor-timeout', dest='check_actor_timeout', + type=int, default=2, + help='Timeout in seconds used for checking is an actor ' + + 'has changed when clicking their avatar image') parser.add_argument('--year', dest='year', type=int, default=search_date.year, help='Year for calendar query') @@ -3425,7 +3429,8 @@ if args.defaultCurrency: if __name__ == "__main__": print('allowdeletion: ' + str(args.allowdeletion)) - run_daemon(crawlers_allowed, + run_daemon(args.check_actor_timeout, + crawlers_allowed, args.dyslexic_font, content_license_url, lists_enabled, diff --git a/tests.py b/tests.py index e7265a21c..3b3490c75 100644 --- a/tests.py +++ b/tests.py @@ -824,8 +824,10 @@ def create_server_alice(path: str, domain: str, port: int, content_license_url = 'https://creativecommons.org/licenses/by/4.0' dyslexic_font = False crawlers_allowed = [] + check_actor_timeout = 2 print('Server running: Alice') - run_daemon(crawlers_allowed, + run_daemon(check_actor_timeout, + crawlers_allowed, dyslexic_font, content_license_url, lists_enabled, default_reply_interval_hrs, @@ -979,8 +981,10 @@ def create_server_bob(path: str, domain: str, port: int, content_license_url = 'https://creativecommons.org/licenses/by/4.0' dyslexic_font = False crawlers_allowed = [] + check_actor_timeout = 2 print('Server running: Bob') - run_daemon(crawlers_allowed, + run_daemon(check_actor_timeout, + crawlers_allowed, dyslexic_font, content_license_url, lists_enabled, default_reply_interval_hrs, @@ -1057,8 +1061,10 @@ def create_server_eve(path: str, domain: str, port: int, federation_list: [], content_license_url = 'https://creativecommons.org/licenses/by/4.0' dyslexic_font = False crawlers_allowed = [] + check_actor_timeout = 2 print('Server running: Eve') - run_daemon(crawlers_allowed, + run_daemon(check_actor_timeout, + crawlers_allowed, dyslexic_font, content_license_url, lists_enabled, default_reply_interval_hrs, @@ -1137,8 +1143,10 @@ def create_server_group(path: str, domain: str, port: int, content_license_url = 'https://creativecommons.org/licenses/by/4.0' dyslexic_font = False crawlers_allowed = [] + check_actor_timeout = 2 print('Server running: Group') - run_daemon(crawlers_allowed, + run_daemon(check_actor_timeout, + crawlers_allowed, dyslexic_font, content_license_url, lists_enabled, default_reply_interval_hrs, @@ -5096,7 +5104,8 @@ def _test_functions(): 'e2e_eremove_device', 'setOrganizationScheme', 'fill_headers', - '_nothing' + '_nothing', + 'check_for_changed_actor' ] exclude_imports = [ 'link', diff --git a/webapp_person_options.py b/webapp_person_options.py index 8b7cb1b25..bf012bd2b 100644 --- a/webapp_person_options.py +++ b/webapp_person_options.py @@ -136,6 +136,7 @@ def html_person_options(default_timeline: str, get_config_param(base_dir, 'instanceTitle') options_str = \ html_header_with_external_style(css_filename, instance_title, None) + options_str += html_keyboard_navigation(text_mode_banner, {}, {}) options_str += '

\n' options_str += '
\n' @@ -196,6 +197,7 @@ def html_person_options(default_timeline: str, other_accounts_html += '

\n' if ctr > 0: options_str += other_accounts_html + if email_address: options_str += \ '

' + translate['Email'] + \ @@ -259,6 +261,7 @@ def html_person_options(default_timeline: str, options_actor + '">\n' options_str += ' \n' + if authorized: if origin_path_str == '/users/' + nickname: if options_nickname: