commit: c1f231291afa94d9a0020569d8d7da2a7674b7fd
Author: Pavlos Ratis <dastergon <AT> gentoo <DOT> org>
AuthorDate: Mon Jul 28 18:17:18 2014 +0000
Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com>
CommitDate: Mon Jul 28 18:17:18 2014 +0000
URL:
http://sources.gentoo.org/gitweb/?p=proj/gentoo-keys.git;a=commit;h=c1f23129
binary keyring support
Import specified trusted keys to a specified keyring file.
---
etc/gkeys.conf.sample | 3 +++
gkeys/actions.py | 55 +++++++++++++++++++++++++++++++++++++++++----------
gkeys/cli.py | 2 ++
gkeys/config.py | 1 +
gkeys/lib.py | 31 ++++++++++++++++++++++++++++-
5 files changed, 81 insertions(+), 11 deletions(-)
diff --git a/etc/gkeys.conf.sample b/etc/gkeys.conf.sample
index 9f2d8da..a777ab1 100644
--- a/etc/gkeys.conf.sample
+++ b/etc/gkeys.conf.sample
@@ -20,6 +20,9 @@ dev-keydir: %(keysdir)s/devs
# will be stored.
rel-keydir: %(keysdir)s/release
+# keyring: the directory where the official keyring with the specified keys
+# will be exported.
+keyring: %(keysdir)s/keyring
# overlayskeydir: the directory where the overlay keys
# will be stored.
diff --git a/gkeys/actions.py b/gkeys/actions.py
index caa0d7f..5d65552 100644
--- a/gkeys/actions.py
+++ b/gkeys/actions.py
@@ -22,8 +22,8 @@ from gkeys.seedhandler import SeedHandler
from gkeys.config import GKEY
Available_Actions = ['listseed', 'addseed', 'removeseed', 'moveseed',
'fetchseed',
- 'listseedfiles', 'listkey', 'addkey', 'removekey', 'movekey',
- 'installed']
+ 'listseedfiles', 'listkey', 'installkey', 'removekey', 'movekey',
+ 'installed', 'importkey']
class Actions(object):
@@ -69,7 +69,7 @@ class Actions(object):
return ["Provide a nickname, a name and a fingerprint."]
gkey = handler.new(args, checkgkey=True)
if len(gkeys) == 0:
- self.logger.debug("ACTIONS: addkey; now adding gkey: %s" %
str(gkey))
+ self.logger.debug("ACTIONS: installkey; now adding gkey: %s" %
str(gkey))
success = self.seeds.add(getattr(gkey, 'nick'), gkey)
if success:
success = self.seeds.save()
@@ -186,13 +186,13 @@ class Actions(object):
return messages
- def addkey(self, args):
+ def installkey(self, args):
'''Install a key from the seed(s)'''
if not args.nick:
return ["Please provide a nickname or -n *"]
handler = SeedHandler(self.logger, self.config)
kwargs = handler.build_gkeydict(args)
- self.logger.debug("ACTIONS: addkey; kwargs: %s" % str(kwargs))
+ self.logger.debug("ACTIONS: installkey; kwargs: %s" % str(kwargs))
gkey = self.listseed(args)[1]
if gkey:
if gkey and not args.nick == '*' and self.output:
@@ -200,7 +200,7 @@ class Actions(object):
elif gkey and self.output:
self.output(['all'], "\n Installing seeds:")
else:
- self.logger.info("ACTIONS: addkey; "
+ self.logger.info("ACTIONS: installkey; "
"Matching seed entry not found")
if args.nick:
return ["Search failed for: %s" % args.nick]
@@ -211,16 +211,16 @@ class Actions(object):
# get confirmation
# fill in code here
keydir = self.config.get_key(args.seeds + "-keydir")
- self.logger.debug("ACTIONS: addkey; keysdir = %s" % keydir)
+ self.logger.debug("ACTIONS: installkey; keysdir = %s" % keydir)
self.gpg = GkeysGPG(self.config, keydir)
results = {}
failed = []
for key in gkey:
- self.logger.debug("ACTIONS: addkey; adding key:")
+ self.logger.debug("ACTIONS: installkey; adding key:")
self.logger.debug("ACTIONS: " + str(key))
results[key.name] = self.gpg.add_key(key)
for result in results[key.name]:
- self.logger.debug("ACTIONS: addkey; result.failed = " +
+ self.logger.debug("ACTIONS: installkey; result.failed = " +
str(result.failed))
if self.config.options['print_results']:
for result in results[key.name]:
@@ -231,7 +231,7 @@ class Actions(object):
if result.failed:
failed.append(key)
if failed and self.output:
- self.output(failed, "\n Failed to install:")
+ self.output([failed], "\n Failed to install:")
return ["Completed"]
return ["No seeds to search or install"]
@@ -274,6 +274,41 @@ class Actions(object):
pass
+ def importkey(self, args):
+ '''Add a specified key to a specified keyring'''
+ if args.seeds:
+ keydir = self.config.get_key(args.seeds + "-keydir")
+ keyring_dir = self.config.get_key("keyring")
+ self.logger.debug("ACTIONS: importkey; keydir = %s" % keydir)
+ self.gpg = GkeysGPG(self.config, keydir)
+ handler = SeedHandler(self.logger, self.config)
+ gkeys = self.listseed(args)[1]
+ results = {}
+ failed = []
+ print("Importing specified keys to keyring.")
+ for gkey in gkeys:
+ self.logger.debug("ACTIONS: importkey; adding key: %s",
gkey.name)
+ results[gkey.name] = self.gpg.add_key(gkey)
+ if self.config.options['print_results']:
+ for result in results[gkey.name]:
+ print("key desired:", gkey.name, ", key added:",
+ result.username, ", succeeded:",
+ not result.failed, ", fingerprint:",
result.fingerprint)
+ self.logger.debug("stderr_out: " +
str(result.stderr_out))
+ if result.failed:
+ self.logger.debug("ACTIONS: importkey;
result.failed = " + str(result.failed))
+ failed.append(gkey)
+ if not results[gkey.name][0].failed:
+ print("Importing: ", gkey.name)
+ self.logger.debug("ACTIONS: importkey; importing key: %s",
gkey.name)
+ keyring = os.path.join(keyring_dir,args.keyring + '.gpg')
+ self.gpg.add_to_keyring(gkey, keydir, keyring)
+ if failed and self.output:
+ self.output([failed], "\n Failed to install:")
+ return ["Completed."]
+ return ["No seeds to search or install"]
+
+
def installed(self, args):
'''Lists the installed key directories'''
if args.seeds:
diff --git a/gkeys/cli.py b/gkeys/cli.py
index 3df3435..c8d5be7 100644
--- a/gkeys/cli.py
+++ b/gkeys/cli.py
@@ -70,6 +70,8 @@ class Main(object):
help='The logging level to set for the logfile')
parser.add_argument('-f', '--fingerprint', dest='fingerprint',
default=None,
help='The fingerprint of the the key')
+ parser.add_argument('-k', '--keyring', dest='keyring',
default='trusted_keyring',
+ help='The name of the keyring to use')
parser.add_argument('-n', '--nick', dest='nick', default=None,
help='The nick associated with the the key')
parser.add_argument('-N', '--name', dest='name', nargs='*',
diff --git a/gkeys/config.py b/gkeys/config.py
index b75d562..6b9888e 100644
--- a/gkeys/config.py
+++ b/gkeys/config.py
@@ -73,6 +73,7 @@ class GKeysConfig(GPGConfig):
self.defaults['keysdir'] = path([self.root, EPREFIX,
'/var/gentoo/gkeys'])
self.defaults['dev-keydir'] = '%(keysdir)s/devs'
self.defaults['rel-keydir'] = '%(keysdir)s/release'
+ self.defaults['keyring'] = '%(keysdir)s/keyring'
self.defaults['overlays-keydir'] = '%(keysdir)s/overlays'
self.defaults['logdir'] = '%(keysdir)s/logs'
# local directory to scan for seed files installed via ebuild, layman
diff --git a/gkeys/lib.py b/gkeys/lib.py
index 3861012..4d150bb 100644
--- a/gkeys/lib.py
+++ b/gkeys/lib.py
@@ -20,6 +20,7 @@ with gentoo-keys specific convienience functions.
from __future__ import print_function
+from os.path import abspath, pardir
from os.path import join as pjoin
from pyGPG.gpg import GPG
@@ -60,7 +61,7 @@ class GkeysGPG(GPG):
return
- def set_keyring(self, keyring, task, reset=True):
+ def set_keyring(self, keyring, task, importkey=False, reset=True):
'''Sets the keyring to use as well as related task options
'''
logger.debug("keydir: %s, keyring: %s" % (self.keydir, keyring))
@@ -69,6 +70,11 @@ class GkeysGPG(GPG):
# --keyring file | Note that this adds a keyring to the current list.
# If the intent is to use the specified keyring alone,
# use --keyring along with --no-default-keyring.
+ if importkey:
+ task_value = ['--import-options', 'import-clean']
+ self.config.options['tasks'][task].extend(task_value)
+ parent_dir = abspath(pjoin(keyring, pardir))
+ ensure_dirs(parent_dir)
task_value = ['--no-default-keyring', '--keyring', keyring]
self.config.options['tasks'][task].extend(task_value)
logger.debug("set_keyring: New task options: %s"
%str(self.config.options['tasks'][task]))
@@ -87,6 +93,29 @@ class GkeysGPG(GPG):
return
+ def add_to_keyring(self, gkey, keydir, keyring):
+ '''Add the specified key to the specified keyring
+
+ @param gkey: GKEY namedtuple with
+ (name, keyid/longkeyid, keydir, fingerprint)
+ @param keydir: path with the specified keydir
+ @param keyring: string with the specified keyring
+ '''
+ self.set_keydir(keydir, 'import', reset=True)
+ self.set_keyring(keyring, 'import', importkey=True, reset=False)
+ results = []
+ logger.debug("LIB: import_to_keyring; name: " + gkey.name)
+ logger.debug("** Calling runGPG with Running: gpg %s --import' for: %s"
+ % (' '.join(self.config.get_key('tasks', 'import')),
+ gkey.name))
+ pubring_path = pjoin(self.keydir, gkey.keydir, 'pubring.gpg')
+ result = self.runGPG(task='import', inputfile=pubring_path)
+ logger.info('GPG return code: ' + str(result.returncode))
+ results.append(result)
+ print(result.stderr_out)
+ return results
+
+
def add_key(self, gkey):
'''Add the specified key to the specified keydir