[CalendarServer-changes] [1457] CalendarServer/trunk/twistedcaldav/directory/appleopendirectory.py

source_changes at macosforge.org source_changes at macosforge.org
Fri Apr 6 17:41:53 PDT 2007


Revision: 1457
          http://trac.macosforge.org/projects/calendarserver/changeset/1457
Author:   dreid at apple.com
Date:     2007-04-06 17:41:52 -0700 (Fri, 06 Apr 2007)

Log Message:
-----------
Find the correct virtual host among multiple virtualhosts in different nodes, prefering the remote node, then the local od node, then the local node.

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/directory/appleopendirectory.py

Modified: CalendarServer/trunk/twistedcaldav/directory/appleopendirectory.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/appleopendirectory.py	2007-04-06 15:29:20 UTC (rev 1456)
+++ CalendarServer/trunk/twistedcaldav/directory/appleopendirectory.py	2007-04-07 00:41:52 UTC (rev 1457)
@@ -123,6 +123,7 @@
             dsattributes.kDS1AttrGeneratedUID,
             dsattributes.kDSNAttrRecordName,
             dsattributes.kDS1AttrXMLPlist,
+            dsattributes.kDSNAttrMetaNodeLocation,
         ]
 
         records = opendirectory.queryRecordsWithAttribute(
@@ -137,7 +138,9 @@
         self._parseComputersRecords(records, vhostname)
 
     def _parseComputersRecords(self, records, vhostname):
-        
+        localNodePath = '/Local/Default'
+        localODNodePath = '/LDAPv3/127.0.0.1'
+
         # Must have some results
         if len(records) == 0:
             raise OpenDirectoryInitError(
@@ -146,30 +149,59 @@
             )
 
         # Now find a single record that actually matches the hostname
-        found = False
+        # Prefering the remote OD node to the local OD Node and
+        # the local OD Node to the local node.
+
+        _localNode = None
+        _localODNode = None
+        _remoteNode = None
+
         for recordname, record in records.iteritems():
-            
             # Must have XMLPlist value
             plist = record.get(dsattributes.kDS1AttrXMLPlist, None)
             if not plist:
                 continue
-            
-            if not self._parseXMLPlist(vhostname, recordname, plist, record[dsattributes.kDS1AttrGeneratedUID]):
+
+            # XXX: Parse the plist so we can find only calendar vhosts with our hostname.
+            plistDict = readPlistFromString(plist)
+            vhosts = plistDict.get("com.apple.macosxserver.virtualhosts", None)
+            if not vhosts:
                 continue
-            elif found:
-                raise OpenDirectoryInitError(
-                    "Open Directory (node=%s) multiple /Computers records found matching virtual hostname: %s"
-                    % (self.realmName, vhostname,)
-                )
+
+            hostguid = None
+            for key, value in vhosts.iteritems():
+                serviceTypes = value.get("serviceType", None)
+                if serviceTypes:
+                    for type in serviceTypes:
+                        if type == "calendar":
+                            hostguid = key
+                            break
+
+            if vhosts[hostguid].get("hostname", None) != vhostname:
+                continue
+
+            if record[dsattributes.kDSNAttrMetaNodeLocation] == localNodePath:
+                _localNode = (recordname, plist, record[dsattributes.kDS1AttrGeneratedUID])
+
+            elif record[dsattributes.kDSNAttrMetaNodeLocation] == localODNodePath:
+                _localODNode = (recordname, plist, record[dsattributes.kDS1AttrGeneratedUID])
+
             else:
-                found = True
-                
-        if not found:
+                _remoteNode = (recordname, plist, record[dsattributes.kDS1AttrGeneratedUID])
+
+        # XXX: These calls to self._parseXMLPlist will cause the plsit to be parsed _again_
+        #      refactor later so we only ever parse it once.
+
+        for node in (_remoteNode, _localODNode, _localNode):
+            if node and self._parseXMLPlist(vhostname, *node):
+                break
+
+        else:
             raise OpenDirectoryInitError(
                 "Open Directory (node=%s) no /Computers records with an enabled and valid calendar service were found matching virtual hostname: %s"
                 % (self.realmName, vhostname,)
             )
-    
+
     def _parseXMLPlist(self, vhostname, recordname, plist, recordguid):
         # Parse the plist and look for our special entry
         plist = readPlistFromString(plist)

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


More information about the calendarserver-changes mailing list