[CalendarServer-changes] [8108] CalendarServer/trunk/twistedcaldav/directory

source_changes at macosforge.org source_changes at macosforge.org
Tue Sep 20 12:07:10 PDT 2011


Revision: 8108
          http://trac.macosforge.org/projects/calendarserver/changeset/8108
Author:   sagen at apple.com
Date:     2011-09-20 12:07:10 -0700 (Tue, 20 Sep 2011)
Log Message:
-----------
When wiki server xmlrpc returns an unknown fault code, respond to client with 503 instead of 404.

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/directory/test/test_wiki.py
    CalendarServer/trunk/twistedcaldav/directory/wiki.py

Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_wiki.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/test_wiki.py	2011-09-20 15:50:54 UTC (rev 8107)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_wiki.py	2011-09-20 19:07:10 UTC (rev 8108)
@@ -15,7 +15,13 @@
 ##
 
 from twistedcaldav.test.util import TestCase
-from twistedcaldav.directory.wiki import WikiDirectoryService, WikiDirectoryRecord
+from twistedcaldav.directory.wiki import (
+    WikiDirectoryService, WikiDirectoryRecord, getWikiAccess
+)
+from twisted.internet.defer import inlineCallbacks, succeed
+from twisted.web.xmlrpc import Fault
+from twext.web2.http import HTTPError
+from twext.web2 import responsecode
 
 class WikiTestCase(TestCase):
     """
@@ -32,3 +38,39 @@
         )
         self.assertTrue(record.enabled)
         self.assertTrue(record.enabledForCalendaring)
+
+
+    @inlineCallbacks
+    def test_getWikiAccess(self):
+        """
+        XMLRPC Faults result in HTTPErrors
+        """
+
+        def successful(self, user, wiki):
+            return succeed("read")
+
+        def fault2(self, user, wiki):
+            raise Fault(2, "Bad session")
+
+        def fault12(self, user, wiki):
+            raise Fault(12, "Non-existent wiki")
+
+        def fault13(self, user, wiki):
+            raise Fault(13, "Non-existent wiki")
+
+        access = (yield getWikiAccess("user", "wiki", method=successful))
+        self.assertEquals(access, "read")
+
+        for (method, code) in (
+            (fault2, responsecode.FORBIDDEN),
+            (fault12, responsecode.NOT_FOUND),
+            (fault13, responsecode.SERVICE_UNAVAILABLE),
+        ):
+            try:
+                access = (yield getWikiAccess("user", "wiki", method=method))
+            except HTTPError, e:
+                self.assertEquals(e.response.code, code)
+            except:
+                self.fail("Incorrect exception")
+            else:
+                self.fail("Didn't raise exception")

Modified: CalendarServer/trunk/twistedcaldav/directory/wiki.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/wiki.py	2011-09-20 15:50:54 UTC (rev 8107)
+++ CalendarServer/trunk/twistedcaldav/directory/wiki.py	2011-09-20 19:07:10 UTC (rev 8108)
@@ -129,19 +129,20 @@
 
 
 @inlineCallbacks
-def getWikiAccess(userID, wikiID):
+def getWikiAccess(userID, wikiID, method=None):
     """
     Ask the wiki server we're paired with what level of access the userID has
     for the given wikiID.  Possible values are "read", "write", and "admin"
     (which we treat as "write").
     """
     wikiConfig = config.Authentication.Wiki
-    proxy = Proxy(wikiConfig["URL"])
+    if method is None:
+        method = Proxy(wikiConfig["URL"]).callRemote
     try:
 
         log.debug("Looking up Wiki ACL for: user [%s], wiki [%s]" % (userID,
             wikiID))
-        access = (yield proxy.callRemote(wikiConfig["WikiMethod"],
+        access = (yield method(wikiConfig["WikiMethod"],
             userID, wikiID))
 
         log.debug("Wiki ACL result: user [%s], wiki [%s], access [%s]" % (userID,
@@ -154,12 +155,21 @@
             wikiID, fault))
 
         if fault.faultCode == 2: # non-existent user
-            raise HTTPError(StatusResponse(responsecode.FORBIDDEN, fault.faultString))
+            raise HTTPError(StatusResponse(responsecode.FORBIDDEN,
+                fault.faultString))
 
-        else: # fault.faultCode == 12, non-existent wiki
-            raise HTTPError(StatusResponse(responsecode.NOT_FOUND, fault.faultString))
+        elif fault.faultCode == 12: # non-existent wiki
+            raise HTTPError(StatusResponse(responsecode.NOT_FOUND,
+                fault.faultString))
 
+        else: # Unknown fault returned from wiki server.  Log the error and
+              # return 503 Service Unavailable to the client.
+            log.error("Wiki ACL error: user [%s], wiki [%s], FAULT [%s]" %
+                (userID, wikiID, fault))
+            raise HTTPError(StatusResponse(responsecode.SERVICE_UNAVAILABLE,
+                fault.faultString))
 
+
 @inlineCallbacks
 def getWikiACL(resource, request):
     """
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110920/1218efad/attachment.html>


More information about the calendarserver-changes mailing list