diff options
Diffstat (limited to 'source/nsswitch/winbindd_sid.c')
-rw-r--r-- | source/nsswitch/winbindd_sid.c | 105 |
1 files changed, 38 insertions, 67 deletions
diff --git a/source/nsswitch/winbindd_sid.c b/source/nsswitch/winbindd_sid.c index 689ad34c4e0..a41bf759160 100644 --- a/source/nsswitch/winbindd_sid.c +++ b/source/nsswitch/winbindd_sid.c @@ -1,6 +1,5 @@ /* - Unix SMB/Netbios implementation. - Version 2.0 + Unix SMB/CIFS implementation. Winbind daemon - sid related functions @@ -33,13 +32,17 @@ enum winbindd_result winbindd_lookupsid(struct winbindd_cli_state *state) DOM_SID sid, tmp_sid; uint32 rid; fstring name; + fstring dom_name; DEBUG(3, ("[%5d]: lookupsid %s\n", state->pid, state->request.data.sid)); /* Lookup sid from PDC using lsa_lookup_sids() */ - string_to_sid(&sid, state->request.data.sid); + if (!string_to_sid(&sid, state->request.data.sid)) { + DEBUG(5, ("%s not a SID\n", state->request.data.sid)); + return WINBINDD_ERROR; + } /* Don't look up BUILTIN sids */ @@ -52,12 +55,13 @@ enum winbindd_result winbindd_lookupsid(struct winbindd_cli_state *state) /* Lookup the sid */ - if (!winbindd_lookup_name_by_sid(&sid, name, &type)) { + if (!winbindd_lookup_name_by_sid(&sid, dom_name, name, &type)) { return WINBINDD_ERROR; } - string_sub(name, "\\", lp_winbind_separator(), sizeof(fstring)); + fstrcpy(state->response.data.name.dom_name, dom_name); fstrcpy(state->response.data.name.name, name); + state->response.data.name.type = type; return WINBINDD_OK; @@ -68,20 +72,27 @@ enum winbindd_result winbindd_lookupsid(struct winbindd_cli_state *state) enum winbindd_result winbindd_lookupname(struct winbindd_cli_state *state) { enum SID_NAME_USE type; - fstring sid_str, name_domain, name_user, name; + fstring sid_str; + char *name_domain, *name_user; DOM_SID sid; - - DEBUG(3, ("[%5d]: lookupname %s\n", state->pid, - state->request.data.name)); + struct winbindd_domain *domain; - if (!parse_domain_user(state->request.data.name, name_domain, name_user)) - return WINBINDD_ERROR; + DEBUG(3, ("[%5d]: lookupname %s%s%s\n", state->pid, + state->request.data.name.dom_name, + lp_winbind_separator(), + state->request.data.name.name)); - snprintf(name, sizeof(name), "%s\\%s", name_domain, name_user); + name_domain = state->request.data.name.dom_name; + name_user = state->request.data.name.name; - /* Lookup name from PDC using lsa_lookup_names() */ + if ((domain = find_domain_from_name(name_domain)) == NULL) { + DEBUG(0, ("could not find domain entry for domain %s\n", + name_domain)); + return WINBINDD_ERROR; + } - if (!winbindd_lookup_sid_by_name(name, &sid, &type)) { + /* Lookup name from PDC using lsa_lookup_names() */ + if (!winbindd_lookup_sid_by_name(domain, name_user, &sid, &type)) { return WINBINDD_ERROR; } @@ -98,31 +109,19 @@ enum winbindd_result winbindd_lookupname(struct winbindd_cli_state *state) enum winbindd_result winbindd_sid_to_uid(struct winbindd_cli_state *state) { DOM_SID sid; - uint32 user_rid; - struct winbindd_domain *domain; DEBUG(3, ("[%5d]: sid to uid %s\n", state->pid, state->request.data.sid)); /* Split sid into domain sid and user rid */ - - string_to_sid(&sid, state->request.data.sid); - sid_split_rid(&sid, &user_rid); - - /* Find domain this sid belongs to */ - - if ((domain = find_domain_from_sid(&sid)) == NULL) { - fstring sid_str; - - sid_to_string(sid_str, &sid); - DEBUG(1, ("Could not find domain for sid %s\n", sid_str)); + if (!string_to_sid(&sid, state->request.data.sid)) { + DEBUG(1, ("Could not get convert sid %s from string\n", + state->request.data.sid)); return WINBINDD_ERROR; } /* Find uid for this sid and return it */ - - if (!winbindd_idmap_get_uid_from_rid(domain->name, user_rid, - &state->response.data.uid)) { + if (!winbindd_idmap_get_uid_from_sid(&sid, &state->response.data.uid)) { DEBUG(1, ("Could not get uid for sid %s\n", state->request.data.sid)); return WINBINDD_ERROR; @@ -137,31 +136,18 @@ enum winbindd_result winbindd_sid_to_uid(struct winbindd_cli_state *state) enum winbindd_result winbindd_sid_to_gid(struct winbindd_cli_state *state) { DOM_SID sid; - uint32 group_rid; - struct winbindd_domain *domain; DEBUG(3, ("[%5d]: sid to gid %s\n", state->pid, state->request.data.sid)); - /* Split sid into domain sid and user rid */ - - string_to_sid(&sid, state->request.data.sid); - sid_split_rid(&sid, &group_rid); - - /* Find domain this sid belongs to */ - - if ((domain = find_domain_from_sid(&sid)) == NULL) { - fstring sid_str; - - sid_to_string(sid_str, &sid); - DEBUG(1, ("Could not find domain for sid %s\n", sid_str)); + if (!string_to_sid(&sid, state->request.data.sid)) { + DEBUG(1, ("Could not cvt string to sid %s\n", + state->request.data.sid)); return WINBINDD_ERROR; } - /* Find uid for this sid and return it */ - - if (!winbindd_idmap_get_gid_from_rid(domain->name, group_rid, - &state->response.data.gid)) { + /* Find gid for this sid and return it */ + if (!winbindd_idmap_get_gid_from_sid(&sid, &state->response.data.gid)) { DEBUG(1, ("Could not get gid for sid %s\n", state->request.data.sid)); return WINBINDD_ERROR; @@ -174,8 +160,6 @@ enum winbindd_result winbindd_sid_to_gid(struct winbindd_cli_state *state) enum winbindd_result winbindd_uid_to_sid(struct winbindd_cli_state *state) { - struct winbindd_domain *domain; - uint32 user_rid; DOM_SID sid; /* Bug out if the uid isn't in the winbind range */ @@ -189,18 +173,12 @@ enum winbindd_result winbindd_uid_to_sid(struct winbindd_cli_state *state) state->request.data.uid)); /* Lookup rid for this uid */ - - if (!winbindd_idmap_get_rid_from_uid(state->request.data.uid, - &user_rid, &domain)) { + if (!winbindd_idmap_get_sid_from_uid(state->request.data.uid, &sid)) { DEBUG(1, ("Could not convert uid %d to rid\n", state->request.data.uid)); return WINBINDD_ERROR; } - /* Construct sid and return it */ - - sid_copy(&sid, &domain->sid); - sid_append_rid(&sid, user_rid); sid_to_string(state->response.data.sid.sid, &sid); state->response.data.sid.type = SID_NAME_USER; @@ -211,8 +189,6 @@ enum winbindd_result winbindd_uid_to_sid(struct winbindd_cli_state *state) enum winbindd_result winbindd_gid_to_sid(struct winbindd_cli_state *state) { - struct winbindd_domain *domain; - uint32 group_rid; DOM_SID sid; /* Bug out if the gid isn't in the winbind range */ @@ -225,19 +201,14 @@ enum winbindd_result winbindd_gid_to_sid(struct winbindd_cli_state *state) DEBUG(3, ("[%5d]: gid to sid %d\n", state->pid, state->request.data.gid)); - /* Lookup rid for this uid */ - - if (!winbindd_idmap_get_rid_from_gid(state->request.data.gid, - &group_rid, &domain)) { - DEBUG(1, ("Could not convert gid %d to rid\n", + /* Lookup sid for this uid */ + if (!winbindd_idmap_get_sid_from_gid(state->request.data.gid, &sid)) { + DEBUG(1, ("Could not convert gid %d to sid\n", state->request.data.gid)); return WINBINDD_ERROR; } /* Construct sid and return it */ - - sid_copy(&sid, &domain->sid); - sid_append_rid(&sid, group_rid); sid_to_string(state->response.data.sid.sid, &sid); state->response.data.sid.type = SID_NAME_DOM_GRP; |