mirror of https://gitlab.com/bashrc2/epicyon
				
				
				
			
		
			
	
	
		
			109 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
		
		
			
		
	
	
			109 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
|  | __filename__ = "quote.py" | ||
|  | __author__ = "Bob Mottram" | ||
|  | __license__ = "AGPL3+" | ||
|  | __version__ = "1.6.0" | ||
|  | __maintainer__ = "Bob Mottram" | ||
|  | __email__ = "bob@libreserver.org" | ||
|  | __status__ = "Production" | ||
|  | __module_group__ = "Core" | ||
|  | 
 | ||
|  | import os | ||
|  | from utils import acct_dir | ||
|  | from utils import resembles_url | ||
|  | from utils import remove_html | ||
|  | from utils import text_in_file | ||
|  | 
 | ||
|  | 
 | ||
|  | def get_quote_toot_url(post_json_object: str) -> str: | ||
|  |     """ Returns the url for a quote toot
 | ||
|  |     This suffers from a general lack of protocol consensus | ||
|  |     """
 | ||
|  |     # adhoc quote toot implementations | ||
|  |     object_quote_url_fields = ( | ||
|  |         'quoteUri', 'quoteUrl', 'quoteReply', 'toot:quoteReply', | ||
|  |         '_misskey_quote' | ||
|  |     ) | ||
|  |     for fieldname in object_quote_url_fields: | ||
|  |         if not post_json_object['object'].get(fieldname): | ||
|  |             continue | ||
|  |         quote_url = post_json_object['object'][fieldname] | ||
|  |         if isinstance(quote_url, str): | ||
|  |             if resembles_url(quote_url): | ||
|  |                 return remove_html(quote_url) | ||
|  | 
 | ||
|  |     # as defined by FEP-dd4b | ||
|  |     # https://codeberg.org/fediverse/fep/src/branch/main/fep/dd4b/fep-dd4b.md | ||
|  |     if ((post_json_object.get('content') or | ||
|  |          post_json_object.get('contentMap')) and | ||
|  |         (not post_json_object['object'].get('content') and | ||
|  |          not post_json_object['object'].get('contentMap')) and | ||
|  |        post_json_object['object'].get('id')): | ||
|  |         quote_url = post_json_object['object']['id'] | ||
|  |         if isinstance(quote_url, str): | ||
|  |             if resembles_url(quote_url): | ||
|  |                 return remove_html(quote_url) | ||
|  | 
 | ||
|  |     # Other ActivityPub implementation - adding a Link tag | ||
|  |     if not post_json_object['object'].get('tag'): | ||
|  |         return '' | ||
|  | 
 | ||
|  |     if not isinstance(post_json_object['object']['tag'], list): | ||
|  |         return '' | ||
|  | 
 | ||
|  |     for item in post_json_object['object']['tag']: | ||
|  |         if not isinstance(item, dict): | ||
|  |             continue | ||
|  |         if item.get('rel'): | ||
|  |             mk_quote = False | ||
|  |             if isinstance(item['rel'], list): | ||
|  |                 for rel_str in item['rel']: | ||
|  |                     if not isinstance(rel_str, str): | ||
|  |                         continue | ||
|  |                     if '_misskey_quote' in rel_str: | ||
|  |                         mk_quote = True | ||
|  |             elif isinstance(item['rel'], str): | ||
|  |                 if '_misskey_quote' in item['rel']: | ||
|  |                     mk_quote = True | ||
|  |             if mk_quote and item.get('href'): | ||
|  |                 if isinstance(item['href'], str): | ||
|  |                     if resembles_url(item['href']): | ||
|  |                         return remove_html(item['href']) | ||
|  |         if not item.get('type'): | ||
|  |             continue | ||
|  |         if not item.get('mediaType'): | ||
|  |             continue | ||
|  |         if not isinstance(item['type'], str): | ||
|  |             continue | ||
|  |         if item['type'] != 'Link': | ||
|  |             continue | ||
|  |         if not isinstance(item['mediaType'], str): | ||
|  |             continue | ||
|  |         if 'json' not in item['mediaType']: | ||
|  |             continue | ||
|  |         if item.get('href'): | ||
|  |             if isinstance(item['href'], str): | ||
|  |                 if resembles_url(item['href']): | ||
|  |                     return remove_html(item['href']) | ||
|  |     return '' | ||
|  | 
 | ||
|  | 
 | ||
|  | def quote_toots_allowed(base_dir: str, nickname: str, domain: str, | ||
|  |                         sender_nickname: str, sender_domain: str) -> bool: | ||
|  |     """ Returns true if quote toots are allowed by the given account
 | ||
|  |     for the given sender | ||
|  |     """
 | ||
|  |     account_dir = acct_dir(base_dir, nickname, domain) | ||
|  |     quotes_enabled_filename = account_dir + '/.allowQuotes' | ||
|  |     if os.path.isfile(quotes_enabled_filename): | ||
|  |         # check blocks on individual sending accounts | ||
|  |         quotes_blocked_filename = account_dir + '/quotesblocked.txt' | ||
|  |         if sender_nickname is None: | ||
|  |             return True | ||
|  |         if os.path.isfile(quotes_blocked_filename): | ||
|  |             sender_handle = sender_nickname + '@' + sender_domain | ||
|  |             if text_in_file(sender_handle, quotes_blocked_filename, False): | ||
|  |                 # quote toots not permitted from this sender | ||
|  |                 return False | ||
|  |         return True | ||
|  |     return False |