  
              reactor.callLater(0, getChild)
  
-@@ -535,10 +593,10 @@
+@@ -535,10 +591,10 @@
                  completionDeferred.callback(None)
              else:
                  childpath = joinURL(basepath, childname)

+            that is found; {principalURI} is the C{str} URI of the principal.
+            If not found return None.
+        """
+        # FIXME: should self.principalCollections() return resources instead of URIs?
+
         # Try to match principals in each principal collection on the resource
         collections = waitForDeferred(self.principalCollections(request))
         yield collections
         collections = collections.getResult()
 
-        for collection in collections:
-            principalURI = joinURL(str(collection), authid)
+        for collectionURI in collections:
+            collection = waitForDeferred(request.locateResource(collectionURI))
+            yield collection
+            collection = collection.getResult()
 
-            principal = waitForDeferred(request.locateResource(principalURI))
+            # FIXME: collection = IPrincipalCollectionResource(collection)
+
+            principal = collection.principalForUser(authid)
+
+            # FIXME: Why return a tuple?
+
             yield principal
-            principal = principal.getResult()
-
-            if isPrincipalResource(principal):
-                yield (principal, principalURI)
-                return
+            return
         else:
-            principalCollections = waitForDeferred(self.principalCollections(request))
-            yield principalCollections

             It will errback with an HTTPError(responsecode.FORBIDDEN) if
             the principal isn't found.
         """
+        def gotAuthn(principal):
+            if principal is None:
+                log.msg("Could not find principal matching user id: %s" % (authid,))
+                raise HTTPError(responsecode.FORBIDDEN)
+
+            authnPrincipal, authnURI = principal
+
+            def gotAuthz(principal):
+                authzPrincipal, authzURI = principal
+                return ((authnPrincipal, authnURI), (authzPrincipal, authzURI))
+
+            d = self.authorizationPrincipal(request, authid, authnPrincipal, authnURI)
+            d.addCallback(gotAuthz)
+            return d
+
