]> gitweb.pimeys.fr Git - scripts-20-100.git/commitdiff
Pour transformer un mail en pgp/mime en un PGP SIGNED MESSAGE
authorVincent Le Gallic <legallic@crans.org>
Sun, 26 Jan 2014 00:24:07 +0000 (01:24 +0100)
committerVincent Le Gallic <legallic@crans.org>
Sun, 26 Jan 2014 00:24:07 +0000 (01:24 +0100)
clearmime.py [new file with mode: 0755]

diff --git a/clearmime.py b/clearmime.py
new file mode 100755 (executable)
index 0000000..d53c7d5
--- /dev/null
@@ -0,0 +1,69 @@
+#!/usr/bin/python
+
+# Copyright 2008 Lenny Domnitser <http://domnit.org/>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or (at
+# your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+__all__ = 'clarify',
+__author__ = 'Lenny Domnitser'
+__version__ = '0.1'
+
+import email
+import re
+
+TEMPLATE = '''-----BEGIN PGP SIGNED MESSAGE-----
+Hash: %(hashname)s
+NotDashEscaped: You need GnuPG to verify this message
+
+%(text)s%(sig)s'''
+
+
+def _clarify(message, messagetext):
+    if message.get_content_type() == 'multipart/signed':
+        if message.get_param('protocol') == 'application/pgp-signature':
+            hashname = message.get_param('micalg').upper()
+            assert hashname.startswith('PGP-')
+            hashname = hashname.replace('PGP-', '', 1)
+            textmess, sigmess = message.get_payload()
+            assert sigmess.get_content_type() == 'application/pgp-signature'
+            #text = textmess.as_string() - not byte-for-byte accurate
+            text = messagetext.split('\n--%s\n' % message.get_boundary(), 2)[1]
+            sig = sigmess.get_payload()
+            assert isinstance(sig, str)
+            # Setting content-type to application/octet instead of text/plain
+            # to maintain CRLF endings. Using replace_header instead of
+            # set_type because replace_header clears parameters.
+            message.replace_header('Content-Type', 'application/octet')
+            clearsign = TEMPLATE % locals()
+            clearsign = clearsign.replace(
+                '\r\n', '\n').replace('\r', '\n').replace('\n', '\r\n')
+            message.set_payload(clearsign)
+    elif message.is_multipart():
+        for message in message.get_payload():
+            _clarify(message, messagetext)
+
+
+def clarify(messagetext):
+    '''given a string containing a MIME message, returns a string
+    where PGP/MIME messages are replaced with clearsigned messages.'''
+
+    message = email.message_from_string(messagetext)
+    _clarify(message, messagetext)
+    return message.as_string()
+
+
+if __name__ == '__main__':
+    import sys
+    sys.stdout.write(clarify(sys.stdin.read()))
+