diff options
-rw-r--r-- | source3/Makefile.in | 2 | ||||
-rw-r--r-- | source3/sam/idmap.c | 1 | ||||
-rw-r--r-- | source3/sam/idmap_winbind.c | 155 |
3 files changed, 157 insertions, 1 deletions
diff --git a/source3/Makefile.in b/source3/Makefile.in index f1c497663f..b3183a6203 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -280,7 +280,7 @@ XML_OBJ = passdb/pdb_xml.o MYSQL_OBJ = passdb/pdb_mysql.o DEVEL_HELP_OBJ = modules/weird.o -IDMAP_OBJ = sam/idmap.o sam/idmap_util.o sam/idmap_tdb.o +IDMAP_OBJ = sam/idmap.o sam/idmap_util.o sam/idmap_tdb.o sam/idmap_winbind.o GROUPDB_OBJ = groupdb/mapping.o diff --git a/source3/sam/idmap.c b/source3/sam/idmap.c index 9695e7b764..e2796e0864 100644 --- a/source3/sam/idmap.c +++ b/source3/sam/idmap.c @@ -32,6 +32,7 @@ static struct { struct idmap_methods *methods; } remote_idmap_functions[] = { + { "winbind", idmap_reg_winbind, NULL }, { NULL, NULL, NULL } }; diff --git a/source3/sam/idmap_winbind.c b/source3/sam/idmap_winbind.c new file mode 100644 index 0000000000..bc3c8ad60c --- /dev/null +++ b/source3/sam/idmap_winbind.c @@ -0,0 +1,155 @@ +/* + Unix SMB/CIFS implementation. + + idmap Winbind backend + + Copyright (C) Simo Sorce 2003 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#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) +{ + struct winbindd_request request; + struct winbindd_response response; + int result, operation; + + ZERO_STRUCT(request); + ZERO_STRUCT(response); + + switch (id_type & ID_TYPEMASK) { + case ID_USERID: + request.data.uid = id.uid; + operation = WINBINDD_UID_TO_SID; + break; + case ID_GROUPID: + 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) +{ + struct winbindd_request request; + struct winbindd_response response; + int result, operation; + fstring sid_str; + + if (!id || !id_type) { + return NT_STATUS_INVALID_PARAMETER; + } + + /* setup request */ + + ZERO_STRUCT(request); + ZERO_STRUCT(response); + + switch (*id_type & ID_TYPEMASK) { + case ID_USERID: + operation = WINBINDD_SID_TO_UID; + break; + case ID_GROUPID: + operation = WINBINDD_SID_TO_GID; + break; + default: + return NT_STATUS_INVALID_PARAMETER; + } + + sid_to_string(sid_str, sid); + fstrcpy(request.data.sid, sid_str); + + /* 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; +} + +static NTSTATUS db_set_mapping(const DOM_SID *sid, unid_t id, int id_type) { + return NT_STATUS_UNSUCCESSFUL; +} + +/***************************************************************************** + Initialise idmap database. +*****************************************************************************/ +static NTSTATUS db_init(void) { + return NT_STATUS_OK; +} + +/* Close the tdb */ +static NTSTATUS db_close(void) { + return NT_STATUS_OK; +} + +static void db_status(void) { + return; +} + +struct idmap_methods winbind_methods = { + + db_init, + db_get_sid_from_id, + db_get_id_from_sid, + db_set_mapping, + db_close, + db_status + +}; + +NTSTATUS idmap_reg_winbind(struct idmap_methods **meth) +{ + *meth = &winbind_methods; + + return NT_STATUS_OK; +} + |