[horde] ActiveSync GAL setup help - search returns no contacts
James MacLean
macleajb at ednet.ns.ca
Thu Feb 21 13:19:32 UTC 2013
On 02/20/2013 09:22 PM, Michael J Rubinsky wrote:
>
> Quoting "James B. MacLean" <macleajb at ednet.ns.ca>:
>
>> On 2013-02-20 1:31 PM, Michael J Rubinsky wrote:
>>>
>>> Quoting James MacLean <macleajb at ednet.ns.ca>:
>>>
>>>> On 02/20/2013 02:20 AM, Michael J Rubinsky wrote:
>>>>>
>>>>> Quoting "James B. MacLean" <macleajb at ednet.ns.ca>:
>>>>>
>>>>>> On 2013-02-07 2:06 AM, Michael J Rubinsky wrote:
>>>>>>>
>>>>>>> Quoting "James B. MacLean" <macleajb at ednet.ns.ca>:
>>>>>>>
>>>>>>>> So, no, I do not know if the LDAP server is being queried from
>>>>>>>> the GAL function properly and I would like to trace that back,
>>>>>>>> but, alas, my php skills for traversing where
>>>>>>>> this->_registry->contacts->search() goes is beyond my skill :(.
>>>>>>>> Would you mind pointing out where that function is that is
>>>>>>>> being called and I will keep digging in to it.
>>>>>>>
>>>>>>> This calls Turba_Api::search() (so, it's in turba/lib/Api.php).
>>>>>>> The actual logic for the search that is called from
>>>>>>> Turba_Api::search() is in a combination of
>>>>>>> Turba_Driver::search() (so, in turba/lib/Driver.php) and
>>>>>>> Turba_Driver_Ldap::_search() (in turba/lib/Driver/Ldap.php).
>>>>>>>
>>>>>> Ok, getting somewhere now. When you search within Horde in the
>>>>>> "Global Address Book" the filter is :
>>>>>>
>>>>>> (|(givenname=Maclean, james)(sn=Maclean,
>>>>>> james)(|(displayname=*Maclean, james*)(mail=*Maclean, james*)))
>>>>>>
>>>>>> Which ties in well with the use of 'strict' settings in
>>>>>> turba/config/backends.local.php . When I do a search in
>>>>>> ActiveSync, it looks like :
>>>>>>
>>>>>> (&(givenname=Maclean)(sn=Maclean)(|(displayname=*Maclean*)(mail=*Maclean*)))
>>>>>> which will never match for me. The AND appears to be coming from :
>>>>>>
>>>>>> horde/turba/lib/Driver.php
>>>>>>
>>>>>> in
>>>>>>
>>>>>> public function makeSearch
>>>>>>
>>>>>> inside this if around line 460:
>>>>>>
>>>>>> if (count($strict_search) && count($search)) {
>>>>>>
>>>>>> changing that AND to OR gets things moving.
>>>>>
>>>>> That doesn't seem like the right fix.
>>>>>
>>>>> Can you see what the value of $query that is passed in to
>>>>> Horde/Core/ActiveSync/Driver.php in the _searchGal() method? I'm
>>>>> thinking I'm building that query incorrectly.
>>>>>
>>>>>
>>>>
>>>> Added :
>>>>
>>>> error_log("Q=" . print_r($query,true));
>>>>
>>>> Searching for Macle :
>>>>
>>>>
>>>> Q=Array\n(\n [query] => Macle\n [range] => 0-50\n)\n
>>>
>>> Ok. The query that is being build and passed to the LDAP specific
>>> search routine would be something like this simplified psuedo-ish
>>> search tree for me:
>>>
>>> [AND]
>>> |
>>> |---[OR]
>>> | |
>>> | |---{owner_id == 'currentuser'}
>>> |
>>> |---[OR]
>>> |
>>> |---{firstname == '*bob*'}
>>> |---{lastname == '*bob*'}
>>> |---{alias == '*bob*'}
>>> |---{email == '*bob*'}
>>>
>>>
>>> So, in other words, at least one part of each [OR] must match for an
>>> entry to be included...so the [AND] *must* be included. Using an
>>> [OR] would end up returning EVERY entry in the source owned by
>>> 'currentuser' since only one of the two sub OR conditions would need
>>> to me met.
>>>
>>> I'm not an LDAP expert, so I can't comment on how
>>> Turba_Driver_Ldap::_search() translates this tree into ldap filter,
>>> but I would look there.
>>>
>> So when I am seeing:
>>
>> (&(givenname=Maclean)(sn=Maclean)(|(displayname=*Maclean*)(mail=*Maclean*)))
>> that and is 'suppose' to connect the owner branch with the search
>> branch, but, the owner branch appears to be :
>>
>> (givenname=Maclean)(sn=Maclean)
>>
>> which will never be true :(.
>
> Well, your search might be different. The first [OR] grouping comes
> from any strict searches, yours may or may not be the same as mine.
>
> You can dump the value of $criteria in Turba_Driver_Ldap::_search()
> and see the exact structure of the query before it's parsed into an
> LDAP filter.
>
> BTW, you can use Horde::debug($some_value); to easily output this
> stuff. It will output in a file called 'horde_debug.txt' placed in
> your temporary directory.
>
>
>
>
If this helps:
16. Horde::debug() /var/www/horde/turba/lib/Driver/Ldap.php:162
array(1) {
["AND"]=>
array(2) {
["OR"]=>
array(2) {
[0]=>
array(3) {
["field"]=>
string(9) "givenname"
["op"]=>
string(1) "="
["test"]=>
string(7) "Maclean"
}
[1]=>
array(3) {
["field"]=>
string(2) "sn"
["op"]=>
string(1) "="
["test"]=>
string(7) "Maclean"
}
}
[0]=>
array(1) {
["OR"]=>
array(2) {
[0]=>
array(5) {
["field"]=>
string(11) "displayname"
["op"]=>
string(4) "LIKE"
["test"]=>
string(7) "Maclean"
["begin"]=>
bool(true)
["approximate"]=>
bool(false)
}
[1]=>
array(5) {
["field"]=>
string(4) "mail"
["op"]=>
string(4) "LIKE"
["test"]=>
string(7) "Maclean"
["begin"]=>
bool(true)
["approximate"]=>
bool(false)
}
}
}
}
}
JES
More information about the horde
mailing list