mirror of https://gitlab.com/bashrc2/epicyon
				
				
				
			Merge branch 'main' of gitlab.com:bashrc2/epicyon
						commit
						c869ccfad8
					
				|  | @ -76,7 +76,9 @@ def create_reject(base_dir: str, federation_list: [], | |||
| 
 | ||||
| 
 | ||||
| def _accept_follow(base_dir: str, domain: str, message_json: {}, | ||||
|                    federation_list: [], debug: bool) -> None: | ||||
|                    federation_list: [], debug: bool, | ||||
|                    curr_domain: str, | ||||
|                    onion_domain: str, i2p_domain: str) -> None: | ||||
|     """Receiving a follow Accept activity | ||||
|     """ | ||||
|     if not has_object_stringType(message_json, debug): | ||||
|  | @ -144,6 +146,16 @@ def _accept_follow(base_dir: str, domain: str, message_json: {}, | |||
|               followed_actor) | ||||
|         return | ||||
| 
 | ||||
|     # convert from onion/i2p to clearnet accepted domain | ||||
|     if onion_domain: | ||||
|         if accepted_domain.endswith('.onion') and \ | ||||
|            not curr_domain.endswith('.onion'): | ||||
|             accepted_domain = curr_domain | ||||
|     if i2p_domain: | ||||
|         if accepted_domain.endswith('.i2p') and \ | ||||
|            not curr_domain.endswith('.i2p'): | ||||
|             accepted_domain = curr_domain | ||||
| 
 | ||||
