summaryrefslogtreecommitdiff
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
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
-rwxr-xr-xscripts/poezio_gpg_export82
-rw-r--r--setup.py2
2 files changed, 83 insertions, 1 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()
diff --git a/setup.py b/setup.py
index 36170530..01a1b3bd 100644
--- a/setup.py
+++ b/setup.py
@@ -43,7 +43,7 @@ setup(name="poezio",
packages = ['poezio', 'poezio_plugins', 'poezio_plugins.gpg', 'poezio_themes'],
package_dir = {'poezio': 'src', 'poezio_plugins': 'plugins', 'poezio_themes': 'data/themes'},
package_data = {'poezio': ['default_config.cfg']},
- scripts = ['scripts/poezio'],
+ scripts = ['scripts/poezio', 'scripts/poezio_gpg_export'],
data_files = [('share/poezio/themes/', ['data/themes/dark.py']),
('share/man/man1/', ['data/poezio.1'])],
)