如何使用任意过滤器公开 CardDAV 地址簿/CalDAV 日历?

How to expose CardDAV address books / CalDAV calendars with arbitrary filters?

我想提供对可能应用了搜索过滤器(例如标签、用户、组)的地址簿和日历的访问权限。

它们不应该是自动发现的,因为可能有数十亿种组合,但仍然必须与普通客户端兼容(例如 iOS / OS X,Windows 手机),即应该可以向客户端添加 URL 和过滤器。

一个问题似乎是某些客户依赖发现功能而不是您提供给他们的 URL,例如iOS(您尝试通过 URL 添加一个地址簿,它会添加所有可发现的地址簿)。

另一件事是构造可选过滤器。
使用路径怎么样?
此处的最佳做法是什么?

日历是只读的还是读写的?如果它们是只读的,您可以将 webcal URLs 用于日历(又名 'subscribed calendar' 或 iCalendar-over-HTTP)。

对于 Cal/CardDAV 日历,Apple 设备(和大多数其他 DAV 客户端)配置一个完整帐户(使用常规帐户发现机制),而不仅仅是 'a URL'。我认为没有办法解决这个问题。

假设您正在构建一个 Web 服务,它提供 registry/search-engine 或者是此类日历或地址数据的聚合器,那么该服务可以提供 Cal/CardDAV 帐户(实现发现)。

在您的网络服务上,您将有两个选择:

  1. 代理(并可能缓存)远程数据
  2. 创建一个 'CalDAV subscribed calendar'(指向 CalDAV 日历的特殊 WebDAV 资源(资源类型 {http://calendarserver.org/ns/}已订阅))。

对于联系人,您只有选择 1。作为一个额外的复杂化,您可能希望将存储的查询公开为 vCard 组而不是 CardDAV 集合。这是因为某些客户端(即某些 MacOS 联系人应用程序)仅支持一个 CardDAV 集合(并且仅使用组来构建数据)。

示例:假设您发明了一项名为 'Caloogle.com' 的服务。用户需要在该服务上获得一些帐户(可以自动创建等)。用户将 CalDAV 帐户添加到他的 iOS 设备(例如,使用预配置的配置文件,这样他就不必输入所有数据),然后连接到 Caloogle 以将数据提取到 iOS事件套件数据库。 现在在您的 Caloogle 应用程序(或在网站上)中,您让用户搜索日历数据。如果用户找到他喜欢的集合,他会将其作为日历保存到 Caloogle 中,比如 'Dividend Release Dates BP, Apple and AlwaysRightInstitute'。 iOS 最终会 ping 帐户并获取保存的日历。用户又惊又喜。

您如何实际实施 Web 服务(代理或名称到 url 映射)在很大程度上取决于您的数据来自何处...

有道理吗?

P.S.: 在 URLs 中存储查询时要小心,一些 HTTP 基础结构组件对 URL 的长度有限制,高级查询会很快溢出这个。

hnh said in 一样,当您从 URL 配置 CardDAV 或 CalDAV 时,智能客户端会尝试发现您提供的 DAV 服务,而不是仅仅使用那个 URL,所以似乎没有干净的方法来提供按标签、用户、组等过滤的多个虚拟集合

最简单可行的解决方案是为每个过滤器 URL 提供一个 虚拟 DAV 服务器,并在该过滤器的约束内提供完整的服务发现 URL.

虚拟端点是在 URL 重写的帮助下提供的,重写是常见 Web 服务器中的一项功能,并且都将指向相同的 DAV 服务器代码库并为其提供过滤条件。

例如,如果您想要具有标签 PRSpain 的项目的 CalDAV / CardDAV 集合,您可以在 https://dav.server/tag:PR/tag:Spain/ 下公开它们,而带有标签 China可以暴露在https://dav.server/tag:China/.

请注意,每个 URL 都提供具有可发现性的完整 DAV 功能。 由于发现是相对于各自的根https://dav.server/tag:PR/tag:Spain/https://dav.server/tag:China/,所以不会有干扰。

此外,您可以为一组明确定义的 CalDAV / CardDAV 集合公开一个简单的 URL https://server,例如默认日历/地址簿或用户以某种方式定义的一些“书签”集合,例如“PR 西班牙”。

简单的 URL 将根据 RFC 5785:

提供这些 HTTP 重定向
https://server/.well-known/caldav    =>    https://dav.server/default
https://server/.well-known/carddav   =>    https://dav.server/default

iOS 客户端和支持知名 URI 的客户端只需将主机设置为 server 并提供登录凭据即可进行配置。
然后他们会尝试通过 HTTPS 连接,检查众所周知的 URI,从而在 https://dav.server/default.

发现 DAV 端点

那些没有众所周知的 URI 支持或发现的人需要确切的 URL,例如https://dav.server/default/calendars/jane/mainhttps://dav.server/tag:China/calendars/jane/main.