Вставить имя файла, используя python-gnupg - PullRequest
0 голосов
/ 25 мая 2018

Я могу встроить исходное имя файла с помощью python-gnupg при шифровании файла, используя ниже:

filename = 'test.tim'
with open(filename, 'rb) as fh:
    status = gpg.encrypt_file(fh, recipients='somerecipient', output='test.tim.gpg',\
        sign='somesignature', extra_args=['--set-filename', os.path.basename(filename)])

Это можно проверить с помощью gpg из командной строки:

$ gpg2 --list-packages test.tim.gpg |grep name

Однако я не могу сохранить исходное имя файла при расшифровке файла:

with open(filename, 'rb') as fh:
    status = gpg.decrypt_file(fh, extra_args['--use-embedded-filename'])

Мне известно овыходной параметр (который указывает имя файла для сохранения содержимого) в функции decrypt_file, но я хочу сохранить исходное имя файла (которое я не всегда знаю)

Кажется, функция decrypt_file всегда передает --decrypt флаг для gpg, который всегда выводит содержимое в стандартный вывод (если не используется вместе с выходным параметром), как в:

$ gpg --decrypt --use-embedded-filename test.tim.gpg

Ниже команда расшифрует и сохранит вывод в исходное имя файла:

$ gpg --use-embedded-filename test.tim.gpg

Есть идеи?

Тим

1 Ответ

0 голосов
/ 25 мая 2018

Функциональность для выполнения того, что вы хотите, не существует в оригинальном python-gnupg .

Здесь есть измененная версия здесь от isislovecruft (чтовы получите, если вы pip install gnupg), который добавляет поддержку --list-packets с gpg.listpackets, но все еще не поддерживает --use-embeded-file-name

Так что мой подход, если бы я настаивал на использовании только Python, вероятно,Начнем с версии isislovecruft, а затем подкласс GPG следующим образом:

import gnupg
import os

GPGBINARY = os.environ.get('GPGBINARY', 'gpg')
hd = os.path.join(os.getcwd(), 'keys')

class myGPG(gnupg.GPG):

    def decrypt_file_original_name(self, file, always_trust=False, passphrase=None, extra_args=None):
        args = ["--use-embedded-filename"]
        output = calculate_the_file_name_using_list_packets()
        self.set_output_without_confirmation(args, output)
        if always_trust:  # pragma: no cover
            args.append("--always-trust")
        if extra_args:
            args.extend(extra_args)
        result = self.result_map['crypt'](self)
        self._handle_io(args, file, result, passphrase, binary=True)
        # logger.debug('decrypt result: %r', result.data)
        return result

gpg = myGPG(gnupghome=hd, gpgbinary=GPGBINARY)

Имейте в виду, что на данный момент почти наверняка намного проще просто использовать подпроцесс и запускайте бинарный файл gpg непосредственно из оболочки, особенно если вам не важны выходные данные.

В любом случае, я дошел до этого и сейчас не хватило времени, поэтому я оставляю реализацию calculate_the_file_name_using_list_packetsдо вас, если вы решите пойти по пути «чистого питона».Надеюсь, теперь у вас немного проще gpg.list-packets.Удачи!

...