/* Unix SMB/CIFS implementation. 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" #include "nsswitch/winbind_nss.h" #undef DBGC_CLASS #define DBGC_CLASS DBGC_WINBIND NSS_STATUS winbindd_request_response(int req_type, struct winbindd_request *request, struct winbindd_response *response); /* Call winbindd to convert a name to a sid */ BOOL winbind_lookup_name(const char *dom_name, const char *name, DOM_SID *sid, enum SID_NAME_USE *name_type) { struct winbindd_request request; struct winbindd_response response; NSS_STATUS result; if (!sid || !name_type) return False; /* Send off request */ ZERO_STRUCT(request); ZERO_STRUCT(response); fstrcpy(request.data.name.dom_name, dom_name); fstrcpy(request.data.name.name, name); if ((result = winbindd_request_response(WINBINDD_LOOKUPNAME, &request, &response)) == NSS_STATUS_SUCCESS) { if (!string_to_sid(sid, response.data.sid.sid)) return False; *name_type = (enum SID_NAME_USE)response.data.sid.type; } return result == NSS_STATUS_SUCCESS; } /* Call winbindd to convert sid to name */ BOOL winbind_lookup_sid(TALLOC_CTX *mem_ctx, const DOM_SID *sid, const char **domain, const char **name, enum SID_NAME_USE *name_type) { struct winbindd_request request; struct winbindd_response response; NSS_STATUS result; /* Initialise request */ ZERO_STRUCT(request); ZERO_STRUCT(response); fstrcpy(request.data.sid, sid_string_static(sid)); /* Make request */ result = winbindd_request_response(WINBINDD_LOOKUPSID, &request, &response); if (result != NSS_STATUS_SUCCESS) { return False; } /* Copy out result */ if (domain != NULL) { *domain = talloc_strdup(mem_ctx, response.data.name.dom_name); if (*domain == NULL) { DEBUG(0, ("talloc failed\n")); return False; } } if (name != NULL) { *name = talloc_strdup(mem_ctx, response.data.name.name); if (*name == NULL) { DEBUG(0, ("talloc failed\n")); return False; } } *name_type = (enum SID_NAME_USE)response.data.name.type; DEBUG(10, ("winbind_lookup_sid: SUCCESS: SID %s -> %s %s\n", sid_string_static(sid), response.data.name.dom_name, response.data.name.name)); return True; } BOOL winbind_lookup_rids(TALLOC_CTX *mem_ctx, const DOM_SID *domain_sid, int num_rids, uint32 *rids, const char **domain_name, const char ***names, enum SID_NAME_USE **types) { size_t i, buflen; ssize_t len; char *ridlist; char *p; struct winbindd_request request; struct winbindd_response response; NSS_STATUS result; if (num_rids == 0) { return False; } /* Initialise request */ ZERO_STRUCT(request); ZERO_STRUCT(response); fstrcpy(request.data.sid, sid_string_static(domain_sid)); len = 0; buflen = 0; ridlist = NULL; for (i=0; i