|     accepted_domain_full = accepted_domain | ||||
|     if accepted_port: | ||||
|         accepted_domain_full = accepted_domain + ':' + str(accepted_port) | ||||
|  | @ -189,7 +201,9 @@ def receive_accept_reject(session, base_dir: str, | |||
|                           cached_webfingers: {}, | ||||
|                           person_cache: {}, message_json: {}, | ||||
|                           federation_list: [], | ||||
|                           debug: bool) -> bool: | ||||
|                           debug: bool, | ||||
|                           curr_domain: str, | ||||
|                           onion_domain: str, i2p_domain: str) -> bool: | ||||
|     """Receives an Accept or Reject within the POST section of HTTPServer | ||||
|     """ | ||||
|     if message_json['type'] != 'Accept' and message_json['type'] != 'Reject': | ||||
|  | @ -215,7 +229,8 @@ def receive_accept_reject(session, base_dir: str, | |||
|                   ' does not contain a nickname. ' + | ||||
|                   'Assuming single user instance.') | ||||
|     # receive follow accept | ||||
|     _accept_follow(base_dir, domain, message_json, federation_list, debug) | ||||
|     _accept_follow(base_dir, domain, message_json, federation_list, debug, | ||||
|                    curr_domain, onion_domain, i2p_domain) | ||||
|     if debug: | ||||
|         print('DEBUG: Uh, ' + message_json['type'] + ', I guess') | ||||
|     return True | ||||
|  |  | |||
							
								
								
									
										14
									
								
								announce.py
								
								
								
								
							
							
						
						
									
										14
									
								
								announce.py
								
								
								
								
							|  | @ -141,7 +141,9 @@ def create_announce(session, base_dir: str, federation_list: [], | |||
|                     send_threads: [], postLog: [], | ||||
|                     person_cache: {}, cached_webfingers: {}, | ||||
|                     debug: bool, project_version: str, | ||||
|                     signing_priv_key_pem: str) -> {}: | ||||
|                     signing_priv_key_pem: str, | ||||
|                     curr_domain: str, | ||||
|                     onion_domain: str, i2p_domain: str) -> {}: | ||||
|     """Creates an announce message | ||||
|     Typically to_url will be https://www.w3.org/ns/activitystreams#Public | ||||
|     and ccUrl might be a specific person favorited or repeated and the | ||||
|  | @ -202,7 +204,8 @@ def create_announce(session, base_dir: str, federation_list: [], | |||
|                          send_threads, postLog, cached_webfingers, | ||||
|                          person_cache, | ||||
|                          debug, project_version, None, group_account, | ||||
|                          signing_priv_key_pem, 639633) | ||||
|                          signing_priv_key_pem, 639633, | ||||
|                          curr_domain, onion_domain, i2p_domain) | ||||
| 
 | ||||
|     return new_announce | ||||
| 
 | ||||
|  | @ -213,7 +216,9 @@ def announce_public(session, base_dir: str, federation_list: [], | |||
|                     send_threads: [], postLog: [], | ||||
|                     person_cache: {}, cached_webfingers: {}, | ||||
|                     debug: bool, project_version: str, | ||||
|                     signing_priv_key_pem: str) -> {}: | ||||
|                     signing_priv_key_pem: str, | ||||
|                     curr_domain: str, | ||||
|                     onion_domain: str, i2p_domain: str) -> {}: | ||||
|     """Makes a public announcement | ||||
|     """ | ||||
|     from_domain = get_full_domain(domain, port) | ||||
|  | @ -227,7 +232,8 @@ def announce_public(session, base_dir: str, federation_list: [], | |||
|                            send_threads, postLog, | ||||
|                            person_cache, cached_webfingers, | ||||
|                            debug, project_version, | ||||
|                            signing_priv_key_pem) | ||||
|                            signing_priv_key_pem, curr_domain, | ||||
|                            onion_domain, i2p_domain) | ||||
| 
 | ||||
| 
 | ||||
| def send_announce_via_server(base_dir: str, session, | ||||
|  |  | |||
							
								
								
									
										79
									
								
								daemon.py
								
								
								
								
							
							
						
						
									
										79
									
								
								daemon.py
								
								
								
								
							|  | @ -1479,7 +1479,9 @@ class PubServer(BaseHTTPRequestHandler): | |||
|                   str(self.server.base_dir)) | ||||
|         wf_result = \ | ||||
|             webfinger_lookup(self.path, self.server.base_dir, | ||||
|                              self.server.domain, self.server.onion_domain, | ||||
|                              self.server.domain, | ||||
|                              self.server.onion_domain, | ||||
|                              self.server.i2p_domain, | ||||
|                              self.server.port, self.server.debug) | ||||
|         if wf_result: | ||||
|             msg_str = json.dumps(wf_result) | ||||
|  | @ -1605,6 +1607,7 @@ class PubServer(BaseHTTPRequestHandler): | |||
|         print('Creating outbox thread ' + | ||||
|               account_outbox_thread_name + '/' + | ||||
|               str(self.server.outbox_thread_index[account_outbox_thread_name])) | ||||
|         print('THREAD: _post_to_outbox') | ||||
|         self.server.outboxThread[account_outbox_thread_name][index] = \ | ||||
|             thread_with_trace(target=self._post_to_outbox, | ||||
|                               args=(message_json.copy(), | ||||
|  | @ -3374,18 +3377,30 @@ class PubServer(BaseHTTPRequestHandler): | |||
|                 curr_domain = domain | ||||
|                 curr_port = port | ||||
|                 curr_http_prefix = http_prefix | ||||
|                 curr_proxy_type = proxy_type | ||||
|                 if onion_domain: | ||||
|                     if following_domain.endswith('.onion'): | ||||
|                     if not curr_domain.endswith('.onion') and \ | ||||
|                        following_domain.endswith('.onion'): | ||||
|                         curr_session = self.server.session_onion | ||||
|                         curr_domain = onion_domain | ||||
|                         curr_port = 80 | ||||
|                         following_port = 80 | ||||
|                         curr_http_prefix = 'http' | ||||
|                         curr_proxy_type = 'tor' | ||||
|                 if i2p_domain: | ||||
|                     if following_domain.endswith('.i2p'): | ||||
|                     if not curr_domain.endswith('.i2p') and \ | ||||
|                        following_domain.endswith('.i2p'): | ||||
|                         curr_session = self.server.session_i2p | ||||
|                         curr_domain = i2p_domain | ||||
|                         curr_port = 80 | ||||
|                         following_port = 80 | ||||
|                         curr_http_prefix = 'http' | ||||
|                         curr_proxy_type = 'i2p' | ||||
| 
 | ||||
|                 curr_session = \ | ||||
|                     self._establish_session("follow request", | ||||
|                                             curr_session, | ||||
|                                             curr_proxy_type) | ||||
| 
 | ||||
|                 send_follow_request(curr_session, | ||||
|                                     base_dir, follower_nickname, | ||||
|  | @ -3401,7 +3416,10 @@ class PubServer(BaseHTTPRequestHandler): | |||
|                                     self.server.cached_webfingers, | ||||
|                                     self.server.person_cache, debug, | ||||
|                                     self.server.project_version, | ||||
|                                     self.server.signing_priv_key_pem) | ||||
|                                     self.server.signing_priv_key_pem, | ||||
|                                     self.server.domain, | ||||
|                                     self.server.onion_domain, | ||||
|                                     self.server.i2p_domain) | ||||
|         if calling_domain.endswith('.onion') and onion_domain: | ||||
|             origin_path_str = 'http://' + onion_domain + users_path | ||||
|         elif (calling_domain.endswith('.i2p') and i2p_domain): | ||||
|  | @ -8295,7 +8313,10 @@ class PubServer(BaseHTTPRequestHandler): | |||
|                             self.server.cached_webfingers, | ||||
|                             debug, | ||||
|                             self.server.project_version, | ||||
|                             self.server.signing_priv_key_pem) | ||||
|                             self.server.signing_priv_key_pem, | ||||
|                             self.server.domain, | ||||
|                             self.server.onion_domain, | ||||
|                             self.server.i2p_domain) | ||||
|         announce_filename = None | ||||
|         if announce_json: | ||||
|             # save the announce straight to the outbox | ||||
|  | @ -8519,25 +8540,28 @@ class PubServer(BaseHTTPRequestHandler): | |||
|                 handle_nickname + '@' + \ | ||||
|                 get_full_domain(handle_domain, handle_port) | ||||
|         if '@' in following_handle: | ||||
| 
 | ||||
|             if self.server.onion_domain: | ||||
|                 if following_handle.endswith('.onion'): | ||||
|                     curr_session = self.server.session_onion | ||||
|                     proxy_type = 'tor' | ||||
|                     port = 80 | ||||
|             if self.server.i2p_domain: | ||||
|                 if following_handle.endswith('.i2p'): | ||||
|                     curr_session = self.server.session_i2p | ||||
|                     proxy_type = 'i2p' | ||||
|                     port = 80 | ||||
| 
 | ||||
|             curr_session = \ | ||||
|                 self._establish_session("followApproveButton", | ||||
|                 self._establish_session("follow_approve_button", | ||||
|                                         curr_session, proxy_type) | ||||
|             if not curr_session: | ||||
|                 print('WARN: unable to establish session ' + | ||||
|                       'when approving follow request') | ||||
|                 self._404() | ||||
|                 return | ||||
|             signing_priv_key_pem = \ | ||||
|                 self.server.signing_priv_key_pem | ||||
|             manual_approve_follow_request_thread(curr_session, | ||||
|             manual_approve_follow_request_thread(self.server.session, | ||||
|                                                  self.server.session_onion, | ||||
|                                                  self.server.session_i2p, | ||||
|                                                  self.server.onion_domain, | ||||
|  | @ -8553,7 +8577,8 @@ class PubServer(BaseHTTPRequestHandler): | |||
|                                                  self.server.person_cache, | ||||
|                                                  debug, | ||||
|                                                  self.server.project_version, | ||||
|                                                  signing_priv_key_pem) | ||||
|                                                  signing_priv_key_pem, | ||||
|                                                  proxy_type) | ||||
|         origin_path_str_absolute = \ | ||||
|             http_prefix + '://' + domain_full + origin_path_str | ||||
|         if calling_domain.endswith('.onion') and onion_domain: | ||||
|  | @ -8701,7 +8726,7 @@ class PubServer(BaseHTTPRequestHandler): | |||
|                 handle_nickname + '@' + \ | ||||
|                 get_full_domain(handle_domain, handle_port) | ||||
|         if '@' in following_handle: | ||||
|             manual_deny_follow_request_thread(curr_session, | ||||
|             manual_deny_follow_request_thread(self.server.session, | ||||
|                                               self.server.session_onion, | ||||
|                                               self.server.session_i2p, | ||||
|                                               self.server.onion_domain, | ||||
|  | @ -20184,7 +20209,7 @@ def run_shares_expire(version_number: str, base_dir: str) -> None: | |||
| def run_posts_watchdog(project_version: str, httpd) -> None: | ||||
|     """This tries to keep the posts thread running even if it dies | ||||
|     """ | ||||
|     print('Starting posts queue watchdog') | ||||
|     print('THREAD: Starting posts queue watchdog') | ||||
|     posts_queue_original = httpd.thrPostsQueue.clone(run_posts_queue) | ||||
|     httpd.thrPostsQueue.start() | ||||
|     while True: | ||||
|  | @ -20192,6 +20217,7 @@ def run_posts_watchdog(project_version: str, httpd) -> None: | |||
|         if httpd.thrPostsQueue.is_alive(): | ||||
|             continue | ||||
|         httpd.thrPostsQueue.kill() | ||||
|         print('THREAD: restarting posts queue') | ||||
|         httpd.thrPostsQueue = posts_queue_original.clone(run_posts_queue) | ||||
|         httpd.thrPostsQueue.start() | ||||
|         print('Restarting posts queue...') | ||||
|  | @ -20200,7 +20226,7 @@ def run_posts_watchdog(project_version: str, httpd) -> None: | |||
| def run_shares_expire_watchdog(project_version: str, httpd) -> None: | ||||
|     """This tries to keep the shares expiry thread running even if it dies | ||||
|     """ | ||||
|     print('Starting shares expiry watchdog') | ||||
|     print('THREAD: Starting shares expiry watchdog') | ||||
|     shares_expire_original = httpd.thrSharesExpire.clone(run_shares_expire) | ||||
|     httpd.thrSharesExpire.start() | ||||
|     while True: | ||||
|  | @ -20208,6 +20234,7 @@ def run_shares_expire_watchdog(project_version: str, httpd) -> None: | |||
|         if httpd.thrSharesExpire.is_alive(): | ||||
|             continue | ||||
|         httpd.thrSharesExpire.kill() | ||||
|         print('THREAD: restarting shares watchdog') | ||||
|         httpd.thrSharesExpire = shares_expire_original.clone(run_shares_expire) | ||||
|         httpd.thrSharesExpire.start() | ||||
|         print('Restarting shares expiry...') | ||||
|  | @ -20688,13 +20715,13 @@ def run_daemon(crawlers_allowed: [], | |||
|         print('Creating shared item files directory') | ||||
|         os.mkdir(base_dir + '/sharefiles') | ||||
| 
 | ||||
|     print('Creating fitness thread') | ||||
|     print('THREAD: Creating fitness thread') | ||||
|     httpd.thrFitness = \ | ||||
|         thread_with_trace(target=fitness_thread, | ||||
|                           args=(base_dir, httpd.fitness), daemon=True) | ||||
|     httpd.thrFitness.start() | ||||
| 
 | ||||
|     print('Creating cache expiry thread') | ||||
|     print('THREAD: Creating cache expiry thread') | ||||
|     httpd.thrCache = \ | ||||
|         thread_with_trace(target=expire_cache, | ||||
|                           args=(base_dir, httpd.person_cache, | ||||
|  | @ -20706,12 +20733,13 @@ def run_daemon(crawlers_allowed: [], | |||
|     # number of mins after which sending posts or updates will expire | ||||
|     httpd.send_threads_timeout_mins = send_threads_timeout_mins | ||||
| 
 | ||||
|     print('Creating posts queue') | ||||
|     print('THREAD: Creating posts queue') | ||||
|     httpd.thrPostsQueue = \ | ||||
|         thread_with_trace(target=run_posts_queue, | ||||
|                           args=(base_dir, httpd.send_threads, debug, | ||||
|                                 httpd.send_threads_timeout_mins), daemon=True) | ||||
|     if not unit_test: | ||||
|         print('THREAD: run_posts_watchdog') | ||||
|         httpd.thrPostsWatchdog = \ | ||||
|             thread_with_trace(target=run_posts_watchdog, | ||||
|                               args=(project_version, httpd), daemon=True) | ||||
|  | @ -20719,11 +20747,12 @@ def run_daemon(crawlers_allowed: [], | |||
|     else: | ||||
|         httpd.thrPostsQueue.start() | ||||
| 
 | ||||
|     print('Creating expire thread for shared items') | ||||
|     print('THREAD: Creating expire thread for shared items') | ||||
|     httpd.thrSharesExpire = \ | ||||
|         thread_with_trace(target=run_shares_expire, | ||||
|                           args=(project_version, base_dir), daemon=True) | ||||
|     if not unit_test: | ||||
|         print('THREAD: run_shares_expire_watchdog') | ||||
|         httpd.thrSharesExpireWatchdog = \ | ||||
|             thread_with_trace(target=run_shares_expire_watchdog, | ||||
|                               args=(project_version, httpd), daemon=True) | ||||
|  | @ -20752,10 +20781,10 @@ def run_daemon(crawlers_allowed: [], | |||
| 
 | ||||
|     create_initial_last_seen(base_dir, http_prefix) | ||||
| 
 | ||||
|     print('Creating inbox queue') | ||||
|     print('THREAD: Creating inbox queue') | ||||
|     httpd.thrInboxQueue = \ | ||||
|         thread_with_trace(target=run_inbox_queue, | ||||
|                           args=(httpd.recent_posts_cache, | ||||
|                           args=(httpd, httpd.recent_posts_cache, | ||||
|                                 httpd.max_recent_posts, | ||||
|                                 project_version, | ||||
|                                 base_dir, http_prefix, httpd.send_threads, | ||||
|  | @ -20784,19 +20813,19 @@ def run_daemon(crawlers_allowed: [], | |||
|                                 httpd.default_reply_interval_hrs, | ||||
|                                 httpd.cw_lists), daemon=True) | ||||
| 
 | ||||
|     print('Creating scheduled post thread') | ||||
|     print('THREAD: Creating scheduled post thread') | ||||
|     httpd.thrPostSchedule = \ | ||||
|         thread_with_trace(target=run_post_schedule, | ||||
|                           args=(base_dir, httpd, 20), daemon=True) | ||||
| 
 | ||||
|     print('Creating newswire thread') | ||||
|     print('THREAD: Creating newswire thread') | ||||
|     httpd.thrNewswireDaemon = \ | ||||
|         thread_with_trace(target=run_newswire_daemon, | ||||
|                           args=(base_dir, httpd, | ||||
|                                 http_prefix, domain, port, | ||||
|                                 httpd.translate), daemon=True) | ||||
| 
 | ||||
|     print('Creating federated shares thread') | ||||
|     print('THREAD: Creating federated shares thread') | ||||
|     httpd.thrFederatedSharesDaemon = \ | ||||
|         thread_with_trace(target=run_federated_shares_daemon, | ||||
|                           args=(base_dir, httpd, | ||||
|  | @ -20818,25 +20847,25 @@ def run_daemon(crawlers_allowed: [], | |||
|     httpd.signing_priv_key_pem = get_instance_actor_key(base_dir, domain) | ||||
| 
 | ||||
|     if not unit_test: | ||||
|         print('Creating inbox queue watchdog') | ||||
|         print('THREAD: Creating inbox queue watchdog') | ||||
|         httpd.thrWatchdog = \ | ||||
|             thread_with_trace(target=run_inbox_queue_watchdog, | ||||
|                               args=(project_version, httpd), daemon=True) | ||||
|         httpd.thrWatchdog.start() | ||||
| 
 | ||||
|         print('Creating scheduled post watchdog') | ||||
|         print('THREAD: Creating scheduled post watchdog') | ||||
|         httpd.thrWatchdogSchedule = \ | ||||
|             thread_with_trace(target=run_post_schedule_watchdog, | ||||
|                               args=(project_version, httpd), daemon=True) | ||||
|         httpd.thrWatchdogSchedule.start() | ||||
| 
 | ||||
|         print('Creating newswire watchdog') | ||||
|         print('THREAD: Creating newswire watchdog') | ||||
|         httpd.thrNewswireWatchdog = \ | ||||
|             thread_with_trace(target=run_newswire_watchdog, | ||||
|                               args=(project_version, httpd), daemon=True) | ||||
|         httpd.thrNewswireWatchdog.start() | ||||
| 
 | ||||
|         print('Creating federated shares watchdog') | ||||
|         print('THREAD: Creating federated shares watchdog') | ||||
|         httpd.thrFederatedSharesWatchdog = \ | ||||
|             thread_with_trace(target=run_federated_shares_watchdog, | ||||
|                               args=(project_version, httpd), daemon=True) | ||||
|  |  | |||
|  | @ -38,7 +38,7 @@ from follow import deny_follow_request_via_server | |||
| from follow import get_follow_requests_via_server | ||||
| from follow import get_following_via_server | ||||
| from follow import get_followers_via_server | ||||
| from follow import send_follow_requestViaServer | ||||
| from follow import send_follow_request_via_server | ||||
| from follow import send_unfollow_request_via_server | ||||
| from posts import send_block_via_server | ||||
| from posts import send_undo_block_via_server | ||||
|  | @ -2265,18 +2265,18 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str, | |||
|                         _say_command(say_str, say_str, | ||||
|                                      screenreader, system_language, espeak) | ||||
|                         session_follow = create_session(proxy_type) | ||||
|                         send_follow_requestViaServer(base_dir, | ||||
|                                                      session_follow, | ||||
|                                                      nickname, password, | ||||
|                                                      domain, port, | ||||
|                                                      follow_nickname, | ||||
|                                                      follow_domain, | ||||
|                                                      follow_port, | ||||
|                                                      http_prefix, | ||||
|                                                      cached_webfingers, | ||||
|                                                      person_cache, | ||||
|                                                      debug, __version__, | ||||
|                                                      signing_priv_key_pem) | ||||
|                         send_follow_request_via_server(base_dir, | ||||
|                                                        session_follow, | ||||
|                                                        nickname, password, | ||||
|                                                        domain, port, | ||||
|                                                        follow_nickname, | ||||
|                                                        follow_domain, | ||||
|                                                        follow_port, | ||||
|                                                        http_prefix, | ||||
|                                                        cached_webfingers, | ||||
|                                                        person_cache, | ||||
|                                                        debug, __version__, | ||||
|                                                        signing_priv_key_pem) | ||||
|                     else: | ||||
|                         if follow_handle: | ||||
|                             say_str = follow_handle + ' is not valid' | ||||
|  |  | |||
							
								
								
									
										18
									
								
								epicyon.py
								
								
								
								
							
							
						
						
									
										18
									
								
								epicyon.py
								
								
								
								
							|  | @ -56,7 +56,7 @@ from follow import get_following_via_server | |||
| from follow import get_followers_via_server | ||||
| from follow import clear_follows | ||||
| from follow import add_follower_of_person | ||||
| from follow import send_follow_requestViaServer | ||||
| from follow import send_follow_request_via_server | ||||
| from follow import send_unfollow_request_via_server | ||||
| from tests import test_shared_items_federation | ||||
| from tests import test_group_follow | ||||
|  | @ -1293,7 +1293,7 @@ if args.approve: | |||
|                                   send_threads, postLog, | ||||
|                                   cached_webfingers, person_cache, | ||||
|                                   debug, __version__, | ||||
|                                   signing_priv_key_pem) | ||||
|                                   signing_priv_key_pem, proxy_type) | ||||
|     sys.exit() | ||||
| 
 | ||||
| if args.deny: | ||||
|  | @ -2067,13 +2067,13 @@ if args.follow: | |||
|     if args.secure_mode: | ||||
|         signing_priv_key_pem = get_instance_actor_key(base_dir, domain) | ||||
| 
 | ||||
|     send_follow_requestViaServer(base_dir, session, | ||||
|                                  args.nickname, args.password, | ||||
|                                  domain, port, | ||||
|                                  follow_nickname, follow_domain, follow_port, | ||||
|                                  follow_http_prefix, | ||||
|                                  cached_webfingers, person_cache, | ||||
|                                  debug, __version__, signing_priv_key_pem) | ||||
|     send_follow_request_via_server(base_dir, session, | ||||
|                                    args.nickname, args.password, | ||||
|                                    domain, port, | ||||
|                                    follow_nickname, follow_domain, follow_port, | ||||
|                                    follow_http_prefix, | ||||
|                                    cached_webfingers, person_cache, | ||||
|                                    debug, __version__, signing_priv_key_pem) | ||||
|     for t in range(20): | ||||
|         time.sleep(1) | ||||
|         # TODO some method to know if it worked | ||||
|  |  | |||
							
								
								
									
										44
									
								
								follow.py
								
								
								
								
							
							
						
						
									
										44
									
								
								follow.py
								
								
								
								
							|  | @ -108,8 +108,8 @@ def _remove_from_follow_base(base_dir: str, | |||
|     approve_follows_filename = accounts_dir + '/' + follow_file + '.txt' | ||||
|     if not os.path.isfile(approve_follows_filename): | ||||
|         if debug: | ||||
|             print('WARN: Approve follow requests file ' + | ||||
|                   approve_follows_filename + ' not found') | ||||
|             print('There is no ' + follow_file + | ||||
|                   ' to remove ' + handle + ' from') | ||||
|         return | ||||
|     accept_deny_actor = None | ||||
|     if accept_or_deny_handle not in open(approve_follows_filename).read(): | ||||
|  | @ -731,7 +731,9 @@ def followed_account_accepts(session, base_dir: str, http_prefix: str, | |||
|                              cached_webfingers: {}, person_cache: {}, | ||||
|                              debug: bool, project_version: str, | ||||
|                              removeFollowActivity: bool, | ||||
|                              signing_priv_key_pem: str): | ||||
|                              signing_priv_key_pem: str, | ||||
|                              curr_domain: str, | ||||
|                              onion_domain: str, i2p_domain: str): | ||||
|     """The person receiving a follow request accepts the new follower | ||||
|     and sends back an Accept activity | ||||
|     """ | ||||
|  | @ -780,10 +782,12 @@ def followed_account_accepts(session, base_dir: str, http_prefix: str, | |||
|                             send_threads, postLog, cached_webfingers, | ||||
|                             person_cache, debug, project_version, None, | ||||
|                             group_account, signing_priv_key_pem, | ||||
|                             7856837) | ||||
|                             7856837, curr_domain, onion_domain, i2p_domain) | ||||
| 
 | ||||
| 
 | ||||
| def followed_account_rejects(session, base_dir: str, http_prefix: str, | ||||
| def followed_account_rejects(session, session_onion, session_i2p, | ||||
|                              onion_domain: str, i2p_domain: str, | ||||
|                              base_dir: str, http_prefix: str, | ||||
|                              nickname_to_follow: str, domain_to_follow: str, | ||||
|                              port: int, | ||||
|                              nickname: str, domain: str, from_port: int, | ||||
|  | @ -848,7 +852,8 @@ def followed_account_rejects(session, base_dir: str, http_prefix: str, | |||
|                             send_threads, postLog, cached_webfingers, | ||||
|                             person_cache, debug, project_version, None, | ||||
|                             group_account, signing_priv_key_pem, | ||||
|                             6393063) | ||||
|                             6393063, | ||||
|                             domain, onion_domain, i2p_domain) | ||||
| 
 | ||||
| 
 | ||||
| def send_follow_request(session, base_dir: str, | ||||
|  | @ -861,7 +866,9 @@ def send_follow_request(session, base_dir: str, | |||
|                         client_to_server: bool, federation_list: [], | ||||
|                         send_threads: [], postLog: [], cached_webfingers: {}, | ||||
|                         person_cache: {}, debug: bool, | ||||
|                         project_version: str, signing_priv_key_pem: str) -> {}: | ||||
|                         project_version: str, signing_priv_key_pem: str, | ||||
|                         curr_domain: str, | ||||
|                         onion_domain: str, i2p_domain: str) -> {}: | ||||
|     """Gets the json object for sending a follow request | ||||
|     """ | ||||
|     if not signing_priv_key_pem: | ||||
|  | @ -942,24 +949,25 @@ def send_follow_request(session, base_dir: str, | |||
|                      federation_list, | ||||
|                      send_threads, postLog, cached_webfingers, person_cache, | ||||
|                      debug, project_version, None, group_account, | ||||
|                      signing_priv_key_pem, 8234389) | ||||
|                      signing_priv_key_pem, 8234389, | ||||
|                      curr_domain, onion_domain, i2p_domain) | ||||
| 
 | ||||
|     return new_follow_json | ||||
| 
 | ||||
| 
 | ||||
| def send_follow_requestViaServer(base_dir: str, session, | ||||
|                                  from_nickname: str, password: str, | ||||
|                                  from_domain: str, from_port: int, | ||||
|                                  follow_nickname: str, follow_domain: str, | ||||
|                                  followPort: int, | ||||
|                                  http_prefix: str, | ||||
|                                  cached_webfingers: {}, person_cache: {}, | ||||
|                                  debug: bool, project_version: str, | ||||
|                                  signing_priv_key_pem: str) -> {}: | ||||
| def send_follow_request_via_server(base_dir: str, session, | ||||
|                                    from_nickname: str, password: str, | ||||
|                                    from_domain: str, from_port: int, | ||||
|                                    follow_nickname: str, follow_domain: str, | ||||
|                                    followPort: int, | ||||
|                                    http_prefix: str, | ||||
|                                    cached_webfingers: {}, person_cache: {}, | ||||
|                                    debug: bool, project_version: str, | ||||
|                                    signing_priv_key_pem: str) -> {}: | ||||
|     """Creates a follow request via c2s | ||||
|     """ | ||||
|     if not session: | ||||
|         print('WARN: No session for send_follow_requestViaServer') | ||||
|         print('WARN: No session for send_follow_request_via_server') | ||||
|         return 6 | ||||
| 
 | ||||
|     from_domain_full = get_full_domain(from_domain, from_port) | ||||
|  |  | |||
							
								
								
									
										165
									
								
								inbox.py
								
								
								
								
							
							
						
						
									
										165
									
								
								inbox.py
								
								
								
								
							|  | @ -606,7 +606,8 @@ def save_post_to_inbox_queue(base_dir: str, http_prefix: str, | |||
| def _inbox_post_recipients_add(base_dir: str, http_prefix: str, toList: [], | ||||
|                                recipients_dict: {}, | ||||
|                                domain_match: str, domain: str, | ||||
|                                actor: str, debug: bool) -> bool: | ||||
|                                actor: str, debug: bool, | ||||
|                                onion_domain: str, i2p_domain: str) -> bool: | ||||
|     """Given a list of post recipients (toList) from 'to' or 'cc' parameters | ||||
|     populate a recipients_dict with the handle for each | ||||
|     """ | ||||
|  | @ -614,9 +615,18 @@ def _inbox_post_recipients_add(base_dir: str, http_prefix: str, toList: [], | |||
|     for recipient in toList: | ||||
|         if not recipient: | ||||
|             continue | ||||
|         # is this a to a local account? | ||||
|         # if the recipient is an onion or i2p address then | ||||
|         # is it an account on a clearnet instance? | ||||
|         # If so then change the onion/i2p to the account domain | ||||
|         if onion_domain: | ||||
|             if onion_domain + '/' in recipient: | ||||
|                 recipient = recipient.replace(onion_domain, domain) | ||||
|         if i2p_domain: | ||||
|             if i2p_domain + '/' in recipient: | ||||
|                 recipient = recipient.replace(i2p_domain, domain) | ||||
|         # is this a to an account on this instance? | ||||
|         if domain_match in recipient: | ||||
|             # get the handle for the local account | ||||
|             # get the handle for the account on this instance | ||||
|             nickname = recipient.split(domain_match)[1] | ||||
|             handle = nickname + '@' + domain | ||||
|             if os.path.isdir(base_dir + '/accounts/' + handle): | ||||
|  | @ -643,7 +653,8 @@ def _inbox_post_recipients_add(base_dir: str, http_prefix: str, toList: [], | |||
| 
 | ||||
| def _inbox_post_recipients(base_dir: str, post_json_object: {}, | ||||
|                            http_prefix: str, domain: str, port: int, | ||||
|                            debug: bool) -> ([], []): | ||||
|                            debug: bool, | ||||
|                            onion_domain: str, i2p_domain: str) -> ([], []): | ||||
|     """Returns dictionaries containing the recipients of the given post | ||||
|     The shared dictionary contains followers | ||||
|     """ | ||||
|  | @ -678,7 +689,8 @@ def _inbox_post_recipients(base_dir: str, post_json_object: {}, | |||
|                                            recipients_list, | ||||
|                                            recipients_dict, | ||||
|                                            domain_match, domain_base, | ||||
|                                            actor, debug) | ||||
|                                            actor, debug, | ||||
|                                            onion_domain, i2p_domain) | ||||
|             if includes_followers: | ||||
|                 follower_recipients = True | ||||
|         else: | ||||
|  | @ -695,7 +707,8 @@ def _inbox_post_recipients(base_dir: str, post_json_object: {}, | |||
|                                            recipients_list, | ||||
|                                            recipients_dict, | ||||
|                                            domain_match, domain_base, | ||||
|                                            actor, debug) | ||||
|                                            actor, debug, | ||||
|                                            onion_domain, i2p_domain) | ||||
|             if includes_followers: | ||||
|                 follower_recipients = True | ||||
|         else: | ||||
|  | @ -720,7 +733,8 @@ def _inbox_post_recipients(base_dir: str, post_json_object: {}, | |||
|                                        recipients_list, | ||||
|                                        recipients_dict, | ||||
|                                        domain_match, domain_base, | ||||
|                                        actor, debug) | ||||
|                                        actor, debug, | ||||
|                                        onion_domain, i2p_domain) | ||||
|         if includes_followers: | ||||
|             follower_recipients = True | ||||
| 
 | ||||
|  | @ -734,7 +748,8 @@ def _inbox_post_recipients(base_dir: str, post_json_object: {}, | |||
|                                        recipients_list, | ||||
|                                        recipients_dict, | ||||
|                                        domain_match, domain_base, | ||||
|                                        actor, debug) | ||||
|                                        actor, debug, | ||||
|                                        onion_domain, i2p_domain) | ||||
|         if includes_followers: | ||||
|             follower_recipients = True | ||||
| 
 | ||||
|  | @ -753,7 +768,8 @@ def _inbox_post_recipients(base_dir: str, post_json_object: {}, | |||
| def _receive_undo_follow(session, base_dir: str, http_prefix: str, | ||||
|                          port: int, message_json: {}, | ||||
|                          federation_list: [], | ||||
|                          debug: bool) -> bool: | ||||
|                          debug: bool, domain: str, | ||||
|                          onion_domain: str, i2p_domain: str) -> bool: | ||||
|     if not message_json['object'].get('actor'): | ||||
|         if debug: | ||||
|             print('DEBUG: follow request has no actor within object') | ||||
|  | @ -786,6 +802,12 @@ def _receive_undo_follow(session, base_dir: str, http_prefix: str, | |||
|         return False | ||||
|     domain_following, port_following = \ | ||||
|         get_domain_from_actor(message_json['object']['object']) | ||||
|     if onion_domain: | ||||
|         if domain_following.endswith(onion_domain): | ||||
|             domain_following = domain | ||||
|     if i2p_domain: | ||||
|         if domain_following.endswith(i2p_domain): | ||||
|             domain_following = domain | ||||
|     domain_following_full = get_full_domain(domain_following, port_following) | ||||
| 
 | ||||
|     group_account = \ | ||||
|  | @ -810,7 +832,8 @@ def _receive_undo(session, base_dir: str, http_prefix: str, | |||
|                   port: int, send_threads: [], post_log: [], | ||||
|                   cached_webfingers: {}, person_cache: {}, | ||||
|                   message_json: {}, federation_list: [], | ||||
|                   debug: bool) -> bool: | ||||
|                   debug: bool, domain: str, | ||||
|                   onion_domain: str, i2p_domain: str) -> bool: | ||||
|     """Receives an undo request within the POST section of HTTPServer | ||||
|     """ | ||||
|     if not message_json['type'].startswith('Undo'): | ||||
|  | @ -831,7 +854,8 @@ def _receive_undo(session, base_dir: str, http_prefix: str, | |||
|        message_json['object']['type'] == 'Join': | ||||
|         return _receive_undo_follow(session, base_dir, http_prefix, | ||||
|                                     port, message_json, | ||||
|                                     federation_list, debug) | ||||
|                                     federation_list, debug, | ||||
|                                     domain, onion_domain, i2p_domain) | ||||
|     return False | ||||
| 
 | ||||
| 
 | ||||
|  | @ -1009,7 +1033,7 @@ def _receive_update_activity(recent_posts_cache: {}, session, base_dir: str, | |||
| def _receive_like(recent_posts_cache: {}, | ||||
|                   session, handle: str, is_group: bool, base_dir: str, | ||||
|                   http_prefix: str, domain: str, port: int, | ||||
|                   onion_domain: str, | ||||
|                   onion_domain: str, i2p_domain: str, | ||||
|                   send_threads: [], post_log: [], cached_webfingers: {}, | ||||
|                   person_cache: {}, message_json: {}, federation_list: [], | ||||
|                   debug: bool, | ||||
|  | @ -2647,7 +2671,7 @@ def _group_handle(base_dir: str, handle: str) -> bool: | |||
|     return actor_json['type'] == 'Group' | ||||
| 
 | ||||
| 
 | ||||
| def _send_to_group_members(session, session_onion, session_i2p, | ||||
| def _send_to_group_members(server, session, session_onion, session_i2p, | ||||
|                            base_dir: str, handle: str, port: int, | ||||
|                            post_json_object: {}, | ||||
|                            http_prefix: str, federation_list: [], | ||||
|  | @ -2655,6 +2679,7 @@ def _send_to_group_members(session, session_onion, session_i2p, | |||
|                            cached_webfingers: {}, | ||||
|                            person_cache: {}, debug: bool, | ||||
|                            system_language: str, | ||||
|                            curr_domain: str, | ||||
|                            onion_domain: str, i2p_domain: str, | ||||
|                            signing_priv_key_pem: str) -> None: | ||||
|     """When a post arrives for a group send it out to the group members | ||||
|  | @ -2707,9 +2732,10 @@ def _send_to_group_members(session, session_onion, session_i2p, | |||
|                         http_prefix, post_id, False, False, | ||||
|                         send_threads, post_log, | ||||
|                         person_cache, cached_webfingers, | ||||
|                         debug, __version__, signing_priv_key_pem) | ||||
|                         debug, __version__, signing_priv_key_pem, | ||||
|                         curr_domain, onion_domain, i2p_domain) | ||||
| 
 | ||||
