From: Jann Horn Date: Mon, 2 Sep 2024 00:51:16 +0000 (+0200) Subject: mwahaha behold the power of python hax X-Git-Url: http://git.thejh.net/?a=commitdiff_plain;h=9507aea3ca21f4a9d6a4a1d29c7d32c2e51102af;p=mehlbrei.git mwahaha behold the power of python hax --- diff --git a/main.py b/main.py index cb35da4..3481978 100755 --- a/main.py +++ b/main.py @@ -1,11 +1,39 @@ #!/usr/bin/env python3 +import builtins +#import contextlib +import io +import os +_open = builtins.open +#@contextlib.contextmanager +def open_override(path, *args, **kwargs): + if str(path).startswith('/MBOX/'): + data = mbox_data[path[6:]] + fd = os.memfd_create('mbox') + file = None + try: + if os.write(fd, data) != len(data): + raise Exception('os.write short???') + os.lseek(fd, 0, os.SEEK_SET) + file = _open(fd, *args, **kwargs) + finally: + if file == None: + os.close(fd) + return file + return _open(path, *args, **kwargs) +builtins.open = open_override + import copy import difflib import email import email.policy +import gzip import html +import http.client import mailbox -from urllib.parse import parse_qs +from urllib.parse import parse_qs, quote + +mbox_data = {} +mbox_data_index = 0 # for diff preparation: # normalize whitespace sequences to single space, for when people reply from @@ -288,8 +316,8 @@ class ThreadMessage: # only do this for diff roots, at the end self.blocks.trim_blocks() -def parse_mbox(): - mbox = mailbox.mbox('t.mbox', factory=lambda x: email.message_from_binary_file(x, policy=email.policy.default)) +def parse_mbox(mail_path): + mbox = mailbox.mbox(mail_path, factory=lambda x: email.message_from_binary_file(x, policy=email.policy.default)) root_message = None messages_by_id = {} all_messages = [] @@ -346,9 +374,6 @@ def app(environ, start_response): out = [] query = parse_qs(environ.get('QUERY_STRING', '')) msgid = query.get('msgid', [''])[0] - print(repr(msgid)) - - all_topic_roots = parse_mbox() out.append('') out.append('') @@ -379,29 +404,59 @@ def app(environ, start_response): out.append(' ') out.append(' ') out.append('
') - out.append('
') - out.append('

Topics

') - for topic_root in all_topic_roots: - out.append(' '+html.escape(topic_root.msg.get('subject', ''), quote=False)+' ('+str(topic_root.non_diff_root_descendants)+' replies)') - out.append('
') - out.append('
') - for topic_root in all_topic_roots: - out.append('
') - printed_top_header = False - printed_threads_header = False - for block in topic_root.blocks.ranges: - if block.start_pos_child < 0 and not printed_top_header: - out.append('

Top-posted messages (sorry this section looks like a mess)

') - printed_top_header = True - if block.start_pos_child >= 0 and not printed_threads_header: - out.append('

Actual thread

') - printed_threads_header = True - out.append('
') - out.append('
'+html.escape(block.message.from_hdr, quote=False)+'
') - out.append('
'+html.escape(block.get_text(), quote=False)+'
') - out.append('
') - out.append('
') - out.append('
') + + all_topic_roots = None + if msgid != '': + http_conn = http.client.HTTPSConnection('lore.kernel.org') + try: + http_conn.request('GET', '/all/'+quote(msgid, safe='')+'/t.mbox.gz', headers={'Host': 'lore.kernel.org'}) + http_resp = http_conn.getresponse() + if http_resp.status != 200: + out.append('lore.kernel.org returned '+str(http_resp.status)+' '+html.escape(http_resp.reason, quote=False)) + else: + response_body = http_resp.read() + out.append('lore.kernel.org returned '+str(len(response_body))+' bytes
') + response_body = gzip.decompress(response_body) + out.append('decompresses to '+str(len(response_body))+' bytes
') + + # hack... + global mbox_data_index + mbox_data_index += 1 + mbox_data_index_str = str(mbox_data_index) + #response_body = response_body.decode('utf-8') + mbox_data[mbox_data_index_str] = response_body + try: + all_topic_roots = parse_mbox('/MBOX/'+mbox_data_index_str) + finally: + del mbox_data[mbox_data_index_str] + + finally: + http_conn.close() + + if all_topic_roots != None: + out.append('
') + out.append('

Topics

') + for topic_root in all_topic_roots: + out.append(' '+html.escape(topic_root.msg.get('subject', ''), quote=False)+' ('+str(topic_root.non_diff_root_descendants)+' replies)') + out.append('
') + out.append('
') + for topic_root in all_topic_roots: + out.append('
') + printed_top_header = False + printed_threads_header = False + for block in topic_root.blocks.ranges: + if block.start_pos_child < 0 and not printed_top_header: + out.append('

Top-posted messages (sorry this section looks like a mess)

') + printed_top_header = True + if block.start_pos_child >= 0 and not printed_threads_header: + out.append('

Actual thread

') + printed_threads_header = True + out.append('
') + out.append('
'+html.escape(block.message.from_hdr, quote=False)+'
') + out.append('
'+html.escape(block.get_text(), quote=False)+'
') + out.append('
') + out.append('
') + out.append('
') out.append('
') out.append(' ') out.append('')