|
|
- # coding=UTF-8
-
-
- import sys
- import os
- import thunderbird
- import re
- from subprocess import Popen, PIPE
- import xml.etree.ElementTree as ET
-
-
- if sys.platform == 'darwin':
- from platform_macOS import *
-
- elif sys.platform == 'win32':
- from platform_Windows import *
-
- elif sys.platform == 'linux':
- from platform_Linux import *
-
- else:
- sys.stderr.write("platform not supported\n")
- sys.exit(1)
-
- gpg = gpg_executable(thunderbird_base)
-
-
- def command(*args):
- result = []
- cmd = [gpg, '--with-colons', '--batch']
- cmd.extend(args)
- for line in Popen(cmd, stdout=PIPE).stdout:
- data = line.split(':')
- result.append(data)
- return result
-
-
- def export_command(*args):
- result = ""
- cmd = [gpg, '-a', '--batch']
- cmd.extend(args)
- return "".join(Popen(cmd, stdout=PIPE).stdout.readlines())
-
-
- def fpr_from_keyid(keyid):
- for x in command('--fingerprint', keyid):
- if x[0] == 'fpr':
- return x[9]
- raise LookupError()
-
-
- uid_re = re.compile(r'(?P<name>[^<]*) \<(?P<email>[^>]*)\>')
-
-
- def uid(text):
- m = uid_re.match(text)
- if m:
- return { 'name': m.group('name'), 'email': m.group('email') }
- raise LookupError()
-
-
- def own_pgp_keys():
- result = []
- key = {}
- for x in command('-K'):
- if x[0] == 'sec' and x[1] == 'u':
- try:
- key = { 'fpr': fpr_from_keyid(x[4]) , 'uids': [] }
- result.append(key)
- except LookupError:
- key = { 'uids': [] }
- elif x[0] == 'sec':
- key = { 'uids': [] }
- elif x[0] == 'uid':
- try:
- key['uids'].append(uid(x[9]))
- except LookupError: pass
- return result
-
-
- def comm_partner_pgp_keys():
- result = []
- key = {}
- for x in command('--list-key'):
- if x[0] == 'pub' and x[1] == '-' and x[8] != 'n':
- try:
- key = { 'fpr': fpr_from_keyid(x[4]), 'trust': x[8] == 'f' or x[8] == 'u', 'uids': [] }
- result.append(key)
- except LookupError:
- key = { 'uids': [] }
- elif x[0] == 'pub':
- key = { 'uids': [] }
- elif x[0] == 'uid':
- try:
- key['uids'].append(uid(x[9]))
- except LookupError: pass
- return result
-
-
- def keydata(fpr):
- return export_command('--export', fpr)
-
-
- def secret(fpr):
- return export_command('--export-secret-key', fpr)
-
-
- def identities():
- return thunderbird.identities(thunderbird_base)
-
-
- def pubkey_iterator():
- for x in command('--list-key'):
- if x[0] == 'pub':
- yield keydata(x[4])
-
- class Rules:
- def __init__(self):
- try:
- self.et = ET.parse(os.path.join(thunderbird.profile_path(thunderbird_base), 'pgprules.xml'))
- self.rules = self.et.getroot()
- except:
- self.et = None
- self.rules = None
-
- def test_address(self, email):
- if self.rules is None:
- return True
-
- result = True
- for rule in self.rules:
- if rule.attrib['email'][0] == '{' and rule.attrib['email'][-1] == '}':
- if email == rule.attrib['email'][1:-1]:
- result = rule.attrib['encrypt'] != '0'
- if rule.attrib['keyId'] == '.':
- break
- elif len(rule.attrib['keyId']) > 2:
- return rule.attrib['keyId'][2:]
- elif rule.attrib['email'][0] == '{':
- begins = rule.attrib['email'][1:]
- if email[:len(begins)] == begins:
- result = rule.attrib['encrypt'] != '0'
- if rule.attrib['keyId'] == '.':
- break
- elif len(rule.attrib['keyId']) > 2:
- return rule.attrib['keyId'][2:]
-
- elif rule.attrib['email'][-1] == '}':
- ends = rule.attrib['email'][:-1]
- if email[len(email) - len(ends):] == ends:
- result = rule.attrib['encrypt'] != '0'
- if rule.attrib['keyId'] == '.':
- break
- elif len(rule.attrib['keyId']) > 2:
- return rule.attrib['keyId'][2:]
- else:
- if rule.attrib['email'][:-1] in email:
- result = rule.attrib['encrypt'] != '0'
- if rule.attrib['keyId'] == '.':
- break
- elif len(rule.attrib['keyId']) > 2:
- return rule.attrib['keyId'][2:]
-
- return result
-
- rules = Rules()
-
|