|     send_to_followers_thread(session, session_onion, session_i2p, | ||||
|     send_to_followers_thread(server, session, session_onion, session_i2p, | ||||
|                              base_dir, nickname, domain, | ||||
|                              onion_domain, i2p_domain, port, | ||||
|                              http_prefix, federation_list, | ||||
|  | @ -2845,7 +2871,8 @@ def _bounce_dm(senderPostId: str, session, http_prefix: str, | |||
|                signing_priv_key_pem: str, | ||||
|                content_license_url: str, | ||||
|                languages_understood: [], | ||||
|                bounce_is_chat: bool) -> bool: | ||||
|                bounce_is_chat: bool, | ||||
|                curr_domain: str, onion_domain: str, i2p_domain: str) -> bool: | ||||
|     """Sends a bounce message back to the sending handle | ||||
|     if a DM has been rejected | ||||
|     """ | ||||
|  | @ -2919,7 +2946,8 @@ def _bounce_dm(senderPostId: str, session, http_prefix: str, | |||
|                      http_prefix, False, False, federation_list, | ||||
|                      send_threads, post_log, cached_webfingers, | ||||
|                      person_cache, debug, __version__, None, group_account, | ||||
|                      signing_priv_key_pem, 7238634) | ||||
|                      signing_priv_key_pem, 7238634, | ||||
|                      curr_domain, onion_domain, i2p_domain) | ||||
|     return True | ||||
| 
 | ||||
