summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Potter <tpot@samba.org>2002-03-20 04:53:44 +0000
committerTim Potter <tpot@samba.org>2002-03-20 04:53:44 +0000
commit04b555952ca63f249b53e60adba1f8f55e313bb6 (patch)
treeef9320e57316401e09b2cbf3a9ea42d34b6bf864
parent9cd6e74e8be399a72921325a0ca87cc523dd0cec (diff)
downloadsamba-04b555952ca63f249b53e60adba1f8f55e313bb6.tar.gz
samba-04b555952ca63f249b53e60adba1f8f55e313bb6.tar.bz2
samba-04b555952ca63f249b53e60adba1f8f55e313bb6.zip
Added name_to_sid and sid_to_name functions.
(This used to be commit 5e955b5fcc53b80238bbc178ca0bcd8b3e81c05f)
-rw-r--r--source3/python/py_winbind.c137
1 files changed, 136 insertions, 1 deletions
diff --git a/source3/python/py_winbind.c b/source3/python/py_winbind.c
index eed9b235e0..9e03132ab4 100644
--- a/source3/python/py_winbind.c
+++ b/source3/python/py_winbind.c
@@ -1,6 +1,27 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ Python wrapper for winbind client functions.
+
+ Copyright (C) Tim Potter 2002
+
+ 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 "Python.h"
-#include "python/py_common.h"
/*
* Exceptions raised by this module
@@ -8,11 +29,125 @@
PyObject *winbind_error; /* A winbind call returned WINBINDD_ERROR */
+/* Prototypes from common.h */
+
+NSS_STATUS winbindd_request(int req_type,
+ struct winbindd_request *request,
+ struct winbindd_response *response);
+
+/* FIXME: grr this needs to be a fn in a library somewhere */
+
+static BOOL parse_domain_user(const char *domuser, fstring domain,
+ fstring user)
+{
+ char *p = strchr(domuser,*lp_winbind_separator());
+
+ if (!(p || lp_winbind_use_default_domain()))
+ return False;
+
+ if(!p && lp_winbind_use_default_domain()) {
+ fstrcpy(user, domuser);
+ fstrcpy(domain, lp_workgroup());
+ } else {
+ fstrcpy(user, p+1);
+ fstrcpy(domain, domuser);
+ domain[PTR_DIFF(p, domuser)] = 0;
+ }
+ strupper(domain);
+ return True;
+}
+
+/*
+ * Name <-> SID conversion
+ */
+
+/* Convert a name to a sid */
+
+static PyObject *winbind_name_to_sid(PyObject *self, PyObject *args)
+
+{
+ struct winbindd_request request;
+ struct winbindd_response response;
+ PyObject *result;
+ char *name, *p;
+
+ if (!PyArg_ParseTuple(args, "s", &name))
+ return NULL;
+
+ ZERO_STRUCT(request);
+ ZERO_STRUCT(response);
+
+ /* FIXME: use winbind separator */
+
+ if ((p = strchr(name, '\\'))) {
+ *p = 0;
+ fstrcpy(request.data.name.dom_name, name);
+ fstrcpy(request.data.name.name, p + 1);
+ } else {
+ fstrcpy(request.data.name.dom_name, lp_workgroup());
+ fstrcpy(request.data.name.name, name);
+ }
+
+ if (winbindd_request(WINBINDD_LOOKUPNAME, &request, &response)
+ != NSS_STATUS_SUCCESS) {
+ PyErr_SetString(winbind_error, "lookup failed");
+ return NULL;
+ }
+
+ result = PyString_FromString(response.data.sid.sid);
+
+ return result;
+}
+
+/* Convert a sid to a name */
+
+static PyObject *winbind_sid_to_name(PyObject *self, PyObject *args)
+{
+ struct winbindd_request request;
+ struct winbindd_response response;
+ PyObject *result;
+ char *sid, *name;
+
+ if (!PyArg_ParseTuple(args, "s", &sid))
+ return NULL;
+
+ ZERO_STRUCT(request);
+ ZERO_STRUCT(response);
+
+ fstrcpy(request.data.sid, sid);
+
+ if (winbindd_request(WINBINDD_LOOKUPSID, &request, &response)
+ != NSS_STATUS_SUCCESS) {
+ PyErr_SetString(winbind_error, "lookup failed");
+ return NULL;
+ }
+
+ /* FIXME: use actual winbind separator */
+
+ asprintf(&name, "%s%c%s", response.data.name.dom_name,
+ '\\', response.data.name.name);
+
+ result = PyString_FromString(name);
+
+ free(name);
+
+ return result;
+}
+
/*
* Method dispatch table
*/
static PyMethodDef winbind_methods[] = {
+
+ /* Name <-> SID conversion */
+
+ { "name_to_sid", winbind_name_to_sid, METH_VARARGS,
+ "Convert a name to a sid" },
+
+ { "sid_to_name", winbind_sid_to_name, METH_VARARGS,
+ "Convert a sid to a name" },
+
{ NULL }
};