diff options
Diffstat (limited to 'source4')
-rw-r--r-- | source4/torture/libnet/libnet_BecomeDC.c | 194 |
1 files changed, 129 insertions, 65 deletions
diff --git a/source4/torture/libnet/libnet_BecomeDC.c b/source4/torture/libnet/libnet_BecomeDC.c index 6266555d8d..9fc4231620 100644 --- a/source4/torture/libnet/libnet_BecomeDC.c +++ b/source4/torture/libnet/libnet_BecomeDC.c @@ -27,6 +27,7 @@ #include "libnet/libnet.h" #include "lib/events/events.h" #include "dsdb/samdb/samdb.h" +#include "lib/util/dlinklist.h" #define TORTURE_NETBIOS_NAME "smbtorturedc" @@ -35,6 +36,11 @@ struct test_become_dc_state { struct test_join *tj; struct cli_credentials *machine_account; struct dsdb_schema *schema; + + struct { + struct drsuapi_DsReplicaObjectListItemEx *first_object; + struct drsuapi_DsReplicaObjectListItemEx *last_object; + } schema_part; }; static NTSTATUS test_become_dc_check_options(void *private_data, @@ -85,6 +91,107 @@ static NTSTATUS test_become_dc_prepare_db(void *private_data, return NT_STATUS_OK; } +static WERROR test_object_to_ldb(struct test_become_dc_state *s, + const struct libnet_BecomeDC_StoreChunk *c, + struct drsuapi_DsReplicaObjectListItemEx *obj, + TALLOC_CTX *mem_ctx, + struct ldb_message **_msg) +{ + WERROR status; + uint32_t i; + + for (i=0; i < obj->object.attribute_ctr.num_attributes; i++) { + status = dsdb_attribute_drsuapi_to_ldb(s->schema, + &obj->object.attribute_ctr.attributes[i], + mem_ctx, NULL); +#if 0 /* ignore the error till all attribute syntaxes have a valid implementation */ + W_ERROR_NOT_OK_RETURN(status); +#endif + } + + return WERR_OK; +} + +static NTSTATUS test_apply_schema(struct test_become_dc_state *s, + const struct libnet_BecomeDC_StoreChunk *c) +{ + WERROR status; + struct drsuapi_DsReplicaObjectListItemEx *cur; + + for (cur = s->schema_part.first_object; cur; cur = cur->next_object) { + uint32_t i; + bool is_attr = false; + bool is_class = false; + + for (i=0; i < cur->object.attribute_ctr.num_attributes; i++) { + struct drsuapi_DsReplicaAttribute *a; + uint32_t j; + const char *oid = NULL; + + a = &cur->object.attribute_ctr.attributes[i]; + status = dsdb_map_int2oid(s->schema, a->attid, s, &oid); + if (!W_ERROR_IS_OK(status)) { + return werror_to_ntstatus(status); + } + + switch (a->attid) { + case DRSUAPI_ATTRIBUTE_objectClass: + for (j=0; j < a->value_ctr.uint32.num_values; j++) { + uint32_t val = *a->value_ctr.uint32.values[j].value; + + if (val == DRSUAPI_OBJECTCLASS_attributeSchema) { + is_attr = true; + } + if (val == DRSUAPI_OBJECTCLASS_classSchema) { + is_class = true; + } + } + break; + default: + break; + } + } + + if (is_attr) { + struct dsdb_attribute *sa; + + sa = talloc_zero(s->schema, struct dsdb_attribute); + NT_STATUS_HAVE_NO_MEMORY(sa); + + status = dsdb_attribute_from_drsuapi(s->schema, &cur->object, s, sa); + if (!W_ERROR_IS_OK(status)) { + return werror_to_ntstatus(status); + } + + DLIST_ADD_END(s->schema->attributes, sa, struct dsdb_attribute *); + } + + if (is_class) { + struct dsdb_class *sc; + + sc = talloc_zero(s->schema, struct dsdb_class); + NT_STATUS_HAVE_NO_MEMORY(sc); + + status = dsdb_class_from_drsuapi(s->schema, &cur->object, s, sc); + if (!W_ERROR_IS_OK(status)) { + return werror_to_ntstatus(status); + } + + DLIST_ADD_END(s->schema->classes, sc, struct dsdb_class *); + } + } + + for (cur = s->schema_part.first_object; cur; cur = cur->next_object) { + struct ldb_message *msg; + status = test_object_to_ldb(s, c, cur, s, &msg); + if (!W_ERROR_IS_OK(status)) { + return werror_to_ntstatus(status); + } + } + + return NT_STATUS_OK; +} + static NTSTATUS test_become_dc_schema_chunk(void *private_data, const struct libnet_BecomeDC_StoreChunk *c) { @@ -136,72 +243,17 @@ static NTSTATUS test_become_dc_schema_chunk(void *private_data, } } - for (cur = first_object; cur; cur = cur->next_object) { - uint32_t i; - bool dn_printed = false; - bool is_attr = false; - bool is_class = false; - - for (i=0; i < cur->object.attribute_ctr.num_attributes; i++) { - struct drsuapi_DsReplicaAttribute *a; - uint32_t j; - const char *oid = NULL; - - a = &cur->object.attribute_ctr.attributes[i]; - status = dsdb_map_int2oid(s->schema, a->attid, s, &oid); - if (!W_ERROR_IS_OK(status)) { - if (!dn_printed) { - DEBUG(0,("%s:\n", cur->object.identifier->dn)); - dn_printed = true; - } - DEBUG(0,("\tattr 0x%08X => %s\n", a->attid, win_errstr(status))); - } - - switch (a->attid) { - case DRSUAPI_ATTRIBUTE_objectClass: - case DRSUAPI_ATTRIBUTE_attributeID: - case DRSUAPI_ATTRIBUTE_attributeSyntax: - for (j=0; j < a->value_ctr.uint32.num_values; j++) { - uint32_t val = *a->value_ctr.uint32.values[j].value; - - if (val == DRSUAPI_OBJECTCLASS_attributeSchema) { - is_attr = true; - } - if (val == DRSUAPI_OBJECTCLASS_classSchema) { - is_class = true; - } - - status = dsdb_map_int2oid(s->schema, val, s, &oid); - if (!W_ERROR_IS_OK(status)) { - if (!dn_printed) { - DEBUG(0,("%s:\n", cur->object.identifier->dn)); - dn_printed = true; - } - DEBUG(0,("\tattr 0x%08X => %s value[%u] 0x%08X => %s\n", - a->attid, oid, j, val, win_errstr(status))); - } - } - break; - default: - break; - } - } - - if (is_attr) { - struct dsdb_attribute sa; - status = dsdb_attribute_from_drsuapi(s->schema, &cur->object, s, &sa); - if (!W_ERROR_IS_OK(status)) { - return werror_to_ntstatus(status); - } - } + if (!s->schema_part.first_object) { + s->schema_part.first_object = talloc_steal(s, first_object); + } else { + s->schema_part.last_object->next_object = talloc_steal(s->schema_part.last_object, + first_object); + } + for (cur = first_object; cur->next_object; cur = cur->next_object) {} + s->schema_part.last_object = cur; - if (is_class) { - struct dsdb_class sc; - status = dsdb_class_from_drsuapi(s->schema, &cur->object, s, &sc); - if (!W_ERROR_IS_OK(status)) { - return werror_to_ntstatus(status); - } - } + if (c->partition->highwatermark.tmp_highest_usn == c->partition->highwatermark.highest_usn) { + return test_apply_schema(s, c); } return NT_STATUS_OK; @@ -215,17 +267,21 @@ static NTSTATUS test_become_dc_store_chunk(void *private_data, const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr; uint32_t total_object_count; uint32_t object_count; + struct drsuapi_DsReplicaObjectListItemEx *first_object; + struct drsuapi_DsReplicaObjectListItemEx *cur; switch (c->ctr_level) { case 1: mapping_ctr = &c->ctr1->mapping_ctr; total_object_count = c->ctr1->total_object_count; object_count = c->ctr1->object_count; + first_object = c->ctr1->first_object; break; case 6: mapping_ctr = &c->ctr6->mapping_ctr; total_object_count = c->ctr6->total_object_count; object_count = c->ctr6->object_count; + first_object = c->ctr6->first_object; break; default: return NT_STATUS_INVALID_PARAMETER; @@ -244,6 +300,14 @@ static NTSTATUS test_become_dc_store_chunk(void *private_data, return werror_to_ntstatus(status); } + for (cur = first_object; cur; cur = cur->next_object) { + struct ldb_message *msg; + status = test_object_to_ldb(s, c, cur, s, &msg); + if (!W_ERROR_IS_OK(status)) { + return werror_to_ntstatus(status); + } + } + return NT_STATUS_OK; } |