summaryrefslogtreecommitdiff
path: root/scripts/poezio_gpg_export
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/poezio_gpg_export')
-rwxr-xr-xscripts/poezio_gpg_export82
1 files changed, 82 insertions, 0 deletions
diff --git a/scripts/poezio_gpg_export b/scripts/poezio_gpg_export
new file mode 100755
index 00000000..5b18218f
--- /dev/null
+++ b/scripts/poezio_gpg_export
@@ -0,0 +1,82 @@
+#!/usr/bin/env python3
+
+"""
+Parses the output of gpg into a list suitable for the poezio
+GPG plugin. Double-check the output and use at your own risk.
+"""
+
+import subprocess
+import pprint
+import re
+import os
+
+addr_re = re.compile(r'^uid\s+\[\s+full\s+\]\s.*<(.*@.*)>$')
+id_re = re.compile(r'^pub\s+.*/(........) .*')
+
+def extract_block(total):
+ """
+ GPG output blocks are separated by newlines
+ """
+ if '' in total:
+ index = total.index('')
+ else:
+ index = len(total)
+ block = total[:index]
+ total = total[index+1:]
+ return (block, total)
+
+def parse_block(blocks, block):
+ """
+ Keep the blocks with trusted keys
+ and extract addresses and UIDs
+ """
+
+ uid = ''
+ addrs = []
+ blocksize = len(block)
+
+ for i, line in enumerate(reversed(block)):
+ if line.startswith('uid'):
+ match = addr_re.match(line)
+ if match:
+ addr = match.groups()[0]
+ if addr not in addrs:
+ addrs.append(addr)
+ else:
+ del block[blocksize-1-i]
+ elif line.startswith('pub'):
+ uid = id_re.match(line).groups()[0]
+
+ if addrs:
+ blocks[uid] = addrs
+
+def output(blocks):
+ print('[keys]')
+ for uid in blocks:
+ for addr in blocks[uid]:
+ print('%s = %s' % (addr, uid))
+
+def main():
+
+ os.putenv('LANG', 'en_US.UTF-8')
+
+ gpg_proc = subprocess.Popen(
+ [
+ "/usr/bin/gpg",
+ "--list-keys",
+ "--list-options",
+ "show-uid-validity"
+ ],
+ stdout=subprocess.PIPE)
+
+ result, _ = gpg_proc.communicate()
+ result = result.decode().strip().splitlines()[2:]
+ blocks = {}
+
+ while result:
+ block, result = extract_block(result)
+ parse_block(blocks, block)
+ output(blocks)
+
+if __name__ == '__main__':
+ main()