summaryrefslogtreecommitdiff
path: root/scripts/poezio_gpg_export
diff options
context:
space:
mode:
authormathieui <mathieui@mathieui.net>2014-03-04 21:59:11 +0100
committermathieui <mathieui@mathieui.net>2014-03-04 21:59:11 +0100
commit8ec5671025e0651e2808c67e66c634b2d46b77b4 (patch)
tree17dd1c68ed9d076fc2d4b4d7be251c052da551b7 /scripts/poezio_gpg_export
parentbc6b9b1aaf56ed4de7ad9105e2ddacebaf820f82 (diff)
downloadpoezio-8ec5671025e0651e2808c67e66c634b2d46b77b4.tar.gz
poezio-8ec5671025e0651e2808c67e66c634b2d46b77b4.tar.bz2
poezio-8ec5671025e0651e2808c67e66c634b2d46b77b4.tar.xz
poezio-8ec5671025e0651e2808c67e66c634b2d46b77b4.zip
Add a script that generates a [keys] section for the gpg plugin
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()