X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fschema_check.c;h=bf6b75a8ca21f9382b4818df1bcbe3bb840a2035;hb=f96e6378d6cd06c744a47af5e5e551cbb494826a;hp=0da634d81246dd7093d3a421630c2f87efd27117;hpb=761f2879435deec0dc8369de98381557de416b89;p=openldap diff --git a/servers/slapd/schema_check.c b/servers/slapd/schema_check.c index 0da634d812..bf6b75a8ca 100644 --- a/servers/slapd/schema_check.c +++ b/servers/slapd/schema_check.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2004 The OpenLDAP Foundation. + * Copyright 1998-2006 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,6 +31,7 @@ static char * oc_check_required( static int entry_naming_check( Entry *e, + int manage, const char** text, char *textbuf, size_t textlen ); /* @@ -42,9 +43,10 @@ static int entry_naming_check( int entry_schema_check( - Backend *be, + Operation *op, Entry *e, Attribute *oldattrs, + int manage, const char** text, char *textbuf, size_t textlen ) { @@ -62,7 +64,11 @@ entry_schema_check( int subentry = is_entry_subentry( e ); int collectiveSubentry = 0; - if ( SLAP_NO_SCHEMA_CHECK( be )) { + if ( SLAP_NO_SCHEMA_CHECK( op->o_bd )) { + return LDAP_SUCCESS; + } + + if ( get_no_schema_check( op ) ) { return LDAP_SUCCESS; } @@ -77,12 +83,12 @@ entry_schema_check( const char *type = a->a_desc->ad_cname.bv_val; /* there should be at least one value */ - assert( a->a_vals ); + assert( a->a_vals != NULL ); assert( a->a_vals[0].bv_val != NULL ); if( a->a_desc->ad_type->sat_check ) { int rc = (a->a_desc->ad_type->sat_check)( - be, e, a, text, textbuf, textlen ); + op->o_bd, e, a, text, textbuf, textlen ); if( rc != LDAP_SUCCESS ) { return rc; } @@ -111,9 +117,6 @@ entry_schema_check( } } - /* it's a REALLY bad idea to disable schema checks */ - if( !global_schemacheck ) return LDAP_SUCCESS; - /* find the structural object class attribute */ asc = attr_find( e->e_attrs, ad_structuralObjectClass ); if ( asc == NULL ) { @@ -154,7 +157,7 @@ entry_schema_check( return LDAP_OTHER; } - if( sc->soc_obsolete ) { + if( !manage && sc->soc_obsolete ) { snprintf( textbuf, textlen, "structuralObjectClass '%s' is OBSOLETE", asc->a_vals[0].bv_val ); @@ -204,7 +207,7 @@ entry_schema_check( /* naming check */ if ( !is_entry_objectclass ( e, slap_schema.si_oc_glue, 0 ) ) { - rc = entry_naming_check( e, text, textbuf, textlen ); + rc = entry_naming_check( e, manage, text, textbuf, textlen ); if( rc != LDAP_SUCCESS ) { return rc; } @@ -220,7 +223,7 @@ entry_schema_check( /* check that the entry has required attrs of the content rule */ if( cr ) { - if( cr->scr_obsolete ) { + if( !manage && cr->scr_obsolete ) { snprintf( textbuf, textlen, "content rule '%s' is obsolete", ldap_contentrule2name( &cr->scr_crule )); @@ -295,7 +298,7 @@ entry_schema_check( return LDAP_OBJECT_CLASS_VIOLATION; } - if ( oc->soc_obsolete ) { + if ( !manage && oc->soc_obsolete ) { /* disallow obsolete classes */ snprintf( textbuf, textlen, "objectClass '%s' is OBSOLETE", @@ -309,7 +312,7 @@ entry_schema_check( } if ( oc->soc_check ) { - int rc = (oc->soc_check)( be, e, oc, + int rc = (oc->soc_check)( op->o_bd, e, oc, text, textbuf, textlen ); if( rc != LDAP_SUCCESS ) { return rc; @@ -424,6 +427,7 @@ entry_schema_check( } if( extensible ) { + *text = NULL; return LDAP_SUCCESS; } @@ -471,6 +475,7 @@ entry_schema_check( } } + *text = NULL; return LDAP_SUCCESS; } @@ -684,6 +689,8 @@ int structural_class( return LDAP_OBJECT_CLASS_VIOLATION; } + *text = NULL; + return LDAP_SUCCESS; } @@ -726,6 +733,7 @@ int mods_structural_class( static int entry_naming_check( Entry *e, + int manage, const char** text, char *textbuf, size_t textlen ) { @@ -735,6 +743,10 @@ entry_naming_check( ber_len_t cnt; int rc = LDAP_SUCCESS; + if ( BER_BVISEMPTY( &e->e_name )) { + return LDAP_SUCCESS; + } + /* * Get attribute type(s) and attribute value(s) of our RDN */ @@ -782,7 +794,7 @@ entry_naming_check( break; } - if( desc->ad_type->sat_obsolete ) { + if( !manage && desc->ad_type->sat_obsolete ) { snprintf( textbuf, textlen, "naming attribute '%s' is obsolete", ava->la_attr.bv_val );