summaryrefslogtreecommitdiff
path: root/source3/sam/idmap_winbind.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/sam/idmap_winbind.c')
-rw-r--r--source3/sam/idmap_winbind.c79
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;