OK, I'm really sorry, you're right, I didn't know what a filter was, and by 
filter, I meant the required attributes. I apologize again for the confusion. 
Now that it's clear what a filter and the required attributes are, why am I 
getting different responses to the same LDAP query? If it's a configuration 
issue, can someone help me find it?

Marco

On 05/03/24 16:53, Howard Chu wrote:
> Marco Esposito M. wrote:
>> Dear openldap-technical,
>>
>> I have encountered an issue with slapo-translucent and I am trying to 
>> determine whether it is a problem with my configuration or a bug.
>>
>> By mistake, I opened a ticket on OpenLDAP ITS, and rightfully, I have been 
>> redirected here.
>>
>>   https://bugs.openldap.org/show_bug.cgi?id=10184
>>
>> The problem is as follows: the results from a translucent OpenLDAP server do 
>> not return any entry when a single attribute is present in the query filter. 
>> This attribute has been previously modified and is present in the local 
>> database of the translucent OpenLDAP server.
>>
>> To better explain the issue, I have set up an environment with containers. 
>> The repository is as follows:
>>
>>   https://github.com/voidloop/openldap-bug
>>
>> To bring up the environment, two commands are needed:
>>
>>   % make submodules
>>   % make docker-run
>>
>> Three containers will be running:
>>
>>   upstream: a simple LDAP server with a couple of users, listening 
>>             on port 51389/tcp.
>>
>>   buggy:    the translucent server from upstream with the problematic 
>>             behavior, listening on port 52389/tcp.
>>
>>   compiled: the translucent server from upstream recompiled with the
>>             modified code where I suspect there might be an issue, 
>>             listening on port 53389/tcp.
>>
>> The containers are simple Fedora instances with OpenLDAP. Once the following 
>> ldapmodify command is executed:
>>
>>   % ldapmodify -x -D cn=buggy,dc=example,dc=com -w password -H ldap://:52389 
>> <<EOF
>>   dn: uid=ciccio,ou=people,dc=example,dc=com
>>   changetype: modify
>>   replace: uidNumber
>>   uidNumber: 99
>>   EOF
>>
>> The following occurs:
>>
>> 1) Querying servers without filters:
> 
> You need to go reread the LDAP RFCs. What you're calling a "filter" is 
> actually an attribute list.
> All of your searches are using a filter: uid=ciccio.
> 
> Re-read the slapo-translucent manpage as well.
> 
> As I said on that ticket - there are no bugs in this code. Your config is 
> wrong because
> you don't know what a "filter" is.
> 
>>
>> -------------------------------------------------------------------------------
>>   Server "upstream"
>> -------------------------------------------------------------------------------
>>   % ldapsearch -x -H ldap://:51389 -b ou=people,dc=example,dc=com uid=ciccio 
>>          
>>   # extended LDIF
>>   #
>>   # LDAPv3
>>   # base <ou=people,dc=example,dc=com> with scope subtree
>>   # filter: uid=ciccio
>>   # requesting: ALL
>>   #
>>
>>   # ciccio, people, example.com
>>   dn: uid=ciccio,ou=people,dc=example,dc=com
>>   objectClass: top
>>   objectClass: person
>>   objectClass: organizationalPerson
>>   objectClass: inetOrgPerson
>>   objectClass: posixAccount
>>   uid: ciccio
>>   cn: Ciccio Bello
>>   sn: Bello
>>   uidNumber: 1000
>>   gidNumber: 1000
>>   homeDirectory: /home/ciccio
>>
>>   # search result
>>   search: 2
>>   result: 0 Success
>>
>>   # numResponses: 2
>>   # numEntries: 1
>>
>> -------------------------------------------------------------------------------
>>   Translucent server "buggy"
>> -------------------------------------------------------------------------------
>>   % ldapsearch -x -H ldap://:52389 -b ou=people,dc=example,dc=com uid=ciccio
>>   # extended LDIF
>>   #
>>   # LDAPv3
>>   # base <ou=people,dc=example,dc=com> with scope subtree
>>   # filter: uid=ciccio
>>   # requesting: ALL
>>   #
>>
>>   # ciccio, people, example.com
>>   dn: uid=ciccio,ou=people,dc=example,dc=com
>>   objectClass: top
>>   objectClass: person
>>   objectClass: organizationalPerson
>>   objectClass: inetOrgPerson
>>   objectClass: posixAccount
>>   uid: ciccio
>>   cn: Ciccio Bello
>>   sn: Bello
>>   uidNumber: 99
>>   gidNumber: 1000
>>   homeDirectory: /home/ciccio
>>
>>   # search result
>>   search: 2
>>   result: 0 Success
>>
>>   # numResponses: 2
>>   # numEntries: 1
>>
>> -------------------------------------------------------------------------------
>>   Translucent server "compiled"
>> -------------------------------------------------------------------------------
>>   % ldapsearch -x -H ldap://:53389 -b ou=people,dc=example,dc=com uid=ciccio
>>   # extended LDIF
>>   #
>>   # LDAPv3
>>   # base <ou=people,dc=example,dc=com> with scope subtree
>>   # filter: uid=ciccio
>>   # requesting: ALL
>>   #
>>
>>   # ciccio, people, example.com
>>   dn: uid=ciccio,ou=people,dc=example,dc=com
>>   objectClass: top
>>   objectClass: person
>>   objectClass: organizationalPerson
>>   objectClass: inetOrgPerson
>>   objectClass: posixAccount
>>   uid: ciccio
>>   cn: Ciccio Bello
>>   sn: Bello
>>   uidNumber: 99
>>   gidNumber: 1000
>>   homeDirectory: /home/ciccio
>>
>>   # search result
>>   search: 2
>>   result: 0 Success
>>
>>   # numResponses: 2
>>
>>
>> So far, everything is okay, no anomalous behavior. The issue arises when a 
>> filter is introduced.
>>
>> 2) Querying servers with a filter
>>
>> -------------------------------------------------------------------------------
>>   Server "upstream"
>> -------------------------------------------------------------------------------
>>   % ldapsearch -x -H ldap://:51389 -b ou=people,dc=example,dc=com uid=ciccio 
>> uidNumber
>>   # extended LDIF
>>   #
>>   # LDAPv3
>>   # base <ou=people,dc=example,dc=com> with scope subtree
>>   # filter: uid=ciccio
>>   # requesting: uidNumber 
>>   #
>>
>>   # ciccio, people, example.com
>>   dn: uid=ciccio,ou=people,dc=example,dc=com
>>   uidNumber: 1000
>>
>>   # search result
>>   search: 2
>>   result: 0 Success
>>
>>   # numResponses: 2
>>   # numEntries: 1
>>
>> -------------------------------------------------------------------------------
>>   Translucent server "buggy" (!!)
>> -------------------------------------------------------------------------------
>>   % ldapsearch -x -H ldap://:52389 -b ou=people,dc=example,dc=com uid=ciccio 
>> uidNumber
>>   # extended LDIF
>>   #
>>   # LDAPv3
>>   # base <ou=people,dc=example,dc=com> with scope subtree
>>   # filter: uid=ciccio
>>   # requesting: uidNumber 
>>   #
>>
>>   # search result
>>   search: 2
>>   result: 0 Success
>>
>>   # numResponses: 1
>>
>> -------------------------------------------------------------------------------
>>   Translucent server "compiled"
>> -------------------------------------------------------------------------------
>>   % ldapsearch -x -H ldap://:53389 -b ou=people,dc=example,dc=com uid=ciccio 
>> uidNumber
>>   # extended LDIF
>>   #
>>   # LDAPv3
>>   # base <ou=people,dc=example,dc=com> with scope subtree
>>   # filter: uid=ciccio
>>   # requesting: uidNumber 
>>   #
>>
>>   # ciccio, people, example.com
>>   dn: uid=ciccio,ou=people,dc=example,dc=com
>>   uidNumber: 99
>>
>>   # search result
>>   search: 2
>>   result: 0 Success
>>
>>   # numResponses: 2
>>   # numEntries: 1
>>
>>
>> Why does this behavior occur? I expect the "buggy" server to return the 
>> uidNumber attribute. The version of OpenLDAP in the container is the one 
>> installed with the Fedora package manager.
>>
>> Server configurations are available in the Git repository, but for 
>> convenience, I am listing them here:
>>
>>   upstream:
>>     https://github.com/voidloop/openldap-bug/blob/main/upstream/slapd.ldif
>>     https://github.com/voidloop/openldap-bug/blob/main/upstream/entries.ldif
>>
>>   buggy:
>>     https://github.com/voidloop/openldap-bug/blob/main/buggy/slapd.ldif
>>
>>   compiled:
>>     https://github.com/voidloop/openldap-bug/blob/main/compiled/slapd.ldif
>>
>> The source code modification is as follows:
>>
>>   % diff openldap/servers/slapd/overlays/translucent.c translucent.c -u 
>>   --- openldap/servers/slapd/overlays/translucent.c       2024-02-29 
>> 11:30:52.620837844 +0100
>>   +++ translucent.c       2024-02-29 11:14:11.274843929 +0100
>>   @@ -928,16 +928,7 @@
>>                   /* send it now */
>>                           rs->sr_entry = re;
>>                           rs->sr_flags |= REP_ENTRY_MUSTBEFREED;
>>   -                       if ( test_f ) {
>>   -                               rc = test_filter( op, rs->sr_entry, 
>> tc->orig );
>>   -                               if ( rc == LDAP_COMPARE_TRUE ) {
>>   -                                       rc = SLAP_CB_CONTINUE;
>>   -                               } else {
>>   -                                       rc = 0;
>>   -                               }
>>   -                       } else {
>>   -                               rc = SLAP_CB_CONTINUE;
>>   -                       }
>>   +                       rc = SLAP_CB_CONTINUE;
>>                   }
>>           } else if ( le ) {
>>           /* Only a local entry: remote was deleted
>>
>> I have also found posts from individuals who have identified the same issue, 
>> but either received no response or the response was unsatisfactory:
>>
>>   https://openldap.org/lists/openldap-technical/201304/msg00069.html
>>   https://www.openldap.org/lists/openldap-bugs/200905/msg00159.html
>>   https://www.openldap.org/lists/openldap-technical/201106/msg00036.html
>>
>> Thank you for your attention, and I apologize for the lengthy message.
>>
>> Marco
>>
> 
> 

Reply via email to