another progress check-in, keys now import (but i'd like to do this natively with pygpgme instead of via subprocess)
This commit is contained in:
parent
8dbec29bd0
commit
07edd7cc82
84
gpg/kant.py
84
gpg/kant.py
@ -5,6 +5,7 @@ import datetime
|
|||||||
import email
|
import email
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
from socket import *
|
from socket import *
|
||||||
@ -37,16 +38,16 @@ def getKeys(args):
|
|||||||
# Get our concept
|
# Get our concept
|
||||||
os.environ['GNUPGHOME'] = args['gpgdir']
|
os.environ['GNUPGHOME'] = args['gpgdir']
|
||||||
gpg = gpgme.Context()
|
gpg = gpgme.Context()
|
||||||
|
keys = {}
|
||||||
|
allkeys = []
|
||||||
# Do we have the key already? If not, fetch.
|
# Do we have the key already? If not, fetch.
|
||||||
for k in args['rcpts'].keys():
|
for k in args['rcpts'].keys():
|
||||||
if args['rcpts'][k]['type'] == 'fpr':
|
if args['rcpts'][k]['type'] == 'fpr':
|
||||||
# It's a key ID.
|
allkeys.append(k)
|
||||||
pass
|
if args['rcpts'][k]['type'] == 'email':
|
||||||
elif args['rcpts'][k]['type'] == 'email':
|
|
||||||
# We need to actually do a lookup on the email address.
|
# We need to actually do a lookup on the email address.
|
||||||
keys = {}
|
|
||||||
with open(os.devnull, 'w') as f:
|
with open(os.devnull, 'w') as f:
|
||||||
keyout = subprocess.run(['gpg',
|
keyout = subprocess.run(['gpg2',
|
||||||
'--search-keys',
|
'--search-keys',
|
||||||
'--with-colons',
|
'--with-colons',
|
||||||
'--batch',
|
'--batch',
|
||||||
@ -67,29 +68,72 @@ def getKeys(args):
|
|||||||
keys[key]['uids'][uid[1]] = {}
|
keys[key]['uids'][uid[1]] = {}
|
||||||
keys[key]['uids'][uid[1]]['comment'] = uid[0]
|
keys[key]['uids'][uid[1]]['comment'] = uid[0]
|
||||||
keys[key]['uids'][uid[1]]['time'] = int(line.split(':')[2])
|
keys[key]['uids'][uid[1]]['time'] = int(line.split(':')[2])
|
||||||
if len(keys) > 1:
|
if len(keys) > 1: # Print the keys and prompt for a selection.
|
||||||
import pprint
|
print('\nWe found the following keys for <{0}>...\n\nKEY ID:'.format(k))
|
||||||
pprint.pprint(keys)
|
|
||||||
# Print the keys and prompt for a selection.
|
|
||||||
print('\nWe found the following keys for <{0}>...'.format(k))
|
|
||||||
print('KEY:{0:40}ID:{0:20}EMAIL:'.format(''))
|
|
||||||
for k in keys:
|
for k in keys:
|
||||||
print('{0} (Generated at {1})'.format(k, datetime.datetime.utcfromtimestamp(keys[k]['time'])))
|
print('{0}\n{1:6}(Generated at {2}) UIDs:'.format(k, '', datetime.datetime.utcfromtimestamp(keys[k]['time'])))
|
||||||
for email in keys[k]['uids']:
|
for email in keys[k]['uids']:
|
||||||
print('{0:40}{1:20}<{2}>'.format('', keys[k]['uids'][email]['comment'], email))
|
print('{0:42}(Generated {3}) <{2}> {1}'.format('',
|
||||||
|
keys[k]['uids'][email]['comment'],
|
||||||
|
email,
|
||||||
|
datetime.datetime.utcfromtimestamp(
|
||||||
|
keys[k]['uids'][email]['time'])))
|
||||||
|
print()
|
||||||
while True:
|
while True:
|
||||||
key = input('Please enter the (full) appropriate key: ')
|
key = input('Please enter the (full) appropriate key: ')
|
||||||
if key not in keys.keys():
|
if key not in keys.keys():
|
||||||
print('Please enter a full key ID from the list above or hit ctrl-d to exit.')
|
print('Please enter a full key ID from the list above or hit ctrl-d to exit.')
|
||||||
else:
|
else:
|
||||||
|
allkeys.append(key)
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
|
if not len(keys.keys()) >= 1:
|
||||||
|
print('Could not find {0}!'.format(k))
|
||||||
|
continue
|
||||||
key = list(keys.keys())[0]
|
key = list(keys.keys())[0]
|
||||||
print('\nFound key {0} for <{1}>:'.format(key, k))
|
print('\nFound key {0} for <{1}> (Generated at {2}):'.format(key, k, datetime.datetime.utcfromtimestamp(keys[key]['time'])))
|
||||||
print('ID:{0:70}EMAIL:'.format(' '))
|
for email in keys[key]['uids']:
|
||||||
for uid in keys[key]['uids']:
|
print('\t(Generated {2}) {0} <{1}>'.format(keys[key]['uids'][email]['comment'],
|
||||||
print('{0:70}\t<{1}>'.format(uid[0], uid[1]))
|
email,
|
||||||
return(gpg)
|
datetime.datetime.utcfromtimestamp(keys[key]['uids'][email]['time'])))
|
||||||
|
allkeys.append(key)
|
||||||
|
print()
|
||||||
|
## And now we can (FINALLY) fetch the key(s).
|
||||||
|
recvcmd = ['gpg2', '--recv-keys', '--batch'] # We'll add the keys onto the end of this next.
|
||||||
|
recvcmd.extend(allkeys)
|
||||||
|
with open(os.devnull, 'w') as f:
|
||||||
|
subprocess.run(recvcmd, stdout = f, stderr = f) # We hide stderr because gpg, for some unknown reason, spits non-errors to stderr.
|
||||||
|
return(allkeys)
|
||||||
|
|
||||||
|
def modifyDirmngr(op, args):
|
||||||
|
if not args['keyservers']:
|
||||||
|
return()
|
||||||
|
pid = str(os.getpid())
|
||||||
|
activecfg = os.path.join(args['gpgdir'], 'dirmngr.conf')
|
||||||
|
bakcfg = '{0}.{1}'.format(activecfg, pid)
|
||||||
|
if op in ('new', 'start'):
|
||||||
|
if os.path.lexists(activecfg):
|
||||||
|
shutil.copy2(activecfg, bakcfg)
|
||||||
|
with open(bakcfg, 'r') as read, open(activecfg, 'w') as write:
|
||||||
|
for line in read:
|
||||||
|
if not line.startswith('keyserver '):
|
||||||
|
write.write(line)
|
||||||
|
with open(activecfg, 'a') as f:
|
||||||
|
for s in args['keyservers']:
|
||||||
|
uri = '{0}://{1}:{2}'.format(s['proto'], s['server'], s['port'][0])
|
||||||
|
f.write('keyserver {0}\n'.format(uri))
|
||||||
|
if op in ('old', 'stop'):
|
||||||
|
if os.path.lexists(bakcfg):
|
||||||
|
with open(bakcfg, 'r') as read, open(activecfg, 'w') as write:
|
||||||
|
for line in read:
|
||||||
|
write.write(line)
|
||||||
|
os.remove(bakcfg)
|
||||||
|
else:
|
||||||
|
os.remove(activecfg)
|
||||||
|
subprocess.run(['gpgconf',
|
||||||
|
'--reload',
|
||||||
|
'dirmngr'])
|
||||||
|
return()
|
||||||
|
|
||||||
def serverParser(uri):
|
def serverParser(uri):
|
||||||
# https://en.wikipedia.org/wiki/Key_server_(cryptographic)#Keyserver_examples
|
# https://en.wikipedia.org/wiki/Key_server_(cryptographic)#Keyserver_examples
|
||||||
@ -273,9 +317,9 @@ def verifyArgs(args):
|
|||||||
def main():
|
def main():
|
||||||
rawargs = parseArgs()
|
rawargs = parseArgs()
|
||||||
args = verifyArgs(vars(rawargs.parse_args()))
|
args = verifyArgs(vars(rawargs.parse_args()))
|
||||||
#import pprint
|
modifyDirmngr('new', args)
|
||||||
#pprint.pprint(args)
|
|
||||||
getKeys(args)
|
getKeys(args)
|
||||||
|
modifyDirmngr('old', args)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
Loading…
Reference in New Issue
Block a user