winbindd_async.c
来自「samba-3.0.22.tar.gz 编译smb服务器的源码」· C语言 代码 · 共 1,441 行 · 第 1/3 页
C
1,441 行
cont, private_data);}enum winbindd_result winbindd_dual_name2gid(struct winbindd_domain *domain, struct winbindd_cli_state *state){ struct group *gr; /* Ensure null termination */ state->request.data.groupname [sizeof(state->request.data.groupname)-1] = '\0'; DEBUG(3, ("[%5lu]: name2gid %s\n", (unsigned long)state->pid, state->request.data.groupname)); gr = getgrnam(state->request.data.groupname); if (gr == NULL) { return WINBINDD_ERROR; } state->response.data.gid = gr->gr_gid; return WINBINDD_OK;}static void name2gid_recv(TALLOC_CTX *mem_ctx, BOOL success, struct winbindd_response *response, void *c, void *private_data){ void (*cont)(void *priv, BOOL succ, gid_t gid) = c; if (!success) { DEBUG(5, ("Could not trigger name2gid\n")); cont(private_data, False, 0); return; } if (response->result != WINBINDD_OK) { DEBUG(5, ("name2gid returned an error\n")); cont(private_data, False, 0); return; } cont(private_data, True, response->data.gid);}static void lookupsid_recv(TALLOC_CTX *mem_ctx, BOOL success, struct winbindd_response *response, void *c, void *private_data){ void (*cont)(void *priv, BOOL succ, const char *dom_name, const char *name, enum SID_NAME_USE type) = c; if (!success) { DEBUG(5, ("Could not trigger lookupsid\n")); cont(private_data, False, NULL, NULL, SID_NAME_UNKNOWN); return; } if (response->result != WINBINDD_OK) { DEBUG(5, ("lookupsid returned an error\n")); cont(private_data, False, NULL, NULL, SID_NAME_UNKNOWN); return; } cont(private_data, True, response->data.name.dom_name, response->data.name.name, response->data.name.type);}void winbindd_lookupsid_async(TALLOC_CTX *mem_ctx, const DOM_SID *sid, void (*cont)(void *private_data, BOOL success, const char *dom_name, const char *name, enum SID_NAME_USE type), void *private_data){ struct winbindd_domain *domain; struct winbindd_request request; domain = find_lookup_domain_from_sid(sid); if (domain == NULL) { DEBUG(5, ("Could not find domain for sid %s\n", sid_string_static(sid))); cont(private_data, False, NULL, NULL, SID_NAME_UNKNOWN); return; } ZERO_STRUCT(request); request.cmd = WINBINDD_LOOKUPSID; fstrcpy(request.data.sid, sid_string_static(sid)); do_async_domain(mem_ctx, domain, &request, lookupsid_recv, cont, private_data);}enum winbindd_result winbindd_dual_lookupsid(struct winbindd_domain *domain, struct winbindd_cli_state *state){ enum SID_NAME_USE type; DOM_SID sid; fstring name; fstring dom_name; /* Ensure null termination */ state->request.data.sid[sizeof(state->request.data.sid)-1]='\0'; DEBUG(3, ("[%5lu]: lookupsid %s\n", (unsigned long)state->pid, state->request.data.sid)); /* Lookup sid from PDC using lsa_lookup_sids() */ if (!string_to_sid(&sid, state->request.data.sid)) { DEBUG(5, ("%s not a SID\n", state->request.data.sid)); return WINBINDD_ERROR; } /* Lookup the sid */ if (!winbindd_lookup_name_by_sid(state->mem_ctx, &sid, dom_name, name, &type)) { return WINBINDD_ERROR; } 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;}static void lookupname_recv(TALLOC_CTX *mem_ctx, BOOL success, struct winbindd_response *response, void *c, void *private_data){ void (*cont)(void *priv, BOOL succ, const DOM_SID *sid, enum SID_NAME_USE type) = c; DOM_SID sid; if (!success) { DEBUG(5, ("Could not trigger lookup_name\n")); cont(private_data, False, NULL, SID_NAME_UNKNOWN); return; } if (response->result != WINBINDD_OK) { DEBUG(5, ("lookup_name returned an error\n")); cont(private_data, False, NULL, SID_NAME_UNKNOWN); return; } if (!string_to_sid(&sid, response->data.sid.sid)) { DEBUG(0, ("Could not convert string %s to sid\n", response->data.sid.sid)); cont(private_data, False, NULL, SID_NAME_UNKNOWN); return; } cont(private_data, True, &sid, response->data.sid.type);}void winbindd_lookupname_async(TALLOC_CTX *mem_ctx, const char *dom_name, const char *name, void (*cont)(void *private_data, BOOL success, const DOM_SID *sid, enum SID_NAME_USE type), void *private_data){ struct winbindd_request request; struct winbindd_domain *domain; domain = find_lookup_domain_from_name(dom_name); if (domain == NULL) { DEBUG(5, ("Could not find domain for name %s\n", dom_name)); cont(private_data, False, NULL, SID_NAME_UNKNOWN); return; } ZERO_STRUCT(request); request.cmd = WINBINDD_LOOKUPNAME; fstrcpy(request.data.name.dom_name, dom_name); fstrcpy(request.data.name.name, name); do_async_domain(mem_ctx, domain, &request, lookupname_recv, cont, private_data);}enum winbindd_result winbindd_dual_lookupname(struct winbindd_domain *domain, struct winbindd_cli_state *state){ enum SID_NAME_USE type; char *name_domain, *name_user; DOM_SID sid; char *p; /* Ensure null termination */ state->request.data.sid[sizeof(state->request.data.name.dom_name)-1]='\0'; /* Ensure null termination */ state->request.data.sid[sizeof(state->request.data.name.name)-1]='\0'; /* cope with the name being a fully qualified name */ p = strstr(state->request.data.name.name, lp_winbind_separator()); if (p) { *p = 0; name_domain = state->request.data.name.name; name_user = p+1; } else { name_domain = state->request.data.name.dom_name; name_user = state->request.data.name.name; } DEBUG(3, ("[%5lu]: lookupname %s%s%s\n", (unsigned long)state->pid, name_domain, lp_winbind_separator(), name_user)); /* Lookup name from PDC using lsa_lookup_names() */ if (!winbindd_lookup_sid_by_name(state->mem_ctx, domain, name_domain, name_user, &sid, &type)) { return WINBINDD_ERROR; } sid_to_string(state->response.data.sid.sid, &sid); state->response.data.sid.type = type; return WINBINDD_OK;}BOOL print_sidlist(TALLOC_CTX *mem_ctx, const DOM_SID *sids, size_t num_sids, char **result, ssize_t *len){ size_t i; size_t buflen = 0; *len = 0; *result = NULL; for (i=0; i<num_sids; i++) { sprintf_append(mem_ctx, result, len, &buflen, "%s\n", sid_string_static(&sids[i])); } if ((num_sids != 0) && (*result == NULL)) { return False; } return True;}BOOL parse_sidlist(TALLOC_CTX *mem_ctx, char *sidstr, DOM_SID **sids, size_t *num_sids){ char *p, *q; p = sidstr; if (p == NULL) return False; while (p[0] != '\0') { DOM_SID sid; q = strchr(p, '\n'); if (q == NULL) { DEBUG(0, ("Got invalid sidstr: %s\n", p)); return False; } *q = '\0'; q += 1; if (!string_to_sid(&sid, p)) { DEBUG(0, ("Could not parse sid %s\n", p)); return False; } add_sid_to_array(mem_ctx, &sid, sids, num_sids); p = q; } return True;}BOOL print_ridlist(TALLOC_CTX *mem_ctx, uint32 *rids, size_t num_rids, char **result, ssize_t *len){ size_t i; size_t buflen = 0; *len = 0; *result = NULL; for (i=0; i<num_rids; i++) { sprintf_append(mem_ctx, result, len, &buflen, "%ld\n", rids[i]); } if ((num_rids != 0) && (*result == NULL)) { return False; } return True;}BOOL parse_ridlist(TALLOC_CTX *mem_ctx, char *ridstr, uint32 **sids, size_t *num_rids){ char *p; p = ridstr; if (p == NULL) return False; while (p[0] != '\0') { uint32 rid; char *q; rid = strtoul(p, &q, 10); if (*q != '\n') { DEBUG(0, ("Got invalid ridstr: %s\n", p)); return False; } p = q+1; ADD_TO_ARRAY(mem_ctx, uint32, rid, sids, num_rids); } return True;}static void getsidaliases_recv(TALLOC_CTX *mem_ctx, BOOL success, struct winbindd_response *response, void *c, void *private_data){ void (*cont)(void *priv, BOOL succ, DOM_SID *aliases, size_t num_aliases) = c; char *aliases_str; DOM_SID *sids = NULL; size_t num_sids = 0; if (!success) { DEBUG(5, ("Could not trigger getsidaliases\n")); cont(private_data, success, NULL, 0); return; } if (response->result != WINBINDD_OK) { DEBUG(5, ("getsidaliases returned an error\n")); cont(private_data, False, NULL, 0); return; } aliases_str = response->extra_data; if (aliases_str == NULL) { DEBUG(10, ("getsidaliases return 0 SIDs\n")); cont(private_data, True, NULL, 0); return; } if (!parse_sidlist(mem_ctx, aliases_str, &sids, &num_sids)) { DEBUG(0, ("Could not parse sids\n")); cont(private_data, False, NULL, 0); return; } SAFE_FREE(response->extra_data); cont(private_data, True, sids, num_sids);}void winbindd_getsidaliases_async(struct winbindd_domain *domain, TALLOC_CTX *mem_ctx, const DOM_SID *sids, size_t num_sids, void (*cont)(void *private_data, BOOL success, const DOM_SID *aliases, size_t num_aliases), void *private_data){ struct winbindd_request request; char *sidstr = NULL; ssize_t len; if (num_sids == 0) { cont(private_data, True, NULL, 0); return; } if (!print_sidlist(mem_ctx, sids, num_sids, &sidstr, &len)) { cont(private_data, False, NULL, 0); return; } ZERO_STRUCT(request); request.cmd = WINBINDD_DUAL_GETSIDALIASES; request.extra_len = len; request.extra_data = sidstr; do_async_domain(mem_ctx, domain, &request, getsidaliases_recv, cont, private_data);}enum winbindd_result winbindd_dual_getsidaliases(struct winbindd_domain *domain, struct winbindd_cli_state *state){ DOM_SID *sids = NULL; size_t num_sids = 0; char *sidstr; ssize_t len; size_t i; uint32 num_aliases; uint32 *alias_rids; NTSTATUS result; DEBUG(3, ("[%5lu]: getsidaliases\n", (unsigned long)state->pid)); sidstr = state->request.extra_data; if (sidstr == NULL) sidstr = talloc_strdup(state->mem_ctx, "\n"); /* No SID */ DEBUG(10, ("Sidlist: %s\n", sidstr)); if (!parse_sidlist(state->mem_ctx, sidstr, &sids, &num_sids)) { DEBUG(0, ("Could not parse SID list: %s\n", sidstr)); return WINBINDD_ERROR; } num_aliases = 0; alias_rids = NULL; result = domain->methods->lookup_useraliases(domain, state->mem_ctx, num_sids, sids, &num_aliases, &alias_rids); if (!NT_STATUS_IS_OK(result)) { DEBUG(3, ("Could not lookup_useraliases: %s\n", nt_errstr(result))); return WINBINDD_ERROR; } num_sids = 0; sids = NULL; DEBUG(10, ("Got %d aliases\n", num_aliases)); for (i=0; i<num_aliases; i++) { DOM_SID sid; DEBUGADD(10, (" rid %d\n", alias_rids[i])); sid_copy(&sid, &domain->sid); sid_append_rid(&sid, alias_rids[i]); add_sid_to_array(state->mem_ctx, &sid, &sids, &num_sids); } if (!print_sidlist(NULL, sids, num_sids, (char **)&state->response.extra_data, &len)) { DEBUG(0, ("Could not print_sidlist\n")); return WINBINDD_ERROR; } if (state->response.extra_data != NULL) { DEBUG(10, ("aliases_list: %s\n", (char *)state->response.extra_data)); state->response.length += len+1; } return WINBINDD_OK;}struct gettoken_state { TALLOC_CTX *mem_ctx; DOM_SID user_sid; struct winbindd_domain *alias_domain; struct winbindd_domain *builtin_domain; DOM_SID *sids; size_t num_sids; void (*cont)(void *private_data, BOOL success, DOM_SID *sids, size_t num_sids); void *private_data;};static void gettoken_recvdomgroups(TALLOC_CTX *mem_ctx, BOOL success, struct winbindd_response *response, void *c, void *private_data);static void gettoken_recvaliases(void *private_data, BOOL success, const DOM_SID *aliases, size_t num_aliases); void winbindd_gettoken_async(TALLOC_CTX *mem_ctx, const DOM_SID *user_sid, void (*cont)(void *private_data, BOOL success, DOM_SID *sids, size_t num_sids),
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?