static bool torture_test_syntax(struct torture_context *torture, struct torture_dsdb_syntax *priv, const char *oid, const char *attr_string, const char *ldb_str, const char *drs_str) { TALLOC_CTX *tmp_ctx = talloc_new(torture); DATA_BLOB drs_binary = hexstr_to_data_blob(tmp_ctx, drs_str); DATA_BLOB ldb_blob = data_blob_string_const(ldb_str); struct drsuapi_DsReplicaAttribute drs, drs2; struct drsuapi_DsAttributeValue val; const struct dsdb_syntax *syntax; const struct dsdb_attribute *attr; struct ldb_message_element el; struct ldb_context *ldb = priv->ldb; struct dsdb_schema *schema = priv->schema; struct dsdb_syntax_ctx syntax_ctx; /* use default syntax conversion context */ dsdb_syntax_ctx_init(&syntax_ctx, ldb, schema); drs.value_ctr.num_values = 1; drs.value_ctr.values = &val; val.blob = &drs_binary; torture_assert(torture, syntax = find_syntax_map_by_standard_oid(oid), "Failed to find syntax handler"); torture_assert(torture, attr = dsdb_attribute_by_lDAPDisplayName(schema, attr_string), "Failed to find attribute handler"); torture_assert_str_equal(torture, attr->syntax->name, syntax->name, "Syntax from schema not as expected"); torture_assert_werr_ok(torture, syntax->drsuapi_to_ldb(&syntax_ctx, attr, &drs, tmp_ctx, &el), "Failed to convert from DRS to ldb format"); torture_assert_data_blob_equal(torture, el.values[0], ldb_blob, "Incorrect conversion from DRS to ldb format"); torture_assert_werr_ok(torture, syntax->ldb_to_drsuapi(&syntax_ctx, attr, &el, tmp_ctx, &drs2), "Failed to convert from ldb to DRS format"); torture_assert(torture, drs2.value_ctr.values[0].blob, "No blob returned from conversion"); torture_assert_data_blob_equal(torture, *drs2.value_ctr.values[0].blob, drs_binary, "Incorrect conversion from ldb to DRS format"); return true; }
WERROR dsdb_class_from_drsuapi(struct ldb_context *ldb, struct dsdb_schema *schema, struct drsuapi_DsReplicaObject *r, TALLOC_CTX *mem_ctx, struct dsdb_class *obj) { WERROR status; struct drsuapi_DsReplicaAttribute *attr; DATA_BLOB blob; GET_STRING_DS(schema, r, "name", mem_ctx, obj, cn, true); GET_STRING_DS(schema, r, "lDAPDisplayName", mem_ctx, obj, lDAPDisplayName, true); GET_UINT32_DS(schema, r, "governsID", obj, governsID_id, 0xFFFFFFFF); status = dsdb_schema_pfm_oid_from_attid(schema->prefixmap, obj->governsID_id, mem_ctx, &obj->governsID_oid); if (!W_ERROR_IS_OK(status)) { DEBUG(0,("%s: '%s': unable to map governsID 0x%08X: %s\n", __location__, obj->lDAPDisplayName, obj->governsID_id, win_errstr(status))); return status; } GET_GUID_DS(schema, r, "schemaIDGUID", mem_ctx, obj, schemaIDGUID); obj->objectGUID = r->identifier->guid; GET_UINT32_DS(schema, r, "objectClassCategory", obj, objectClassCategory, 0); GET_STRING_DS(schema, r, "rDNAttID", mem_ctx, obj, rDNAttID, false); attr = dsdb_find_object_attr_name(schema, r, "defaultObjectCategory", NULL); if (!attr || attr->value_ctr.num_values != 1 || !attr->value_ctr.values[0].blob) { d_printf("%s: no defaultObjectCategory supplied\n", __location__); return WERR_INVALID_PARAM; } status = dsdb_syntax_one_DN_drsuapi_to_ldb(mem_ctx, ldb, find_syntax_map_by_standard_oid(LDB_SYNTAX_DN), schema->iconv_convenience, attr->value_ctr.values[0].blob, &blob); if (!W_ERROR_IS_OK(status)) { return status; } obj->defaultObjectCategory = (char *)blob.data; GET_UINT32_DS(schema, r, "subClassOf", obj, subClassOf_id, 0); 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_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_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); GET_UINT32_DS(schema, r, "schemaFlagsEx", obj, schemaFlagsEx, 0); GET_BLOB_DS(schema, r, "msDs-Schema-Extensions", mem_ctx, obj, msDs_Schema_Extensions); GET_BOOL_DS(schema, r, "showInAdvancedViewOnly", obj, showInAdvancedViewOnly, false); GET_STRING_DS(schema, r, "adminDisplayName", mem_ctx, obj, adminDisplayName, false); GET_STRING_DS(schema, r, "adminDescription", mem_ctx, obj, adminDescription, false); GET_STRING_DS(schema, r, "classDisplayName", mem_ctx, obj, classDisplayName, false); GET_BOOL_DS(schema, r, "defaultHidingValue", obj, defaultHidingValue, false); GET_BOOL_DS(schema, r, "isDefunct", obj, isDefunct, false); GET_BOOL_DS(schema, r, "systemOnly", obj, systemOnly, false); return WERR_OK; }