Ok  so some more info:

The memberOf attribute is a bit special. It's first a AcriveDirectory Attribute and its syntax is Distinguish Name Syntax. Which means it's not purely a String, which is the reason it's base64 encoded.

Whe it comes to encode values, the following rule should apply:

"When creating DSML messages, all Attributes whose value is Java byte array are Base64 encoded to String before being written in the DSML message.

If when creating a DSML message an Attribute is passed whose value's type is neither String nor Java byte array, the value is converted to String by calling the object's "toString()" method and this String value is written in the DSML message.
"
(that is from IBM).

OASIS is a bit more light when it comes to tell what should be base64 encoded or not:

"The definition of DsmlValue permits the following types: UTF-8, base64Binary, and any URI."

Now, to be able to know what would be the value type, there is some attribute that needs to be added:

xsi:type="xsd:base64Binary"

Like in :

   <control type="1.2.840.113556.1.4.612" criticality="true">
      <controlValue xsi:type="xsd:base64Binary">
         U2VhcmNoIFJlcXVlc3QgRXhhbXBsZQ==
      </controlValue>
   </control>


So I guess we should avoid ommitting this attribute when base64 encoding a value.

On 08/02/2024 18:11, Emmanuel Lecharny wrote:
Hi Patrick,

I have to check why the value gets base64 encoded. I thought the issue was already properly addressed (see https://issues.apache.org/jira/plugins/servlet/mobile#issue/DIRAPI-369 <https://issues.apache.org/jira/plugins/servlet/mobile#issue/DIRAPI-369>)

Regards,
Cordialement,
Emmanuel Lécharny
www.iktek.com <http://www.iktek.com>


Le jeu. 8 févr. 2024 à 16:22, Patrick Peer <[email protected] <mailto:[email protected]>> a écrit :

    Hi Emmanuel!

    I finally got around to upgrading to the newest version. The good
    news: The value for the equalityMatch is generated successfully. The
    bad news: IHE's HPD simulator [1] seems to have problems with the
    base64 encoding. It seems as if the xsi:type-Attribute is not
    recognized and/or dropped [2].
    Now, I think the request should be correct in the context of
    HPD-queries, and that the simulator is clumsy. I will hash that out
    with the folks at IHE. However, this leads me to think that other
    "real" implementations of HPDs will have problems with base64, too.

    I will now have to decide with my colleagues how to handle this. One
    possibility would be to generate the normal strings again. To do
    that, I could compile a modified version of the library myself
    (luckily I could get away with breaking the code for parsing
    requests, should that be an issue, as you hinted before). Still, I'd
    like to know how you think about reverting to generating strings in
    the official library again. At least for the case, when the value is
    a string to begin with, and a conversion to base64 would not be
    required.

    In any case, thanks for the fix :)!

    Cheers,
    Patrick

    [1] https://gazelle.ihe.net/HPDSimulator/home.seam
    <https://gazelle.ihe.net/HPDSimulator/home.seam>
    [2]
    https://gazelle.ihe.net/HPDSimulator/messages/messageDisplay.seam?id=35572 
