msg = email.message.Message()
		msg.set_payload( payloads )
		return encrypt_payload( msg, gpg_to_cmdline ).as_string()
	for payload in payloads:
		if( type( payload.get_payload() ) == list ):
			encrypted_payloads.append( encrypt_all_payloads( payload.get_payload(), gpg_to_cmdline ) )
		else:
			encrypted_payloads.append( [encrypt_payload( payload, gpg_to_cmdline )] )
	return sum(encrypted_payloads, [])

def get_msg( message ):
	if not message.is_multipart():
		return message.get_payload()
	return '\n\n'.join( [str(m) for m in message.get_payload()] )

keys = GnuPG.public_keys( cfg['gpg']['keyhome'] )
gpg_to = list()
ungpg_to = list()
for enc in encrypted_to_addrs:
	domain = enc.split('@')[1]
	if domain in cfg['default']['domains'].split(','):
		if enc in keys:
			gpg_to.append( (enc, enc) )
		elif cfg.has_key('keymap') and cfg['keymap'].has_key(enc):
			gpg_to.append( (enc, cfg['keymap'][enc]) )
		else:
			ungpg_to.append(enc);
			
for to in to_addrs:
	domain = to.split('@')[1]
	if domain in cfg['default']['domains'].split(','):
Exemple #2
0
        if raw_message['Subject']:
            out.write('Subject: ' + raw_message['Subject'] + '\n')
        if cfg['default'].has_key(
                'add_header') and cfg['default']['add_header'] == 'yes':
            out.write('X-GPG-Mailgate: Encrypted by GPG Mailgate\n')
        s.write(out, p7)
        log("Sending message from " + from_addr + " to " + str(recipients))
        raw_msg = out.read()
        send_msg(raw_msg, recipients)
    else:
        log("Unable to find valid S/MIME recipient")
        send_msg(raw_message.as_string(), recipients)
    return None


keys = GnuPG.public_keys(cfg['gpg']['keyhome'])
gpg_to = list()
ungpg_to = list()

for to in to_addrs:
    if to in keys and not (cfg['default'].has_key('keymap_only')
                           and cfg['default']['keymap_only'] == 'yes'):
        gpg_to.append((to, to))
    elif cfg.has_key('keymap') and cfg['keymap'].has_key(to):
        gpg_to.append((to, cfg['keymap'][to]))
    else:
        if verbose:
            log("Recipient (%s) not in PGP domain list." % to)
        ungpg_to.append(to)

