[kronolith] Fwd: [Tickets #4982] Re: Expose Kronolith data via XML, emulating Sharepoint's XMLRPC Web Services for integration into Microsoft Outlook

Jon Spriggs jon at spriggs.org.uk
Fri Feb 9 01:39:30 PST 2007


On 2/8/07, Jan Schneider <jan at horde.org> wrote:
> Zitat von Jon Spriggs <jon at spriggs.org.uk>:
>
> > Jan, (and CC'd to the list, incase anyone else is looking for the same info)
> >
> > Thanks for the very prompt response.
> >
> > Just out of interest, how can I expose the calendar information? I ask
> > this because Sharepoint (my main rival for implementation) has a link
> > on the calendar which provides a unique url which opens the calendar
> > directly for read-only access in MS Outlook. (I'm just signing up for
> > a "free demo" somewhere to be able to provide an example of the URL
> > and later for an interactive example with the service or results of
> > accessing the URL - if it's appropriate).
> >
> > Within Kronolith, I found the link under "manage my calendars" to
> > remotely access the calendar, but from examining the result of the
> > link, that seems to produce ical data rather than allowing me to open
> > the calendar under anything else.
>
> I don't follow. What else than the only existing calendar specific
> standard, iCalendar, should be used to provide calendar data to
> external clients? I know it's suprising but even Outlook understands
> this format.

Outlook 2003 and maybe earlier versions allow clicking on a URL which
looks like:

stssync://sts/?ver=1.0&type=calendar&cmd=add-folder&base-url=http%3A%2F%2F[SERVERNAME]&list-url=%2FLists%2FEvents%2FAllItems%2Easpx&guid=[MS-GUID-FOR-CALENDAR]&site-name=[SITENAME]&list-name=[CALENDARNAME]

(I've modified this a little, showing the site and calendar specific
bits surrounded by []'s.)

This resolves (eventually) to
http://[SERVERNAME]/Lists/Events/AllItems.aspx, which is a SOAP URL.
Outlook sends a couple of SOAP requests to the server. I've attached a
(trimmed and slightly modified for privacy) version of the wireshark
packet trace of the requests between Outlook and Sharepoint.

I think this could be really good for Horde - and would definitely
differentiate this product from other groupware products on the
market... because, not only is it free (as in Gratis and Libre), and
running on an open platform (and I think supports more methods of
authentication than any other groupware out there), but would allow
direct interoperability with Microsoft Outlook.

I'm happy to try and write some code myself, but my knowledge of SOAP
when it comes to PHP (or even the MS implementations) is just enough
to recognise it when I'm looking at the traffic on a packet sniffer,
and to sometimes decypher the traffic that's going across the wire -
but I can't really implement it myself... although I'm happy to try if
anyone's able to lend a hand if I get stuck :)

Regards,

Jon
-------------- next part --------------
POST /_vti_bin/lists.asmx HTTP/1.1Content-Type: text/xml; charset=utf-8SOAPAction: http://schemas.microsoft.com/sharepoint/soap/GetListItemChangesX-Office-Version: 11.0.6568User-Agent: Microsoft Office/11.0 (Windows NT 5.1; Microsoft Office Outlook 11.0.6568; Pro)Host: Authorization: Negotiate TlRMTVNTUAADAAAAGAAYAHwAAAAYABgAlAAAAAYABgBIAAAAGgAaAE4AAAAUABQAaAAAAAAAAACsAAAABYKIogUBKAoAAAAPdABlAG4AYQBkAG0AaQBuAGkAcwB0AHIAYQB0AG8AcgBVAEsAOQA1ADEAMgA3ADkATABUAJoEs17nK6pXAAAAAAAAAAAAAAAAAAAAAH6jPBB6lKet4fMHeMsWIabARodetWaAUj==Connection: Keep-AliveCache-Control: no-cacheContent-Length: 346<?xml version="1.0"?><Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"><Body><GetListItemChanges xmlns="http://schemas.microsoft.com/sharepoint/soap/"><listName>{2AB7630B-81C2-4FFB-807F-58E1D1EEC39B}</listName><viewFields><ViewFields></ViewFields></viewFields><since>2007-02-09T09:04:42Z</since></GetListItemChanges></Body></Envelope>

------------------

HTTP/1.1 200 OKDate: Fri, 09 Feb 2007 09:07:39 GMTServer: Microsoft-IIS/6.0MicrosoftSharePointTeamServices: 6.0.2.6568X-Powered-By: ASP.NETX-AspNet-Version: 1.1.4322Cache-Control: private, max-age=0Content-Type: text/xml; charset=utf-8Content-Length: 1729<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetListItemChangesResponse xmlns="http://schemas.microsoft.com/sharepoint/soap/"><GetListItemChangesResult><listitems xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" TimeStamp="2007-02-09T09:06:09Z"><rs:data ItemCount="2"><z:row ows_ID="2" ows_Title="Test Item" ows_Modified="2007-02-09T09:05:42Z" ows_Created="2007-02-09T09:05:42Z" ows_Author="1;#TEN\administrator" ows_Editor="1;#TEN\administrator" ows_owshiddenversion="1" ows_Attachments="0" ows__ModerationStatus="0" ows_LinkTitleNoMenu="Test Item" ows_LinkTitle="Test Item" ows_SelectTitle="2" ows_Order="200.000000000000" ows_GUID="{681BE348-07C7-4880-A0B4-C3E324963743}" ows_EventDa
e="2007-02-09T00:00:00Z" ows_fRecurrence="0" ows_EventType="0" ows_UID="{0D683A44-362D-4D1B-8662-C2112DDBE95C}" /><z:row ows_ID="3" ows_Title="Test 2" ows_Modified="2007-02-09T09:06:42Z" ows_Created="2007-02-09T09:06:42Z" ows_Author="1;#TEN\administrator" ows_Editor="1;#TEN\administrator" ows_owshiddenversion="1" ows_Attachments="0" ows__ModerationStatus="0" ows_LinkTitleNoMenu="Test 2" ows_LinkTitle="Test 2" ows_SelectTitle="3" ows_Order="300.000000000000" ows_GUID="{4F241B6D-735E-454A-8478-A3FC26DCFC45}" ows_EventDate="2007-02-09T00:00:00Z" ows_fRecurrence="0" ows_EventType="0" ows_UID="{8DA5BDB1-61CE-4247-A1E3-B4D7762F371B}" /></rs:data></listitems></GetListItemChangesResult></GetListItemChangesResponse></soap:Body></soap:Envelope

------------------

POST /_vti_bin/lists.asmx HTTP/1.1Content-Type: text/xml; charset=utf-8SOAPAction: http://schemas.microsoft.com/sharepoint/soap/GetListX-Office-Version: 11.0.6568User-Agent: Microsoft Office/11.0 (Windows NT 5.1; Microsoft Office Outlook 11.0.6568; Pro)Host: Authorization: Negotiate TlRMTVNTUAADAAAAGAAYAHwAAAAYABgAlAAAAAYABgBIAAAAGgAaAE4AAAAUABQAaAAAAAAAAACsAAAABYKIogUBKAoAAAAPdABlAG4AYQBkAG0AaQBuAGkAcwB0AHIAYQB0AG8AcgBVAEsAOQA1ADEAMgA3ADkATABUAEGgchj29yISAAAAAAAAAAAAAAAAAAAAAB/F9KxvL1+TAuQxpNNB/DZgGgkYYKMYaz==Connection: Keep-AliveCache-Control: no-cacheContent-Length: 239<?xml version="1.0"?><Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"><Body><GetList xmlns="http://schemas.microsoft.com/sharepoint/soap/"><listName>{2AB7630B-81C2-4FFB-807F-58E1D1EEC39B}</listName></GetList></Body></Envelope>

------------------

HTTP/1.1 200 OKDate: Fri, 09 Feb 2007 09:07:39 GMTServer: Microsoft-IIS/6.0MicrosoftSharePointTeamServices: 6.0.2.6568X-Powered-By: ASP.NETX-AspNet-Version: 1.1.4322Cache-Control: private, max-age=0Content-Type: text/xml; charset=utf-8Content-Length: 10634<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetListResponse xmlns="http://schemas.microsoft.com/sharepoint/soap/"><GetListResult><List DocTemplateUrl="" DefaultViewUrl="/Lists/Events/AllItems.aspx" ID="{2AB7630B-81C2-4FFB-807F-58E1D1EEC39B}" Title="Team Diary" Description="This diary allows the team to record when they are in and out of the office." ImageUrl="/_layouts/images/itevent.gif" Name="{2AB7630B-81C2-4FFB-807F-58E1D1EEC39B}" BaseType="0" ServerTemplate="106" Created="20070207 09:59:30" Modified="20070209 09:06:42" LastDeleted="20070209 09:04:33" Version="1" Direction="none" ThumbnailSize="0" WebImageWidth="0" WebImageHeight="0" Flags="16781312" ItemCount="2" AnonymousPermMask="0" RootFolder="Lists/Events" ReadSecurity="1" WriteSecurity="1" Author="1" EventSinkAssembly="" EventSinkClass=""
EventSinkData="" EmailInsertsFolder="" AllowDeletion="True" AllowMultiResponses="False" EnableAttachments="True" EnableModeration="False" EnableVersioning="False" Hidden="False" MultipleDataList="False" Ordered="False" ShowUser="True"><Fields><Field ColName="tp_ID" ReadOnly="TRUE" Type="Counter" Name="ID" PrimaryKey="TRUE" DisplayName="ID" FromBaseType="TRUE"/><Field Type="Text" Name="Title" DisplayName="Title" Required="TRUE" FromBaseType="TRUE" ColName="nvarchar1"/><Field ColName="tp_Modified" ReadOnly="TRUE" Type="DateTime" Name="Modified" DisplayName="Modified" StorageTZ="TRUE" FromBaseType="TRUE"/><Field ColName="tp_Created" ReadOnly="TRUE" Type="DateTime" Name="Created" DisplayName="Created" StorageTZ="TRUE" FromBaseType="TRUE"/><Field ColName="tp_Author" ReadOnly="TRUE" Type="User" List="UserInfo" Name="Author" DisplayName="Created By" FromBaseType="TRUE"/><Field ColName="tp_Editor" ReadOnly="TRUE" Type="User" List="UserInfo" Name="Editor" DisplayName="Modified By" FromBaseType="TRUE"/><Field ColName=
tp_Version" Hidden="TRUE" ReadOnly="TRUE" Type="Integer" SetAs="owshiddenversion" Name="owshiddenversion" DisplayName="owshiddenversion" FromBaseType="TRUE"/><Field ColName="tp_HasAttachment" Type="Attachments" Name="Attachments" Displ
yName="Attachments" FromBaseType="TRUE"/><Field ColName="tp_ModerationStatus" ReadOnly="TRUE" Type="ModStat" Name="_ModerationStatus" DisplayName="Approval Status" Hidden="TRUE" CanToggleHidden="TRUE" Required="FALSE" FromBaseType="TRUE"><CHOICES><CHOICE>0;#Approved</CHOICE><CHOICE>1;#Rejected</CHOICE><CHOICE>2;#Pending</CHOICE></CHOICES><Default>0</Default></Field><Field ReadOnly="TRUE" Type="Note" Name="_ModerationComments" DisplayName="Approver Comments" Hidden="TRUE" CanToggleHidden="TRUE" Sortable="FALSE" FromBaseType="TRUE" ColName="ntext1"/><Field ReadOnly="TRUE" Type="Computed" Name="Edit" Sortable="FALSE" Filterable="FALSE" DisplayName="Edit" AuthoringInfo="(link to edit item)" FromBaseType="TRUE"><DisplayPattern><HTML><![CDATA[<a href="]]></HTML><URL Cmd="Edit"/><HTML><![CDATA[" onclick="GoToLink(this);return false;" target="_self">]]></HTML><HTML><![CDATA[<img border="0" alt="]]></HTML><HTML>Edit</HTML><HTML><![CDATA[" src="/_layouts/images/edititem.gif">]]></HTML><HTML><![CDATA[</a>]]></HTML></Di
playPattern></Field><Field ReadOnly="TRUE" Type="Computed" Name="LinkTitleNoMenu" DisplayName="Title" Dir="" DisplayNameSrcField="Title" AuthoringInfo="(linked to item)" FromBaseType="TRUE"><FieldRefs><FieldRef Name="Title"/></FieldRef
><DisplayPattern><HTML><![CDATA[<a onfocus="OnLink(this)" href="]]></HTML><URL/><HTML><![CDATA[" ONCLICK="GoToLink(this);return false;" target="_self">]]></HTML><Column HTMLEncode="TRUE" Name="Title" Default="(no title)"/><HTML><![CDATA[</a>]]></HTML><IfNew><HTML><![CDATA[<IMG SRC="/_layouts/1033/images/new.gif" alt="]]></HTML><HTML>New</HTML><HTML><![CDATA[">]]></HTML></IfNew></DisplayPattern><DisplayBidiPattern><HTML><![CDATA[<p dir=]]></HTML><Property Select="Direction"/><HTML><![CDATA[><a onfocus="OnLink(this)" href="]]></HTML><URL/><HTML><![CDATA[" ONCLICK="GoToLink(this);return false;" target="_self">]]></HTML><Column HTMLEncode="TRUE" Name="Title" Default="(no title)"/><HTML><![CDATA[</a>]]></HTML><IfNew><HTML><![CDATA[<IMG SRC="/_layouts/1033/images/new.gif" alt="]]></HTML><HTML>New</HTML><HTML><![CDATA[">]]></HTML></IfNew><HTML><![CDATA[</p>]]></HTML></DisplayBidiPattern></Field><Field ReadOnly="TRUE" Type="Computed" Name="LinkTitle" DisplayName="Title" DisplayNameSrcField="Title" ClassInfo="Menu" A
thoringInfo="(linked to item with edit menu)" FromBaseType="TRUE"><FieldRefs><FieldRef Name="Title"/><FieldRef Name="ID"/><FieldRef Name="LinkTitleNoMenu"/></FieldRefs><DisplayPattern><FieldSwitch><Expr><GetVar Name="FreeForm"/></Expr>
Case Value="TRUE"><Field Name="LinkTitleNoMenu"/></Case><Default><HTML><![CDATA[<table height="100%" cellspacing=0 class="ms-unselectedtitle" onmouseover="OnItem(this)" CTXName="ctx]]></HTML><Counter Type="View"/><HTML>&quot; ItemId=&quot;</HTML><Column Name="ID" HTMLEncode="TRUE"/><HTML><![CDATA["><tr><td width="100%" Class="ms-vb">]]></HTML><Field Name="LinkTitleNoMenu"/><HTML><![CDATA[</td><td><img src="/_layouts/images/blank.gif" width=13 style="visibility: hidden" alt=""></td></tr></table>]]></HTML></Default></FieldSwitch></DisplayPattern></Field><Field ReadOnly="TRUE" Type="Computed" Name="SelectTitle" Hidden="TRUE" CanToggleHidden="TRUE" DisplayName="Select" Dir="" AuthoringInfo="(web part connection)" HeaderImage="blank.gif" Sortable="FALSE" FromBaseType="TRUE"><FieldRefs><FieldRef Name="ID"/></FieldRefs><DisplayPattern><IfEqual><Expr1><GetVar Name="SelectedID"/></Expr1><Expr2><Column Name="ID"/></Expr2><Then><HTML><![CDATA[<img border="0" align="absmiddle" style="cursor: hand" src="/_layouts/images/
bsel.gif" alt="]]></HTML><HTML>Selected</HTML><HTML><![CDATA[">]]></HTML></Then><Else><HTML><![CDATA[<a href="javascript:SelectField(']]></HTML><GetVar Name="View"/><HTML><![CDATA[',']]></HTML><ScriptQuote NotAddingQuote="TRUE"><Column
Name="ID"/></ScriptQuote><HTML><![CDATA[');return false;" onclick="javascript:SelectField(']]></HTML><GetVar Name="View"/><HTML><![CDATA[',']]></HTML><ScriptQuote NotAddingQuote="TRUE"><Column Name="ID"/></ScriptQuote><HTML><![CDATA[');return false;" target="_self">]]></HTML><HTML><![CDATA[<img border="0" align="absmiddle" style="cursor: hand" src="/_layouts/images/rbunsel.gif"  alt="]]></HTML><HTML>Normal</HTML><HTML><![CDATA[">]]></HTML><HTML><![CDATA[</a>]]></HTML></Else></IfEqual></DisplayPattern></Field><Field Name="InstanceID" DisplayName="InstanceID" ColName="tp_InstanceID" ReadOnly="TRUE" Hidden="TRUE" Type="Integer" Min="0" Max="99991231" Filterable="TRUE" Sortable="TRUE" FromBaseType="TRUE"/><Field ColName="tp_ItemOrder" Name="Order" DisplayName="Order" Type="Number" Hidden="TRUE" FromBaseType="TRUE"/><Field ColName="tp_GUID" ReadOnly="TRUE" Hidden="TRUE" Type="Guid" Name="GUID" DisplayName="GUID" FromBaseType="TRUE"/><Field Type="DateTime" Name="EventDate" DisplayName="Begin" Format="DateTime" Sea
ed="TRUE" Required="TRUE" FromBaseType="TRUE" Filterable="FALSE" FilterableNoRecurrence="TRUE" ColName="datetime1"><Default>[today]</Default><DefaultFormulaValue>2007-02-09T00:00:00Z</DefaultFormulaValue></Field><Field Type="DateTime" 
ame="EndDate" DisplayName="End" Format="DateTime" Sealed="TRUE" Filterable="FALSE" FilterableNoRecurrence="TRUE" ColName="datetime2"/><Field Type="Note" Name="Description" DisplayName="Description" Sortable="FALSE" Sealed="TRUE" ColName="ntext2"/><Field Type="Text" Name="Location" DisplayName="Location" Sealed="TRUE" ColName="nvarchar2"/><Field Type="Recurrence" Name="fRecurrence" DisplayName="Recurrence" DisplayImage="recur.gif" HeaderImage="recur.gif" ClassInfo="Icon" Title="Recurrence" Sealed="TRUE" NoEditFormBreak="TRUE" ColName="bit1"><Default>FALSE</Default><FieldRefs><FieldRef Name="RecurrenceData" RefType="RecurData"/><FieldRef Name="EventType" RefType="EventType"/><FieldRef Name="UID" RefType="UID"/><FieldRef Name="RecurrenceID" RefType="RecurrenceId"/><FieldRef Name="EventCanceled" RefType="EventCancel"/><FieldRef Name="EventDate" RefType="StartDate"/><FieldRef Name="EndDate" RefType="EndDate"/><FieldRef Name="Duration" RefType="Duration"/><FieldRef Name="TimeZone" RefType="TimeZone"/><FieldRef Nam
="XMLTZone" RefType="XMLTZone"/><FieldRef Name="MasterSeriesItemID" RefType="MasterSeriesItemID"/><FieldRef Name="WorkspaceLink" RefType="CPLink"/><FieldRef Name="Workspace" RefType="LinkURL"/></FieldRefs></Field><Field Type="CrossProj
ctLink" Name="WorkspaceLink" Format="EventList" DisplayName="Workspace" DisplayImage="mtgicon.gif" HeaderImage="mtgicnhd.gif" ClassInfo="Icon" Title="Meeting Workspace" Filterable="TRUE" Sealed="TRUE" ColName="bit2"><FieldRefs><FieldRef Name="Workspace" RefType="LinkURL" CreateURL="newMWS.aspx">Use a Meeting Workspace to organize attendees, agendas, documents, minutes, and other details for this event.</FieldRef><FieldRef Name="RecurrenceID" RefType="RecurrenceId" DisplayName="InstanceID"/><FieldRef Name="EventType" RefType="EventType"/><FieldRef Name="UID" RefType="UID"/></FieldRefs></Field><Field Type="Integer" Name="EventType" DisplayName="Event Type" Sealed="TRUE" Hidden="TRUE" ColName="int1"/><Field Type="Guid" Name="UID" DisplayName="UID" Sealed="TRUE" Hidden="TRUE" ColName="uniqueidentifier1"/><Field Type="DateTime" Name="RecurrenceID" DisplayName="Recurrence ID" CalType="1" Format="ISO8601Gregorian" Sealed="TRUE" Hidden="TRUE" ColName="datetime3"/><Field Type="Boolean" Name="EventCanceled" DisplayNam
="Event Canceled" Sealed="TRUE" Hidden="TRUE" ColName="bit3"/><Field Type="Integer" Name="Duration" DisplayName="Duration" Hidden="TRUE" Sealed="TRUE" ColName="int2"/><Field Type="Note" Name="RecurrenceData" DisplayName="RecurrenceData
 Hidden="TRUE" Sealed="TRUE" ColName="ntext3"/><Field Type="Integer" Name="TimeZone" DisplayName="TimeZone" Sealed="TRUE" Hidden="TRUE" ColName="int3"/><Field Type="Note" Name="XMLTZone" DisplayName="XMLTZone" Hidden="TRUE" Sealed="TRUE" ColName="ntext4"/><Field Type="Integer" Name="MasterSeriesItemID" DisplayName="MasterSeriesItemID" Sealed="TRUE" Hidden="TRUE" ColName="int4"/><Field Type="URL" Name="Workspace" DisplayName="WorkspaceUrl" Hidden="TRUE" Sealed="TRUE" ColName="nvarchar3" ColName2="nvarchar4"/></Fields><RegionalSettings><Language>1033</Language><Locale>1033</Locale><AdvanceHijri>0</AdvanceHijri><CalendarType>1</CalendarType><Time24>False</Time24><TimeZone>0</TimeZone><SortOrder>2070</SortOrder><Presence>True</Presence></RegionalSettings></List></GetListResult></GetListResponse></soap:Body></soap:Envelope


More information about the kronolith mailing list