libnet_samsync_ldb.c

来自「samba最新软件」· C语言 代码 · 共 1,250 行 · 第 1/3 页

C
1,250
字号
	} else {		container = "Users";		obj_class = "user";	}	if (add) {		samdb_msg_add_string(state->sam_ldb, mem_ctx, msg, 				     "objectClass", obj_class);		if (!msg->dn) {			msg->dn = ldb_dn_copy(mem_ctx, state->base_dn[database]);			ldb_dn_add_child_fmt(msg->dn, "CN=%s,CN=%s", cn_name, container);			if (!msg->dn) {				return NT_STATUS_NO_MEMORY;					}		}		ret = ldb_add(state->sam_ldb, msg);		if (ret != 0) {			struct ldb_dn *first_try_dn = msg->dn;			/* Try again with the default DN */			if (!remote_msgs) {				*error_string = talloc_asprintf(mem_ctx, "Failed to create user record.  Tried %s: %s",								ldb_dn_get_linearized(first_try_dn),								ldb_errstring(state->sam_ldb));				return NT_STATUS_INTERNAL_DB_CORRUPTION;			} else {				msg->dn = talloc_steal(msg, remote_msgs[0]->dn);				ret = ldb_add(state->sam_ldb, msg);				if (ret != 0) {					*error_string = talloc_asprintf(mem_ctx, "Failed to create user record.  Tried both %s and %s: %s",									ldb_dn_get_linearized(first_try_dn),									ldb_dn_get_linearized(msg->dn),									ldb_errstring(state->sam_ldb));					return NT_STATUS_INTERNAL_DB_CORRUPTION;				}			}		}	} else {		ret = samdb_replace(state->sam_ldb, mem_ctx, msg);		if (ret != 0) {			*error_string = talloc_asprintf(mem_ctx, "Failed to modify user record %s: %s",							ldb_dn_get_linearized(msg->dn),							ldb_errstring(state->sam_ldb));			return NT_STATUS_INTERNAL_DB_CORRUPTION;		}	}	return NT_STATUS_OK;}static NTSTATUS samsync_ldb_delete_user(TALLOC_CTX *mem_ctx,					struct samsync_ldb_state *state,					enum netr_SamDatabaseID database,					struct netr_DELTA_ENUM *delta,					char **error_string) {	uint32_t rid = delta->delta_id_union.rid;	struct ldb_message **msgs;	int ret;	const char *attrs[] = { NULL };	/* search for the user, by rid */	ret = gendb_search(state->sam_ldb, mem_ctx, state->base_dn[database],			   &msgs, attrs, "(&(objectClass=user)(objectSid=%s))", 			   ldap_encode_ndr_dom_sid(mem_ctx, dom_sid_add_rid(mem_ctx, state->dom_sid[database], rid))); 	if (ret == -1) {		*error_string = talloc_asprintf(mem_ctx, "gendb_search failed: %s", ldb_errstring(state->sam_ldb));		return NT_STATUS_INTERNAL_DB_CORRUPTION;	} else if (ret == 0) {		return NT_STATUS_NO_SUCH_USER;	} else if (ret > 1) {		*error_string = talloc_asprintf(mem_ctx, "More than one user with SID: %s", 						dom_sid_string(mem_ctx, 							       dom_sid_add_rid(mem_ctx, 									       state->dom_sid[database], 									       rid)));		return NT_STATUS_INTERNAL_DB_CORRUPTION;	}	ret = ldb_delete(state->sam_ldb, msgs[0]->dn);	if (ret != 0) {		*error_string = talloc_asprintf(mem_ctx, "Failed to delete user record %s: %s",						ldb_dn_get_linearized(msgs[0]->dn),						ldb_errstring(state->sam_ldb));		return NT_STATUS_INTERNAL_DB_CORRUPTION;	}	return NT_STATUS_OK;}static NTSTATUS samsync_ldb_handle_group(TALLOC_CTX *mem_ctx,					 struct samsync_ldb_state *state,					 enum netr_SamDatabaseID database,					 struct netr_DELTA_ENUM *delta,					 char **error_string) {	uint32_t rid = delta->delta_id_union.rid;	struct netr_DELTA_GROUP *group = delta->delta_union.group;	const char *container, *obj_class;	const char *cn_name;	struct ldb_message *msg;	struct ldb_message **msgs;	int ret;	bool add = false;	const char *attrs[] = { NULL };	msg = ldb_msg_new(mem_ctx);	if (msg == NULL) {		return NT_STATUS_NO_MEMORY;	}	/* search for the group, by rid */	ret = gendb_search(state->sam_ldb, mem_ctx, state->base_dn[database], &msgs, attrs,			   "(&(objectClass=group)(objectSid=%s))", 			   ldap_encode_ndr_dom_sid(mem_ctx, dom_sid_add_rid(mem_ctx, state->dom_sid[database], rid))); 	if (ret == -1) {		*error_string = talloc_asprintf(mem_ctx, "gendb_search failed: %s", ldb_errstring(state->sam_ldb));		return NT_STATUS_INTERNAL_DB_CORRUPTION;	} else if (ret == 0) {		add = true;	} else if (ret > 1) {		*error_string = talloc_asprintf(mem_ctx, "More than one group/alias with SID: %s", 						dom_sid_string(mem_ctx, 							       dom_sid_add_rid(mem_ctx, 									       state->dom_sid[database], 									       rid)));		return NT_STATUS_INTERNAL_DB_CORRUPTION;	} else {		msg->dn = talloc_steal(msg, msgs[0]->dn);	}	cn_name   = group->group_name.string;#define ADD_OR_DEL(type, attrib, field) do {				\		if (group->field) {					\			samdb_msg_add_ ## type(state->sam_ldb, mem_ctx, msg, \					       attrib, group->field);	\		} else if (!add) {					\			samdb_msg_add_delete(state->sam_ldb, mem_ctx, msg, \					     attrib);			\		}							\        } while (0);        ADD_OR_DEL(string, "samAccountName", group_name.string);	if (samdb_msg_add_dom_sid(state->sam_ldb, mem_ctx, msg, 				  "objectSid", dom_sid_add_rid(mem_ctx, state->dom_sid[database], rid))) {		return NT_STATUS_NO_MEMORY; 	}	ADD_OR_DEL(string, "description", description.string);#undef ADD_OR_DEL	container = "Users";	obj_class = "group";	if (add) {		samdb_msg_add_string(state->sam_ldb, mem_ctx, msg, 				     "objectClass", obj_class);		msg->dn = ldb_dn_copy(mem_ctx, state->base_dn[database]);		ldb_dn_add_child_fmt(msg->dn, "CN=%s,CN=%s", cn_name, container);		if (!msg->dn) {			return NT_STATUS_NO_MEMORY;				}		ret = ldb_add(state->sam_ldb, msg);		if (ret != 0) {			*error_string = talloc_asprintf(mem_ctx, "Failed to create group record %s: %s",							ldb_dn_get_linearized(msg->dn),							ldb_errstring(state->sam_ldb));			return NT_STATUS_INTERNAL_DB_CORRUPTION;		}	} else {		ret = samdb_replace(state->sam_ldb, mem_ctx, msg);		if (ret != 0) {			*error_string = talloc_asprintf(mem_ctx, "Failed to modify group record %s: %s",							ldb_dn_get_linearized(msg->dn),							ldb_errstring(state->sam_ldb));			return NT_STATUS_INTERNAL_DB_CORRUPTION;		}	}	return NT_STATUS_OK;}static NTSTATUS samsync_ldb_delete_group(TALLOC_CTX *mem_ctx,					 struct samsync_ldb_state *state,					 enum netr_SamDatabaseID database,					 struct netr_DELTA_ENUM *delta,					 char **error_string) {	uint32_t rid = delta->delta_id_union.rid;	struct ldb_message **msgs;	int ret;	const char *attrs[] = { NULL };	/* search for the group, by rid */	ret = gendb_search(state->sam_ldb, mem_ctx, state->base_dn[database], &msgs, attrs,			   "(&(objectClass=group)(objectSid=%s))", 			   ldap_encode_ndr_dom_sid(mem_ctx, dom_sid_add_rid(mem_ctx, state->dom_sid[database], rid))); 	if (ret == -1) {		*error_string = talloc_asprintf(mem_ctx, "gendb_search failed: %s", ldb_errstring(state->sam_ldb));		return NT_STATUS_INTERNAL_DB_CORRUPTION;	} else if (ret == 0) {		return NT_STATUS_NO_SUCH_GROUP;	} else if (ret > 1) {		*error_string = talloc_asprintf(mem_ctx, "More than one group/alias with SID: %s", 						dom_sid_string(mem_ctx, 							       dom_sid_add_rid(mem_ctx, 									       state->dom_sid[database], 									       rid)));		return NT_STATUS_INTERNAL_DB_CORRUPTION;	}		ret = ldb_delete(state->sam_ldb, msgs[0]->dn);	if (ret != 0) {		*error_string = talloc_asprintf(mem_ctx, "Failed to delete group record %s: %s",						ldb_dn_get_linearized(msgs[0]->dn),						ldb_errstring(state->sam_ldb));		return NT_STATUS_INTERNAL_DB_CORRUPTION;	}	return NT_STATUS_OK;}static NTSTATUS samsync_ldb_handle_group_member(TALLOC_CTX *mem_ctx,						struct samsync_ldb_state *state,						enum netr_SamDatabaseID database,						struct netr_DELTA_ENUM *delta,						char **error_string) {	uint32_t rid = delta->delta_id_union.rid;	struct netr_DELTA_GROUP_MEMBER *group_member = delta->delta_union.group_member;	struct ldb_message *msg;	struct ldb_message **msgs;	int ret;	const char *attrs[] = { NULL };	int i;	msg = ldb_msg_new(mem_ctx);	if (msg == NULL) {		return NT_STATUS_NO_MEMORY;	}	/* search for the group, by rid */	ret = gendb_search(state->sam_ldb, mem_ctx, state->base_dn[database], &msgs, attrs,			   "(&(objectClass=group)(objectSid=%s))", 			   ldap_encode_ndr_dom_sid(mem_ctx, dom_sid_add_rid(mem_ctx, state->dom_sid[database], rid))); 	if (ret == -1) {		*error_string = talloc_asprintf(mem_ctx, "gendb_search failed: %s", ldb_errstring(state->sam_ldb));		return NT_STATUS_INTERNAL_DB_CORRUPTION;	} else if (ret == 0) {		return NT_STATUS_NO_SUCH_GROUP;	} else if (ret > 1) {		*error_string = talloc_asprintf(mem_ctx, "More than one group/alias with SID: %s", 						dom_sid_string(mem_ctx, 							       dom_sid_add_rid(mem_ctx, 									       state->dom_sid[database], 									       rid)));		return NT_STATUS_INTERNAL_DB_CORRUPTION;	} else {		msg->dn = talloc_steal(msg, msgs[0]->dn);	}		talloc_free(msgs);	for (i=0; i<group_member->num_rids; i++) {		/* search for the group, by rid */		ret = gendb_search(state->sam_ldb, mem_ctx, state->base_dn[database], &msgs, attrs,				   "(&(objectClass=user)(objectSid=%s))", 				   ldap_encode_ndr_dom_sid(mem_ctx, dom_sid_add_rid(mem_ctx, state->dom_sid[database], group_member->rids[i]))); 				if (ret == -1) {			*error_string = talloc_asprintf(mem_ctx, "gendb_search failed: %s", ldb_errstring(state->sam_ldb));			return NT_STATUS_INTERNAL_DB_CORRUPTION;		} else if (ret == 0) {			return NT_STATUS_NO_SUCH_USER;		} else if (ret > 1) {			return NT_STATUS_INTERNAL_DB_CORRUPTION;		} else {			samdb_msg_add_string(state->sam_ldb, mem_ctx, msg, "member", ldb_dn_alloc_linearized(mem_ctx, msgs[0]->dn));		}				talloc_free(msgs);	}		ret = samdb_replace(state->sam_ldb, mem_ctx, msg);	if (ret != 0) {		*error_string = talloc_asprintf(mem_ctx, "Failed to modify group record %s: %s",						ldb_dn_get_linearized(msg->dn),						ldb_errstring(state->sam_ldb));		return NT_STATUS_INTERNAL_DB_CORRUPTION;	}	return NT_STATUS_OK;}static NTSTATUS samsync_ldb_handle_alias(TALLOC_CTX *mem_ctx,					 struct samsync_ldb_state *state,					 enum netr_SamDatabaseID database,					 struct netr_DELTA_ENUM *delta,					 char **error_string) {	uint32_t rid = delta->delta_id_union.rid;	struct netr_DELTA_ALIAS *alias = delta->delta_union.alias;	const char *container, *obj_class;	const char *cn_name;	struct ldb_message *msg;	struct ldb_message **msgs;	int ret;	bool add = false;	const char *attrs[] = { NULL };	msg = ldb_msg_new(mem_ctx);	if (msg == NULL) {		return NT_STATUS_NO_MEMORY;	}	/* search for the alias, by rid */	ret = gendb_search(state->sam_ldb, mem_ctx, state->base_dn[database], &msgs, attrs,			   "(&(objectClass=group)(objectSid=%s))", 			   ldap_encode_ndr_dom_sid(mem_ctx, dom_sid_add_rid(mem_ctx, state->dom_sid[database], rid))); 	if (ret == -1) {		*error_string = talloc_asprintf(mem_ctx, "gendb_search failed: %s", ldb_errstring(state->sam_ldb));		return NT_STATUS_INTERNAL_DB_CORRUPTION;	} else if (ret == 0) {		add = true;	} else if (ret > 1) {		*error_string = talloc_asprintf(mem_ctx, "More than one group/alias with SID: %s", 						dom_sid_string(mem_ctx, 							       dom_sid_add_rid(mem_ctx, 									       state->dom_sid[database], 									       rid)));		return NT_STATUS_INTERNAL_DB_CORRUPTION;	} else {		msg->dn = talloc_steal(mem_ctx, msgs[0]->dn);	}	cn_name   = alias->alias_name.string;#define ADD_OR_DEL(type, attrib, field) do {				\		if (alias->field) {					\			samdb_msg_add_ ## type(state->sam_ldb, mem_ctx, msg, \					       attrib, alias->field);	\		} else if (!add) {					\			samdb_msg_add_delete(state->sam_ldb, mem_ctx, msg, \					     attrib);			\		}							\	} while (0);	ADD_OR_DEL(string, "samAccountName", alias_name.string);	if (samdb_msg_add_dom_sid(state->sam_ldb, mem_ctx, msg, 				  "objectSid", dom_sid_add_rid(mem_ctx, state->dom_sid[database], rid))) {		return NT_STATUS_NO_MEMORY; 	}	ADD_OR_DEL(string, "description", description.string);#undef ADD_OR_DEL	samdb_msg_add_uint(state->sam_ldb, mem_ctx, msg, "groupType", 0x80000004);	container = "Users";	obj_class = "group";	if (add) {		samdb_msg_add_string(state->sam_ldb, mem_ctx, msg, 				     "objectClass", obj_class);		msg->dn = ldb_dn_copy(mem_ctx, state->base_dn[database]);		ldb_dn_add_child_fmt(msg->dn, "CN=%s,CN=%s", cn_name, container);		if (!msg->dn) {			return NT_STATUS_NO_MEMORY;				}		ret = ldb_add(state->sam_ldb, msg);		if (ret != 0) {			*error_string = talloc_asprintf(mem_ctx, "Failed to create alias record %s: %s",							ldb_dn_get_linearized(msg->dn),							ldb_errstring(state->sam_ldb));			return NT_STATUS_INTERNAL_DB_CORRUPTION;		}	} else {		ret = samdb_replace(state->sam_ldb, mem_ctx, msg);		if (ret != 0) {			*error_string = talloc_asprintf(mem_ctx, "Failed to modify alias record %s: %s",							ldb_dn_get_linearized(msg->dn),							ldb_errstring(state->sam_ldb));			return NT_STATUS_INTERNAL_DB_CORRUPTION;		}	}	return NT_STATUS_OK;}static NTSTATUS samsync_ldb_delete_alias(TALLOC_CTX *mem_ctx,					 struct samsync_ldb_state *state,					 enum netr_SamDatabaseID database,					 struct netr_DELTA_ENUM *delta,					 char **error_string) {	uint32_t rid = delta->delta_id_union.rid;	struct ldb_message **msgs;	int ret;	const char *attrs[] = { NULL };	/* search for the alias, by rid */	ret = gendb_search(state->sam_ldb, mem_ctx, state->base_dn[database], &msgs, attrs,			   "(&(objectClass=group)(objectSid=%s))", 			   ldap_encode_ndr_dom_sid(mem_ctx, dom_sid_add_rid(mem_ctx, state->dom_sid[database], rid))); 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?