1 /* schema_init.c - init builtin schema */
4 * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
5 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
13 #include <ac/string.h>
14 #include <ac/socket.h>
19 int schema_init_done = 0;
21 struct slap_internal_schema slap_schema;
23 #define objectClassIndexer NULL
24 #define objectClassFilter NULL
35 struct berval *a = (struct berval *) assertedValue;
36 ObjectClass *oc = oc_find( value->bv_val );
37 ObjectClass *asserted = oc_find( a->bv_val );
39 if( asserted == NULL ) {
40 if( OID_LEADCHAR( *a->bv_val ) ) {
41 /* OID form, return FALSE */
46 /* desc form, return undefined */
47 return SLAPD_COMPARE_UNDEFINED;
51 /* unrecognized stored value */
52 return SLAPD_COMPARE_UNDEFINED;
55 if( flags & SLAP_MR_MODIFY_MATCHING ) {
56 *matchp = ( asserted != oc );
58 *matchp = !is_object_subclass( asserted, oc );
62 Debug( LDAP_DEBUG_TRACE, "objectClassMatch(%s,%s) = %d\n",
63 value->bv_val, a->bv_val, *matchp );
69 #define structuralObjectClassIndexer NULL
70 #define structuralObjectClassFilter NULL
73 structuralObjectClassMatch(
81 struct berval *a = (struct berval *) assertedValue;
82 ObjectClass *oc = oc_find( value->bv_val );
83 ObjectClass *asserted = oc_find( a->bv_val );
85 if( asserted == NULL ) {
86 if( OID_LEADCHAR( *a->bv_val ) ) {
87 /* OID form, return FALSE */
92 /* desc form, return undefined */
93 return SLAPD_COMPARE_UNDEFINED;
97 /* unrecognized stored value */
98 return SLAPD_COMPARE_UNDEFINED;
101 *matchp = ( asserted != oc );
104 Debug( LDAP_DEBUG_TRACE, "structuralObjectClassMatch(%s,%s) = %d\n",
105 value->bv_val, a->bv_val, *matchp );
111 struct slap_schema_oc_map {
115 { "top", offsetof(struct slap_internal_schema, si_oc_top) },
116 { "extensibleObject", offsetof(struct slap_internal_schema, si_oc_extensibleObject) },
117 { "alias", offsetof(struct slap_internal_schema, si_oc_alias) },
118 { "referral", offsetof(struct slap_internal_schema, si_oc_referral) },
119 { "LDAProotDSE", offsetof(struct slap_internal_schema, si_oc_rootdse) },
120 { "LDAPsubentry", offsetof(struct slap_internal_schema, si_oc_subentry) },
121 { "subschema", offsetof(struct slap_internal_schema, si_oc_subschema) },
125 struct slap_schema_ad_map {
127 slap_mr_match_func *ssam_match;
128 slap_mr_indexer_func *ssam_indexer;
129 slap_mr_filter_func *ssam_filter;
133 objectClassMatch, objectClassIndexer, objectClassFilter,
134 offsetof(struct slap_internal_schema, si_ad_objectClass) },
135 { "structuralObjectClass",
136 structuralObjectClassMatch,
137 structuralObjectClassIndexer, structuralObjectClassFilter,
138 offsetof(struct slap_internal_schema, si_ad_structuralObjectClass) },
140 /* user entry operational attributes */
141 { "creatorsName", NULL, NULL, NULL,
142 offsetof(struct slap_internal_schema, si_ad_creatorsName) },
143 { "createTimestamp", NULL, NULL, NULL,
144 offsetof(struct slap_internal_schema, si_ad_createTimestamp) },
145 { "modifiersName", NULL, NULL, NULL,
146 offsetof(struct slap_internal_schema, si_ad_modifiersName) },
147 { "modifyTimestamp", NULL, NULL, NULL,
148 offsetof(struct slap_internal_schema, si_ad_modifyTimestamp) },
149 { "subschemaSubentry", NULL, NULL, NULL,
150 offsetof(struct slap_internal_schema, si_ad_subschemaSubentry) },
152 /* root DSE attributes */
153 { "namingContexts", NULL, NULL, NULL,
154 offsetof(struct slap_internal_schema, si_ad_namingContexts) },
155 { "supportedControl", NULL, NULL, NULL,
156 offsetof(struct slap_internal_schema, si_ad_supportedControl) },
157 { "supportedExtension", NULL, NULL, NULL,
158 offsetof(struct slap_internal_schema, si_ad_supportedExtension) },
159 { "supportedLDAPVersion", NULL, NULL, NULL,
160 offsetof(struct slap_internal_schema, si_ad_supportedLDAPVersion) },
161 { "supportedSASLMechanisms", NULL, NULL, NULL,
162 offsetof(struct slap_internal_schema, si_ad_supportedSASLMechanisms) },
164 /* subschema subentry attributes */
165 { "attributeTypes", NULL, NULL, NULL,
166 offsetof(struct slap_internal_schema, si_ad_attributeTypes) },
167 { "ldapSyntaxes", NULL, NULL, NULL,
168 offsetof(struct slap_internal_schema, si_ad_ldapSyntaxes) },
169 { "matchingRules", NULL, NULL, NULL,
170 offsetof(struct slap_internal_schema, si_ad_matchingRules) },
171 { "objectClasses", NULL, NULL, NULL,
172 offsetof(struct slap_internal_schema, si_ad_objectClasses) },
174 /* knowledge information */
175 { "aliasedObjectName", NULL, NULL, NULL,
176 offsetof(struct slap_internal_schema, si_ad_aliasedObjectName) },
177 { "ref", NULL, NULL, NULL,
178 offsetof(struct slap_internal_schema, si_ad_ref) },
180 /* access control internals */
181 { "entry", NULL, NULL, NULL,
182 offsetof(struct slap_internal_schema, si_ad_entry) },
183 { "children", NULL, NULL, NULL,
184 offsetof(struct slap_internal_schema, si_ad_children) },
185 #ifdef SLAPD_ACI_ENABLED
186 { "OpenLDAPaci", NULL, NULL, NULL,
187 offsetof(struct slap_internal_schema, si_ad_aci) },
190 { "userPassword", NULL, NULL, NULL,
191 offsetof(struct slap_internal_schema, si_ad_userPassword) },
192 #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND
193 { "krbName", NULL, NULL, NULL,
194 offsetof(struct slap_internal_schema, si_ad_krbName) },
197 { NULL, NULL, NULL, NULL, 0 }
200 static AttributeType slap_at_undefined = {
201 "UNDEFINED", /* cname */
202 { "1.1.1", NULL, NULL, 1, NULL,
203 NULL, NULL, NULL, NULL,
207 NULL, NULL, NULL, NULL, /* matching rules */
208 NULL, /* syntax (this may need to be defined) */
216 /* we should only be called once after schema_init() was called */
217 assert( schema_init_done == 1 );
219 for( i=0; oc_map[i].ssom_name; i++ ) {
220 ObjectClass ** ocp = (ObjectClass **)
221 &(((char *) &slap_schema)[oc_map[i].ssom_offset]);
223 *ocp = oc_find( oc_map[i].ssom_name );
227 "No objectClass \"%s\" defined in schema\n",
228 oc_map[i].ssom_name );
229 return LDAP_OBJECT_CLASS_VIOLATION;
233 for( i=0; ad_map[i].ssam_name; i++ ) {
237 AttributeDescription ** adp = (AttributeDescription **)
238 &(((char *) &slap_schema)[ad_map[i].ssam_offset]);
242 rc = slap_str2ad( ad_map[i].ssam_name, adp, &text );
244 if( rc != LDAP_SUCCESS ) {
246 "No attribute \"%s\" defined in schema\n",
247 ad_map[i].ssam_name );
251 if( ad_map[i].ssam_match ) {
252 /* install custom matching routine */
253 (*adp)->ad_type->sat_equality->smr_match = ad_map[i].ssam_match;
257 slap_at_undefined.sat_syntax = syn_find( SLAPD_OCTETSTRING_SYNTAX );
258 if( slap_at_undefined.sat_syntax == NULL ) {
260 "No octetString syntax \"" SLAPD_OCTETSTRING_SYNTAX "\"\n" );
261 return LDAP_INVALID_SYNTAX;
263 slap_schema.si_at_undefined = &slap_at_undefined;