bool fill_grent(TALLOC_CTX *mem_ctx, struct winbindd_gr *gr, const char *dom_name, const char *gr_name, gid_t unix_gid) { fstring full_group_name; char *mapped_name = NULL; struct winbindd_domain *domain = find_domain_from_name_noinit(dom_name); NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL; nt_status = normalize_name_map(mem_ctx, domain, gr_name, &mapped_name); /* Basic whitespace replacement */ if (NT_STATUS_IS_OK(nt_status)) { fill_domain_username(full_group_name, dom_name, mapped_name, true); } /* Mapped to an aliase */ else if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_RENAMED)) { fstrcpy(full_group_name, mapped_name); } /* no change */ else { fill_domain_username( full_group_name, dom_name, gr_name, True ); } gr->gr_gid = unix_gid; /* Group name and password */ safe_strcpy(gr->gr_name, full_group_name, sizeof(gr->gr_name) - 1); safe_strcpy(gr->gr_passwd, "x", sizeof(gr->gr_passwd) - 1); return True; }
void winbindd_list_trusted_domains(struct winbindd_cli_state *state) { struct winbindd_tdc_domain *dom_list = NULL; struct winbindd_tdc_domain *d = NULL; size_t num_domains = 0; int extra_data_len = 0; char *extra_data = NULL; int i = 0; DEBUG(3, ("[%5lu]: list trusted domains\n", (unsigned long)state->pid)); if( !wcache_tdc_fetch_list( &dom_list, &num_domains )) { request_error(state); goto done; } extra_data = talloc_strdup(state->mem_ctx, ""); if (extra_data == NULL) { request_error(state); goto done; } for ( i = 0; i < num_domains; i++ ) { struct winbindd_domain *domain; bool is_online = true; d = &dom_list[i]; domain = find_domain_from_name_noinit(d->domain_name); if (domain) { is_online = domain->online; } extra_data = talloc_asprintf_append_buffer( extra_data, "%s\\%s\\%s\\%s\\%s\\%s\\%s\\%s\n", d->domain_name, d->dns_name ? d->dns_name : d->domain_name, sid_string_talloc(state->mem_ctx, &d->sid), get_trust_type_string(d), trust_is_transitive(d) ? "Yes" : "No", trust_is_inbound(d) ? "Yes" : "No", trust_is_outbound(d) ? "Yes" : "No", is_online ? "Online" : "Offline" ); } extra_data_len = strlen(extra_data); if (extra_data_len > 0) { /* Strip the last \n */ extra_data[extra_data_len-1] = '\0'; state->response->extra_data.data = extra_data; state->response->length += extra_data_len; } request_ok(state); done: TALLOC_FREE( dom_list ); }
enum winbindd_result winbindd_dual_getdcname(struct winbindd_domain *domain, struct winbindd_cli_state *state) { const char *dcname_slash = NULL; const char *p; struct rpc_pipe_client *netlogon_pipe; NTSTATUS result; WERROR werr; unsigned int orig_timeout; struct winbindd_domain *req_domain; state->request->domain_name [sizeof(state->request->domain_name)-1] = '\0'; DEBUG(3, ("[%5lu]: Get DC name for %s\n", (unsigned long)state->pid, state->request->domain_name)); result = cm_connect_netlogon(domain, &netlogon_pipe); if (!NT_STATUS_IS_OK(result)) { DEBUG(1, ("Can't contact the NETLOGON pipe\n")); return WINBINDD_ERROR; } /* This call can take a long time - allow the server to time out. 35 seconds should do it. */ orig_timeout = rpccli_set_timeout(netlogon_pipe, 35000); req_domain = find_domain_from_name_noinit(state->request->domain_name); if (req_domain == domain) { result = rpccli_netr_GetDcName(netlogon_pipe, state->mem_ctx, domain->dcname, state->request->domain_name, &dcname_slash, &werr); } else { result = rpccli_netr_GetAnyDCName(netlogon_pipe, state->mem_ctx, domain->dcname, state->request->domain_name, &dcname_slash, &werr); } /* And restore our original timeout. */ rpccli_set_timeout(netlogon_pipe, orig_timeout); if (!NT_STATUS_IS_OK(result)) { DEBUG(5,("Error requesting DCname for domain %s: %s\n", state->request->domain_name, nt_errstr(result))); return WINBINDD_ERROR; } if (!W_ERROR_IS_OK(werr)) { DEBUG(5, ("Error requesting DCname for domain %s: %s\n", state->request->domain_name, win_errstr(werr))); return WINBINDD_ERROR; } p = dcname_slash; if (*p == '\\') { p+=1; } if (*p == '\\') { p+=1; } fstrcpy(state->response->data.dc_name, p); return WINBINDD_OK; }