diff options
Diffstat (limited to 'source3/sam/idmap_winbind.c')
-rw-r--r-- | source3/sam/idmap_winbind.c | 79 |
1 files changed, 61 insertions, 18 deletions
diff --git a/source3/sam/idmap_winbind.c b/source3/sam/idmap_winbind.c index a5ba658674..c2c46cfb57 100644 --- a/source3/sam/idmap_winbind.c +++ b/source3/sam/idmap_winbind.c @@ -21,48 +21,91 @@ */ #include "includes.h" +#include "nsswitch/winbind_nss.h" #undef DBGC_CLASS #define DBGC_CLASS DBGC_IDMAP +extern DOM_SID global_sid_NULL; /* NULL sid */ + +NSS_STATUS winbindd_request(int req_type, + struct winbindd_request *request, + struct winbindd_response *response); + /* Get a sid from an id */ -static NTSTATUS db_get_sid_from_id(DOM_SID *sid, unid_t id, int id_type) { +static NTSTATUS db_get_sid_from_id(DOM_SID *sid, unid_t id, int id_type) +{ + struct winbindd_request request; + struct winbindd_response response; + int result, operation; + fstring sid_str; + + ZERO_STRUCT(request); + ZERO_STRUCT(response); + switch (id_type & ID_TYPEMASK) { case ID_USERID: - if (winbind_uid_to_sid(sid, id.uid)) { - return NT_STATUS_OK; - } + request.data.uid = id.uid; + operation = WINBINDD_UID_TO_SID; break; case ID_GROUPID: - if (winbind_gid_to_sid(sid, id.gid)) { - return NT_STATUS_OK; - } + request.data.gid = id.gid; + operation = WINBINDD_GID_TO_SID; break; default: return NT_STATUS_INVALID_PARAMETER; } + /* Make The Request */ + result = winbindd_request(operation, &request, &response); + if (result == NSS_STATUS_SUCCESS) { + if (!string_to_sid(sid, response.data.sid.sid)) { + return NT_STATUS_INVALID_SID; + } + return NT_STATUS_OK; + } else { + sid_copy(sid, &global_sid_NULL); + } + return NT_STATUS_UNSUCCESSFUL; } /* Get an id from a sid */ -static NTSTATUS db_get_id_from_sid(unid_t *id, int *id_type, const DOM_SID *sid) { +static NTSTATUS db_get_id_from_sid(unid_t *id, int *id_type, const DOM_SID *sid) +{ + struct winbindd_request request; + struct winbindd_response response; + int result, operation; + fstring sid_str; + + if (!id || !id_type) { + return NT_STATUS_INVALID_PARAMETER; + } + + ZERO_STRUCT(request); + ZERO_STRUCT(response); + switch (*id_type & ID_TYPEMASK) { case ID_USERID: - if (winbind_sid_to_uid(&((*id).uid), sid)) { - return NT_STATUS_OK; - } + operation = WINBINDD_SID_TO_UID; break; case ID_GROUPID: - if (winbind_sid_to_gid(&((*id).gid), sid)) { - return NT_STATUS_OK; - } + operation = WINBINDD_SID_TO_GID; break; default: - if (winbind_sid_to_uid(&((*id).uid), sid) || - winbind_sid_to_gid(&((*id).gid), sid)) { - return NT_STATUS_OK; - } + return NT_STATUS_INVALID_PARAMETER; + } + + /* Make The Request */ + result = winbindd_request(operation, &request, &response); + + if (result == NSS_STATUS_SUCCESS) { + if (operation == WINBINDD_SID_TO_UID) { + (*id).uid = response.data.uid; + } else { + (*id).gid = response.data.gid; + } + return NT_STATUS_OK; } return NT_STATUS_UNSUCCESSFUL; |