if gpg_to == list():
def gpg_encrypt(raw_message, recipients):

    if not get_bool_from_cfg('gpg', 'keyhome'):
        log("No valid entry for gpg keyhome. Encryption aborted.")
        return recipients

    keys = GnuPG.public_keys(cfg['gpg']['keyhome'])
    for fingerprint in keys:
        keys[fingerprint] = sanitize_case_sense(keys[fingerprint])

    gpg_to = list()
    ungpg_to = list()

    for to in recipients:

        # Check if recipient is in keymap
        if get_bool_from_cfg('enc_keymap', to):
            log("Encrypt keymap has key '%s'" % cfg['enc_keymap'][to])
            # Check we've got a matching key!
            if cfg['enc_keymap'][to] in keys:
                gpg_to.append((to, cfg['enc_keymap'][to]))
                continue
            else:
                log("Key '%s' in encrypt keymap not found in keyring for email address '%s'."
                    % (cfg['enc_keymap'][to], to))

        # Check if key in keychain is present
        if to in keys.values() and not get_bool_from_cfg(
                'default', 'enc_keymap_only', 'yes'):
            gpg_to.append((to, to))
            continue

        # Check if there is a default key for the domain
        splitted_to = to.split('@')
        if len(splitted_to) > 1:
            domain = splitted_to[1]
            if get_bool_from_cfg('enc_domain_keymap', domain):
                log("Encrypt domain keymap has key '%s'" %
                    cfg['enc_dec_keymap'][domain])
                # Check we've got a matching key!
                if cfg['enc_domain_keymap'][domain] in keys:
                    log("Using default domain key for recipient '%s'" % to)
                    gpg_to.append((to, cfg['enc_domain_keymap'][domain]))
                    continue
                else:
                    log("Key '%s' in encrypt domain keymap not found in keyring for email address '%s'."
                        % (cfg['enc_domain_keymap'][domain], to))

        # At this point no key has been found
        if verbose:
            log("Recipient (%s) not in PGP domain list for encrypting." % to)
        ungpg_to.append(to)

    if gpg_to != list():
        log("Encrypting email to: %s" % ' '.join(map(lambda x: x[0], gpg_to)))

        # Getting PGP style for recipient
        gpg_to_smtp_mime = list()
        gpg_to_cmdline_mime = list()

        gpg_to_smtp_inline = list()
        gpg_to_cmdline_inline = list()

        for rcpt in gpg_to:
            # Checking pre defined styles in settings first
            if get_bool_from_cfg('pgp_style', rcpt[0], 'mime'):
                gpg_to_smtp_mime.append(rcpt[0])
                gpg_to_cmdline_mime.extend(rcpt[1].split(','))
            elif get_bool_from_cfg('pgp_style', rcpt[0], 'inline'):
                gpg_to_smtp_inline.append(rcpt[0])
                gpg_to_cmdline_inline.extend(rcpt[1].split(','))
            else:
                # Log message only if an unknown style is defined
                if get_bool_from_cfg('pgp_style', rcpt[0]):
                    log("Style %s for recipient %s is not known. Use default as fallback."
                        % (cfg['pgp_style'][rcpt[0]], rcpt[0]))

                # If no style is in settings defined for recipient, use default from settings
                if get_bool_from_cfg('default', 'mime_conversion', 'yes'):
                    gpg_to_smtp_mime.append(rcpt[0])
                    gpg_to_cmdline_mime.extend(rcpt[1].split(','))
                else:
                    gpg_to_smtp_inline.append(rcpt[0])
                    gpg_to_cmdline_inline.extend(rcpt[1].split(','))

        if gpg_to_smtp_mime != list():
            # Encrypt mail with PGP/MIME
            raw_message_mime = copy.deepcopy(raw_message)

            if get_bool_from_cfg('default', 'add_header', 'yes'):
                raw_message_mime[
                    'X-GPG-Mailgate'] = 'Encrypted by GPG Mailgate'

            encrypted_payloads = encrypt_all_payloads_mime(
                raw_message_mime, gpg_to_cmdline_mime)
            raw_message_mime.set_payload(encrypted_payloads)

            send_msg(raw_message_mime.as_string(), gpg_to_smtp_mime)

        if gpg_to_smtp_inline != list():
            # Encrypt mail with PGP/INLINE
            raw_message_inline = copy.deepcopy(raw_message)

            if get_bool_from_cfg('default', 'add_header', 'yes'):
                raw_message_inline[
                    'X-GPG-Mailgate'] = 'Encrypted by GPG Mailgate'

            encrypted_payloads = encrypt_all_payloads_inline(
                raw_message_inline, gpg_to_cmdline_inline)
            raw_message_inline.set_payload(encrypted_payloads)

            send_msg(raw_message_inline.as_string(), gpg_to_smtp_inline)

    return ungpg_to
Exemple #4
0
    for payload in message.get_payload():
        if type(payload.get_payload()) == list:
            encrypted_payloads.extend(encrypt_all_payloads(payload, gpg_to_cmdline))
        else:
            encrypted_payloads.append(encrypt_payload(payload, gpg_to_cmdline))
    return encrypted_payloads


def get_msg(message):
    if not message.is_multipart():
        return message.get_payload()
    return "\n\n".join([str(m) for m in message.get_payload()])


keys = GnuPG.public_keys(cfg["gpg"]["keyhome"])
gpg_to = list()
ungpg_to = list()

for to in to_addrs:
    if to in keys.values() and not (cfg["default"].has_key("keymap_only") and cfg["default"]["keymap_only"] == "yes"):
        gpg_to.append((to, to))
    elif cfg.has_key("keymap") and cfg["keymap"].has_key(to):
        log("Keymap has key '%s'" % cfg["keymap"][to])
        # Check we've got a matching key!  If not, decline to attempt encryption.
        if not keys.has_key(cfg["keymap"][to]):
            log(
                "Key '%s' in keymap not found in keyring for email address '%s'.  Won't encrypt."
                % (cfg["keymap"][to], to)
            )
            ungpg_to.append(to)
