diff options
Diffstat (limited to 'source4')
| -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);  | 
