From daea7de461de9a7883d410b41cea78c0d1ff2d6f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 10 Feb 2023 13:08:41 +0000 Subject: [PATCH] Export blocked domains as csv --- blocking.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ daemon.py | 40 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 87 insertions(+), 3 deletions(-) diff --git a/blocking.py b/blocking.py index 3b254d086..3b2ac7cef 100644 --- a/blocking.py +++ b/blocking.py @@ -1558,3 +1558,53 @@ def import_blocks(base_dir: str, nickname: str, domain: str, blocking_reasons_filename) return True + + +def export_blocks(base_dir: str, nickname: str, domain: str) -> str: + """exports account level blocks in a csv format + """ + account_directory = acct_dir(base_dir, nickname, domain) + blocking_filename = \ + account_directory + '/blocking.txt' + blocking_reasons_filename = \ + account_directory + '/blocking_reasons.txt' + + blocks_header = \ + '#domain,#severity,#reject_media,#reject_reports,' + \ + '#public_comment,#obfuscate\n' + + if not os.path.isfile(blocking_filename): + return blocks_header + + blocking_lines = [] + if os.path.isfile(blocking_filename): + try: + with open(blocking_filename, 'r', encoding='utf-8') as fp_block: + blocking_lines = fp_block.read().splitlines() + except OSError: + print('EX: export_blocks failed to read ' + blocking_filename) + + blocking_reasons = [] + if os.path.isfile(blocking_reasons_filename): + try: + with open(blocking_reasons_filename, 'r', + encoding='utf-8') as fp_block: + blocking_reasons = fp_block.read().splitlines() + except OSError: + print('EX: export_blocks failed to read ' + + blocking_reasons_filename) + + blocks_str = blocks_header + for blocked_domain in blocking_lines: + blocked_domain = blocked_domain.strip() + if blocked_domain.startwith('#'): + continue + reason_str = '' + for reason_line in blocking_reasons: + if reason_line.startswith(blocked_domain + ' '): + reason_str = reason_line.split(' ')[1] + break + blocks_str += \ + blocked_domain + ',suspend,false,false,"' + \ + reason_str + '",false\n' + return blocks_str diff --git a/daemon.py b/daemon.py index 5f72edc44..9879b592d 100644 --- a/daemon.py +++ b/daemon.py @@ -148,6 +148,7 @@ from media import attach_media from media import path_is_video from media import path_is_audio from blocking import import_blocks +from blocking import export_blocks from blocking import add_account_blocks from blocking import get_cw_list_variable from blocking import load_cw_lists @@ -6341,6 +6342,14 @@ class PubServer(BaseHTTPRequestHandler): cookie, calling_domain) self.server.postreq_busy = False return + elif 'name="submitExportBlocks"' in post_bytes_str: + print('submitExportBlocks') + blocks_download_path = actor_str + '/exports/blocks.csv' + print('submitExportBlocks path=' + blocks_download_path) + self._redirect_headers(blocks_download_path, + cookie, calling_domain) + self.server.postreq_busy = False + return # extract all of the text fields into a dict fields = \ @@ -8388,6 +8397,25 @@ class PubServer(BaseHTTPRequestHandler): self._write(export_binary) self._404() + def _get_exported_blocks(self, path: str, base_dir: str, + domain: str, + calling_domain: str) -> None: + """Returns an exported blocks csv file + """ + filename = path.split('/exports/', 1)[1] + filename = base_dir + '/exports/' + filename + nickname = get_nickname_from_actor(path) + if nickname: + blocks_str = export_blocks(base_dir, nickname, domain) + if blocks_str: + msg = blocks_str.encode('utf-8') + msglen = len(msg) + self._set_headers('text/csv', + msglen, None, calling_domain, False) + self._write(msg) + return + self._404() + def _get_fonts(self, calling_domain: str, path: str, base_dir: str, debug: bool, getreq_start_time) -> None: @@ -17318,9 +17346,15 @@ class PubServer(BaseHTTPRequestHandler): return if authorized and '/exports/' in self.path: - self._get_exported_theme(self.path, - self.server.base_dir, - self.server.domain_full) + if 'blocks.csv' in self.path: + self._get_exported_blocks(self.path, + self.server.base_dir, + self.server.domain, + calling_domain) + else: + self._get_exported_theme(self.path, + self.server.base_dir, + self.server.domain_full) return # get fonts