📄 mapping.c
字号:
if ( getgrgid(map->gid) == NULL) { return False; } return True;}/****************************************************************************Returns a GROUP_MAP struct based on the gid.****************************************************************************/BOOL get_group_from_gid(gid_t gid, GROUP_MAP *map){ BOOL ret; if(!init_group_mapping()) { DEBUG(0,("failed to initialize group mapping\n")); return(False); } if ( getgrgid(gid) == NULL) return False; become_root(); ret = pdb_getgrgid(map, gid); unbecome_root(); if ( !ret ) { return False; } return True;}/**************************************************************************** Create a UNIX group on demand.****************************************************************************/int smb_create_group(char *unix_group, gid_t *new_gid){ pstring add_script; int ret = -1; int fd = 0; *new_gid = 0; /* defer to scripts */ if ( *lp_addgroup_script() ) { pstrcpy(add_script, lp_addgroup_script()); pstring_sub(add_script, "%g", unix_group); ret = smbrun(add_script, (new_gid!=NULL) ? &fd : NULL); DEBUG(ret ? 0 : 3,("smb_create_group: Running the command `%s' gave %d\n",add_script,ret)); if (ret != 0) return ret; if (fd != 0) { fstring output; *new_gid = 0; if (read(fd, output, sizeof(output)) > 0) { *new_gid = (gid_t)strtoul(output, NULL, 10); } close(fd); } } if (*new_gid == 0) { struct group *grp = getgrnam(unix_group); if (grp != NULL) *new_gid = grp->gr_gid; } return ret; }/**************************************************************************** Delete a UNIX group on demand.****************************************************************************/int smb_delete_group(char *unix_group){ pstring del_script; int ret; /* defer to scripts */ if ( *lp_delgroup_script() ) { pstrcpy(del_script, lp_delgroup_script()); pstring_sub(del_script, "%g", unix_group); ret = smbrun(del_script,NULL); DEBUG(ret ? 0 : 3,("smb_delete_group: Running the command `%s' gave %d\n",del_script,ret)); return ret; } return -1;}/**************************************************************************** Set a user's primary UNIX group.****************************************************************************/int smb_set_primary_group(const char *unix_group, const char* unix_user){ pstring add_script; int ret; /* defer to scripts */ if ( *lp_setprimarygroup_script() ) { pstrcpy(add_script, lp_setprimarygroup_script()); all_string_sub(add_script, "%g", unix_group, sizeof(add_script)); all_string_sub(add_script, "%u", unix_user, sizeof(add_script)); ret = smbrun(add_script,NULL); flush_pwnam_cache(); DEBUG(ret ? 0 : 3,("smb_set_primary_group: " "Running the command `%s' gave %d\n",add_script,ret)); return ret; } return -1;}/**************************************************************************** Add a user to a UNIX group.****************************************************************************/int smb_add_user_group(char *unix_group, char *unix_user){ pstring add_script; int ret; /* defer to scripts */ if ( *lp_addusertogroup_script() ) { pstrcpy(add_script, lp_addusertogroup_script()); pstring_sub(add_script, "%g", unix_group); pstring_sub(add_script, "%u", unix_user); ret = smbrun(add_script,NULL); DEBUG(ret ? 0 : 3,("smb_add_user_group: Running the command `%s' gave %d\n",add_script,ret)); return ret; } return -1;}/**************************************************************************** Delete a user from a UNIX group****************************************************************************/int smb_delete_user_group(const char *unix_group, const char *unix_user){ pstring del_script; int ret; /* defer to scripts */ if ( *lp_deluserfromgroup_script() ) { pstrcpy(del_script, lp_deluserfromgroup_script()); pstring_sub(del_script, "%g", unix_group); pstring_sub(del_script, "%u", unix_user); ret = smbrun(del_script,NULL); DEBUG(ret ? 0 : 3,("smb_delete_user_group: Running the command `%s' gave %d\n",del_script,ret)); return ret; } return -1;}NTSTATUS pdb_default_getgrsid(struct pdb_methods *methods, GROUP_MAP *map, DOM_SID sid){ return get_group_map_from_sid(sid, map) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;}NTSTATUS pdb_default_getgrgid(struct pdb_methods *methods, GROUP_MAP *map, gid_t gid){ return get_group_map_from_gid(gid, map) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;}NTSTATUS pdb_default_getgrnam(struct pdb_methods *methods, GROUP_MAP *map, const char *name){ return get_group_map_from_ntname(name, map) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;}NTSTATUS pdb_default_add_group_mapping_entry(struct pdb_methods *methods, GROUP_MAP *map){ return add_mapping_entry(map, TDB_INSERT) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;}NTSTATUS pdb_default_update_group_mapping_entry(struct pdb_methods *methods, GROUP_MAP *map){ return add_mapping_entry(map, TDB_REPLACE) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;}NTSTATUS pdb_default_delete_group_mapping_entry(struct pdb_methods *methods, DOM_SID sid){ return group_map_remove(&sid) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;}NTSTATUS pdb_default_enum_group_mapping(struct pdb_methods *methods, enum SID_NAME_USE sid_name_use, GROUP_MAP **pp_rmap, size_t *p_num_entries, BOOL unix_only){ return enum_group_mapping(sid_name_use, pp_rmap, p_num_entries, unix_only) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;}NTSTATUS pdb_default_find_alias(struct pdb_methods *methods, const char *name, DOM_SID *sid){ GROUP_MAP map; if (!pdb_getgrnam(&map, name)) return NT_STATUS_NO_SUCH_ALIAS; if ((map.sid_name_use != SID_NAME_WKN_GRP) && (map.sid_name_use != SID_NAME_ALIAS)) return NT_STATUS_OBJECT_TYPE_MISMATCH; sid_copy(sid, &map.sid); return NT_STATUS_OK;}NTSTATUS pdb_default_create_alias(struct pdb_methods *methods, const char *name, uint32 *rid){ DOM_SID sid; enum SID_NAME_USE type; uint32 new_rid; gid_t gid; GROUP_MAP map; if (lookup_name(get_global_sam_name(), name, &sid, &type)) return NT_STATUS_ALIAS_EXISTS; if (!winbind_allocate_rid_and_gid(&new_rid, &gid)) return NT_STATUS_ACCESS_DENIED; sid_copy(&sid, get_global_sam_sid()); sid_append_rid(&sid, new_rid); map.gid = gid; sid_copy(&map.sid, &sid); map.sid_name_use = SID_NAME_ALIAS; fstrcpy(map.nt_name, name); fstrcpy(map.comment, ""); if (!pdb_add_group_mapping_entry(&map)) { DEBUG(0, ("Could not add group mapping entry for alias %s\n", name)); return NT_STATUS_ACCESS_DENIED; } *rid = new_rid; return NT_STATUS_OK;}NTSTATUS pdb_default_delete_alias(struct pdb_methods *methods, const DOM_SID *sid){ return pdb_delete_group_mapping_entry(*sid) ? NT_STATUS_OK : NT_STATUS_ACCESS_DENIED;}NTSTATUS pdb_default_get_aliasinfo(struct pdb_methods *methods, const DOM_SID *sid, struct acct_info *info){ GROUP_MAP map; if (!pdb_getgrsid(&map, *sid)) return NT_STATUS_NO_SUCH_ALIAS; fstrcpy(info->acct_name, map.nt_name); fstrcpy(info->acct_desc, map.comment); sid_peek_rid(&map.sid, &info->rid); return NT_STATUS_OK;}NTSTATUS pdb_default_set_aliasinfo(struct pdb_methods *methods, const DOM_SID *sid, struct acct_info *info){ GROUP_MAP map; if (!pdb_getgrsid(&map, *sid)) return NT_STATUS_NO_SUCH_ALIAS; fstrcpy(map.comment, info->acct_desc); if (!pdb_update_group_mapping_entry(&map)) return NT_STATUS_ACCESS_DENIED; return NT_STATUS_OK;}NTSTATUS pdb_default_add_aliasmem(struct pdb_methods *methods, const DOM_SID *alias, const DOM_SID *member){ return add_aliasmem(alias, member);}NTSTATUS pdb_default_del_aliasmem(struct pdb_methods *methods, const DOM_SID *alias, const DOM_SID *member){ return del_aliasmem(alias, member);}NTSTATUS pdb_default_enum_aliasmem(struct pdb_methods *methods, const DOM_SID *alias, DOM_SID **pp_members, size_t *p_num_members){ return enum_aliasmem(alias, pp_members, p_num_members);}NTSTATUS pdb_default_alias_memberships(struct pdb_methods *methods, 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){ DOM_SID *alias_sids; size_t i, num_alias_sids; NTSTATUS result; alias_sids = NULL; num_alias_sids = 0; result = alias_memberships(members, num_members, &alias_sids, &num_alias_sids); if (!NT_STATUS_IS_OK(result)) return result; *pp_alias_rids = TALLOC_ARRAY(mem_ctx, uint32, num_alias_sids); if (*pp_alias_rids == NULL) return NT_STATUS_NO_MEMORY; *p_num_alias_rids = 0; for (i=0; i<num_alias_sids; i++) { if (!sid_peek_check_rid(domain_sid, &alias_sids[i], &(*pp_alias_rids)[*p_num_alias_rids])) continue; *p_num_alias_rids += 1; } SAFE_FREE(alias_sids); return NT_STATUS_OK;}/********************************************************************** no ops for passdb backends that don't implement group mapping *********************************************************************/NTSTATUS pdb_nop_getgrsid(struct pdb_methods *methods, GROUP_MAP *map, DOM_SID sid){ return NT_STATUS_UNSUCCESSFUL;}NTSTATUS pdb_nop_getgrgid(struct pdb_methods *methods, GROUP_MAP *map, gid_t gid){ return NT_STATUS_UNSUCCESSFUL;}NTSTATUS pdb_nop_getgrnam(struct pdb_methods *methods, GROUP_MAP *map, const char *name){ return NT_STATUS_UNSUCCESSFUL;}NTSTATUS pdb_nop_add_group_mapping_entry(struct pdb_methods *methods, GROUP_MAP *map){ return NT_STATUS_UNSUCCESSFUL;}NTSTATUS pdb_nop_update_group_mapping_entry(struct pdb_methods *methods, GROUP_MAP *map){ return NT_STATUS_UNSUCCESSFUL;}NTSTATUS pdb_nop_delete_group_mapping_entry(struct pdb_methods *methods, DOM_SID sid){ return NT_STATUS_UNSUCCESSFUL;}NTSTATUS pdb_nop_enum_group_mapping(struct pdb_methods *methods, enum SID_NAME_USE sid_name_use, GROUP_MAP **rmap, size_t *num_entries, BOOL unix_only){ return NT_STATUS_UNSUCCESSFUL;}/**************************************************************************** These need to be redirected through pdb_interface.c****************************************************************************/BOOL pdb_get_dom_grp_info(const DOM_SID *sid, struct acct_info *info){ GROUP_MAP map; BOOL res; become_root(); res = get_domain_group_from_sid(*sid, &map); unbecome_root(); if (!res) return False; fstrcpy(info->acct_name, map.nt_name); fstrcpy(info->acct_desc, map.comment); sid_peek_rid(sid, &info->rid); return True;}BOOL pdb_set_dom_grp_info(const DOM_SID *sid, const struct acct_info *info){ GROUP_MAP map; if (!get_domain_group_from_sid(*sid, &map)) return False; fstrcpy(map.nt_name, info->acct_name); fstrcpy(map.comment, info->acct_desc); return pdb_update_group_mapping_entry(&map);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -