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