It took me 5 straight hours of research and trial and error before I figured this problem out. I hope this info helps even just one more person.
I went ahead and typed up this document for myself - I'm sure it's going to come in big handy months down the road when I've forgotten all this experience has taught me.
Sorry for mistakes and misinformation - I must admit I'm not a CalDAV (or even an OS X Server) expert by any means.
I apologize for weird formatting - I copied and pasted from Word and not everything looks right. The numbering is all screwed up, but that shouldn't matter.
Problem:
I cannot add my OS X Calendar server calendars to any calendar clients other than Calendar.app
(formerly iCal). I don’t know OS X Server’s CalDAV calendar address syntax.
Software in use:
OS X Server 3.0.2
OS X 10.9.1
Thunderbird 24.2.0
This tutorial assumes you have:
- ) A working OS X system running at least the software version(s) noted above;
- ) A working OS X Server installation of at least the software version noted above;
- ) A working CalDAV server on your OS X system;
- ) At least one calendar created on this server (a CalDAV calendar, NOT a calendar stored locally in Calendar.app (formerly iCal); and
- ) At least one of these (CalDAV!) calendars added to Calendar.app (formerly iCal), either on the Server itself or another Mac
OS X Server’s documentation leaves a LOT to be desired. Seriously, Apple, what were you thinking? You don’t really need to worry about freaking people out. OS X Server isn’t a consumer product anyway.
First, as best as I can surmise given my severely limited CalDAV knowledge, OS X Server’s CalDAV implementation utilizes a calendar address syntax specific to OS X Server. For example, it differs from the syntax you’ll find used by different software products, as illustrated on the following pages:
http://oxpedia.org/wiki/index.php?title=File:CalDAV_URL_Step2.png
http://wiki.zimbra.com/wiki/Accessing_Zimbra_Collaboration_Suite_with_Thunderbir d#Accessing_your_Zimbra_Calendar_using_Lightning_with_CalDAV_.28Only_works_with_ ZCS_5.0.2B_and_Lightning_0.8.2B.29
http://davmail.sourceforge.net/thunderbirdcalendarsetup.html
Second, the syntax that worked for me differs from the examples found in posts regarding the same issue in what I assume to be different versions of OS X Server. This is a worrying trend, because if that continues this means the syntax is a moving target. Who knows how it might differ in OS X Server 4.x? 5.x? etc.?
https://discussions.apple.com/thread/3522171?answerId=16863418022#16863418022
https://www.geeklan.co.uk/?p=648
http://www.geeklan.co.uk/?p=663
The command
sudo calendarserver_manage_principals --search shared
referenced in the above link failed to find any calendars on my machine when run in terminal.
Solution:
I surmised that most CalDAV clients would require both a) a user ID and b) a calendar (or reminders list) ID in any calendar addresses I might specify. Otherwise, how would the calendar client know which calendar or reminders list I mean to add from a server that hosts several? And how would I specify to which user (under which account) the calendar(s) belong?
) In Calendar.app (formerly iCal), click File > Export > Calendar Archive…
Choose a directory, like the desktop, where the file will be easy to manipulate.
) Find the file you just exported in Finder.
The file should use the following naming convention:
Calendars[ and Reminders] [Month##].[Day##].[Year##], [Hour##].[Minute##] [AM/PM].icbu
NOTE: I’m not sure if the “and Reminders” will still appear in the filename if you haven’t configured any reminders in the Reminders app (on the server); I haven’t had an opportunity to test this.
) Right-click on the file > Show Package Contents
) Open the folder “Calendars”
) Ignore all folders inside “Calendars” other than the one ending in “.caldav”. I haven’t yet
had time to determine what exactly the others contain, but as far as I can tell, all we’re
concerned with here is CalDAV. Open the folder ending in “.caldav”.
) Open each seemingly randomly-named folder ending in “.calendar”.
NOTE: These folders appear to truly be randomly named. Even though each of these
folders contain a specific calendar or reminders list, the same calendar or reminders list
is contained in a folder with a different name depending upon which client was used to
perform the Calendar.app (formerly iCal) archive export. In other words, the copy of Calendar.app (formerly iCal) on my MacBook Pro stores the same calendar or reminders list in a folder with a name that differs from the folder that same calendar or reminders list is stored in on my Mac Mini (running OS X Server).
) In each of these folders, open the file “Info.plist” in TextEdit.
Right-click > Open With > TextEdit.
NOTE: If you don’t see TextEdit here, click “Other…”. This should take you straight to
your Applications folder. Browse for TextEdit in this list, highlight it, and click
“Open.”
) You’ll be greeted with something like this:
<?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>AlarmsDisabled</key>
<false/>
<key>Availability</key>
<true/>
<key>CalendarPath</key>
<string>/calendars/__uids__/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX[N1] /XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX[N2] /</string>
<key>CanBePublished</key>
<false/>
<key>Checked</key>
<integer>1</integer>
<key>Color</key>
<string>#0E61B9FF</string>
<key>Delegate</key>
<false/>
<key>Editable</key>
<true/>
<key>Enabled</key>
<true/>
<key>EventContainer</key>
<true/>
<key>Key</key>
<string>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</string>
<key>Order</key>
<integer>3</integer>
<key>OwnerPrincipalPath</key>
<string>/principals/__uids__/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/</string>
<key>Permission</key>
<integer>4</integer>
<key>PushKey</key>
<string></string>
<key>Renameable</key>
<true/>
<key>ShareDefaultAlarmSettings</key>
<true/>
<key>TaskContainer</key>
<false/>
<key>TimeZone</key>
<string>America/Timezone</string>
<key>Title</key>
<string>CalendarName[N3] </string>
<key>Type</key>
<string>CalDAV</string>
</dict>
</plist>
) Pay special attention to this line:
<string>/calendars/__uids__/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/</string>
You’ll need this bit to help you construct the addresses for each of your calendars
and reminders lists you want to add to client programs later.
) Keep a list of the names of each of your calendars and reminders lists, along with their
corresponding string (highlighted in the green just above).
) Go back to your copy of Calendar.app (formerly iCal). Click Calendar > Preferences… > Accounts > [the CalDAV account stored on your server that contains the calendars and reminders lists you want to add to other clients] > Server Settings
NOTE: If you don’t see your CalDAV account in the list box on the left of Calendar’s
preferences window, you’ll have to add it by clicking on the “+” below.
) Note this information. You’ll need it to construct an address for a specific calendar or reminders list. Remember, you’ll need to construct an address for each calendar and reminders list you want to add.
) The syntax is as follows:
[http or https]://[hostname or IP address of OS X server]:[Port#]/calendars/__uids__/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/
Mine looked similar to the following:
https://bestserverever.local:8443/calendars/__uids__/1A7D5E3C-7AC3-09F2-21CC-7F1 2DCA4F812/B3A68D6F-2F50-00AD-3AA4-1D6BACD035BC/
Some of you will already know about all of this:
I used https because I use a self-signed SSL certificate on my server.
I specified the hostname I assigned my server in Server.app.
I specified the port# Calendar.app (formerly iCal) showed.
Next, note the presence of
/calendars/
like we saw in the long string in the plist file, NOT
/principals/
like we saw in Calendar.app’s (formerly iCal’s) Preferences.
I can only assume this is because we’re looking to construct an address that
points to the location of a specific calendar or reminders list, not to the
location of the user account (or principal? I’m not sure exactly what
“principal” means here) to which all of your calendars and reminders lists
belong.
After
__uids__/
The first UID
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/
Is the user account ID – the ID you see in both the first half of the long string
in the .plist file, and in Calendar.app’s (formerly iCal’s) Preferences window.
NOTE: You can verify this yourself:
While in Server.app, click on Tools > Directory Utility.
In Directory Utility, click Directory Editor.
I believe that, unless you’ve had to change this, “Viewing” should say
“Users” and “in node” should say “/Local/Default”.
In the list on the left, look for the user name you’ve created your
calendars and reminders lists under.
Its “GeneratedUID” should be the same.
Then,
the second UID
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/
Is the calendar or reminders list ID of the specific calendar or reminders list
you want to add.
Make sure you add a forward slash at the end of the address!
) In Thunderbird, make sure Lightning is installed.
) Open the Calendar tab, right-click in the lower left in the blank box that says “Calendar” (where
your added CalDAV calendars will appear) and click “New Calendar”.
) Choose “On the Network”
) Choose CalDAV, enter the address of the specific calendar or reminders list you want to add,
and choose whether or not you want Offline Support (I assume offline support has
nothing to do with your calendar server – it dictates whether the client you’re using is able
to accept changes you make to your calendars and reminders lists while you’re not connected to your server and upload said changes the next time you are).
) Configure the rest of the calendar’s options. If you’re using a self-signed certificate (or an authority-issued certificate that otherwise can’t be verified) Thunderbird will ask you to
specify a security exception for your server’s certificate. Do your due diligence and view the
certificate in Thunderbird first.
That’s it! Addresses for reminders lists shouldn’t look any different. Thunderbird should
be able to tell the difference between addresses you’ve added that provide access to to-do
list items and addresses that don’t.
[N1]These X’s aren’t variables – they just represent hex characters I replaced with X’s because I’m not sure if these UIDs represent truly sensitive information.
This first set of X’s represents the UID of the User Account the calendar or reminders list belongs to.
[N2]This second set of X’s represents the UID of the specific CalDAV calendar or reminders list stored in the same folder the Info.plist file you just looked at is stored in.
[N3]This string here tells you what calendar or reminders list you’re looking at. This is the only explicitly identifying information I’m aware of in these plist files.