| 
 | ||||
|  | @ -2935,7 +2963,8 @@ def _is_valid_dm(base_dir: str, nickname: str, domain: str, port: int, | |||
|                  handle: str, system_language: str, | ||||
|                  signing_priv_key_pem: str, | ||||
|                  content_license_url: str, | ||||
|                  languages_understood: []) -> bool: | ||||
|                  languages_understood: [], | ||||
|                  curr_domain: str, onion_domain: str, i2p_domain: str) -> bool: | ||||
|     """Is the given message a valid DM? | ||||
|     """ | ||||
|     if nickname == 'inbox': | ||||
|  | @ -3022,7 +3051,9 @@ def _is_valid_dm(base_dir: str, nickname: str, domain: str, port: int, | |||
|                                        signing_priv_key_pem, | ||||
|                                        content_license_url, | ||||
|                                        languages_understood, | ||||
|                                        bounce_chat) | ||||
|                                        bounce_chat, | ||||
|                                        curr_domain, | ||||
|                                        onion_domain, i2p_domain) | ||||
|                 return False | ||||
| 
 | ||||
|     # dm index will be updated | ||||
|  | @ -3032,7 +3063,7 @@ def _is_valid_dm(base_dir: str, nickname: str, domain: str, port: int, | |||
|     return True | ||||
| 
 | ||||
| 
 | ||||
| def _receive_question_vote(base_dir: str, nickname: str, domain: str, | ||||
| def _receive_question_vote(server, base_dir: str, nickname: str, domain: str, | ||||
|                            http_prefix: str, handle: str, debug: bool, | ||||
|                            post_json_object: {}, recent_posts_cache: {}, | ||||
|                            session, session_onion, session_i2p, | ||||
|  | @ -3112,7 +3143,7 @@ def _receive_question_vote(base_dir: str, nickname: str, domain: str, | |||
|     question_json['type'] = 'Update' | ||||
|     shared_items_federated_domains = [] | ||||
|     shared_item_federation_tokens = {} | ||||
|     send_to_followers_thread(session, session_onion, session_i2p, | ||||
|     send_to_followers_thread(server, session, session_onion, session_i2p, | ||||
|                              base_dir, nickname, domain, | ||||
|                              onion_domain, i2p_domain, port, | ||||
|                              http_prefix, federation_list, | ||||
|  | @ -3240,7 +3271,8 @@ def _check_for_git_patches(base_dir: str, nickname: str, domain: str, | |||
|     return 0 | ||||
| 
 | ||||
| 
 | ||||
| def _inbox_after_initial(recent_posts_cache: {}, max_recent_posts: int, | ||||
| def _inbox_after_initial(server, | ||||
|                          recent_posts_cache: {}, max_recent_posts: int, | ||||
|                          session, session_onion, session_i2p, | ||||
|                          key_id: str, handle: str, message_json: {}, | ||||
|                          base_dir: str, http_prefix: str, send_threads: [], | ||||
|  | @ -3268,6 +3300,19 @@ def _inbox_after_initial(recent_posts_cache: {}, max_recent_posts: int, | |||
|                          languages_understood: []) -> bool: | ||||
|     """ Anything which needs to be done after initial checks have passed | ||||
|     """ | ||||
|     # if this is a clearnet instance then replace any onion/i2p | ||||
|     # domains with the account domain | ||||
|     if onion_domain or i2p_domain: | ||||
|         message_str = json.dumps(message_json, ensure_ascii=False) | ||||
|         if onion_domain: | ||||
|             if onion_domain in message_str: | ||||
|                 message_str = message_str.replace(onion_domain, domain) | ||||
|                 message_json = json.loads(message_str) | ||||
|         if i2p_domain: | ||||
|             if i2p_domain in message_str: | ||||
|                 message_str = message_str.replace(i2p_domain, domain) | ||||
|                 message_json = json.loads(message_str) | ||||
| 
 | ||||
|     actor = key_id | ||||
|     if '#' in actor: | ||||
|         actor = key_id.split('#')[0] | ||||
|  | @ -3281,7 +3326,7 @@ def _inbox_after_initial(recent_posts_cache: {}, max_recent_posts: int, | |||
|                      session, handle, is_group, | ||||
|                      base_dir, http_prefix, | ||||
|                      domain, port, | ||||
|                      onion_domain, | ||||
|                      onion_domain, i2p_domain, | ||||
|                      send_threads, post_log, | ||||
|                      cached_webfingers, | ||||
|                      person_cache, | ||||
|  | @ -3514,7 +3559,7 @@ def _inbox_after_initial(recent_posts_cache: {}, max_recent_posts: int, | |||
|         populate_replies(base_dir, http_prefix, domain, post_json_object, | ||||
|                          max_replies, debug) | ||||
| 
 | ||||
|         _receive_question_vote(base_dir, nickname, domain, | ||||
|         _receive_question_vote(server, base_dir, nickname, domain, | ||||
|                                http_prefix, handle, debug, | ||||
|                                post_json_object, recent_posts_cache, | ||||
|                                session, session_onion, session_i2p, | ||||
|  | @ -3550,7 +3595,9 @@ def _inbox_after_initial(recent_posts_cache: {}, max_recent_posts: int, | |||
|                                     handle, system_language, | ||||
|                                     signing_priv_key_pem, | ||||
|                                     content_license_url, | ||||
|                                     languages_understood): | ||||
|                                     languages_understood, | ||||
|                                     domain, | ||||
|                                     onion_domain, i2p_domain): | ||||
|                     return False | ||||
| 
 | ||||
|             # get the actor being replied to | ||||
|  | @ -3684,7 +3731,8 @@ def _inbox_after_initial(recent_posts_cache: {}, max_recent_posts: int, | |||
| 
 | ||||
|             # send the post out to group members | ||||
|             if is_group: | ||||
|                 _send_to_group_members(session, session_onion, session_i2p, | ||||
|                 _send_to_group_members(server, | ||||
|                                        session, session_onion, session_i2p, | ||||
|                                        base_dir, handle, port, | ||||
|                                        post_json_object, | ||||
|                                        http_prefix, federation_list, | ||||
|  | @ -3692,7 +3740,7 @@ def _inbox_after_initial(recent_posts_cache: {}, max_recent_posts: int, | |||
|                                        post_log, cached_webfingers, | ||||
|                                        person_cache, | ||||
|                                        debug, system_language, | ||||
|                                        onion_domain, i2p_domain, | ||||
|                                        domain, onion_domain, i2p_domain, | ||||
|                                        signing_priv_key_pem) | ||||
| 
 | ||||
|     # if the post wasn't saved | ||||
|  | @ -3747,7 +3795,7 @@ def _restore_queue_items(base_dir: str, queue: []) -> None: | |||
| def run_inbox_queue_watchdog(project_version: str, httpd) -> None: | ||||
|     """This tries to keep the inbox thread running even if it dies | ||||
|     """ | ||||
|     print('Starting inbox queue watchdog') | ||||
|     print('THREAD: Starting inbox queue watchdog') | ||||
|     inbox_queue_original = httpd.thrInboxQueue.clone(run_inbox_queue) | ||||
|     httpd.thrInboxQueue.start() | ||||
|     while True: | ||||
|  | @ -3755,6 +3803,7 @@ def run_inbox_queue_watchdog(project_version: str, httpd) -> None: | |||
|         if not httpd.thrInboxQueue.is_alive() or httpd.restart_inbox_queue: | ||||
|             httpd.restart_inbox_queue_in_progress = True | ||||
|             httpd.thrInboxQueue.kill() | ||||
|             print('THREAD: restarting inbox queue watchdog') | ||||
|             httpd.thrInboxQueue = inbox_queue_original.clone(run_inbox_queue) | ||||
|             httpd.inbox_queue.clear() | ||||
|             httpd.thrInboxQueue.start() | ||||
|  | @ -3932,7 +3981,8 @@ def _receive_follow_request(session, session_onion, session_i2p, | |||
|                             cached_webfingers: {}, person_cache: {}, | ||||
|                             message_json: {}, federation_list: [], | ||||
|                             debug: bool, project_version: str, | ||||
|                             max_followers: int, onion_domain: str, | ||||
|                             max_followers: int, | ||||
|                             this_domain: str, onion_domain: str, | ||||
|                             i2p_domain: str, signing_priv_key_pem: str, | ||||
|                             unit_test: bool) -> bool: | ||||
|     """Receives a follow request within the POST section of HTTPServer | ||||
|  | @ -3971,6 +4021,13 @@ def _receive_follow_request(session, session_onion, session_i2p, | |||
|                   'not found within object') | ||||
|         return False | ||||
|     domain_to_follow, temp_port = get_domain_from_actor(message_json['object']) | ||||
|     # switch to the local domain rather than its onion or i2p version | ||||
|     if onion_domain: | ||||
|         if domain_to_follow.endswith(onion_domain): | ||||
|             domain_to_follow = this_domain | ||||
|     if i2p_domain: | ||||
|         if domain_to_follow.endswith(i2p_domain): | ||||
|             domain_to_follow = this_domain | ||||
|     if not domain_permitted(domain_to_follow, federation_list): | ||||
|         if debug: | ||||
|             print('DEBUG: follow domain not permitted ' + domain_to_follow) | ||||
|  | @ -4002,6 +4059,7 @@ def _receive_follow_request(session, session_onion, session_i2p, | |||
|                       base_dir + '/accounts/' + handle_to_follow) | ||||
|             return True | ||||
| 
 | ||||
|     is_already_follower = False | ||||
|     if is_follower_of_person(base_dir, | ||||
|                              nickname_to_follow, domain_to_follow_full, | ||||
|                              nickname, domain_full): | ||||
|  | @ -4009,7 +4067,7 @@ def _receive_follow_request(session, session_onion, session_i2p, | |||
|             print('DEBUG: ' + nickname + '@' + domain + | ||||
|                   ' is already a follower of ' + | ||||
|                   nickname_to_follow + '@' + domain_to_follow) | ||||
|         return True | ||||
|         is_already_follower = True | ||||
| 
 | ||||
|     approve_handle = nickname + '@' + domain_full | ||||
| 
 | ||||
|  | @ -4017,16 +4075,26 @@ def _receive_follow_request(session, session_onion, session_i2p, | |||
|     curr_http_prefix = http_prefix | ||||
|     curr_domain = domain | ||||
|     curr_port = from_port | ||||
|     if onion_domain and domain_to_follow.endswith('.onion'): | ||||
|     if onion_domain and \ | ||||
|        not curr_domain.endswith('.onion') and \ | ||||
|        domain_to_follow.endswith('.onion'): | ||||
|         curr_session = session_onion | ||||
|         curr_http_prefix = 'http' | ||||
|         curr_domain = onion_domain | ||||
|         curr_port = 80 | ||||
|     elif i2p_domain and domain_to_follow.endswith('.i2p'): | ||||
|         port = 80 | ||||
|         if debug: | ||||
|             print('Domain switched from ' + domain + ' to ' + curr_domain) | ||||
|     elif (i2p_domain and | ||||
|           not curr_domain.endswith('.i2p') and | ||||
|           domain_to_follow.endswith('.i2p')): | ||||
|         curr_session = session_i2p | ||||
|         curr_http_prefix = 'http' | ||||
|         curr_domain = i2p_domain | ||||
|         curr_port = 80 | ||||
|         port = 80 | ||||
|         if debug: | ||||
|             print('Domain switched from ' + domain + ' to ' + curr_domain) | ||||
| 
 | ||||
|     # is the actor sending the request valid? | ||||
|     if not valid_sending_actor(curr_session, base_dir, | ||||
|  | @ -4037,7 +4105,8 @@ def _receive_follow_request(session, session_onion, session_i2p, | |||
|         return False | ||||
| 
 | ||||
|     # what is the followers policy? | ||||
|     if follow_approval_required(base_dir, nickname_to_follow, | ||||
|     if not is_already_follower and \ | ||||
|        follow_approval_required(base_dir, nickname_to_follow, | ||||
|                                 domain_to_follow, debug, approve_handle): | ||||
|         print('Follow approval is required') | ||||
|         if domain.endswith('.onion'): | ||||
|  | @ -4089,7 +4158,12 @@ def _receive_follow_request(session, session_onion, session_i2p, | |||
|                                     message_json, debug, message_json['actor'], | ||||
|                                     group_account) | ||||
|     else: | ||||
|         print('Follow request does not require approval ' + approve_handle) | ||||
|         if is_already_follower: | ||||
|             print(approve_handle + ' is already a follower. ' + | ||||
|                   'Re-sending Accept.') | ||||
|         else: | ||||
|             print('Follow request does not require approval ' + | ||||
|                   approve_handle) | ||||
|         # update the followers | ||||
|         account_to_be_followed = \ | ||||
|             acct_dir(base_dir, nickname_to_follow, domain_to_follow) | ||||
|  | @ -4151,6 +4225,9 @@ def _receive_follow_request(session, session_onion, session_i2p, | |||
|                         followers_file.write(approve_handle + '\n') | ||||
|                 except OSError: | ||||
|                     print('EX: unable to write ' + followers_filename) | ||||
|         else: | ||||
|             print('ACCEPT: Follow Accept account directory not found: ' + | ||||
|                   account_to_be_followed) | ||||
| 
 | ||||
|     print('Beginning follow accept') | ||||
|     return followed_account_accepts(curr_session, base_dir, curr_http_prefix, | ||||
|  | @ -4160,10 +4237,12 @@ def _receive_follow_request(session, session_onion, session_i2p, | |||
|                                     message_json, send_threads, post_log, | ||||
|                                     cached_webfingers, person_cache, | ||||
|                                     debug, project_version, True, | ||||
|                                     signing_priv_key_pem) | ||||
|                                     signing_priv_key_pem, | ||||
|                                     this_domain, onion_domain, i2p_domain) | ||||
| 
 | ||||
| 
 | ||||
| def run_inbox_queue(recent_posts_cache: {}, max_recent_posts: int, | ||||
| def run_inbox_queue(server, | ||||
|                     recent_posts_cache: {}, max_recent_posts: int, | ||||
|                     project_version: str, | ||||
|                     base_dir: str, http_prefix: str, | ||||
|                     send_threads: [], post_log: [], | ||||
|  | @ -4509,7 +4588,7 @@ def run_inbox_queue(recent_posts_cache: {}, max_recent_posts: int, | |||
|                          person_cache, | ||||
|                          queue_json['post'], | ||||
|                          federation_list, | ||||
|                          debug): | ||||
|                          debug, domain, onion_domain, i2p_domain): | ||||
|             print('Queue: Undo accepted from ' + key_id) | ||||
|             if os.path.isfile(queue_filename): | ||||
|                 try: | ||||
|  | @ -4531,7 +4610,8 @@ def run_inbox_queue(recent_posts_cache: {}, max_recent_posts: int, | |||
|                                    queue_json['post'], | ||||
|                                    federation_list, | ||||
|                                    debug, project_version, | ||||
|                                    max_followers, onion_domain, i2p_domain, | ||||
|                                    max_followers, domain, | ||||
|                                    onion_domain, i2p_domain, | ||||
|                                    signing_priv_key_pem, unit_test): | ||||
|             if os.path.isfile(queue_filename): | ||||
|                 try: | ||||
|  | @ -4553,7 +4633,8 @@ def run_inbox_queue(recent_posts_cache: {}, max_recent_posts: int, | |||
|                                  send_threads, post_log, | ||||
|                                  cached_webfingers, person_cache, | ||||
|                                  queue_json['post'], | ||||
|                                  federation_list, debug): | ||||
|                                  federation_list, debug, | ||||
|                                  domain, onion_domain, i2p_domain): | ||||
|             print('Queue: Accept/Reject received from ' + key_id) | ||||
|             if os.path.isfile(queue_filename): | ||||
|                 try: | ||||
|  | @ -4590,7 +4671,8 @@ def run_inbox_queue(recent_posts_cache: {}, max_recent_posts: int, | |||
|         # get recipients list | ||||
|         recipients_dict, recipients_dict_followers = \ | ||||
|             _inbox_post_recipients(base_dir, queue_json['post'], | ||||
|                                    http_prefix, domain, port, debug) | ||||
|                                    http_prefix, domain, port, debug, | ||||
|                                    onion_domain, i2p_domain) | ||||
|         if len(recipients_dict.items()) == 0 and \ | ||||
|            len(recipients_dict_followers.items()) == 0: | ||||
|             if debug: | ||||
|  | @ -4646,7 +4728,8 @@ def run_inbox_queue(recent_posts_cache: {}, max_recent_posts: int, | |||
|             destination = \ | ||||
|                 queue_json['destination'].replace(inbox_handle, handle) | ||||
|             languages_understood = [] | ||||
|             _inbox_after_initial(recent_posts_cache, | ||||
|             _inbox_after_initial(server, | ||||
|                                  recent_posts_cache, | ||||
|                                  max_recent_posts, | ||||
|                                  session, session_onion, session_i2p, | ||||
|                                  key_id, handle, | ||||
|  |  | |||
							
								
								
									
										13
									
								
								like.py
								
								
								
								
							
							
						
						
									
										13
									
								
								like.py
								
								
								
								
							|  | @ -77,7 +77,9 @@ def _create_like(recent_posts_cache: {}, | |||
|                  send_threads: [], postLog: [], | ||||
|                  person_cache: {}, cached_webfingers: {}, | ||||
|                  debug: bool, project_version: str, | ||||
|                  signing_priv_key_pem: str) -> {}: | ||||
|                  signing_priv_key_pem: str, | ||||
|                  curr_domain: str, | ||||
|                  onion_domain: str, i2p_domain: str) -> {}: | ||||
|     """Creates a like | ||||
|     actor is the person doing the liking | ||||
|     'to' might be a specific person (actor) whose post was liked | ||||
|  | @ -142,7 +144,8 @@ def _create_like(recent_posts_cache: {}, | |||
|                          send_threads, postLog, cached_webfingers, | ||||
|                          person_cache, | ||||
|                          debug, project_version, None, group_account, | ||||
|                          signing_priv_key_pem, 7367374) | ||||
|                          signing_priv_key_pem, 7367374, | ||||
|                          curr_domain, onion_domain, i2p_domain) | ||||
| 
 | ||||
|     return new_like_json | ||||
| 
 | ||||
|  | @ -156,7 +159,8 @@ def like_post(recent_posts_cache: {}, | |||
|               send_threads: [], postLog: [], | ||||
|               person_cache: {}, cached_webfingers: {}, | ||||
|               debug: bool, project_version: str, | ||||
|               signing_priv_key_pem: str) -> {}: | ||||
|               signing_priv_key_pem: str, | ||||
|               curr_domain: str, onion_domain: str, i2p_domain: str) -> {}: | ||||
|     """Likes a given status post. This is only used by unit tests | ||||
|     """ | ||||
|     like_domain = get_full_domain(like_domain, like_port) | ||||
|  | @ -170,7 +174,8 @@ def like_post(recent_posts_cache: {}, | |||
|                         cc_list, http_prefix, object_url, actor_liked, | ||||
|                         client_to_server, | ||||
|                         send_threads, postLog, person_cache, cached_webfingers, | ||||
|                         debug, project_version, signing_priv_key_pem) | ||||
|                         debug, project_version, signing_priv_key_pem, | ||||
|                         curr_domain, onion_domain, i2p_domain) | ||||
| 
 | ||||
| 
 | ||||
| def send_like_via_server(base_dir: str, session, | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ from utils import get_port_from_domain | |||
| from utils import get_user_paths | ||||
| from utils import acct_dir | ||||
| from threads import thread_with_trace | ||||
| from session import create_session | ||||
| 
 | ||||
| 
 | ||||
| def manual_deny_follow_request(session, session_onion, session_i2p, | ||||
|  | @ -88,6 +89,7 @@ def manual_deny_follow_request_thread(session, session_onion, session_i2p, | |||
|     """Manually deny a follow request, within a thread so that the | ||||
|     user interface doesn't lag | ||||
|     """ | ||||
|     print('THREAD: manual_deny_follow_request') | ||||
|     thr = \ | ||||
|         thread_with_trace(target=manual_deny_follow_request, | ||||
|                           args=(session, session_onion, session_i2p, | ||||
|  | @ -135,7 +137,8 @@ def manual_approve_follow_request(session, session_onion, session_i2p, | |||
|                                   cached_webfingers: {}, person_cache: {}, | ||||
|                                   debug: bool, | ||||
|                                   project_version: str, | ||||
|                                   signing_priv_key_pem: str) -> None: | ||||
|                                   signing_priv_key_pem: str, | ||||
|                                   proxy_type: str) -> None: | ||||
|     """Manually approve a follow request | ||||
|     """ | ||||
|     handle = nickname + '@' + domain | ||||
|  | @ -217,18 +220,28 @@ def manual_approve_follow_request(session, session_onion, session_i2p, | |||
|                             curr_port = port | ||||
|                             curr_session = session | ||||
|                             curr_http_prefix = http_prefix | ||||
|                             curr_proxy_type = proxy_type | ||||
|                             if onion_domain and \ | ||||
|                                not curr_domain.endswith('.onion') and \ | ||||
|                                approve_domain.endswith('.onion'): | ||||
|                                 curr_domain = onion_domain | ||||
|                                 curr_port = 80 | ||||
|                                 approve_port = 80 | ||||
|                                 curr_session = session_onion | ||||
|                                 curr_http_prefix = 'http' | ||||
|                                 curr_proxy_type = 'tor' | ||||
|                             elif (i2p_domain and | ||||
|                                   not curr_domain.endswith('.i2p') and | ||||
|                                   approve_domain.endswith('.i2p')): | ||||
|                                 curr_domain = i2p_domain | ||||
|                                 curr_port = 80 | ||||
|                                 approve_port = 80 | ||||
|                                 curr_session = session_i2p | ||||
|                                 curr_http_prefix = 'http' | ||||
|                                 curr_proxy_type = 'i2p' | ||||
| 
 | ||||
|                             if not curr_session: | ||||
|                                 curr_session = create_session(curr_proxy_type) | ||||
| 
 | ||||
|                             print('Manual follow accept: Sending Accept for ' + | ||||
|                                   handle + ' follow request from ' + | ||||
|  | @ -248,7 +261,10 @@ def manual_approve_follow_request(session, session_onion, session_i2p, | |||
|                                                      person_cache, | ||||
|                                                      debug, | ||||
|                                                      project_version, False, | ||||
|                                                      signing_priv_key_pem) | ||||
|                                                      signing_priv_key_pem, | ||||
|                                                      domain, | ||||
|                                                      onion_domain, | ||||
|                                                      i2p_domain) | ||||
|                     update_approved_followers = True | ||||
|                 else: | ||||
|                     # this isn't the approved follow so it will remain | ||||
|  | @ -317,10 +333,12 @@ def manual_approve_follow_request_thread(session, session_onion, session_i2p, | |||
|                                          person_cache: {}, | ||||
|                                          debug: bool, | ||||
|                                          project_version: str, | ||||
|                                          signing_priv_key_pem: str) -> None: | ||||
|                                          signing_priv_key_pem: str, | ||||
|                                          proxy_type: str) -> None: | ||||
|     """Manually approve a follow request, in a thread so as not to cause | ||||
|     the UI to lag | ||||
|     """ | ||||
|     print('THREAD: manual_approve_follow_request') | ||||
|     thr = \ | ||||
|         thread_with_trace(target=manual_approve_follow_request, | ||||
|                           args=(session, session_onion, session_i2p, | ||||
|  | @ -333,6 +351,7 @@ def manual_approve_follow_request_thread(session, session_onion, session_i2p, | |||
|                                 cached_webfingers, person_cache, | ||||
|                                 debug, | ||||
|                                 project_version, | ||||
|                                 signing_priv_key_pem), daemon=True) | ||||
|                                 signing_priv_key_pem, | ||||
|                                 proxy_type), daemon=True) | ||||
|     thr.start() | ||||
|     send_threads.append(thr) | ||||
|  |  | |||
|  | @ -882,7 +882,7 @@ def run_newswire_daemon(base_dir: str, httpd, | |||
| def run_newswire_watchdog(project_version: str, httpd) -> None: | ||||
|     """This tries to keep the newswire update thread running even if it dies | ||||
|     """ | ||||
|     print('Starting newswire watchdog') | ||||
|     print('THREAD: Starting newswire watchdog') | ||||
|     newswire_original = \ | ||||
|         httpd.thrPostSchedule.clone(run_newswire_daemon) | ||||
|     httpd.thrNewswireDaemon.start() | ||||
|  | @ -891,6 +891,7 @@ def run_newswire_watchdog(project_version: str, httpd) -> None: | |||
|         if httpd.thrNewswireDaemon.is_alive(): | ||||
|             continue | ||||
|         httpd.thrNewswireDaemon.kill() | ||||
|         print('THREAD: restarting newswire watchdog') | ||||
|         httpd.thrNewswireDaemon = \ | ||||
|             newswire_original.clone(run_newswire_daemon) | ||||
|         httpd.thrNewswireDaemon.start() | ||||
|  |  | |||
|  | @ -509,7 +509,7 @@ def post_message_to_outbox(session, translate: {}, | |||
|         followers_threads.pop(0) | ||||
|     # create a thread to send the post to followers | ||||
|     followers_thread = \ | ||||
|         send_to_followers_thread(server.session, | ||||
|         send_to_followers_thread(server, server.session, | ||||
|                                  server.session_onion, | ||||
|                                  server.session_i2p, | ||||
|                                  base_dir, | ||||
|  | @ -653,7 +653,7 @@ def post_message_to_outbox(session, translate: {}, | |||
|             print('c2s sender: ' + | ||||
|                   post_to_nickname + '@' + domain + ':' + str(port)) | ||||
|     named_addresses_thread = \ | ||||
|         send_to_named_addresses_thread(server.session, | ||||
|         send_to_named_addresses_thread(server, server.session, | ||||
|                                        server.session_onion, | ||||
|                                        server.session_i2p, | ||||
|                                        base_dir, post_to_nickname, | ||||
|  | @ -668,6 +668,7 @@ def post_message_to_outbox(session, translate: {}, | |||
|                                        version, | ||||
|                                        shared_items_federated_domains, | ||||
|                                        shared_item_federation_tokens, | ||||
|                                        signing_priv_key_pem) | ||||
|                                        signing_priv_key_pem, | ||||
|                                        proxy_type) | ||||
|     followers_threads.append(named_addresses_thread) | ||||
|     return True | ||||
|  |  | |||
							
								
								
									
										27
									
								
								person.py
								
								
								
								
							
							
						
						
									
										27
									
								
								person.py
								
								
								
								
							|  | @ -1687,17 +1687,13 @@ def valid_sending_actor(session, base_dir: str, | |||
|     if sending_actor.endswith(domain + '/users/' + nickname): | ||||
|         return True | ||||
| 
 | ||||
|     # get their actor | ||||
|     actor_json = \ | ||||
|         get_person_from_cache(base_dir, sending_actor, person_cache, True) | ||||
|     downloaded_actor = False | ||||
|     if not actor_json: | ||||
|         # download the actor | ||||
|         actor_json, _ = get_actor_json(domain, sending_actor, | ||||
|                                        True, False, debug, True, | ||||
|                                        signing_priv_key_pem, session) | ||||
|         if actor_json: | ||||
|             downloaded_actor = True | ||||
|     # download the actor | ||||
|     # NOTE: the actor should not be obtained from the local cache, | ||||
|     # because they may have changed fields which are being tested here, | ||||
|     # such as the bio length | ||||
|     actor_json, _ = get_actor_json(domain, sending_actor, | ||||
|                                    True, False, debug, True, | ||||
|                                    signing_priv_key_pem, session) | ||||
|     if not actor_json: | ||||
|         # if the actor couldn't be obtained then proceed anyway | ||||
|         return True | ||||
|  | @ -1776,9 +1772,8 @@ def valid_sending_actor(session, base_dir: str, | |||
|                           sending_actor) | ||||
|                     return False | ||||
| 
 | ||||
|     if downloaded_actor: | ||||
|         # if the actor is valid and was downloaded then | ||||
|         # store it in the cache, but don't write it to file | ||||
|         store_person_in_cache(base_dir, sending_actor, actor_json, | ||||
|                               person_cache, False) | ||||
|     # if the actor is valid and was downloaded then | ||||
|     # store it in the cache, but don't write it to file | ||||
|     store_person_in_cache(base_dir, sending_actor, actor_json, | ||||
|                           person_cache, False) | ||||
|     return True | ||||
|  |  | |||
							
								
								
									
										128
									
								
								posts.py
								
								
								
								
							
							
						
						
									
										128
									
								
								posts.py
								
								
								
								
							|  | @ -2494,6 +2494,7 @@ def send_post(signing_priv_key_pem: str, project_version: str, | |||
|         send_threads[0].kill() | ||||
|         send_threads.pop(0) | ||||
|         print('WARN: thread killed') | ||||
|     print('THREAD: thread_send_post') | ||||
|     thr = \ | ||||
|         thread_with_trace(target=thread_send_post, | ||||
|                           args=(session, | ||||
|  | @ -2722,7 +2723,8 @@ def send_signed_json(post_json_object: {}, session, base_dir: str, | |||
|                      person_cache: {}, debug: bool, project_version: str, | ||||
|                      shared_items_token: str, group_account: bool, | ||||
|                      signing_priv_key_pem: str, | ||||
|                      source_id: int) -> int: | ||||
|                      source_id: int, curr_domain: str, | ||||
|                      onion_domain: str, i2p_domain: str) -> int: | ||||
|     """Sends a signed json object to an inbox/outbox | ||||
|     """ | ||||
|     if debug: | ||||
|  | @ -2818,12 +2820,19 @@ def send_signed_json(post_json_object: {}, session, base_dir: str, | |||
|     # shared_inbox is optional | ||||
| 
 | ||||
|     # get the senders private key | ||||
|     account_domain = origin_domain | ||||
|     if onion_domain: | ||||
|         if account_domain == onion_domain: | ||||
|             account_domain = curr_domain | ||||
|     if i2p_domain: | ||||
|         if account_domain == i2p_domain: | ||||
|             account_domain = curr_domain | ||||
|     private_key_pem = \ | ||||
|         _get_person_key(nickname, domain, base_dir, 'private', debug) | ||||
|         _get_person_key(nickname, account_domain, base_dir, 'private', debug) | ||||
|     if len(private_key_pem) == 0: | ||||
|         if debug: | ||||
|             print('DEBUG: Private key not found for ' + | ||||
|                   nickname + '@' + domain + | ||||
|                   nickname + '@' + account_domain + | ||||
|                   ' in ' + base_dir + '/keys/private') | ||||
|         return 6 | ||||
| 
 | ||||
|  | @ -2849,6 +2858,20 @@ def send_signed_json(post_json_object: {}, session, base_dir: str, | |||
|     # subsequent conversions after creating message body digest | ||||
|     post_json_str = json.dumps(post_json_object) | ||||
| 
 | ||||
|     # if the sender domain has changed from clearnet to onion or i2p | ||||
|     # then change the content of the post accordingly | ||||
|     if debug: | ||||
|         print('Checking for changed origin domain: ' + | ||||
|               domain + ' ' + curr_domain) | ||||
|     if domain != curr_domain: | ||||
|         if not curr_domain.endswith('.onion') and \ | ||||
|            not curr_domain.endswith('.i2p'): | ||||
|             if debug: | ||||
|                 print('Changing post content sender domain from ' + | ||||
|                       curr_domain + ' to ' + domain) | ||||
|             post_json_str = \ | ||||
|                 post_json_str.replace(curr_domain, domain) | ||||
| 
 | ||||
|     # construct the http header, including the message body digest | ||||
|     signature_header_json = \ | ||||
|         create_signed_header(None, private_key_pem, nickname, domain, port, | ||||
|  | @ -2881,6 +2904,7 @@ def send_signed_json(post_json_object: {}, session, base_dir: str, | |||
|         print('DEBUG: starting thread to send post') | ||||
|         pprint(post_json_object) | ||||
|     domain_full = get_full_domain(domain, port) | ||||
|     print('THREAD: thread_send_post 2') | ||||
|     thr = \ | ||||
|         thread_with_trace(target=thread_send_post, | ||||
|                           args=(session, | ||||
|  | @ -2981,7 +3005,7 @@ def _is_profile_update(post_json_object: {}) -> bool: | |||
|     return False | ||||
| 
 | ||||
| 
 | ||||
| def _send_to_named_addresses(session, session_onion, session_i2p, | ||||
| def _send_to_named_addresses(server, session, session_onion, session_i2p, | ||||
|                              base_dir: str, | ||||
|                              nickname: str, domain: str, | ||||
|                              onion_domain: str, i2p_domain: str, port: int, | ||||
|  | @ -2992,7 +3016,8 @@ def _send_to_named_addresses(session, session_onion, session_i2p, | |||
|                              project_version: str, | ||||
|                              shared_items_federated_domains: [], | ||||
|                              shared_item_federation_tokens: {}, | ||||
|                              signing_priv_key_pem: str) -> None: | ||||
|                              signing_priv_key_pem: str, | ||||
|                              proxy_type: str) -> None: | ||||
|     """sends a post to the specific named addresses in to/cc | ||||
|     """ | ||||
|     if not session: | ||||
|  | @ -3091,11 +3116,6 @@ def _send_to_named_addresses(session, session_onion, session_i2p, | |||
|                     print('Not sending profile update to self. ' + | ||||
|                           nickname + '@' + domain_full) | ||||
|                 continue | ||||
|         if debug: | ||||
|             domain_full = get_full_domain(domain, port) | ||||
|             to_domain_full = get_full_domain(to_domain, to_port) | ||||
|             print('DEBUG: Post sending s2s: ' + nickname + '@' + domain_full + | ||||
|                   ' to ' + to_nickname + '@' + to_domain_full) | ||||
| 
 | ||||
|         # if we have an alt onion domain and we are sending to | ||||
|         # another onion domain then switch the clearnet | ||||
|  | @ -3104,20 +3124,38 @@ def _send_to_named_addresses(session, session_onion, session_i2p, | |||
|         from_domain_full = get_full_domain(domain, port) | ||||
|         from_http_prefix = http_prefix | ||||
|         curr_session = session | ||||
|         curr_proxy_type = proxy_type | ||||
|         session_type = 'default' | ||||
|         if onion_domain: | ||||
|             if to_domain.endswith('.onion'): | ||||
|             if not from_domain.endswith('.onion') and \ | ||||
|                to_domain.endswith('.onion'): | ||||
|                 from_domain = onion_domain | ||||
|                 from_domain_full = onion_domain | ||||
|                 from_http_prefix = 'http' | ||||
|                 curr_session = session_onion | ||||
|                 port = 80 | ||||
|                 to_port = 80 | ||||
|                 curr_proxy_type = 'tor' | ||||
|                 session_type = 'tor' | ||||
|         if i2p_domain: | ||||
|             if to_domain.endswith('.i2p'): | ||||
|             if not from_domain.endswith('.i2p') and \ | ||||
|                to_domain.endswith('.i2p'): | ||||
|                 from_domain = i2p_domain | ||||
|                 from_domain_full = i2p_domain | ||||
|                 from_http_prefix = 'http' | ||||
|                 curr_session = session_i2p | ||||
|                 port = 80 | ||||
|                 to_port = 80 | ||||
|                 curr_proxy_type = 'i2p' | ||||
|                 session_type = 'i2p' | ||||
|         cc_list = [] | ||||
| 
 | ||||
|         if debug: | ||||
|             to_domain_full = get_full_domain(to_domain, to_port) | ||||
|             print('DEBUG: Post sending s2s: ' + | ||||
|                   nickname + '@' + from_domain_full + | ||||
|                   ' to ' + to_nickname + '@' + to_domain_full) | ||||
| 
 | ||||
|         # if the "to" domain is within the shared items | ||||
|         # federation list then send the token for this domain | ||||
|         # so that it can request a catalog | ||||
|  | @ -3129,6 +3167,16 @@ def _send_to_named_addresses(session, session_onion, session_i2p, | |||
| 
 | ||||
|         group_account = has_group_type(base_dir, address, person_cache) | ||||
| 
 | ||||
|         if not curr_session: | ||||
|             curr_session = create_session(curr_proxy_type) | ||||
|             if server: | ||||
|                 if session_type == 'tor': | ||||
|                     server.session_onion = curr_session | ||||
|                 elif session_type == 'i2p': | ||||
|                     server.session_i2p = curr_session | ||||
|                 else: | ||||
|                     server.session = curr_session | ||||
| 
 | ||||
|         send_signed_json(post_json_object, curr_session, base_dir, | ||||
|                          nickname, from_domain, port, | ||||
|                          to_nickname, to_domain, to_port, | ||||
|  | @ -3137,10 +3185,11 @@ def _send_to_named_addresses(session, session_onion, session_i2p, | |||
|                          send_threads, post_log, cached_webfingers, | ||||
|                          person_cache, debug, project_version, | ||||
|                          shared_items_token, group_account, | ||||
|                          signing_priv_key_pem, 34436782) | ||||
|                          signing_priv_key_pem, 34436782, | ||||
|                          domain, onion_domain, i2p_domain) | ||||
| 
 | ||||
| 
 | ||||
| def send_to_named_addresses_thread(session, session_onion, session_i2p, | ||||
| def send_to_named_addresses_thread(server, session, session_onion, session_i2p, | ||||
|                                    base_dir: str, nickname: str, domain: str, | ||||
|                                    onion_domain: str, | ||||
|                                    i2p_domain: str, port: int, | ||||
|  | @ -3151,12 +3200,14 @@ def send_to_named_addresses_thread(session, session_onion, session_i2p, | |||
|                                    project_version: str, | ||||
|                                    shared_items_federated_domains: [], | ||||
|                                    shared_item_federation_tokens: {}, | ||||
|                                    signing_priv_key_pem: str): | ||||
|                                    signing_priv_key_pem: str, | ||||
|                                    proxy_type: str): | ||||
|     """Returns a thread used to send a post to named addresses | ||||
|     """ | ||||
|     print('THREAD: _send_to_named_addresses') | ||||
|     send_thread = \ | ||||
|         thread_with_trace(target=_send_to_named_addresses, | ||||
|                           args=(session, session_onion, session_i2p, | ||||
|                           args=(server, session, session_onion, session_i2p, | ||||
|                                 base_dir, nickname, domain, | ||||
|                                 onion_domain, i2p_domain, port, | ||||
|                                 http_prefix, federation_list, | ||||
|  | @ -3166,7 +3217,8 @@ def send_to_named_addresses_thread(session, session_onion, session_i2p, | |||
|                                 project_version, | ||||
|                                 shared_items_federated_domains, | ||||
|                                 shared_item_federation_tokens, | ||||
|                                 signing_priv_key_pem), daemon=True) | ||||
|                                 signing_priv_key_pem, | ||||
|                                 proxy_type), daemon=True) | ||||
|     try: | ||||
|         send_thread.start() | ||||
|     except SocketError as ex: | ||||
|  | @ -3213,7 +3265,7 @@ def _sending_profile_update(post_json_object: {}) -> bool: | |||
|     return False | ||||
| 
 | ||||
| 
 | ||||
| def send_to_followers(session, session_onion, session_i2p, | ||||
| def send_to_followers(server, session, session_onion, session_i2p, | ||||
|                       base_dir: str, nickname: str, domain: str, | ||||
|                       onion_domain: str, i2p_domain: str, port: int, | ||||
|                       http_prefix: str, federation_list: [], | ||||
|  | @ -3246,6 +3298,12 @@ def send_to_followers(session, session_onion, session_i2p, | |||
|     # this is after the message has arrived at the server | ||||
|     client_to_server = False | ||||
| 
 | ||||
|     curr_proxy_type = None | ||||
|     if domain.endswith('.onion'): | ||||
|         curr_proxy_type = 'tor' | ||||
|     elif domain.endswith('.i2p'): | ||||
|         curr_proxy_type = 'i2p' | ||||
| 
 | ||||
|     # for each instance | ||||
|     sending_start_time = datetime.datetime.utcnow() | ||||
|     print('Sending post to followers begins ' + | ||||
|  | @ -3289,10 +3347,6 @@ def send_to_followers(session, session_onion, session_i2p, | |||
|             if follower_domain.endswith('.i2p'): | ||||
|                 curr_session = session_i2p | ||||
|                 curr_http_prefix = 'http' | ||||
|         if not curr_session: | ||||
|             print('WARN: session not found when sending to follower ' + | ||||
|                   follower_domain_url) | ||||
|             continue | ||||
| 
 | ||||
|         with_shared_inbox = \ | ||||
|             _has_shared_inbox(curr_session, curr_http_prefix, follower_domain, | ||||
|  | @ -3317,14 +3371,33 @@ def send_to_followers(session, session_onion, session_i2p, | |||
|         # have an alt onion domain then use the alt | ||||
|         from_domain = domain | ||||
|         from_http_prefix = http_prefix | ||||
|         session_type = 'default' | ||||
|         if onion_domain: | ||||
|             if to_domain.endswith('.onion'): | ||||
|                 from_domain = onion_domain | ||||
|                 from_http_prefix = 'http' | ||||
|                 port = 80 | ||||
|                 to_port = 80 | ||||
|                 curr_proxy_type = 'tor' | ||||
|                 session_type = 'tor' | ||||
|         if i2p_domain: | ||||
|             if to_domain.endswith('.i2p'): | ||||
|                 from_domain = i2p_domain | ||||
|                 from_http_prefix = 'http' | ||||
|                 port = 80 | ||||
|                 to_port = 80 | ||||
|                 curr_proxy_type = 'i2p' | ||||
|                 session_type = 'i2p' | ||||
| 
 | ||||
|         if not curr_session: | ||||
|             curr_session = create_session(curr_proxy_type) | ||||
|             if server: | ||||
|                 if session_type == 'tor': | ||||
|                     server.session_onion = curr_session | ||||
|                 elif session_type == 'i2p': | ||||
|                     server.session_i2p = curr_session | ||||
|                 else: | ||||
|                     server.session = curr_session | ||||
| 
 | ||||
|         if with_shared_inbox: | ||||
|             to_nickname = follower_handles[index].split('@')[0] | ||||
|  | @ -3357,7 +3430,8 @@ def send_to_followers(session, session_onion, session_i2p, | |||
|                              send_threads, post_log, cached_webfingers, | ||||
|                              person_cache, debug, project_version, | ||||
|                              shared_items_token, group_account, | ||||
|                              signing_priv_key_pem, 639342) | ||||
|                              signing_priv_key_pem, 639342, | ||||
|                              domain, onion_domain, i2p_domain) | ||||
|         else: | ||||
|             # send to individual followers without using a shared inbox | ||||
|             for handle in follower_handles: | ||||
|  | @ -3386,7 +3460,8 @@ def send_to_followers(session, session_onion, session_i2p, | |||
|                                  send_threads, post_log, cached_webfingers, | ||||
|                                  person_cache, debug, project_version, | ||||
|                                  shared_items_token, group_account, | ||||
|                                  signing_priv_key_pem, 634219) | ||||
|                                  signing_priv_key_pem, 634219, | ||||
|                                  domain, onion_domain, i2p_domain) | ||||
| 
 | ||||
|         time.sleep(4) | ||||
| 
 | ||||
|  | @ -3399,7 +3474,7 @@ def send_to_followers(session, session_onion, session_i2p, | |||
|     print('Sending post to followers ends ' + str(sending_mins) + ' mins') | ||||
| 
 | ||||
| 
 | ||||
| def send_to_followers_thread(session, session_onion, session_i2p, | ||||
| def send_to_followers_thread(server, session, session_onion, session_i2p, | ||||
|                              base_dir: str, nickname: str, domain: str, | ||||
|                              onion_domain: str, i2p_domain: str, port: int, | ||||
|                              http_prefix: str, federation_list: [], | ||||
|  | @ -3412,9 +3487,10 @@ def send_to_followers_thread(session, session_onion, session_i2p, | |||
|                              signing_priv_key_pem: str): | ||||
|     """Returns a thread used to send a post to followers | ||||
|     """ | ||||
|     print('THREAD: send_to_followers') | ||||
|     send_thread = \ | ||||
|         thread_with_trace(target=send_to_followers, | ||||
|                           args=(session, session_onion, session_i2p, | ||||
|                           args=(server, session, session_onion, session_i2p, | ||||
|                                 base_dir, nickname, domain, | ||||
|                                 onion_domain, i2p_domain, port, | ||||
|                                 http_prefix, federation_list, | ||||
|  |  | |||
							
								
								
									
										13
									
								
								reaction.py
								
								
								
								
							
							
						
						
									
										13
									
								
								reaction.py
								
								
								
								
							|  | @ -70,7 +70,9 @@ def _reactionpost(recent_posts_cache: {}, | |||
|                   send_threads: [], post_log: [], | ||||
|                   person_cache: {}, cached_webfingers: {}, | ||||
|                   debug: bool, project_version: str, | ||||
|                   signing_priv_key_pem: str) -> {}: | ||||
|                   signing_priv_key_pem: str, | ||||
|                   curr_domain: str, | ||||
|                   onion_domain: str, i2p_domain: str) -> {}: | ||||
|     """Creates an emoji reaction | ||||
|     actor is the person doing the reacting | ||||
|     'to' might be a specific person (actor) whose post was reaction | ||||
|  | @ -141,7 +143,8 @@ def _reactionpost(recent_posts_cache: {}, | |||
|                          send_threads, post_log, cached_webfingers, | ||||
|                          person_cache, | ||||
|                          debug, project_version, None, group_account, | ||||
|                          signing_priv_key_pem, 7165392) | ||||
|                          signing_priv_key_pem, 7165392, | ||||
|                          curr_domain, onion_domain, i2p_domain) | ||||
| 
 | ||||
|     return new_reaction_json | ||||
| 
 | ||||
|  | @ -156,7 +159,8 @@ def reaction_post(recent_posts_cache: {}, | |||
|                   send_threads: [], post_log: [], | ||||
|                   person_cache: {}, cached_webfingers: {}, | ||||
|                   debug: bool, project_version: str, | ||||
|                   signing_priv_key_pem: str) -> {}: | ||||
|                   signing_priv_key_pem: str, | ||||
|                   curr_domain: str, onion_domain: str, i2p_domain: str) -> {}: | ||||
|     """Adds a reaction to a given status post. This is only used by unit tests | ||||
|     """ | ||||
|     reaction_domain = get_full_domain(reaction_domain, reaction_port) | ||||
|  | @ -172,7 +176,8 @@ def reaction_post(recent_posts_cache: {}, | |||
|                          actor_reaction, client_to_server, | ||||
|                          send_threads, post_log, person_cache, | ||||
|                          cached_webfingers, | ||||
|                          debug, project_version, signing_priv_key_pem) | ||||
|                          debug, project_version, signing_priv_key_pem, | ||||
|                          curr_domain, onion_domain, i2p_domain) | ||||
| 
 | ||||
| 
 | ||||
| def send_reaction_via_server(base_dir: str, session, | ||||
|  |  | |||
|  | @ -193,7 +193,7 @@ def run_post_schedule(base_dir: str, httpd, max_scheduled_posts: int): | |||
| def run_post_schedule_watchdog(project_version: str, httpd) -> None: | ||||
|     """This tries to keep the scheduled post thread running even if it dies | ||||
|     """ | ||||
|     print('Starting scheduled post watchdog') | ||||
|     print('THREAD: Starting scheduled post watchdog') | ||||
|     post_schedule_original = \ | ||||
|         httpd.thrPostSchedule.clone(run_post_schedule) | ||||
|     httpd.thrPostSchedule.start() | ||||
|  | @ -202,6 +202,7 @@ def run_post_schedule_watchdog(project_version: str, httpd) -> None: | |||
|         if httpd.thrPostSchedule.is_alive(): | ||||
|             continue | ||||
|         httpd.thrPostSchedule.kill() | ||||
|         print('THREAD: restarting scheduled post watchdog') | ||||
|         httpd.thrPostSchedule = \ | ||||
|             post_schedule_original.clone(run_post_schedule) | ||||
|         httpd.thrPostSchedule.start() | ||||
|  |  | |||
|  | @ -0,0 +1,7 @@ | |||
| #!/bin/bash | ||||
| journalctl -u epicyon | grep 'required positional arguments' > .missing_arguments.txt | ||||
| if [ ! -f .missing_arguments.txt ]; then | ||||
|     echo 'No missing arguments' | ||||
| else | ||||
|     cat .missing_arguments.txt | ||||
| fi | ||||
|  | @ -0,0 +1,7 @@ | |||
| #!/bin/bash | ||||
| journalctl -u epicyon | grep 'THREAD:' > .threads.txt | ||||
| if [ ! -f .threads.txt ]; then | ||||
|     echo 'No thread events' | ||||
| else | ||||
|     cat .threads.txt | ||||
| fi | ||||
|  | @ -1610,7 +1610,7 @@ def run_federated_shares_watchdog(project_version: str, httpd) -> None: | |||
|     """This tries to keep the federated shares update thread | ||||
|     running even if it dies | ||||
|     """ | ||||
|     print('Starting federated shares watchdog') | ||||
|     print('THREAD: Starting federated shares watchdog') | ||||
|     federated_shares_original = \ | ||||
|         httpd.thrPostSchedule.clone(run_federated_shares_daemon) | ||||
|     httpd.thrFederatedSharesDaemon.start() | ||||
|  | @ -1619,6 +1619,7 @@ def run_federated_shares_watchdog(project_version: str, httpd) -> None: | |||
|         if httpd.thrFederatedSharesDaemon.is_alive(): | ||||
|             continue | ||||
|         httpd.thrFederatedSharesDaemon.kill() | ||||
|         print('THREAD: restarting federated shares watchdog') | ||||
|         httpd.thrFederatedSharesDaemon = \ | ||||
|             federated_shares_original.clone(run_federated_shares_daemon) | ||||
|         httpd.thrFederatedSharesDaemon.start() | ||||
|  |  | |||
							
								
								
									
										53
									
								
								tests.py
								
								
								
								
							
							
						
						
									
										53
									
								
								tests.py
								
								
								
								
							|  | @ -51,7 +51,7 @@ from posts import send_post_via_server | |||
| from posts import seconds_between_published | ||||
| from follow import clear_follows | ||||
| from follow import clear_followers | ||||
| from follow import send_follow_requestViaServer | ||||
| from follow import send_follow_request_via_server | ||||
| from follow import send_unfollow_request_via_server | ||||
| from siteactive import site_is_active | ||||
| from utils import convert_published_to_local_timezone | ||||
|  | @ -1393,7 +1393,8 @@ def test_post_message_between_servers(base_dir: str) -> None: | |||
|                      'alice', alice_domain, alice_port, [], | ||||
|                      status_number, False, bob_send_threads, bob_post_log, | ||||
|                      bob_person_cache, bob_cached_webfingers, | ||||
|                      True, __version__, signing_priv_key_pem) | ||||
|                      True, __version__, signing_priv_key_pem, | ||||
|                      bob_domain, None, None) | ||||
| 
 | ||||
|     for _ in range(20): | ||||
|         if 'likes' in open(outbox_post_filename).read(): | ||||
|  | @ -1415,7 +1416,8 @@ def test_post_message_between_servers(base_dir: str) -> None: | |||
|                          status_number, '😀', | ||||
|                          False, bob_send_threads, bob_post_log, | ||||
|                          bob_person_cache, bob_cached_webfingers, | ||||
|                          True, __version__, signing_priv_key_pem) | ||||
|                          True, __version__, signing_priv_key_pem, | ||||
|                          bob_domain, None, None) | ||||
| 
 | ||||
|     for i in range(20): | ||||
|         if 'reactions' in open(outbox_post_filename).read(): | ||||
|  | @ -1451,10 +1453,11 @@ def test_post_message_between_servers(base_dir: str) -> None: | |||
|                     object_url, | ||||
|                     False, bob_send_threads, bob_post_log, | ||||
|                     bob_person_cache, bob_cached_webfingers, | ||||
|                     True, __version__, signing_priv_key_pem) | ||||
|                     True, __version__, signing_priv_key_pem, | ||||
|                     bob_domain, None, None) | ||||
|     announce_message_arrived = False | ||||
|     outbox_message_arrived = False | ||||
|     for i in range(10): | ||||
|     for i in range(20): | ||||
|         time.sleep(1) | ||||
|         if not os.path.isdir(inbox_path): | ||||
|             continue | ||||
|  | @ -1597,7 +1600,8 @@ def test_follow_between_servers(base_dir: str) -> None: | |||
|                             client_to_server, federation_list, | ||||
|                             alice_send_threads, alice_post_log, | ||||
|                             alice_cached_webfingers, alice_person_cache, | ||||
|                             True, __version__, signing_priv_key_pem) | ||||
|                             True, __version__, signing_priv_key_pem, | ||||
|                             alice_domain, None, None) | ||||
|     print('send_result: ' + str(send_result)) | ||||
| 
 | ||||
|     for _ in range(16): | ||||
|  | @ -1818,7 +1822,8 @@ def test_shared_items_federation(base_dir: str) -> None: | |||
|                             client_to_server, federation_list, | ||||
|                             alice_send_threads, alice_post_log, | ||||
|                             alice_cached_webfingers, alice_person_cache, | ||||
|                             True, __version__, signing_priv_key_pem) | ||||
|                             True, __version__, signing_priv_key_pem, | ||||
|                             alice_domain, None, None) | ||||
|     print('send_result: ' + str(send_result)) | ||||
| 
 | ||||
|     for _ in range(16): | ||||
|  | @ -2270,7 +2275,8 @@ def test_group_follow(base_dir: str) -> None: | |||
|                             client_to_server, federation_list, | ||||
|                             alice_send_threads, alice_post_log, | ||||
|                             alice_cached_webfingers, alice_person_cache, | ||||
|                             True, __version__, signing_priv_key_pem) | ||||
|                             True, __version__, signing_priv_key_pem, | ||||
|                             alice_domain, None, None) | ||||
|     print('send_result: ' + str(send_result)) | ||||
| 
 | ||||
|     alice_following_filename = \ | ||||
|  | @ -2348,7 +2354,8 @@ def test_group_follow(base_dir: str) -> None: | |||
|                             client_to_server, federation_list, | ||||
|                             bob_send_threads, bob_post_log, | ||||
|                             bob_cached_webfingers, bob_person_cache, | ||||
|                             True, __version__, signing_priv_key_pem) | ||||
|                             True, __version__, signing_priv_key_pem, | ||||
|                             bob_domain, None, None) | ||||
|     print('send_result: ' + str(send_result)) | ||||
| 
 | ||||
|     bob_following_filename = \ | ||||
|  | @ -3094,13 +3101,13 @@ def test_client_to_server(base_dir: str): | |||
| 
 | ||||
|     print('\n\nAlice follows Bob') | ||||
|     signing_priv_key_pem = None | ||||
|     send_follow_requestViaServer(alice_dir, session_alice, | ||||
|                                  'alice', password, | ||||
|                                  alice_domain, alice_port, | ||||
|                                  'bob', bob_domain, bob_port, | ||||
|                                  http_prefix, | ||||
|                                  cached_webfingers, person_cache, | ||||
|                                  True, __version__, signing_priv_key_pem) | ||||
|     send_follow_request_via_server(alice_dir, session_alice, | ||||
|                                    'alice', password, | ||||
|                                    alice_domain, alice_port, | ||||
|                                    'bob', bob_domain, bob_port, | ||||
|                                    http_prefix, | ||||
|                                    cached_webfingers, person_cache, | ||||
|                                    True, __version__, signing_priv_key_pem) | ||||
|     alice_petnames_filename = alice_dir + '/accounts/' + \ | ||||
|         'alice@' + alice_domain + '/petnames.txt' | ||||
|     alice_following_filename = \ | ||||
|  | @ -3136,13 +3143,13 @@ def test_client_to_server(base_dir: str): | |||
|                                  alice_domain, alice_port) | ||||
| 
 | ||||
|     print('\n\nEVENT: Bob follows Alice') | ||||
|     send_follow_requestViaServer(alice_dir, session_alice, | ||||
|                                  'bob', 'bobpass', | ||||
|                                  bob_domain, bob_port, | ||||
|                                  'alice', alice_domain, alice_port, | ||||
|                                  http_prefix, | ||||
|                                  cached_webfingers, person_cache, | ||||
|                                  True, __version__, signing_priv_key_pem) | ||||
|     send_follow_request_via_server(alice_dir, session_alice, | ||||
|                                    'bob', 'bobpass', | ||||
|                                    bob_domain, bob_port, | ||||
|                                    'alice', alice_domain, alice_port, | ||||
|                                    http_prefix, | ||||
|                                    cached_webfingers, person_cache, | ||||
|                                    True, __version__, signing_priv_key_pem) | ||||
|     for _ in range(10): | ||||
|         if os.path.isfile(alice_dir + '/accounts/alice@' + alice_domain + | ||||
|                           '/followers.txt'): | ||||
|  |  | |||
							
								
								
									
										9
									
								
								theme.py
								
								
								
								
							
							
						
						
									
										9
									
								
								theme.py
								
								
								
								
							|  | @ -861,16 +861,11 @@ def set_theme(base_dir: str, name: str, domain: str, | |||
| 
 | ||||
|     _remove_theme(base_dir) | ||||
| 
 | ||||
|     # has the theme changed? | ||||
|     themes = get_themes_list(base_dir) | ||||
|     for theme_name in themes: | ||||
|         theme_name_lower = theme_name.lower() | ||||
|         if name == theme_name_lower: | ||||
|             allow_access = allow_local_network_access | ||||
|             try: | ||||
|                 globals()['set_theme' + theme_name](base_dir, allow_access) | ||||
|             except BaseException: | ||||
|                 print('EX: set_theme unable to set theme ' + theme_name) | ||||
| 
 | ||||
|             if prev_theme_name: | ||||
|                 if prev_theme_name.lower() != theme_name_lower: | ||||
|                     # change the banner and profile image | ||||
|  | @ -878,12 +873,14 @@ def set_theme(base_dir: str, name: str, domain: str, | |||
|                     _set_theme_images(base_dir, name) | ||||
|                     _set_theme_fonts(base_dir, name) | ||||
|             result = True | ||||
|             break | ||||
| 
 | ||||
|     if not result: | ||||
|         # default | ||||
|         _set_theme_default(base_dir, allow_local_network_access) | ||||
|         result = True | ||||
| 
 | ||||
|     # read theme settings from a json file in the theme directory | ||||
|     variables_file = base_dir + '/theme/' + name + '/theme.json' | ||||
|     if os.path.isfile(variables_file): | ||||
|         _read_variables_file(base_dir, name, variables_file, | ||||
|  |  | |||
|  | @ -75,6 +75,7 @@ class thread_with_trace(threading.Thread): | |||
|     def clone(self, func): | ||||
|         """Create a clone | ||||
|         """ | ||||
|         print('THREAD: clone') | ||||
|         return thread_with_trace(target=func, | ||||
|                                  args=self._args, | ||||
|                                  daemon=True) | ||||
|  |  | |||
							
								
								
									
										14
									
								
								webfinger.py
								
								
								
								
							
							
						
						
									
										14
									
								
								webfinger.py
								
								
								
								
							|  | @ -245,7 +245,7 @@ def webfinger_meta(http_prefix: str, domain_full: str) -> str: | |||
| 
 | ||||
| 
 | ||||
| def webfinger_lookup(path: str, base_dir: str, | ||||
|                      domain: str, onion_domain: str, | ||||
|                      domain: str, onion_domain: str, i2p_domain: str, | ||||
|                      port: int, debug: bool) -> {}: | ||||
|     """Lookup the webfinger endpoint for an account | ||||
|     """ | ||||
|  | @ -287,6 +287,11 @@ def webfinger_lookup(path: str, base_dir: str, | |||
|         if onion_domain in handle: | ||||
|             handle = handle.replace(onion_domain, domain) | ||||
|             onionify = True | ||||
|     i2pify = False | ||||
|     if i2p_domain: | ||||
|         if i2p_domain in handle: | ||||
|             handle = handle.replace(i2p_domain, domain) | ||||
|             i2pify = True | ||||
|     # instance actor | ||||
|     if handle.startswith('actor@'): | ||||
|         handle = handle.replace('actor@', 'inbox@', 1) | ||||
|  | @ -299,11 +304,14 @@ def webfinger_lookup(path: str, base_dir: str, | |||
|         if debug: | ||||
|             print('DEBUG: WEBFINGER filename not found ' + filename) | ||||
|         return None | ||||
|     if not onionify: | ||||
|     if not onionify and not i2pify: | ||||
|         wf_json = load_json(filename) | ||||
|     else: | ||||
|     elif onionify: | ||||
|         print('Webfinger request for onionified ' + handle) | ||||
|         wf_json = load_json_onionify(filename, domain, onion_domain) | ||||
|     else: | ||||
|         print('Webfinger request for i2pified ' + handle) | ||||
|         wf_json = load_json_onionify(filename, domain, i2p_domain) | ||||
|     if not wf_json: | ||||
|         wf_json = {"nickname": "unknown"} | ||||
|     return wf_json | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue