X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fadd.c;h=441ac206847793868677295be81c8e7200f540b6;hb=00ac49a1fd4edff795faf81ed890774ca0bdbf58;hp=cfff625602d4a1bae1e6c9ced059ffcb7eb45807;hpb=73276e84ae32e9e148197971d1d6729739980353;p=openldap diff --git a/servers/slapd/add.c b/servers/slapd/add.c index cfff625602..441ac20684 100644 --- a/servers/slapd/add.c +++ b/servers/slapd/add.c @@ -1,3 +1,7 @@ +/* + * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved. + * COPYING RESTRICTIONS APPLY, see COPYRIGHT file + */ /* * Copyright (c) 1995 Regents of the University of Michigan. * All rights reserved. @@ -20,13 +24,13 @@ #include "slap.h" -static void add_created_attrs(Operation *op, Entry *e); +static int add_created_attrs(Operation *op, Entry *e); int do_add( Connection *conn, Operation *op ) { BerElement *ber = op->o_ber; - char *dn, *last; + char *dn, *ndn, *last; ber_len_t len; ber_tag_t tag; Entry *e; @@ -62,10 +66,21 @@ do_add( Connection *conn, Operation *op ) return -1; } + ndn = ch_strdup( dn ); + + if ( dn_normalize_case( ndn ) == NULL ) { + Debug( LDAP_DEBUG_ANY, "do_add: invalid dn (%s)\n", dn, 0, 0 ); + send_ldap_result( conn, op, LDAP_INVALID_DN_SYNTAX, NULL, + "invalid DN", NULL, NULL ); + free( dn ); + free( ndn ); + return LDAP_INVALID_DN_SYNTAX; + } + e = (Entry *) ch_calloc( 1, sizeof(Entry) ); e->e_dn = dn; - e->e_ndn = dn_normalize_case( ch_strdup( dn ) ); + e->e_ndn = ndn; e->e_private = NULL; dn = NULL; @@ -116,8 +131,8 @@ do_add( Connection *conn, Operation *op ) return rc; } - Statslog( LDAP_DEBUG_STATS, "conn=%d op=%d ADD dn=\"%s\"\n", - conn->c_connid, op->o_opid, e->e_ndn, 0, 0 ); + Statslog( LDAP_DEBUG_STATS, "conn=%ld op=%d ADD dn=\"%s\"\n", + op->o_connid, op->o_opid, e->e_ndn, 0, 0 ); /* * We could be serving multiple database backends. Select the @@ -140,23 +155,48 @@ do_add( Connection *conn, Operation *op ) */ if ( be->be_add ) { /* do the update here */ +#ifdef SLAPD_MULTIMASTER + if ( (be->be_lastmod == ON || (be->be_lastmod == UNDEFINED && + global_lastmod == ON)) && (be->be_update_ndn == NULL || + strcmp( be->be_update_ndn, op->o_ndn )) ) +#else if ( be->be_update_ndn == NULL || strcmp( be->be_update_ndn, op->o_ndn ) == 0 ) +#endif { +#ifndef SLAPD_MULTIMASTER if ( (be->be_lastmod == ON || (be->be_lastmod == UNDEFINED && - global_lastmod == ON)) && be->be_update_ndn == NULL ) { - - add_created_attrs( op, e ); + global_lastmod == ON)) && be->be_update_ndn == NULL ) +#endif + { + rc = add_created_attrs( op, e ); + + if( rc != LDAP_SUCCESS ) { + entry_free( e ); + send_ldap_result( conn, op, rc, + NULL, "no-user-modification attribute type", + NULL, NULL ); + return rc; + } } + if ( (*be->be_add)( be, conn, op, e ) == 0 ) { - replog( be, LDAP_REQ_ADD, e->e_dn, e, 0 ); +#ifdef SLAPD_MULTIMASTER + if (be->be_update_ndn == NULL || + strcmp( be->be_update_ndn, op->o_ndn )) +#endif + { + replog( be, op, e->e_dn, e ); + } be_entry_release_w( be, e ); } +#ifndef SLAPD_MULTIMASTER } else { entry_free( e ); send_ldap_result( conn, op, rc = LDAP_REFERRAL, NULL, NULL, be->be_update_refs ? be->be_update_refs : default_referral, NULL ); +#endif } } else { Debug( LDAP_DEBUG_ARGS, " do_add: HHH\n", 0, 0, 0 ); @@ -168,14 +208,13 @@ do_add( Connection *conn, Operation *op ) return rc; } -static void +static int add_created_attrs( Operation *op, Entry *e ) { char buf[22]; struct berval bv; struct berval *bvals[2]; - Attribute **a, **next; - Attribute *tmp; + Attribute *a; struct tm *ltm; time_t currenttime; @@ -184,15 +223,10 @@ add_created_attrs( Operation *op, Entry *e ) bvals[0] = &bv; bvals[1] = NULL; - /* remove any attempts by the user to add these attrs */ - for ( a = &e->e_attrs; *a != NULL; a = next ) { - if ( oc_check_no_usermod_attr( (*a)->a_type ) ) { - tmp = *a; - *a = (*a)->a_next; - attr_free( tmp ); - next = a; - } else { - next = &(*a)->a_next; + /* return error on any attempts by the user to add these attrs */ + for ( a = e->e_attrs; a != NULL; a = a->a_next ) { + if ( oc_check_no_usermod_attr( a->a_type ) ) { + return LDAP_CONSTRAINT_VIOLATION; } } @@ -219,4 +253,6 @@ add_created_attrs( Operation *op, Entry *e ) bv.bv_val = buf; bv.bv_len = strlen( bv.bv_val ); attr_merge( e, "createtimestamp", bvals ); + + return LDAP_SUCCESS; }