[CalendarServer-changes] [1753] CalDAVTester/trunk

source_changes at macosforge.org source_changes at macosforge.org
Thu Aug 2 09:59:48 PDT 2007


Revision: 1753
          http://trac.macosforge.org/projects/calendarserver/changeset/1753
Author:   cdaboo at apple.com
Date:     2007-08-02 09:59:48 -0700 (Thu, 02 Aug 2007)

Log Message:
-----------
Tool to auto-configure Open Directory with the correct accounts needed for CalDAVTester to run. It also copies
the required large calendars into the server doc root.

Added Paths:
-----------
    CalDAVTester/trunk/data/
    CalDAVTester/trunk/data/calendar.10.tgz
    CalDAVTester/trunk/data/calendar.100.tgz
    CalDAVTester/trunk/data/calendar.1000.tgz
    CalDAVTester/trunk/odsetup.py
    CalDAVTester/trunk/scripts/server/serverinfo-template-old.xml
    CalDAVTester/trunk/scripts/server/serverinfo-template.xml

Added: CalDAVTester/trunk/data/calendar.10.tgz
===================================================================
(Binary files differ)


Property changes on: CalDAVTester/trunk/data/calendar.10.tgz
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: CalDAVTester/trunk/data/calendar.100.tgz
===================================================================
(Binary files differ)


Property changes on: CalDAVTester/trunk/data/calendar.100.tgz
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: CalDAVTester/trunk/data/calendar.1000.tgz
===================================================================
(Binary files differ)


Property changes on: CalDAVTester/trunk/data/calendar.1000.tgz
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: CalDAVTester/trunk/odsetup.py
===================================================================
--- CalDAVTester/trunk/odsetup.py	                        (rev 0)
+++ CalDAVTester/trunk/odsetup.py	2007-08-02 16:59:48 UTC (rev 1753)
@@ -0,0 +1,357 @@
+#!/usr/bin/env python
+#
+##
+# Copyright (c) 2006-2007 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# DRI: Cyrus Daboo, cdaboo at apple.com
+##
+#
+# Creates some test accounts on an OpenDirectory server for use with CalDAVTester
+#
+
+from plistlib import readPlist
+from plistlib import readPlistFromString
+from plistlib import writePlist
+import commands
+import getopt
+import os
+import sys
+import uuid
+
+diradmin_user    = "admin"
+diradmin_pswd    = "admin"
+directory_node   = "/LDAPv3/127.0.0.1"
+service_locator  = "Bogus"
+
+serverinfo_default = "scripts/server/serverinfo.xml"
+serverinfo_template = "scripts/server/serverinfo-template.xml"
+
+base_dir = "../CalendarServer/"
+
+guids = {
+    "testadmin": "",
+    "user01":    "",
+    "user02":    "",
+    "user03":    "",
+    "resource01":"",
+}
+
+# List of users as a tuple: (<<name>>, <<pswd>>, <<ServicesLocator value>, <<repeat count>>)
+adminattrs = {
+    "dsAttrTypeStandard:RealName":        "Test Admin",
+    "dsAttrTypeStandard:EMailAddress":    "testadmin at example.com",
+    "dsAttrTypeStandard:ServicesLocator": "Bogus"
+}
+
+userattrs = {
+    "dsAttrTypeStandard:RealName":        "User %02d",
+    "dsAttrTypeStandard:EMailAddress":    "user%02d at example.com",
+    "dsAttrTypeStandard:ServicesLocator": "Bogus"
+}
+
+publicattrs = {
+    "dsAttrTypeStandard:RealName":        "Public %02d",
+    "dsAttrTypeStandard:EMailAddress":    "public%02d at example.com",
+    "dsAttrTypeStandard:ServicesLocator": "Bogus"
+}
+
+locationattrs = {
+    "dsAttrTypeStandard:GeneratedUID":    "Bogus",
+    "dsAttrTypeStandard:RealName":        "Room %02d",
+    "dsAttrTypeStandard:ServicesLocator": "Bogus",
+    "dsAttrTypeStandard:ResourceType":    "1",
+    "dsAttrTypeStandard:ResourceInfo":    """<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+    <key>com.apple.WhitePagesFramework</key>
+    <dict>
+        <key>AutoAcceptsInvitation</key>
+        <true/>
+        <key>CalendaringDelegate</key>
+        <string>%(guid)s</string>
+        <key>Label</key>
+        <string>Room</string>
+    </dict>
+</dict>
+</plist>""".replace("\n", "").replace('"', '\\"')
+}
+
+resourceattrs = {
+    "dsAttrTypeStandard:GeneratedUID":    "Bogus",
+    "dsAttrTypeStandard:RealName":        "Resource %02d",
+    "dsAttrTypeStandard:ServicesLocator": "Bogus",
+    "dsAttrTypeStandard:ResourceType":    "0",
+    "dsAttrTypeStandard:ResourceInfo":    """<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+    <key>com.apple.WhitePagesFramework</key>
+    <dict>
+        <key>AutoAcceptsInvitation</key>
+        <true/>
+        <key>CalendaringDelegate</key>
+        <string>%(guid)s</string>
+        <key>Label</key>
+        <string>Printer</string>
+    </dict>
+</dict>
+</plist>""".replace("\n", "").replace('"', '\\"')
+}
+
+groupattrs = {
+    "dsAttrTypeStandard:RealName":        "Group 01",
+    "dsAttrTypeStandard:EMailAddress":    "group01 at example.com",
+    "dsAttrTypeStandard:ServicesLocator": "Bogus"
+}
+
+records = (
+    ("/Users", "testadmin", "testadmin", adminattrs, 1),
+    ("/Users", "user%02d", "user%02d", userattrs, 5),
+    ("/Users", "public%02d", "public%02d", publicattrs, 10),
+    ("/Places", "location%02d", "location%02d", locationattrs, 10),
+    ("/Resources", "resource%02d", "resource%02d", resourceattrs, 10),
+    ("/Groups", "group01", "group01", groupattrs, 1),
+)
+
+def usage():
+    print """Usage: odsteup [options] create|remove
+Options:
+    -h       Print this help and exit
+    -n node  OpenDirectory node to target
+    -u uid   OpenDirectory Admin user id
+    -p pswd  OpenDirectory Admin user password
+    -f file  caldavd.plist config file used by the server
+"""
+
+def readConfig(config):
+    """
+    Read useful information from the server's caldavd.plist file.
+
+    @param config: file path to caldavd.plist
+    @type config: str
+    """
+    plist = readPlist(config)
+    hostname = plist["ServerHostName"]
+    docroot = plist["DocumentRoot"]
+    sudoers = plist["SudoersFile"]
+    
+    if docroot[0] != "/":
+        docroot = base_dir + docroot
+    if sudoers[0] != "/":
+        sudoers = base_dir + sudoers
+
+    return hostname, docroot, sudoers
+
+def patchConfig(config, admin):
+    """
+    Patch the caldavd.plist file to make sure the proper admin principal is configured.
+
+    @param config: file path to caldavd.plist
+    @type config: str
+    @param admin: admin principal-URL value
+    @type admin: str
+    """
+    plist = readPlist(config)
+    admins = plist["AdminPrincipals"]
+    admins[:] = [admin]
+    writePlist(plist, config)
+
+def patchSudoers(sudoers):
+    """
+    Patch the sudoers.plist file to add the superuser we need to test proxy authentication.
+
+    @param sudoers: file path of sudoers file
+    @type sudoers: str
+    """
+    plist = readPlist(sudoers)
+    users = plist["users"]
+    for user in users:
+        if user["username"] == "superuser" and user["password"] == "superuser":
+            break
+    else:
+        users.append({"username":"superuser", "password": "superuser"})
+        writePlist(plist, sudoers)
+
+def buildServerinfo(hostname, docroot):
+    
+    # Read in the serverinfo-template.xml file
+    fd = open(serverinfo_template, "r")
+    try:
+        data = fd.read()
+    finally:
+        fd.close()
+
+    data = data % {
+        "hostname"       : hostname,
+        "docroot"        : docroot,
+        "testadmin_guid" : guids["testadmin"],
+        "user01_guid"    : guids["user01"],
+        "user02_guid"    : guids["user02"],
+        "user03_guid"    : guids["user03"],
+        "resource01_guid": guids["resource01"],
+    }
+    
+    fd = open(serverinfo_default, "w")
+    try:
+        fd.write(data)
+    finally:
+        fd.close()
+
+def getServiceLocator(hostname):
+    cmd = "dscl -u %s -P %s %s -read /Computers/%s GeneratedUID"  % (diradmin_user, diradmin_pswd, directory_node, hostname)
+    result = commands.getoutput(cmd)
+    guid = result.split()[1]
+
+    cmd = "dscl -u %s -P %s %s -read /Computers/%s dsAttrTypeNative:apple-serviceinfo"  % (diradmin_user, diradmin_pswd, directory_node, hostname)
+    result = commands.getoutput(cmd)
+    plist = readPlistFromString(result[result.find("<?xml"):])
+    vhosts = plist.get("com.apple.macosxserver.virtualhosts", None)
+    for key, value in vhosts.iteritems():
+        serviceTypes = value.get("serviceType", None)
+        if serviceTypes:
+            for type in serviceTypes:
+                if type == "calendar":
+                    vhostguid = key
+                    break
+
+    return "%s:%s:calendar" % (guid, vhostguid,)
+
+def addLargeCalendars(docroot):
+    calendars = ("calendar.10", "calendar.100", "calendar.1000",)
+    path = os.path.join(docroot, "calendars/users/user01")    
+
+    for calendar in calendars:
+        cmd = "tar -C %s -zx -f data/%s.tgz" % (path, calendar,)
+        commands.getoutput(cmd)
+    
+def doToAccounts(f):
+    for record in records:
+        if record[4] > 1:
+            for ctr in range(1, record[4] + 1):
+                attrs = {}
+                for key, value in record[3].iteritems():
+                    if value.find("%02d") != -1:
+                        value = value % (ctr,)
+                    attrs[key] = value
+                ruser = (record[1] % (ctr,), record[2] % (ctr,), attrs, 1)
+                f(record[0], ruser)
+        else:
+            f(record[0], record[1:])
+
+def createUser(path, user):
+    # Do dscl command line operations to create a calendar user
+    
+    # Create the user
+    cmd = "dscl -u %s -P %s %s -create %s/%s" % (diradmin_user, diradmin_pswd, directory_node, path, user[0])
+    print cmd
+    os.system(cmd)
+    
+    # Set the password (only for /Users)
+    if path == "/Users":
+        cmd = "dscl -u %s -P %s %s -passwd %s/%s %s" % (diradmin_user, diradmin_pswd, directory_node, path, user[0], user[1])
+        print cmd
+        os.system(cmd)
+
+    # Other attributes
+    for key, value in user[2].iteritems():
+        if key == "dsAttrTypeStandard:GeneratedUID":
+            value = uuid.uuid4()
+        elif key == "dsAttrTypeStandard:ServicesLocator":
+            value = service_locator
+        elif key == "dsAttrTypeStandard:ResourceInfo":
+            value = value % {"guid":guids["user01"]}
+        cmd = "dscl -u %s -P %s %s -create %s/%s \"%s\" \"%s\"" % (diradmin_user, diradmin_pswd, directory_node, path, user[0], key, value)
+        print cmd
+        os.system(cmd)
+
+    # Now read the guid for this record
+    if guids.has_key(user[0]):
+        cmd = "dscl -u %s -P %s %s -read %s/%s GeneratedUID"  % (diradmin_user, diradmin_pswd, directory_node, path, user[0])
+        result = commands.getoutput(cmd)
+        guid = result.split()[1]
+        guids[user[0]] = guid
+
+def removeUser(path, user):
+    # Do dscl command line operations to create a calendar user
+    
+    # Create the user
+    cmd = "dscl -u %s -P %s %s -delete %s/%s" % (diradmin_user, diradmin_pswd, directory_node, path, user[0])
+    print cmd
+    os.system(cmd)
+
+if __name__ == "__main__":
+
+    try:
+        options, args = getopt.getopt(sys.argv[1:], "n:p:u:f:")
+
+        for option, value in options:
+            if option == "-h":
+                usage()
+                sys.exit(0)
+            elif option == "-n":
+                directory_node = value
+            elif option == "-u":
+                diradmin_user = value
+            elif option == "-p":
+                diradmin_pswd = value
+            elif option == "-f":
+                config = value
+            else:
+                print "Unrecognized option: %s" % (option,)
+                usage()
+                raise ValueError
+
+        # Process arguments
+        if len(args) == 0:
+            print "No arguments given. One of 'create' or 'remove' must be present."
+            usage()
+            raise ValueError
+        elif len(args) > 1:
+            print "Too many arguments given. Only one of 'create' or 'remove' must be present."
+            usage()
+            raise ValueError
+        elif args[0] not in ("create", "remove"):
+            print "Wrong arguments given: %s" % (args[0],)
+            usage()
+            raise ValueError
+        
+        if args[0] == "create":
+            # Read the caldavd.plist file and extract some information we will need.
+            hostname, docroot, sudoers = readConfig(config)
+            
+            # Patch the sudoers file for the superuser principal.
+            patchSudoers(sudoers)
+    
+            # Get the ServiceLocator details we need to enable calendar users.
+            service_locator = getServiceLocator(hostname)
+    
+            # Now generate the OD accounts (caching guids as we go).
+            doToAccounts(createUser)
+            
+            # Patch the caldavd.plist file with the testadmin user's guid-based principal-URL
+            patchConfig(config, "/principals/__uids__/%s/" % (guids["testadmin"],))
+            
+            # Create an appropriate serverinfo.xml file from the template
+            buildServerinfo(hostname, docroot)
+
+            # Add large calendars to user account
+            addLargeCalendars(docroot)
+
+        elif args[0] == "remove":
+            doToAccounts(removeUser)
+            
+    except Exception, e:
+        sys.exit(str(e))


