WERROR dsdb_set_attribute_from_ldb(struct ldb_context *ldb, struct dsdb_schema *schema, struct ldb_message *msg) { WERROR status; struct dsdb_attribute *attr = talloc_zero(schema, struct dsdb_attribute); if (!attr) { return WERR_NOMEM; } status = dsdb_attribute_from_ldb(schema, msg, attr); if (!W_ERROR_IS_OK(status)) { return status; } attr->syntax = dsdb_syntax_for_attribute(attr); if (!attr->syntax) { DEBUG(0,(__location__ ": Unknown schema syntax for %s\n", attr->lDAPDisplayName)); return WERR_DS_ATT_SCHEMA_REQ_SYNTAX; } if (dsdb_schema_setup_ldb_schema_attribute(ldb, attr) != LDB_SUCCESS) { DEBUG(0,(__location__ ": Unknown schema syntax for %s - ldb_syntax: %s, ldap_oid: %s\n", attr->lDAPDisplayName, attr->syntax->ldb_syntax, attr->syntax->ldap_oid)); return WERR_DS_ATT_SCHEMA_REQ_SYNTAX; } DLIST_ADD(schema->attributes, attr); return WERR_OK; }
/** * Add an element to the schema (attribute or class) from an LDB message */ WERROR dsdb_schema_set_el_from_ldb_msg(struct ldb_context *ldb, struct dsdb_schema *schema, struct ldb_message *msg) { static struct ldb_parse_tree *attr_tree, *class_tree; if (!attr_tree) { attr_tree = ldb_parse_tree(talloc_autofree_context(), "(objectClass=attributeSchema)"); if (!attr_tree) { return WERR_NOMEM; } } if (!class_tree) { class_tree = ldb_parse_tree(talloc_autofree_context(), "(objectClass=classSchema)"); if (!class_tree) { return WERR_NOMEM; } } if (ldb_match_msg(ldb, msg, attr_tree, NULL, LDB_SCOPE_BASE)) { return dsdb_attribute_from_ldb(ldb, schema, msg); } else if (ldb_match_msg(ldb, msg, class_tree, NULL, LDB_SCOPE_BASE)) { return dsdb_class_from_ldb(schema, msg); } /* Don't fail on things not classes or attributes */ return WERR_OK; }
/** * 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; }
int dsdb_schema_from_ldb_results(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, struct ldb_result *schema_res, struct ldb_result *attrs_res, struct ldb_result *objectclass_res, struct dsdb_schema **schema_out, char **error_string) { WERROR status; unsigned int i; const struct ldb_val *prefix_val; const struct ldb_val *info_val; struct ldb_val info_val_default; struct dsdb_schema *schema; schema = dsdb_new_schema(mem_ctx); if (!schema) { dsdb_oom(error_string, mem_ctx); return ldb_operr(ldb); } schema->base_dn = talloc_steal(schema, schema_res->msgs[0]->dn); prefix_val = ldb_msg_find_ldb_val(schema_res->msgs[0], "prefixMap"); if (!prefix_val) { *error_string = talloc_asprintf(mem_ctx, "schema_fsmo_init: no prefixMap attribute found"); DEBUG(0,(__location__ ": %s\n", *error_string)); return LDB_ERR_CONSTRAINT_VIOLATION; } info_val = ldb_msg_find_ldb_val(schema_res->msgs[0], "schemaInfo"); if (!info_val) { status = dsdb_schema_info_blob_new(mem_ctx, &info_val_default); if (!W_ERROR_IS_OK(status)) { *error_string = talloc_asprintf(mem_ctx, "schema_fsmo_init: dsdb_schema_info_blob_new() failed - %s", win_errstr(status)); DEBUG(0,(__location__ ": %s\n", *error_string)); return ldb_operr(ldb); } info_val = &info_val_default; } status = dsdb_load_oid_mappings_ldb(schema, prefix_val, info_val); if (!W_ERROR_IS_OK(status)) { *error_string = talloc_asprintf(mem_ctx, "schema_fsmo_init: failed to load oid mappings: %s", win_errstr(status)); DEBUG(0,(__location__ ": %s\n", *error_string)); return LDB_ERR_CONSTRAINT_VIOLATION; } for (i=0; i < attrs_res->count; i++) { status = dsdb_attribute_from_ldb(ldb, schema, attrs_res->msgs[i]); if (!W_ERROR_IS_OK(status)) { *error_string = talloc_asprintf(mem_ctx, "schema_fsmo_init: failed to load attribute definition: %s:%s", ldb_dn_get_linearized(attrs_res->msgs[i]->dn), win_errstr(status)); DEBUG(0,(__location__ ": %s\n", *error_string)); return LDB_ERR_CONSTRAINT_VIOLATION; } } for (i=0; i < objectclass_res->count; i++) { status = dsdb_class_from_ldb(schema, objectclass_res->msgs[i]); if (!W_ERROR_IS_OK(status)) { *error_string = talloc_asprintf(mem_ctx, "schema_fsmo_init: failed to load class definition: %s:%s", ldb_dn_get_linearized(objectclass_res->msgs[i]->dn), win_errstr(status)); DEBUG(0,(__location__ ": %s\n", *error_string)); return LDB_ERR_CONSTRAINT_VIOLATION; } } schema->fsmo.master_dn = ldb_msg_find_attr_as_dn(ldb, schema, schema_res->msgs[0], "fSMORoleOwner"); if (ldb_dn_compare(samdb_ntds_settings_dn(ldb), schema->fsmo.master_dn) == 0) { schema->fsmo.we_are_master = true; } else { schema->fsmo.we_are_master = false; } DEBUG(5, ("schema_fsmo_init: we are master: %s\n", (schema->fsmo.we_are_master?"yes":"no"))); *schema_out = schema; return LDB_SUCCESS; }