static PyObject *py_dsdb_get_lDAPDisplayName_by_attid(PyObject *self, PyObject *args) { PyObject *py_ldb; struct ldb_context *ldb; struct dsdb_schema *schema; const struct dsdb_attribute *a; uint32_t attid; if (!PyArg_ParseTuple(args, "Oi", &py_ldb, &attid)) return NULL; PyErr_LDB_OR_RAISE(py_ldb, ldb); schema = dsdb_get_schema(ldb, NULL); if (!schema) { PyErr_SetString(PyExc_RuntimeError, "Failed to find a schema from ldb"); return NULL; } a = dsdb_attribute_by_attributeID_id(schema, attid); if (a == NULL) { PyErr_Format(PyExc_KeyError, "Failed to find attribute '0x%08x'", attid); return NULL; } return PyString_FromString(a->lDAPDisplayName); }
WERROR dsdb_attribute_drsuapi_to_ldb(const struct dsdb_schema *schema, const struct drsuapi_DsReplicaAttribute *in, TALLOC_CTX *mem_ctx, struct ldb_message_element *out) { const struct dsdb_attribute *sa; sa = dsdb_attribute_by_attributeID_id(schema, in->attid); if (!sa) { return WERR_FOOBAR; } return sa->syntax->drsuapi_to_ldb(schema, sa, in, mem_ctx, out); }
const char *dsdb_lDAPDisplayName_by_id(const struct dsdb_schema *schema, uint32_t id) { const struct dsdb_attribute *a; const struct dsdb_class *c; a = dsdb_attribute_by_attributeID_id(schema, id); if (a) { return a->lDAPDisplayName; } c = dsdb_class_by_governsID_id(schema, id); if (c) { return c->lDAPDisplayName; } return NULL; }
/* get metadata version 2 info for a specified object DN */ static WERROR kccdrs_replica_get_info_obj_metadata2(TALLOC_CTX *mem_ctx, struct ldb_context *samdb, struct drsuapi_DsReplicaGetInfo *r, union drsuapi_DsReplicaInfo *reply, struct ldb_dn *dn, uint32_t base_index) { WERROR status; struct replPropertyMetaDataBlob omd_ctr; struct replPropertyMetaData1 *attr; struct drsuapi_DsReplicaObjMetaData2Ctr *metadata2; const struct dsdb_schema *schema; uint32_t i, j; DEBUG(0, ("kccdrs_replica_get_info_obj_metadata2() called\n")); if (!dn) { return WERR_INVALID_PARAMETER; } if (!ldb_dn_validate(dn)) { return WERR_DS_DRA_BAD_DN; } status = get_repl_prop_metadata_ctr(mem_ctx, samdb, dn, &omd_ctr); W_ERROR_NOT_OK_RETURN(status); schema = dsdb_get_schema(samdb, reply); if (!schema) { DEBUG(0,(__location__": Failed to get the schema\n")); return WERR_INTERNAL_ERROR; } reply->objmetadata2 = talloc_zero(mem_ctx, struct drsuapi_DsReplicaObjMetaData2Ctr); W_ERROR_HAVE_NO_MEMORY(reply->objmetadata2); metadata2 = reply->objmetadata2; metadata2->enumeration_context = 0; /* For each replicated attribute of the object */ for (i = 0, j = 0; i < omd_ctr.ctr.ctr1.count; i++) { const struct dsdb_attribute *schema_attr; uint32_t attr_version; NTTIME attr_change_time; uint32_t attr_originating_usn; /* attr := attrsSeq[i] s := AttrStamp(object, attr) */ /* get a reference to the attribute on 'omd_ctr' */ attr = &omd_ctr.ctr.ctr1.array[j]; schema_attr = dsdb_attribute_by_attributeID_id(schema, attr->attid); DEBUG(0, ("attribute_id = %d, attribute_name: %s\n", attr->attid, schema_attr->lDAPDisplayName)); /* if (attr in Link Attributes of object and dwInVersion = 2 and DS_REPL_INFO_FLAG_IMPROVE_LINKED_ATTRS in msgIn.ulFlags) */ if (schema_attr && schema_attr->linkID != 0 && /* Checks if attribute is a linked attribute */ (schema_attr->linkID % 2) == 0 && /* is it a forward link? only forward links have the LinkValueStamp */ r->in.level == 2 && (r->in.req->req2.flags & DRSUAPI_DS_LINKED_ATTRIBUTE_FLAG_ACTIVE)) /* on MS-DRSR it is DS_REPL_INFO_FLAG_IMPROVE_LINKED_ATTRS */ { /* ls := LinkValueStamp of the most recent value change in object!attr */ status = get_linked_attribute_value_stamp(mem_ctx, samdb, dn, schema_attr->lDAPDisplayName, &attr_version, &attr_change_time, &attr_originating_usn); W_ERROR_NOT_OK_RETURN(status); /* Aligning to MS-DRSR 4.1.13.3: 's' on the doc is 'attr->originating_change_time' here 'ls' on the doc is 'attr_change_time' here */ /* if (ls is more recent than s (based on order in which the change was applied on server)) then */ if (attr_change_time > attr->originating_change_time) { /* Improve the stamp with the link value stamp. s.dwVersion := ls.dwVersion s.timeChanged := ls.timeChanged s.uuidOriginating := NULLGUID s.usnOriginating := ls.usnOriginating */ attr->version = attr_version; attr->originating_change_time = attr_change_time; attr->originating_invocation_id = GUID_zero(); attr->originating_usn = attr_originating_usn; } } if (i < base_index) { continue; } metadata2->array = talloc_realloc(mem_ctx, metadata2->array, struct drsuapi_DsReplicaObjMetaData2, j + 1); W_ERROR_HAVE_NO_MEMORY(metadata2->array); metadata2->array[j].attribute_name = schema_attr->lDAPDisplayName; metadata2->array[j].local_usn = attr->local_usn; metadata2->array[j].originating_change_time = attr->originating_change_time; metadata2->array[j].originating_invocation_id = attr->originating_invocation_id; metadata2->array[j].originating_usn = attr->originating_usn; metadata2->array[j].version = attr->version; /* originating_dsa_dn := GetDNFromInvocationID(originating_invocation_id) GetDNFromInvocationID() should return the DN of the nTDSDSAobject that has the specified invocation ID See MS-DRSR 4.1.13.3 and 4.1.13.2.1 */ status = get_dn_from_invocation_id(mem_ctx, samdb, &attr->originating_invocation_id, &metadata2->array[j].originating_dsa_dn); W_ERROR_NOT_OK_RETURN(status); j++; metadata2->count = j; } return WERR_OK; }
static WERROR dsdb_repl_merge_working_schema(struct ldb_context *ldb, struct dsdb_schema *dest_schema, const struct dsdb_schema *ref_schema) { const struct dsdb_class *cur_class = NULL; const struct dsdb_attribute *cur_attr = NULL; int ret; for (cur_class = ref_schema->classes; cur_class; cur_class = cur_class->next) { const struct dsdb_class *tmp1; struct dsdb_class *tmp2; tmp1 = dsdb_class_by_governsID_id(dest_schema, cur_class->governsID_id); if (tmp1 != NULL) { continue; } /* * Do a shallow copy so that original next and prev are * not modified, we don't need to do a deep copy * as the rest won't be modified and this is for * a short lived object. */ tmp2 = talloc(dest_schema, struct dsdb_class); if (tmp2 == NULL) { return WERR_NOMEM; } *tmp2 = *cur_class; DLIST_ADD(dest_schema->classes, tmp2); } for (cur_attr = ref_schema->attributes; cur_attr; cur_attr = cur_attr->next) { const struct dsdb_attribute *tmp1; struct dsdb_attribute *tmp2; tmp1 = dsdb_attribute_by_attributeID_id(dest_schema, cur_attr->attributeID_id); if (tmp1 != NULL) { continue; } /* * Do a shallow copy so that original next and prev are * not modified, we don't need to do a deep copy * as the rest won't be modified and this is for * a short lived object. */ tmp2 = talloc(dest_schema, struct dsdb_attribute); if (tmp2 == NULL) { return WERR_NOMEM; } *tmp2 = *cur_attr; DLIST_ADD(dest_schema->attributes, tmp2); } ret = dsdb_setup_sorted_accessors(ldb, dest_schema); if (LDB_SUCCESS != ret) { DEBUG(0,("Failed to add new attribute to reference schema!\n")); return WERR_INTERNAL_ERROR; } return WERR_OK; }