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

📄 pdb_interface.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 4 页
字号:
	return context->pdb_methods->enum_group_members(context->pdb_methods,							mem_ctx, group,							pp_member_rids,							p_num_members);}static NTSTATUS context_enum_group_memberships(struct pdb_context *context,					       const char *username,					       gid_t primary_gid,					       DOM_SID **pp_sids, gid_t **pp_gids,					       size_t *p_num_groups){	NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;	if ((!context) || (!context->pdb_methods)) {		DEBUG(0, ("invalid pdb_context specified!\n"));		return ret;	}	return context->pdb_methods->		enum_group_memberships(context->pdb_methods, username,				       primary_gid, pp_sids, pp_gids, p_num_groups);}static NTSTATUS context_find_alias(struct pdb_context *context,				   const char *name, DOM_SID *sid){	NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;	if ((!context) || (!context->pdb_methods)) {		DEBUG(0, ("invalid pdb_context specified!\n"));		return ret;	}	return context->pdb_methods->find_alias(context->pdb_methods,						name, sid);}static NTSTATUS context_create_alias(struct pdb_context *context,				     const char *name, uint32 *rid){	NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;	if ((!context) || (!context->pdb_methods)) {		DEBUG(0, ("invalid pdb_context specified!\n"));		return ret;	}	return context->pdb_methods->create_alias(context->pdb_methods,						  name, rid);}static NTSTATUS context_delete_alias(struct pdb_context *context,				     const DOM_SID *sid){	NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;	if ((!context) || (!context->pdb_methods)) {		DEBUG(0, ("invalid pdb_context specified!\n"));		return ret;	}	return context->pdb_methods->delete_alias(context->pdb_methods, sid);}static NTSTATUS context_get_aliasinfo(struct pdb_context *context,				      const DOM_SID *sid,				      struct acct_info *info){	NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;	if ((!context) || (!context->pdb_methods)) {		DEBUG(0, ("invalid pdb_context specified!\n"));		return ret;	}	return context->pdb_methods->get_aliasinfo(context->pdb_methods,						   sid, info);}static NTSTATUS context_set_aliasinfo(struct pdb_context *context,				      const DOM_SID *sid,				      struct acct_info *info){	NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;	if ((!context) || (!context->pdb_methods)) {		DEBUG(0, ("invalid pdb_context specified!\n"));		return ret;	}	return context->pdb_methods->set_aliasinfo(context->pdb_methods,						   sid, info);}static NTSTATUS context_add_aliasmem(struct pdb_context *context,				     const DOM_SID *alias,				     const DOM_SID *member){	NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;	if ((!context) || (!context->pdb_methods)) {		DEBUG(0, ("invalid pdb_context specified!\n"));		return ret;	}	return context->pdb_methods->add_aliasmem(context->pdb_methods,						  alias, member);}	static NTSTATUS context_del_aliasmem(struct pdb_context *context,				     const DOM_SID *alias,				     const DOM_SID *member){	NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;	if ((!context) || (!context->pdb_methods)) {		DEBUG(0, ("invalid pdb_context specified!\n"));		return ret;	}	return context->pdb_methods->del_aliasmem(context->pdb_methods,						  alias, member);}	static NTSTATUS context_enum_aliasmem(struct pdb_context *context,				      const DOM_SID *alias, DOM_SID **pp_members,				      size_t *p_num){	NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;	if ((!context) || (!context->pdb_methods)) {		DEBUG(0, ("invalid pdb_context specified!\n"));		return ret;	}	return context->pdb_methods->enum_aliasmem(context->pdb_methods,						   alias, pp_members, p_num);}	static NTSTATUS context_enum_alias_memberships(struct pdb_context *context,					       TALLOC_CTX *mem_ctx,					       const DOM_SID *domain_sid,					       const DOM_SID *members,					       size_t num_members,					       uint32 **pp_alias_rids,					       size_t *p_num_alias_rids){	NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;	if ((!context) || (!context->pdb_methods)) {		DEBUG(0, ("invalid pdb_context specified!\n"));		return ret;	}	return context->pdb_methods->		enum_alias_memberships(context->pdb_methods, mem_ctx,				       domain_sid, members, num_members,				       pp_alias_rids, p_num_alias_rids);}static NTSTATUS context_lookup_rids(struct pdb_context *context,				    const DOM_SID *domain_sid,				    size_t num_rids,				    uint32 *rids,				    const char **pp_names,				    uint32 *pp_attrs){	NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;	if ((!context) || (!context->pdb_methods)) {		DEBUG(0, ("invalid pdb_context specified!\n"));		return ret;	}	return context->pdb_methods->lookup_rids(context->pdb_methods,						 domain_sid, num_rids,						 rids, pp_names, pp_attrs);}static NTSTATUS context_get_account_policy(struct pdb_context *context,					   int policy_index, uint32 *value){	NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;	if ((!context) || (!context->pdb_methods)) {		DEBUG(0, ("invalid pdb_context specified!\n"));		return ret;	}	return context->pdb_methods->get_account_policy(context->pdb_methods,							policy_index, value);}static NTSTATUS context_set_account_policy(struct pdb_context *context,					   int policy_index, uint32 value){	NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;	if ((!context) || (!context->pdb_methods)) {		DEBUG(0, ("invalid pdb_context specified!\n"));		return ret;	}	return context->pdb_methods->set_account_policy(context->pdb_methods,							policy_index, value);}static NTSTATUS context_get_seq_num(struct pdb_context *context, time_t *seq_num){	NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;	if ((!context) || (!context->pdb_methods)) {		DEBUG(0, ("invalid pdb_context specified!\n"));		return ret;	}	return context->pdb_methods->get_seq_num(context->pdb_methods, seq_num);}	/******************************************************************  Free and cleanup a pdb context, any associated data and anything  that the attached modules might have associated. *******************************************************************/static void free_pdb_context(struct pdb_context **context){	struct pdb_methods *pdb_selected = (*context)->pdb_methods;	while (pdb_selected){		if(pdb_selected->free_private_data)			pdb_selected->free_private_data(&(pdb_selected->private_data));		pdb_selected = pdb_selected->next;	}	talloc_destroy((*context)->mem_ctx);	*context = NULL;}static BOOL context_search_users(struct pdb_context *context,				 struct pdb_search *search, uint16 acct_flags){	if ((!context) || (!context->pdb_methods)) {		DEBUG(0, ("invalid pdb_context specified!\n"));		return False;	}	return context->pdb_methods->search_users(context->pdb_methods,						  search, acct_flags);}static BOOL context_search_groups(struct pdb_context *context,				  struct pdb_search *search){	if ((!context) || (!context->pdb_methods)) {		DEBUG(0, ("invalid pdb_context specified!\n"));		return False;	}	return context->pdb_methods->search_groups(context->pdb_methods,						   search);}static BOOL context_search_aliases(struct pdb_context *context,				   struct pdb_search *search,				   const DOM_SID *sid){	if ((!context) || (!context->pdb_methods)) {		DEBUG(0, ("invalid pdb_context specified!\n"));		return False;	}	return context->pdb_methods->search_aliases(context->pdb_methods,						    search, sid);}/******************************************************************  Make a pdb_methods from scratch *******************************************************************/static NTSTATUS make_pdb_methods_name(struct pdb_methods **methods, struct pdb_context *context, const char *selected){	char *module_name = smb_xstrdup(selected);	char *module_location = NULL, *p;	struct pdb_init_function_entry *entry;	NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;	lazy_initialize_passdb();	p = strchr(module_name, ':');	if (p) {		*p = 0;		module_location = p+1;		trim_char(module_location, ' ', ' ');	}	trim_char(module_name, ' ', ' ');	DEBUG(5,("Attempting to find an passdb backend to match %s (%s)\n", selected, module_name));	entry = pdb_find_backend_entry(module_name);		/* Try to find a module that contains this module */	if (!entry) { 		DEBUG(2,("No builtin backend found, trying to load plugin\n"));		if(NT_STATUS_IS_OK(smb_probe_module("pdb", module_name)) && !(entry = pdb_find_backend_entry(module_name))) {			DEBUG(0,("Plugin is available, but doesn't register passdb backend %s\n", module_name));			SAFE_FREE(module_name);			return NT_STATUS_UNSUCCESSFUL;		}	}		/* No such backend found */	if(!entry) { 		DEBUG(0,("No builtin nor plugin backend for %s found\n", module_name));		SAFE_FREE(module_name);		return NT_STATUS_INVALID_PARAMETER;	}	DEBUG(5,("Found pdb backend %s\n", module_name));	nt_status = entry->init(context, methods, module_location);	if (NT_STATUS_IS_OK(nt_status)) {		DEBUG(5,("pdb backend %s has a valid init\n", selected));	} else {		DEBUG(0,("pdb backend %s did not correctly init (error was %s)\n", selected, nt_errstr(nt_status)));	}	SAFE_FREE(module_name);	return nt_status;}/******************************************************************  Make a pdb_context from scratch. *******************************************************************/static NTSTATUS make_pdb_context(struct pdb_context **context) {	TALLOC_CTX *mem_ctx;	mem_ctx = talloc_init("pdb_context internal allocation context");	if (!mem_ctx) {		DEBUG(0, ("make_pdb_context: talloc init failed!\n"));		return NT_STATUS_NO_MEMORY;	}			*context = TALLOC_P(mem_ctx, struct pdb_context);	if (!*context) {		DEBUG(0, ("make_pdb_context: talloc failed!\n"));		return NT_STATUS_NO_MEMORY;	}	ZERO_STRUCTP(*context);	(*context)->mem_ctx = mem_ctx;	(*context)->pdb_setsampwent = context_setsampwent;	(*context)->pdb_endsampwent = context_endsampwent;	(*context)->pdb_getsampwent = context_getsampwent;	(*context)->pdb_getsampwnam = context_getsampwnam;	(*context)->pdb_getsampwsid = context_getsampwsid;	(*context)->pdb_add_sam_account = context_add_sam_account;	(*context)->pdb_update_sam_account = context_update_sam_account;	(*context)->pdb_delete_sam_account = context_delete_sam_account;	(*context)->pdb_rename_sam_account = context_rename_sam_account;	(*context)->pdb_update_login_attempts = context_update_login_attempts;	(*context)->pdb_getgrsid = context_getgrsid;	(*context)->pdb_getgrgid = context_getgrgid;	(*context)->pdb_getgrnam = context_getgrnam;	(*context)->pdb_add_group_mapping_entry = context_add_group_mapping_entry;	(*context)->pdb_update_group_mapping_entry = context_update_group_mapping_entry;	(*context)->pdb_delete_group_mapping_entry = context_delete_group_mapping_entry;	(*context)->pdb_enum_group_mapping = context_enum_group_mapping;	(*context)->pdb_enum_group_members = context_enum_group_members;	(*context)->pdb_enum_group_memberships = context_enum_group_memberships;	(*context)->pdb_find_alias = context_find_alias;	(*context)->pdb_create_alias = context_create_alias;	(*context)->pdb_delete_alias = context_delete_alias;	(*context)->pdb_get_aliasinfo = context_get_aliasinfo;	(*context)->pdb_set_aliasinfo = context_set_aliasinfo;	(*context)->pdb_add_aliasmem = context_add_aliasmem;	(*context)->pdb_del_aliasmem = context_del_aliasmem;	(*context)->pdb_enum_aliasmem = context_enum_aliasmem;	(*context)->pdb_enum_alias_memberships = context_enum_alias_memberships;	(*context)->pdb_lookup_rids = context_lookup_rids;	(*context)->pdb_get_account_policy = context_get_account_policy;	(*context)->pdb_set_account_policy = context_set_account_policy;	(*context)->pdb_get_seq_num = context_get_seq_num;	(*context)->pdb_search_users = context_search_users;	(*context)->pdb_search_groups = context_search_groups;	(*context)->pdb_search_aliases = context_search_aliases;	(*context)->free_fn = free_pdb_context;	return NT_STATUS_OK;}/******************************************************************  Make a pdb_context, given an array of strings *******************************************************************/NTSTATUS make_pdb_context_list(struct pdb_context **context, const char **selected) {	int i = 0;	struct pdb_methods *curmethods, *tmpmethods;	NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;	BOOL have_guest = False;	if (!NT_STATUS_IS_OK(nt_status = make_pdb_context(context))) {		return nt_status;	}	if (!selected) {		DEBUG(0, ("ERROR: empty passdb backend list!\n"));		return nt_status;	}	while (selected[i]){		if (strcmp(selected[i], "guest") == 0) {			have_guest = True;		}		/* Try to initialise pdb */		DEBUG(5,("Trying to load: %s\n", selected[i]));		if (!NT_STATUS_IS_OK(nt_status = make_pdb_methods_name(&curmethods, *context, selected[i]))) {			DEBUG(1, ("Loading %s failed!\n", selected[i]));			free_pdb_context(context);			return nt_status;		}		curmethods->parent = *context;		DLIST_ADD_END((*context)->pdb_methods, curmethods, tmpmethods);		i++;	}	if (have_guest)		return NT_STATUS_OK;	if ( (lp_guestaccount() == NULL) ||	     (*lp_guestaccount() == '\0') ) {		/* We explicitly don't want guest access. No idea what		   else that breaks, but be it that way. */		return NT_STATUS_OK;	}	if (!NT_STATUS_IS_OK(nt_status = make_pdb_methods_name(&curmethods,							       *context,							       "guest"))) {		DEBUG(1, ("Loading guest module failed!\n"));		free_pdb_context(context);		return nt_status;	}	curmethods->parent = *context;	DLIST_ADD_END((*context)->pdb_methods, curmethods, tmpmethods);		return NT_STATUS_OK;}/******************************************************************  Make a pdb_context, given a text string. *******************************************************************/NTSTATUS make_pdb_context_string(struct pdb_context **context, const char *selected) {	NTSTATUS ret;	char **newsel = str_list_make(selected, NULL);	ret = make_pdb_context_list(context, (const char **)newsel);	str_list_free(&newsel);	return ret;}/****************************************************************** Return an already initialised pdb_context, to facilitate backward  compatibility (see functions below).*******************************************************************/static struct pdb_context *pdb_get_static_context(BOOL reload) {	static struct pdb_context *pdb_context = NULL;	if ((pdb_context) && (reload)) {		pdb_context->free_fn(&pdb_context);		if (!NT_STATUS_IS_OK(make_pdb_context_list(&pdb_context, lp_passdb_backend()))) {			return NULL;		}	}	if (!pdb_context) {		if (!NT_STATUS_IS_OK(make_pdb_context_list(&pdb_context, lp_passdb_backend()))) {			return NULL;		}	}	return pdb_context;}/****************************************************************** Backward compatibility functions for the original passdb interface*******************************************************************/BOOL pdb_setsampwent(BOOL update, uint16 acb_mask) {	struct pdb_context *pdb_context = pdb_get_static_context(False);	if (!pdb_context) {		return False;	}	return NT_STATUS_IS_OK(pdb_context->pdb_setsampwent(pdb_context, update, acb_mask));}void pdb_endsampwent(void) {	struct pdb_context *pdb_context = pdb_get_static_context(False);

⌨️ 快捷键说明

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