2 Unix SMB/CIFS mplementation.
5 Copyright (C) Stefan Metzmacher 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 2 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, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "dsdb/samdb/samdb.h"
25 #include "lib/util/dlinklist.h"
26 #include "librpc/gen_ndr/drsuapi.h"
28 WERROR
dsdb_load_oid_mappings(struct dsdb_schema
*schema
, const struct drsuapi_DsReplicaOIDMapping_Ctr
*ctr
)
32 schema
->prefixes
= talloc_array(schema
, struct dsdb_schema_oid_prefix
, ctr
->num_mappings
);
33 W_ERROR_HAVE_NO_MEMORY(schema
->prefixes
);
35 for (i
=0, j
=0; i
< ctr
->num_mappings
; i
++) {
36 if (ctr
->mappings
[i
].oid
.oid
== NULL
) {
37 return WERR_INVALID_PARAM
;
40 if (strncasecmp(ctr
->mappings
[i
].oid
.oid
, "ff", 2) == 0) {
41 if (ctr
->mappings
[i
].id_prefix
!= 0) {
42 return WERR_INVALID_PARAM
;
45 /* the magic value should be in the last array member */
46 if (i
!= (ctr
->num_mappings
- 1)) {
47 return WERR_INVALID_PARAM
;
50 schema
->unknown_magic
= talloc_strdup(schema
, ctr
->mappings
[i
].oid
.oid
);
51 W_ERROR_HAVE_NO_MEMORY(schema
->unknown_magic
);
53 /* the last array member should contain the magic value not a oid */
54 if (i
== (ctr
->num_mappings
- 1)) {
55 return WERR_INVALID_PARAM
;
58 schema
->prefixes
[j
].id
= ctr
->mappings
[i
].id_prefix
<<16;
59 schema
->prefixes
[j
].oid
= talloc_asprintf(schema
->prefixes
, "%s.",
60 ctr
->mappings
[i
].oid
.oid
);
61 W_ERROR_HAVE_NO_MEMORY(schema
->prefixes
[j
].oid
);
62 schema
->prefixes
[j
].oid_len
= strlen(schema
->prefixes
[j
].oid
);
67 schema
->num_prefixes
= j
;
71 WERROR
dsdb_map_oid2int(struct dsdb_schema
*schema
, const char *in
, uint32_t *out
)
75 for (i
=0; i
< schema
->num_prefixes
; i
++) {
80 if (strncmp(schema
->prefixes
[i
].oid
, in
, schema
->prefixes
[i
].oid_len
) != 0) {
84 val_str
= in
+ schema
->prefixes
[i
].oid_len
;
88 if (val_str
[0] == '\0') {
89 return WERR_INVALID_PARAM
;
92 /* two '.' chars are invalid */
93 if (val_str
[0] == '.') {
94 return WERR_INVALID_PARAM
;
97 val
= strtoul(val_str
, &end_str
, 10);
98 if (end_str
[0] == '.' && end_str
[1] != '\0') {
100 * if it's a '.' and not the last char
101 * then maybe an other mapping apply
104 } else if (end_str
[0] != '\0') {
105 return WERR_INVALID_PARAM
;
106 } else if (val
> 0xFFFF) {
107 return WERR_INVALID_PARAM
;
110 *out
= schema
->prefixes
[i
].id
| val
;
114 return WERR_DS_NO_MSDS_INTID
;
117 WERROR
dsdb_map_int2oid(struct dsdb_schema
*schema
, uint32_t in
, TALLOC_CTX
*mem_ctx
, const char **out
)
121 for (i
=0; i
< schema
->num_prefixes
; i
++) {
123 if (schema
->prefixes
[i
].id
!= (in
& 0xFFFF0000)) {
127 val
= talloc_asprintf(mem_ctx
, "%s%u",
128 schema
->prefixes
[i
].oid
,
130 W_ERROR_HAVE_NO_MEMORY(val
);
136 return WERR_DS_NO_MSDS_INTID
;
139 #define GET_STRING_LDB(msg, attr, mem_ctx, p, elem, strict) do { \
140 (p)->elem = samdb_result_string(msg, attr, NULL);\
141 if (strict && (p)->elem == NULL) { \
142 d_printf("%s: %s == NULL\n", __location__, attr); \
143 return WERR_INVALID_PARAM; \
145 talloc_steal(mem_ctx, (p)->elem); \
148 #define GET_BOOL_LDB(msg, attr, p, elem, strict) do { \
150 str = samdb_result_string(msg, attr, NULL);\
153 d_printf("%s: %s == NULL\n", __location__, attr); \
154 return WERR_INVALID_PARAM; \
158 } else if (strcasecmp("TRUE", str) == 0) { \
160 } else if (strcasecmp("FALSE", str) == 0) { \
163 d_printf("%s: %s == %s\n", __location__, attr, str); \
164 return WERR_INVALID_PARAM; \
168 #define GET_UINT32_LDB(msg, attr, p, elem) do { \
169 (p)->elem = samdb_result_uint(msg, attr, 0);\
172 #define GET_GUID_LDB(msg, attr, p, elem) do { \
173 (p)->elem = samdb_result_guid(msg, attr);\
176 #define GET_BLOB_LDB(msg, attr, mem_ctx, p, elem) do { \
177 const struct ldb_val *_val;\
178 _val = ldb_msg_find_ldb_val(msg, attr);\
181 talloc_steal(mem_ctx, (p)->elem.data);\
183 ZERO_STRUCT((p)->elem);\
187 WERROR
dsdb_attribute_from_ldb(struct ldb_message
*msg
, TALLOC_CTX
*mem_ctx
, struct dsdb_attribute
*attr
)
191 GET_STRING_LDB(msg
, "cn", mem_ctx
, attr
, cn
, True
);
192 GET_STRING_LDB(msg
, "lDAPDisplayName", mem_ctx
, attr
, lDAPDisplayName
, True
);
193 GET_STRING_LDB(msg
, "attributeID", mem_ctx
, attr
, attributeID_oid
, True
);
194 /* set an invalid value */
195 attr
->attributeID_id
= 0xFFFFFFFF;
196 GET_GUID_LDB(msg
, "schemaIDGUID", attr
, schemaIDGUID
);
197 GET_UINT32_LDB(msg
, "mAPIID", attr
, mAPIID
);
199 GET_GUID_LDB(msg
, "attributeSecurityGUID", attr
, attributeSecurityGUID
);
201 GET_UINT32_LDB(msg
, "searchFlags", attr
, searchFlags
);
202 GET_UINT32_LDB(msg
, "systemFlags", attr
, systemFlags
);
203 GET_BOOL_LDB(msg
, "isMemberOfPartialAttributeSet", attr
, isMemberOfPartialAttributeSet
, False
);
204 GET_UINT32_LDB(msg
, "linkID", attr
, linkID
);
206 GET_STRING_LDB(msg
, "attributeSyntax", mem_ctx
, attr
, attributeSyntax_oid
, True
);
207 /* set an invalid value */
208 attr
->attributeSyntax_id
= 0xFFFFFFFF;
209 GET_UINT32_LDB(msg
, "oMSyntax", attr
, oMSyntax
);
210 GET_BLOB_LDB(msg
, "oMObjectClass", mem_ctx
, attr
, oMObjectClass
);
212 GET_BOOL_LDB(msg
, "isSingleValued", attr
, isSingleValued
, True
);
213 GET_UINT32_LDB(msg
, "rangeLower", attr
, rangeLower
);
214 GET_UINT32_LDB(msg
, "rangeUpper", attr
, rangeUpper
);
215 GET_BOOL_LDB(msg
, "extendedCharsAllowed", attr
, extendedCharsAllowed
, False
);
217 GET_UINT32_LDB(msg
, "schemaFlagsEx", attr
, schemaFlagsEx
);
218 GET_BLOB_LDB(msg
, "msDs-Schema-Extensions", mem_ctx
, attr
, msDs_Schema_Extensions
);
220 GET_BOOL_LDB(msg
, "showInAdvancedViewOnly", attr
, showInAdvancedViewOnly
, False
);
221 GET_STRING_LDB(msg
, "adminDisplayName", mem_ctx
, attr
, adminDisplayName
, False
);
222 GET_STRING_LDB(msg
, "adminDescription", mem_ctx
, attr
, adminDescription
, False
);
223 GET_STRING_LDB(msg
, "classDisplayName", mem_ctx
, attr
, classDisplayName
, False
);
224 GET_BOOL_LDB(msg
, "isEphemeral", attr
, isEphemeral
, False
);
225 GET_BOOL_LDB(msg
, "isDefunct", attr
, isDefunct
, False
);
226 GET_BOOL_LDB(msg
, "systemOnly", attr
, systemOnly
, False
);
231 WERROR
dsdb_class_from_ldb(struct ldb_message
*msg
, TALLOC_CTX
*mem_ctx
, struct dsdb_class
*obj
)
235 GET_STRING_LDB(msg
, "cn", mem_ctx
, obj
, cn
, True
);
236 GET_STRING_LDB(msg
, "lDAPDisplayName", mem_ctx
, obj
, lDAPDisplayName
, True
);
237 GET_STRING_LDB(msg
, "governsID", mem_ctx
, obj
, governsID_oid
, True
);
238 /* set an invalid value */
239 obj
->governsID_id
= 0xFFFFFFFF;
240 GET_GUID_LDB(msg
, "schemaIDGUID", obj
, schemaIDGUID
);
242 GET_UINT32_LDB(msg
, "objectClassCategory", obj
, objectClassCategory
);
243 GET_STRING_LDB(msg
, "rDNAttID", mem_ctx
, obj
, rDNAttID
, False
);
244 GET_STRING_LDB(msg
, "defaultObjectCategory", mem_ctx
, obj
, defaultObjectCategory
, True
);
246 GET_STRING_LDB(msg
, "subClassOf", mem_ctx
, obj
, subClassOf
, True
);
248 GET_STRING_LDB(msg
, "systemAuxiliaryClass", mem_ctx
, obj
, systemAuxiliaryClass
, False
);
249 obj
->systemPossSuperiors
= NULL
;
250 obj
->systemMustContain
= NULL
;
251 obj
->systemMayContain
= NULL
;
253 GET_STRING_LDB(msg
, "auxiliaryClass", mem_ctx
, obj
, auxiliaryClass
, False
);
254 obj
->possSuperiors
= NULL
;
255 obj
->mustContain
= NULL
;
256 obj
->mayContain
= NULL
;
258 GET_STRING_LDB(msg
, "defaultSecurityDescriptor", mem_ctx
, obj
, defaultSecurityDescriptor
, False
);
260 GET_UINT32_LDB(msg
, "schemaFlagsEx", obj
, schemaFlagsEx
);
261 GET_BLOB_LDB(msg
, "msDs-Schema-Extensions", mem_ctx
, obj
, msDs_Schema_Extensions
);
263 GET_BOOL_LDB(msg
, "showInAdvancedViewOnly", obj
, showInAdvancedViewOnly
, False
);
264 GET_STRING_LDB(msg
, "adminDisplayName", mem_ctx
, obj
, adminDisplayName
, False
);
265 GET_STRING_LDB(msg
, "adminDescription", mem_ctx
, obj
, adminDescription
, False
);
266 GET_STRING_LDB(msg
, "classDisplayName", mem_ctx
, obj
, classDisplayName
, False
);
267 GET_BOOL_LDB(msg
, "defaultHidingValue", obj
, defaultHidingValue
, False
);
268 GET_BOOL_LDB(msg
, "isDefunct", obj
, isDefunct
, False
);
269 GET_BOOL_LDB(msg
, "systemOnly", obj
, systemOnly
, False
);
274 static const struct {
277 } name_mappings
[] = {
279 { "name", "1.2.840.113556.1.4.1" },
280 { "lDAPDisplayName", "1.2.840.113556.1.2.460" },
281 { "attributeID", "1.2.840.113556.1.2.30" },
282 { "schemaIDGUID", "1.2.840.113556.1.4.148" },
283 { "mAPIID", "1.2.840.113556.1.2.49" },
284 { "attributeSecurityGUID", "1.2.840.113556.1.4.149" },
285 { "searchFlags", "1.2.840.113556.1.2.334" },
286 { "systemFlags", "1.2.840.113556.1.4.375" },
287 { "isMemberOfPartialAttributeSet", "1.2.840.113556.1.4.639" },
288 { "linkID", "1.2.840.113556.1.2.50" },
289 { "attributeSyntax", "1.2.840.113556.1.2.30" },
290 { "oMSyntax", "1.2.840.113556.1.2.231" },
291 { "oMObjectClass", "1.2.840.113556.1.2.218" },
292 { "isSingleValued", "1.2.840.113556.1.2.33" },
293 { "rangeLower", "1.2.840.113556.1.2.34" },
294 { "rangeUpper", "1.2.840.113556.1.2.35" },
295 { "extendedCharsAllowed", "1.2.840.113556.1.2.380" },
296 { "schemaFlagsEx", "1.2.840.113556.1.4.120" },
297 { "msDs-Schema-Extensions", "1.2.840.113556.1.4.1440" },
298 { "showInAdvancedViewOnly", "1.2.840.113556.1.2.169" },
299 { "adminDisplayName", "1.2.840.113556.1.2.194" },
300 { "adminDescription", "1.2.840.113556.1.2.226" },
301 { "classDisplayName", "1.2.840.113556.1.4.610" },
302 { "isEphemeral", "1.2.840.113556.1.4.1212" },
303 { "isDefunct", "1.2.840.113556.1.4.661" },
304 { "systemOnly", "1.2.840.113556.1.4.170" },
305 { "governsID", "1.2.840.113556.1.2.22" },
306 { "objectClassCategory", "1.2.840.113556.1.2.370" },
307 { "rDNAttID", "1.2.840.113556.1.2.26" },
308 { "defaultObjectCategory", "1.2.840.113556.1.4.783" },
309 { "subClassOf", "1.2.840.113556.1.2.21" },
310 { "systemAuxiliaryClass", "1.2.840.113556.1.4.198" },
311 { "systemPossSuperiors", "1.2.840.113556.1.4.195" },
312 { "systemMustContain", "1.2.840.113556.1.4.197" },
313 { "systemMayContain", "1.2.840.113556.1.4.196" },
314 { "auxiliaryClass", "1.2.840.113556.1.2.351" },
315 { "possSuperiors", "1.2.840.113556.1.2.8" },
316 { "mustContain", "1.2.840.113556.1.2.24" },
317 { "mayContain", "1.2.840.113556.1.2.25" },
318 { "defaultSecurityDescriptor", "1.2.840.113556.1.4.224" },
319 { "defaultHidingValue", "1.2.840.113556.1.4.518" },
322 static struct drsuapi_DsReplicaAttribute
*dsdb_find_object_attr_name(struct dsdb_schema
*schema
,
323 struct drsuapi_DsReplicaObject
*obj
,
329 const char *oid
= NULL
;
331 for(i
=0; i
< ARRAY_SIZE(name_mappings
); i
++) {
332 if (strcmp(name_mappings
[i
].name
, name
) != 0) continue;
334 oid
= name_mappings
[i
].oid
;
342 status
= dsdb_map_oid2int(schema
, oid
, &id
);
343 if (!W_ERROR_IS_OK(status
)) {
347 for (i
=0; i
< obj
->attribute_ctr
.num_attributes
; i
++) {
348 if (obj
->attribute_ctr
.attributes
[i
].attid
!= id
) continue;
351 return &obj
->attribute_ctr
.attributes
[i
];
357 #define GET_STRING_DS(s, r, attr, mem_ctx, p, elem, strict) do { \
358 struct drsuapi_DsReplicaAttribute *_a; \
359 _a = dsdb_find_object_attr_name(s, r, attr, NULL); \
360 if (strict && !_a) { \
361 d_printf("%s: %s == NULL\n", __location__, attr); \
362 return WERR_INVALID_PARAM; \
364 if (strict && _a->value_ctr.unicode_string.num_values != 1) { \
365 d_printf("%s: %s num_values == %u\n", __location__, attr, \
366 _a->value_ctr.unicode_string.num_values); \
367 return WERR_INVALID_PARAM; \
369 if (_a && _a->value_ctr.unicode_string.num_values >= 1) { \
370 (p)->elem = talloc_steal(mem_ctx, _a->value_ctr.unicode_string.values[0].string);\
376 #define GET_BOOL_DS(s, r, attr, p, elem, strict) do { \
377 struct drsuapi_DsReplicaAttribute *_a; \
378 _a = dsdb_find_object_attr_name(s, r, attr, NULL); \
379 if (strict && !_a) { \
380 d_printf("%s: %s == NULL\n", __location__, attr); \
381 return WERR_INVALID_PARAM; \
383 if (strict && _a->value_ctr.uint32.num_values != 1) { \
384 d_printf("%s: %s num_values == %u\n", __location__, attr, \
385 _a->value_ctr.uint32.num_values); \
386 return WERR_INVALID_PARAM; \
388 if (strict && !_a->value_ctr.uint32.values[0].value) { \
389 d_printf("%s: %s value == NULL\n", __location__, attr); \
390 return WERR_INVALID_PARAM; \
392 if (_a && _a->value_ctr.uint32.num_values >= 1 \
393 && _a->value_ctr.uint32.values[0].value) { \
394 (p)->elem = (*_a->value_ctr.uint32.values[0].value?True:False);\
400 #define GET_UINT32_DS(s, r, attr, p, elem) do { \
401 struct drsuapi_DsReplicaAttribute *_a; \
402 _a = dsdb_find_object_attr_name(s, r, attr, NULL); \
403 if (_a && _a->value_ctr.uint32.num_values >= 1 \
404 && _a->value_ctr.uint32.values[0].value) { \
405 (p)->elem = *_a->value_ctr.uint32.values[0].value;\
411 #define GET_GUID_DS(s, r, attr, p, elem) do { \
412 struct drsuapi_DsReplicaAttribute *_a; \
413 _a = dsdb_find_object_attr_name(s, r, attr, NULL); \
414 if (_a && _a->value_ctr.guid.num_values >= 1 \
415 && _a->value_ctr.guid.values[0].guid) { \
416 (p)->elem = *_a->value_ctr.guid.values[0].guid;\
418 ZERO_STRUCT((p)->elem);\
422 #define GET_BLOB_DS(s, r, attr, mem_ctx, p, elem) do { \
423 struct drsuapi_DsReplicaAttribute *_a; \
424 _a = dsdb_find_object_attr_name(s, r, attr, NULL); \
425 if (_a && _a->value_ctr.data_blob.num_values >= 1 \
426 && _a->value_ctr.data_blob.values[0].data) { \
427 (p)->elem = *_a->value_ctr.data_blob.values[0].data;\
428 talloc_steal(mem_ctx, (p)->elem.data); \
430 ZERO_STRUCT((p)->elem);\
434 WERROR
dsdb_attribute_from_drsuapi(struct dsdb_schema
*schema
,
435 struct drsuapi_DsReplicaObject
*r
,
437 struct dsdb_attribute
*attr
)
441 GET_STRING_DS(schema
, r
, "name", mem_ctx
, attr
, cn
, True
);
442 GET_STRING_DS(schema
, r
, "lDAPDisplayName", mem_ctx
, attr
, lDAPDisplayName
, True
);
443 GET_UINT32_DS(schema
, r
, "attributeID", attr
, attributeID_id
);
444 status
= dsdb_map_int2oid(schema
, attr
->attributeID_id
, mem_ctx
, &attr
->attributeID_oid
);
445 if (!W_ERROR_IS_OK(status
)) {
446 DEBUG(0,("%s: '%s': unable to map attributeID 0x%08X: %s\n",
447 __location__
, attr
->lDAPDisplayName
, attr
->attributeID_id
,
448 win_errstr(status
)));
451 GET_GUID_DS(schema
, r
, "schemaIDGUID", attr
, schemaIDGUID
);
452 GET_UINT32_DS(schema
, r
, "mAPIID", attr
, mAPIID
);
454 GET_GUID_DS(schema
, r
, "attributeSecurityGUID", attr
, attributeSecurityGUID
);
456 GET_UINT32_DS(schema
, r
, "searchFlags", attr
, searchFlags
);
457 GET_UINT32_DS(schema
, r
, "systemFlags", attr
, systemFlags
);
458 GET_BOOL_DS(schema
, r
, "isMemberOfPartialAttributeSet", attr
, isMemberOfPartialAttributeSet
, False
);
459 GET_UINT32_DS(schema
, r
, "linkID", attr
, linkID
);
461 GET_UINT32_DS(schema
, r
, "attributeSyntax", attr
, attributeSyntax_id
);
462 status
= dsdb_map_int2oid(schema
, attr
->attributeSyntax_id
, mem_ctx
, &attr
->attributeSyntax_oid
);
463 if (!W_ERROR_IS_OK(status
)) {
464 DEBUG(0,("%s: '%s': unable to map attributeSyntax 0x%08X: %s\n",
465 __location__
, attr
->lDAPDisplayName
, attr
->attributeSyntax_id
,
466 win_errstr(status
)));
469 GET_UINT32_DS(schema
, r
, "oMSyntax", attr
, oMSyntax
);
470 GET_BLOB_DS(schema
, r
, "oMObjectClass", mem_ctx
, attr
, oMObjectClass
);
472 GET_BOOL_DS(schema
, r
, "isSingleValued", attr
, isSingleValued
, True
);
473 GET_UINT32_DS(schema
, r
, "rangeLower", attr
, rangeLower
);
474 GET_UINT32_DS(schema
, r
, "rangeUpper", attr
, rangeUpper
);
475 GET_BOOL_DS(schema
, r
, "extendedCharsAllowed", attr
, extendedCharsAllowed
, False
);
477 GET_UINT32_DS(schema
, r
, "schemaFlagsEx", attr
, schemaFlagsEx
);
478 GET_BLOB_DS(schema
, r
, "msDs-Schema-Extensions", mem_ctx
, attr
, msDs_Schema_Extensions
);
480 GET_BOOL_DS(schema
, r
, "showInAdvancedViewOnly", attr
, showInAdvancedViewOnly
, False
);
481 GET_STRING_DS(schema
, r
, "adminDisplayName", mem_ctx
, attr
, adminDisplayName
, False
);
482 GET_STRING_DS(schema
, r
, "adminDescription", mem_ctx
, attr
, adminDescription
, False
);
483 GET_STRING_DS(schema
, r
, "classDisplayName", mem_ctx
, attr
, classDisplayName
, False
);
484 GET_BOOL_DS(schema
, r
, "isEphemeral", attr
, isEphemeral
, False
);
485 GET_BOOL_DS(schema
, r
, "isDefunct", attr
, isDefunct
, False
);
486 GET_BOOL_DS(schema
, r
, "systemOnly", attr
, systemOnly
, False
);
491 WERROR
dsdb_class_from_drsuapi(struct dsdb_schema
*schema
,
492 struct drsuapi_DsReplicaObject
*r
,
494 struct dsdb_class
*obj
)
498 GET_STRING_DS(schema
, r
, "name", mem_ctx
, obj
, cn
, True
);
499 GET_STRING_DS(schema
, r
, "lDAPDisplayName", mem_ctx
, obj
, lDAPDisplayName
, True
);
500 GET_UINT32_DS(schema
, r
, "governsID", obj
, governsID_id
);
501 status
= dsdb_map_int2oid(schema
, obj
->governsID_id
, mem_ctx
, &obj
->governsID_oid
);
502 if (!W_ERROR_IS_OK(status
)) {
503 DEBUG(0,("%s: '%s': unable to map governsID 0x%08X: %s\n",
504 __location__
, obj
->lDAPDisplayName
, obj
->governsID_id
,
505 win_errstr(status
)));
508 GET_GUID_DS(schema
, r
, "schemaIDGUID", obj
, schemaIDGUID
);
510 GET_UINT32_DS(schema
, r
, "objectClassCategory", obj
, objectClassCategory
);
511 GET_STRING_DS(schema
, r
, "rDNAttID", mem_ctx
, obj
, rDNAttID
, False
);
512 GET_STRING_DS(schema
, r
, "defaultObjectCategory", mem_ctx
, obj
, defaultObjectCategory
, True
);
514 GET_STRING_DS(schema
, r
, "subClassOf", mem_ctx
, obj
, subClassOf
, True
);
516 GET_STRING_DS(schema
, r
, "systemAuxiliaryClass", mem_ctx
, obj
, systemAuxiliaryClass
, False
);
517 obj
->systemPossSuperiors
= NULL
;
518 obj
->systemMustContain
= NULL
;
519 obj
->systemMayContain
= NULL
;
521 GET_STRING_DS(schema
, r
, "auxiliaryClass", mem_ctx
, obj
, auxiliaryClass
, False
);
522 obj
->possSuperiors
= NULL
;
523 obj
->mustContain
= NULL
;
524 obj
->mayContain
= NULL
;
526 GET_STRING_DS(schema
, r
, "defaultSecurityDescriptor", mem_ctx
, obj
, defaultSecurityDescriptor
, False
);
528 GET_UINT32_DS(schema
, r
, "schemaFlagsEx", obj
, schemaFlagsEx
);
529 GET_BLOB_DS(schema
, r
, "msDs-Schema-Extensions", mem_ctx
, obj
, msDs_Schema_Extensions
);
531 GET_BOOL_DS(schema
, r
, "showInAdvancedViewOnly", obj
, showInAdvancedViewOnly
, False
);
532 GET_STRING_DS(schema
, r
, "adminDisplayName", mem_ctx
, obj
, adminDisplayName
, False
);
533 GET_STRING_DS(schema
, r
, "adminDescription", mem_ctx
, obj
, adminDescription
, False
);
534 GET_STRING_DS(schema
, r
, "classDisplayName", mem_ctx
, obj
, classDisplayName
, False
);
535 GET_BOOL_DS(schema
, r
, "defaultHidingValue", obj
, defaultHidingValue
, False
);
536 GET_BOOL_DS(schema
, r
, "isDefunct", obj
, isDefunct
, False
);
537 GET_BOOL_DS(schema
, r
, "systemOnly", obj
, systemOnly
, False
);