1.1 --- a/actions/PostMessage.py Sat Jul 21 02:01:16 2012 +0200
1.2 +++ b/actions/PostMessage.py Sat Jul 21 19:58:34 2012 +0200
1.3 @@ -7,9 +7,10 @@
1.4 """
1.5
1.6 from MoinMoin.PageEditor import PageEditor
1.7 +from MoinMoin.log import getLogger
1.8 from MoinSupport import *
1.9 from email.parser import Parser
1.10 -import os
1.11 +from subprocess import Popen, PIPE
1.12
1.13 try:
1.14 from cStringIO import StringIO
1.15 @@ -41,8 +42,7 @@
1.16
1.17 # Get the message.
1.18
1.19 - message_text = StringIO(request.read(content_length))
1.20 - self.handle_message(message_text)
1.21 + self.handle_message(StringIO(request.read(content_length)))
1.22
1.23 def handle_message(self, message_text):
1.24
1.25 @@ -83,18 +83,35 @@
1.26
1.27 # Decrypt the message text.
1.28
1.29 - to_child, from_child, error_child = os.popen3(["gpg", "--no-default-keyring", "--homedir", homedir, "--decrypt"])
1.30 - to_child.write(part.get_payload())
1.31 - to_child.close()
1.32 - #print >>open("/tmp/log.txt", "a"), error_child.read()
1.33 + cmd = Popen(["gpg", "--homedir", homedir, "--decrypt"],
1.34 + stdin=PIPE, stdout=PIPE, stderr=PIPE)
1.35 +
1.36 + cmd.stdin.write(part.get_payload())
1.37 + cmd.stdin.close()
1.38 +
1.39 + errors = cmd.stderr.read()
1.40 + if errors:
1.41 + getLogger(__name__).warning(errors)
1.42
1.43 # Handle the embedded message.
1.44
1.45 try:
1.46 - self.handle_plaintext_message(from_child)
1.47 + message_text = cmd.stdout.read()
1.48 +
1.49 + # With a zero return code, accept the message.
1.50 +
1.51 + if not cmd.wait():
1.52 + self.handle_plaintext_message(StringIO(message_text))
1.53 +
1.54 + # Otherwise, reject the unverified message.
1.55 +
1.56 + else:
1.57 + writeHeaders(request, "text/plain", getMetadata(self.page), "403 Forbidden")
1.58 + request.write("The message could not be verified.")
1.59 +
1.60 finally:
1.61 - from_child.close()
1.62 - error_child.close()
1.63 + cmd.stdout.close()
1.64 + cmd.stderr.close()
1.65
1.66 # Reject unsigned payloads.
1.67
1.68 @@ -163,7 +180,7 @@
1.69 page_editor.saveText("\n\n".join(body), 0)
1.70
1.71 def is_collection(message):
1.72 - return message.get("Update-Type") == "Collection"
1.73 + return message.get("Update-Type") == "collection"
1.74
1.75 def to_replace(message):
1.76 return message.get("Update-Action") == "replace"