0

我想编写一个小的 LDAP 2 CardDav 网关,它在它的 LDAP 端获取请求(来自桌面电话/PBX)并将其转换为 CardDAV 请求。

因此,我使用了原始 HTTP/XML 请求并且能够:

  • 使用和查询基目录/kdav/addressbooks/PROPFINDdepth: 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>
4

0 回答 0