Exemple #5
0
def gpg_encrypt( raw_message, recipients ):

	if not get_bool_from_cfg('gpg', 'keyhome'):
		log("No valid entry for gpg keyhome. Encryption aborted.")
		return recipients

	keys = GnuPG.public_keys( cfg['gpg']['keyhome'] )
	for fingerprint in keys:
		keys[fingerprint] = sanitize_case_sense(keys[fingerprint])

	gpg_to = list()
	ungpg_to = list()

	for to in recipients:

		# Check if recipient is in keymap
		if get_bool_from_cfg('enc_keymap', to):
			log("Encrypt keymap has key '%s'" % cfg['enc_keymap'][to] )
			# Check we've got a matching key!
			if cfg['enc_keymap'][to] in keys:
				gpg_to.append( (to, cfg['enc_keymap'][to]) )
				continue
			else:
				log("Key '%s' in encrypt keymap not found in keyring for email address '%s'." % (cfg['enc_keymap'][to], to))

		# Check if key in keychain is present
		if to in keys.values() and not get_bool_from_cfg('default', 'enc_keymap_only', 'yes'):
			gpg_to.append( (to, to) )
			continue

		# Check if there is a default key for the domain
		splitted_to = to.split('@')
		if len(splitted_to) > 1:
			domain = splitted_to[1]
			if get_bool_from_cfg('enc_domain_keymap', domain):
				log("Encrypt domain keymap has key '%s'" % cfg['enc_dec_keymap'][domain] )
				# Check we've got a matching key!
				if cfg['enc_domain_keymap'][domain] in keys:
					log("Using default domain key for recipient '%s'" % to)
					gpg_to.append( (to, cfg['enc_domain_keymap'][domain]) )
					continue
				else:
					log("Key '%s' in encrypt domain keymap not found in keyring for email address '%s'." % (cfg['enc_domain_keymap'][domain], to))
		
		# At this point no key has been found
		if verbose:
			log("Recipient (%s) not in PGP domain list for encrypting." % to)
		ungpg_to.append(to)

	if gpg_to != list():
		log("Encrypting email to: %s" % ' '.join( map(lambda x: x[0], gpg_to) ))

		# Getting PGP style for recipient
		gpg_to_smtp_mime = list()
		gpg_to_cmdline_mime = list()

		gpg_to_smtp_inline = list()
		gpg_to_cmdline_inline = list()

		for rcpt in gpg_to:
			# Checking pre defined styles in settings first
			if get_bool_from_cfg('pgp_style', rcpt[0], 'mime'):
				gpg_to_smtp_mime.append(rcpt[0])
				gpg_to_cmdline_mime.extend(rcpt[1].split(','))
			elif get_bool_from_cfg('pgp_style', rcpt[0], 'inline'):
				gpg_to_smtp_inline.append(rcpt[0])
				gpg_to_cmdline_inline.extend(rcpt[1].split(','))
			else:
				# Log message only if an unknown style is defined
				if get_bool_from_cfg('pgp_style', rcpt[0]):
					log("Style %s for recipient %s is not known. Use default as fallback." % (cfg['pgp_style'][rcpt[0]], rcpt[0]))

				# If no style is in settings defined for recipient, use default from settings
				if get_bool_from_cfg('default', 'mime_conversion', 'yes'):
					gpg_to_smtp_mime.append(rcpt[0])
					gpg_to_cmdline_mime.extend(rcpt[1].split(','))
				else:
					gpg_to_smtp_inline.append(rcpt[0])
					gpg_to_cmdline_inline.extend(rcpt[1].split(','))

		if gpg_to_smtp_mime != list():
			# Encrypt mail with PGP/MIME
			raw_message_mime = copy.deepcopy(raw_message)

			if get_bool_from_cfg('default', 'add_header', 'yes'):
				raw_message_mime['X-GPG-Mailgate'] = 'Encrypted by GPG Mailgate'

			encrypted_payloads = encrypt_all_payloads_mime( raw_message_mime, gpg_to_cmdline_mime )
			raw_message_mime.set_payload( encrypted_payloads )

			send_msg( raw_message_mime.as_string(), gpg_to_smtp_mime )

		if gpg_to_smtp_inline != list():
			# Encrypt mail with PGP/INLINE
			raw_message_inline = copy.deepcopy(raw_message)

			if get_bool_from_cfg('default', 'add_header', 'yes'):
				raw_message_inline['X-GPG-Mailgate'] = 'Encrypted by GPG Mailgate'

			encrypted_payloads = encrypt_all_payloads_inline( raw_message_inline, gpg_to_cmdline_inline )
			raw_message_inline.set_payload( encrypted_payloads )

			send_msg( raw_message_inline.as_string(), gpg_to_smtp_inline )

	return ungpg_to