📄 pdb_interface.c
字号:
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 + -