Home | History | Annotate | Line # | Download | only in slapd
      1  1.3  christos /*	$NetBSD: schema_prep.c,v 1.4 2025/09/05 21:16:25 christos Exp $	*/
      2  1.2  christos 
      3  1.1     lukem /* schema_prep.c - load builtin schema */
      4  1.2  christos /* $OpenLDAP$ */
      5  1.1     lukem /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
      6  1.1     lukem  *
      7  1.4  christos  * Copyright 1998-2024 The OpenLDAP Foundation.
      8  1.1     lukem  * All rights reserved.
      9  1.1     lukem  *
     10  1.1     lukem  * Redistribution and use in source and binary forms, with or without
     11  1.1     lukem  * modification, are permitted only as authorized by the OpenLDAP
     12  1.1     lukem  * Public License.
     13  1.1     lukem  *
     14  1.1     lukem  * A copy of this license is available in the file LICENSE in the
     15  1.1     lukem  * top-level directory of the distribution or, alternatively, at
     16  1.1     lukem  * <http://www.OpenLDAP.org/license.html>.
     17  1.1     lukem  */
     18  1.1     lukem 
     19  1.2  christos #include <sys/cdefs.h>
     20  1.3  christos __RCSID("$NetBSD: schema_prep.c,v 1.4 2025/09/05 21:16:25 christos Exp $");
     21  1.2  christos 
     22  1.1     lukem #include "portable.h"
     23  1.1     lukem 
     24  1.1     lukem #include <stdio.h>
     25  1.1     lukem 
     26  1.1     lukem #include <ac/ctype.h>
     27  1.1     lukem #include <ac/string.h>
     28  1.1     lukem #include <ac/socket.h>
     29  1.1     lukem 
     30  1.1     lukem #include "slap.h"
     31  1.1     lukem 
     32  1.1     lukem #define OCDEBUG 0
     33  1.1     lukem 
     34  1.1     lukem int schema_init_done = 0;
     35  1.1     lukem 
     36  1.1     lukem struct slap_internal_schema slap_schema;
     37  1.1     lukem 
     38  1.1     lukem static int
     39  1.1     lukem oidValidate(
     40  1.1     lukem 	Syntax *syntax,
     41  1.1     lukem 	struct berval *in )
     42  1.1     lukem {
     43  1.1     lukem 	struct berval val = *in;
     44  1.1     lukem 
     45  1.1     lukem 	if( val.bv_len == 0 ) {
     46  1.1     lukem 		/* disallow empty strings */
     47  1.1     lukem 		return LDAP_INVALID_SYNTAX;
     48  1.1     lukem 	}
     49  1.1     lukem 
     50  1.1     lukem 	if( DESC_LEADCHAR( val.bv_val[0] ) ) {
     51  1.1     lukem 		val.bv_val++;
     52  1.1     lukem 		val.bv_len--;
     53  1.1     lukem 		if ( val.bv_len == 0 ) return LDAP_SUCCESS;
     54  1.1     lukem 
     55  1.1     lukem 		while( DESC_CHAR( val.bv_val[0] ) ) {
     56  1.1     lukem 			val.bv_val++;
     57  1.1     lukem 			val.bv_len--;
     58  1.1     lukem 
     59  1.1     lukem 			if ( val.bv_len == 0 ) return LDAP_SUCCESS;
     60  1.1     lukem 		}
     61  1.1     lukem 
     62  1.1     lukem 	} else {
     63  1.1     lukem 		int sep = 0;
     64  1.1     lukem 		while( OID_LEADCHAR( val.bv_val[0] ) ) {
     65  1.1     lukem 			val.bv_val++;
     66  1.1     lukem 			val.bv_len--;
     67  1.1     lukem 
     68  1.1     lukem 			if ( val.bv_val[-1] != '0' ) {
     69  1.1     lukem 				while ( OID_LEADCHAR( val.bv_val[0] )) {
     70  1.1     lukem 					val.bv_val++;
     71  1.1     lukem 					val.bv_len--;
     72  1.1     lukem 				}
     73  1.1     lukem 			}
     74  1.1     lukem 
     75  1.1     lukem 			if( val.bv_len == 0 ) {
     76  1.1     lukem 				if( sep == 0 ) break;
     77  1.1     lukem 				return LDAP_SUCCESS;
     78  1.1     lukem 			}
     79  1.1     lukem 
     80  1.1     lukem 			if( !OID_SEPARATOR( val.bv_val[0] )) break;
     81  1.1     lukem 
     82  1.1     lukem 			sep++;
     83  1.1     lukem 			val.bv_val++;
     84  1.1     lukem 			val.bv_len--;
     85  1.1     lukem 		}
     86  1.1     lukem 	}
     87  1.1     lukem 
     88  1.1     lukem 	return LDAP_INVALID_SYNTAX;
     89  1.1     lukem }
     90  1.1     lukem 
     91  1.1     lukem 
     92  1.1     lukem static int objectClassPretty(
     93  1.1     lukem 	Syntax *syntax,
     94  1.1     lukem 	struct berval *in,
     95  1.1     lukem 	struct berval *out,
     96  1.1     lukem 	void *ctx )
     97  1.1     lukem {
     98  1.1     lukem 	ObjectClass *oc;
     99  1.1     lukem 
    100  1.1     lukem 	if( oidValidate( NULL, in )) return LDAP_INVALID_SYNTAX;
    101  1.1     lukem 
    102  1.1     lukem 	oc = oc_bvfind( in );
    103  1.1     lukem 	if( oc == NULL ) return LDAP_INVALID_SYNTAX;
    104  1.1     lukem 
    105  1.1     lukem 	ber_dupbv_x( out, &oc->soc_cname, ctx );
    106  1.1     lukem 	return LDAP_SUCCESS;
    107  1.1     lukem }
    108  1.1     lukem 
    109  1.1     lukem static int
    110  1.1     lukem attributeTypeMatch(
    111  1.1     lukem 	int *matchp,
    112  1.1     lukem 	slap_mask_t flags,
    113  1.1     lukem 	Syntax *syntax,
    114  1.1     lukem 	MatchingRule *mr,
    115  1.1     lukem 	struct berval *value,
    116  1.1     lukem 	void *assertedValue )
    117  1.1     lukem {
    118  1.1     lukem 	struct berval *a = (struct berval *) assertedValue;
    119  1.1     lukem 	AttributeType *at = at_bvfind( value );
    120  1.1     lukem 	AttributeType *asserted = at_bvfind( a );
    121  1.1     lukem 
    122  1.1     lukem 	if( asserted == NULL ) {
    123  1.1     lukem 		if( OID_LEADCHAR( *a->bv_val ) ) {
    124  1.1     lukem 			/* OID form, return FALSE */
    125  1.1     lukem 			*matchp = 1;
    126  1.1     lukem 			return LDAP_SUCCESS;
    127  1.1     lukem 		}
    128  1.1     lukem 
    129  1.1     lukem 		/* desc form, return undefined */
    130  1.1     lukem 		return LDAP_INVALID_SYNTAX;
    131  1.1     lukem 	}
    132  1.1     lukem 
    133  1.1     lukem 	if ( at == NULL ) {
    134  1.1     lukem 		/* unrecognized stored value */
    135  1.1     lukem 		return LDAP_INVALID_SYNTAX;
    136  1.1     lukem 	}
    137  1.1     lukem 
    138  1.1     lukem 	*matchp = ( asserted != at );
    139  1.1     lukem 	return LDAP_SUCCESS;
    140  1.1     lukem }
    141  1.1     lukem 
    142  1.1     lukem static int
    143  1.1     lukem matchingRuleMatch(
    144  1.1     lukem 	int *matchp,
    145  1.1     lukem 	slap_mask_t flags,
    146  1.1     lukem 	Syntax *syntax,
    147  1.1     lukem 	MatchingRule *mr,
    148  1.1     lukem 	struct berval *value,
    149  1.1     lukem 	void *assertedValue )
    150  1.1     lukem {
    151  1.1     lukem 	struct berval *a = (struct berval *) assertedValue;
    152  1.1     lukem 	MatchingRule *mrv = mr_bvfind( value );
    153  1.1     lukem 	MatchingRule *asserted = mr_bvfind( a );
    154  1.1     lukem 
    155  1.1     lukem 	if( asserted == NULL ) {
    156  1.1     lukem 		if( OID_LEADCHAR( *a->bv_val ) ) {
    157  1.1     lukem 			/* OID form, return FALSE */
    158  1.1     lukem 			*matchp = 1;
    159  1.1     lukem 			return LDAP_SUCCESS;
    160  1.1     lukem 		}
    161  1.1     lukem 
    162  1.1     lukem 		/* desc form, return undefined */
    163  1.1     lukem 		return LDAP_INVALID_SYNTAX;
    164  1.1     lukem 	}
    165  1.1     lukem 
    166  1.1     lukem 	if ( mrv == NULL ) {
    167  1.1     lukem 		/* unrecognized stored value */
    168  1.1     lukem 		return LDAP_INVALID_SYNTAX;
    169  1.1     lukem 	}
    170  1.1     lukem 
    171  1.1     lukem 	*matchp = ( asserted != mrv );
    172  1.1     lukem 	return LDAP_SUCCESS;
    173  1.1     lukem }
    174  1.1     lukem 
    175  1.1     lukem static int
    176  1.1     lukem objectClassMatch(
    177  1.1     lukem 	int *matchp,
    178  1.1     lukem 	slap_mask_t flags,
    179  1.1     lukem 	Syntax *syntax,
    180  1.1     lukem 	MatchingRule *mr,
    181  1.1     lukem 	struct berval *value,
    182  1.1     lukem 	void *assertedValue )
    183  1.1     lukem {
    184  1.1     lukem 	struct berval *a = (struct berval *) assertedValue;
    185  1.1     lukem 	ObjectClass *oc = oc_bvfind( value );
    186  1.1     lukem 	ObjectClass *asserted = oc_bvfind( a );
    187  1.1     lukem 
    188  1.1     lukem 	if( asserted == NULL ) {
    189  1.1     lukem 		if( OID_LEADCHAR( *a->bv_val ) ) {
    190  1.1     lukem 			/* OID form, return FALSE */
    191  1.1     lukem 			*matchp = 1;
    192  1.1     lukem 			return LDAP_SUCCESS;
    193  1.1     lukem 		}
    194  1.1     lukem 
    195  1.1     lukem 		/* desc form, return undefined */
    196  1.1     lukem 		return LDAP_INVALID_SYNTAX;
    197  1.1     lukem 	}
    198  1.1     lukem 
    199  1.1     lukem 	if ( oc == NULL ) {
    200  1.1     lukem 		/* unrecognized stored value */
    201  1.1     lukem 		return LDAP_INVALID_SYNTAX;
    202  1.1     lukem 	}
    203  1.1     lukem 
    204  1.1     lukem 	*matchp = ( asserted != oc );
    205  1.1     lukem 	return LDAP_SUCCESS;
    206  1.1     lukem }
    207  1.1     lukem 
    208  1.1     lukem static int
    209  1.1     lukem objectSubClassMatch(
    210  1.1     lukem 	int *matchp,
    211  1.1     lukem 	slap_mask_t flags,
    212  1.1     lukem 	Syntax *syntax,
    213  1.1     lukem 	MatchingRule *mr,
    214  1.1     lukem 	struct berval *value,
    215  1.1     lukem 	void *assertedValue )
    216  1.1     lukem {
    217  1.1     lukem 	struct berval *a = (struct berval *) assertedValue;
    218  1.1     lukem 	ObjectClass *oc = oc_bvfind( value );
    219  1.1     lukem 	ObjectClass *asserted = oc_bvfind( a );
    220  1.1     lukem 
    221  1.1     lukem 	if( asserted == NULL ) {
    222  1.1     lukem 		if( OID_LEADCHAR( *a->bv_val ) ) {
    223  1.1     lukem 			/* OID form, return FALSE */
    224  1.1     lukem 			*matchp = 1;
    225  1.1     lukem 			return LDAP_SUCCESS;
    226  1.1     lukem 		}
    227  1.1     lukem 
    228  1.1     lukem 		/* desc form, return undefined */
    229  1.1     lukem 		return LDAP_INVALID_SYNTAX;
    230  1.1     lukem 	}
    231  1.1     lukem 
    232  1.1     lukem 	if ( oc == NULL ) {
    233  1.1     lukem 		/* unrecognized stored value */
    234  1.1     lukem 		return LDAP_INVALID_SYNTAX;
    235  1.1     lukem 	}
    236  1.1     lukem 
    237  1.1     lukem 	if( SLAP_MR_IS_VALUE_OF_ATTRIBUTE_SYNTAX( flags ) ) {
    238  1.1     lukem 		*matchp = ( asserted != oc );
    239  1.1     lukem 	} else {
    240  1.1     lukem 		*matchp = !is_object_subclass( asserted, oc );
    241  1.1     lukem 	}
    242  1.1     lukem 
    243  1.1     lukem 	return LDAP_SUCCESS;
    244  1.1     lukem }
    245  1.1     lukem 
    246  1.1     lukem static int objectSubClassIndexer(
    247  1.1     lukem 	slap_mask_t use,
    248  1.1     lukem 	slap_mask_t mask,
    249  1.1     lukem 	Syntax *syntax,
    250  1.1     lukem 	MatchingRule *mr,
    251  1.1     lukem 	struct berval *prefix,
    252  1.1     lukem 	BerVarray values,
    253  1.1     lukem 	BerVarray *keysp,
    254  1.1     lukem 	void *ctx )
    255  1.1     lukem {
    256  1.1     lukem 	int rc, noc, i;
    257  1.1     lukem 	BerVarray ocvalues;
    258  1.1     lukem 	ObjectClass **socs;
    259  1.1     lukem 
    260  1.1     lukem 	for( noc=0; values[noc].bv_val != NULL; noc++ ) {
    261  1.1     lukem 		/* just count em */;
    262  1.1     lukem 	}
    263  1.1     lukem 
    264  1.1     lukem 	/* over allocate */
    265  1.1     lukem 	socs = slap_sl_malloc( (noc+16) * sizeof( ObjectClass * ), ctx );
    266  1.1     lukem 
    267  1.1     lukem 	/* initialize */
    268  1.1     lukem 	for( i=0; i<noc; i++ ) {
    269  1.1     lukem 		socs[i] = oc_bvfind( &values[i] );
    270  1.1     lukem 	}
    271  1.1     lukem 
    272  1.1     lukem 	/* expand values */
    273  1.1     lukem 	for( i=0; i<noc; i++ ) {
    274  1.1     lukem 		int j;
    275  1.1     lukem 		ObjectClass *oc = socs[i];
    276  1.1     lukem 		if( oc == NULL || oc->soc_sups == NULL ) continue;
    277  1.1     lukem 
    278  1.1     lukem 		for( j=0; oc->soc_sups[j] != NULL; j++ ) {
    279  1.1     lukem 			int found = 0;
    280  1.1     lukem 			ObjectClass *sup = oc->soc_sups[j];
    281  1.1     lukem 			int k;
    282  1.1     lukem 
    283  1.1     lukem 			for( k=0; k<noc; k++ ) {
    284  1.1     lukem 				if( sup == socs[k] ) {
    285  1.1     lukem 					found++;
    286  1.1     lukem 					break;
    287  1.1     lukem 				}
    288  1.1     lukem 			}
    289  1.1     lukem 
    290  1.1     lukem 			if( !found ) {
    291  1.1     lukem 				socs = slap_sl_realloc( socs,
    292  1.1     lukem 					sizeof( ObjectClass * ) * (noc+2), ctx );
    293  1.1     lukem 
    294  1.1     lukem 				assert( k == noc );
    295  1.1     lukem 				socs[noc++] = sup;
    296  1.1     lukem 			}
    297  1.1     lukem 		}
    298  1.1     lukem 	}
    299  1.1     lukem 
    300  1.1     lukem 	ocvalues = slap_sl_malloc( sizeof( struct berval ) * (noc+1), ctx );
    301  1.1     lukem 	/* copy values */
    302  1.1     lukem 	for( i=0; i<noc; i++ ) {
    303  1.1     lukem 		if ( socs[i] )
    304  1.1     lukem 			ocvalues[i] = socs[i]->soc_cname;
    305  1.1     lukem 		else
    306  1.1     lukem 			ocvalues[i] = values[i];
    307  1.1     lukem 	}
    308  1.1     lukem 	BER_BVZERO( &ocvalues[i] );
    309  1.1     lukem 
    310  1.1     lukem 	rc = octetStringIndexer( use, mask, syntax, mr,
    311  1.1     lukem 		prefix, ocvalues, keysp, ctx );
    312  1.1     lukem 
    313  1.1     lukem 	slap_sl_free( ocvalues, ctx );
    314  1.1     lukem 	slap_sl_free( socs, ctx );
    315  1.1     lukem 	return rc;
    316  1.1     lukem }
    317  1.1     lukem 
    318  1.1     lukem #define objectSubClassFilter octetStringFilter
    319  1.1     lukem 
    320  1.1     lukem static ObjectClassSchemaCheckFN rootDseObjectClass;
    321  1.1     lukem static ObjectClassSchemaCheckFN aliasObjectClass;
    322  1.1     lukem static ObjectClassSchemaCheckFN referralObjectClass;
    323  1.1     lukem static ObjectClassSchemaCheckFN subentryObjectClass;
    324  1.1     lukem #ifdef LDAP_DYNAMIC_OBJECTS
    325  1.1     lukem static ObjectClassSchemaCheckFN dynamicObjectClass;
    326  1.1     lukem #endif
    327  1.1     lukem 
    328  1.1     lukem static struct slap_schema_oc_map {
    329  1.1     lukem 	char *ssom_name;
    330  1.1     lukem 	char *ssom_defn;
    331  1.1     lukem 	ObjectClassSchemaCheckFN *ssom_check;
    332  1.1     lukem 	slap_mask_t ssom_flags;
    333  1.1     lukem 	size_t ssom_offset;
    334  1.1     lukem } oc_map[] = {
    335  1.1     lukem 	{ "top", "( 2.5.6.0 NAME 'top' "
    336  1.1     lukem 			"DESC 'top of the superclass chain' "
    337  1.1     lukem 			"ABSTRACT MUST objectClass )",
    338  1.1     lukem 		0, 0, offsetof(struct slap_internal_schema, si_oc_top) },
    339  1.1     lukem 	{ "extensibleObject", "( 1.3.6.1.4.1.1466.101.120.111 "
    340  1.1     lukem 			"NAME 'extensibleObject' "
    341  1.1     lukem 			"DESC 'RFC4512: extensible object' "
    342  1.1     lukem 			"SUP top AUXILIARY )",
    343  1.1     lukem 		0, SLAP_OC_OPERATIONAL,
    344  1.1     lukem 		offsetof(struct slap_internal_schema, si_oc_extensibleObject) },
    345  1.1     lukem 	{ "alias", "( 2.5.6.1 NAME 'alias' "
    346  1.1     lukem 			"DESC 'RFC4512: an alias' "
    347  1.1     lukem 			"SUP top STRUCTURAL "
    348  1.1     lukem 			"MUST aliasedObjectName )",
    349  1.1     lukem 		aliasObjectClass, SLAP_OC_ALIAS|SLAP_OC_OPERATIONAL,
    350  1.1     lukem 		offsetof(struct slap_internal_schema, si_oc_alias) },
    351  1.1     lukem 	{ "referral", "( 2.16.840.1.113730.3.2.6 NAME 'referral' "
    352  1.1     lukem 			"DESC 'namedref: named subordinate referral' "
    353  1.1     lukem 			"SUP top STRUCTURAL MUST ref )",
    354  1.1     lukem 		referralObjectClass, SLAP_OC_REFERRAL|SLAP_OC_OPERATIONAL,
    355  1.1     lukem 		offsetof(struct slap_internal_schema, si_oc_referral) },
    356  1.1     lukem 	{ "LDAProotDSE", "( 1.3.6.1.4.1.4203.1.4.1 "
    357  1.1     lukem 			"NAME ( 'OpenLDAProotDSE' 'LDAProotDSE' ) "
    358  1.1     lukem 			"DESC 'OpenLDAP Root DSE object' "
    359  1.1     lukem 			"SUP top STRUCTURAL MAY cn )",
    360  1.1     lukem 		rootDseObjectClass, SLAP_OC_OPERATIONAL,
    361  1.1     lukem 		offsetof(struct slap_internal_schema, si_oc_rootdse) },
    362  1.1     lukem 	{ "subentry", "( 2.5.17.0 NAME 'subentry' "
    363  1.1     lukem 			"DESC 'RFC3672: subentry' "
    364  1.1     lukem 			"SUP top STRUCTURAL "
    365  1.1     lukem 			"MUST ( cn $ subtreeSpecification ) )",
    366  1.1     lukem 		subentryObjectClass, SLAP_OC_SUBENTRY|SLAP_OC_OPERATIONAL,
    367  1.1     lukem 		offsetof(struct slap_internal_schema, si_oc_subentry) },
    368  1.1     lukem 	{ "subschema", "( 2.5.20.1 NAME 'subschema' "
    369  1.1     lukem 		"DESC 'RFC4512: controlling subschema (sub)entry' "
    370  1.1     lukem 		"AUXILIARY "
    371  1.1     lukem 		"MAY ( dITStructureRules $ nameForms $ dITContentRules $ "
    372  1.1     lukem 			"objectClasses $ attributeTypes $ matchingRules $ "
    373  1.1     lukem 			"matchingRuleUse ) )",
    374  1.1     lukem 		subentryObjectClass, SLAP_OC_OPERATIONAL,
    375  1.1     lukem 		offsetof(struct slap_internal_schema, si_oc_subschema) },
    376  1.1     lukem #ifdef LDAP_COLLECTIVE_ATTRIBUTES
    377  1.1     lukem 	{ "collectiveAttributeSubentry", "( 2.5.17.2 "
    378  1.1     lukem 			"NAME 'collectiveAttributeSubentry' "
    379  1.1     lukem 			"DESC 'RFC3671: collective attribute subentry' "
    380  1.1     lukem 			"AUXILIARY )",
    381  1.1     lukem 		subentryObjectClass,
    382  1.1     lukem 		SLAP_OC_COLLECTIVEATTRIBUTESUBENTRY|SLAP_OC_OPERATIONAL|SLAP_OC_HIDE,
    383  1.1     lukem 		offsetof( struct slap_internal_schema,
    384  1.1     lukem 			si_oc_collectiveAttributeSubentry) },
    385  1.1     lukem #endif
    386  1.1     lukem #ifdef LDAP_DYNAMIC_OBJECTS
    387  1.1     lukem 	{ "dynamicObject", "( 1.3.6.1.4.1.1466.101.119.2 "
    388  1.1     lukem 			"NAME 'dynamicObject' "
    389  1.1     lukem 			"DESC 'RFC2589: Dynamic Object' "
    390  1.1     lukem 			"SUP top AUXILIARY )",
    391  1.1     lukem 		dynamicObjectClass, SLAP_OC_DYNAMICOBJECT,
    392  1.1     lukem 		offsetof(struct slap_internal_schema, si_oc_dynamicObject) },
    393  1.1     lukem #endif
    394  1.1     lukem 	{ "glue", "( 1.3.6.1.4.1.4203.666.3.4 "
    395  1.1     lukem 			"NAME 'glue' "
    396  1.1     lukem 			"DESC 'Glue Entry' "
    397  1.1     lukem 			"SUP top STRUCTURAL )",
    398  1.1     lukem 		0, SLAP_OC_GLUE|SLAP_OC_OPERATIONAL|SLAP_OC_HIDE,
    399  1.1     lukem 		offsetof(struct slap_internal_schema, si_oc_glue) },
    400  1.1     lukem 	{ "syncConsumerSubentry", "( 1.3.6.1.4.1.4203.666.3.5 "
    401  1.1     lukem 			"NAME 'syncConsumerSubentry' "
    402  1.1     lukem 			"DESC 'Persistent Info for SyncRepl Consumer' "
    403  1.1     lukem 			"AUXILIARY "
    404  1.1     lukem 			"MAY syncreplCookie )",
    405  1.1     lukem 		0, SLAP_OC_SYNCCONSUMERSUBENTRY|SLAP_OC_OPERATIONAL|SLAP_OC_HIDE,
    406  1.1     lukem 		offsetof(struct slap_internal_schema, si_oc_syncConsumerSubentry) },
    407  1.1     lukem 	{ "syncProviderSubentry", "( 1.3.6.1.4.1.4203.666.3.6 "
    408  1.1     lukem 			"NAME 'syncProviderSubentry' "
    409  1.1     lukem 			"DESC 'Persistent Info for SyncRepl Producer' "
    410  1.1     lukem 			"AUXILIARY "
    411  1.1     lukem 			"MAY contextCSN )",
    412  1.1     lukem 		0, SLAP_OC_SYNCPROVIDERSUBENTRY|SLAP_OC_OPERATIONAL|SLAP_OC_HIDE,
    413  1.1     lukem 		offsetof(struct slap_internal_schema, si_oc_syncProviderSubentry) },
    414  1.1     lukem 
    415  1.1     lukem 	{ NULL, NULL, NULL, 0, 0 }
    416  1.1     lukem };
    417  1.1     lukem 
    418  1.1     lukem static AttributeTypeSchemaCheckFN rootDseAttribute;
    419  1.1     lukem static AttributeTypeSchemaCheckFN aliasAttribute;
    420  1.1     lukem static AttributeTypeSchemaCheckFN referralAttribute;
    421  1.1     lukem static AttributeTypeSchemaCheckFN subentryAttribute;
    422  1.1     lukem static AttributeTypeSchemaCheckFN administrativeRoleAttribute;
    423  1.1     lukem #ifdef LDAP_DYNAMIC_OBJECTS
    424  1.1     lukem static AttributeTypeSchemaCheckFN dynamicAttribute;
    425  1.1     lukem #endif
    426  1.1     lukem 
    427  1.1     lukem static struct slap_schema_ad_map {
    428  1.1     lukem 	char *ssam_name;
    429  1.1     lukem 	char *ssam_defn;
    430  1.1     lukem 	AttributeTypeSchemaCheckFN *ssam_check;
    431  1.1     lukem 	slap_mask_t ssam_flags;
    432  1.1     lukem 	slap_syntax_validate_func *ssam_syn_validate;
    433  1.1     lukem 	slap_syntax_transform_func *ssam_syn_pretty;
    434  1.1     lukem 	slap_mr_convert_func *ssam_mr_convert;
    435  1.1     lukem 	slap_mr_normalize_func *ssam_mr_normalize;
    436  1.1     lukem 	slap_mr_match_func *ssam_mr_match;
    437  1.1     lukem 	slap_mr_indexer_func *ssam_mr_indexer;
    438  1.1     lukem 	slap_mr_filter_func *ssam_mr_filter;
    439  1.1     lukem 	size_t ssam_offset;
    440  1.1     lukem } ad_map[] = {
    441  1.1     lukem 	{ "objectClass", "( 2.5.4.0 NAME 'objectClass' "
    442  1.1     lukem 			"DESC 'RFC4512: object classes of the entity' "
    443  1.1     lukem 			"EQUALITY objectIdentifierMatch "
    444  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
    445  1.1     lukem 		NULL, SLAP_AT_FINAL,
    446  1.1     lukem 		oidValidate, objectClassPretty,
    447  1.1     lukem 		NULL, NULL, objectSubClassMatch,
    448  1.1     lukem 			objectSubClassIndexer, objectSubClassFilter,
    449  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_objectClass) },
    450  1.1     lukem 
    451  1.1     lukem 	/* user entry operational attributes */
    452  1.1     lukem 	{ "structuralObjectClass", "( 2.5.21.9 NAME 'structuralObjectClass' "
    453  1.1     lukem 			"DESC 'RFC4512: structural object class of entry' "
    454  1.1     lukem 			"EQUALITY objectIdentifierMatch "
    455  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 "
    456  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )",
    457  1.2  christos 		NULL, 0,
    458  1.1     lukem 		oidValidate, objectClassPretty,
    459  1.1     lukem 		NULL, NULL, objectSubClassMatch,
    460  1.1     lukem 			objectSubClassIndexer, objectSubClassFilter,
    461  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_structuralObjectClass) },
    462  1.1     lukem 	{ "createTimestamp", "( 2.5.18.1 NAME 'createTimestamp' "
    463  1.1     lukem 			"DESC 'RFC4512: time which object was created' "
    464  1.1     lukem 			"EQUALITY generalizedTimeMatch "
    465  1.1     lukem 			"ORDERING generalizedTimeOrderingMatch "
    466  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 "
    467  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )",
    468  1.1     lukem 		NULL, SLAP_AT_MANAGEABLE,
    469  1.1     lukem 		NULL, NULL,
    470  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    471  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_createTimestamp) },
    472  1.1     lukem 	{ "modifyTimestamp", "( 2.5.18.2 NAME 'modifyTimestamp' "
    473  1.1     lukem 			"DESC 'RFC4512: time which object was last modified' "
    474  1.1     lukem 			"EQUALITY generalizedTimeMatch "
    475  1.1     lukem 			"ORDERING generalizedTimeOrderingMatch "
    476  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 "
    477  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )",
    478  1.1     lukem 		NULL, SLAP_AT_MANAGEABLE,
    479  1.1     lukem 		NULL, NULL,
    480  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    481  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_modifyTimestamp) },
    482  1.1     lukem 	{ "creatorsName", "( 2.5.18.3 NAME 'creatorsName' "
    483  1.1     lukem 			"DESC 'RFC4512: name of creator' "
    484  1.1     lukem 			"EQUALITY distinguishedNameMatch "
    485  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 "
    486  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )",
    487  1.1     lukem 		NULL, SLAP_AT_MANAGEABLE,
    488  1.1     lukem 		NULL, NULL,
    489  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    490  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_creatorsName) },
    491  1.1     lukem 	{ "modifiersName", "( 2.5.18.4 NAME 'modifiersName' "
    492  1.1     lukem 			"DESC 'RFC4512: name of last modifier' "
    493  1.1     lukem 			"EQUALITY distinguishedNameMatch "
    494  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 "
    495  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )",
    496  1.1     lukem 		NULL, SLAP_AT_MANAGEABLE,
    497  1.1     lukem 		NULL, NULL,
    498  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    499  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_modifiersName) },
    500  1.1     lukem 	{ "hasSubordinates", "( 2.5.18.9 NAME 'hasSubordinates' "
    501  1.1     lukem 			"DESC 'X.501: entry has children' "
    502  1.1     lukem 			"EQUALITY booleanMatch "
    503  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 "
    504  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )",
    505  1.1     lukem 		NULL, SLAP_AT_DYNAMIC,
    506  1.1     lukem 		NULL, NULL,
    507  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    508  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_hasSubordinates) },
    509  1.1     lukem 	{ "subschemaSubentry", "( 2.5.18.10 NAME 'subschemaSubentry' "
    510  1.1     lukem 			"DESC 'RFC4512: name of controlling subschema entry' "
    511  1.1     lukem 			"EQUALITY distinguishedNameMatch "
    512  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE "
    513  1.1     lukem 			"NO-USER-MODIFICATION USAGE directoryOperation )",
    514  1.1     lukem 		NULL, SLAP_AT_DYNAMIC,
    515  1.1     lukem 		NULL, NULL,
    516  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    517  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_subschemaSubentry) },
    518  1.1     lukem #ifdef LDAP_COLLECTIVE_ATTRIBUTES
    519  1.1     lukem 	{ "collectiveAttributeSubentries", "( 2.5.18.12 "
    520  1.1     lukem 			"NAME 'collectiveAttributeSubentries' "
    521  1.1     lukem 			"DESC 'RFC3671: collective attribute subentries' "
    522  1.1     lukem 			"EQUALITY distinguishedNameMatch "
    523  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 "
    524  1.1     lukem 			"NO-USER-MODIFICATION USAGE directoryOperation )",
    525  1.1     lukem 		NULL, SLAP_AT_HIDE,
    526  1.1     lukem 		NULL, NULL,
    527  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    528  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_collectiveSubentries) },
    529  1.1     lukem 	{ "collectiveExclusions", "( 2.5.18.7 NAME 'collectiveExclusions' "
    530  1.1     lukem 			"DESC 'RFC3671: collective attribute exclusions' "
    531  1.1     lukem 			"EQUALITY objectIdentifierMatch "
    532  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 "
    533  1.1     lukem 			"USAGE directoryOperation )",
    534  1.1     lukem 		NULL, SLAP_AT_HIDE,
    535  1.1     lukem 		NULL, NULL,
    536  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    537  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_collectiveExclusions) },
    538  1.1     lukem #endif
    539  1.1     lukem 
    540  1.1     lukem 	{ "entryDN", "( 1.3.6.1.1.20 NAME 'entryDN' "
    541  1.1     lukem 			"DESC 'DN of the entry' "
    542  1.1     lukem 			"EQUALITY distinguishedNameMatch "
    543  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 "
    544  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )",
    545  1.1     lukem 		NULL, SLAP_AT_DYNAMIC,
    546  1.1     lukem 		NULL, NULL,
    547  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    548  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_entryDN) },
    549  1.1     lukem 	{ "entryUUID", "( 1.3.6.1.1.16.4 NAME 'entryUUID' "
    550  1.1     lukem 			"DESC 'UUID of the entry' "
    551  1.1     lukem 			"EQUALITY UUIDMatch "
    552  1.1     lukem 			"ORDERING UUIDOrderingMatch "
    553  1.1     lukem 			"SYNTAX 1.3.6.1.1.16.1 "
    554  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )",
    555  1.1     lukem 		NULL, SLAP_AT_MANAGEABLE,
    556  1.1     lukem 		NULL, NULL,
    557  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    558  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_entryUUID) },
    559  1.1     lukem 	{ "entryCSN", "( 1.3.6.1.4.1.4203.666.1.7 NAME 'entryCSN' "
    560  1.1     lukem 			"DESC 'change sequence number of the entry content' "
    561  1.1     lukem 			"EQUALITY CSNMatch "
    562  1.1     lukem 			"ORDERING CSNOrderingMatch "
    563  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.4203.666.11.2.1{64} "
    564  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )",
    565  1.3  christos 		NULL, 0,
    566  1.1     lukem 		NULL, NULL,
    567  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    568  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_entryCSN) },
    569  1.1     lukem 	{ "namingCSN", "( 1.3.6.1.4.1.4203.666.1.13 NAME 'namingCSN' "
    570  1.1     lukem 			"DESC 'change sequence number of the entry naming (RDN)' "
    571  1.1     lukem 			"EQUALITY CSNMatch "
    572  1.1     lukem 			"ORDERING CSNOrderingMatch "
    573  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.4203.666.11.2.1{64} "
    574  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )",
    575  1.1     lukem 		NULL, SLAP_AT_HIDE,
    576  1.1     lukem 		NULL, NULL,
    577  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    578  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_namingCSN) },
    579  1.1     lukem 
    580  1.1     lukem #ifdef LDAP_SUPERIOR_UUID
    581  1.1     lukem 	{ "superiorUUID", "( 1.3.6.1.4.1.4203.666.1.11 NAME 'superiorUUID' "
    582  1.1     lukem 			"DESC 'UUID of the superior entry' "
    583  1.1     lukem 			"EQUALITY UUIDMatch "
    584  1.1     lukem 			"ORDERING UUIDOrderingMatch "
    585  1.1     lukem 			"SYNTAX 1.3.6.1.1.16.1 "
    586  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )",
    587  1.1     lukem 		NULL, SLAP_AT_HIDE,
    588  1.1     lukem 		NULL, NULL,
    589  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    590  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_superiorUUID) },
    591  1.1     lukem #endif
    592  1.1     lukem 
    593  1.1     lukem 	{ "syncreplCookie", "( 1.3.6.1.4.1.4203.666.1.23 "
    594  1.1     lukem 			"NAME 'syncreplCookie' "
    595  1.1     lukem 			"DESC 'syncrepl Cookie for shadow copy' "
    596  1.1     lukem 			"EQUALITY octetStringMatch "
    597  1.1     lukem 			"ORDERING octetStringOrderingMatch "
    598  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 "
    599  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation )",
    600  1.1     lukem 		NULL, SLAP_AT_HIDE,
    601  1.1     lukem 		NULL, NULL,
    602  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    603  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_syncreplCookie) },
    604  1.1     lukem 
    605  1.1     lukem 	{ "contextCSN", "( 1.3.6.1.4.1.4203.666.1.25 "
    606  1.1     lukem 			"NAME 'contextCSN' "
    607  1.1     lukem 			"DESC 'the largest committed CSN of a context' "
    608  1.1     lukem 			"EQUALITY CSNMatch "
    609  1.1     lukem 			"ORDERING CSNOrderingMatch "
    610  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.4203.666.11.2.1{64} "
    611  1.1     lukem 			"NO-USER-MODIFICATION USAGE dSAOperation )",
    612  1.3  christos 		NULL, 0,
    613  1.1     lukem 		NULL, NULL,
    614  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    615  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_contextCSN) },
    616  1.1     lukem 
    617  1.1     lukem #ifdef LDAP_SYNC_TIMESTAMP
    618  1.1     lukem 	{ "syncTimestamp", "( 1.3.6.1.4.1.4203.666.1.26 NAME 'syncTimestamp' "
    619  1.1     lukem 			"DESC 'Time which object was replicated' "
    620  1.1     lukem 			"EQUALITY generalizedTimeMatch "
    621  1.1     lukem 			"ORDERING generalizedTimeOrderingMatch "
    622  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 "
    623  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation )",
    624  1.1     lukem 		NULL, 0,
    625  1.1     lukem 		NULL, NULL,
    626  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    627  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_syncTimestamp) },
    628  1.1     lukem #endif
    629  1.1     lukem 
    630  1.1     lukem 	/* root DSE attributes */
    631  1.1     lukem 	{ "altServer", "( 1.3.6.1.4.1.1466.101.120.6 NAME 'altServer' "
    632  1.1     lukem 			"DESC 'RFC4512: alternative servers' "
    633  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 USAGE dSAOperation )",
    634  1.1     lukem 		rootDseAttribute, 0,
    635  1.1     lukem 		NULL, NULL,
    636  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    637  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_altServer) },
    638  1.1     lukem 	{ "namingContexts", "( 1.3.6.1.4.1.1466.101.120.5 "
    639  1.1     lukem 			"NAME 'namingContexts' "
    640  1.1     lukem 			"DESC 'RFC4512: naming contexts' "
    641  1.3  christos 			"EQUALITY distinguishedNameMatch "
    642  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE dSAOperation )",
    643  1.1     lukem 		rootDseAttribute, 0,
    644  1.1     lukem 		NULL, NULL,
    645  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    646  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_namingContexts) },
    647  1.1     lukem 	{ "supportedControl", "( 1.3.6.1.4.1.1466.101.120.13 "
    648  1.1     lukem 			"NAME 'supportedControl' "
    649  1.1     lukem 			"DESC 'RFC4512: supported controls' "
    650  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation )",
    651  1.1     lukem 		rootDseAttribute, 0,
    652  1.1     lukem 		NULL, NULL,
    653  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    654  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_supportedControl) },
    655  1.1     lukem 	{ "supportedExtension", "( 1.3.6.1.4.1.1466.101.120.7 "
    656  1.1     lukem 			"NAME 'supportedExtension' "
    657  1.1     lukem 			"DESC 'RFC4512: supported extended operations' "
    658  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation )",
    659  1.1     lukem 		rootDseAttribute, 0,
    660  1.1     lukem 		NULL, NULL,
    661  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    662  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_supportedExtension) },
    663  1.1     lukem 	{ "supportedLDAPVersion", "( 1.3.6.1.4.1.1466.101.120.15 "
    664  1.1     lukem 			"NAME 'supportedLDAPVersion' "
    665  1.1     lukem 			"DESC 'RFC4512: supported LDAP versions' "
    666  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 USAGE dSAOperation )",
    667  1.1     lukem 		rootDseAttribute, 0,
    668  1.1     lukem 		NULL, NULL,
    669  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    670  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_supportedLDAPVersion) },
    671  1.1     lukem 	{ "supportedSASLMechanisms", "( 1.3.6.1.4.1.1466.101.120.14 "
    672  1.1     lukem 			"NAME 'supportedSASLMechanisms' "
    673  1.1     lukem 			"DESC 'RFC4512: supported SASL mechanisms'"
    674  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE dSAOperation )",
    675  1.1     lukem 		rootDseAttribute, 0,
    676  1.1     lukem 		NULL, NULL,
    677  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    678  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_supportedSASLMechanisms) },
    679  1.1     lukem 	{ "supportedFeatures", "( 1.3.6.1.4.1.4203.1.3.5 "
    680  1.1     lukem 			"NAME 'supportedFeatures' "
    681  1.1     lukem 			"DESC 'RFC4512: features supported by the server' "
    682  1.1     lukem 			"EQUALITY objectIdentifierMatch "
    683  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 "
    684  1.1     lukem 			"USAGE dSAOperation )",
    685  1.1     lukem 		rootDseAttribute, 0,
    686  1.1     lukem 		NULL, NULL,
    687  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    688  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_supportedFeatures) },
    689  1.1     lukem 	{ "monitorContext", "( 1.3.6.1.4.1.4203.666.1.10 "
    690  1.1     lukem 			"NAME 'monitorContext' "
    691  1.1     lukem 			"DESC 'monitor context' "
    692  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 "
    693  1.2  christos 			"EQUALITY distinguishedNameMatch "
    694  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION "
    695  1.1     lukem 			"USAGE dSAOperation )",
    696  1.1     lukem 		rootDseAttribute, SLAP_AT_HIDE,
    697  1.1     lukem 		NULL, NULL,
    698  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    699  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_monitorContext) },
    700  1.2  christos 	{ "configContext", "( 1.3.6.1.4.1.4203.1.12.2.1 "
    701  1.1     lukem 			"NAME 'configContext' "
    702  1.1     lukem 			"DESC 'config context' "
    703  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 "
    704  1.2  christos 			"EQUALITY distinguishedNameMatch "
    705  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION "
    706  1.1     lukem 			"USAGE dSAOperation )",
    707  1.1     lukem 		rootDseAttribute, SLAP_AT_HIDE,
    708  1.1     lukem 		NULL, NULL,
    709  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    710  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_configContext) },
    711  1.1     lukem 	{ "vendorName", "( 1.3.6.1.1.4 NAME 'vendorName' "
    712  1.1     lukem 			"DESC 'RFC3045: name of implementation vendor' "
    713  1.1     lukem 			"EQUALITY caseExactMatch "
    714  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 "
    715  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION "
    716  1.1     lukem 			"USAGE dSAOperation )",
    717  1.1     lukem 		rootDseAttribute, 0,
    718  1.1     lukem 		NULL, NULL,
    719  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    720  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_vendorName) },
    721  1.1     lukem 	{ "vendorVersion", "( 1.3.6.1.1.5 NAME 'vendorVersion' "
    722  1.1     lukem 			"DESC 'RFC3045: version of implementation' "
    723  1.1     lukem 			"EQUALITY caseExactMatch "
    724  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 "
    725  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION "
    726  1.1     lukem 			"USAGE dSAOperation )",
    727  1.1     lukem 		rootDseAttribute, 0,
    728  1.1     lukem 		NULL, NULL,
    729  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    730  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_vendorVersion) },
    731  1.1     lukem 
    732  1.1     lukem 	/* subentry attributes */
    733  1.1     lukem 	{ "administrativeRole", "( 2.5.18.5 NAME 'administrativeRole' "
    734  1.1     lukem 			"DESC 'RFC3672: administrative role' "
    735  1.1     lukem 			"EQUALITY objectIdentifierMatch "
    736  1.1     lukem 			"USAGE directoryOperation "
    737  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
    738  1.1     lukem 		administrativeRoleAttribute, SLAP_AT_HIDE,
    739  1.1     lukem 		NULL, NULL,
    740  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    741  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_administrativeRole) },
    742  1.1     lukem 	{ "subtreeSpecification", "( 2.5.18.6 NAME 'subtreeSpecification' "
    743  1.1     lukem 			"DESC 'RFC3672: subtree specification' "
    744  1.1     lukem 			"SINGLE-VALUE "
    745  1.1     lukem 			"USAGE directoryOperation "
    746  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.45 )",
    747  1.1     lukem 		subentryAttribute, SLAP_AT_HIDE,
    748  1.1     lukem 		NULL, NULL,
    749  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    750  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_subtreeSpecification) },
    751  1.1     lukem 
    752  1.1     lukem 	/* subschema subentry attributes */
    753  1.1     lukem 	{ "dITStructureRules", "( 2.5.21.1 NAME 'dITStructureRules' "
    754  1.1     lukem 			"DESC 'RFC4512: DIT structure rules' "
    755  1.1     lukem 			"EQUALITY integerFirstComponentMatch "
    756  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.17 "
    757  1.1     lukem 			"USAGE directoryOperation ) ",
    758  1.1     lukem 		subentryAttribute, SLAP_AT_HIDE,
    759  1.1     lukem 		NULL, NULL,
    760  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    761  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_ditStructureRules) },
    762  1.1     lukem 	{ "dITContentRules", "( 2.5.21.2 NAME 'dITContentRules' "
    763  1.1     lukem 			"DESC 'RFC4512: DIT content rules' "
    764  1.1     lukem 			"EQUALITY objectIdentifierFirstComponentMatch "
    765  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.16 USAGE directoryOperation )",
    766  1.1     lukem 		subentryAttribute, SLAP_AT_HIDE,
    767  1.1     lukem 		oidValidate, NULL,
    768  1.1     lukem 		NULL, NULL, objectClassMatch, NULL, NULL,
    769  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_ditContentRules) },
    770  1.1     lukem 	{ "matchingRules", "( 2.5.21.4 NAME 'matchingRules' "
    771  1.1     lukem 			"DESC 'RFC4512: matching rules' "
    772  1.1     lukem 			"EQUALITY objectIdentifierFirstComponentMatch "
    773  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.30 USAGE directoryOperation )",
    774  1.1     lukem 		subentryAttribute, 0,
    775  1.1     lukem 		oidValidate, NULL,
    776  1.1     lukem 		NULL, NULL, matchingRuleMatch, NULL, NULL,
    777  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_matchingRules) },
    778  1.1     lukem 	{ "attributeTypes", "( 2.5.21.5 NAME 'attributeTypes' "
    779  1.1     lukem 			"DESC 'RFC4512: attribute types' "
    780  1.1     lukem 			"EQUALITY objectIdentifierFirstComponentMatch "
    781  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.3 USAGE directoryOperation )",
    782  1.1     lukem 		subentryAttribute, 0,
    783  1.1     lukem 		oidValidate, NULL,
    784  1.1     lukem 		NULL, NULL, attributeTypeMatch, NULL, NULL,
    785  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_attributeTypes) },
    786  1.1     lukem 	{ "objectClasses", "( 2.5.21.6 NAME 'objectClasses' "
    787  1.1     lukem 			"DESC 'RFC4512: object classes' "
    788  1.1     lukem 			"EQUALITY objectIdentifierFirstComponentMatch "
    789  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.37 USAGE directoryOperation )",
    790  1.1     lukem 		subentryAttribute, 0,
    791  1.1     lukem 		oidValidate, NULL,
    792  1.1     lukem 		NULL, NULL, objectClassMatch, NULL, NULL,
    793  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_objectClasses) },
    794  1.1     lukem 	{ "nameForms", "( 2.5.21.7 NAME 'nameForms' "
    795  1.1     lukem 			"DESC 'RFC4512: name forms ' "
    796  1.1     lukem 			"EQUALITY objectIdentifierFirstComponentMatch "
    797  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.35 USAGE directoryOperation )",
    798  1.1     lukem 		subentryAttribute, SLAP_AT_HIDE,
    799  1.1     lukem 		NULL, NULL,
    800  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    801  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_nameForms) },
    802  1.1     lukem 	{ "matchingRuleUse", "( 2.5.21.8 NAME 'matchingRuleUse' "
    803  1.1     lukem 			"DESC 'RFC4512: matching rule uses' "
    804  1.1     lukem 			"EQUALITY objectIdentifierFirstComponentMatch "
    805  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.31 USAGE directoryOperation )",
    806  1.1     lukem 		subentryAttribute, 0,
    807  1.1     lukem 		oidValidate, NULL,
    808  1.1     lukem 		NULL, NULL, matchingRuleMatch, NULL, NULL,
    809  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_matchingRuleUse) },
    810  1.1     lukem 
    811  1.1     lukem 	{ "ldapSyntaxes", "( 1.3.6.1.4.1.1466.101.120.16 NAME 'ldapSyntaxes' "
    812  1.1     lukem 			"DESC 'RFC4512: LDAP syntaxes' "
    813  1.1     lukem 			"EQUALITY objectIdentifierFirstComponentMatch "
    814  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.54 USAGE directoryOperation )",
    815  1.1     lukem 		subentryAttribute, 0,
    816  1.1     lukem 		NULL, NULL,
    817  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    818  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_ldapSyntaxes) },
    819  1.1     lukem 
    820  1.1     lukem 	/* knowledge information */
    821  1.1     lukem 	{ "aliasedObjectName", "( 2.5.4.1 "
    822  1.1     lukem 			"NAME ( 'aliasedObjectName' 'aliasedEntryName' ) "
    823  1.1     lukem 			"DESC 'RFC4512: name of aliased object' "
    824  1.1     lukem 			"EQUALITY distinguishedNameMatch "
    825  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )",
    826  1.1     lukem 		aliasAttribute, SLAP_AT_FINAL,
    827  1.1     lukem 		NULL, NULL,
    828  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    829  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_aliasedObjectName) },
    830  1.1     lukem 	{ "ref", "( 2.16.840.1.113730.3.1.34 NAME 'ref' "
    831  1.1     lukem 			"DESC 'RFC3296: subordinate referral URL' "
    832  1.1     lukem 			"EQUALITY caseExactMatch "
    833  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 "
    834  1.1     lukem 			"USAGE distributedOperation )",
    835  1.1     lukem 		referralAttribute, 0,
    836  1.1     lukem 		NULL, NULL,
    837  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    838  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_ref) },
    839  1.1     lukem 
    840  1.1     lukem 	/* access control internals */
    841  1.1     lukem 	{ "entry", "( 1.3.6.1.4.1.4203.1.3.1 "
    842  1.1     lukem 			"NAME 'entry' "
    843  1.1     lukem 			"DESC 'OpenLDAP ACL entry pseudo-attribute' "
    844  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.4203.1.1.1 "
    845  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation )",
    846  1.1     lukem 		NULL, SLAP_AT_HIDE,
    847  1.1     lukem 		NULL, NULL,
    848  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    849  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_entry) },
    850  1.1     lukem 	{ "children", "( 1.3.6.1.4.1.4203.1.3.2 "
    851  1.1     lukem 			"NAME 'children' "
    852  1.1     lukem 			"DESC 'OpenLDAP ACL children pseudo-attribute' "
    853  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.4203.1.1.1 "
    854  1.1     lukem 			"SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation )",
    855  1.1     lukem 		NULL, SLAP_AT_HIDE,
    856  1.1     lukem 		NULL, NULL,
    857  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    858  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_children) },
    859  1.1     lukem 
    860  1.1     lukem 	/* access control externals */
    861  1.1     lukem 	{ "authzTo", "( 1.3.6.1.4.1.4203.666.1.8 "
    862  1.1     lukem 			"NAME ( 'authzTo' 'saslAuthzTo' ) "
    863  1.1     lukem 			"DESC 'proxy authorization targets' "
    864  1.1     lukem 			"EQUALITY authzMatch "
    865  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.4203.666.2.7 "
    866  1.1     lukem 			"X-ORDERED 'VALUES' "
    867  1.1     lukem 			"USAGE distributedOperation )",
    868  1.1     lukem 		NULL, SLAP_AT_HIDE,
    869  1.1     lukem 		NULL, NULL,
    870  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    871  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_saslAuthzTo) },
    872  1.1     lukem 	{ "authzFrom", "( 1.3.6.1.4.1.4203.666.1.9 "
    873  1.1     lukem 			"NAME ( 'authzFrom' 'saslAuthzFrom' ) "
    874  1.1     lukem 			"DESC 'proxy authorization sources' "
    875  1.1     lukem 			"EQUALITY authzMatch "
    876  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.4203.666.2.7 "
    877  1.1     lukem 			"X-ORDERED 'VALUES' "
    878  1.1     lukem 			"USAGE distributedOperation )",
    879  1.1     lukem 		NULL, SLAP_AT_HIDE,
    880  1.1     lukem 		NULL, NULL,
    881  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    882  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_saslAuthzFrom) },
    883  1.1     lukem 
    884  1.1     lukem #ifdef LDAP_DYNAMIC_OBJECTS
    885  1.1     lukem 	{ "entryTtl", "( 1.3.6.1.4.1.1466.101.119.3 NAME 'entryTtl' "
    886  1.1     lukem 			"DESC 'RFC2589: entry time-to-live' "
    887  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE "
    888  1.1     lukem 			"NO-USER-MODIFICATION USAGE dSAOperation )",
    889  1.1     lukem 		dynamicAttribute, SLAP_AT_MANAGEABLE,
    890  1.1     lukem 		NULL, NULL,
    891  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    892  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_entryTtl) },
    893  1.1     lukem 	{ "dynamicSubtrees", "( 1.3.6.1.4.1.1466.101.119.4 "
    894  1.1     lukem 			"NAME 'dynamicSubtrees' "
    895  1.1     lukem 			"DESC 'RFC2589: dynamic subtrees' "
    896  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION "
    897  1.1     lukem 			"USAGE dSAOperation )",
    898  1.1     lukem 		rootDseAttribute, 0,
    899  1.1     lukem 		NULL, NULL,
    900  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    901  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_dynamicSubtrees) },
    902  1.1     lukem #endif
    903  1.1     lukem 
    904  1.1     lukem 	/* userApplication attributes (which system schema depends upon) */
    905  1.1     lukem 	{ "distinguishedName", "( 2.5.4.49 NAME 'distinguishedName' "
    906  1.1     lukem 			"DESC 'RFC4519: common supertype of DN attributes' "
    907  1.1     lukem 			"EQUALITY distinguishedNameMatch "
    908  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )",
    909  1.1     lukem 		NULL, SLAP_AT_ABSTRACT,
    910  1.1     lukem 		NULL, NULL,
    911  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    912  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_distinguishedName) },
    913  1.1     lukem 	{ "name", "( 2.5.4.41 NAME 'name' "
    914  1.1     lukem 			"DESC 'RFC4519: common supertype of name attributes' "
    915  1.1     lukem 			"EQUALITY caseIgnoreMatch "
    916  1.1     lukem 			"SUBSTR caseIgnoreSubstringsMatch "
    917  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )",
    918  1.1     lukem 		NULL, SLAP_AT_ABSTRACT,
    919  1.1     lukem 		NULL, NULL,
    920  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    921  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_name) },
    922  1.1     lukem 	{ "cn", "( 2.5.4.3 NAME ( 'cn' 'commonName' ) "
    923  1.1     lukem 			"DESC 'RFC4519: common name(s) for which the entity is known by' "
    924  1.1     lukem 			"SUP name )",
    925  1.1     lukem 		NULL, 0,
    926  1.1     lukem 		NULL, NULL,
    927  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    928  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_cn) },
    929  1.1     lukem 	{ "uid", "( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userid' ) "
    930  1.1     lukem 			"DESC 'RFC4519: user identifier' "
    931  1.1     lukem 			"EQUALITY caseIgnoreMatch "
    932  1.1     lukem 			"SUBSTR caseIgnoreSubstringsMatch "
    933  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )",
    934  1.1     lukem 		NULL, 0,
    935  1.1     lukem 		NULL, NULL,
    936  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    937  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_uid) },
    938  1.1     lukem 	{ "uidNumber", /* for ldapi:// */
    939  1.1     lukem 		"( 1.3.6.1.1.1.1.0 NAME 'uidNumber' "
    940  1.1     lukem     		"DESC 'RFC2307: An integer uniquely identifying a user "
    941  1.1     lukem 				"in an administrative domain' "
    942  1.1     lukem     		"EQUALITY integerMatch "
    943  1.2  christos     		"ORDERING integerOrderingMatch "
    944  1.1     lukem     		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )",
    945  1.1     lukem 		NULL, 0,
    946  1.1     lukem 		NULL, NULL,
    947  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    948  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_uidNumber) },
    949  1.1     lukem 	{ "gidNumber", /* for ldapi:// */
    950  1.1     lukem 		"( 1.3.6.1.1.1.1.1 NAME 'gidNumber' "
    951  1.1     lukem     		"DESC 'RFC2307: An integer uniquely identifying a group "
    952  1.1     lukem 				"in an administrative domain' "
    953  1.1     lukem     		"EQUALITY integerMatch "
    954  1.2  christos     		"ORDERING integerOrderingMatch "
    955  1.1     lukem     		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )",
    956  1.1     lukem 		NULL, 0,
    957  1.1     lukem 		NULL, NULL,
    958  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    959  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_gidNumber) },
    960  1.1     lukem 	{ "userPassword", "( 2.5.4.35 NAME 'userPassword' "
    961  1.1     lukem 			"DESC 'RFC4519/2307: password of user' "
    962  1.1     lukem 			"EQUALITY octetStringMatch "
    963  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128} )",
    964  1.1     lukem 		NULL, 0,
    965  1.1     lukem 		NULL, NULL,
    966  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    967  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_userPassword) },
    968  1.1     lukem 
    969  1.1     lukem 	{ "labeledURI", "( 1.3.6.1.4.1.250.1.57 NAME 'labeledURI' "
    970  1.1     lukem 			"DESC 'RFC2079: Uniform Resource Identifier with optional label' "
    971  1.1     lukem 			"EQUALITY caseExactMatch "
    972  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
    973  1.1     lukem 		NULL, 0,
    974  1.1     lukem 		NULL, NULL,
    975  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    976  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_labeledURI) },
    977  1.1     lukem 
    978  1.1     lukem #ifdef SLAPD_AUTHPASSWD
    979  1.1     lukem 	{ "authPassword", "( 1.3.6.1.4.1.4203.1.3.4 "
    980  1.1     lukem 			"NAME 'authPassword' "
    981  1.1     lukem 			"DESC 'RFC3112: authentication password attribute' "
    982  1.1     lukem 			"EQUALITY 1.3.6.1.4.1.4203.1.2.2 "
    983  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.4203.1.1.2 )",
    984  1.1     lukem 		NULL, 0,
    985  1.1     lukem 		NULL, NULL,
    986  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    987  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_authPassword) },
    988  1.1     lukem 	{ "supportedAuthPasswordSchemes", "( 1.3.6.1.4.1.4203.1.3.3 "
    989  1.1     lukem 			"NAME 'supportedAuthPasswordSchemes' "
    990  1.1     lukem 			"DESC 'RFC3112: supported authPassword schemes' "
    991  1.1     lukem 			"EQUALITY caseExactIA5Match "
    992  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} "
    993  1.1     lukem 			"USAGE dSAOperation )",
    994  1.1     lukem 		subschemaAttribute, 0,
    995  1.1     lukem 		NULL, NULL,
    996  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
    997  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_authPasswordSchemes) },
    998  1.1     lukem #endif
    999  1.1     lukem 
   1000  1.1     lukem 	{ "description", "( 2.5.4.13 NAME 'description' "
   1001  1.1     lukem 			"DESC 'RFC4519: descriptive information' "
   1002  1.1     lukem 			"EQUALITY caseIgnoreMatch "
   1003  1.1     lukem 			"SUBSTR caseIgnoreSubstringsMatch "
   1004  1.1     lukem 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1024} )",
   1005  1.1     lukem 		NULL, 0,
   1006  1.1     lukem 		NULL, NULL,
   1007  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
   1008  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_description) },
   1009  1.1     lukem 
   1010  1.1     lukem 	{ "seeAlso", "( 2.5.4.34 NAME 'seeAlso' "
   1011  1.1     lukem 			"DESC 'RFC4519: DN of related object' "
   1012  1.1     lukem 			"SUP distinguishedName )",
   1013  1.1     lukem 		NULL, 0,
   1014  1.1     lukem 		NULL, NULL,
   1015  1.1     lukem 		NULL, NULL, NULL, NULL, NULL,
   1016  1.1     lukem 		offsetof(struct slap_internal_schema, si_ad_seeAlso) },
   1017  1.1     lukem 
   1018  1.3  christos 	{ "pKCS8PrivateKey", "( 1.3.6.1.4.1.4203.666.1.60 "
   1019  1.3  christos 			"NAME 'pKCS8PrivateKey' "
   1020  1.3  christos 			"DESC 'PKCS#8 PrivateKeyInfo, use ;binary' "
   1021  1.3  christos 			"EQUALITY privateKeyMatch "
   1022  1.3  christos 			"SYNTAX 1.2.840.113549.1.8.1.1 )",
   1023  1.3  christos 		NULL, 0,
   1024  1.3  christos 		NULL, NULL,
   1025  1.3  christos 		NULL, NULL, NULL, NULL, NULL,
   1026  1.3  christos 		offsetof(struct slap_internal_schema, si_ad_pKCS8PrivateKey) },
   1027  1.3  christos 
   1028  1.3  christos 	{ "pwdLastSuccess", "( 1.3.6.1.4.1.42.2.27.8.1.29 NAME 'pwdLastSuccess' "
   1029  1.3  christos 			"DESC 'The timestamp of the last successful authentication' "
   1030  1.3  christos 			"EQUALITY generalizedTimeMatch "
   1031  1.3  christos 			"ORDERING generalizedTimeOrderingMatch "
   1032  1.3  christos 			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 "
   1033  1.3  christos 			"SINGLE-VALUE "
   1034  1.3  christos 			"NO-USER-MODIFICATION "
   1035  1.3  christos 			"USAGE directoryOperation )",
   1036  1.4  christos 		NULL, SLAP_AT_MANAGEABLE,
   1037  1.3  christos 		NULL, NULL,
   1038  1.3  christos 		NULL, NULL, NULL, NULL, NULL,
   1039  1.3  christos 		offsetof(struct slap_internal_schema, si_ad_pwdLastSuccess) },
   1040  1.3  christos 
   1041  1.1     lukem 	{ NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 }
   1042  1.1     lukem };
   1043  1.1     lukem 
   1044  1.1     lukem static AttributeType slap_at_undefined = {
   1045  1.1     lukem 	{ "1.1.1", NULL, "Catchall for undefined attribute types", 1, NULL,
   1046  1.1     lukem 		NULL, NULL, NULL, NULL,
   1047  1.1     lukem 		0, 0, 0, 1, LDAP_SCHEMA_DSA_OPERATION, NULL }, /* LDAPAttributeType */
   1048  1.1     lukem 	BER_BVC("UNDEFINED"), /* cname */
   1049  1.1     lukem 	NULL, /* sup */
   1050  1.1     lukem 	NULL, /* subtypes */
   1051  1.1     lukem 	NULL, NULL, NULL, NULL,	/* matching rules routines */
   1052  1.1     lukem 	NULL, /* syntax (will be set later to "octetString") */
   1053  1.1     lukem 	NULL, /* schema check function */
   1054  1.1     lukem 	NULL, /* oidmacro */
   1055  1.2  christos 	NULL, /* soidmacro */
   1056  1.1     lukem 	SLAP_AT_ABSTRACT|SLAP_AT_FINAL,	/* mask */
   1057  1.1     lukem 	{ NULL }, /* next */
   1058  1.1     lukem 	NULL /* attribute description */
   1059  1.1     lukem 	/* mutex (don't know how to initialize it :) */
   1060  1.1     lukem };
   1061  1.1     lukem 
   1062  1.1     lukem static AttributeType slap_at_proxied = {
   1063  1.1     lukem 	{ "1.1.1", NULL, "Catchall for undefined proxied attribute types", 1, NULL,
   1064  1.1     lukem 		NULL, NULL, NULL, NULL,
   1065  1.1     lukem 		0, 0, 0, 0, LDAP_SCHEMA_USER_APPLICATIONS, NULL }, /* LDAPAttributeType */
   1066  1.1     lukem 	BER_BVC("PROXIED"), /* cname */
   1067  1.1     lukem 	NULL, /* sup */
   1068  1.1     lukem 	NULL, /* subtypes */
   1069  1.1     lukem 	NULL, NULL, NULL, NULL,	/* matching rules routines (will be set later) */
   1070  1.1     lukem 	NULL, /* syntax (will be set later to "octetString") */
   1071  1.1     lukem 	NULL, /* schema check function */
   1072  1.1     lukem 	NULL, /* oidmacro */
   1073  1.2  christos 	NULL, /* soidmacro */
   1074  1.1     lukem 	SLAP_AT_ABSTRACT|SLAP_AT_FINAL,	/* mask */
   1075  1.1     lukem 	{ NULL }, /* next */
   1076  1.1     lukem 	NULL /* attribute description */
   1077  1.1     lukem 	/* mutex (don't know how to initialize it :) */
   1078  1.1     lukem };
   1079  1.1     lukem 
   1080  1.1     lukem static struct slap_schema_mr_map {
   1081  1.1     lukem 	char *ssmm_name;
   1082  1.1     lukem 	size_t ssmm_offset;
   1083  1.1     lukem } mr_map[] = {
   1084  1.1     lukem 	{ "caseExactIA5Match",
   1085  1.1     lukem 		offsetof(struct slap_internal_schema, si_mr_caseExactIA5Match) },
   1086  1.1     lukem 	{ "caseExactMatch",
   1087  1.1     lukem 		offsetof(struct slap_internal_schema, si_mr_caseExactMatch) },
   1088  1.1     lukem 	{ "caseExactSubstringsMatch",
   1089  1.1     lukem 		offsetof(struct slap_internal_schema, si_mr_caseExactSubstringsMatch) },
   1090  1.1     lukem 	{ "distinguishedNameMatch",
   1091  1.1     lukem 		offsetof(struct slap_internal_schema, si_mr_distinguishedNameMatch) },
   1092  1.1     lukem 	{ "dnSubtreeMatch",
   1093  1.1     lukem 		offsetof(struct slap_internal_schema, si_mr_dnSubtreeMatch) },
   1094  1.1     lukem 	{ "dnOneLevelMatch",
   1095  1.1     lukem 		offsetof(struct slap_internal_schema, si_mr_dnOneLevelMatch) },
   1096  1.1     lukem 	{ "dnSubordinateMatch",
   1097  1.1     lukem 		offsetof(struct slap_internal_schema, si_mr_dnSubordinateMatch) },
   1098  1.1     lukem 	{ "dnSuperiorMatch",
   1099  1.1     lukem 		offsetof(struct slap_internal_schema, si_mr_dnSuperiorMatch) },
   1100  1.1     lukem 	{ "integerMatch",
   1101  1.1     lukem 		offsetof(struct slap_internal_schema, si_mr_integerMatch) },
   1102  1.1     lukem 	{ "integerFirstComponentMatch",
   1103  1.1     lukem 		offsetof(struct slap_internal_schema,
   1104  1.1     lukem 			si_mr_integerFirstComponentMatch) },
   1105  1.1     lukem 	{ "objectIdentifierFirstComponentMatch",
   1106  1.1     lukem 		offsetof(struct slap_internal_schema,
   1107  1.1     lukem 			si_mr_objectIdentifierFirstComponentMatch) },
   1108  1.2  christos 	{ "caseIgnoreMatch",
   1109  1.2  christos 		offsetof(struct slap_internal_schema, si_mr_caseIgnoreMatch) },
   1110  1.2  christos 	{ "caseIgnoreListMatch",
   1111  1.2  christos 		offsetof(struct slap_internal_schema, si_mr_caseIgnoreListMatch) },
   1112  1.1     lukem 	{ NULL, 0 }
   1113  1.1     lukem };
   1114  1.1     lukem 
   1115  1.1     lukem static struct slap_schema_syn_map {
   1116  1.1     lukem 	char *sssm_name;
   1117  1.1     lukem 	size_t sssm_offset;
   1118  1.1     lukem } syn_map[] = {
   1119  1.1     lukem 	{ "1.3.6.1.4.1.1466.115.121.1.15",
   1120  1.1     lukem 		offsetof(struct slap_internal_schema, si_syn_directoryString) },
   1121  1.1     lukem 	{ "1.3.6.1.4.1.1466.115.121.1.12",
   1122  1.1     lukem 		offsetof(struct slap_internal_schema, si_syn_distinguishedName) },
   1123  1.1     lukem 	{ "1.3.6.1.4.1.1466.115.121.1.27",
   1124  1.1     lukem 		offsetof(struct slap_internal_schema, si_syn_integer) },
   1125  1.1     lukem 	{ "1.3.6.1.4.1.1466.115.121.1.40",
   1126  1.1     lukem 		offsetof(struct slap_internal_schema, si_syn_octetString) },
   1127  1.1     lukem 	{ "1.3.6.1.4.1.1466.115.121.1.3",
   1128  1.1     lukem 		offsetof(struct slap_internal_schema, si_syn_attributeTypeDesc) },
   1129  1.1     lukem 	{ "1.3.6.1.4.1.1466.115.121.1.16",
   1130  1.1     lukem 		offsetof(struct slap_internal_schema, si_syn_ditContentRuleDesc) },
   1131  1.1     lukem 	{ "1.3.6.1.4.1.1466.115.121.1.54",
   1132  1.1     lukem 		offsetof(struct slap_internal_schema, si_syn_ldapSyntaxDesc) },
   1133  1.1     lukem 	{ "1.3.6.1.4.1.1466.115.121.1.30",
   1134  1.1     lukem 		offsetof(struct slap_internal_schema, si_syn_matchingRuleDesc) },
   1135  1.1     lukem 	{ "1.3.6.1.4.1.1466.115.121.1.31",
   1136  1.1     lukem 		offsetof(struct slap_internal_schema, si_syn_matchingRuleUseDesc) },
   1137  1.1     lukem 	{ "1.3.6.1.4.1.1466.115.121.1.35",
   1138  1.1     lukem 		offsetof(struct slap_internal_schema, si_syn_nameFormDesc) },
   1139  1.1     lukem 	{ "1.3.6.1.4.1.1466.115.121.1.37",
   1140  1.1     lukem 		offsetof(struct slap_internal_schema, si_syn_objectClassDesc) },
   1141  1.1     lukem 	{ "1.3.6.1.4.1.1466.115.121.1.17",
   1142  1.1     lukem 		offsetof(struct slap_internal_schema, si_syn_ditStructureRuleDesc) },
   1143  1.1     lukem 	{ NULL, 0 }
   1144  1.1     lukem };
   1145  1.1     lukem 
   1146  1.1     lukem int
   1147  1.1     lukem slap_schema_load( void )
   1148  1.1     lukem {
   1149  1.1     lukem 	int i;
   1150  1.1     lukem 
   1151  1.1     lukem 	for( i=0; syn_map[i].sssm_name; i++ ) {
   1152  1.1     lukem 		Syntax ** synp = (Syntax **)
   1153  1.1     lukem 			&(((char *) &slap_schema)[syn_map[i].sssm_offset]);
   1154  1.1     lukem 
   1155  1.1     lukem 		assert( *synp == NULL );
   1156  1.1     lukem 
   1157  1.1     lukem 		*synp = syn_find( syn_map[i].sssm_name );
   1158  1.1     lukem 
   1159  1.1     lukem 		if( *synp == NULL ) {
   1160  1.1     lukem 			fprintf( stderr, "slap_schema_load: Syntax: "
   1161  1.1     lukem 				"No syntax \"%s\" defined in schema\n",
   1162  1.1     lukem 				syn_map[i].sssm_name );
   1163  1.1     lukem 			return LDAP_INVALID_SYNTAX;
   1164  1.1     lukem 		}
   1165  1.1     lukem 	}
   1166  1.1     lukem 
   1167  1.1     lukem 	for( i=0; mr_map[i].ssmm_name; i++ ) {
   1168  1.1     lukem 		MatchingRule ** mrp = (MatchingRule **)
   1169  1.1     lukem 			&(((char *) &slap_schema)[mr_map[i].ssmm_offset]);
   1170  1.1     lukem 
   1171  1.1     lukem 		assert( *mrp == NULL );
   1172  1.1     lukem 
   1173  1.1     lukem 		*mrp = mr_find( mr_map[i].ssmm_name );
   1174  1.1     lukem 
   1175  1.1     lukem 		if( *mrp == NULL ) {
   1176  1.1     lukem 			fprintf( stderr, "slap_schema_load: MatchingRule: "
   1177  1.1     lukem 				"No matching rule \"%s\" defined in schema\n",
   1178  1.1     lukem 				mr_map[i].ssmm_name );
   1179  1.1     lukem 			return LDAP_INAPPROPRIATE_MATCHING;
   1180  1.1     lukem 		}
   1181  1.1     lukem 	}
   1182  1.1     lukem 
   1183  1.1     lukem 	slap_at_undefined.sat_syntax = slap_schema.si_syn_octetString;
   1184  1.1     lukem 	slap_schema.si_at_undefined = &slap_at_undefined;
   1185  1.1     lukem 
   1186  1.1     lukem 	slap_at_proxied.sat_equality = mr_find( "octetStringMatch" );
   1187  1.1     lukem 	slap_at_proxied.sat_approx = mr_find( "octetStringMatch" );
   1188  1.1     lukem 	slap_at_proxied.sat_ordering = mr_find( "octetStringOrderingMatch" );
   1189  1.1     lukem 	slap_at_proxied.sat_substr = mr_find( "octetStringSubstringsMatch" );
   1190  1.1     lukem 	slap_at_proxied.sat_syntax = slap_schema.si_syn_octetString;
   1191  1.1     lukem 	slap_schema.si_at_proxied = &slap_at_proxied;
   1192  1.1     lukem 
   1193  1.2  christos 	ldap_pvt_thread_mutex_init( &ad_index_mutex );
   1194  1.1     lukem 	ldap_pvt_thread_mutex_init( &ad_undef_mutex );
   1195  1.1     lukem 	ldap_pvt_thread_mutex_init( &oc_undef_mutex );
   1196  1.1     lukem 
   1197  1.1     lukem 	for( i=0; ad_map[i].ssam_name; i++ ) {
   1198  1.1     lukem 		assert( ad_map[i].ssam_defn != NULL );
   1199  1.1     lukem 		{
   1200  1.1     lukem 			LDAPAttributeType *at;
   1201  1.1     lukem 			int		code;
   1202  1.1     lukem 			const char	*err;
   1203  1.1     lukem 
   1204  1.1     lukem 			at = ldap_str2attributetype( ad_map[i].ssam_defn,
   1205  1.1     lukem 				&code, &err, LDAP_SCHEMA_ALLOW_ALL );
   1206  1.1     lukem 			if ( !at ) {
   1207  1.1     lukem 				fprintf( stderr,
   1208  1.1     lukem 					"slap_schema_load: AttributeType \"%s\": %s before %s\n",
   1209  1.1     lukem 					 ad_map[i].ssam_name, ldap_scherr2str(code), err );
   1210  1.1     lukem 				return code;
   1211  1.1     lukem 			}
   1212  1.1     lukem 
   1213  1.1     lukem 			if ( at->at_oid == NULL ) {
   1214  1.1     lukem 				fprintf( stderr, "slap_schema_load: "
   1215  1.1     lukem 					"AttributeType \"%s\": no OID\n",
   1216  1.1     lukem 					ad_map[i].ssam_name );
   1217  1.1     lukem 				ldap_attributetype_free( at );
   1218  1.1     lukem 				return LDAP_OTHER;
   1219  1.1     lukem 			}
   1220  1.1     lukem 
   1221  1.1     lukem 			code = at_add( at, 0, NULL, NULL, &err );
   1222  1.1     lukem 			if ( code ) {
   1223  1.1     lukem 				ldap_attributetype_free( at );
   1224  1.1     lukem 				fprintf( stderr, "slap_schema_load: AttributeType "
   1225  1.1     lukem 					"\"%s\": %s: \"%s\"\n",
   1226  1.1     lukem 					 ad_map[i].ssam_name, scherr2str(code), err );
   1227  1.1     lukem 				return code;
   1228  1.1     lukem 			}
   1229  1.1     lukem 			ldap_memfree( at );
   1230  1.1     lukem 		}
   1231  1.1     lukem 		{
   1232  1.1     lukem 			int rc;
   1233  1.1     lukem 			const char *text;
   1234  1.1     lukem 			Syntax *syntax = NULL;
   1235  1.1     lukem 
   1236  1.1     lukem 			AttributeDescription ** adp = (AttributeDescription **)
   1237  1.1     lukem 				&(((char *) &slap_schema)[ad_map[i].ssam_offset]);
   1238  1.1     lukem 
   1239  1.1     lukem 			assert( *adp == NULL );
   1240  1.1     lukem 
   1241  1.1     lukem 			rc = slap_str2ad( ad_map[i].ssam_name, adp, &text );
   1242  1.1     lukem 			if( rc != LDAP_SUCCESS ) {
   1243  1.1     lukem 				fprintf( stderr, "slap_schema_load: AttributeType \"%s\": "
   1244  1.1     lukem 					"not defined in schema\n",
   1245  1.1     lukem 					ad_map[i].ssam_name );
   1246  1.1     lukem 				return rc;
   1247  1.1     lukem 			}
   1248  1.1     lukem 
   1249  1.1     lukem 			if( ad_map[i].ssam_check ) {
   1250  1.1     lukem 				/* install check routine */
   1251  1.1     lukem 				(*adp)->ad_type->sat_check = ad_map[i].ssam_check;
   1252  1.1     lukem 			}
   1253  1.1     lukem 			/* install flags */
   1254  1.1     lukem 			(*adp)->ad_type->sat_flags |= ad_map[i].ssam_flags;
   1255  1.1     lukem 
   1256  1.1     lukem 			/* install custom syntax routines */
   1257  1.1     lukem 			if( ad_map[i].ssam_syn_validate ||
   1258  1.1     lukem 				ad_map[i].ssam_syn_pretty )
   1259  1.1     lukem 			{
   1260  1.1     lukem 				Syntax *syn;
   1261  1.1     lukem 
   1262  1.1     lukem 				syntax = (*adp)->ad_type->sat_syntax;
   1263  1.1     lukem 
   1264  1.1     lukem 				syn = ch_malloc( sizeof( Syntax ) );
   1265  1.1     lukem 				*syn = *syntax;
   1266  1.1     lukem 
   1267  1.1     lukem 				if( ad_map[i].ssam_syn_validate ) {
   1268  1.1     lukem 					syn->ssyn_validate = ad_map[i].ssam_syn_validate;
   1269  1.1     lukem 				}
   1270  1.1     lukem 				if( ad_map[i].ssam_syn_pretty ) {
   1271  1.1     lukem 					syn->ssyn_pretty = ad_map[i].ssam_syn_pretty;
   1272  1.1     lukem 				}
   1273  1.1     lukem 
   1274  1.1     lukem 				(*adp)->ad_type->sat_syntax = syn;
   1275  1.1     lukem 			}
   1276  1.1     lukem 
   1277  1.1     lukem 			/* install custom rule routines */
   1278  1.1     lukem 			if( syntax != NULL ||
   1279  1.1     lukem 				ad_map[i].ssam_mr_convert ||
   1280  1.1     lukem 				ad_map[i].ssam_mr_normalize ||
   1281  1.1     lukem 				ad_map[i].ssam_mr_match ||
   1282  1.1     lukem 				ad_map[i].ssam_mr_indexer ||
   1283  1.1     lukem 				ad_map[i].ssam_mr_filter )
   1284  1.1     lukem 			{
   1285  1.1     lukem 				MatchingRule *mr = ch_malloc( sizeof( MatchingRule ) );
   1286  1.1     lukem 				*mr = *(*adp)->ad_type->sat_equality;
   1287  1.1     lukem 
   1288  1.1     lukem 				if ( syntax != NULL ) {
   1289  1.1     lukem 					mr->smr_syntax = (*adp)->ad_type->sat_syntax;
   1290  1.1     lukem 				}
   1291  1.1     lukem 				if ( ad_map[i].ssam_mr_convert ) {
   1292  1.1     lukem 					mr->smr_convert = ad_map[i].ssam_mr_convert;
   1293  1.1     lukem 				}
   1294  1.1     lukem 				if ( ad_map[i].ssam_mr_normalize ) {
   1295  1.1     lukem 					mr->smr_normalize = ad_map[i].ssam_mr_normalize;
   1296  1.1     lukem 				}
   1297  1.1     lukem 				if ( ad_map[i].ssam_mr_match ) {
   1298  1.1     lukem 					mr->smr_match = ad_map[i].ssam_mr_match;
   1299  1.1     lukem 				}
   1300  1.1     lukem 				if ( ad_map[i].ssam_mr_indexer ) {
   1301  1.1     lukem 					mr->smr_indexer = ad_map[i].ssam_mr_indexer;
   1302  1.1     lukem 				}
   1303  1.1     lukem 				if ( ad_map[i].ssam_mr_filter ) {
   1304  1.1     lukem 					mr->smr_filter = ad_map[i].ssam_mr_filter;
   1305  1.1     lukem 				}
   1306  1.1     lukem 
   1307  1.1     lukem 				(*adp)->ad_type->sat_equality = mr;
   1308  1.1     lukem 			}
   1309  1.1     lukem 		}
   1310  1.1     lukem 	}
   1311  1.1     lukem 
   1312  1.1     lukem 	for( i=0; oc_map[i].ssom_name; i++ ) {
   1313  1.1     lukem 		assert( oc_map[i].ssom_defn != NULL );
   1314  1.1     lukem 		{
   1315  1.1     lukem 			LDAPObjectClass *oc;
   1316  1.1     lukem 			int		code;
   1317  1.1     lukem 			const char	*err;
   1318  1.1     lukem 
   1319  1.1     lukem 			oc = ldap_str2objectclass( oc_map[i].ssom_defn, &code, &err,
   1320  1.1     lukem 				LDAP_SCHEMA_ALLOW_ALL );
   1321  1.1     lukem 			if ( !oc ) {
   1322  1.1     lukem 				fprintf( stderr, "slap_schema_load: ObjectClass "
   1323  1.1     lukem 					"\"%s\": %s before %s\n",
   1324  1.1     lukem 				 	oc_map[i].ssom_name, ldap_scherr2str(code), err );
   1325  1.1     lukem 				return code;
   1326  1.1     lukem 			}
   1327  1.1     lukem 
   1328  1.1     lukem 			if ( oc->oc_oid == NULL ) {
   1329  1.1     lukem 				fprintf( stderr, "slap_schema_load: ObjectClass "
   1330  1.1     lukem 					"\"%s\": no OID\n",
   1331  1.1     lukem 					oc_map[i].ssom_name );
   1332  1.1     lukem 				ldap_objectclass_free( oc );
   1333  1.1     lukem 				return LDAP_OTHER;
   1334  1.1     lukem 			}
   1335  1.1     lukem 
   1336  1.1     lukem 			code = oc_add(oc,0,NULL,NULL,&err);
   1337  1.1     lukem 			if ( code ) {
   1338  1.1     lukem 				ldap_objectclass_free( oc );
   1339  1.1     lukem 				fprintf( stderr, "slap_schema_load: ObjectClass "
   1340  1.1     lukem 					"\"%s\": %s: \"%s\"\n",
   1341  1.1     lukem 				 	oc_map[i].ssom_name, scherr2str(code), err);
   1342  1.1     lukem 				return code;
   1343  1.1     lukem 			}
   1344  1.1     lukem 			ldap_memfree(oc);
   1345  1.1     lukem 
   1346  1.1     lukem 		}
   1347  1.1     lukem 		{
   1348  1.1     lukem 			ObjectClass ** ocp = (ObjectClass **)
   1349  1.1     lukem 				&(((char *) &slap_schema)[oc_map[i].ssom_offset]);
   1350  1.1     lukem 
   1351  1.1     lukem 			assert( *ocp == NULL );
   1352  1.1     lukem 
   1353  1.1     lukem 			*ocp = oc_find( oc_map[i].ssom_name );
   1354  1.1     lukem 			if( *ocp == NULL ) {
   1355  1.1     lukem 				fprintf( stderr, "slap_schema_load: "
   1356  1.1     lukem 					"ObjectClass \"%s\": not defined in schema\n",
   1357  1.1     lukem 					oc_map[i].ssom_name );
   1358  1.1     lukem 				return LDAP_OBJECT_CLASS_VIOLATION;
   1359  1.1     lukem 			}
   1360  1.1     lukem 
   1361  1.1     lukem 			if( oc_map[i].ssom_check ) {
   1362  1.1     lukem 				/* install check routine */
   1363  1.1     lukem 				(*ocp)->soc_check = oc_map[i].ssom_check;
   1364  1.1     lukem 			}
   1365  1.1     lukem 			/* install flags */
   1366  1.1     lukem 			(*ocp)->soc_flags |= oc_map[i].ssom_flags;
   1367  1.1     lukem 		}
   1368  1.1     lukem 	}
   1369  1.1     lukem 
   1370  1.1     lukem 	return LDAP_SUCCESS;
   1371  1.1     lukem }
   1372  1.1     lukem 
   1373  1.1     lukem int
   1374  1.1     lukem slap_schema_check( void )
   1375  1.1     lukem {
   1376  1.1     lukem 	/* we should only be called once after schema_init() was called */
   1377  1.1     lukem 	assert( schema_init_done == 1 );
   1378  1.1     lukem 
   1379  1.1     lukem 	/*
   1380  1.1     lukem 	 * cycle thru attributeTypes to build matchingRuleUse
   1381  1.1     lukem 	 */
   1382  1.1     lukem 	if ( matching_rule_use_init() ) {
   1383  1.1     lukem 		return LDAP_OTHER;
   1384  1.1     lukem 	}
   1385  1.1     lukem 
   1386  1.1     lukem 	++schema_init_done;
   1387  1.1     lukem 	return LDAP_SUCCESS;
   1388  1.1     lukem }
   1389  1.1     lukem 
   1390  1.1     lukem static int rootDseObjectClass (
   1391  1.1     lukem 	Backend *be,
   1392  1.1     lukem 	Entry *e,
   1393  1.1     lukem 	ObjectClass *oc,
   1394  1.1     lukem 	const char** text,
   1395  1.1     lukem 	char *textbuf, size_t textlen )
   1396  1.1     lukem {
   1397  1.1     lukem 	*text = textbuf;
   1398  1.1     lukem 
   1399  1.1     lukem 	if( e->e_nname.bv_len ) {
   1400  1.1     lukem 		snprintf( textbuf, textlen,
   1401  1.1     lukem 			"objectClass \"%s\" only allowed in the root DSE",
   1402  1.1     lukem 			oc->soc_oid );
   1403  1.1     lukem 		return LDAP_OBJECT_CLASS_VIOLATION;
   1404  1.1     lukem 	}
   1405  1.1     lukem 
   1406  1.1     lukem 	/* we should not be called for the root DSE */
   1407  1.1     lukem 	assert( 0 );
   1408  1.1     lukem 	return LDAP_SUCCESS;
   1409  1.1     lukem }
   1410  1.1     lukem 
   1411  1.1     lukem static int aliasObjectClass (
   1412  1.1     lukem 	Backend *be,
   1413  1.1     lukem 	Entry *e,
   1414  1.1     lukem 	ObjectClass *oc,
   1415  1.1     lukem 	const char** text,
   1416  1.1     lukem 	char *textbuf, size_t textlen )
   1417  1.1     lukem {
   1418  1.1     lukem 	*text = textbuf;
   1419  1.1     lukem 
   1420  1.1     lukem 	if( !SLAP_ALIASES(be) ) {
   1421  1.1     lukem 		snprintf( textbuf, textlen,
   1422  1.1     lukem 			"objectClass \"%s\" not supported in context",
   1423  1.1     lukem 			oc->soc_oid );
   1424  1.1     lukem 		return LDAP_OBJECT_CLASS_VIOLATION;
   1425  1.1     lukem 	}
   1426  1.1     lukem 
   1427  1.1     lukem 	return LDAP_SUCCESS;
   1428  1.1     lukem }
   1429  1.1     lukem 
   1430  1.1     lukem static int referralObjectClass (
   1431  1.1     lukem 	Backend *be,
   1432  1.1     lukem 	Entry *e,
   1433  1.1     lukem 	ObjectClass *oc,
   1434  1.1     lukem 	const char** text,
   1435  1.1     lukem 	char *textbuf, size_t textlen )
   1436  1.1     lukem {
   1437  1.1     lukem 	*text = textbuf;
   1438  1.1     lukem 
   1439  1.1     lukem 	if( !SLAP_REFERRALS(be) ) {
   1440  1.1     lukem 		snprintf( textbuf, textlen,
   1441  1.1     lukem 			"objectClass \"%s\" not supported in context",
   1442  1.1     lukem 			oc->soc_oid );
   1443  1.1     lukem 		return LDAP_OBJECT_CLASS_VIOLATION;
   1444  1.1     lukem 	}
   1445  1.1     lukem 
   1446  1.1     lukem 	return LDAP_SUCCESS;
   1447  1.1     lukem }
   1448  1.1     lukem 
   1449  1.1     lukem static int subentryObjectClass (
   1450  1.1     lukem 	Backend *be,
   1451  1.1     lukem 	Entry *e,
   1452  1.1     lukem 	ObjectClass *oc,
   1453  1.1     lukem 	const char** text,
   1454  1.1     lukem 	char *textbuf, size_t textlen )
   1455  1.1     lukem {
   1456  1.1     lukem 	*text = textbuf;
   1457  1.1     lukem 
   1458  1.1     lukem 	if( !SLAP_SUBENTRIES(be) ) {
   1459  1.1     lukem 		snprintf( textbuf, textlen,
   1460  1.1     lukem 			"objectClass \"%s\" not supported in context",
   1461  1.1     lukem 			oc->soc_oid );
   1462  1.1     lukem 		return LDAP_OBJECT_CLASS_VIOLATION;
   1463  1.1     lukem 	}
   1464  1.1     lukem 
   1465  1.1     lukem 	if( oc != slap_schema.si_oc_subentry && !is_entry_subentry( e ) ) {
   1466  1.1     lukem 		snprintf( textbuf, textlen,
   1467  1.1     lukem 			"objectClass \"%s\" only allowed in subentries",
   1468  1.1     lukem 			oc->soc_oid );
   1469  1.1     lukem 		return LDAP_OBJECT_CLASS_VIOLATION;
   1470  1.1     lukem 	}
   1471  1.1     lukem 
   1472  1.1     lukem 	return LDAP_SUCCESS;
   1473  1.1     lukem }
   1474  1.1     lukem 
   1475  1.1     lukem #ifdef LDAP_DYNAMIC_OBJECTS
   1476  1.1     lukem static int dynamicObjectClass (
   1477  1.1     lukem 	Backend *be,
   1478  1.1     lukem 	Entry *e,
   1479  1.1     lukem 	ObjectClass *oc,
   1480  1.1     lukem 	const char** text,
   1481  1.1     lukem 	char *textbuf, size_t textlen )
   1482  1.1     lukem {
   1483  1.1     lukem 	*text = textbuf;
   1484  1.1     lukem 
   1485  1.1     lukem 	if( !SLAP_DYNAMIC(be) ) {
   1486  1.1     lukem 		snprintf( textbuf, textlen,
   1487  1.1     lukem 			"objectClass \"%s\" not supported in context",
   1488  1.1     lukem 			oc->soc_oid );
   1489  1.1     lukem 		return LDAP_OBJECT_CLASS_VIOLATION;
   1490  1.1     lukem 	}
   1491  1.1     lukem 
   1492  1.1     lukem 	return LDAP_SUCCESS;
   1493  1.1     lukem }
   1494  1.1     lukem #endif /* LDAP_DYNAMIC_OBJECTS */
   1495  1.1     lukem 
   1496  1.1     lukem static int rootDseAttribute (
   1497  1.1     lukem 	Backend *be,
   1498  1.1     lukem 	Entry *e,
   1499  1.1     lukem 	Attribute *attr,
   1500  1.1     lukem 	const char** text,
   1501  1.1     lukem 	char *textbuf, size_t textlen )
   1502  1.1     lukem {
   1503  1.1     lukem 	*text = textbuf;
   1504  1.1     lukem 
   1505  1.1     lukem 	if( e->e_nname.bv_len ) {
   1506  1.1     lukem 		snprintf( textbuf, textlen,
   1507  1.1     lukem 			"attribute \"%s\" only allowed in the root DSE",
   1508  1.1     lukem 			attr->a_desc->ad_cname.bv_val );
   1509  1.1     lukem 		return LDAP_OBJECT_CLASS_VIOLATION;
   1510  1.1     lukem 	}
   1511  1.1     lukem 
   1512  1.1     lukem 	/* we should not be called for the root DSE */
   1513  1.1     lukem 	assert( 0 );
   1514  1.1     lukem 	return LDAP_SUCCESS;
   1515  1.1     lukem }
   1516  1.1     lukem 
   1517  1.1     lukem static int aliasAttribute (
   1518  1.1     lukem 	Backend *be,
   1519  1.1     lukem 	Entry *e,
   1520  1.1     lukem 	Attribute *attr,
   1521  1.1     lukem 	const char** text,
   1522  1.1     lukem 	char *textbuf, size_t textlen )
   1523  1.1     lukem {
   1524  1.1     lukem 	*text = textbuf;
   1525  1.1     lukem 
   1526  1.1     lukem 	if( !SLAP_ALIASES(be) ) {
   1527  1.1     lukem 		snprintf( textbuf, textlen,
   1528  1.1     lukem 			"attribute \"%s\" not supported in context",
   1529  1.1     lukem 			attr->a_desc->ad_cname.bv_val );
   1530  1.1     lukem 		return LDAP_OBJECT_CLASS_VIOLATION;
   1531  1.1     lukem 	}
   1532  1.1     lukem 
   1533  1.1     lukem 	if( !is_entry_alias( e ) ) {
   1534  1.1     lukem 		snprintf( textbuf, textlen,
   1535  1.1     lukem 			"attribute \"%s\" only allowed in the alias",
   1536  1.1     lukem 			attr->a_desc->ad_cname.bv_val );
   1537  1.1     lukem 		return LDAP_OBJECT_CLASS_VIOLATION;
   1538  1.1     lukem 	}
   1539  1.1     lukem 
   1540  1.1     lukem 	return LDAP_SUCCESS;
   1541  1.1     lukem }
   1542  1.1     lukem 
   1543  1.1     lukem static int referralAttribute (
   1544  1.1     lukem 	Backend *be,
   1545  1.1     lukem 	Entry *e,
   1546  1.1     lukem 	Attribute *attr,
   1547  1.1     lukem 	const char** text,
   1548  1.1     lukem 	char *textbuf, size_t textlen )
   1549  1.1     lukem {
   1550  1.1     lukem 	*text = textbuf;
   1551  1.1     lukem 
   1552  1.1     lukem 	if( !SLAP_REFERRALS(be) ) {
   1553  1.1     lukem 		snprintf( textbuf, textlen,
   1554  1.1     lukem 			"attribute \"%s\" not supported in context",
   1555  1.1     lukem 			attr->a_desc->ad_cname.bv_val );
   1556  1.1     lukem 		return LDAP_OBJECT_CLASS_VIOLATION;
   1557  1.1     lukem 	}
   1558  1.1     lukem 
   1559  1.1     lukem 	if( !is_entry_referral( e ) ) {
   1560  1.1     lukem 		snprintf( textbuf, textlen,
   1561  1.1     lukem 			"attribute \"%s\" only allowed in the referral",
   1562  1.1     lukem 			attr->a_desc->ad_cname.bv_val );
   1563  1.1     lukem 		return LDAP_OBJECT_CLASS_VIOLATION;
   1564  1.1     lukem 	}
   1565  1.1     lukem 
   1566  1.1     lukem 	return LDAP_SUCCESS;
   1567  1.1     lukem }
   1568  1.1     lukem 
   1569  1.1     lukem static int subentryAttribute (
   1570  1.1     lukem 	Backend *be,
   1571  1.1     lukem 	Entry *e,
   1572  1.1     lukem 	Attribute *attr,
   1573  1.1     lukem 	const char** text,
   1574  1.1     lukem 	char *textbuf, size_t textlen )
   1575  1.1     lukem {
   1576  1.1     lukem 	*text = textbuf;
   1577  1.1     lukem 
   1578  1.1     lukem 	if( !SLAP_SUBENTRIES(be) ) {
   1579  1.1     lukem 		snprintf( textbuf, textlen,
   1580  1.1     lukem 			"attribute \"%s\" not supported in context",
   1581  1.1     lukem 			attr->a_desc->ad_cname.bv_val );
   1582  1.1     lukem 		return LDAP_OBJECT_CLASS_VIOLATION;
   1583  1.1     lukem 	}
   1584  1.1     lukem 
   1585  1.1     lukem 	if( !is_entry_subentry( e ) ) {
   1586  1.1     lukem 		snprintf( textbuf, textlen,
   1587  1.1     lukem 			"attribute \"%s\" only allowed in the subentry",
   1588  1.1     lukem 			attr->a_desc->ad_cname.bv_val );
   1589  1.1     lukem 		return LDAP_OBJECT_CLASS_VIOLATION;
   1590  1.1     lukem 	}
   1591  1.1     lukem 
   1592  1.1     lukem 	return LDAP_SUCCESS;
   1593  1.1     lukem }
   1594  1.1     lukem 
   1595  1.1     lukem static int administrativeRoleAttribute (
   1596  1.1     lukem 	Backend *be,
   1597  1.1     lukem 	Entry *e,
   1598  1.1     lukem 	Attribute *attr,
   1599  1.1     lukem 	const char** text,
   1600  1.1     lukem 	char *textbuf, size_t textlen )
   1601  1.1     lukem {
   1602  1.1     lukem 	*text = textbuf;
   1603  1.1     lukem 
   1604  1.1     lukem 	if( !SLAP_SUBENTRIES(be) ) {
   1605  1.1     lukem 		snprintf( textbuf, textlen,
   1606  1.1     lukem 			"attribute \"%s\" not supported in context",
   1607  1.1     lukem 			attr->a_desc->ad_cname.bv_val );
   1608  1.1     lukem 		return LDAP_OBJECT_CLASS_VIOLATION;
   1609  1.1     lukem 	}
   1610  1.1     lukem 
   1611  1.1     lukem 	snprintf( textbuf, textlen,
   1612  1.1     lukem 		"attribute \"%s\" not supported!",
   1613  1.1     lukem 		attr->a_desc->ad_cname.bv_val );
   1614  1.1     lukem 	return LDAP_OBJECT_CLASS_VIOLATION;
   1615  1.1     lukem }
   1616  1.1     lukem 
   1617  1.1     lukem #ifdef LDAP_DYNAMIC_OBJECTS
   1618  1.1     lukem static int dynamicAttribute (
   1619  1.1     lukem 	Backend *be,
   1620  1.1     lukem 	Entry *e,
   1621  1.1     lukem 	Attribute *attr,
   1622  1.1     lukem 	const char** text,
   1623  1.1     lukem 	char *textbuf, size_t textlen )
   1624  1.1     lukem {
   1625  1.1     lukem 	*text = textbuf;
   1626  1.1     lukem 
   1627  1.1     lukem 	if( !SLAP_DYNAMIC(be) ) {
   1628  1.1     lukem 		snprintf( textbuf, textlen,
   1629  1.1     lukem 			"attribute \"%s\" not supported in context",
   1630  1.1     lukem 			attr->a_desc->ad_cname.bv_val );
   1631  1.1     lukem 		return LDAP_OBJECT_CLASS_VIOLATION;
   1632  1.1     lukem 	}
   1633  1.1     lukem 
   1634  1.1     lukem 	if( !is_entry_dynamicObject( e ) ) {
   1635  1.1     lukem 		snprintf( textbuf, textlen,
   1636  1.1     lukem 			"attribute \"%s\" only allowed in dynamic object",
   1637  1.1     lukem 			attr->a_desc->ad_cname.bv_val );
   1638  1.1     lukem 		return LDAP_OBJECT_CLASS_VIOLATION;
   1639  1.1     lukem 	}
   1640  1.1     lukem 
   1641  1.1     lukem 	return LDAP_SUCCESS;
   1642  1.1     lukem }
   1643  1.1     lukem #endif /* LDAP_DYNAMIC_OBJECTS */
   1644