diff options
-rw-r--r-- | source3/passdb/py_passdb.c | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/source3/passdb/py_passdb.c b/source3/passdb/py_passdb.c index b7cc18c562..194a7d47a8 100644 --- a/source3/passdb/py_passdb.c +++ b/source3/passdb/py_passdb.c @@ -1922,6 +1922,60 @@ static PyObject *py_pdb_enum_group_members(pytalloc_Object *self, PyObject *args } +static PyObject *py_pdb_enum_group_memberships(pytalloc_Object *self, PyObject *args) +{ + NTSTATUS status; + struct pdb_methods *methods; + TALLOC_CTX *tframe; + int i; + + struct samu *sam_acct; + PyObject *py_sam_acct; + PyObject *py_sid_list; + struct dom_sid *user_group_sids = NULL; + gid_t *user_group_ids = NULL; + uint32_t num_groups = 0; + + if (!PyArg_ParseTuple(args, "O!:enum_group_memberships", &PySamu, &py_sam_acct)) { + return NULL; + } + + methods = pytalloc_get_ptr(self); + + if ((tframe = talloc_stackframe()) == NULL) { + PyErr_NoMemory(); + return NULL; + } + + sam_acct = pytalloc_get_ptr(py_sam_acct); + + status = methods->enum_group_memberships(methods, tframe, sam_acct, + &user_group_sids, &user_group_ids, &num_groups); + if (!NT_STATUS_IS_OK(status)) { + PyErr_Format(py_pdb_error, "Unable to enumerate group memberships, (%d,%s)", + NT_STATUS_V(status), + get_friendly_nt_error_msg(status)); + talloc_free(tframe); + return NULL; + } + + py_sid_list = PyList_New(0); + if (py_sid_list == NULL) { + PyErr_NoMemory(); + talloc_free(tframe); + return NULL; + } + + for(i=0; i<num_groups; i++) { + PyList_Append(py_sid_list, pytalloc_steal(dom_sid_Type, dom_sid_dup(NULL, &user_group_sids[i]))); + } + + talloc_free(tframe); + + return py_sid_list; +} + + static PyObject *py_pdb_add_groupmem(pytalloc_Object *self, PyObject *args) { NTSTATUS status; @@ -3410,7 +3464,9 @@ static PyMethodDef py_pdb_methods[] = { { "enum_group_members", (PyCFunction)py_pdb_enum_group_members, METH_VARARGS, "enum_group_members(group_sid) -> List\n\n \ Return list of users (dom_sid object) in group." }, - /* enum_group_memberships */ + { "enum_group_memberships", (PyCFunction)py_pdb_enum_group_memberships, METH_VARARGS, + "enum_group_memberships(samu object) -> List\n\n \ + Return list of groups (dom_sid object) this user is part of." }, /* set_unix_primary_group */ { "add_groupmem", (PyCFunction)py_pdb_add_groupmem, METH_VARARGS, "add_groupmem(group_rid, member_rid) -> None\n\n \ |