为站点成员发布 CalDav 事件并管理参与者

Posted

技术标签:

【中文标题】为站点成员发布 CalDav 事件并管理参与者【英文标题】:Publish CalDav events for site members and manage participants 【发布时间】:2016-04-21 21:02:50 【问题描述】:

我正在运行带有用户数据库和共享日历(事件)管理数据库的 php 站点。

我想在 iCal/CalDAV 中发布这些活动,以便会员可以:

通过身份验证同步获取所有日历事件(私有 URL...) 参加活动 (但不创建或修改事件)

应用程序应利用网站现有的用户和日历数据库。

我查看了 PHP 和 Python 中的 CalDav 实现,对于这个简单的用法来说,它们似乎都太复杂了:

sabre/dav 具有实验性的共享日历支持,利用现有的用户数据库似乎很棘手。 DAViCal 似乎有自己的用户数据库、复杂的 ACL 方案等。 等

怎么做?

使用适应的 CalDAV/iCal 库?任何关于图书馆的想法可以完成这项工作? 编写我自己的 CalDAV/iCal 服务器,但存在客户端支持不佳的风险。

编辑:在现有网站数据库中使用 sabre/dav 的有用链接:

Using external databases

编辑:改进:

虽然按预期工作,但 sabre/DAV 在创建邀请约 100 名当地人(“负责人”)的服务器端活动方面太慢了。它会为每个受邀者生成 99 倍的无用活动副本。处理邀请大约需要 8 秒(打开 xdebug 分析需要 30 多秒,然后它就崩溃了!)。

关于使用共享日历,标准中只有两种可能性:要么给受邀者读写权限,以便他可以加入活动(但也可以更改/删除它!),要么给他只读访问...但他不能加入它。所以我使用Sabre\CalDAV\Backend\PDO::updateCalendarObject() 将事件编辑限制为参与者PARTSTAT

但无论解决方案如何,冲突都会出现问题:

当参与者 A 修改表示其参与的日历条目 (PARTSTAT ACCEPTED) 时,Sabre/DAV 通过更新所有用户日历中的所有日历对象来处理此信息。这样做时,SabreDAV 会增加所有这些日历的 SYNC 令牌。

因此,当参与者 B 尝试加入某个活动,但尚未同步参与者 A 在此期间加入该活动的信息时,就会发生冲突,参与者 B 的加入信息LOST

冲突解决方案:

RFC 6638 定义了一种使用 schedule-tag 来避免此类冲突的方法。这仅在 v3.3 的 Sabre/DAV 路线图中。我已经为 sabre/dav here 开发了实验性支持,但我测试过的所有 android 客户端都不支持这个 RFC,只有 ios 支持!无论如何,即使使用schedule-tag,如果组织者更改活动数据或使用共享日历时,一些参与者加入信息也会丢失。

所以我做了自己的 sabre/dav 实现,几乎不会丢失参与者加入信息(除非重新安排活动):sabre/dav partstat-only-calendar。基本上,它的工作原理是考虑到用户发送的冲突事件,并且只在服务器事件中记录参与者的 PARSTAT 信息,而不是通常推送 PreconditionFailed 异常。我仍然需要发布一个利用所有功能的服务器运行脚本示例。

【问题讨论】:

【参考方案1】:

(对于 ***,这个问题似乎有点宽泛。)

SabreDAV 似乎是在 PHP 中实现 Cal/CardDAV 服务器时的选择。使用它很可能是有意义的。

a) 通过身份验证(私有 URL...)同步获取所有日历事件

嗯,这应该包括在内。

b) 加入活动

我假设您的用例是您有一个活动,但没有主动邀请用户参加。但是您仍然希望用户用户将自己“添加”到事件中。 这不是 CalDAV 标准当前支持的用例。 CalDAV 中有共享日历,并且有服务器端预定事件。我认为后者可能对你有用。

您可以综合这种“加我”行为。在将用户呈现给客户时,动态地将用户添加为事件的参与者。然后他可以接受/也许/拒绝它。如果他这样做了,请在主赛事中坚持这一事实 - 他现在是一个常客。

c)(但不创建或修改事件)

这是 iTIP/CalDAV 服务器计划事件的默认行为。只有 ORGANIZER 可以修改事件,除了警报等。 所以这似乎适合您的用例。

【讨论】:

谢谢,你安慰我使用 SabreDAV。它可以使用自定义authenticationprincipalcalendar 后端进行设置,因此这是使用现有站点数据库的方法。文档没有示例,但 this helped.

以上是关于为站点成员发布 CalDav 事件并管理参与者的主要内容,如果未能解决你的问题,请参考以下文章

CALDAV 在 icloud 中添加带有注释的事件

CalDAV 请求 gGt iCloud 日历事件

iCloud Caldav 连接以获取日历

iCloud日历删除事件请求不适用于caldav

CALDAV 在 ICLOUD 中编辑/删除多个事件

Caldav 未在时间范围查询内返回事件