| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  | __filename__ = "daemon_get_newswire.py" | 
					
						
							|  |  |  | __author__ = "Bob Mottram" | 
					
						
							|  |  |  | __license__ = "AGPL3+" | 
					
						
							| 
									
										
										
										
											2024-12-22 23:37:30 +00:00
										 |  |  | __version__ = "1.6.0" | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  | __maintainer__ = "Bob Mottram" | 
					
						
							|  |  |  | __email__ = "bob@libreserver.org" | 
					
						
							|  |  |  | __status__ = "Production" | 
					
						
							| 
									
										
										
										
											2024-12-25 14:31:14 +00:00
										 |  |  | __module_group__ = "Daemon GET" | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import urllib.parse | 
					
						
							|  |  |  | from session import establish_session | 
					
						
							|  |  |  | from httpcodes import write2 | 
					
						
							|  |  |  | from httpcodes import http_404 | 
					
						
							|  |  |  | from httpheaders import redirect_headers | 
					
						
							|  |  |  | from httpheaders import set_headers | 
					
						
							|  |  |  | from newswire import get_rss_from_dict | 
					
						
							|  |  |  | from fitnessFunctions import fitness_performance | 
					
						
							|  |  |  | from posts import is_moderator | 
					
						
							| 
									
										
										
										
											2024-05-12 12:35:26 +00:00
										 |  |  | from utils import data_dir | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  | from utils import local_actor_url | 
					
						
							|  |  |  | from utils import save_json | 
					
						
							|  |  |  | from webapp_column_right import html_edit_news_post | 
					
						
							|  |  |  | from webapp_column_right import html_edit_newswire | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_newswire_feed(self, calling_domain: str, path: str, | 
					
						
							|  |  |  |                       proxy_type: str, getreq_start_time, | 
					
						
							| 
									
										
										
										
											2024-04-11 15:24:43 +00:00
										 |  |  |                       debug: bool, curr_session, | 
					
						
							|  |  |  |                       newswire: {}, http_prefix: str, | 
					
						
							|  |  |  |                       domain_full: str, translate: {}, | 
					
						
							|  |  |  |                       fitness: {}) -> None: | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  |     """Returns the newswire feed
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     curr_session = \ | 
					
						
							|  |  |  |         establish_session("get_newswire_feed", | 
					
						
							|  |  |  |                           curr_session, | 
					
						
							|  |  |  |                           proxy_type, | 
					
						
							|  |  |  |                           self.server) | 
					
						
							|  |  |  |     if not curr_session: | 
					
						
							|  |  |  |         http_404(self, 25) | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-11 15:24:43 +00:00
										 |  |  |     msg = get_rss_from_dict(newswire, http_prefix, domain_full, translate) | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  |     if msg: | 
					
						
							|  |  |  |         msg = msg.encode('utf-8') | 
					
						
							|  |  |  |         msglen = len(msg) | 
					
						
							|  |  |  |         set_headers(self, 'text/xml', msglen, | 
					
						
							|  |  |  |                     None, calling_domain, True) | 
					
						
							|  |  |  |         write2(self, msg) | 
					
						
							|  |  |  |         if debug: | 
					
						
							|  |  |  |             print('Sent rss2 newswire feed: ' + | 
					
						
							|  |  |  |                   path + ' ' + calling_domain) | 
					
						
							| 
									
										
										
										
											2024-04-11 15:24:43 +00:00
										 |  |  |         fitness_performance(getreq_start_time, fitness, | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  |                             '_GET', '_get_newswire_feed', | 
					
						
							|  |  |  |                             debug) | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     if debug: | 
					
						
							|  |  |  |         print('Failed to get rss2 newswire feed: ' + | 
					
						
							|  |  |  |               path + ' ' + calling_domain) | 
					
						
							|  |  |  |     http_404(self, 26) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def newswire_vote(self, calling_domain: str, path: str, | 
					
						
							|  |  |  |                   cookie: str, | 
					
						
							|  |  |  |                   base_dir: str, http_prefix: str, | 
					
						
							|  |  |  |                   domain_full: str, | 
					
						
							|  |  |  |                   onion_domain: str, i2p_domain: str, | 
					
						
							|  |  |  |                   getreq_start_time, | 
					
						
							| 
									
										
										
										
											2024-04-11 15:24:43 +00:00
										 |  |  |                   newswire: {}, default_timeline: str, | 
					
						
							|  |  |  |                   fitness: {}, debug: bool) -> None: | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  |     """Vote for a newswire item
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     origin_path_str = path.split('/newswirevote=')[0] | 
					
						
							|  |  |  |     date_str = \ | 
					
						
							|  |  |  |         path.split('/newswirevote=')[1].replace('T', ' ') | 
					
						
							|  |  |  |     date_str = date_str.replace(' 00:00', '').replace('+00:00', '') | 
					
						
							|  |  |  |     date_str = urllib.parse.unquote_plus(date_str) + '+00:00' | 
					
						
							|  |  |  |     nickname = \ | 
					
						
							|  |  |  |         urllib.parse.unquote_plus(origin_path_str.split('/users/')[1]) | 
					
						
							|  |  |  |     if '/' in nickname: | 
					
						
							|  |  |  |         nickname = nickname.split('/')[0] | 
					
						
							|  |  |  |     print('Newswire item date: ' + date_str) | 
					
						
							|  |  |  |     if newswire.get(date_str): | 
					
						
							|  |  |  |         if is_moderator(base_dir, nickname): | 
					
						
							|  |  |  |             newswire_item = newswire[date_str] | 
					
						
							|  |  |  |             print('Voting on newswire item: ' + str(newswire_item)) | 
					
						
							|  |  |  |             votes_index = 2 | 
					
						
							|  |  |  |             filename_index = 3 | 
					
						
							|  |  |  |             if 'vote:' + nickname not in newswire_item[votes_index]: | 
					
						
							|  |  |  |                 newswire_item[votes_index].append('vote:' + nickname) | 
					
						
							|  |  |  |                 filename = newswire_item[filename_index] | 
					
						
							|  |  |  |                 newswire_state_filename = \ | 
					
						
							| 
									
										
										
										
											2024-05-12 12:35:26 +00:00
										 |  |  |                     data_dir(base_dir) + '/.newswirestate.json' | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  |                 try: | 
					
						
							|  |  |  |                     save_json(newswire, newswire_state_filename) | 
					
						
							|  |  |  |                 except BaseException as ex: | 
					
						
							|  |  |  |                     print('EX: saving newswire state, ' + str(ex)) | 
					
						
							|  |  |  |                 if filename: | 
					
						
							|  |  |  |                     save_json(newswire_item[votes_index], | 
					
						
							|  |  |  |                               filename + '.votes') | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         print('No newswire item with date: ' + date_str + ' ' + | 
					
						
							|  |  |  |               str(newswire)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     origin_path_str_absolute = \ | 
					
						
							|  |  |  |         http_prefix + '://' + domain_full + origin_path_str + '/' + \ | 
					
						
							| 
									
										
										
										
											2024-04-11 15:24:43 +00:00
										 |  |  |         default_timeline | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  |     if calling_domain.endswith('.onion') and onion_domain: | 
					
						
							|  |  |  |         origin_path_str_absolute = \ | 
					
						
							|  |  |  |             'http://' + onion_domain + origin_path_str | 
					
						
							|  |  |  |     elif (calling_domain.endswith('.i2p') and i2p_domain): | 
					
						
							|  |  |  |         origin_path_str_absolute = \ | 
					
						
							|  |  |  |             'http://' + i2p_domain + origin_path_str | 
					
						
							| 
									
										
										
										
											2024-04-11 15:24:43 +00:00
										 |  |  |     fitness_performance(getreq_start_time, fitness, | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  |                         '_GET', '_newswire_vote', | 
					
						
							| 
									
										
										
										
											2024-04-11 15:24:43 +00:00
										 |  |  |                         debug) | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  |     redirect_headers(self, origin_path_str_absolute, | 
					
						
							| 
									
										
										
										
											2024-04-16 13:47:21 +00:00
										 |  |  |                      cookie, calling_domain, 303) | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def newswire_unvote(self, calling_domain: str, path: str, | 
					
						
							|  |  |  |                     cookie: str, base_dir: str, http_prefix: str, | 
					
						
							|  |  |  |                     domain_full: str, | 
					
						
							|  |  |  |                     onion_domain: str, i2p_domain: str, | 
					
						
							|  |  |  |                     getreq_start_time, debug: bool, | 
					
						
							| 
									
										
										
										
											2024-04-11 15:24:43 +00:00
										 |  |  |                     newswire: {}, default_timeline: str, | 
					
						
							|  |  |  |                     fitness: {}) -> None: | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  |     """Remove vote for a newswire item
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     origin_path_str = path.split('/newswireunvote=')[0] | 
					
						
							|  |  |  |     date_str = \ | 
					
						
							|  |  |  |         path.split('/newswireunvote=')[1].replace('T', ' ') | 
					
						
							|  |  |  |     date_str = date_str.replace(' 00:00', '').replace('+00:00', '') | 
					
						
							|  |  |  |     date_str = urllib.parse.unquote_plus(date_str) + '+00:00' | 
					
						
							|  |  |  |     nickname = \ | 
					
						
							|  |  |  |         urllib.parse.unquote_plus(origin_path_str.split('/users/')[1]) | 
					
						
							|  |  |  |     if '/' in nickname: | 
					
						
							|  |  |  |         nickname = nickname.split('/')[0] | 
					
						
							|  |  |  |     if newswire.get(date_str): | 
					
						
							|  |  |  |         if is_moderator(base_dir, nickname): | 
					
						
							|  |  |  |             votes_index = 2 | 
					
						
							|  |  |  |             filename_index = 3 | 
					
						
							|  |  |  |             newswire_item = newswire[date_str] | 
					
						
							|  |  |  |             if 'vote:' + nickname in newswire_item[votes_index]: | 
					
						
							|  |  |  |                 newswire_item[votes_index].remove('vote:' + nickname) | 
					
						
							|  |  |  |                 filename = newswire_item[filename_index] | 
					
						
							|  |  |  |                 newswire_state_filename = \ | 
					
						
							| 
									
										
										
										
											2024-05-12 12:35:26 +00:00
										 |  |  |                     data_dir(base_dir) + '/.newswirestate.json' | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  |                 try: | 
					
						
							|  |  |  |                     save_json(newswire, newswire_state_filename) | 
					
						
							|  |  |  |                 except BaseException as ex: | 
					
						
							|  |  |  |                     print('EX: saving newswire state, ' + str(ex)) | 
					
						
							|  |  |  |                 if filename: | 
					
						
							|  |  |  |                     save_json(newswire_item[votes_index], | 
					
						
							|  |  |  |                               filename + '.votes') | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         print('No newswire item with date: ' + date_str + ' ' + | 
					
						
							|  |  |  |               str(newswire)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     origin_path_str_absolute = \ | 
					
						
							|  |  |  |         http_prefix + '://' + domain_full + origin_path_str + '/' + \ | 
					
						
							| 
									
										
										
										
											2024-04-11 15:24:43 +00:00
										 |  |  |         default_timeline | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  |     if calling_domain.endswith('.onion') and onion_domain: | 
					
						
							|  |  |  |         origin_path_str_absolute = \ | 
					
						
							|  |  |  |             'http://' + onion_domain + origin_path_str | 
					
						
							|  |  |  |     elif (calling_domain.endswith('.i2p') and i2p_domain): | 
					
						
							|  |  |  |         origin_path_str_absolute = \ | 
					
						
							|  |  |  |             'http://' + i2p_domain + origin_path_str | 
					
						
							|  |  |  |     redirect_headers(self, origin_path_str_absolute, | 
					
						
							| 
									
										
										
										
											2024-04-16 13:47:21 +00:00
										 |  |  |                      cookie, calling_domain, 303) | 
					
						
							| 
									
										
										
										
											2024-04-11 15:24:43 +00:00
										 |  |  |     fitness_performance(getreq_start_time, fitness, | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  |                         '_GET', '_newswire_unvote', debug) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def edit_newswire2(self, calling_domain: str, path: str, | 
					
						
							|  |  |  |                    translate: {}, base_dir: str, | 
					
						
							| 
									
										
										
										
											2024-04-11 15:24:43 +00:00
										 |  |  |                    domain: str, cookie: str, | 
					
						
							|  |  |  |                    access_keys: {}, | 
					
						
							|  |  |  |                    key_shortcuts: {}, | 
					
						
							|  |  |  |                    default_timeline: str, | 
					
						
							|  |  |  |                    theme_name: str, | 
					
						
							|  |  |  |                    dogwhistles: {}) -> bool: | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  |     """Show the newswire from the right column
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if '/users/' in path and path.endswith('/editnewswire'): | 
					
						
							|  |  |  |         nickname = path.split('/users/')[1] | 
					
						
							|  |  |  |         if '/' in nickname: | 
					
						
							|  |  |  |             nickname = nickname.split('/')[0] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-11 15:24:43 +00:00
										 |  |  |         if key_shortcuts.get(nickname): | 
					
						
							|  |  |  |             access_keys = key_shortcuts[nickname] | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         msg = html_edit_newswire(translate, | 
					
						
							|  |  |  |                                  base_dir, | 
					
						
							|  |  |  |                                  path, domain, | 
					
						
							| 
									
										
										
										
											2024-04-11 15:24:43 +00:00
										 |  |  |                                  default_timeline, | 
					
						
							|  |  |  |                                  theme_name, | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  |                                  access_keys, | 
					
						
							| 
									
										
										
										
											2024-04-11 15:24:43 +00:00
										 |  |  |                                  dogwhistles) | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  |         if msg: | 
					
						
							|  |  |  |             msg = msg.encode('utf-8') | 
					
						
							|  |  |  |             msglen = len(msg) | 
					
						
							|  |  |  |             set_headers(self, 'text/html', msglen, | 
					
						
							|  |  |  |                         cookie, calling_domain, False) | 
					
						
							|  |  |  |             write2(self, msg) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             http_404(self, 107) | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  |     return False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def edit_news_post2(self, calling_domain: str, path: str, | 
					
						
							|  |  |  |                     translate: {}, base_dir: str, | 
					
						
							|  |  |  |                     http_prefix: str, domain: str, | 
					
						
							| 
									
										
										
										
											2024-04-26 11:56:03 +00:00
										 |  |  |                     domain_full: str, cookie: str, | 
					
						
							|  |  |  |                     system_language: str) -> bool: | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  |     """Show the edit screen for a news post
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if '/users/' in path and '/editnewspost=' in path: | 
					
						
							|  |  |  |         post_actor = 'news' | 
					
						
							|  |  |  |         if '?actor=' in path: | 
					
						
							|  |  |  |             post_actor = path.split('?actor=')[1] | 
					
						
							|  |  |  |             if '?' in post_actor: | 
					
						
							|  |  |  |                 post_actor = post_actor.split('?')[0] | 
					
						
							|  |  |  |         post_id = path.split('/editnewspost=')[1] | 
					
						
							|  |  |  |         if '?' in post_id: | 
					
						
							|  |  |  |             post_id = post_id.split('?')[0] | 
					
						
							|  |  |  |         post_url = \ | 
					
						
							|  |  |  |             local_actor_url(http_prefix, post_actor, domain_full) + \ | 
					
						
							|  |  |  |             '/statuses/' + post_id | 
					
						
							|  |  |  |         path = path.split('/editnewspost=')[0] | 
					
						
							|  |  |  |         msg = html_edit_news_post(translate, base_dir, | 
					
						
							|  |  |  |                                   path, domain, | 
					
						
							|  |  |  |                                   post_url, | 
					
						
							| 
									
										
										
										
											2024-04-26 11:56:03 +00:00
										 |  |  |                                   system_language) | 
					
						
							| 
									
										
										
										
											2024-03-02 22:13:32 +00:00
										 |  |  |         if msg: | 
					
						
							|  |  |  |             msg = msg.encode('utf-8') | 
					
						
							|  |  |  |             msglen = len(msg) | 
					
						
							|  |  |  |             set_headers(self, 'text/html', msglen, | 
					
						
							|  |  |  |                         cookie, calling_domain, False) | 
					
						
							|  |  |  |             write2(self, msg) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             http_404(self, 108) | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  |     return False |