14.15 Contrôle du DN étendu LDAP

eDirectory propose un contrôle du DN étendu LDAP qui est utilisé avec une recherche LDAP étendue pour demander une forme étendue de l'objet Distinguished Name (Nom distinctif). La forme étendue inclut une représentation de chaîne de Object GUID (GUID d'objet) avec le nom distinctif (Distinguished Name) de l'objet.

Pour utiliser la fonction de contrôle du DN étendu LDAP avec le serveur eDirectory, un administrateur doit fournir l'OID de contrôle de DN étendu LDAP 1.2.840.113556.1.4.529 dans la requête de recherche LDAP étendue.

Le contrôle du DN étendu permet au client de demander que les résultats d'une recherche LDAP qui utilise ce contrôle renvoient les données GUID d'un objet ainsi que l'objet distinguishedName, avec la syntaxe suivante :

<GUID=xxxxxxxx>;distinguishedName

xxxxxxxx est une chaîne qui contient le GUID et distinguishedName est le nom distinctif (DN), comme dans l'exemple cn=users,dc=fabrikam,dc=com.

Le contrôle du DN étendu LDAP peut être transmis avec une valeur de drapeau entier. La valeur de drapeau transmise spécifie le format de chaîne de la valeur GUID renvoyée et est définie sur la séquence codée au format Ber suivante :

Sequence {
  Flag    INTEGER
}

Une valeur de drapeau 0 indique une valeur GUID renvoyée au format de chaîne hexadécimale telle que <GUID=3BC72D2DEC5A704BBDC21F4EF97B7870>.

Une valeur de drapeau 1 renvoie la valeur de GUID au format de chaîne standard telle que <GUID = 098f2470-bae0-cd 11-b579-08002b30bfeb >.

Il existe plusieurs types de données complexes d'eDirectory qui incluent le DN comme en faisant partie intégrante. eDirectory traite uniquement les types de données complexes suivants avec le contrôle du DN étendu LDAP :

  • SYN_PATH (GUID est renvoyé pour volumeDN)

  • SYN_DN

  • SYN_TYPED_NAME

    REMARQUE :les performances de recherche LDAP seront affectées lors de l'utilisation du contrôle de DN étendu avec les types de données complexes mentionnés ci-dessus.

Exemples :

Le code d'exemple C++ suivant montre comment formater manuellement les données de la séquence. La fonction ber_printf permet de créer les données de séquence. La partie des drapeaux contient l'indicateur du format de chaîne GUID :

LDAPControl *FormatExtDNFlags(int iFlagValue)
{
  BerElement *pber = NULL;
  LDAPControl *pLControl = NULL;
  berval *pldctrl_value = NULL;
  int success = -1;

  // Ensure that iFlagValue is either 0 or 1. Convert TRUE (-1) to a legal value.
  if(iFlagValue != 0)
         iFlagValue = 1;

  // Format and encode the SEQUENCE data in a BerElement.
  pber = ber_alloc_t(LBER_USE_DER);
  if(pber==NULL) return NULL;
  pLControl = new LDAPControl;
  if(pLControl==NULL) { ber_free(pber,1); return NULL; }
  ber_printf(pber,"{i}",iFlagValue);

  // Transfer encoded data into a BERVAL.
  success = ber_flatten(pber,&pldctrl_value);
  ber_free(pber,1);
  if(success != 0) {return NULL;}

  // Copy the BERVAL data to the LDAPControl structure.
  pLControl->ldctl_oid = LDAP_SERVER_EXTENDED_DN_OID;
  pLControl->ldctl_iscritical = true;
  pLControl->ldctl_value.bv_val = new char[pldctrl_value->bv_len];
  memcpy(pLControl->ldctl_value.bv_val,
         pldctrl_value->bv_val, pldctrl_value->bv_len);
  pLControl->ldctl_value.bv_len = pldctrl_value->bv_len;

  // Cleanup temporary berval.
  ber_bvfree(pldctrl_value);

  // Return formatted LDAPControl data.
  return pLControl;
}

L'exemple de code C++ suivant montre comment utiliser le contrôle du DN étendu avec la fonction ldap_search_ext_s :

        int err;
        LDAP *ldapConnection = NULL;
        LDAPControl *pExtDNControl;
        LDAPControl *controlArray[2];
        LDAPMessage *results = NULL;
        LDAPMessage *message = NULL;
        char *dn = NULL;

        // Connect to the default LDAP server.
        ldapConnection = ldap_open( NULL, 0 );
        if ( ldapConnection == NULL ) goto FatalExit0;

        // Bind to the server using default credentials.
        err = ldap_simple_bind_s( ldapConnection, NULL, NULL);
        if (LDAP_SUCCESS != err) goto FatalExit0;

        // Setup the extended DN control, requesting 'standard string' format.
        pExtDNControl = FormatExtDNFlags(1);
        if (pExtDNControl == NULL) goto FatalExit0;
        controlArray[0] = pExtDNControl;
        controlArray[1] = NULL;

        // Perform a synchronous search.
        err   = ldap_search_ext_s( ldapConnection,
                        "cn=users,dc=Fabrikam,dc=com",
                        LDAP_SCOPE_SUBTREE,
                        "objectClass=*",
                        NULL,          // Retrieve all attributes.
                        0,             // Retrieve attributes and values.
                        (LDAPControl **) &controlArray,
                        NULL,          // Client controls.
                        0,             // Timeout.
                        0,             // Sizelimit.
                        &results       // Receives identifier for results.
                        );
        if (LDAP_SUCCESS != err) goto FatalExit0;

        // Process the search results.
        message = ldap_first_entry( ldapConnection, results );
        while (message != NULL)
        {
                // Print the distinguished name of the object.
                dn = ldap_get_dn( ldapConnection, message );
                if (!dn) goto FatalExit0;
                printf( "  Distinguished Name is : %s\n", dn );
                ldap_memfree(dn);
                message = ldap_next_entry( ldapConnection, message );
        }

FatalExit0:
        if (ldapConnection)
                ldap_unbind( ldapConnection );
        if (results)
                ldap_msgfree( results );
}