[О блоге] [наверх] [пред] [2019-12-08 18:44:32+03:00] [7f67390fdbb9f5c147c9d86d10299ed59f1b0850]
Темы: [mail][tip]

Хранение дешифрованных PGP писем на диске

Почту я храню на зашифрованном разделе диска. Поэтому в Mutt я указываю
что исходящие письма не нужно сохранять в зашифрованном виде. Это удобно
тем, что позволяет системам индексации работать с данными. А вот
входящие письма уже лежат в зашифрованном виде. А я хочу дополнительно
хранить и в дешифрованном, но с сохранением подписи, в идеале, чтобы
индексация работала.

Раньше из-за относительно небольшого количества шифрованных писем я не
парился с этим и про себя более менее помнил что где находится. Сейчас
стало совсем геморройно. С ходу в Интернете нашёл только один Perl
скрипт сохраняющий дешифрованные версии. В основном то люди как-раз ищут
прямо противоположное -- как сохранить в PGP. Но внезапно обнаружил что
в Mutt есть decrypt-copy команда делающая то, что мне надо: сохраняет
дешифрованную копию письма.

Метим все PGP зашифрованные письма (T ~G), применяем эту команду,
указываем mailbox, там оказывается копия. Однако, в письмах где
отдельной частью идут зашифрованные заголовки (To/From/Subject), в
основном заголовке письма получаются сдублированные поля.
Subject: Encrypted subject, а потом пониже будет уже настоящий subject.
Что сбивает index с толку.

Решил вот таким вот Python скриптом просто удалять дубляжи. Применяем к
файлам в maildir-е и проблемы нет. Их дальше можно положить в основной
maildir. Не потеряется, так как Message-ID остаётся незатронутым и
сообщения связываются между собой Mutt-ом.

    import sys

    fn = sys.argv[1]
    out = sys.argv[2]
    with open(fn, "rb") as fd:
        lines = fd.read().split(b"\n")

    def dup(lines, what):
        idx = []
        met = False
        for i, line in enumerate(lines):
            if line == "":
                break
            if met:
                if line.startswith(b" "):
                    idx.append(i)
                    continue
                else:
                    met = False
            if line.startswith(what):
                if len(idx) == 0:
                    idx.append(i)
                    met = True
                else:
                    return [l for n, l in enumerate(lines) if n not in idx]
        return lines

    lines = dup(lines, b"To")
    lines = dup(lines, b"From")
    lines = dup(lines, b"Subject")
    with open(out, "wb") as fd:
        fd.write(b"\n".join(lines))

На качество кода не претендую: буквально на коленках собранный скрипт,
но, судя по diff между maildir-ами, ничего лишнего не затрагивающий.

    [оставить комментарий]