]> git.sur5r.net Git - openldap/blob - servers/slapd/schema_prep.c
Extend objectClassMatch to return true if asserted class is a
[openldap] / servers / slapd / schema_prep.c
1 /* schema_init.c - init builtin schema */
2 /* $OpenLDAP$ */
3 /*
4  * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
5  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
6  */
7
8 #include "portable.h"
9
10 #include <stdio.h>
11
12 #include <ac/ctype.h>
13 #include <ac/string.h>
14 #include <ac/socket.h>
15
16 #include "slap.h"
17 #include "ldap_pvt.h"
18
19 int schema_init_done = 0;
20
21 struct slap_internal_schema slap_schema;
22
23 #define objectClassIndexer NULL
24 #define objectClassFilter NULL
25
26 static int
27 objectClassMatch(
28         int *matchp,
29         unsigned use,
30         Syntax *syntax,
31         MatchingRule *mr,
32         struct berval *value,
33         void *assertedValue )
34 {
35         struct berval *a = (struct berval *) assertedValue;
36         ObjectClass *oc = oc_find( value->bv_val );
37         ObjectClass *asserted = oc_find( a->bv_val );
38
39         if( asserted == NULL || oc == NULL ) {
40                 return LDAP_CONSTRAINT_VIOLATION;
41         }
42
43 #if 0
44         Debug( LDAP_DEBUG_TRACE, "objectClassMatch(%s,%s)\n",
45                 value->bv_val, a->bv_val, NULL );
46 #endif
47
48         *matchp = !is_object_subclass( asserted, oc );
49
50         Debug( LDAP_DEBUG_TRACE, "\treturns %d\n",
51                 *matchp, NULL, NULL );
52
53         return LDAP_SUCCESS;
54 }
55
56 struct slap_schema_oc_map {
57         char *ssom_name;
58         size_t ssom_offset;
59 } oc_map[] = {
60         { "top", offsetof(struct slap_internal_schema, si_oc_top) },
61         { "extensibleObject", offsetof(struct slap_internal_schema, si_oc_extensibleObject) },
62         { "alias", offsetof(struct slap_internal_schema, si_oc_alias) },
63         { "referral", offsetof(struct slap_internal_schema, si_oc_referral) },
64         { "LDAProotDSE", offsetof(struct slap_internal_schema, si_oc_rootdse) },
65         { "LDAPsubentry", offsetof(struct slap_internal_schema, si_oc_subentry) },
66         { "subschema", offsetof(struct slap_internal_schema, si_oc_subschema) },
67         { NULL, 0 }
68 };
69
70 struct slap_schema_ad_map {
71         char *ssam_name;
72         slap_mr_match_func *ssam_match;
73         slap_mr_indexer_func *ssam_indexer;
74         slap_mr_filter_func *ssam_filter;
75         size_t ssam_offset;
76 } ad_map[] = {
77         { "objectClass",
78                 objectClassMatch, objectClassIndexer, objectClassFilter,
79                 offsetof(struct slap_internal_schema, si_ad_objectClass) },
80
81         /* user entry operational attributes */
82         { "creatorsName", NULL, NULL, NULL,
83                 offsetof(struct slap_internal_schema, si_ad_creatorsName) },
84         { "createTimestamp", NULL, NULL, NULL,
85                 offsetof(struct slap_internal_schema, si_ad_createTimestamp) },
86         { "modifiersName", NULL, NULL, NULL,
87                 offsetof(struct slap_internal_schema, si_ad_modifiersName) },
88         { "modifyTimestamp", NULL, NULL, NULL,
89                 offsetof(struct slap_internal_schema, si_ad_modifyTimestamp) },
90         { "subschemaSubentry", NULL, NULL, NULL,
91                 offsetof(struct slap_internal_schema, si_ad_subschemaSubentry) },
92
93         /* root DSE attributes */
94         { "namingContexts", NULL, NULL, NULL,
95                 offsetof(struct slap_internal_schema, si_ad_namingContexts) },
96         { "supportedControl", NULL, NULL, NULL,
97                 offsetof(struct slap_internal_schema, si_ad_supportedControl) },
98         { "supportedExtension", NULL, NULL, NULL,
99                 offsetof(struct slap_internal_schema, si_ad_supportedExtension) },
100         { "supportedLDAPVersion", NULL, NULL, NULL,
101                 offsetof(struct slap_internal_schema, si_ad_supportedLDAPVersion) },
102         { "supportedSASLMechanisms", NULL, NULL, NULL,
103                 offsetof(struct slap_internal_schema, si_ad_supportedSASLMechanisms) },
104
105         /* subschema subentry attributes */
106         { "attributeTypes", NULL, NULL, NULL,
107                 offsetof(struct slap_internal_schema, si_ad_attributeTypes) },
108         { "ldapSyntaxes", NULL, NULL, NULL,
109                 offsetof(struct slap_internal_schema, si_ad_ldapSyntaxes) },
110         { "matchingRules", NULL, NULL, NULL,
111                 offsetof(struct slap_internal_schema, si_ad_matchingRules) },
112         { "objectClasses", NULL, NULL, NULL,
113                 offsetof(struct slap_internal_schema, si_ad_objectClasses) },
114
115         /* knowledge information */
116         { "aliasedObjectName", NULL, NULL, NULL,
117                 offsetof(struct slap_internal_schema, si_ad_aliasedObjectName) },
118         { "ref", NULL, NULL, NULL,
119                 offsetof(struct slap_internal_schema, si_ad_ref) },
120
121         /* access control internals */
122         { "entry", NULL, NULL, NULL,
123                 offsetof(struct slap_internal_schema, si_ad_entry) },
124         { "children", NULL, NULL, NULL,
125                 offsetof(struct slap_internal_schema, si_ad_children) },
126 #ifdef SLAPD_ACI_ENABLED
127         { "OpenLDAPaci", NULL, NULL, NULL,
128                 offsetof(struct slap_internal_schema, si_ad_aci) },
129 #endif
130
131         { "userPassword", NULL, NULL, NULL,
132                 offsetof(struct slap_internal_schema, si_ad_userPassword) },
133         { "authPassword", NULL, NULL, NULL,
134                 offsetof(struct slap_internal_schema, si_ad_authPassword) },
135 #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND
136         { "krbName", NULL, NULL, NULL,
137                 offsetof(struct slap_internal_schema, si_ad_krbName) },
138 #endif
139
140         { NULL, NULL, NULL, NULL, 0 }
141 };
142
143
144 int
145 schema_prep( void )
146 {
147         int i;
148         /* we should only be called once after schema_init() was called */
149         assert( schema_init_done == 1 );
150
151         for( i=0; oc_map[i].ssom_name; i++ ) {
152                 ObjectClass ** ocp = (ObjectClass **)
153                         &(((char *) &slap_schema)[oc_map[i].ssom_offset]);
154
155                 *ocp = oc_find( oc_map[i].ssom_name );
156
157                 if( *ocp == NULL ) {
158                         fprintf( stderr,
159                                 "No objectClass \"%s\" defined in schema\n",
160                                 oc_map[i].ssom_name );
161                         return LDAP_OBJECT_CLASS_VIOLATION;
162                 }
163         }
164
165         for( i=0; ad_map[i].ssam_name; i++ ) {
166                 int rc;
167                 const char *text;
168
169                 AttributeDescription ** adp = (AttributeDescription **)
170                         &(((char *) &slap_schema)[ad_map[i].ssam_offset]);
171
172                 *adp = NULL;
173
174                 rc = slap_str2ad( ad_map[i].ssam_name, adp, &text );
175
176                 if( rc != LDAP_SUCCESS ) {
177                         fprintf( stderr,
178                                 "No attribute \"%s\" defined in schema\n",
179                                 ad_map[i].ssam_name );
180                         return rc;
181                 }
182
183                 if( ad_map[i].ssam_match ) {
184                         /* install custom matching routine */
185                         (*adp)->ad_type->sat_equality->smr_match = ad_map[i].ssam_match;
186                 }
187         }
188
189         ++schema_init_done;
190         return LDAP_SUCCESS;
191 }