summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/auth/auth_util.c12
-rw-r--r--source3/python/py_winbind.c4
-rw-r--r--source3/sam/idmap_winbind.c79
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;