diff --git a/dnf/crypto.py b/dnf/crypto.py index a1839eefe..24a13ed6f 100644 --- a/dnf/crypto.py +++ b/dnf/crypto.py @@ -26,12 +26,64 @@ import dnf.pycomp import dnf.util import dnf.yum.misc -import gpg import io import logging import os import tempfile +try: + from gpg import Context + from gpg import Data +except ImportError: + import gpgme + + + class Context(object): + def __init__(self): + self.__dict__["ctx"] = gpgme.Context() + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + pass + + @property + def armor(self): + return self.ctx.armor + + @armor.setter + def armor(self, value): + self.ctx.armor = value + + def op_import(self, key_fo): + if isinstance(key_fo, basestring): + key_fo = io.BytesIO(key_fo) + self.ctx.import_(key_fo) + + def op_export(self, pattern, mode, keydata): + self.ctx.export(pattern, keydata) + + def __getattr__(self, name): + return getattr(self.ctx, name) + + + class Data(object): + def __init__(self): + self.__dict__["buf"] = io.BytesIO() + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + pass + + def read(self): + return self.buf.getvalue() + + def __getattr__(self, name): + return getattr(self.buf, name) + GPG_HOME_ENV = 'GNUPGHOME' logger = logging.getLogger('dnf') @@ -67,7 +119,7 @@ def keyids_from_pubring(gpgdir): if not os.path.exists(gpgdir): return [] - with pubring_dir(gpgdir), gpg.Context() as ctx: + with pubring_dir(gpgdir), Context() as ctx: keyids = [] for k in ctx.keylist(): subkey = _extract_signing_subkey(k) @@ -101,7 +153,7 @@ def pubring_dir(pubring_dir): def rawkey2infos(key_fo): pb_dir = tempfile.mkdtemp() keyinfos = [] - with pubring_dir(pb_dir), gpg.Context() as ctx: + with pubring_dir(pb_dir), Context() as ctx: ctx.op_import(key_fo) for key in ctx.keylist(): subkey = _extract_signing_subkey(key) @@ -110,7 +162,7 @@ def rawkey2infos(key_fo): keyinfos.append(Key(key, subkey)) ctx.armor = True for info in keyinfos: - with gpg.Data() as sink: + with Data() as sink: ctx.op_export(info.id_, 0, sink) sink.seek(0, os.SEEK_SET) info.raw_key = sink.read() diff --git a/dnf/yum/misc.py b/dnf/yum/misc.py index 97f8be94d..248bff884 100644 --- a/dnf/yum/misc.py +++ b/dnf/yum/misc.py @@ -32,7 +32,6 @@ import dnf.i18n import errno import glob -import gpg import gzip import hashlib import io @@ -278,7 +277,7 @@ def import_key_to_pubring(rawkey, keyid, gpgdir=None, make_ro_copy=True): if not os.path.exists(gpgdir): os.makedirs(gpgdir) - with dnf.crypto.pubring_dir(gpgdir), gpg.Context() as ctx: + with dnf.crypto.pubring_dir(gpgdir), dnf.crypto.Context() as ctx: # import the key with open(os.path.join(gpgdir, 'gpg.conf'), 'wb') as fp: fp.write(b'')