X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fattr.c;h=8e3112200bf99c96797bc4776f39c2869615172d;hb=04c5711506f17cc7403240c1f335527c6bccaa33;hp=fd6707063dcd044c6c4805697b4f72cb5ebd0983;hpb=a3f63029f4c645dace63dc1b5f6decd89e3c99d7;p=openldap diff --git a/servers/slapd/attr.c b/servers/slapd/attr.c index fd6707063d..8e3112200b 100644 --- a/servers/slapd/attr.c +++ b/servers/slapd/attr.c @@ -18,7 +18,7 @@ #include #endif -#include "ldapconfig.h" +#include "ldap_defaults.h" #include "slap.h" #ifdef LDAP_DEBUG @@ -40,15 +40,9 @@ attr_free( Attribute *a ) char * attr_normalize( char *s ) { - char *save; - assert( s != NULL ); - for ( save = s; *s; s++ ) { - *s = TOLOWER( (unsigned char) *s ); - } - - return( save ); + return( str2lower( s ) ); } /* @@ -227,18 +221,22 @@ attr_syntax_config( strcasecmp( argv[lasti], "cis" ) == 0 ) { at->at_syntax_oid = "1.3.6.1.4.1.1466.115.121.1.15"; at->at_equality_oid = "2.5.13.2"; + at->at_ordering_oid = "2.5.13.3"; + at->at_substr_oid = "2.5.13.4"; } else if ( strcasecmp( argv[lasti], "telephone" ) == 0 || strcasecmp( argv[lasti], "tel" ) == 0 ) { at->at_syntax_oid = "1.3.6.1.4.1.1466.115.121.1.50"; at->at_equality_oid = "2.5.13.20"; + at->at_substr_oid = "2.5.13.21"; } else if ( strcasecmp( argv[lasti], "dn" ) == 0 ) { at->at_syntax_oid = "1.3.6.1.4.1.1466.115.121.1.12"; at->at_equality_oid = "2.5.13.1"; } else if ( strcasecmp( argv[lasti], "caseexactstring" ) == 0 || strcasecmp( argv[lasti], "ces" ) == 0 ) { at->at_syntax_oid = "1.3.6.1.4.1.1466.115.121.1.15"; - /* notice: this is caseExactIA5Match */ - at->at_equality_oid = "1.3.6.1.4.1.1466.109.114.1"; + at->at_equality_oid = "2.5.13.5"; + at->at_ordering_oid = "2.5.13.6"; + at->at_substr_oid = "2.5.13.7"; } else if ( strcasecmp( argv[lasti], "binary" ) == 0 || strcasecmp( argv[lasti], "bin" ) == 0 ) { at->at_syntax_oid = "1.3.6.1.4.1.1466.115.121.1.5"; @@ -476,13 +474,18 @@ at_add( { AttributeType *sat; AttributeType *sat1; + MatchingRule *mr; + Syntax *syn; int code; char *errattr; if ( at->at_names && at->at_names[0] ) { errattr = at->at_names[0]; - } else { + } else if ( at->at_oid ) { errattr = at->at_oid; + } else { + errattr = ""; + return SLAP_SCHERR_ATTR_INCOMPLETE; } sat = (AttributeType *) ch_calloc( 1, sizeof(AttributeType) ); memcpy( &sat->sat_atype, at, sizeof(LDAP_ATTRIBUTE_TYPE)); @@ -500,11 +503,16 @@ at_add( } if ( at->at_syntax_oid ) { + if ( (syn = syn_find(sat->sat_syntax_oid)) ) { + sat->sat_syntax = syn; + } else { + *err = sat->sat_syntax_oid; + return SLAP_SCHERR_SYN_NOT_FOUND; + } if ( !strcmp(at->at_syntax_oid, "1.3.6.1.4.1.1466.115.121.1.15") ) { if ( at->at_equality_oid && - !strcmp(at->at_equality_oid, - "1.3.6.1.4.1.1466.109.114.1") ) { + !strcmp(at->at_equality_oid, "2.5.13.5") ) { sat->sat_syntax_compat = SYNTAX_CES; } else { sat->sat_syntax_compat = SYNTAX_CIS; @@ -524,13 +532,58 @@ at_add( sat->sat_syntax_compat = DEFAULT_SYNTAX; } + if ( sat->sat_equality_oid ) { + if ( (mr = mr_find(sat->sat_equality_oid)) ) { + sat->sat_equality = mr; + } else { + *err = sat->sat_equality_oid; + return SLAP_SCHERR_MR_NOT_FOUND; + } + } + if ( sat->sat_ordering_oid ) { + if ( (mr = mr_find(sat->sat_ordering_oid)) ) { + sat->sat_ordering = mr; + } else { + *err = sat->sat_ordering_oid; + return SLAP_SCHERR_MR_NOT_FOUND; + } + } + if ( sat->sat_substr_oid ) { + if ( (mr = mr_find(sat->sat_substr_oid)) ) { + sat->sat_substr = mr; + } else { + *err = sat->sat_substr_oid; + return SLAP_SCHERR_MR_NOT_FOUND; + } + } + + /* + * Now inherit definitions from superiors. We only check the + * direct superior since that one has already inherited from + * its own superiorss + */ + if ( sat->sat_sup ) { + if ( !sat->sat_syntax ) { + sat->sat_syntax = sat->sat_sup->sat_syntax; + sat->sat_syntax_len = sat->sat_sup->sat_syntax_len; + } + if ( !sat->sat_equality ) { + sat->sat_equality = sat->sat_sup->sat_equality; + } + if ( !sat->sat_ordering ) { + sat->sat_ordering = sat->sat_sup->sat_ordering; + } + if ( !sat->sat_substr ) { + sat->sat_substr = sat->sat_sup->sat_substr; + } + } code = at_insert(sat,err); return code; } char * -at_official_name( char * a_type ) +at_canonical_name( char * a_type ) { AttributeType *atp; @@ -554,7 +607,7 @@ at_official_name( char * a_type ) } -}/* char * at_official_name() */ +}/* char * at_canonica_name() */ #if defined( SLAPD_SCHEMA_DN )