diff options
-rw-r--r-- | source3/auth/auth_util.c | 12 | ||||
-rw-r--r-- | source3/python/py_winbind.c | 4 | ||||
-rw-r--r-- | source3/sam/idmap_winbind.c | 79 |
3 files changed, 70 insertions, 25 deletions
diff --git a/source3/auth/auth_util.c b/source3/auth/auth_util.c index a3ca0b226f..ddb833a0e5 100644 --- a/source3/auth/auth_util.c +++ b/source3/auth/auth_util.c @@ -869,8 +869,8 @@ NTSTATUS make_server_info_info3(TALLOC_CTX *mem_ctx, struct passwd *passwd; - uid_t uid; - gid_t gid; + unid_t u_id, g_id; + int u_type, g_type; int n_lgroupSIDs; DOM_SID *lgroupSIDs = NULL; @@ -907,9 +907,11 @@ NTSTATUS make_server_info_info3(TALLOC_CTX *mem_ctx, domain = domain; } - if (winbind_sid_to_uid(&uid, &user_sid) - && winbind_sid_to_gid(&gid, &group_sid) - && ((passwd = getpwuid_alloc(uid)))) { + u_type = ID_USERID; + g_type = ID_GROUPID; + if (NT_STATUS_IS_OK(idmap_get_id_from_sid(&u_id, &u_type, &user_sid)) + && NT_STATUS_IS_OK(idmap_get_id_from_sid(&g_id, &g_type, &group_sid)) + && ((passwd = getpwuid_alloc(u_id.uid)))) { nt_status = pdb_init_sam_pw(&sam_account, passwd); passwd_free(&passwd); } else { diff --git a/source3/python/py_winbind.c b/source3/python/py_winbind.c index db66be2321..0c40861c70 100644 --- a/source3/python/py_winbind.c +++ b/source3/python/py_winbind.c @@ -261,12 +261,12 @@ static PyObject *py_config_dict(void) /* Winbind uid/gid range */ - if (lp_winbind_uid(&ulow, &uhi)) { + if (lp_idmap_uid(&ulow, &uhi)) { PyDict_SetItemString(result, "uid_low", PyInt_FromLong(ulow)); PyDict_SetItemString(result, "uid_high", PyInt_FromLong(uhi)); } - if (lp_winbind_gid(&glow, &ghi)) { + if (lp_idmap_gid(&glow, &ghi)) { PyDict_SetItemString(result, "gid_low", PyInt_FromLong(glow)); PyDict_SetItemString(result, "gid_high", PyInt_FromLong(ghi)); } 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; |