def encrypt_payload( payload, gpg_to_cmdline, check_nested = True ): raw_payload = payload.get_payload(decode=True) if check_nested and "-----BEGIN PGP MESSAGE-----" in raw_payload and "-----END PGP MESSAGE-----" in raw_payload: if verbose: log("Message is already pgp encrypted. No nested encryption needed.") return payload # No check is needed for cfg['gpg']['keyhome'] as this is already done in method gpg_encrypt gpg = GnuPG.GPGEncryptor( cfg['gpg']['keyhome'], gpg_to_cmdline, payload.get_content_charset() ) gpg.update( raw_payload ) encrypted_data, returncode = gpg.encrypt() if verbose: log("Return code from encryption=%d (0 indicates success)." % returncode) if returncode != 0: log("Encrytion failed with return code %d. Encryption aborted." % returncode) return payload payload.set_payload( encrypted_data ) isAttachment = payload.get_param( 'attachment', None, 'Content-Disposition' ) is not None if isAttachment: filename = payload.get_filename() if filename: pgpFilename = filename + ".pgp" if not (payload.get('Content-Disposition') is None): payload.set_param( 'filename', pgpFilename, 'Content-Disposition' ) if not (payload.get('Content-Type') is None) and not (payload.get_param( 'name' ) is None): payload.set_param( 'name', pgpFilename ) if not (payload.get('Content-Transfer-Encoding') is None): payload.replace_header( 'Content-Transfer-Encoding', "7bit" ) return payload
def encrypt_payload(payload, gpg_to_cmdline): raw_payload = payload.get_payload(decode=True) if "-----BEGIN PGP MESSAGE-----" in raw_payload and "-----END PGP MESSAGE-----" in raw_payload: return payload gpg = GnuPG.GPGEncryptor(cfg['gpg']['keyhome'], gpg_to_cmdline, payload.get_content_charset()) gpg.update(raw_payload) payload.set_payload(gpg.encrypt()) isAttachment = payload.get_param('attachment', None, 'Content-Disposition') is not None if isAttachment: filename = payload.get_filename() 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) if payload.get('Content-Transfer-Encoding') is not None: payload.replace_header('Content-Transfer-Encoding', "7bit") return payload
def encrypt_payload( payload, gpg_to_cmdline ): raw_payload = payload.get_payload(decode=True) if "-----BEGIN PGP MESSAGE-----" in raw_payload and "-----END PGP MESSAGE-----" in raw_payload: return payload gpg = GnuPG.GPGEncryptor( cfg['gpg']['keyhome'], gpg_to_cmdline, payload.get_content_charset() ) gpg.update( raw_payload ) 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']) ) if payload['Content-Type']: payload.replace_header( 'Content-Type', re.sub(r'name="([^"]+)"', r'name="\1.pgp"', payload['Content-Type']) ) if 'name="' in payload['Content-Type']: 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") ) ) ) return payload
if ungpg_to != list(): send_msg(raw_message, ungpg_to) if raw_message.is_multipart(): payload = list() for part in raw_message.get_payload(): if part.get_content_type() == "text/plain": payload.append(part) raw_message.set_payload(payload) if cfg.has_key('logging') and cfg['logging'].has_key('file'): log = open(cfg['logging']['file'], 'a') log.write("Encrypting email to: %s\n" % ' '.join(map(lambda x: x[0], gpg_to))) log.close() if cfg['default'].has_key( 'add_header') and cfg['default']['add_header'] == 'yes': raw_message['X-GPG-Mailgate'] = 'Encrypted by GPG Mailgate' gpg_to_cmdline = list() gpg_to_smtp = list() for rcpt in gpg_to: gpg_to_smtp.append(rcpt[0]) gpg_to_cmdline.extend(rcpt[1].split(',')) gpg = GnuPG.GPGEncryptor(cfg['gpg']['keyhome'], gpg_to_cmdline) gpg.update(get_msg(raw_message)) raw_message.set_payload(gpg.encrypt()) send_msg(raw_message, gpg_to_smtp)