Fix bug causing messages to have extra characters or failing to encode properly.

This commit is contained in:
perennate 2013-08-11 20:35:48 +08:00 committed by Igor Rzegocki
parent 7110b9a303
commit 4aa366dea5
2 changed files with 40 additions and 17 deletions

View File

@ -33,5 +33,16 @@ class GPGEncryptor:
return encdata return encdata
def _command(self): def _command(self):
cmd = "/usr/bin/gpg --trust-model always --homedir %s --batch --yes --pgp7 --no-secmem-warning -a -e -r %s" % (self._keyhome, ' -r '.join(self._recipients)) cmd = ["/usr/bin/gpg", "--trust-model", "always", "--homedir", self._keyhome, "--batch", "--yes", "--pgp7", "--no-secmem-warning", "-a", "-e"]
return cmd.split()
# add recipients
for recipient in self._recipients:
cmd.append("-r")
cmd.append(recipient)
# add on the charset, if set
if self._charset:
cmd.append("--comment")
cmd.append('Charset: ' + self._charset)
return cmd

View File

@ -45,6 +45,7 @@ def send_msg( message, recipients = None ):
smtp.sendmail( from_addr, recipients, message.as_string() ) smtp.sendmail( from_addr, recipients, message.as_string() )
def encrypt_payload( payload, gpg_to_cmdline ): def encrypt_payload( payload, gpg_to_cmdline ):
gpg = GnuPG.GPGEncryptor( cfg['gpg']['keyhome'], gpg_to_cmdline, payload.get_content_charset() )
raw_payload = payload.get_payload(decode=True) raw_payload = payload.get_payload(decode=True)
if "-----BEGIN PGP MESSAGE-----" in raw_payload and "-----END PGP MESSAGE-----" in raw_payload: if "-----BEGIN PGP MESSAGE-----" in raw_payload and "-----END PGP MESSAGE-----" in raw_payload:
return payload return payload
@ -53,24 +54,35 @@ def encrypt_payload( payload, gpg_to_cmdline ):
if "-----BEGIN PGP MESSAGE-----" in raw_payload and "-----END PGP MESSAGE-----" in raw_payload: if "-----BEGIN PGP MESSAGE-----" in raw_payload and "-----END PGP MESSAGE-----" in raw_payload:
return payload return payload
payload.set_payload( gpg.encrypt() ) payload.set_payload( gpg.encrypt() )
if payload['Content-Disposition']:
payload.replace_header( 'Content-Disposition', re.sub(r'filename="([^"]+)"', r'filename="\1.pgp"', payload['Content-Disposition']) ) isAttachment = payload.get_param( 'attachment', None, 'Content-Disposition' ) is not None
if payload['Content-Type']:
payload.replace_header( 'Content-Type', re.sub(r'name="([^"]+)"', r'name="\1.pgp"', payload['Content-Type']) ) if isAttachment:
if 'name="' in payload['Content-Type']: filename = payload.get_filename()
payload.replace_header( 'Content-Type', re.sub(r'^[a-z/]+;', r'application/octet-stream;', payload['Content-Type']) )
payload.set_payload( "\n".join( filter( lambda x:re.search(r'^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$',x), payload.get_payload().split("\n") ) ) ) if filename:
pgpFilename = filename + ".pgp"
if payload.get('Content-Disposition') is not None:
payload.set_param( 'filename', pgpFilename, 'Content-Disposition' )
if payload.get('Content-Type') is not None:
if payload.get_param( 'name' ) is not None:
payload.set_param( 'name', pgpFilename )
payload.set_payload( "\n".join( filter( lambda x:re.search(r'^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$',x), payload.get_payload().split("\n") ) ) )
if payload.get('Content-Transfer-Encoding') is not None:
payload['Content-Transfer-Encoding'] = "quoted-printable"
return payload return payload
def encrypt_all_payloads( payloads, gpg_to_cmdline ): def encrypt_all_payloads( message, gpg_to_cmdline ):
encrypted_payloads = list() encrypted_payloads = list()
if type( payloads ) == str: if type( message.get_payload() ) == str:
msg = email.message.Message() return encrypt_payload( message, gpg_to_cmdline ).get_payload()
msg.set_payload( payloads ) for payload in message.get_payload():
return encrypt_payload( msg, gpg_to_cmdline ).as_string()
for payload in payloads:
if( type( payload.get_payload() ) == list ): if( type( payload.get_payload() ) == list ):
encrypted_payloads.append( encrypt_all_payloads( payload.get_payload(), gpg_to_cmdline ) ) encrypted_payloads.extend( encrypt_all_payloads( payload, gpg_to_cmdline ) )
else: else:
encrypted_payloads.append( [encrypt_payload( payload, gpg_to_cmdline )] ) encrypted_payloads.append( [encrypt_payload( payload, gpg_to_cmdline )] )
return sum(encrypted_payloads, []) return sum(encrypted_payloads, [])
@ -126,7 +138,7 @@ for rcpt in gpg_to:
gpg_to_smtp.append(rcpt[0]) gpg_to_smtp.append(rcpt[0])
gpg_to_cmdline.extend(rcpt[1].split(',')) gpg_to_cmdline.extend(rcpt[1].split(','))
encrypted_payloads = encrypt_all_payloads( raw_message.get_payload(), gpg_to_cmdline ) encrypted_payloads = encrypt_all_payloads( raw_message, gpg_to_cmdline )
raw_message.set_payload( encrypted_payloads ) raw_message.set_payload( encrypted_payloads )
send_msg( raw_message, gpg_to_smtp ) send_msg( raw_message, gpg_to_smtp )