static PyObject *py_samdb_ntds_invocation_id(PyObject *self, PyObject *args) { PyObject *py_ldb, *result; struct ldb_context *ldb; const struct GUID *guid; char *retstr; if (!PyArg_ParseTuple(args, "O", &py_ldb)) { return NULL; } PyErr_LDB_OR_RAISE(py_ldb, ldb); guid = samdb_ntds_invocation_id(ldb); if (guid == NULL) { PyErr_SetString(PyExc_RuntimeError, "Failed to find NTDS invocation ID"); return NULL; } retstr = GUID_string(NULL, guid); if (retstr == NULL) { PyErr_NoMemory(); return NULL; } result = PyString_FromString(retstr); talloc_free(retstr); return result; }
/** * Increments schemaInfo revision and save it to DB * setting our invocationID in the process * NOTE: this function should be called in a transaction * much in the same way prefixMap update function is called * * @param ldb_module current module * @param schema schema cache * @param dsdb_flags DSDB_FLAG_... flag of 0 */ int dsdb_module_schema_info_update(struct ldb_module *ldb_module, struct dsdb_schema *schema, int dsdb_flags, struct ldb_request *parent) { int ret; const struct GUID *invocation_id; DATA_BLOB ndr_blob; struct dsdb_schema_info *schema_info; const char *schema_info_str; WERROR werr; TALLOC_CTX *temp_ctx = talloc_new(schema); if (temp_ctx == NULL) { return ldb_module_oom(ldb_module); } invocation_id = samdb_ntds_invocation_id(ldb_module_get_ctx(ldb_module)); if (!invocation_id) { talloc_free(temp_ctx); return ldb_operr(ldb_module_get_ctx(ldb_module)); } /* read serialized schemaInfo from LDB */ ret = dsdb_module_schema_info_read(ldb_module, dsdb_flags, temp_ctx, &schema_info, parent); if (ret == LDB_ERR_NO_SUCH_ATTRIBUTE) { /* make default value in case * we have no schemaInfo value yet */ werr = dsdb_schema_info_new(temp_ctx, &schema_info); if (!W_ERROR_IS_OK(werr)) { talloc_free(temp_ctx); return ldb_module_oom(ldb_module); } ret = LDB_SUCCESS; } if (ret != LDB_SUCCESS) { talloc_free(temp_ctx); return ret; } /* update schemaInfo */ schema_info->revision++; schema_info->invocation_id = *invocation_id; ret = dsdb_module_schema_info_write(ldb_module, dsdb_flags, schema_info, parent); if (ret != LDB_SUCCESS) { ldb_asprintf_errstring(ldb_module_get_ctx(ldb_module), "dsdb_module_schema_info_update: failed to save schemaInfo - %s\n", ldb_strerror(ret)); talloc_free(temp_ctx); return ret; } /* finally, update schema_info in the cache */ werr = dsdb_blob_from_schema_info(schema_info, temp_ctx, &ndr_blob); if (!W_ERROR_IS_OK(werr)) { ldb_asprintf_errstring(ldb_module_get_ctx(ldb_module), "Failed to get schema info"); talloc_free(temp_ctx); return ldb_operr(ldb_module_get_ctx(ldb_module)); } schema_info_str = hex_encode_talloc(schema, ndr_blob.data, ndr_blob.length); if (!schema_info_str) { talloc_free(temp_ctx); return ldb_module_oom(ldb_module); } talloc_unlink(schema, discard_const(schema->schema_info)); schema->schema_info = schema_info_str; talloc_free(temp_ctx); return LDB_SUCCESS; }