Property changes on: CalDAVTester/trunk/odsetup.py
___________________________________________________________________
Name: svn:executable
   + *

Added: CalDAVTester/trunk/scripts/server/serverinfo-template-old.xml
===================================================================
--- CalDAVTester/trunk/scripts/server/serverinfo-template-old.xml	                        (rev 0)
+++ CalDAVTester/trunk/scripts/server/serverinfo-template-old.xml	2007-08-02 16:59:48 UTC (rev 1753)
@@ -0,0 +1,262 @@
+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE serverinfo SYSTEM "serverinfo.dtd">
+
+<!--
+ Copyright (c) 2006-2007 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ DRI: Cyrus Daboo, cdaboo at apple.com
+ -->
+
+<serverinfo>
+	<host>%(hostname)s</host>
+	<port>8008</port>
+	<authtype>basic</authtype>
+	<substitutions>
+		<substitution>
+			<key>$host:</key>
+			<value>http://%(hostname)s:8008</value>
+		</substitution>
+
+		<!-- relative path to principal collection-->
+		<substitution>
+			<key>$principals:</key>
+			<value>/principals/users/</value>
+		</substitution>
+
+		<!-- relative path to group principal collection-->
+		<substitution>
+			<key>$groups:</key>
+			<value>/principals/groups/</value>
+		</substitution>
+
+		<!-- relative path to resource principal collection-->
+		<substitution>
+			<key>$resources:</key>
+			<value>/principals/resources/</value>
+		</substitution>
+
+		<!-- relative path to location principal collection-->
+		<substitution>
+			<key>$locations:</key>
+			<value>/principals/locations/</value>
+		</substitution>
+
+		<!-- relative path to __uids__ principal collection-->
+		<substitution>
+			<key>$uids:</key>
+			<value>/principals/locations/</value>
+		</substitution>
+
+		<!-- relative path to calendars collection-->
+		<substitution>
+			<key>$calendars:</key>
+			<value>/calendars/</value>
+		</substitution>
+
+		<!-- relative path to user calendars collection-->
+		<substitution>
+			<key>$usercalendars:</key>
+			<value>/calendars/users/</value>
+		</substitution>
+
+		<!-- inbox name-->
+		<substitution>
+			<key>$inbox:</key>
+			<value>inbox</value>
+		</substitution>
+
+		<!-- outbox name-->
+		<substitution>
+			<key>$outbox:</key>
+			<value>outbox</value>
+		</substitution>
+
+		<!-- user id for admin user -->
+		<substitution>
+			<key>$useradmin:</key>
+			<value>testadmin</value>
+		</substitution>
+		<!-- password for admin user -->
+		<substitution>
+			<key>$pswdadmin:</key>
+			<value>testadmin</value>
+		</substitution>
+
+		<!-- relative path to admin principal resource-->
+		<substitution>
+			<key>$principaladmin:</key>
+			<value>/principals/users/testadmin/</value>
+		</substitution>
+		<substitution>
+			<key>$principaluriadmin:</key>
+			<value>/principals/users/testadmin/</value>
+		</substitution>
+
+		<!-- user id for proxy user -->
+		<substitution>
+			<key>$userproxy:</key>
+			<value>superuser</value>
+		</substitution>
+		<!-- password for proxy user -->
+		<substitution>
+			<key>$pswdproxy:</key>
+			<value>superuser</value>
+		</substitution>
+
+		<!-- relative path to first user principal resource-->
+		<substitution>
+			<key>$userid1:</key>
+			<value>user01</value>
+		</substitution>
+		<!-- password for first user -->
+		<substitution>
+			<key>$pswd1:</key>
+			<value>user01</value>
+		</substitution>
+		<!-- relative path to first user principal resource-->
+		<substitution>
+			<key>$principal1:</key>
+			<value>/principals/users/user01/</value>
+		</substitution>
+		<substitution>
+			<key>$principaluri1:</key>
+			<value>/principals/users/user01/</value>
+		</substitution>
+		<substitution>
+			<key>$principalnoslash:</key>
+			<value>/principals/users/user01</value>
+		</substitution>
+		<!-- relative path to first user calendar home-->
+		<substitution>
+			<key>$pathprefix:</key>
+			<value>/calendars/users/user01</value>
+		</substitution>
+		<!-- relative path to first user calendar home-->
+		<substitution>
+			<key>$calendarpath1:</key>
+			<value>/calendars/users/user01/calendar</value>
+		</substitution>
+		<!-- calendar user address of first user-->
+		<substitution>
+			<key>$cuaddr1:</key>
+			<value>mailto:user01 at example.com</value>
+		</substitution>
+		<substitution>
+			<key>$cuaddralt1:</key>
+			<value>/principals/users/user01/</value>
+		</substitution>
+		<substitution>
+			<key>$cuaddraltnoslash1:</key>
+			<value>/principals/users/user01</value>
+		</substitution>
+		
+		<!-- user id for second user -->
+		<substitution>
+			<key>$userid2:</key>
+			<value>user02</value>
+		</substitution>
+		<!-- password for second user -->
+		<substitution>
+			<key>$pswd2:</key>
+			<value>user02</value>
+		</substitution>
+		<!-- relative path to second user principal resource-->
+		<substitution>
+			<key>$principal2:</key>
+			<value>/principals/users/user02/</value>
+		</substitution>
+		<substitution>
+			<key>$principaluri2:</key>
+			<value>/principals/users/user02/</value>
+		</substitution>
+		<substitution>
+			<key>$principal2noslash:</key>
+			<value>/principals/users/user02</value>
+		</substitution>
+		<!-- relative path to second user calendar home-->
+		<substitution>
+			<key>$pathprefix2:</key>
+			<value>/calendars/users/user02</value>
+		</substitution>
+		<!-- calendar user address of second user-->
+		<substitution>
+			<key>$cuaddr2:</key>
+			<value>mailto:user02 at example.com</value>
+		</substitution>
+		<substitution>
+			<key>$cuaddralt2:</key>
+			<value>/principals/users/user02/</value>
+		</substitution>
+		<substitution>
+			<key>$cuaddraltnoslash2:</key>
+			<value>/principals/users/user02</value>
+		</substitution>
+		
+		<!-- user id for third user -->
+		<substitution>
+			<key>$userid3:</key>
+			<value>user03</value>
+		</substitution>
+		<!-- password for third user -->
+		<substitution>
+			<key>$pswd3:</key>
+			<value>user03</value>
+		</substitution>
+		<!-- relative path to third user principal resource-->
+		<substitution>
+			<key>$principal3:</key>
+			<value>/principals/users/user03/</value>
+		</substitution>
+		<substitution>
+			<key>$principaluri3:</key>
+			<value>/principals/users/user03/</value>
+		</substitution>
+		<!-- relative path to third user calendar home-->
+		<substitution>
+			<key>$pathprefix3:</key>
+			<value>/calendars/users/user03</value>
+		</substitution>
+		<!-- calendar user address of third user-->
+		<substitution>
+			<key>$cuaddr3:</key>
+			<value>mailto:user03 at example.com</value>
+		</substitution>
+		<substitution>
+			<key>$cuaddralt3:</key>
+			<value>/principals/users/user03/</value>
+		</substitution>
+
+		<!-- relative path to first resource calendar home-->
+		<substitution>
+			<key>$rpathprefix1:</key>
+			<value>/calendars/resources/resource01</value>
+		</substitution>
+		<!-- relative path to first resource principal resource-->
+		<substitution>
+			<key>$rprincipal1:</key>
+			<value>/principals/resources/resource01/</value>
+		</substitution>
+		<substitution>
+			<key>$rprincipaluri1:</key>
+			<value>/principals/resources/resource01/</value>
+		</substitution>
+		<substitution>
+			<key>$rcuaddralt1:</key>
+			<value>/principals/resources/resource01/</value>
+		</substitution>
+	</substitutions>
+	<serverfilepath>%(docroot)s</serverfilepath>
+</serverinfo>

