version 1.103.2.4, 2008/02/11 23:26:44
|
version 1.103.2.10, 2009/02/22 20:56:29
|
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.103.2.3 2007/09/29 09:55:21 hyc Exp $ */ |
/* $OpenLDAP: pkg/ldap/servers/slapd/schema_check.c,v 1.103.2.9 2009/02/05 19:35:54 quanah 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-2008 The OpenLDAP Foundation. |
* Copyright 1998-2009 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, |
|
Attribute **socp, |
const char** text, |
const char** text, |
char *textbuf, size_t textlen ) |
char *textbuf, size_t textlen ) |
{ |
{ |
Line 135 entry_schema_check(
|
Line 137 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 152 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 211 got_soc:
|
Line 213 got_soc:
|
rc = LDAP_OBJECT_CLASS_VIOLATION; |
rc = LDAP_OBJECT_CLASS_VIOLATION; |
goto done; |
goto done; |
|
|
} else if ( sc != slap_schema.si_oc_glue && sc != oc ) { |
} else if ( sc != oc ) { |
snprintf( textbuf, textlen, |
if ( !manage && sc != slap_schema.si_oc_glue ) { |
"structural object class modification " |
snprintf( textbuf, textlen, |
"from '%s' to '%s' not allowed", |
"structural object class modification " |
asc->a_vals[0].bv_val, oc->soc_cname.bv_val ); |
"from '%s' to '%s' not allowed", |
rc = LDAP_NO_OBJECT_CLASS_MODS; |
asc->a_vals[0].bv_val, oc->soc_cname.bv_val ); |
goto done; |
rc = LDAP_NO_OBJECT_CLASS_MODS; |
} else if ( sc == slap_schema.si_oc_glue ) { |
goto done; |
|
} |
|
|
|
assert( asc->a_vals != NULL ); |
|
assert( !BER_BVISNULL( &asc->a_vals[0] ) ); |
|
assert( BER_BVISNULL( &asc->a_vals[1] ) ); |
|
assert( asc->a_nvals == asc->a_vals ); |
|
|
|
/* draft-zeilenga-ldap-relax: automatically modify |
|
* structuralObjectClass if changed with relax */ |
sc = oc; |
sc = oc; |
|
ber_bvreplace( &asc->a_vals[ 0 ], &sc->soc_cname ); |
|
if ( socp ) { |
|
*socp = asc; |
|
} |
} |
} |
|
|
/* 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 done; |
goto done; |
} |
} |
Line 355 got_soc:
|
Line 370 got_soc:
|
} |
} |
} |
} |
|
|
if( xc == NULL ) { |
if( xc != NULL ) { |
snprintf( textbuf, textlen, "instanstantiation of " |
snprintf( textbuf, textlen, "instantiation of " |
"abstract objectClass '%s' not allowed", |
"abstract objectClass '%s' not allowed", |
aoc->a_vals[i].bv_val ); |
aoc->a_vals[i].bv_val ); |
|
|
Line 762 static int
|
Line 777 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 792 entry_naming_check(
|
Line 808 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 852 entry_naming_check(
|
Line 869 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 = attr_valfind( attr, SLAP_MR_VALUE_OF_ASSERTION_SYNTAX| |
} else { |
SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH, |
rc = LDAP_NAMING_VIOLATION; |
&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 ); |
|
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: |
|
if ( add_naming ) { |
|
if ( is_at_single_value( desc->ad_type ) ) { |
|
snprintf( textbuf, textlen, |
|
"value of single-valued naming attribute '%s' conflicts with value present in entry", |
|
ava->la_attr.bv_val ); |
|
|
|
} else { |
|
add = 1; |
|
rc = LDAP_SUCCESS; |
|
} |
|
|
|
} else { |
|
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 ); |
|
} |
|
|
|
if ( !add ) { |
|
rc = LDAP_NAMING_VIOLATION; |
|
} |
|
} |
|
} |
|
|
|
if ( add ) { |
|
attr_merge_normalize_one( e, desc, &ava->la_value, NULL ); |
|
|
|
} else if ( rc != LDAP_SUCCESS ) { |
break; |
break; |
} |
} |
} |
} |