⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ldif_handlers.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -