📄 ldif_handlers.c
字号:
return LDB_SUCCESS; } } *out = data_blob_string_const(ldb_dn_alloc_casefold(mem_ctx, dn1)); talloc_free(tmp_ctx); if (!out->data) { return LDB_ERR_OPERATIONS_ERROR; } return LDB_SUCCESS;}static int ldif_comparison_objectCategory(struct ldb_context *ldb, void *mem_ctx, const struct ldb_val *v1, const struct ldb_val *v2){ int ret, ret1, ret2; struct ldb_val v1_canon, v2_canon; TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx); /* I could try and bail if tmp_ctx was NULL, but what return * value would I use? * * It seems easier to continue on the NULL context */ ret1 = ldif_canonicalise_objectCategory(ldb, tmp_ctx, v1, &v1_canon); ret2 = ldif_canonicalise_objectCategory(ldb, tmp_ctx, v2, &v2_canon); if (ret1 == LDB_SUCCESS && ret2 == LDB_SUCCESS) { ret = data_blob_cmp(&v1_canon, &v2_canon); } else { ret = data_blob_cmp(v1, v2); } talloc_free(tmp_ctx); return ret;}/* convert a ldif formatted prefixMap to a NDR formatted blob*/static int ldif_read_prefixMap(struct ldb_context *ldb, void *mem_ctx, const struct ldb_val *in, struct ldb_val *out){ struct prefixMapBlob *blob; enum ndr_err_code ndr_err; char *string, *line, *p, *oid; TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx); if (tmp_ctx == NULL) { return -1; } blob = talloc_zero(tmp_ctx, struct prefixMapBlob); if (blob == NULL) { talloc_free(blob); return -1; } blob->version = PREFIX_MAP_VERSION_DSDB; string = talloc_strndup(mem_ctx, (const char *)in->data, in->length); if (string == NULL) { talloc_free(blob); return -1; } line = string; while (line && line[0]) { p=strchr(line, ';'); if (p) { p[0] = '\0'; } else { p=strchr(line, '\n'); if (p) { p[0] = '\0'; } } /* allow a traling seperator */ if (line == p) { break; } blob->ctr.dsdb.mappings = talloc_realloc(blob, blob->ctr.dsdb.mappings, struct drsuapi_DsReplicaOIDMapping, blob->ctr.dsdb.num_mappings+1); if (!blob->ctr.dsdb.mappings) { talloc_free(tmp_ctx); return -1; } blob->ctr.dsdb.mappings[blob->ctr.dsdb.num_mappings].id_prefix = strtoul(line, &oid, 10); if (oid[0] != ':') { talloc_free(tmp_ctx); return -1; } /* we know there must be at least ":" */ oid++; blob->ctr.dsdb.mappings[blob->ctr.dsdb.num_mappings].oid.oid = talloc_strdup(blob->ctr.dsdb.mappings, oid); blob->ctr.dsdb.num_mappings++; /* Now look past the terminator we added above */ if (p) { line = p + 1; } else { line = NULL; } } ndr_err = ndr_push_struct_blob(out, mem_ctx, lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm")), blob, (ndr_push_flags_fn_t)ndr_push_prefixMapBlob); talloc_free(tmp_ctx); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { return -1; } return 0;}/* convert a NDR formatted blob to a ldif formatted prefixMap*/static int ldif_write_prefixMap(struct ldb_context *ldb, void *mem_ctx, const struct ldb_val *in, struct ldb_val *out){ struct prefixMapBlob *blob; enum ndr_err_code ndr_err; char *string; uint32_t i; blob = talloc(mem_ctx, struct prefixMapBlob); if (blob == NULL) { return -1; } ndr_err = ndr_pull_struct_blob(in, blob, lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm")), blob, (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { talloc_free(blob); return -1; } if (blob->version != PREFIX_MAP_VERSION_DSDB) { return -1; } string = talloc_strdup(mem_ctx, ""); if (string == NULL) { return -1; } for (i=0; i < blob->ctr.dsdb.num_mappings; i++) { if (i > 0) { string = talloc_asprintf_append(string, ";"); } string = talloc_asprintf_append(string, "%u:%s", blob->ctr.dsdb.mappings[i].id_prefix, blob->ctr.dsdb.mappings[i].oid.oid); if (string == NULL) { return -1; } } talloc_free(blob); *out = data_blob_string_const(string); return 0;}static bool ldif_comparision_prefixMap_isString(const struct ldb_val *v){ if (v->length < 4) { return true; } if (IVAL(v->data, 0) == PREFIX_MAP_VERSION_DSDB) { return false; } return true;}/* canonicalise a prefixMap*/static int ldif_canonicalise_prefixMap(struct ldb_context *ldb, void *mem_ctx, const struct ldb_val *in, struct ldb_val *out){ if (ldif_comparision_prefixMap_isString(in)) { return ldif_read_prefixMap(ldb, mem_ctx, in, out); } return ldb_handler_copy(ldb, mem_ctx, in, out);}static int ldif_comparison_prefixMap(struct ldb_context *ldb, void *mem_ctx, const struct ldb_val *v1, const struct ldb_val *v2){ int ret, ret1, ret2; struct ldb_val v1_canon, v2_canon; TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx); /* I could try and bail if tmp_ctx was NULL, but what return * value would I use? * * It seems easier to continue on the NULL context */ ret1 = ldif_canonicalise_prefixMap(ldb, tmp_ctx, v1, &v1_canon); ret2 = ldif_canonicalise_prefixMap(ldb, tmp_ctx, v2, &v2_canon); if (ret1 == LDB_SUCCESS && ret2 == LDB_SUCCESS) { ret = data_blob_cmp(&v1_canon, &v2_canon); } else { ret = data_blob_cmp(v1, v2); } talloc_free(tmp_ctx); return ret;}#define LDB_SYNTAX_SAMBA_SID "LDB_SYNTAX_SAMBA_SID"#define LDB_SYNTAX_SAMBA_SECURITY_DESCRIPTOR "LDB_SYNTAX_SAMBA_SECURITY_DESCRIPTOR"#define LDB_SYNTAX_SAMBA_GUID "LDB_SYNTAX_SAMBA_GUID"#define LDB_SYNTAX_SAMBA_OBJECT_CATEGORY "LDB_SYNTAX_SAMBA_OBJECT_CATEGORY"#define LDB_SYNTAX_SAMBA_PREFIX_MAP "LDB_SYNTAX_SAMBA_PREFIX_MAP"static const struct ldb_schema_syntax samba_syntaxes[] = { { .name = LDB_SYNTAX_SAMBA_SID, .ldif_read_fn = ldif_read_objectSid, .ldif_write_fn = ldif_write_objectSid, .canonicalise_fn= ldb_canonicalise_objectSid, .comparison_fn = ldb_comparison_objectSid },{ .name = LDB_SYNTAX_SAMBA_SECURITY_DESCRIPTOR, .ldif_read_fn = ldif_read_ntSecurityDescriptor, .ldif_write_fn = ldif_write_ntSecurityDescriptor, .canonicalise_fn= ldb_handler_copy, .comparison_fn = ldb_comparison_binary },{ .name = LDB_SYNTAX_SAMBA_GUID, .ldif_read_fn = ldif_read_objectGUID, .ldif_write_fn = ldif_write_objectGUID, .canonicalise_fn= ldb_canonicalise_objectGUID, .comparison_fn = ldb_comparison_objectGUID },{ .name = LDB_SYNTAX_SAMBA_OBJECT_CATEGORY, .ldif_read_fn = ldb_handler_copy, .ldif_write_fn = ldb_handler_copy, .canonicalise_fn= ldif_canonicalise_objectCategory, .comparison_fn = ldif_comparison_objectCategory },{ .name = LDB_SYNTAX_SAMBA_PREFIX_MAP, .ldif_read_fn = ldif_read_prefixMap, .ldif_write_fn = ldif_write_prefixMap, .canonicalise_fn= ldif_canonicalise_prefixMap, .comparison_fn = ldif_comparison_prefixMap }};static const struct { const char *name; const char *syntax;} samba_attributes[] = { { "objectSid", LDB_SYNTAX_SAMBA_SID }, { "securityIdentifier", LDB_SYNTAX_SAMBA_SID }, { "ntSecurityDescriptor", LDB_SYNTAX_SAMBA_SECURITY_DESCRIPTOR }, { "objectGUID", LDB_SYNTAX_SAMBA_GUID }, { "invocationId", LDB_SYNTAX_SAMBA_GUID }, { "schemaIDGUID", LDB_SYNTAX_SAMBA_GUID }, { "attributeSecurityGUID", LDB_SYNTAX_SAMBA_GUID }, { "parentGUID", LDB_SYNTAX_SAMBA_GUID }, { "siteGUID", LDB_SYNTAX_SAMBA_GUID }, { "pKTGUID", LDB_SYNTAX_SAMBA_GUID }, { "fRSVersionGUID", LDB_SYNTAX_SAMBA_GUID }, { "fRSReplicaSetGUID", LDB_SYNTAX_SAMBA_GUID }, { "netbootGUID", LDB_SYNTAX_SAMBA_GUID }, { "objectCategory", LDB_SYNTAX_SAMBA_OBJECT_CATEGORY }, { "member", LDB_SYNTAX_DN }, { "memberOf", LDB_SYNTAX_DN }, { "nCName", LDB_SYNTAX_DN }, { "schemaNamingContext", LDB_SYNTAX_DN }, { "configurationNamingContext", LDB_SYNTAX_DN }, { "rootDomainNamingContext", LDB_SYNTAX_DN }, { "defaultNamingContext", LDB_SYNTAX_DN }, { "subRefs", LDB_SYNTAX_DN }, { "dMDLocation", LDB_SYNTAX_DN }, { "serverReference", LDB_SYNTAX_DN }, { "masteredBy", LDB_SYNTAX_DN }, { "msDs-masteredBy", LDB_SYNTAX_DN }, { "fSMORoleOwner", LDB_SYNTAX_DN }, { "prefixMap", LDB_SYNTAX_SAMBA_PREFIX_MAP }};/* register the samba ldif handlers*/int ldb_register_samba_handlers(struct ldb_context *ldb){ uint32_t i; for (i=0; i < ARRAY_SIZE(samba_attributes); i++) { int ret; uint32_t j; const struct ldb_schema_syntax *s = NULL; for (j=0; j < ARRAY_SIZE(samba_syntaxes); j++) { if (strcmp(samba_attributes[i].syntax, samba_syntaxes[j].name) == 0) { s = &samba_syntaxes[j]; break; } } if (!s) { s = ldb_standard_syntax_by_name(ldb, samba_attributes[i].syntax); } if (!s) { return -1; } ret = ldb_schema_attribute_add_with_syntax(ldb, samba_attributes[i].name, 0, s); if (ret != LDB_SUCCESS) { return ret; } } return LDB_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -