какова основная причина сбоя добавления базового DN openLDAP?

Я пишу клиент openLDAP, используя его API для добавления базового dn. Но при запуске программы возникает ошибка:

ldap_add: Type or value exists (20)
additional info: attribute 'objectClass' provided more than once

Мой код ниже:

#include <stdio.h>
#include "ldap.h"

#define SERVERIP 172.0.1.4
#define ROOTDN "cn=root,dc=jc,dc=com"
#define ROOTPW "secret"

int main()
{
    int protocol_version = LDAP_VERSION3;
    int ret;
    LDAP *ld;

    if((ld = ldap_init(SERVERIP,LDAP_PORT) == NULL)
    {
            perror("ldap_init failed\n");
            return 1;
    }
    ret = ldap_set_option(ld,LDAP_OPT_PROTOCOL_VERSION,&protocol_version);
    if(ret != LDAP_SUCCESS)
    {
            fprintf(stderr,"ldap_select_version:%s\n",ldap_err2string(ret));
            return 1;
    }
    ret = ldap_simple_bind_s(ld,ROOTDN,ROOTPW);
    if(ret != LDAP_SUCCESS)
    {
            fprintf(stderr,"ldap_simple_bind_s:%s\n",ldap_err2string(ret));
            return 1;
    }
    printf("add base dn\n");
    char baseDN[] = "dc=jc,dc=com";
    char *objVals1[] = {"organization",NULL};
    char *objVals2[] = {"dcObject",NULL};
    char *dcVals[] = {"jc",NULL};
    char *oVals[] = {"jc Inc",NULL};

    LDAPMod add1 = {LDAP_MOD_ADD,"objectClass",objVals1};
    LDAPMod add2 = {LDAP_MOD_ADD,"objectClass",objVals2};
    LDAPMod add3 = {LDAP_MOD_ADD,"dc",dcVals};
    LDAPMod add4 = {LDAP_MOD_ADD,"o",oVals};
    LDAPMod *addBase[] = {&add1,&add2,&add3,&add4,NULL};
    if(ldap_add_ext_s(ld,baseDN,addBase,NULL,NULL) != LDAP_SUCCESS)
            ldap_perror(ld,"ldap_add");
    else
            printf("ldap_add success\n");
    ldap_unbind(ld);        
}

Что не так с моим кодом?


person EK.CR    schedule 23.09.2015    source источник
comment
Я попытался добавить dcObject без организации, но произошла другая ошибка.   -  person EK.CR    schedule 23.09.2015
comment
Именно то, что говорится в сообщении об ошибке: вы добавляете objectClass более одного раза. Не делай этого, я полагаю?   -  person Nathan Tuggy    schedule 23.09.2015


Ответы (1)


char *objVals1[] = {"organization",NULL};
char *objVals2[] = {"dcObject",NULL};
char *dcVals[] = {"jc",NULL};
char *oVals[] = {"jc Inc",NULL};

LDAPMod add1 = {LDAP_MOD_ADD,"objectClass",objVals1};
LDAPMod add2 = {LDAP_MOD_ADD,"objectClass",objVals2};

Вы добавляете objectClass как два отдельных атрибута с одним значением каждый. Это многозначный атрибут, как и большинство в LDAP, и его следует добавлять следующим образом:

char *objVals1[] = {"organization", "dcObject",NULL};
// ...

LDAPMod add1 = {LDAP_MOD_ADD,"objectClass",objVals1};
person user207421    schedule 23.09.2015
comment
THX! Слова не могут описать мою благодарность! - person EK.CR; 23.09.2015
comment
Кстати, не могли бы вы дать мне свой адрес электронной почты? Я могу связаться с вами более удобно. - person EK.CR; 23.09.2015
comment
Для меня это не более удобно, если только вы не говорите о деле. - person user207421; 24.09.2015