2 Unix SMB/CIFS Implementation.
5 Copyright (C) Stefan Metzmacher <metze@samba.org> 2006
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #ifndef _DSDB_SCHEMA_H
23 #define _DSDB_SCHEMA_H
25 #include "prefixmap.h"
35 struct dsdb_attribute;
40 struct dsdb_syntax_ctx {
41 struct ldb_context *ldb;
42 const struct dsdb_schema *schema;
44 /* set when converting objects under Schema NC */
47 /* remote prefixMap to be used for drsuapi_to_ldb conversions */
48 const struct dsdb_schema_prefixmap *pfm_remote;
56 struct ldb_val oMObjectClass;
57 const char *attributeSyntax_oid;
59 const char *substring;
61 const char *ldb_syntax;
63 WERROR (*drsuapi_to_ldb)(const struct dsdb_syntax_ctx *ctx,
64 const struct dsdb_attribute *attr,
65 const struct drsuapi_DsReplicaAttribute *in,
67 struct ldb_message_element *out);
68 WERROR (*ldb_to_drsuapi)(const struct dsdb_syntax_ctx *ctx,
69 const struct dsdb_attribute *attr,
70 const struct ldb_message_element *in,
72 struct drsuapi_DsReplicaAttribute *out);
73 WERROR (*validate_ldb)(const struct dsdb_syntax_ctx *ctx,
74 const struct dsdb_attribute *attr,
75 const struct ldb_message_element *in);
77 bool userParameters; /* Indicates the syntax userParameters should be forced to */
80 struct dsdb_attribute {
81 struct dsdb_attribute *prev, *next;
84 const char *lDAPDisplayName;
85 const char *attributeID_oid;
86 uint32_t attributeID_id;
87 struct GUID schemaIDGUID;
91 struct GUID attributeSecurityGUID;
92 struct GUID objectGUID;
96 bool isMemberOfPartialAttributeSet;
99 const char *attributeSyntax_oid;
100 uint32_t attributeSyntax_id;
102 struct ldb_val oMObjectClass;
105 uint32_t *rangeLower;
106 uint32_t *rangeUpper;
107 bool extendedCharsAllowed;
109 uint32_t schemaFlagsEx;
110 struct ldb_val msDs_Schema_Extensions;
112 bool showInAdvancedViewOnly;
113 const char *adminDisplayName;
114 const char *adminDescription;
115 const char *classDisplayName;
121 bool bl_maybe_invisible;
122 enum dsdb_dn_format dn_format;
125 const struct dsdb_syntax *syntax;
126 const struct ldb_schema_attribute *ldb_schema_attribute;
130 struct dsdb_class *prev, *next;
133 const char *lDAPDisplayName;
134 const char *governsID_oid;
135 uint32_t governsID_id;
136 struct GUID schemaIDGUID;
137 struct GUID objectGUID;
139 uint32_t objectClassCategory;
140 const char *rDNAttID;
141 const char *defaultObjectCategory;
143 const char *subClassOf;
145 const char **systemAuxiliaryClass;
146 const char **systemPossSuperiors;
147 const char **systemMustContain;
148 const char **systemMayContain;
150 const char **auxiliaryClass;
151 const char **possSuperiors;
152 const char **mustContain;
153 const char **mayContain;
154 const char **possibleInferiors;
155 const char **systemPossibleInferiors;
157 const char *defaultSecurityDescriptor;
159 uint32_t schemaFlagsEx;
160 uint32_t systemFlags;
161 struct ldb_val msDs_Schema_Extensions;
163 bool showInAdvancedViewOnly;
164 const char *adminDisplayName;
165 const char *adminDescription;
166 const char *classDisplayName;
167 bool defaultHidingValue;
171 uint32_t subClassOf_id;
172 uint32_t *systemAuxiliaryClass_ids;
173 uint32_t *auxiliaryClass_ids;
174 uint32_t *systemMayContain_ids;
175 uint32_t *systemMustContain_ids;
176 uint32_t *possSuperiors_ids;
177 uint32_t *mustContain_ids;
178 uint32_t *mayContain_ids;
179 uint32_t *systemPossSuperiors_ids;
181 /* An ordered index showing how this subClass fits into the
182 * subClass tree. that is, an objectclass that is not
183 * subClassOf anything is 0 (just in case), and top is 1, and
184 * subClasses of top are 2, subclasses of those classes are
186 uint32_t subClass_order;
189 const char **supclasses;
190 const char **subclasses;
191 const char **subclasses_direct;
192 const char **posssuperiors;
196 enum schema_set_enum {
197 SCHEMA_MEMORY_ONLY = 0,
203 * data stored in schemaInfo attribute
205 struct dsdb_schema_info {
207 struct GUID invocation_id;
212 struct dsdb_schema_prefixmap *prefixmap;
215 * the last element of the prefix mapping table isn't a oid,
216 * it starts with 0xFF and has 21 bytes and is maybe a schema
219 * this is the content of the schemaInfo attribute of the
220 * Schema-Partition head object.
222 struct dsdb_schema_info *schema_info;
224 struct dsdb_attribute *attributes;
225 struct dsdb_class *classes;
227 struct dsdb_attribute **attributes_to_remove;
228 uint32_t attributes_to_remove_size;
229 struct dsdb_class **classes_to_remove;
230 uint32_t classes_to_remove_size;
232 /* lists of classes sorted by various attributes, for faster
234 uint32_t num_classes;
235 struct dsdb_class **classes_by_lDAPDisplayName;
236 struct dsdb_class **classes_by_governsID_id;
237 struct dsdb_class **classes_by_governsID_oid;
238 struct dsdb_class **classes_by_cn;
240 /* lists of attributes sorted by various fields */
241 uint32_t num_attributes;
242 struct dsdb_attribute **attributes_by_lDAPDisplayName;
243 struct dsdb_attribute **attributes_by_attributeID_id;
244 struct dsdb_attribute **attributes_by_attributeID_oid;
245 struct dsdb_attribute **attributes_by_linkID;
246 struct dsdb_attribute **attributes_by_cn;
247 uint32_t num_int_id_attr;
248 struct dsdb_attribute **attributes_by_msDS_IntId;
253 struct ldb_dn *master_dn;
256 /* Was this schema loaded from ldb (if so, then we will reload it when we detect a change in ldb) */
257 bool refresh_in_progress;
258 time_t ts_last_change;
259 /* This 'opaque' is stored in the metadata and is used to check if the currently
260 * loaded schema needs a reload because another process has signaled that it has been
261 * requested to reload the schema (either due through DRS or via the schemaUpdateNow).
263 uint64_t metadata_usn;
265 /* Should the syntax handlers in this case handle all incoming OIDs automatically, assigning them as an OID if no text name is known? */
266 bool relax_OID_conversions;
269 * we're currently trying to construct a working_schema
270 * in order to replicate the schema partition.
272 * We use this in order to avoid temporary failure DEBUG messages
274 bool resolving_in_progress;
277 #define DSDB_SCHEMA_COMMON_ATTRS \
285 "msDs-Schema-Extensions", \
286 "showInAdvancedViewOnly", \
287 "adminDisplayName", \
288 "adminDescription", \
292 #define DSDB_SCHEMA_ATTR_ATTRS \
296 "attributeSecurityGUID", \
298 "isMemberOfPartialAttributeSet", \
306 "extendedCharsAllowed", \
307 "classDisplayName", \
310 #define DSDB_SCHEMA_CLASS_ATTRS \
312 "objectClassCategory", \
314 "defaultObjectCategory", \
316 "systemAuxiliaryClass", \
318 "systemMustContain", \
319 "systemMayContain", \
322 "systemPossSuperiors", \
324 "defaultSecurityDescriptor", \
325 "classDisplayName", \
328 enum dsdb_attr_list_query {
330 DSDB_SCHEMA_ALL_MUST,
332 DSDB_SCHEMA_SYS_MUST,
338 enum dsdb_schema_convert_target {
341 TARGET_AD_SCHEMA_SUBENTRY
346 typedef struct dsdb_schema *(*dsdb_schema_refresh_fn)(struct ldb_module *module,
347 struct tevent_context *ev,
348 struct dsdb_schema *schema, bool is_global_schema);
349 #include "dsdb/schema/proto.h"
351 #endif /* _DSDB_SCHEMA_H */