diff options
Diffstat (limited to 'source4/dsdb/schema')
-rw-r--r-- | source4/dsdb/schema/schema.h | 9 | ||||
-rw-r--r-- | source4/dsdb/schema/schema_inferiors.c | 79 | ||||
-rw-r--r-- | source4/dsdb/schema/schema_init.c | 53 |
3 files changed, 108 insertions, 33 deletions
diff --git a/source4/dsdb/schema/schema.h b/source4/dsdb/schema/schema.h index e15f65a0a1..a605e2f707 100644 --- a/source4/dsdb/schema/schema.h +++ b/source4/dsdb/schema/schema.h @@ -137,6 +137,15 @@ struct dsdb_class { char **subclasses; char **subclasses_direct; char **posssuperiors; + uint32_t subClassOf_id; + uint32_t *systemAuxiliaryClass_ids; + uint32_t *auxiliaryClass_ids; + uint32_t *systemMayContain_ids; + uint32_t *systemMustContain_ids; + uint32_t *possSuperiors_ids; + uint32_t *mustContain_ids; + uint32_t *mayContain_ids; + uint32_t *systemPossSuperiors_ids; }; struct dsdb_schema_oid_prefix { diff --git a/source4/dsdb/schema/schema_inferiors.c b/source4/dsdb/schema/schema_inferiors.c index fc1845bb42..63ddb4a424 100644 --- a/source4/dsdb/schema/schema_inferiors.c +++ b/source4/dsdb/schema/schema_inferiors.c @@ -166,10 +166,89 @@ static void schema_fill_possible_inferiors(struct dsdb_schema *schema, struct ds schema_class->possibleInferiors = str_list_unique(schema_class->possibleInferiors); } +/* + fill in a string class name from a governs_ID + */ +static void schema_fill_from_class_one(struct dsdb_schema *schema, struct dsdb_class *c, + const char **s, uint32_t id) +{ + if (*s == NULL && id != 0) { + struct dsdb_class *c2 = dsdb_class_by_governsID_id(schema, id); + if (c2) { + *s = c2->lDAPDisplayName; + } + } +} + +/* + fill in a list of string class names from a governs_ID list + */ +static void schema_fill_from_class_list(struct dsdb_schema *schema, struct dsdb_class *c, + const char ***s, uint32_t *ids) +{ + if (*s == NULL && ids != NULL) { + int i; + for (i=0;ids[i];i++) ; + *s = talloc_array(c, const char *, i+1); + for (i=0;ids[i];i++) { + struct dsdb_class *c2 = dsdb_class_by_governsID_id(schema, ids[i]); + if (c2) { + (*s)[i] = c2->lDAPDisplayName; + } else { + (*s)[i] = NULL; + } + } + (*s)[i] = NULL; + } +} + +/* + fill in a list of string attribute names from a attributeID list + */ +static void schema_fill_from_attribute_list(struct dsdb_schema *schema, struct dsdb_class *c, + const char ***s, uint32_t *ids) +{ + if (*s == NULL && ids != NULL) { + int i; + for (i=0;ids[i];i++) ; + *s = talloc_array(c, const char *, i+1); + for (i=0;ids[i];i++) { + struct dsdb_attribute *a = dsdb_attribute_by_attributeID_id(schema, ids[i]); + if (a) { + (*s)[i] = a->lDAPDisplayName; + } else { + (*s)[i] = NULL; + } + } + (*s)[i] = NULL; + } +} + +/* + if the schema came from DRS then some attributes will be setup as IDs + */ +static void schema_fill_from_ids(struct dsdb_schema *schema) +{ + struct dsdb_class *c; + for (c=schema->classes; c; c=c->next) { + schema_fill_from_class_one(schema, c, &c->subClassOf, c->subClassOf_id); + schema_fill_from_attribute_list(schema, c, &c->systemMayContain, c->systemMayContain_ids); + schema_fill_from_attribute_list(schema, c, &c->systemMustContain, c->systemMustContain_ids); + schema_fill_from_attribute_list(schema, c, &c->mustContain, c->mustContain_ids); + schema_fill_from_attribute_list(schema, c, &c->mayContain, c->mayContain_ids); + schema_fill_from_class_list(schema, c, &c->possSuperiors, c->possSuperiors_ids); + schema_fill_from_class_list(schema, c, &c->systemPossSuperiors, c->systemPossSuperiors_ids); + schema_fill_from_class_list(schema, c, &c->systemAuxiliaryClass, c->systemAuxiliaryClass_ids); + schema_fill_from_class_list(schema, c, &c->auxiliaryClass, c->auxiliaryClass_ids); + } +} + void schema_fill_constructed(struct dsdb_schema *schema) { struct dsdb_class *schema_class; + schema_fill_from_ids(schema); + schema_create_subclasses(schema); for (schema_class=schema->classes; schema_class; schema_class=schema_class->next) { diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 76e7891fbd..2f63931494 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -1191,32 +1191,20 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb } \ } while (0) -#define GET_STRING_LIST_DS(s, r, attr, mem_ctx, p, elem, strict) do { \ - int get_string_list_counter; \ +#define GET_UINT32_LIST_DS(s, r, attr, mem_ctx, p, elem) do { \ + int list_counter; \ struct drsuapi_DsReplicaAttribute *_a; \ _a = dsdb_find_object_attr_name(s, r, attr, NULL); \ - if (strict && !_a) { \ - d_printf("%s: %s == NULL\n", __location__, attr); \ - return WERR_INVALID_PARAM; \ - } \ - (p)->elem = _a ? talloc_array(mem_ctx, const char *, _a->value_ctr.num_values + 1) : NULL; \ - for (get_string_list_counter=0; \ - _a && get_string_list_counter < _a->value_ctr.num_values; \ - get_string_list_counter++) { \ - size_t _ret; \ - if (!convert_string_talloc_convenience(mem_ctx, s->iconv_convenience, CH_UTF16, CH_UNIX, \ - _a->value_ctr.values[get_string_list_counter].blob->data, \ - _a->value_ctr.values[get_string_list_counter].blob->length, \ - (void **)discard_const(&(p)->elem[get_string_list_counter]), &_ret, false)) { \ - DEBUG(0,("%s: invalid data!\n", attr)); \ - dump_data(0, \ - _a->value_ctr.values[get_string_list_counter].blob->data, \ - _a->value_ctr.values[get_string_list_counter].blob->length); \ - return WERR_FOOBAR; \ - } \ - (p)->elem[get_string_list_counter+1] = NULL; \ + (p)->elem = _a ? talloc_array(mem_ctx, uint32_t, _a->value_ctr.num_values + 1) : NULL; \ + for (list_counter=0; \ + _a && list_counter < _a->value_ctr.num_values; \ + list_counter++) { \ + if (_a->value_ctr.values[list_counter].blob->length != 4) { \ + return WERR_INVALID_PARAM; \ + } \ + (p)->elem[list_counter] = IVAL(_a->value_ctr.values[list_counter].blob->data, 0); \ } \ - talloc_steal(mem_ctx, (p)->elem); \ + if (_a) (p)->elem[list_counter] = 0; \ } while (0) #define GET_DN_DS(s, r, attr, mem_ctx, p, elem, strict) do { \ @@ -1432,19 +1420,18 @@ WERROR dsdb_class_from_drsuapi(struct dsdb_schema *schema, GET_STRING_DS(schema, r, "rDNAttID", mem_ctx, obj, rDNAttID, false); GET_DN_DS(schema, r, "defaultObjectCategory", mem_ctx, obj, defaultObjectCategory, true); - GET_STRING_DS(schema, r, "subClassOf", mem_ctx, obj, subClassOf, true); - + GET_UINT32_DS(schema, r, "subClassOf", obj, subClassOf_id); - GET_STRING_LIST_DS(schema, r, "systemAuxiliaryClass", mem_ctx, obj, systemAuxiliaryClass, false); - GET_STRING_LIST_DS(schema, r, "auxiliaryClass", mem_ctx, obj, auxiliaryClass, false); + GET_UINT32_LIST_DS(schema, r, "systemAuxiliaryClass", mem_ctx, obj, systemAuxiliaryClass_ids); + GET_UINT32_LIST_DS(schema, r, "auxiliaryClass", mem_ctx, obj, auxiliaryClass_ids); - GET_STRING_LIST_DS(schema, r, "systemMustContain", mem_ctx, obj, systemMustContain, false); - GET_STRING_LIST_DS(schema, r, "systemMayContain", mem_ctx, obj, systemMayContain, false); - GET_STRING_LIST_DS(schema, r, "mustContain", mem_ctx, obj, mustContain, false); - GET_STRING_LIST_DS(schema, r, "mayContain", mem_ctx, obj, mayContain, false); + GET_UINT32_LIST_DS(schema, r, "systemMustContain", mem_ctx, obj, systemMustContain_ids); + GET_UINT32_LIST_DS(schema, r, "systemMayContain", mem_ctx, obj, systemMayContain_ids); + GET_UINT32_LIST_DS(schema, r, "mustContain", mem_ctx, obj, mustContain_ids); + GET_UINT32_LIST_DS(schema, r, "mayContain", mem_ctx, obj, mayContain_ids); - GET_STRING_LIST_DS(schema, r, "systemPossSuperiors", mem_ctx, obj, systemPossSuperiors, false); - GET_STRING_LIST_DS(schema, r, "possSuperiors", mem_ctx, obj, possSuperiors, false); + GET_UINT32_LIST_DS(schema, r, "systemPossSuperiors", mem_ctx, obj, systemPossSuperiors_ids); + GET_UINT32_LIST_DS(schema, r, "possSuperiors", mem_ctx, obj, possSuperiors_ids); GET_STRING_DS(schema, r, "defaultSecurityDescriptor", mem_ctx, obj, defaultSecurityDescriptor, false); |