#!/usr/bin/python
# decode-pgpmime - a PGP/MIME-to-Traditional-PGP message format converter
#######################################################
# This work, including the source code, documentation
# and related data, is placed into the public domain.
# 
# The orginal author is Dwayne C. Litzenberger.
# 
# THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY
# OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF
# MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE,
# ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE
# RESULTING FROM THE USE, MODIFICATION, OR
# REDISTRIBUTION OF THIS SOFTWARE.
#######################################################
# Put something like this in your .procmailrc:
#   :0fw
#   * ^Content-Type: multipart/encrypted;.*protocol="application/pgp-encrypted"
#   | /path/to/decode-pgpmime
#######################################################
# Last Modified: Fri, 27 Feb 2004 14:32:27 -0600

PROGRAM = "decode-pgpmime/1.0"

import email, sys

message = email.message_from_file(sys.stdin)
if message.get_content_type() != "multipart/encrypted":
    print >>sys.stderr, "Message is not multipart/encrypted"
    sys.exit(1)
if message.get_param("protocol") != "application/pgp-encrypted":
    print >>sys.stderr, "Message protocol is not application/pgp-encrypted"
    sys.exit(1)

payload = message.get_payload()
if len(payload) != 2 or \
        payload[0].get_content_type() != "application/pgp-encrypted" or \
        payload[1].get_content_type() != "application/octet-stream":
    print >>sys.stderr, "Message does not conform to RFC 3156.  Aborting."
    sys.exit(1)

control_info = [line.strip() for line in payload[0].get_payload().split("\n")]
control_info = filter(lambda x: ":" in x, control_info)
control_info = [line.split(":", 1) for line in control_info]
control_info = dict([(x[0].lower(), x[1].lstrip()) for x in control_info])
if control_info['version'] != "1":
    print >>sys.stderr, "application/pgp-encrypted version is not 1.  Aborting."
    sys.exit(1)

message.add_header("X-Filtered-By", PROGRAM)
message.replace_header("Content-Type", "text/plain")
message.set_payload(payload[1].get_payload())

sys.stdout.write(message.as_string(message.get_unixfrom() is not None))
sys.exit(0)
