# HG changeset patch # User Paul Boddie # Date 1391190797 -3600 # Node ID 61b570ca9d2f0abbd756b9bf28a57ede5b8b5171 # Parent 6436bd5abb403699b7a5089fcce7cca8bb94e5a4 Implemented switching to the relaying user in order to queue messages for forwarding. diff -r 6436bd5abb40 -r 61b570ca9d2f MoinMessageSupport.py --- a/MoinMessageSupport.py Fri Jan 31 18:52:05 2014 +0100 +++ b/MoinMessageSupport.py Fri Jan 31 18:53:17 2014 +0100 @@ -6,7 +6,7 @@ @license: GNU GPL (v2 or later), see COPYING.txt for details. """ -from MoinMoin import config +from MoinMoin import config, user from MoinMoin.Page import Page from MoinMoin.action import AttachFile from MoinMoin.formatter import text_html @@ -67,6 +67,8 @@ # Detect any indicated recipient and change the target page, if # appropriate. + new_user = None + if message.has_key("To"): try: parameters = get_recipient_details(request, message["To"], main=True) @@ -81,15 +83,54 @@ "Details: %s" % exc.message) return else: + # Recipients with pages can have their messages redirected to + # those pages. + if parameters["type"] == "page": self.page = Page(request, parameters["location"]) self.init_store() - # NOTE: Support "url" for message forwarding. + # Recipients with URLs can have their messages forwarded. + + # Recipients accessible via relays have their messages + # forwarded. + + elif parameters["type"] in ("url", "relay"): + + # Get the relaying user page and select it. + + relaying_user = getattr(self.request.cfg, "moinmessage_gpg_relaying_user") + relaying_page = relaying_user and get_local_homepage(request, relaying_user) + + if not relaying_page: + writeHeaders(request, "text/plain", getMetadata(self.page), "403 Forbidden") + request.write("This site is not able to forward the message to the recipient.") + return + + self.page = Page(request, relaying_page) + self.init_store() + new_user = relaying_user + + # The stored messages should then be processed + # asynchronously. + + # NOTE: An action should be able to process stored messages, + # NOTE: by invoking code that is also used asynchronously. + + # Switch to the relaying user if necessary. + + if new_user: + user = request.user + request.user = get_user(request, new_user) or user + request.user.auth_method = "pgp-overridden" # Handle the parsed message. - self.handle_message(message) + try: + self.handle_message(message) + finally: + if new_user: + request.user = user def handle_message(self, message): @@ -174,7 +215,7 @@ # Accept any message whose sender was authenticated by the PGP method. - if request.user and request.user.valid and request.user.auth_method == "pgp": + if request.user and request.user.valid and request.user.auth_method in ("pgp", "pgp-overridden"): # Handle the embedded message. @@ -277,6 +318,21 @@ # Utility functions. +def get_user(request, username): + + "Return the user having the given 'username'." + + uid = user.getUserId(request, username) + + # If the user does not exist, just return None. + + if not uid: + return None + + # Otherwise, return the requested user. + + return user.User(request, uid) + def get_homedir(request): "Locate the GPG home directory." @@ -321,17 +377,30 @@ subpage = getattr(request.cfg, "moinmessage_gpg_recipients_page", "MoinMessageRecipientsDict") if not main: - homedetails = getInterwikiHomePage(request) - - if homedetails: - homewiki, homepage = homedetails - if homewiki == "Self": - recipients = getWikiDict("%s/%s" % (homepage, subpage), request) - if recipients: - return filter_recipients(recipients, sending, fetching) + homepage = get_local_homepage(request, None) + recipients = getWikiDict("%s/%s" % (homepage, subpage), request) + if recipients: + return filter_recipients(recipients, sending, fetching) return filter_recipients(getWikiDict(subpage, request), sending, fetching) +def get_local_homepage(request, username): + + """ + Using the 'request', return the homepage for the given 'username' or None if + no local homepage exists for the user. If 'username' is None, the current + user's homepage is located. + """ + + homedetails = getInterwikiHomePage(request, username) + + if homedetails: + homewiki, homepage = homedetails + if homewiki == "Self": + return homepage + + return None + def get_username_for_fingerprint(request, fingerprint): """