我想编写一个小的 LDAP 2 CardDav 网关,它在它的 LDAP 端获取请求(来自桌面电话/PBX)并将其转换为 CardDAV 请求。
因此,我使用了原始 HTTP/XML 请求并且能够:
- 使用和查询基目录/kdav/addressbooks/
PROPFIND
depth: 1
- 对于
<d:resourcetype><d:collection>
递归重复查询的结果 - 将结果
<d:resourcetype><card:addressbook>
添加到地址簿列表 - 递归完成后,对地址簿列表进行
REPORT
查询<card:addressbook-query><card:address-data><card:prop name="TEL"><card:prop name="N"></card:address-data>
现在,这使我目前可以获取所有联系人并创建一个 phonebook.xml,可以通过我的手机获取。
不幸的是,我无法将 限制PROPFIND
为仅返回<d:resourcetype><d:collection>
or的结果<d:resourcetype><card:addressbook>
。这是有问题的,因为我可以有嵌套的地址簿,它返回所有子PROPFIND
节点,在最坏的情况下,这意味着我查询一个没有嵌套地址簿但有 500 个联系人的地址簿,所以我得到了 500 个结果,我完全过滤掉了在客户端。
关于如何更有效地解决这个问题的任何想法?
另外这里是我目前得到的响应示例,这使我假设地址簿是嵌套的。服务器是Kopano,要么我误解了嵌套地址簿,要么它违反了规范。
<?xml version="1.0"?>
<d:multistatus
xmlns:d="DAV:"
xmlns:s="http://sabredav.org/ns"
xmlns:card="urn:ietf:params:xml:ns:carddav"
xmlns:cal="urn:ietf:params:xml:ns:caldav"
xmlns:cs="http://calendarserver.org/ns/">
<d:response>
<d:href>/kdav/addressbooks/public/</d:href>
<d:propstat>
<d:prop>
<d:resourcetype>
<d:collection/>
</d:resourcetype>
</d:prop>
<d:status>HTTP/1.1 200 OK</d:status>
</d:propstat>
</d:response>
<d:response>
<d:href>/kdav/addressbooks/public/sdfsf/</d:href>
<d:propstat>
<d:prop>
<d:resourcetype>
<d:collection/>
<card:addressbook/>
</d:resourcetype>
</d:prop>
<d:status>HTTP/1.1 200 OK</d:status>
</d:propstat>
</d:response>
<d:response>
<d:href>/kdav/addressbooks/public/Test/</d:href>
<d:propstat>
<d:prop>
<d:resourcetype>
<d:collection/>
<card:addressbook/>
</d:resourcetype>
</d:prop>
<d:status>HTTP/1.1 200 OK</d:status>
</d:propstat>
</d:response>
</d:multistatus>