version 1.103.2.1, 2007/02/13 20:22:21
|
version 1.103.2.5, 2008/04/14 20:23:04
|
Line 1
|
Line 1
|
/* schema_check.c - routines to enforce schema definitions */ |
/* schema_check.c - routines to enforce schema definitions */ |
/* $OpenLDAP: pkg/ldap/servers/slapd/schema_check.c,v 1.107 2007/02/11 13:37:21 hyc Exp $ */ |
/* $OpenLDAP: pkg/ldap/servers/slapd/schema_check.c,v 1.103.2.4 2008/02/11 23:26:44 kurt Exp $ */ |
/* This work is part of OpenLDAP Software <http://www.openldap.org/>. |
/* This work is part of OpenLDAP Software <http://www.openldap.org/>. |
* |
* |
* Copyright 1998-2007 The OpenLDAP Foundation. |
* Copyright 1998-2008 The OpenLDAP Foundation. |
* All rights reserved. |
* All rights reserved. |
* |
* |
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
Line 32 static char * oc_check_required(
|
Line 32 static char * oc_check_required(
|
static int entry_naming_check( |
static int entry_naming_check( |
Entry *e, |
Entry *e, |
int manage, |
int manage, |
|
int add_naming, |
const char** text, |
const char** text, |
char *textbuf, size_t textlen ); |
char *textbuf, size_t textlen ); |
/* |
/* |
Line 47 entry_schema_check(
|
Line 48 entry_schema_check(
|
Entry *e, |
Entry *e, |
Attribute *oldattrs, |
Attribute *oldattrs, |
int manage, |
int manage, |
int add_soc, |
int add, |
const char** text, |
const char** text, |
char *textbuf, size_t textlen ) |
char *textbuf, size_t textlen ) |
{ |
{ |
Line 135 entry_schema_check(
|
Line 136 entry_schema_check(
|
assert( aoc->a_vals[0].bv_val != NULL ); |
assert( aoc->a_vals[0].bv_val != NULL ); |
|
|
/* check the structural object class attribute */ |
/* check the structural object class attribute */ |
if ( asc == NULL && !add_soc ) { |
if ( asc == NULL && !add ) { |
Debug( LDAP_DEBUG_ANY, |
Debug( LDAP_DEBUG_ANY, |
"No structuralObjectClass for entry (%s)\n", |
"No structuralObjectClass for entry (%s)\n", |
e->e_dn, 0, 0 ); |
e->e_dn, 0, 0 ); |
Line 150 entry_schema_check(
|
Line 151 entry_schema_check(
|
return rc; |
return rc; |
} |
} |
|
|
if ( asc == NULL && add_soc ) { |
if ( asc == NULL && add ) { |
attr_merge_one( e, ad_structuralObjectClass, &oc->soc_cname, NULL ); |
attr_merge_one( e, ad_structuralObjectClass, &oc->soc_cname, NULL ); |
asc = attr_find( e->e_attrs, ad_structuralObjectClass ); |
asc = attr_find( e->e_attrs, ad_structuralObjectClass ); |
sc = oc; |
sc = oc; |
Line 172 entry_schema_check(
|
Line 173 entry_schema_check(
|
e->e_dn, textbuf, 0 ); |
e->e_dn, textbuf, 0 ); |
|
|
rc = LDAP_OBJECT_CLASS_VIOLATION; |
rc = LDAP_OBJECT_CLASS_VIOLATION; |
goto leave; |
goto done; |
} |
} |
|
|
if( sc->soc_kind != LDAP_SCHEMA_STRUCTURAL ) { |
if( sc->soc_kind != LDAP_SCHEMA_STRUCTURAL ) { |
Line 185 entry_schema_check(
|
Line 186 entry_schema_check(
|
e->e_dn, textbuf, 0 ); |
e->e_dn, textbuf, 0 ); |
|
|
rc = LDAP_OTHER; |
rc = LDAP_OTHER; |
goto leave; |
goto done; |
} |
} |
|
|
got_soc: |
got_soc: |
Line 199 got_soc:
|
Line 200 got_soc:
|
e->e_dn, textbuf, 0 ); |
e->e_dn, textbuf, 0 ); |
|
|
rc = LDAP_OBJECT_CLASS_VIOLATION; |
rc = LDAP_OBJECT_CLASS_VIOLATION; |
goto leave; |
goto done; |
} |
} |
|
|
*text = textbuf; |
*text = textbuf; |
Line 209 got_soc:
|
Line 210 got_soc:
|
"unrecognized objectClass '%s'", |
"unrecognized objectClass '%s'", |
aoc->a_vals[0].bv_val ); |
aoc->a_vals[0].bv_val ); |
rc = LDAP_OBJECT_CLASS_VIOLATION; |
rc = LDAP_OBJECT_CLASS_VIOLATION; |
goto leave; |
goto done; |
|
|
} else if ( sc != slap_schema.si_oc_glue && sc != oc ) { |
} else if ( sc != slap_schema.si_oc_glue && sc != oc ) { |
snprintf( textbuf, textlen, |
snprintf( textbuf, textlen, |
Line 217 got_soc:
|
Line 218 got_soc:
|
"from '%s' to '%s' not allowed", |
"from '%s' to '%s' not allowed", |
asc->a_vals[0].bv_val, oc->soc_cname.bv_val ); |
asc->a_vals[0].bv_val, oc->soc_cname.bv_val ); |
rc = LDAP_NO_OBJECT_CLASS_MODS; |
rc = LDAP_NO_OBJECT_CLASS_MODS; |
goto leave; |
goto done; |
} else if ( sc == slap_schema.si_oc_glue ) { |
} else if ( sc == slap_schema.si_oc_glue ) { |
sc = oc; |
sc = oc; |
} |
} |
|
|
/* naming check */ |
/* naming check */ |
if ( !is_entry_glue ( e ) ) { |
if ( !is_entry_glue ( e ) ) { |
rc = entry_naming_check( e, manage, text, textbuf, textlen ); |
rc = entry_naming_check( e, manage, add, text, textbuf, textlen ); |
if( rc != LDAP_SUCCESS ) { |
if( rc != LDAP_SUCCESS ) { |
goto leave; |
goto done; |
} |
} |
} else { |
} else { |
/* Glue Entry */ |
/* Glue Entry */ |
Line 250 got_soc:
|
Line 251 got_soc:
|
e->e_dn, textbuf, 0 ); |
e->e_dn, textbuf, 0 ); |
|
|
rc = LDAP_OBJECT_CLASS_VIOLATION; |
rc = LDAP_OBJECT_CLASS_VIOLATION; |
goto leave; |
goto done; |
} |
} |
|
|
if( cr->scr_required ) for( i=0; cr->scr_required[i]; i++ ) { |
if( cr->scr_required ) for( i=0; cr->scr_required[i]; i++ ) { |
Line 274 got_soc:
|
Line 275 got_soc:
|
e->e_dn, textbuf, 0 ); |
e->e_dn, textbuf, 0 ); |
|
|
rc = LDAP_OBJECT_CLASS_VIOLATION; |
rc = LDAP_OBJECT_CLASS_VIOLATION; |
goto leave; |
goto done; |
} |
} |
} |
} |
|
|
Line 299 got_soc:
|
Line 300 got_soc:
|
e->e_dn, textbuf, 0 ); |
e->e_dn, textbuf, 0 ); |
|
|
rc = LDAP_OBJECT_CLASS_VIOLATION; |
rc = LDAP_OBJECT_CLASS_VIOLATION; |
goto leave; |
goto done; |
} |
} |
} |
} |
} |
} |
Line 318 got_soc:
|
Line 319 got_soc:
|
e->e_dn, textbuf, 0 ); |
e->e_dn, textbuf, 0 ); |
|
|
rc = LDAP_OBJECT_CLASS_VIOLATION; |
rc = LDAP_OBJECT_CLASS_VIOLATION; |
goto leave; |
goto done; |
} |
} |
|
|
if ( oc->soc_check ) { |
if ( oc->soc_check ) { |
rc = (oc->soc_check)( op->o_bd, e, oc, |
rc = (oc->soc_check)( op->o_bd, e, oc, |
text, textbuf, textlen ); |
text, textbuf, textlen ); |
if( rc != LDAP_SUCCESS ) { |
if( rc != LDAP_SUCCESS ) { |
goto leave; |
goto done; |
} |
} |
} |
} |
|
|
Line 365 got_soc:
|
Line 366 got_soc:
|
e->e_dn, textbuf, 0 ); |
e->e_dn, textbuf, 0 ); |
|
|
rc = LDAP_OBJECT_CLASS_VIOLATION; |
rc = LDAP_OBJECT_CLASS_VIOLATION; |
goto leave; |
goto done; |
} |
} |
} |
} |
|
|
Line 408 got_soc:
|
Line 409 got_soc:
|
e->e_dn, textbuf, 0 ); |
e->e_dn, textbuf, 0 ); |
|
|
rc = LDAP_OBJECT_CLASS_VIOLATION; |
rc = LDAP_OBJECT_CLASS_VIOLATION; |
goto leave; |
goto done; |
} |
} |
} |
} |
|
|
Line 423 got_soc:
|
Line 424 got_soc:
|
e->e_dn, textbuf, 0 ); |
e->e_dn, textbuf, 0 ); |
|
|
rc = LDAP_OBJECT_CLASS_VIOLATION; |
rc = LDAP_OBJECT_CLASS_VIOLATION; |
goto leave; |
goto done; |
} |
} |
|
|
if( oc == slap_schema.si_oc_extensibleObject ) { |
if( oc == slap_schema.si_oc_extensibleObject ) { |
Line 435 got_soc:
|
Line 436 got_soc:
|
if( extensible ) { |
if( extensible ) { |
*text = NULL; |
*text = NULL; |
rc = LDAP_SUCCESS; |
rc = LDAP_SUCCESS; |
goto leave; |
goto done; |
} |
} |
|
|
/* check that each attr in the entry is allowed by some oc */ |
/* check that each attr in the entry is allowed by some oc */ |
Line 476 got_soc:
|
Line 477 got_soc:
|
"Entry (%s), %s\n", |
"Entry (%s), %s\n", |
e->e_dn, textbuf, 0 ); |
e->e_dn, textbuf, 0 ); |
|
|
goto leave; |
goto done; |
} |
} |
} |
} |
|
|
*text = NULL; |
*text = NULL; |
leave: |
done: |
slap_sl_free( socs, op->o_tmpmemctx ); |
slap_sl_free( socs, op->o_tmpmemctx ); |
return rc; |
return rc; |
} |
} |
Line 572 int oc_check_allowed(
|
Line 573 int oc_check_allowed(
|
for ( i = 0; socs[i]; i++ ) { |
for ( i = 0; socs[i]; i++ ) { |
/* if we know about the oc */ |
/* if we know about the oc */ |
ObjectClass *oc = socs[i]; |
ObjectClass *oc = socs[i]; |
|
/* extensibleObject allows all */ |
|
if ( oc == slap_schema.si_oc_extensibleObject ) { |
|
return LDAP_SUCCESS; |
|
} |
if ( oc != NULL && oc->soc_kind != LDAP_SCHEMA_ABSTRACT && |
if ( oc != NULL && oc->soc_kind != LDAP_SCHEMA_ABSTRACT && |
( sc == NULL || oc->soc_kind == LDAP_SCHEMA_AUXILIARY )) |
( sc == NULL || oc->soc_kind == LDAP_SCHEMA_AUXILIARY )) |
{ |
{ |
Line 758 static int
|
Line 763 static int
|
entry_naming_check( |
entry_naming_check( |
Entry *e, |
Entry *e, |
int manage, |
int manage, |
|
int add_naming, |
const char** text, |
const char** text, |
char *textbuf, size_t textlen ) |
char *textbuf, size_t textlen ) |
{ |
{ |
Line 788 entry_naming_check(
|
Line 794 entry_naming_check(
|
AttributeDescription *desc = NULL; |
AttributeDescription *desc = NULL; |
Attribute *attr; |
Attribute *attr; |
const char *errtext; |
const char *errtext; |
|
int add = 0; |
|
|
if( ava->la_flags & LDAP_AVA_BINARY ) { |
if( ava->la_flags & LDAP_AVA_BINARY ) { |
snprintf( textbuf, textlen, |
snprintf( textbuf, textlen, |
Line 848 entry_naming_check(
|
Line 855 entry_naming_check(
|
snprintf( textbuf, textlen, |
snprintf( textbuf, textlen, |
"naming attribute '%s' is not present in entry", |
"naming attribute '%s' is not present in entry", |
ava->la_attr.bv_val ); |
ava->la_attr.bv_val ); |
rc = LDAP_NAMING_VIOLATION; |
if ( add_naming ) { |
break; |
add = 1; |
} |
|
|
|
rc = value_find_ex( desc, SLAP_MR_VALUE_OF_ASSERTION_SYNTAX| |
} else { |
SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH, |
rc = LDAP_NAMING_VIOLATION; |
attr->a_nvals, &ava->la_value, NULL ); |
|
|
|
if( rc != 0 ) { |
|
switch( rc ) { |
|
case LDAP_INAPPROPRIATE_MATCHING: |
|
snprintf( textbuf, textlen, |
|
"inappropriate matching for naming attribute '%s'", |
|
ava->la_attr.bv_val ); |
|
break; |
|
case LDAP_INVALID_SYNTAX: |
|
snprintf( textbuf, textlen, |
|
"value of naming attribute '%s' is invalid", |
|
ava->la_attr.bv_val ); |
|
break; |
|
case LDAP_NO_SUCH_ATTRIBUTE: |
|
snprintf( textbuf, textlen, |
|
"value of naming attribute '%s' is not present in entry", |
|
ava->la_attr.bv_val ); |
|
break; |
|
default: |
|
snprintf( textbuf, textlen, |
|
"naming attribute '%s' is inappropriate", |
|
ava->la_attr.bv_val ); |
|
} |
} |
rc = LDAP_NAMING_VIOLATION; |
|
|
} else { |
|
rc = attr_valfind( attr, SLAP_MR_VALUE_OF_ASSERTION_SYNTAX| |
|
SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH, |
|
&ava->la_value, NULL, NULL ); |
|
|
|
if( rc != 0 ) { |
|
switch( rc ) { |
|
case LDAP_INAPPROPRIATE_MATCHING: |
|
snprintf( textbuf, textlen, |
|
"inappropriate matching for naming attribute '%s'", |
|
ava->la_attr.bv_val ); |
|
break; |
|
case LDAP_INVALID_SYNTAX: |
|
snprintf( textbuf, textlen, |
|
"value of naming attribute '%s' is invalid", |
|
ava->la_attr.bv_val ); |
|
break; |
|
case LDAP_NO_SUCH_ATTRIBUTE: |
|
snprintf( textbuf, textlen, |
|
"value of naming attribute '%s' is not present in entry", |
|
ava->la_attr.bv_val ); |
|
if ( add_naming ) { |
|
add = 1; |
|
} |
|
break; |
|
default: |
|
snprintf( textbuf, textlen, |
|
"naming attribute '%s' is inappropriate", |
|
ava->la_attr.bv_val ); |
|
} |
|
rc = LDAP_NAMING_VIOLATION; |
|
} |
|
} |
|
|
|
if ( add ) { |
|
attr_merge_normalize_one( e, desc, &ava->la_value, NULL ); |
|
|
|
} else if ( rc != LDAP_SUCCESS ) { |
break; |
break; |
} |
} |
} |
} |