<https://gazelle.ihe.net/HPDSimulator/messages/messageDisplay.seam?id=35572>

    Am Di., 6. Feb. 2024 um 08:52 Uhr schrieb Emmanuel Lécharny
    <[email protected] <mailto:[email protected]>>:

        Hi,

        the release has been voted. It's available. Enjoy!

        On 02/02/2024 12:05, Patrick Peer wrote:
         > Thank you very much! Much appreciated :).
         >
         > Am Fr., 2. Feb. 2024 um 10:41 Uhr schrieb Emmanuel Lécharny
         > <[email protected] <mailto:[email protected]>
        <mailto:[email protected] <mailto:[email protected]>>>:
         >
         >     The release is being voted. I expect to be out at the
        beginning of next
         >     week.
         >
         >     On 29/01/2024 14:03, Patrick Peer wrote:
         >      > Emmanuel,
         >      >
         >      > can you give me a rough estimate on when a new version
        with the
         >     fixes
         >      > will be available? I need to upgrade due to CVEs for
        dependencies of
         >      > older versions of org.apache.directory.api:api-all,
        for the
         >     release of
         >      > our own software. Thus I need to know whether I can
        wait for your
         >      > release, or need to compile the library myself.
         >      >
         >      > Cheers,
         >      > Patrick
         >      >
         >      > Am Mi., 6. Dez. 2023 um 09:26 Uhr schrieb Patrick Peer
         >      > <[email protected] <mailto:[email protected]>
        <mailto:[email protected] <mailto:[email protected]>>
         >     <mailto:[email protected] <mailto:[email protected]>
        <mailto:[email protected] <mailto:[email protected]>>>>:
         >      >
         >      >     Hi Emmanuel!
         >      >
         >      >      > Side note: I'd be interested to know what is
        your usage of the
         >      >     LDAP API
         >      >      > and why you picked it against other libs. Just
        for my
         >     personnal
         >      >     interest!
         >      >     I inherited the code using the LDAP API, so my
        best guess is:
         >     When
         >      >     Apache provides a library for the thing you want
        to do, you
         >     use it :).
         >      >     As for the actual use case, we want to query
        Healthcare Provider
         >      >     Directories (HPDs) [1].
         >      >
         >      >      > Btw, I now realize that the output is
        incorrect, even after my
         >      >     fix. The
         >      >      > produced DSML should still contain the Base64
        value, which is
         >      >     currently
         >      >      > not. I'll fix that.
         >      >     Given that this was a bug, and the filter values
        will be
         >     generated
         >      >     again, setFilter(String) _should_ work after the fix.
         >     However, given
         >      >     my experience in the field, I fear there will be
        problems
         >     with HPDs
         >      >     that are not prepared to handle base64 values. I
        might be
         >     wrong on
         >      >     that though, and as long as IHE's HPD simulator is
        happy, I
         >     think I
         >      >     will use the simpler (for me) base64 filters. On
        that note,
         >     do you
         >      >     have an estimate on when a new version will be
        released?
         >      >
         >      >     Cheers,
         >      >     Patrick
         >      >
         >      >
         >      >
         >      >     [1]
         >      >
         >
        https://www.ihe.net/uploadedFiles/Documents/ITI/IHE_ITI_Suppl_HPD.pdf 
<https://www.ihe.net/uploadedFiles/Documents/ITI/IHE_ITI_Suppl_HPD.pdf> 
<https://www.ihe.net/uploadedFiles/Documents/ITI/IHE_ITI_Suppl_HPD.pdf 
<https://www.ihe.net/uploadedFiles/Documents/ITI/IHE_ITI_Suppl_HPD.pdf>> 
<https://www.ihe.net/uploadedFiles/Documents/ITI/IHE_ITI_Suppl_HPD.pdf 
<https://www.ihe.net/uploadedFiles/Documents/ITI/IHE_ITI_Suppl_HPD.pdf> 
<https://www.ihe.net/uploadedFiles/Documents/ITI/IHE_ITI_Suppl_HPD.pdf 
<https://www.ihe.net/uploadedFiles/Documents/ITI/IHE_ITI_Suppl_HPD.pdf>>> - 3.58 Provider Information Query
         >      >
         >      >     Am Di., 5. Dez. 2023 um 23:02 Uhr schrieb Emmanuel
        Lécharny
         >      >     <[email protected] <mailto:[email protected]>
        <mailto:[email protected] <mailto:[email protected]>>
         >     <mailto:[email protected] <mailto:[email protected]>
        <mailto:[email protected] <mailto:[email protected]>>>>:
         >      >
         >      >         Ok, I get a fixed version of the setFilter(
        String ) that
         >      >         produces this
         >      >         output:
         >      >
         >      >         <?xml version="1.0" encoding="UTF-8"?>
         >      >         <batchRequest
        xmlns:xsd="http://www.w3.org/2001/XMLSchema
        <http://www.w3.org/2001/XMLSchema>
         >     <http://www.w3.org/2001/XMLSchema
        <http://www.w3.org/2001/XMLSchema>>
         >      >         <http://www.w3.org/2001/XMLSchema
        <http://www.w3.org/2001/XMLSchema>
         >     <http://www.w3.org/2001/XMLSchema
        <http://www.w3.org/2001/XMLSchema>>>"
>      >  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
        <http://www.w3.org/2001/XMLSchema-instance>
         >     <http://www.w3.org/2001/XMLSchema-instance
        <http://www.w3.org/2001/XMLSchema-instance>>
         >      >         <http://www.w3.org/2001/XMLSchema-instance
        <http://www.w3.org/2001/XMLSchema-instance>
         >     <http://www.w3.org/2001/XMLSchema-instance
        <http://www.w3.org/2001/XMLSchema-instance>>>">
         >      >              <searchRequest derefAliases="derefAlways">
         >      >                 <filter>
         >      >                    <equalityMatch name="uid">
         >      >                       <value/>
         >      >                    </equalityMatch>
         >      >                    <equalityMatch name="uid">
         >      >                       <value
         >      >
>  xsi:type="xsd:base64Binary">U29tZUFyYml0cmFyeUJlbmlnblN0cmluZw==</value>
         >      >                    </equalityMatch>
         >      >                 </filter>
         >      >              </searchRequest>
         >      >         </batchRequest>
         >      >
         >      >         As youc an imagine,
        "U29tZUFyYml0cmFyeUJlbmlnblN0cmluZw==" is
         >      >         "SomeArbitraryBenignString" base 64 encoded.
         >      >
         >      >
         >      >         Should it do the trick?
         >      >
         >      >         On 05/12/2023 15:43, Patrick Peer wrote:
         >      >          > Thanks Emmanuel!
         >      >          >
         >      >          > Using a SchemaManager solved my immediate
        problem.
         >     However,
         >      >         now I need
         >      >          > to provide a custom Schema, since I need to
        query domain
         >      >         specific OIDs.
         >      >          > Before, the library was happy with
        arbitrary OIDs, and
         >     so was
         >      >         I :).
         >      >          >
         >      >          > Addressing the easy API life,
         >      >          >
         >      >
>  org.apache.directory.api.dsmlv2.request.SearchRequestDsml.setFilter(String) seems broken to me, as this code path does not produce the expected output, and this is not obvious in any way, not to say that the semantic of this method changed without notice. Ideally, this method would not exist, but since it is required by the implemented interface, that is not easily achieved, and a bigger refactoring would be needed. That said, I, of course, do not have a deep understanding of your code base, so please take my suggestion with a grain of salt ;).
         >      >          >
         >      >          > Thanks for the improved
        setFilter(SchemaManager, String)
         >      >         method, albeit
         >      >          > it is secondary to me, compared to the changed
         >     semantics of
         >      >          > setFilter(String), and the extra setup
        needed to be
         >     able to
         >      >         query
         >      >          > arbitrary OIDs. To better illustrate what I
        mean, here
         >     is one
         >      >         of the
         >      >          > filters which is currently broken for me:
         >      >          >
>  "(hcIdentifier=*1.3.6.1.4.1.21367.1776:IHENA:A-919191:Active*)"
         >      >          >
         >      >          > I am currently in the process of figuring
        out an easy
         >     way to
         >      >         add the
         >      >          > required OIDs to the SchemaManager, and
        will eventually
         >      >         figure it out,
         >      >          > but if you have any hints, I'd be grateful :).
         >      >          >
         >      >          > Cheers,
         >      >          > Patrick
         >      >          >
         >      >          > Am Di., 5. Dez. 2023 um 13:48 Uhr schrieb
        Emmanuel
         >     Lécharny
         >      >          > <[email protected]
        <mailto:[email protected]> <mailto:[email protected]
        <mailto:[email protected]>>
         >     <mailto:[email protected] <mailto:[email protected]>
        <mailto:[email protected] <mailto:[email protected]>>>
         >      >         <mailto:[email protected]
        <mailto:[email protected]> <mailto:[email protected]
        <mailto:[email protected]>>
         >     <mailto:[email protected] <mailto:[email protected]>
        <mailto:[email protected] <mailto:[email protected]>>>>>:
         >      >          >
         >      >          >     Hi again!
         >      >          >
         >      >          >     I have modified the LDAP API to be able
        to deal
         >     with the
         >      >         attributeType
         >      >          >     properly when we have a SchemaManager,
        and to do
         >     so in a
         >      >         more user
         >      >          >     friendly way.
         >      >          >
         >      >          >     Here is thge modified original test:
         >      >          >
         >      >          >           @Test
         >      >          >           public void
        testMinimalEqualityRequest() throws
         >      >         Exception {
         >      >          >               SearchRequestDsml
        searchRequest = new
         >      >          >
         >       SearchRequestDsml(LdapApiServiceFactory.getSingleton());
         >      >          >
         >      >          >              // Create the SchemaManager
        instance
         >      >          >               SchemaManager schemaManager = new
         >      >         DefaultSchemaManager();
         >      >          >
         >      >          >              // Use it as a parameter so
        that the
         >     filter get
         >      >         properly parsed
         >      >          >               searchRequest.setFilter(
        schemaManager,
         >      >          >     "(uid=SomeArbitraryBenignString)" );
         >      >          >
         >      >          >
         >      >          >               BatchRequestDsml batchRequest
        = new
         >      >         BatchRequestDsml();
>      >          >  batchRequest.addRequest(searchRequest);
         >      >          >               String dsmlString =
        batchRequest.toDsml();
         >      >          >
         >      >          >              System.out.print( dsmlString );
         >      >          >           }
         >      >          >
         >      >          >     which prints out the expected result:
         >      >          >
         >      >          >     <?xml version="1.0" encoding="UTF-8"?>
         >      >          >     <batchRequest>
         >      >          >          <searchRequest
        derefAliases="derefAlways">
         >      >          >             <filter>
         >      >          >                <equalityMatch name="uid">
>      >          >  <value>SomeArbitraryBenignString</value>
         >      >          >                </equalityMatch>
         >      >          >             </filter>
         >      >          >          </searchRequest>
         >      >          >     </batchRequest>
         >      >          >
         >      >          >     It will most certainly be included in
        2.1.6.
         >      >          >
         >      >          >
         >      >          >     On 04/12/2023 21:18, Patrick Peer wrote:
         >      >          >      > Hello!
         >      >          >      >
         >      >          >      > I recently upgraded the version
         >      >          >     of org.apache.directory.api:api-all from
         >      >          >      > 2.1.0 to 2.1.5 in the dependencies
        of our product,
         >      >         which resulted in
         >      >          >      > some test failures on my end. As it
        seems,
         >     values for
         >      >         equality
         >      >          >     filters
         >      >          >      > are not set in the request anymore.
        For your
         >      >         convenience, I cobbled
         >      >          >      > together a minimal test case to
        reproduce the
         >      >         condition [1].
         >      >          >     It works
         >      >          >      > with Version 2.1.0 and does not work
        with 2.1.5.
         >      >          >      >
         >      >          >      > Upon further investigation, I think
        I found
         >     some issues
         >      >          >      >
         >      >          >
         >      >
>  in org.apache.directory.api.dsmlv2.request.SearchRequestDsml.toDsml(Element, ExprNode)@2.1.5:
         >      >          >      > + On line 559 value.isHumanReadable() is
         >     queried to decide
         >      >          >     whether to
         >      >          >      > use the value as is, or to encode it
        in base64. =>
         >      >         This seems
         >      >          >     broken,
         >      >          >      > since, as far as I can tell,
         >      >          >      >
>      >  the org.apache.directory.api.ldap.model.entry.Value.isHR
         >     flag is
         >      >          >     always
         >      >          >      > false at this particular point in
        the code.
         >      >          >      >
         >      >          >
         >      >
>  + org.apache.directory.api.dsmlv2.ParserUtils.base64Encode(Object)
         >     only
         >      >          >      > yields base64 values for byte[] and
        String,
         >     however here a
         >      >          >      >
        org.apache.directory.api.ldap.model.entry.Value is
         >      >         passed, which
         >      >          >     will
         >      >          >      > always result in an empty String.
         >      >          >      >
         >      >          >      > The corresponding commit should be [2].
         >      >          >      >
         >      >          >      > Do you agree that this is a bug, and
        should I jump
         >      >         through the
         >      >          >     hoops to
         >      >          >      > open a Jira issue, or is there an
         >     alternative/intended
         >      >         way to work
         >      >          >      > around this?
         >      >          >      >
         >      >          >      > Cheers,
         >      >          >      > Patrick Peer
         >      >          >      >
         >      >          >      >
         >      >          >      >
         >      >          >      > [1]
         >      >          >      > @Test
         >      >          >      > public void
        testMinimalEqualityRequest() throws
         >      >         Exception {
         >      >          >      >      SearchRequestDsml searchRequest
        = new
         >      >          >      >
         >     SearchRequestDsml(LdapApiServiceFactory.getSingleton());
         >      >          >      >
>      >  searchRequest.setFilter("(uid=SomeArbitraryBenignString)");
         >      >          >      >
         >      >          >      >      BatchRequestDsml batchRequest = new
         >      >         BatchRequestDsml();
>      >          >      > batchRequest.addRequest(searchRequest);
         >      >          >      >      String dsmlString =
        batchRequest.toDsml();
         >      >          >      >
         >      >          >      >
>      >  assertThat(dsmlString).contains("SomeArbitraryBenignString");
         >      >          >      > }
         >      >          >      >
         >      >          >      > [2]
         >      >          >      >
         >      >          >
         >      >
         >
        https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859 <https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859> 
<https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859 <https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859>> 
<https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859 <https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859> 
<https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859 <https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859>>> 
<https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859 <https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859> 
<https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859 <https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859>> 
<https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859 <https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859> 
<https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859 <https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859>>>> 
<https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859 <https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859> 
<https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859 <https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859>> 
<https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859 <https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859> 
<https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859 <https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859>>> 
<https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859 <https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859> 
<https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859 <https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859>> 
<https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859 <https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859> 
<https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859 <https://github.com/apache/directory-ldap-api/commit/1dd1248d33ffed80cc225e76b2769e4558bbc859>>>>>
         >      >          >
         >      >          >     --
         >      >          >     *Emmanuel Lécharny* P. +33 (0)6 08 33 32 61
         >      >          > [email protected]
        <mailto:[email protected]> <mailto:[email protected]
        <mailto:[email protected]>>
         >     <mailto:[email protected]
        <mailto:[email protected]> <mailto:[email protected]
        <mailto:[email protected]>>>
         >      >         <mailto:[email protected]
        <mailto:[email protected]>
         >     <mailto:[email protected]
        <mailto:[email protected]>> <mailto:[email protected]
        <mailto:[email protected]>
         >     <mailto:[email protected] <mailto:[email protected]>>>>
         >      >          >
         >      >
         >      >         --
         >      >         *Emmanuel Lécharny* P. +33 (0)6 08 33 32 61
         >      > [email protected] <mailto:[email protected]>
        <mailto:[email protected] <mailto:[email protected]>>
         >     <mailto:[email protected]
        <mailto:[email protected]> <mailto:[email protected]
        <mailto:[email protected]>>>
         >      >
         >
         >     --
         >     *Emmanuel Lécharny* P. +33 (0)6 08 33 32 61
         > [email protected] <mailto:[email protected]>
        <mailto:[email protected] <mailto:[email protected]>>
         >


-- *Emmanuel Lécharny* P. +33 (0)6 08 33 32 61
        [email protected] <mailto:[email protected]>


--
*Emmanuel Lécharny* P. +33 (0)6 08 33 32 61
[email protected]

Reply via email to