#include "ldap_pvt.h"
#include "slap.h"
-#include "slapi.h"
#ifdef LDAP_SLAPI
+#include "slapi.h"
static Slapi_PBlock *initAddPlugin( Backend *be, Connection *conn, Operation *op,
struct berval *dn, Entry *e, int manageDSAit );
static int doPreAddPluginFNs( Backend *be, Slapi_PBlock *pb );
Backend *be;
Modifications *modlist = NULL;
Modifications **modtail = &modlist;
- Modifications tmp, *mod;
+ Modifications tmp;
const char *text;
- LDAPRDN *rdn = NULL;
- int cnt;
int rc = LDAP_SUCCESS;
int manageDSAit;
#ifdef LDAP_SLAPI
Modifications *mod;
ber_tag_t rtag;
- rtag = ber_scanf( ber, "{m{W}}", &tmp.sml_type, &tmp.sml_bvalues );
+#ifdef SLAP_NVALUES
+ tmp.sml_nvalues = NULL;
+#endif
+
+ rtag = ber_scanf( ber, "{m{W}}", &tmp.sml_type, &tmp.sml_values );
if ( rtag == LBER_ERROR ) {
#ifdef NEW_LOGGING
goto done;
}
- if ( tmp.sml_bvalues == NULL ) {
+ if ( tmp.sml_values == NULL ) {
#ifdef NEW_LOGGING
LDAP_LOG( OPERATION, INFO,
"do_add: conn %d no values for type %s\n",
NULL, "no values for attribute type", NULL, NULL );
goto done;
}
+
mod = (Modifications *) ch_malloc( sizeof(Modifications) );
-
mod->sml_op = LDAP_MOD_ADD;
mod->sml_next = NULL;
mod->sml_desc = NULL;
mod->sml_type = tmp.sml_type;
- mod->sml_bvalues = tmp.sml_bvalues;
+ mod->sml_values = tmp.sml_values;
+#ifdef SLAP_NVALUES
+ mod->sml_nvalues = NULL;
+#endif
*modtail = mod;
modtail = &mod->sml_next;
goto done;
}
- /*
- * is objectClass special?
- */
-
- /* look for objectClass attribute */
- for ( mod = modlist; mod; mod = mod->sml_next ) {
- AttributeDescription *mod_desc = NULL;
-
- rc = slap_bv2ad( &mod->sml_type, &mod_desc, &text );
- if ( rc != LDAP_SUCCESS ) {
- send_ldap_result( conn, op, rc,
- NULL, text, NULL, NULL );
- goto done;
- }
-
- if ( mod_desc == slap_schema.si_ad_objectClass ) {
- break;
- }
- }
-
- if ( mod == NULL ) {
- send_ldap_result( conn, op,
- rc = LDAP_OBJECT_CLASS_VIOLATION,
- NULL, "objectClass missing",
- NULL, NULL );
- goto done;
- }
-
- /* look for special objectClass */
- for ( cnt = 0; mod->sml_bvalues[ cnt ].bv_val; cnt++ ) {
- ObjectClass *oc;
-
- oc = oc_bvfind( &mod->sml_bvalues[ cnt ] );
-
- if ( oc == NULL ) {
- send_ldap_result( conn, op,
- rc = LDAP_OBJECT_CLASS_VIOLATION,
- NULL, "undefined objectClass",
- NULL, NULL );
- goto done;
- }
-
- /* check for special objectClass */
- if ( oc == slap_schema.si_oc_alias ) {
- break;
- }
-
- if ( oc == slap_schema.si_oc_referral ) {
- break;
- }
-
- if ( oc == slap_schema.si_oc_extensibleObject ) {
- break;
- }
- }
-
- /*
- * if not special
- */
- if ( mod->sml_bvalues[ cnt ].bv_val == NULL ) {
-
- /*
- * Get attribute type(s) and attribute value(s) of our rdn,
- */
- if ( ldap_bv2rdn( &e->e_name, &rdn, (char **)&text,
- LDAP_DN_FORMAT_LDAP ) )
- {
- send_ldap_result( conn, op, rc = LDAP_INVALID_DN_SYNTAX,
- NULL, "unknown type(s) used in RDN",
- NULL, NULL );
- goto done;
- }
-
- /* Check for RDN attrs in entry */
- for ( cnt = 0; rdn[ 0 ][ cnt ]; cnt++ ) {
- AttributeDescription *desc = NULL;
- MatchingRule *mr;
- int i;
-
- rc = slap_bv2ad( &rdn[ 0 ][ cnt ]->la_attr,
- &desc, &text );
-
- if ( rc != LDAP_SUCCESS ) {
- send_ldap_result( conn, op, rc,
- NULL, text, NULL, NULL );
- goto done;
- }
-
- for (mod = modlist; mod; mod = mod->sml_next) {
- AttributeDescription *mod_desc = NULL;
-
- rc = slap_bv2ad( &mod->sml_type,
- &mod_desc, &text );
- if ( rc != LDAP_SUCCESS ) {
- send_ldap_result( conn, op, rc,
- NULL, text, NULL, NULL );
- goto done;
- }
-
- if (mod_desc == desc) {
- break;
- }
- }
-
- if (mod == NULL) {
-#define BAILOUT
-#ifdef BAILOUT
- /* bail out */
- send_ldap_result( conn, op,
- rc = LDAP_NO_SUCH_ATTRIBUTE,
- NULL,
- "attribute in RDN not listed in entry",
- NULL, NULL );
- goto done;
-
-#else /* ! BAILOUT */
- struct berval bv;
-
- /* add attribute type and value to modlist */
- mod = (Modifications *) ch_malloc( sizeof(Modifications) );
-
- mod->sml_op = LDAP_MOD_ADD;
- mod->sml_next = NULL;
- mod->sml_desc = NULL;
-
- ber_dupbv( &mod->sml_type,
- &rdn[ 0 ][ cnt ]->la_attr );
-
- mod->sml_bvalues = NULL;
- ber_dupbv( &bv, &rdn[ 0 ][ cnt ]->la_value );
- ber_bvarray_add( &mod->sml_bvalues, &bv );
-
- *modtail = mod;
- modtail = &mod->sml_next;
- continue;
-#endif /* ! BAILOUT */
- }
-
- mr = desc->ad_type->sat_equality;
- if (mr == NULL || !mr->smr_match ) {
- /* bail out */
- send_ldap_result( conn, op,
- rc = LDAP_INVALID_SYNTAX,
- NULL,
- "attribute in RDN lacks matching rule",
- NULL, NULL );
- goto done;
- }
-
- for (i = 0; mod->sml_bvalues[ i ].bv_val; i++) {
- int match = 0;
-
- rc = value_match(&match, desc, mr,
- SLAP_MR_VALUE_SYNTAX_MATCH,
- &mod->sml_bvalues[ i ],
- &rdn[ 0 ][ cnt ]->la_value, &text);
-
- if ( rc != LDAP_SUCCESS ) {
- send_ldap_result( conn, op, rc,
- NULL, text, NULL, NULL);
- goto done;
- }
-
- if (match == 0) {
- break;
- }
- }
-
- /* not found? */
- if (mod->sml_bvalues[ i ].bv_val == NULL) {
-#ifdef BAILOUT
- /* bailout */
- send_ldap_result( conn, op,
- rc = LDAP_NO_SUCH_ATTRIBUTE,
- NULL,
- "value in RDN not listed in entry",
- NULL, NULL );
- goto done;
-
-#else /* ! BAILOUT */
- struct berval bv;
-
- /* add attribute type and value to modlist */
- ber_dupbv( &bv, &rdn[ 0 ][ cnt ]->la_value );
- ber_bvarray_add( &mod->sml_bvalues, &bv );
- continue;
-#endif /* ! BAILOUT */
- }
- }
- }
-
manageDSAit = get_manageDSAit( op );
/*
#endif /* SLAPD_MULTIMASTER */
}
} else {
+#ifdef LDAP_SLAPI
rc = doPreAddPluginFNs( be, pb );
if ( rc != LDAP_SUCCESS ) {
/* plugin will have sent result */
goto done;
}
+#endif
#ifdef NEW_LOGGING
LDAP_LOG( OPERATION, INFO,
"do_add: conn %d no backend support\n", conn->c_connid, 0, 0 );
for( i=0; attr->a_vals[i].bv_val; i++ ) {
/* count them */
}
- for( j=0; mods->sml_bvalues[j].bv_val; j++ ) {
+ for( j=0; mods->sml_values[j].bv_val; j++ ) {
/* count them */
}
j++; /* NULL */
/* should check for duplicates */
- AC_MEMCPY( &attr->a_vals[i], mods->sml_bvalues,
+ AC_MEMCPY( &attr->a_vals[i], mods->sml_values,
sizeof( struct berval ) * j );
/* trim the mods array */
- ch_free( mods->sml_bvalues );
- mods->sml_bvalues = NULL;
+ ch_free( mods->sml_values );
+ mods->sml_values = NULL;
+
+#ifdef SLAP_NVALUES
+ if( attr->a_nvals ) {
+ attr->a_nvals = ch_realloc( attr->a_nvals,
+ sizeof( struct berval ) * (i+j) );
+
+ AC_MEMCPY( &attr->a_nvals[i], mods->sml_nvalues,
+ sizeof( struct berval ) * j );
+
+ /* trim the mods array */
+ ch_free( mods->sml_nvalues );
+ mods->sml_nvalues = NULL;
+ }
+#endif
continue;
#else
#endif
}
- if( mods->sml_bvalues[1].bv_val != NULL ) {
+ if( mods->sml_values[1].bv_val != NULL ) {
/* check for duplicates */
int i, j;
MatchingRule *mr = mods->sml_desc->ad_type->sat_equality;
/* move values to attr structure */
/* should check for duplicates */
- attr->a_vals = mods->sml_bvalues;
- mods->sml_bvalues = NULL;
+ attr->a_vals = mods->sml_values;
+ mods->sml_values = NULL;
+
+#ifdef SLAP_NVALUES
+ attr->a_nvals = mods->sml_nvalues;
+ mods->sml_nvalues = NULL;
+#endif
*tail = attr;
tail = &attr->a_next;