[CalendarServer-changes] [1897] CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav

source_changes at macosforge.org source_changes at macosforge.org
Mon Sep 24 16:26:37 PDT 2007


Revision: 1897
          http://trac.macosforge.org/projects/calendarserver/changeset/1897
Author:   wsanchez at apple.com
Date:     2007-09-24 16:26:36 -0700 (Mon, 24 Sep 2007)

Log Message:
-----------
Pulled up r1889 from trunk.

Modified Paths:
--------------
    CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/appleopendirectory.py
    CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/calendar.py
    CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/directory.py
    CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/idirectory.py
    CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/principal.py
    CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/test/test_opendirectory.py
    CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/extensions.py
    CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/static.py

Modified: CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/appleopendirectory.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/appleopendirectory.py	2007-09-24 18:16:18 UTC (rev 1896)
+++ CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/appleopendirectory.py	2007-09-24 23:26:36 UTC (rev 1897)
@@ -519,7 +519,11 @@
                     query = dsquery.expression(dsquery.expression.OR,
                                                guidQueries)
 
-            else:
+            #
+            # For groups, we'll load all entries, even if they don't
+            # have a services locator for this server.
+            #
+            elif recordType != DirectoryService.recordType_groups:
                 subquery = dsquery.match(dsattributes.kDSNAttrServicesLocator, self.servicetag, dsattributes.eDSExact)
                 if query is None:
                     query = subquery
@@ -568,13 +572,17 @@
         guids   = {}
 
         for (key, value) in results.iteritems():
+            enabledForCalendaring = True
+
             if self.requireComputerRecord:
-                services = value.get(dsattributes.kDSNAttrServicesLocator)
+                if not value.get(dsattributes.kDSNAttrServicesLocator):
+                    if recordType == DirectoryService.recordType_groups:
+                        enabledForCalendaring = False
+                        log.msg("Group %s is not enabled for calendaring but may be used in ACLs" % (key,))
+                    else:
+                        log.err("Directory (incorrectly) returned a record with no ServicesLocator attribute: %s" % (key,))
+                        continue
 
-                if not services:
-                    log.err("Directory (incorrectly) returned a record with no ServicesLocator attribute: %s" % (key,))
-                    continue
-
             # Now get useful record info.
             recordShortName = key
             guid = value.get(dsattributes.kDS1AttrGeneratedUID)
@@ -583,7 +591,10 @@
             realName = value.get(dsattributes.kDS1AttrDistinguishedName)
 
             # Get calendar user addresses from directory record.
-            cuaddrset = self._getCalendarUserAddresses(recordType, key, value)
+            if enabledForCalendaring:
+                calendarUserAddresses = self._getCalendarUserAddresses(recordType, key, value)
+            else:
+                calendarUserAddresses = ()
 
             # Special case for groups.
             if recordType == DirectoryService.recordType_groups:
@@ -616,9 +627,10 @@
                 guid                  = guid,
                 shortName             = recordShortName,
                 fullName              = realName,
-                calendarUserAddresses = cuaddrset,
+                calendarUserAddresses = calendarUserAddresses,
+                autoSchedule          = autoSchedule,
+                enabledForCalendaring = enabledForCalendaring,
                 memberGUIDs           = memberGUIDs,
-                autoSchedule          = autoSchedule,
                 proxyGUIDs            = proxyGUIDs,
             )
             records[recordShortName] = guids[guid] = record
@@ -662,7 +674,11 @@
     """
     Open Directory implementation of L{IDirectoryRecord}.
     """
-    def __init__(self, service, recordType, guid, shortName, fullName, calendarUserAddresses, memberGUIDs, autoSchedule, proxyGUIDs):
+    def __init__(
+        self, service, recordType, guid, shortName, fullName,
+        calendarUserAddresses, autoSchedule, enabledForCalendaring,
+        memberGUIDs, proxyGUIDs,
+    ):
         super(OpenDirectoryRecord, self).__init__(
             service               = service,
             recordType            = recordType,
@@ -671,6 +687,7 @@
             fullName              = fullName,
             calendarUserAddresses = calendarUserAddresses,
             autoSchedule          = autoSchedule,
+            enabledForCalendaring = enabledForCalendaring,
         )
         self._memberGUIDs = tuple(memberGUIDs)
         self._proxyGUIDs = tuple(proxyGUIDs)
@@ -681,9 +698,7 @@
 
         for guid in self._memberGUIDs:
             userRecord = self.service.recordWithGUID(guid)
-            if userRecord is None:
-                log.err("No record for member of group %s with GUID %s" % (self.shortName, guid))
-            else:
+            if userRecord is not None:
                 yield userRecord
 
     def groups(self):

