paul@31 | 1 | # -*- coding: iso-8859-1 -*- |
paul@31 | 2 | """ |
paul@31 | 3 | MoinMoin - FetchMessages Action |
paul@31 | 4 | |
paul@112 | 5 | @copyright: 2012, 2013, 2014 by Paul Boddie <paul@boddie.org.uk> |
paul@31 | 6 | @license: GNU GPL (v2 or later), see COPYING.txt for details. |
paul@31 | 7 | """ |
paul@31 | 8 | |
paul@61 | 9 | from MoinSupport import getMetadata, writeHeaders, parseDictEntry |
paul@112 | 10 | from MoinMessage import GPG, MessageInterface |
paul@61 | 11 | from MoinMessageSupport import MoinMessageAction, \ |
paul@84 | 12 | get_signing_users, get_recipient_details, \ |
paul@84 | 13 | MoinMessageRecipientError |
paul@31 | 14 | |
paul@31 | 15 | Dependencies = ['pages'] |
paul@31 | 16 | |
paul@31 | 17 | class FetchMessages(MoinMessageAction): |
paul@31 | 18 | |
paul@31 | 19 | "A handler for requests accessing messages." |
paul@31 | 20 | |
paul@31 | 21 | def handle_message_content(self, content): |
paul@31 | 22 | |
paul@31 | 23 | "Handle the given message 'content'." |
paul@31 | 24 | |
paul@31 | 25 | request = self.request |
paul@31 | 26 | |
paul@112 | 27 | # Employing an unstandardised content type. |
paul@31 | 28 | |
paul@112 | 29 | if not content.get_content_type() == "text/x-moinmessage-fetch": |
paul@84 | 30 | writeHeaders(request, "text/plain", getMetadata(self.page), "415 Unsupported Media Type") |
paul@31 | 31 | request.write("The content does not appear to be a request for messages.") |
paul@31 | 32 | return |
paul@31 | 33 | |
paul@61 | 34 | homedir = self.get_homedir() |
paul@61 | 35 | if not homedir: |
paul@84 | 36 | writeHeaders(request, "text/plain", getMetadata(self.page), "403 Forbidden") |
paul@84 | 37 | request.write("This site is not configured for this request.") |
paul@61 | 38 | return |
paul@61 | 39 | |
paul@61 | 40 | gpg = GPG(homedir) |
paul@61 | 41 | |
paul@61 | 42 | # Get keys for signing and encrypting. |
paul@61 | 43 | # The signing key will be this wiki's signing key for the user |
paul@61 | 44 | # requesting the messages. |
paul@61 | 45 | # The encryption key will be the key associated with the user requesting |
paul@61 | 46 | # the messages, found in the recipients mapping. |
paul@61 | 47 | |
paul@61 | 48 | recipient = request.user.name |
paul@61 | 49 | |
paul@61 | 50 | signing_users = get_signing_users(request) |
paul@61 | 51 | signer = signing_users and signing_users.get(recipient) |
paul@61 | 52 | |
paul@61 | 53 | # Get the recipient details. |
paul@61 | 54 | |
paul@84 | 55 | try: |
paul@84 | 56 | parameters = get_recipient_details(request, recipient, fetching=True) |
paul@84 | 57 | except MoinMessageRecipientError, exc: |
paul@61 | 58 | writeHeaders(request, "text/plain", getMetadata(self.page), "403 Forbidden") |
paul@84 | 59 | request.write(exc.message) |
paul@61 | 60 | return |
paul@61 | 61 | |
paul@112 | 62 | # Obtain commands from the payload, returning a collection of messages |
paul@112 | 63 | # and command results. |
paul@31 | 64 | |
paul@42 | 65 | commands = content.get_payload(decode=True) |
paul@112 | 66 | message = MessageInterface(self.store).execute(commands) |
paul@31 | 67 | |
paul@61 | 68 | # Sign and encrypt the message. |
paul@61 | 69 | |
paul@61 | 70 | message = message.get_payload() |
paul@61 | 71 | |
paul@61 | 72 | if signer: |
paul@61 | 73 | message = gpg.signMessage(message, signer) |
paul@61 | 74 | |
paul@61 | 75 | message = gpg.encryptMessage(message, parameters["fingerprint"]) |
paul@61 | 76 | |
paul@31 | 77 | # Write the response. |
paul@31 | 78 | |
paul@112 | 79 | writeHeaders(request, "text/x-moinmessage-fetch-response", getMetadata(self.page)) |
paul@61 | 80 | request.write(message.as_string()) |
paul@31 | 81 | |
paul@31 | 82 | # Action function. |
paul@31 | 83 | |
paul@31 | 84 | def execute(pagename, request): |
paul@31 | 85 | FetchMessages(pagename, request).do_action() # instead of render |
paul@31 | 86 | |
paul@31 | 87 | # vim: tabstop=4 expandtab shiftwidth=4 |