diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/python/py_winbind.c | 198 |
1 files changed, 175 insertions, 23 deletions
diff --git a/source3/python/py_winbind.c b/source3/python/py_winbind.c index af87207a7f..73bc811409 100644 --- a/source3/python/py_winbind.c +++ b/source3/python/py_winbind.c @@ -23,6 +23,8 @@ #include "includes.h" #include "Python.h" +#include "py_common.h" + /* * Exceptions raised by this module */ @@ -41,13 +43,13 @@ NSS_STATUS winbindd_request(int req_type, /* Convert a name to a sid */ -static PyObject *winbind_name_to_sid(PyObject *self, PyObject *args) +static PyObject *py_name_to_sid(PyObject *self, PyObject *args) { struct winbindd_request request; struct winbindd_response response; PyObject *result; - char *name, *p; + char *name, *p, *sep; if (!PyArg_ParseTuple(args, "s", &name)) return NULL; @@ -55,9 +57,9 @@ static PyObject *winbind_name_to_sid(PyObject *self, PyObject *args) ZERO_STRUCT(request); ZERO_STRUCT(response); - /* FIXME: use winbind separator */ + sep = lp_winbind_separator(); - if ((p = strchr(name, '\\'))) { + if ((p = strchr(name, sep[0]))) { *p = 0; fstrcpy(request.data.name.dom_name, name); fstrcpy(request.data.name.name, p + 1); @@ -79,7 +81,7 @@ static PyObject *winbind_name_to_sid(PyObject *self, PyObject *args) /* Convert a sid to a name */ -static PyObject *winbind_sid_to_name(PyObject *self, PyObject *args) +static PyObject *py_sid_to_name(PyObject *self, PyObject *args) { struct winbindd_request request; struct winbindd_response response; @@ -118,7 +120,7 @@ static PyObject *winbind_sid_to_name(PyObject *self, PyObject *args) /* Enumerate domain users */ -static PyObject *winbind_enum_domain_users(PyObject *self, PyObject *args) +static PyObject *py_enum_domain_users(PyObject *self, PyObject *args) { struct winbindd_response response; PyObject *result; @@ -149,7 +151,7 @@ static PyObject *winbind_enum_domain_users(PyObject *self, PyObject *args) /* Enumerate domain groups */ -static PyObject *winbind_enum_domain_groups(PyObject *self, PyObject *args) +static PyObject *py_enum_domain_groups(PyObject *self, PyObject *args) { struct winbindd_response response; PyObject *result = NULL; @@ -184,7 +186,7 @@ static PyObject *winbind_enum_domain_groups(PyObject *self, PyObject *args) /* Enumerate domain groups */ -static PyObject *winbind_enum_trust_dom(PyObject *self, PyObject *args) +static PyObject *py_enum_trust_dom(PyObject *self, PyObject *args) { struct winbindd_response response; PyObject *result = NULL; @@ -215,7 +217,7 @@ static PyObject *winbind_enum_trust_dom(PyObject *self, PyObject *args) /* Check machine account password */ -static PyObject *winbind_check_secret(PyObject *self, PyObject *args) +static PyObject *py_check_secret(PyObject *self, PyObject *args) { struct winbindd_response response; @@ -238,7 +240,7 @@ static PyObject *winbind_check_secret(PyObject *self, PyObject *args) * parameters. This is stored in the module object. */ -static PyObject *winbind_config_dict(void) +static PyObject *py_config_dict(void) { PyObject *result; uid_t ulow, uhi; @@ -255,28 +257,132 @@ static PyObject *winbind_config_dict(void) PyDict_SetItemString(result, "separator", PyString_FromString(lp_winbind_separator())); - PyDict_SetItemString(result, "template homedir", + PyDict_SetItemString(result, "template_homedir", PyString_FromString(lp_template_homedir())); - PyDict_SetItemString(result, "template shell", + PyDict_SetItemString(result, "template_shell", PyString_FromString(lp_template_shell())); /* Winbind uid/gid range */ if (lp_winbind_uid(&ulow, &uhi)) { - PyDict_SetItemString(result, "uid low", PyInt_FromLong(ulow)); - PyDict_SetItemString(result, "uid high", PyInt_FromLong(uhi)); + PyDict_SetItemString(result, "uid_low", PyInt_FromLong(ulow)); + PyDict_SetItemString(result, "uid_high", PyInt_FromLong(uhi)); } if (lp_winbind_gid(&glow, &ghi)) { - PyDict_SetItemString(result, "gid low", PyInt_FromLong(glow)); - PyDict_SetItemString(result, "gid high", PyInt_FromLong(ghi)); + PyDict_SetItemString(result, "gid_low", PyInt_FromLong(glow)); + PyDict_SetItemString(result, "gid_high", PyInt_FromLong(ghi)); } return result; } /* + * ID mapping + */ + +/* Convert a uid to a SID */ + +static PyObject *py_uid_to_sid(PyObject *self, PyObject *args) +{ + struct winbindd_request request; + struct winbindd_response response; + int id; + + if (!PyArg_ParseTuple(args, "i", &id)) + return NULL; + + ZERO_STRUCT(request); + ZERO_STRUCT(response); + + request.data.uid = id; + + if (winbindd_request(WINBINDD_UID_TO_SID, &request, &response) + != NSS_STATUS_SUCCESS) { + PyErr_SetString(winbind_error, "lookup failed"); + return NULL; + } + + return PyString_FromString(response.data.sid.sid); +} + +/* Convert a gid to a SID */ + +static PyObject *py_gid_to_sid(PyObject *self, PyObject *args) +{ + struct winbindd_request request; + struct winbindd_response response; + int id; + + if (!PyArg_ParseTuple(args, "i", &id)) + return NULL; + + ZERO_STRUCT(request); + ZERO_STRUCT(response); + + request.data.gid = id; + + if (winbindd_request(WINBINDD_GID_TO_SID, &request, &response) + != NSS_STATUS_SUCCESS) { + PyErr_SetString(winbind_error, "lookup failed"); + return NULL; + } + + return PyString_FromString(response.data.sid.sid); +} + +/* Convert a sid to a uid */ + +static PyObject *py_sid_to_uid(PyObject *self, PyObject *args) +{ + struct winbindd_request request; + struct winbindd_response response; + char *sid; + + if (!PyArg_ParseTuple(args, "s", &sid)) + return NULL; + + ZERO_STRUCT(request); + ZERO_STRUCT(response); + + fstrcpy(request.data.sid, sid); + + if (winbindd_request(WINBINDD_SID_TO_UID, &request, &response) + != NSS_STATUS_SUCCESS) { + PyErr_SetString(winbind_error, "lookup failed"); + return NULL; + } + + return PyInt_FromLong(response.data.uid); +} + +/* Convert a sid to a gid */ + +static PyObject *py_sid_to_gid(PyObject *self, PyObject *args) +{ + struct winbindd_request request; + struct winbindd_response response; + char *sid; + + if (!PyArg_ParseTuple(args, "s", &sid)) + return NULL; + + ZERO_STRUCT(request); + ZERO_STRUCT(response); + + fstrcpy(request.data.sid, sid); + + if (winbindd_request(WINBINDD_SID_TO_GID, &request, &response) + != NSS_STATUS_SUCCESS) { + PyErr_SetString(winbind_error, "lookup failed"); + return NULL; + } + + return PyInt_FromLong(response.data.gid); +} + +/* * Method dispatch table */ @@ -284,31 +390,73 @@ static PyMethodDef winbind_methods[] = { /* Name <-> SID conversion */ - { "name_to_sid", winbind_name_to_sid, METH_VARARGS, + { "name_to_sid", py_name_to_sid, METH_VARARGS, "Convert a name to a sid" }, - { "sid_to_name", winbind_sid_to_name, METH_VARARGS, + { "sid_to_name", py_sid_to_name, METH_VARARGS, "Convert a sid to a name" }, /* Enumerate users/groups */ - { "enum_domain_users", winbind_enum_domain_users, METH_VARARGS, + { "enum_domain_users", py_enum_domain_users, METH_VARARGS, "Enumerate domain users" }, - { "enum_domain_groups", winbind_enum_domain_groups, METH_VARARGS, + { "enum_domain_groups", py_enum_domain_groups, METH_VARARGS, "Enumerate domain groups" }, + /* ID mapping */ + + { "uid_to_sid", py_uid_to_sid, METH_VARARGS, + "Convert a uid to a SID" }, + + { "gid_to_sid", py_gid_to_sid, METH_VARARGS, + "Convert a gid to a SID" }, + + { "sid_to_uid", py_sid_to_uid, METH_VARARGS, + "Convert a uid to a SID" }, + + { "sid_to_gid", py_sid_to_gid, METH_VARARGS, + "Convert a gid to a SID" }, + /* Miscellaneous */ - { "check_secret", winbind_check_secret, METH_VARARGS, + { "check_secret", py_check_secret, METH_VARARGS, "Check machine account password" }, - { "enum_trust_dom", winbind_enum_trust_dom, METH_VARARGS, + { "enum_trust_dom", py_enum_trust_dom, METH_VARARGS, "Enumerate trusted domains" }, { NULL } }; +static struct winbind_const { + char *name; + uint32 value; +} winbind_const_vals[] = { + + /* Well known RIDs */ + + { "DOMAIN_USER_RID_ADMIN", DOMAIN_USER_RID_ADMIN }, + { "DOMAIN_USER_RID_GUEST", DOMAIN_USER_RID_GUEST }, + { "DOMAIN_GROUP_RID_ADMINS", DOMAIN_GROUP_RID_ADMINS }, + { "DOMAIN_GROUP_RID_USERS", DOMAIN_GROUP_RID_USERS }, + { "DOMAIN_GROUP_RID_GUESTS", DOMAIN_GROUP_RID_GUESTS }, + + { NULL } +}; + +static void const_init(PyObject *dict) +{ + struct winbind_const *tmp; + PyObject *obj; + + for (tmp = winbind_const_vals; tmp->name; tmp++) { + obj = PyInt_FromLong(tmp->value); + PyDict_SetItemString(dict, tmp->name, obj); + Py_DECREF(obj); + } +} + /* * Module initialisation */ @@ -329,7 +477,11 @@ void initwinbind(void) py_samba_init(); + /* Initialise constants */ + + const_init(dict); + /* Insert configuration dictionary */ - PyDict_SetItemString(dict, "config", winbind_config_dict()); + PyDict_SetItemString(dict, "config", py_config_dict()); } |