summaryrefslogtreecommitdiff
path: root/source3/nsswitch
diff options
context:
space:
mode:
authorTim Potter <tpot@samba.org>2000-07-10 05:40:43 +0000
committerTim Potter <tpot@samba.org>2000-07-10 05:40:43 +0000
commit64299375b544de91dab75d62610d7dc7f1f8328d (patch)
treeb621264c9f8481be3a8a6f52beac112ce3e1cd37 /source3/nsswitch
parent520bb0d775b35df07e540f33affd80de4de4572c (diff)
downloadsamba-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.c174
-rw-r--r--source3/nsswitch/wb_common.c (renamed from source3/nsswitch/common.c)0
-rw-r--r--source3/nsswitch/winbindd_util.c59
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;