Added: CalDAVTester/trunk/scripts/server/serverinfo-template.xml
===================================================================
--- CalDAVTester/trunk/scripts/server/serverinfo-template.xml	                        (rev 0)
+++ CalDAVTester/trunk/scripts/server/serverinfo-template.xml	2007-08-02 16:59:48 UTC (rev 1753)
@@ -0,0 +1,262 @@
+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE serverinfo SYSTEM "serverinfo.dtd">
+
+<!--
+ Copyright (c) 2006-2007 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ DRI: Cyrus Daboo, cdaboo at apple.com
+ -->
+
+<serverinfo>
+	<host>%(hostname)s</host>
+	<port>8008</port>
+	<authtype>basic</authtype>
+	<substitutions>
+		<substitution>
+			<key>$host:</key>
+			<value>http://%(hostname)s:8008</value>
+		</substitution>
+
+		<!-- relative path to principal collection-->
+		<substitution>
+			<key>$principals:</key>
+			<value>/principals/users/</value>
+		</substitution>
+
+		<!-- relative path to group principal collection-->
+		<substitution>
+			<key>$groups:</key>
+			<value>/principals/groups/</value>
+		</substitution>
+
+		<!-- relative path to resource principal collection-->
+		<substitution>
+			<key>$resources:</key>
+			<value>/principals/resources/</value>
+		</substitution>
+
+		<!-- relative path to location principal collection-->
+		<substitution>
+			<key>$locations:</key>
+			<value>/principals/locations/</value>
+		</substitution>
+
+		<!-- relative path to __uids__ principal collection-->
+		<substitution>
+			<key>$uids:</key>
+			<value>/principals/locations/</value>
+		</substitution>
+
+		<!-- relative path to calendars collection-->
+		<substitution>
+			<key>$calendars:</key>
+			<value>/calendars/</value>
+		</substitution>
+
+		<!-- relative path to user calendars collection-->
+		<substitution>
+			<key>$usercalendars:</key>
+			<value>/calendars/users/</value>
+		</substitution>
+
+		<!-- inbox name-->
+		<substitution>
+			<key>$inbox:</key>
+			<value>inbox</value>
+		</substitution>
+
+		<!-- outbox name-->
+		<substitution>
+			<key>$outbox:</key>
+			<value>outbox</value>
+		</substitution>
+
+		<!-- user id for admin user -->
+		<substitution>
+			<key>$useradmin:</key>
+			<value>testadmin</value>
+		</substitution>
+		<!-- password for admin user -->
+		<substitution>
+			<key>$pswdadmin:</key>
+			<value>testadmin</value>
+		</substitution>
+
+		<!-- relative path to admin principal resource-->
+		<substitution>
+			<key>$principaladmin:</key>
+			<value>/principals/users/testadmin/</value>
+		</substitution>
+		<substitution>
+			<key>$principaluriadmin:</key>
+			<value>/principals/__uids__/%(testadmin_guid)s/</value>
+		</substitution>
+
+		<!-- user id for proxy user -->
+		<substitution>
+			<key>$userproxy:</key>
+			<value>superuser</value>
+		</substitution>
+		<!-- password for proxy user -->
+		<substitution>
+			<key>$pswdproxy:</key>
+			<value>superuser</value>
+		</substitution>
+
+		<!-- relative path to first user principal resource-->
+		<substitution>
+			<key>$userid1:</key>
+			<value>user01</value>
+		</substitution>
+		<!-- password for first user -->
+		<substitution>
+			<key>$pswd1:</key>
+			<value>user01</value>
+		</substitution>
+		<!-- relative path to first user principal resource-->
+		<substitution>
+			<key>$principal1:</key>
+			<value>/principals/users/user01/</value>
+		</substitution>
+		<substitution>
+			<key>$principaluri1:</key>
+			<value>/principals/__uids__/%(user01_guid)s/</value>
+		</substitution>
+		<substitution>
+			<key>$principalnoslash:</key>
+			<value>/principals/users/user01</value>
+		</substitution>
+		<!-- relative path to first user calendar home-->
+		<substitution>
+			<key>$pathprefix:</key>
+			<value>/calendars/users/user01</value>
+		</substitution>
+		<!-- relative path to first user calendar home-->
+		<substitution>
+			<key>$calendarpath1:</key>
+			<value>/calendars/users/user01/calendar</value>
+		</substitution>
+		<!-- calendar user address of first user-->
+		<substitution>
+			<key>$cuaddr1:</key>
+			<value>mailto:user01 at example.com</value>
+		</substitution>
+		<substitution>
+			<key>$cuaddralt1:</key>
+			<value>/principals/__uids__/%(user01_guid)s/</value>
+		</substitution>
+		<substitution>
+			<key>$cuaddraltnoslash1:</key>
+			<value>/principals/__uids__/%(user01_guid)s</value>
+		</substitution>
+		
+		<!-- user id for second user -->
+		<substitution>
+			<key>$userid2:</key>
+			<value>user02</value>
+		</substitution>
+		<!-- password for second user -->
+		<substitution>
+			<key>$pswd2:</key>
+			<value>user02</value>
+		</substitution>
+		<!-- relative path to second user principal resource-->
+		<substitution>
+			<key>$principal2:</key>
+			<value>/principals/users/user02/</value>
+		</substitution>
+		<substitution>
+			<key>$principaluri2:</key>
+			<value>/principals/__uids__/%(user02_guid)s/</value>
+		</substitution>
+		<substitution>
+			<key>$principal2noslash:</key>
+			<value>/principals/users/user02</value>
+		</substitution>
+		<!-- relative path to second user calendar home-->
+		<substitution>
+			<key>$pathprefix2:</key>
+			<value>/calendars/users/user02</value>
+		</substitution>
+		<!-- calendar user address of second user-->
+		<substitution>
+			<key>$cuaddr2:</key>
+			<value>mailto:user02 at example.com</value>
+		</substitution>
+		<substitution>
+			<key>$cuaddralt2:</key>
+			<value>/principals/__uids__/%(user02_guid)s/</value>
+		</substitution>
+		<substitution>
+			<key>$cuaddraltnoslash2:</key>
+			<value>/principals/__uids__/%(user02_guid)s</value>
+		</substitution>
+		
+		<!-- user id for third user -->
+		<substitution>
+			<key>$userid3:</key>
+			<value>user03</value>
+		</substitution>
+		<!-- password for third user -->
+		<substitution>
+			<key>$pswd3:</key>
+			<value>user03</value>
+		</substitution>
+		<!-- relative path to third user principal resource-->
+		<substitution>
+			<key>$principal3:</key>
+			<value>/principals/users/user03/</value>
+		</substitution>
+		<substitution>
+			<key>$principaluri3:</key>
+			<value>/principals/__uids__/%(user03_guid)s/</value>
+		</substitution>
+		<!-- relative path to third user calendar home-->
+		<substitution>
+			<key>$pathprefix3:</key>
+			<value>/calendars/users/user03</value>
+		</substitution>
+		<!-- calendar user address of third user-->
+		<substitution>
+			<key>$cuaddr3:</key>
+			<value>mailto:user03 at example.com</value>
+		</substitution>
+		<substitution>
+			<key>$cuaddralt3:</key>
+			<value>/principals/__uids__/%(user03_guid)s/</value>
+		</substitution>
+
+		<!-- relative path to first resource calendar home-->
+		<substitution>
+			<key>$rpathprefix1:</key>
+			<value>/calendars/resources/resource01</value>
+		</substitution>
+		<!-- relative path to first resource principal resource-->
+		<substitution>
+			<key>$rprincipal1:</key>
+			<value>/principals/resources/resource01/</value>
+		</substitution>
+		<substitution>
+			<key>$rprincipaluri1:</key>
+			<value>/principals/__uids__/%(resource01_guid)s/</value>
+		</substitution>
+		<substitution>
+			<key>$rcuaddralt1:</key>
+			<value>/principals/__uids__/%(resource01_guid)s/</value>
+		</substitution>
+	</substitutions>
+	<serverfilepath>%(docroot)s</serverfilepath>
+</serverinfo>

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


More information about the calendarserver-changes mailing list