Modified: CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/calendar.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/calendar.py	2007-09-24 18:16:18 UTC (rev 1896)
+++ CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/calendar.py	2007-09-24 23:26:36 UTC (rev 1897)
@@ -149,7 +149,11 @@
         return self.provisionChild(name)
 
     def listChildren(self):
-        return (record.shortName for record in self.directory.listRecords(self.recordType))
+        return (
+            record.shortName
+            for record in self.directory.listRecords(self.recordType)
+            if record.enabledForCalendaring
+        )
 
     ##
     # DAV

Modified: CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/directory.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/directory.py	2007-09-24 18:16:18 UTC (rev 1896)
+++ CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/directory.py	2007-09-24 23:26:36 UTC (rev 1897)
@@ -155,7 +155,10 @@
             self.fullName
         )
 
-    def __init__(self, service, recordType, guid, shortName, fullName, calendarUserAddresses, autoSchedule):
+    def __init__(
+        self, service, recordType, guid, shortName, fullName,
+        calendarUserAddresses, autoSchedule, enabledForCalendaring=True,
+    ):
         assert service.realmName is not None
         assert recordType
         assert shortName
@@ -163,13 +166,17 @@
         if not guid:
             guid = uuidFromName(service.guid, "%s:%s" % (recordType, shortName))
 
-        calendarUserAddresses.add("urn:uuid:%s" % (guid,))
+        if enabledForCalendaring:
+            calendarUserAddresses.add("urn:uuid:%s" % (guid,))
+        else:
+            assert len(calendarUserAddresses) == 0
 
         self.service               = service
         self.recordType            = recordType
         self.guid                  = guid
         self.shortName             = shortName
         self.fullName              = fullName
+        self.enabledForCalendaring = enabledForCalendaring
         self.calendarUserAddresses = calendarUserAddresses
         self.autoSchedule          = autoSchedule
 

Modified: CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/idirectory.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/idirectory.py	2007-09-24 18:16:18 UTC (rev 1896)
+++ CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/idirectory.py	2007-09-24 23:26:36 UTC (rev 1897)
@@ -78,6 +78,8 @@
     shortName             = Attribute("The name of this record.")
     fullName              = Attribute("The full name of this record.")
     calendarUserAddresses = Attribute("A set of calendar user addresses for this record.")
+    autoSchedule          = Attribute("Principal identified by this record should automatically accept/deny meetings.")
+    enabledForCalendaring = Attribute("Determines whether this record should be provisioned with a calendar home.")
 
     def members():
         """

Modified: CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/principal.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/principal.py	2007-09-24 18:16:18 UTC (rev 1896)
+++ CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/principal.py	2007-09-24 23:26:36 UTC (rev 1897)
@@ -24,6 +24,7 @@
     "DirectoryPrincipalProvisioningResource",
     "DirectoryPrincipalTypeProvisioningResource",
     "DirectoryPrincipalResource",
+    "DirectoryCalendarPrincipalResource",
 ]
 
 from cgi import escape
@@ -42,7 +43,7 @@
 from twistedcaldav.directory.calendaruserproxy import CalendarUserProxyDatabase
 from twistedcaldav.directory.calendaruserproxy import CalendarUserProxyPrincipalResource
 from twistedcaldav.directory.directory import DirectoryService
-from twistedcaldav.extensions import ReadOnlyResourceMixIn, DAVFile
+from twistedcaldav.extensions import ReadOnlyResourceMixIn, DAVFile, DAVPrincipalResource
 from twistedcaldav.resource import CalendarPrincipalCollectionResource, CalendarPrincipalResource
 from twistedcaldav.static import AutoProvisioningFileMixIn
 from twistedcaldav.directory.idirectory import IDirectoryService
@@ -316,7 +317,10 @@
             log.err("No principal found for UID: %s" % (name,))
             return None
 
-        primaryPrincipal = DirectoryPrincipalResource(self.fp.child(name).path, self, record)
+        if record.enabledForCalendaring:
+            primaryPrincipal = DirectoryCalendarPrincipalResource(self.fp.child(name).path, self, record)
+        else:
+            primaryPrincipal = DirectoryPrincipalResource(self.fp.child(name).path, self, record)
 
         if subType is None:
             return primaryPrincipal
@@ -334,7 +338,7 @@
     def principalCollections(self):
         return self.parent.principalCollections()
 
-class DirectoryPrincipalResource (AutoProvisioningFileMixIn, PermissionsMixIn, CalendarPrincipalResource, DAVFile):
+class DirectoryPrincipalResource (AutoProvisioningFileMixIn, PermissionsMixIn, DAVPrincipalResource, DAVFile):
     """
     Directory principal resource.
     """
@@ -344,6 +348,8 @@
         @param parent: the parent of this resource.
         @param record: the L{IDirectoryRecord} that this resource represents.
         """
