diff options
author | Tim Potter <tpot@samba.org> | 2000-07-10 05:40:43 +0000 |
---|---|---|
committer | Tim Potter <tpot@samba.org> | 2000-07-10 05:40:43 +0000 |
commit | 64299375b544de91dab75d62610d7dc7f1f8328d (patch) | |
tree | b621264c9f8481be3a8a6f52beac112ce3e1cd37 /source3/nsswitch | |
parent | 520bb0d775b35df07e540f33affd80de4de4572c (diff) | |
download | samba-64299375b544de91dab75d62610d7dc7f1f8328d.tar.gz samba-64299375b544de91dab75d62610d7dc7f1f8328d.tar.bz2 samba-64299375b544de91dab75d62610d7dc7f1f8328d.zip |
Moved winbind client functions from various odd locations to
nsswitch/wb_client.c
Merge of nsswitch/common.c rename to nsswitch/wb_common.c from TNG.
(This used to be commit f866c18f6be65db67d9d2a6c0b42e1af3b421e6c)
Diffstat (limited to 'source3/nsswitch')
-rw-r--r-- | source3/nsswitch/wb_client.c | 174 | ||||
-rw-r--r-- | source3/nsswitch/wb_common.c (renamed from source3/nsswitch/common.c) | 0 | ||||
-rw-r--r-- | source3/nsswitch/winbindd_util.c | 59 |
3 files changed, 224 insertions, 9 deletions
diff --git a/source3/nsswitch/wb_client.c b/source3/nsswitch/wb_client.c new file mode 100644 index 0000000000..0fe8b977f2 --- /dev/null +++ b/source3/nsswitch/wb_client.c @@ -0,0 +1,174 @@ +/* + Unix SMB/Netbios implementation. + Version 2.0 + + winbind client code + + Copyright (C) Tim Potter 2000 + Copyright (C) Andrew Tridgell 2000 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include "includes.h" + +/* Call winbindd to convert a name to a sid */ + +BOOL winbind_lookup_name(char *name, DOM_SID *sid, uint8 *name_type) +{ + struct winbindd_request request; + struct winbindd_response response; + enum nss_status result; + + if (!sid || !name_type) return False; + + /* Send off request */ + + ZERO_STRUCT(request); + ZERO_STRUCT(response); + + fstrcpy(request.data.name, name); + if ((result = winbindd_request(WINBINDD_LOOKUPNAME, &request, + &response)) == NSS_STATUS_SUCCESS) { + string_to_sid(sid, response.data.sid.sid); + *name_type = response.data.sid.type; + } + + return result == NSS_STATUS_SUCCESS; +} + +/* Call winbindd to convert sid to name */ + +BOOL winbind_lookup_sid(DOM_SID *sid, fstring dom_name, fstring name, + uint8 *name_type) +{ + struct winbindd_request request; + struct winbindd_response response; + enum nss_status result; + DOM_SID tmp_sid; + uint32 rid; + fstring sid_str; + + if (!name_type) return False; + + /* Check if this is our own sid. This should perhaps be done by + winbind? For the moment handle it here. */ + + if (sid->num_auths == 5) { + sid_copy(&tmp_sid, sid); + sid_split_rid(&tmp_sid, &rid); + + if (sid_equal(&global_sam_sid, &tmp_sid)) { + + return map_domain_sid_to_name(&tmp_sid, dom_name) && + lookup_local_rid(rid, name, name_type); + } + } + + /* Initialise request */ + + ZERO_STRUCT(request); + ZERO_STRUCT(response); + + sid_to_string(sid_str, sid); + fstrcpy(request.data.sid, sid_str); + + /* Make request */ + + result = winbindd_request(WINBINDD_LOOKUPSID, &request, &response); + + /* Copy out result */ + + if (result == NSS_STATUS_SUCCESS) { + parse_domain_user(response.data.name.name, dom_name, name); + *name_type = response.data.name.type; + } else { + + DEBUG(10,("winbind_lookup_sid: winbind lookup for %s failed - trying builtin.\n", + sid_str)); + + sid_copy(&tmp_sid, sid); + sid_split_rid(&tmp_sid, &rid); + return map_domain_sid_to_name(&tmp_sid, dom_name) && + lookup_known_rid(&tmp_sid, rid, name, name_type); + } + + return (result == NSS_STATUS_SUCCESS); +} + +/* Call winbindd to convert uid to sid */ + +BOOL winbind_uid_to_sid(uid_t uid, DOM_SID *sid) +{ + struct winbindd_request request; + struct winbindd_response response; + int result; + + if (!sid) return False; + + /* Initialise request */ + + ZERO_STRUCT(request); + ZERO_STRUCT(response); + + request.data.uid = uid; + + /* Make request */ + + result = winbindd_request(WINBINDD_UID_TO_SID, &request, &response); + + /* Copy out result */ + + if (result == NSS_STATUS_SUCCESS) { + string_to_sid(sid, response.data.sid.sid); + } else { + sid_copy(sid, &global_sid_NULL); + } + + return (result == NSS_STATUS_SUCCESS); +} + +/* Call winbindd to convert uid to sid */ + +BOOL winbind_gid_to_sid(gid_t gid, DOM_SID *sid) +{ + struct winbindd_request request; + struct winbindd_response response; + int result; + + if (!sid) return False; + + /* Initialise request */ + + ZERO_STRUCT(request); + ZERO_STRUCT(response); + + request.data.gid = gid; + + /* Make request */ + + result = winbindd_request(WINBINDD_GID_TO_SID, &request, &response); + + /* Copy out result */ + + if (result == NSS_STATUS_SUCCESS) { + string_to_sid(sid, response.data.sid.sid); + } else { + sid_copy(sid, &global_sid_NULL); + } + + return (result == NSS_STATUS_SUCCESS); +} diff --git a/source3/nsswitch/common.c b/source3/nsswitch/wb_common.c index 5d1f3431cc..5d1f3431cc 100644 --- a/source3/nsswitch/common.c +++ b/source3/nsswitch/wb_common.c diff --git a/source3/nsswitch/winbindd_util.c b/source3/nsswitch/winbindd_util.c index 1eea8f8fc7..80d6955e6c 100644 --- a/source3/nsswitch/winbindd_util.c +++ b/source3/nsswitch/winbindd_util.c @@ -45,10 +45,10 @@ static BOOL resolve_dc_name(char *domain_name, fstring domain_controller) if (!resolve_name(domain_name, &ip, 0x1B)) return False; - return lookup_pdc_name(global_myname, domain_name, &ip, domain_controller); + return lookup_pdc_name(global_myname, domain_name, &ip, + domain_controller); } - static struct winbindd_domain *add_trusted_domain(char *domain_name) { struct winbindd_domain *domain; @@ -90,7 +90,8 @@ static BOOL get_trusted_domains(void) /* Add our workgroup - keep handle to look up trusted domains */ if (!add_trusted_domain(lp_workgroup())) { - DEBUG(0, ("could not add record for domain %s\n", lp_workgroup())); + DEBUG(0, ("could not add record for domain %s\n", + lp_workgroup())); return False; } @@ -103,7 +104,8 @@ static BOOL get_trusted_domains(void) /* Add each domain to the trusted domain list */ for(i = 0; i < num_doms; i++) { if (!add_trusted_domain(domains[i])) { - DEBUG(0, ("could not add record for domain %s\n", domains[i])); + DEBUG(0, ("could not add record for domain %s\n", + domains[i])); result = False; } } @@ -126,7 +128,9 @@ static BOOL open_sam_handles(struct winbindd_domain *domain) } if ((domain->sam_handle_open && !rpc_hnd_ok(&domain->sam_handle)) || - (domain->sam_dom_handle_open && !rpc_hnd_ok(&domain->sam_dom_handle))) { + (domain->sam_dom_handle_open && + !rpc_hnd_ok(&domain->sam_dom_handle))) { + domain->got_domain_info = get_domain_info(domain); if (domain->sam_dom_handle_open) { samr_close(&domain->sam_dom_handle); @@ -139,49 +143,86 @@ static BOOL open_sam_handles(struct winbindd_domain *domain) } /* Open sam handle if it isn't already open */ + if (!domain->sam_handle_open) { + domain->sam_handle_open = - samr_connect(domain->controller, SEC_RIGHTS_MAXIMUM_ALLOWED, + samr_connect(domain->controller, + SEC_RIGHTS_MAXIMUM_ALLOWED, &domain->sam_handle); + if (!domain->sam_handle_open) return False; } /* Open sam domain handle if it isn't already open */ + if (!domain->sam_dom_handle_open) { + domain->sam_dom_handle_open = samr_open_domain(&domain->sam_handle, - SEC_RIGHTS_MAXIMUM_ALLOWED, &domain->sid, - &domain->sam_dom_handle); + SEC_RIGHTS_MAXIMUM_ALLOWED, + &domain->sid, &domain->sam_dom_handle); + if (!domain->sam_dom_handle_open) return False; } return True; } +/* Close all LSA and SAM connections */ + static void winbindd_kill_connections(void) { + struct winbindd_cli_state *cli; struct winbindd_domain *domain; DEBUG(1,("killing winbindd connections\n")); + /* Close LSA connection */ + server_state.pwdb_initialised = False; server_state.lsa_handle_open = False; lsa_close(&server_state.lsa_handle); - for (domain=domain_list; domain; domain=domain->next) { + /* Close SAM connections */ + + domain = domain_list; + + while(domain) { + struct winbindd_domain *next; + + /* Close SAM handles */ + if (domain->sam_dom_handle_open) { samr_close(&domain->sam_dom_handle); domain->sam_dom_handle_open = False; } + if (domain->sam_handle_open) { samr_close(&domain->sam_handle); domain->sam_handle_open = False; } + + /* Remove from list */ + + next = domain->next; DLIST_REMOVE(domain_list, domain); free(domain); + + domain = next; + } + + /* We also need to go through and trash any pointers to domains in + get{pw,gr}ent state records */ + + for (cli = client_list; cli; cli = cli->next) { + free_getent_state(cli->getpwent_state); + free_getent_state(cli->getgrent_state); } } +/* Try to establish connections to NT servers */ + void establish_connections(void) { struct winbindd_domain *domain; |