| 
									
										
										
										
											2024-03-04 11:33:51 +00:00
										 |  |  | __filename__ = "daemon_post_image.py" | 
					
						
							|  |  |  | __author__ = "Bob Mottram" | 
					
						
							|  |  |  | __license__ = "AGPL3+" | 
					
						
							|  |  |  | __version__ = "1.5.0" | 
					
						
							|  |  |  | __maintainer__ = "Bob Mottram" | 
					
						
							|  |  |  | __email__ = "bob@libreserver.org" | 
					
						
							|  |  |  | __status__ = "Production" | 
					
						
							| 
									
										
										
										
											2024-03-23 15:11:05 +00:00
										 |  |  | __module_group__ = "Core POST" | 
					
						
							| 
									
										
										
										
											2024-03-04 11:33:51 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import errno | 
					
						
							|  |  |  | import urllib.parse | 
					
						
							|  |  |  | from socket import error as SocketError | 
					
						
							|  |  |  | from httpheaders import redirect_headers | 
					
						
							|  |  |  | from utils import acct_dir | 
					
						
							|  |  |  | from utils import save_json | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def keyboard_shortcuts(self, calling_domain: str, cookie: str, | 
					
						
							|  |  |  |                        base_dir: str, http_prefix: str, nickname: str, | 
					
						
							|  |  |  |                        domain: str, domain_full: str, | 
					
						
							|  |  |  |                        onion_domain: str, i2p_domain: str, | 
					
						
							| 
									
										
										
										
											2024-04-13 09:08:53 +00:00
										 |  |  |                        access_keys2: {}, default_timeline: str, | 
					
						
							|  |  |  |                        access_keys: {}, key_shortcuts: {}) -> None: | 
					
						
							| 
									
										
										
										
											2024-03-04 11:33:51 +00:00
										 |  |  |     """Receive POST from webapp_accesskeys
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     users_path = '/users/' + nickname | 
					
						
							|  |  |  |     origin_path_str = \ | 
					
						
							|  |  |  |         http_prefix + '://' + domain_full + users_path + '/' + \ | 
					
						
							|  |  |  |         default_timeline | 
					
						
							|  |  |  |     length = int(self.headers['Content-length']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         access_keys_params = self.rfile.read(length).decode('utf-8') | 
					
						
							|  |  |  |     except SocketError as ex: | 
					
						
							|  |  |  |         if ex.errno == errno.ECONNRESET: | 
					
						
							|  |  |  |             print('EX: POST access_keys_params ' + | 
					
						
							|  |  |  |                   'connection reset by peer') | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             print('EX: POST access_keys_params socket error') | 
					
						
							|  |  |  |         self.send_response(400) | 
					
						
							|  |  |  |         self.end_headers() | 
					
						
							|  |  |  |         self.server.postreq_busy = False | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     except ValueError as ex: | 
					
						
							|  |  |  |         print('EX: POST access_keys_params rfile.read failed, ' + | 
					
						
							|  |  |  |               str(ex)) | 
					
						
							|  |  |  |         self.send_response(400) | 
					
						
							|  |  |  |         self.end_headers() | 
					
						
							|  |  |  |         self.server.postreq_busy = False | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     access_keys_params = \ | 
					
						
							|  |  |  |         urllib.parse.unquote_plus(access_keys_params) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # key shortcuts screen, back button | 
					
						
							|  |  |  |     # See html_access_keys | 
					
						
							|  |  |  |     if 'submitAccessKeysCancel=' in access_keys_params or \ | 
					
						
							|  |  |  |        'submitAccessKeys=' not in access_keys_params: | 
					
						
							|  |  |  |         if calling_domain.endswith('.onion') and onion_domain: | 
					
						
							|  |  |  |             origin_path_str = \ | 
					
						
							|  |  |  |                 'http://' + onion_domain + users_path + '/' + \ | 
					
						
							|  |  |  |                 default_timeline | 
					
						
							|  |  |  |         elif calling_domain.endswith('.i2p') and i2p_domain: | 
					
						
							|  |  |  |             origin_path_str = \ | 
					
						
							|  |  |  |                 'http://' + i2p_domain + users_path + \ | 
					
						
							|  |  |  |                 '/' + default_timeline | 
					
						
							| 
									
										
										
										
											2024-04-16 13:47:21 +00:00
										 |  |  |         redirect_headers(self, origin_path_str, cookie, calling_domain, 303) | 
					
						
							| 
									
										
										
										
											2024-03-04 11:33:51 +00:00
										 |  |  |         self.server.postreq_busy = False | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     save_keys = False | 
					
						
							| 
									
										
										
										
											2024-04-13 09:08:53 +00:00
										 |  |  |     access_keys_template = access_keys | 
					
						
							| 
									
										
										
										
											2024-03-04 11:33:51 +00:00
										 |  |  |     for variable_name, _ in access_keys_template.items(): | 
					
						
							| 
									
										
										
										
											2024-04-13 09:08:53 +00:00
										 |  |  |         if not access_keys2.get(variable_name): | 
					
						
							|  |  |  |             access_keys2[variable_name] = \ | 
					
						
							| 
									
										
										
										
											2024-03-04 11:33:51 +00:00
										 |  |  |                 access_keys_template[variable_name] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         variable_name2 = variable_name.replace(' ', '_') | 
					
						
							|  |  |  |         if variable_name2 + '=' in access_keys_params: | 
					
						
							|  |  |  |             new_key = access_keys_params.split(variable_name2 + '=')[1] | 
					
						
							|  |  |  |             if '&' in new_key: | 
					
						
							|  |  |  |                 new_key = new_key.split('&')[0] | 
					
						
							|  |  |  |             if new_key: | 
					
						
							|  |  |  |                 if len(new_key) > 1: | 
					
						
							|  |  |  |                     new_key = new_key[0] | 
					
						
							| 
									
										
										
										
											2024-04-13 09:08:53 +00:00
										 |  |  |                 if new_key != access_keys2[variable_name]: | 
					
						
							|  |  |  |                     access_keys2[variable_name] = new_key | 
					
						
							| 
									
										
										
										
											2024-03-04 11:33:51 +00:00
										 |  |  |                     save_keys = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if save_keys: | 
					
						
							|  |  |  |         access_keys_filename = \ | 
					
						
							|  |  |  |             acct_dir(base_dir, nickname, domain) + '/access_keys.json' | 
					
						
							| 
									
										
										
										
											2024-04-13 09:08:53 +00:00
										 |  |  |         save_json(access_keys2, access_keys_filename) | 
					
						
							|  |  |  |         if not key_shortcuts.get(nickname): | 
					
						
							|  |  |  |             key_shortcuts[nickname] = access_keys2.copy() | 
					
						
							| 
									
										
										
										
											2024-03-04 11:33:51 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # redirect back from key shortcuts screen | 
					
						
							|  |  |  |     if calling_domain.endswith('.onion') and onion_domain: | 
					
						
							|  |  |  |         origin_path_str = \ | 
					
						
							|  |  |  |             'http://' + onion_domain + users_path + '/' + default_timeline | 
					
						
							|  |  |  |     elif calling_domain.endswith('.i2p') and i2p_domain: | 
					
						
							|  |  |  |         origin_path_str = \ | 
					
						
							|  |  |  |             'http://' + i2p_domain + users_path + '/' + default_timeline | 
					
						
							| 
									
										
										
										
											2024-04-16 13:47:21 +00:00
										 |  |  |     redirect_headers(self, origin_path_str, cookie, calling_domain, 303) | 
					
						
							| 
									
										
										
										
											2024-03-04 11:33:51 +00:00
										 |  |  |     self.server.postreq_busy = False | 
					
						
							|  |  |  |     return |