+        super(DirectoryPrincipalResource, self).__init__(path)
+
         if self.isCollection():
             slash = "/"
         else:
@@ -353,8 +359,6 @@
 
         url = joinURL(parent.principalCollectionURL(), record.guid) + slash
 
-        super(DirectoryPrincipalResource, self).__init__(path, url)
-
         self.record = record
         self.parent = parent
         self._url   = url
@@ -419,8 +423,6 @@
                 """\nAlternate URIs:\n"""          , format_list(link(u) for u in self.alternateURIs()),
                 """\nGroup members:\n"""           , format_principals(self.groupMembers()),
                 """\nGroup memberships:\n"""       , format_principals(self.groupMemberships()),
-                """\nCalendar homes:\n"""          , format_list(link(u) for u in self.calendarHomeURLs()),
-                """\nCalendar user addresses:\n""" , format_list(link(a) for a in self.calendarUserAddresses()),
                 """</pre></blockquote></div>""",
                 output
             ))
@@ -433,6 +435,9 @@
     # DAV
     ##
 
+    def isCollection(self):
+        return True
+
     def displayName(self):
         if self.record.fullName:
             return self.record.fullName
@@ -473,6 +478,98 @@
 
         return relatives
 
+    def groupMembers(self):
+        return self._getRelatives("members")
+
+    def groupMemberships(self):
+        return self._getRelatives("groups")
+
+    def principalCollections(self):
+        return self.parent.principalCollections()
+
+    def principalUID(self):
+        return self.record.guid
+        
+    ##
+    # Static
+    ##
+
+    def createSimilarFile(self, path):
+        log.err("Attempt to create clone %r of resource %r" % (path, self))
+        raise HTTPError(responsecode.NOT_FOUND)
+
+    def getChild(self, name):
+        if name == "":
+            return self
+
+        return None
+
+    def listChildren(self):
+        return ()
+
+class DirectoryCalendarPrincipalResource (DirectoryPrincipalResource, CalendarPrincipalResource):
+    """
+    Directory calendar principal resource.
+    """
+    def renderDirectoryBody(self, request):
+        def format_list(items, *args):
+            def genlist():
+                try:
+                    item = None
+                    for item in items:
+                        yield " -> %s\n" % (item,)
+                    if item is None:
+                        yield " '()\n"
+                except Exception, e:
+                    log.err("Exception while rendering: %s" % (e,))
+                    Failure().printTraceback()
+                    yield "  ** %s **: %s\n" % (e.__class__.__name__, e)
+            return "".join(genlist())
+
+        def format_principals(principals):
+            return format_list(
+                """<a href="%s">%s</a>""" % (principal.principalURL(), escape(str(principal)))
+                for principal in principals
+            )
+
+        def link(url):
+            return """<a href="%s">%s</a>""" % (url, url)
+
+        def gotSuper(output):
+            return "".join((
+                """<div class="directory-listing">"""
+                """<h1>Principal Details</h1>"""
+                """<pre><blockquote>"""
+                """Directory Information\n"""
+                """---------------------\n"""
+                """Directory GUID: %s\n"""         % (self.record.service.guid,),
+                """Realm: %s\n"""                  % (self.record.service.realmName,),
+                """\n"""
+                """Principal Information\n"""
+                """---------------------\n"""
+                """GUID: %s\n"""                   % (self.record.guid,),
+                """Record type: %s\n"""            % (self.record.recordType,),
+                """Short name: %s\n"""             % (self.record.shortName,),
+                """Full name: %s\n"""              % (self.record.fullName,),
+                """Principal UID: %s\n"""          % (self.principalUID(),),
+                """Principal URL: %s\n"""          % (link(self.principalURL()),),
+                """\nAlternate URIs:\n"""          , format_list(link(u) for u in self.alternateURIs()),
+                """\nGroup members:\n"""           , format_principals(self.groupMembers()),
+                """\nGroup memberships:\n"""       , format_principals(self.groupMemberships()),
+                """\nCalendar homes:\n"""          , format_list(link(u) for u in self.calendarHomeURLs()),
+                """\nCalendar user addresses:\n""" , format_list(link(a) for a in self.calendarUserAddresses()),
+                """</pre></blockquote></div>""",
+                output
+            ))
+
+        d = super(DirectoryPrincipalResource, self).renderDirectoryBody(request)
+        d.addCallback(gotSuper)
+        return d
+
+    ##
+    # ACL
+    ##
+
     def _calendar_user_proxy_index(self):
         """
         Return the SQL database for calendar user proxies.
@@ -488,9 +585,6 @@
             setattr(pcollection, "calendar_user_proxy_db", CalendarUserProxyDatabase(pcollection.fp.path))
         return pcollection.calendar_user_proxy_db
 
-    def groupMembers(self):
-        return self._getRelatives("members")
-
     def groupMemberships(self):
         groups = self._getRelatives("groups")
 
@@ -509,16 +603,10 @@
 
         return groups
 
-    def principalCollections(self):
-        return self.parent.principalCollections()
-
     ##
     # CalDAV
     ##
 
-    def principalUID(self):
-        return self.record.guid
-        
     def calendarUserAddresses(self):
         # Get any CUAs defined by the directory implementation.
         addresses = set(self.record.calendarUserAddresses)
@@ -601,10 +689,6 @@
     # Static
     ##
 
-    def createSimilarFile(self, path):
-        log.err("Attempt to create clone %r of resource %r" % (path, self))
-        raise HTTPError(responsecode.NOT_FOUND)
-
     def getChild(self, name):
         if name == "":
             return self

Modified: CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/test/test_opendirectory.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/test/test_opendirectory.py	2007-09-24 18:16:18 UTC (rev 1896)
+++ CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/test/test_opendirectory.py	2007-09-24 23:26:36 UTC (rev 1897)
@@ -21,9 +21,10 @@
 except ImportError:
     pass
 else:
+    import twisted.web2.auth.digest
+    import twistedcaldav.directory.test.util
     from twistedcaldav.directory.directory import DirectoryService
-    import twistedcaldav.directory.test.util
-    import twisted.web2.auth.digest
+    from twistedcaldav.directory.appleopendirectory import OpenDirectoryRecord
 
     # Wonky hack to prevent unclean reactor shutdowns
     class DummyReactor(object):
@@ -61,16 +62,17 @@
             return self._service
 
         def test_invalidODDigest(self):
-            record = twistedcaldav.directory.appleopendirectory.OpenDirectoryRecord(
-                self.service(),
-                DirectoryService.recordType_users,
-                "GUID-123",
-                "guidify",
-                "GUID",
-                set("mailtoguid at example.com",),
-                [],
-                False,
-                ()
+            record = OpenDirectoryRecord(
+                service               = self.service(),
+                recordType            = DirectoryService.recordType_users,
+                guid                  = "B1F93EB1-DA93-4772-9141-81C250DA35B3",
+                shortName             = "user",
+                fullName              = "Some user",
+                calendarUserAddresses = set(("mailtoguid at example.com",)),
+                autoSchedule          = False,
+                enabledForCalendaring = True,
+                memberGUIDs           = [],
+                proxyGUIDs            = (),
             )
 
             digestFields = {}

Modified: CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/extensions.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/extensions.py	2007-09-24 18:16:18 UTC (rev 1896)
+++ CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/extensions.py	2007-09-24 23:26:36 UTC (rev 1897)
@@ -512,8 +512,12 @@
                     property = waitForDeferred(self.readProperty(qname, request))
                     yield property
                     property = property.getResult()
-                    name = property.sname()
-                    value = property.toxml()
+                    if property is None:
+                        name = "{%s}%s" % qname
+                        value = "** None **"
+                    else:
+                        name = property.sname()
+                        value = property.toxml()
                 except HTTPError, e:
                     if e.response.code == responsecode.NOT_FOUND:
                         log.err("Property {%s}%s was returned by listProperties() but does not exist for resource %s."

Modified: CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/static.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/static.py	2007-09-24 18:16:18 UTC (rev 1896)
+++ CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/static.py	2007-09-24 23:26:36 UTC (rev 1897)
@@ -463,10 +463,15 @@
 
     def provisionChild(self, name):
         record = self.directory.recordWithShortName(self.recordType, name)
+
         if record is None:
             log.msg("No directory record %r of type %r" % (name, self.recordType))
             return None
 
+        if not record.enabledForCalendaring:
+            log.msg("Directory record %r of type %r is not enabled for calendaring" % (name, self.recordType))
+            return None
+
         child = CalendarHomeFile(self.fp.child(name).path, self, record)
         if not child.exists():
             # NOTE: provisionDefaultCalendars() returns a deferred, which we are ignoring.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20070924/bf2cb783/attachment.html


More information about the calendarserver-changes mailing list