CalDAV协议同步和不同客户端的行为

时间:2016-10-12 13:30:32

标签: icalendar caldav thunderbird-lightning

我目前正在尝试为系统实现“简单”的只读CALDAV接口。但同步协议和CALDAV客户端给我带来了一些麻烦。

我使用的主要测试客户是macos-calendar(sierra)。 最初的握手(DAV原理,日历查找)和数据的初始加载正在起作用。我得到一些REPORT:日历查询请求。 问题是初始加载后的增量同步。有两种方法:

  • 通过WebSync-extension(REPORT:sync-collection和sync-token prop) 我的主要问题是在我的系统中从服务器配置同步令牌并不简单。更改和新数据不是问题,而是物理删除(尚未记录在用户上下文中)以及组和/或角色分配范围的更改。也许我需要考虑在复杂情况下使sync-token无效并让客户端重置而不进行同步收集? 一个令人讨厌的解决方法可能是保留发送给客户端的日历项ID,并检查每个请求是否存在,并在必要时使用未找到的每个已删除/超出范围的日历项进行响应。但这意味着我将客户端状态存储在服务器上,这听起来不对,可能容易出错。

  • 通过基本的协议同步(响应REPORT:calendar-query和propfind(depth = 1)请求没有webdav-sync激活) 这对于新的和变更的数据原则上也是有效的。但是macos-calendar不会删除不属于集合响应的项目​​(propfind with depth = 1)。根据协议,客户端应确定已删除的项目并将其删除,但在我的情况下它不会这样做。这里有什么想法? 对于我的系统,目前使用这种方法是理想的,尽管性能可能不是理想的。

使用ios-Calendar我面临另一个问题:

  • 初始握手以某种方式工作,因为网络中的请求即将到来并得到解答。

  • 但是MKCALENDAR请求(而不是项目的日历查询或propfind)会以403回答,因为我也没有在选项响应的Allow-header中提供它。请求如下所示:

MKCALENDAR /services/cal/_userid/220EDB4A-F00C-41C9-B78F-10781BBA77E4/ HTTP/1.1 Host: 127.0.0.1:8003 Content-Type: text/xml User-Agent: iOS/10.0.1 (14A403) dataaccessd/1.0 <?xml version="1.0" encoding="UTF-8"?> <B:mkcalendar xmlns:B="urn:ietf:params:xml:ns:caldav"> <A:set xmlns:A="DAV:"> <A:prop> <B:calendar-free-busy-set> <NO/> </B:calendar-free-busy-set> <D:calendar-order xmlns:D="http://apple.com/ns/ical/">1</D:calendar-order> <A:displayname>Kalender</A:displayname> <B:calendar-timezone>BEGIN:VCALENDAR ...deleted.... </B:calendar-timezone> <B:supported-calendar-component-set> <B:comp name="VEVENT"/> </B:supported-calendar-component-set> </A:prop> </A:set> </B:mkcalendar>

  • 事后没有发生任何事情。

  • 有没有人遇到这种情况?虽然我有一个日历集合作为资源类型,为什么ios-calendar尝试做mkcalendar?

使用Thunderbird Lightning:

  • 与日历集合的初始握手正在运作

  • 使用iCal-Items回答物品的propfind和multiget请求。

  • 但它们没有显示,我收到错误日志:

  • Warnung:CalDAV:失败:CalDAV:错误:获取状态200获取调试代理的日历数据,null

  • (德语文本:错误代码:0x80004005)Warnung:Fehler beim Lesen vonDatenfürKalender:Debug Proxy。 Allerdings ist dieser Fehlerwahrscheinlichvernachlässigbar,daher versucht das Programm fortzufahren。 Fehlercode:0x80004005。 Beschreibung:CalDAV:错误:获取状态200获取调试代理的日历数据,null

  • (德语文本:错误代码:READ_FAILED)Warnung:Fehler beim Lesen vonDatenfürKalender:Debug Proxy。 Allerdings ist dieser Fehlerwahrscheinlichvernachlässigbar,daher versucht das Programm fortzufahren。 Fehlercode:READ_FAILED。 Beschreibung:

  • http频道监听器OnDataAvailable合同违规

  • 类似的回复是在macos-calendar中工作 - 可能是编码问题吗?

任何提示都非常感谢!

2 个答案:

答案 0 :(得分:3)

这确实是一个非常广泛的问题。但是,让我试着解决一些问题:

  

通过WebSync-extension(REPORT:sync-collection和sync-token prop)我的主要问题是在我的系统中从服务器配置同步令牌并非易事

即使你很难,你也应该尝试在这里提出一些建议。即使这意味着在服务器上存储一些额外的信息。同步收集更有效率。 (想法:也许你至少可以在实际被删除的时候设置一个标志,然后才会使同步令牌失效?)

  

通过基本协议同步(响应REPORT:calendar-query和propfind(depth = 1))

哪一个calendar-range-queryPROPFIND?完全不同的东西......

  

原则上,这也适用于新的和已更改的数据。但是macos-calendar不会删除不属于集合响应的项目​​(propfind with depth = 1)。

如果我们正在讨论日历范围查询,则客户端无法主动删除项目,因为它不知道它们是否刚刚离开范围(与被删除)。

PROPFIND应该这样做。如果您有证据,则可能会创建另一个包含所有相关详细信息的问题。

  

使用ios-Calendar我面临另一个问题:......一个MKCALENDAR请求即将来临......

这可能意味着它找不到默认的日程安排日历,根本没有日历,没有正确的组件类型属性。或者todos(提醒应用程序,同一帐户)都一样。 MKCALENDAR的有效载荷是多少? 很难诊断没有细节,如果你无法弄明白,请在上面询问一个特定问题,包括所有相关细节(例如你为回应家庭查询而发送的XML)。

  雷鸟闪电

对此不能说太多,可能在很大程度上取决于您使用的版本和扩展名。 AFAIK很多人使用ScalableOGo Thunderbird扩展来使用Thunderbird获得适当的Cal / CardDAV。

答案 1 :(得分:1)

对于Thunderbird / Lightning,您可能需要在高级配置编辑器中打开calendar.debug.logcalendar.debug.log.verbose并重新启动。您可以在Options > Advanced > General > Config Editor中找到它。这将为您提供更详细的http请求以及有关失败的信息。您还可以连接remote debugger并查看网络监视器,或在the code中设置断点。

使用Thunderbird / Lightning请注意我们正在使用webdav-sync草稿的先前版本和当前版本的混合。我不能从错误消息中说出很多内容,因为它非常通用,但看起来结果确实存在意外情况。

比较现有服务器(如sabre/dav)与客户端之间的握手可能是有意义的,然后看看您的通信与他们之间的区别在哪里。

此外,您可能对Apple的CalDAVTester感兴趣,它会检查服务器的互操作性。但请注意,它确实包含各种苹果特定测试。 CalConnect的人们正在与Apple合作,使其更普遍可用,并拆分Apple特定的测试。鉴于您的服务器是只读的,不要期望一切正常,但您可以寻找修复特定测试。