static bool torture_syntax_add_OR_Name(struct torture_context *tctx, struct ldb_context *ldb, struct dsdb_schema *schema) { WERROR werr; int ldb_res; struct ldb_ldif *ldif; const char *ldif_str = "dn: CN=ms-Exch-Auth-Orig,CN=Schema,CN=Configuration,DC=kma-exch,DC=devel\n" "changetype: add\n" "cn: ms-Exch-Auth-Orig\n" "attributeID: 1.2.840.113556.1.2.129\n" "attributeSyntax: 2.5.5.7\n" "isSingleValued: FALSE\n" "linkID: 110\n" "showInAdvancedViewOnly: TRUE\n" "adminDisplayName: ms-Exch-Auth-Orig\n" "oMObjectClass:: VgYBAgULHQ==\n" "adminDescription: ms-Exch-Auth-Orig\n" "oMSyntax: 127\n" "searchFlags: 16\n" "lDAPDisplayName: authOrig\n" "name: ms-Exch-Auth-Orig\n" "objectGUID:: 7tqEWktjAUqsZXqsFPQpRg==\n" "schemaIDGUID:: l3PfqOrF0RG7ywCAx2ZwwA==\n" "attributeSecurityGUID:: VAGN5Pi80RGHAgDAT7lgUA==\n" "isMemberOfPartialAttributeSet: TRUE\n"; ldif = ldb_ldif_read_string(ldb, &ldif_str); torture_assert(tctx, ldif, "Failed to parse LDIF for authOrig"); werr = dsdb_set_attribute_from_ldb(ldb, schema, ldif->msg); ldb_ldif_read_free(ldb, ldif); torture_assert_werr_ok(tctx, werr, "dsdb_set_attribute_from_ldb() failed!"); ldb_res = dsdb_set_schema(ldb, schema); torture_assert_int_equal(tctx, ldb_res, LDB_SUCCESS, "dsdb_set_schema() failed"); return true; };
WERROR dsdb_set_schema_from_ldif(struct ldb_context *ldb, const char *pf, const char *df, const char *dn) { struct ldb_ldif *ldif; struct ldb_message *msg; TALLOC_CTX *mem_ctx; WERROR status; int ret; struct dsdb_schema *schema; const struct ldb_val *prefix_val; const struct ldb_val *info_val; struct ldb_val info_val_default; mem_ctx = talloc_new(ldb); if (!mem_ctx) { goto nomem; } schema = dsdb_new_schema(mem_ctx); if (!schema) { goto nomem; } schema->base_dn = ldb_dn_new(schema, ldb, dn); if (!schema->base_dn) { goto nomem; } schema->fsmo.we_are_master = true; schema->fsmo.update_allowed = true; schema->fsmo.master_dn = ldb_dn_new(schema, ldb, "@PROVISION_SCHEMA_MASTER"); if (!schema->fsmo.master_dn) { goto nomem; } /* * load the prefixMap attribute from pf */ ldif = ldb_ldif_read_string(ldb, &pf); if (!ldif) { status = WERR_INVALID_PARAM; goto failed; } talloc_steal(mem_ctx, ldif); ret = ldb_msg_normalize(ldb, mem_ctx, ldif->msg, &msg); if (ret != LDB_SUCCESS) { goto nomem; } talloc_free(ldif); prefix_val = ldb_msg_find_ldb_val(msg, "prefixMap"); if (!prefix_val) { status = WERR_INVALID_PARAM; goto failed; } info_val = ldb_msg_find_ldb_val(msg, "schemaInfo"); if (!info_val) { status = dsdb_schema_info_blob_new(mem_ctx, &info_val_default); W_ERROR_NOT_OK_GOTO(status, failed); info_val = &info_val_default; } status = dsdb_load_oid_mappings_ldb(schema, prefix_val, info_val); if (!W_ERROR_IS_OK(status)) { DEBUG(0,("ERROR: dsdb_load_oid_mappings_ldb() failed with %s\n", win_errstr(status))); goto failed; } /* load the attribute and class definitions out of df */ while ((ldif = ldb_ldif_read_string(ldb, &df))) { talloc_steal(mem_ctx, ldif); ret = ldb_msg_normalize(ldb, ldif, ldif->msg, &msg); if (ret != LDB_SUCCESS) { goto nomem; } status = dsdb_schema_set_el_from_ldb_msg(ldb, schema, msg); talloc_free(ldif); if (!W_ERROR_IS_OK(status)) { goto failed; } } ret = dsdb_set_schema(ldb, schema); if (ret != LDB_SUCCESS) { status = WERR_FOOBAR; goto failed; } ret = dsdb_schema_fill_extended_dn(ldb, schema); if (ret != LDB_SUCCESS) { status = WERR_FOOBAR; goto failed; } goto done; nomem: status = WERR_NOMEM; failed: done: talloc_free(mem_ctx); return status; }
/** * Loads dsdb_schema from ldb connection using remote prefixMap. * Schema will be loaded only if: * - ldb has no attached schema * - reload_schema is true * * This function is to be used in tests that use GetNCChanges() function */ bool drs_util_dsdb_schema_load_ldb(struct torture_context *tctx, struct ldb_context *ldb, const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr, bool reload_schema) { int i, ret; WERROR werr; const char *err_msg; struct ldb_result *a_res; struct ldb_result *c_res; struct ldb_dn *schema_dn; struct dsdb_schema *ldap_schema; ldap_schema = dsdb_get_schema(ldb, NULL); if (ldap_schema && !reload_schema) { return true; } schema_dn = ldb_get_schema_basedn(ldb); torture_assert(tctx, schema_dn != NULL, talloc_asprintf(tctx, "ldb_get_schema_basedn() failed: %s", ldb_errstring(ldb))); ldap_schema = dsdb_new_schema(ldb); torture_assert(tctx, ldap_schema != NULL, "dsdb_new_schema() failed!"); werr = dsdb_load_prefixmap_from_drsuapi(ldap_schema, mapping_ctr); torture_assert_werr_ok(tctx, werr, "Failed to construct prefixMap from drsuapi data"); /* * load the attribute definitions */ ret = ldb_search(ldb, ldap_schema, &a_res, schema_dn, LDB_SCOPE_ONELEVEL, NULL, "(objectClass=attributeSchema)"); if (ret != LDB_SUCCESS) { err_msg = talloc_asprintf(tctx, "failed to search attributeSchema objects: %s", ldb_errstring(ldb)); torture_fail(tctx, err_msg); } /* * load the objectClass definitions */ ret = ldb_search(ldb, ldap_schema, &c_res, schema_dn, LDB_SCOPE_ONELEVEL, NULL, "(objectClass=classSchema)"); if (ret != LDB_SUCCESS) { err_msg = talloc_asprintf(tctx, "failed to search classSchema objects: %s", ldb_errstring(ldb)); torture_fail(tctx, err_msg); } /* Build schema */ for (i=0; i < a_res->count; i++) { werr = dsdb_attribute_from_ldb(ldb, ldap_schema, a_res->msgs[i]); torture_assert_werr_ok(tctx, werr, talloc_asprintf(tctx, "dsdb_attribute_from_ldb() failed for: %s", ldb_dn_get_linearized(a_res->msgs[i]->dn))); } for (i=0; i < c_res->count; i++) { werr = dsdb_class_from_ldb(ldap_schema, c_res->msgs[i]); torture_assert_werr_ok(tctx, werr, talloc_asprintf(tctx, "dsdb_class_from_ldb() failed for: %s", ldb_dn_get_linearized(c_res->msgs[i]->dn))); } talloc_free(a_res); talloc_free(c_res); ret = dsdb_set_schema(ldb, ldap_schema); if (ret != LDB_SUCCESS) { torture_fail(tctx, talloc_asprintf(tctx, "dsdb_set_schema() failed: %s", ldb_strerror(ret))); } return true; }
WERROR dsdb_set_schema_from_ldif(struct ldb_context *ldb, const char *pf, const char *df) { struct ldb_ldif *ldif; struct ldb_message *msg; TALLOC_CTX *mem_ctx; WERROR status; int ret; struct dsdb_schema *schema; const struct ldb_val *prefix_val; const struct ldb_val *info_val; struct ldb_val info_val_default; mem_ctx = talloc_new(ldb); if (!mem_ctx) { goto nomem; } schema = dsdb_new_schema(mem_ctx, lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm"))); schema->fsmo.we_are_master = true; schema->fsmo.master_dn = ldb_dn_new_fmt(schema, ldb, "@PROVISION_SCHEMA_MASTER"); if (!schema->fsmo.master_dn) { goto nomem; } /* * load the prefixMap attribute from pf */ ldif = ldb_ldif_read_string(ldb, &pf); if (!ldif) { status = WERR_INVALID_PARAM; goto failed; } talloc_steal(mem_ctx, ldif); msg = ldb_msg_canonicalize(ldb, ldif->msg); if (!msg) { goto nomem; } talloc_steal(mem_ctx, msg); talloc_free(ldif); prefix_val = ldb_msg_find_ldb_val(msg, "prefixMap"); if (!prefix_val) { status = WERR_INVALID_PARAM; goto failed; } info_val = ldb_msg_find_ldb_val(msg, "schemaInfo"); if (!info_val) { info_val_default = strhex_to_data_blob(mem_ctx, "FF0000000000000000000000000000000000000000"); if (!info_val_default.data) { goto nomem; } info_val = &info_val_default; } status = dsdb_load_oid_mappings_ldb(schema, prefix_val, info_val); if (!W_ERROR_IS_OK(status)) { goto failed; } /* * load the attribute and class definitions outof df */ while ((ldif = ldb_ldif_read_string(ldb, &df))) { talloc_steal(mem_ctx, ldif); msg = ldb_msg_canonicalize(ldb, ldif->msg); if (!msg) { goto nomem; } status = dsdb_schema_set_el_from_ldb_msg(ldb, schema, msg); talloc_free(ldif); if (!W_ERROR_IS_OK(status)) { goto failed; } } ret = dsdb_set_schema(ldb, schema); if (ret != LDB_SUCCESS) { status = WERR_FOOBAR; goto failed; } ret = dsdb_schema_fill_extended_dn(ldb, schema); if (ret != LDB_SUCCESS) { status = WERR_FOOBAR; goto failed; } goto done; nomem: status = WERR_NOMEM; failed: done: talloc_free(mem_ctx); return status; }