paul@31 | 1 | #!/usr/bin/env python |
paul@31 | 2 | |
paul@31 | 3 | from MoinMessage import * |
paul@31 | 4 | from email.mime.text import MIMEText |
paul@62 | 5 | from email.parser import Parser |
paul@31 | 6 | import sys |
paul@31 | 7 | |
paul@71 | 8 | def decrypt(message): |
paul@71 | 9 | |
paul@71 | 10 | "Decrypt 'message' if necessary." |
paul@71 | 11 | |
paul@71 | 12 | if is_encrypted(message): |
paul@71 | 13 | text = gpg.decryptMessage(message) |
paul@99 | 14 | return Parser().parsestr(text) |
paul@71 | 15 | else: |
paul@71 | 16 | return message |
paul@71 | 17 | |
paul@71 | 18 | def verify(message): |
paul@71 | 19 | |
paul@71 | 20 | "Verify 'message' if possible." |
paul@71 | 21 | |
paul@71 | 22 | if is_signed(message): |
paul@71 | 23 | return gpg.verifyMessage(message) |
paul@71 | 24 | else: |
paul@71 | 25 | return None, None, message |
paul@71 | 26 | |
paul@31 | 27 | if __name__ == "__main__": |
paul@31 | 28 | try: |
paul@31 | 29 | signer = sys.argv[1] |
paul@31 | 30 | recipient = sys.argv[2] |
paul@31 | 31 | url = sys.argv[3] + "?action=FetchMessages" |
paul@31 | 32 | args = sys.argv[4:] |
paul@31 | 33 | except IndexError: |
paul@31 | 34 | args = None |
paul@31 | 35 | |
paul@31 | 36 | if not args: |
paul@31 | 37 | print >>sys.stderr, "Need a signer, recipient, URL and some commands as arguments to this program." |
paul@31 | 38 | sys.exit(1) |
paul@31 | 39 | |
paul@31 | 40 | message = Message() |
paul@31 | 41 | parts = [] |
paul@31 | 42 | |
paul@112 | 43 | part = MIMEText("\n".join(args), "x-moinmessage-fetch", sys.stdin.encoding) |
paul@31 | 44 | message.add_update(part) |
paul@31 | 45 | |
paul@107 | 46 | # Sign and encrypt the request. |
paul@107 | 47 | |
paul@31 | 48 | email_message = message.get_payload() |
paul@31 | 49 | gpg = GPG() |
paul@31 | 50 | |
paul@31 | 51 | try: |
paul@31 | 52 | signed_message = gpg.signMessage(email_message, signer) |
paul@31 | 53 | encrypted_message = gpg.encryptMessage(signed_message, recipient) |
paul@108 | 54 | resp = sendMessageOpener(encrypted_message, url) |
paul@108 | 55 | mailbox = Parser().parse(resp) |
paul@62 | 56 | |
paul@107 | 57 | # Decrypt and verify the response. |
paul@107 | 58 | |
paul@71 | 59 | mailbox = decrypt(mailbox) |
paul@71 | 60 | fingerprint, identity, content = verify(mailbox) |
paul@62 | 61 | |
paul@31 | 62 | except MoinMessageError, exc: |
paul@70 | 63 | print >>sys.stderr, exc |
paul@31 | 64 | |
paul@107 | 65 | # Indicate the signature details of the response. |
paul@107 | 66 | |
paul@107 | 67 | if fingerprint and identity: |
paul@107 | 68 | print >>sys.stderr, "Messages signed by", fingerprint, identity |
paul@107 | 69 | else: |
paul@107 | 70 | print >>sys.stderr, "Message not signed!" |
paul@107 | 71 | |
paul@107 | 72 | print >>sys.stderr |
paul@107 | 73 | |
paul@107 | 74 | # Show the retrieved messages. |
paul@107 | 75 | |
paul@107 | 76 | if content.is_multipart(): |
paul@107 | 77 | for part in content.get_payload(): |
paul@107 | 78 | |
paul@107 | 79 | try: |
paul@107 | 80 | part = decrypt(part) |
paul@107 | 81 | fingerprint, identity, part = verify(part) |
paul@107 | 82 | |
paul@107 | 83 | except MoinMessageError, exc: |
paul@107 | 84 | print >>sys.stderr, "Message not shown." |
paul@107 | 85 | print >>sys.stderr, exc |
paul@107 | 86 | continue |
paul@107 | 87 | |
paul@107 | 88 | if fingerprint and identity: |
paul@107 | 89 | print >>sys.stderr, "Part signed by", fingerprint, identity |
paul@107 | 90 | print part |
paul@107 | 91 | else: |
paul@107 | 92 | print content |
paul@107 | 93 | |
paul@31 | 94 | # vim: tabstop=4 expandtab shiftwidth=4 |