py_winbind.c
来自「samba-3.0.22.tar.gz 编译smb服务器的源码」· C语言 代码 · 共 801 行 · 第 1/2 页
C
801 行
/* Unix SMB/CIFS implementation. Python wrapper for winbind client functions. Copyright (C) Tim Potter 2002-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 "py_winbind.h"/* * Exceptions raised by this module */PyObject *winbind_error; /* A winbind call returned WINBINDD_ERROR *//* Prototypes from common.h */NSS_STATUS winbindd_request_response(int req_type, struct winbindd_request *request, struct winbindd_response *response);/* * Name <-> SID conversion *//* Convert a name to a sid */static PyObject *py_name_to_sid(PyObject *self, PyObject *args){ struct winbindd_request request; struct winbindd_response response; PyObject *result; char *name, *p; const char *sep; if (!PyArg_ParseTuple(args, "s", &name)) return NULL; ZERO_STRUCT(request); ZERO_STRUCT(response); sep = lp_winbind_separator(); if ((p = strchr(name, sep[0]))) { *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_response(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 *py_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_response(WINBINDD_LOOKUPSID, &request, &response) != NSS_STATUS_SUCCESS) { PyErr_SetString(winbind_error, "lookup failed"); return NULL; } asprintf(&name, "%s%s%s", response.data.name.dom_name, lp_winbind_separator(), response.data.name.name); result = PyString_FromString(name); free(name); return result;}/* * Enumerate users/groups *//* Enumerate domain users */static PyObject *py_enum_domain_users(PyObject *self, PyObject *args){ struct winbindd_response response; PyObject *result; if (!PyArg_ParseTuple(args, "")) return NULL; ZERO_STRUCT(response); if (winbindd_request_response(WINBINDD_LIST_USERS, NULL, &response) != NSS_STATUS_SUCCESS) { PyErr_SetString(winbind_error, "lookup failed"); return NULL; } result = PyList_New(0); if (response.extra_data) { const char *extra_data = response.extra_data; fstring name; while (next_token(&extra_data, name, ",", sizeof(fstring))) PyList_Append(result, PyString_FromString(name)); } return result;}/* Enumerate domain groups */static PyObject *py_enum_domain_groups(PyObject *self, PyObject *args){ struct winbindd_response response; PyObject *result = NULL; if (!PyArg_ParseTuple(args, "")) return NULL; ZERO_STRUCT(response); if (winbindd_request_response(WINBINDD_LIST_GROUPS, NULL, &response) != NSS_STATUS_SUCCESS) { PyErr_SetString(winbind_error, "lookup failed"); return NULL; } result = PyList_New(0); if (response.extra_data) { const char *extra_data = response.extra_data; fstring name; while (next_token(&extra_data, name, ",", sizeof(fstring))) PyList_Append(result, PyString_FromString(name)); } return result;}/* * Miscellaneous domain related *//* Enumerate domain groups */static PyObject *py_enum_trust_dom(PyObject *self, PyObject *args){ struct winbindd_response response; PyObject *result = NULL; if (!PyArg_ParseTuple(args, "")) return NULL; ZERO_STRUCT(response); if (winbindd_request_response(WINBINDD_LIST_TRUSTDOM, NULL, &response) != NSS_STATUS_SUCCESS) { PyErr_SetString(winbind_error, "lookup failed"); return NULL; } result = PyList_New(0); if (response.extra_data) { const char *extra_data = response.extra_data; fstring name; while (next_token(&extra_data, name, ",", sizeof(fstring))) PyList_Append(result, PyString_FromString(name)); } return result;}/* Check machine account password */static PyObject *py_check_secret(PyObject *self, PyObject *args){ struct winbindd_response response; if (!PyArg_ParseTuple(args, "")) return NULL; ZERO_STRUCT(response); if (winbindd_request_response(WINBINDD_CHECK_MACHACC, NULL, &response) != NSS_STATUS_SUCCESS) { PyErr_SetString(winbind_error, "lookup failed"); return NULL; } return PyInt_FromLong(response.data.num_entries);}/* * Return a dictionary consisting of all the winbind related smb.conf * parameters. This is stored in the module object. */static PyObject *py_config_dict(void){ PyObject *result; uid_t ulow, uhi; gid_t glow, ghi; if (!(result = PyDict_New())) return NULL; /* Various string parameters */ PyDict_SetItemString(result, "workgroup", PyString_FromString(lp_workgroup())); PyDict_SetItemString(result, "separator", PyString_FromString(lp_winbind_separator())); PyDict_SetItemString(result, "template_homedir", PyString_FromString(lp_template_homedir())); PyDict_SetItemString(result, "template_shell", PyString_FromString(lp_template_shell())); /* idmap uid/gid range */ if (lp_idmap_uid(&ulow, &uhi)) { PyDict_SetItemString(result, "uid_low", PyInt_FromLong(ulow)); PyDict_SetItemString(result, "uid_high", PyInt_FromLong(uhi)); } if (lp_idmap_gid(&glow, &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_response(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_response(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_response(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_response(WINBINDD_SID_TO_GID, &request, &response) != NSS_STATUS_SUCCESS) { PyErr_SetString(winbind_error, "lookup failed"); return NULL; } return PyInt_FromLong(response.data.gid);}/* * PAM authentication functions *//* Plaintext authentication */static PyObject *py_auth_plaintext(PyObject *self, PyObject *args){ struct winbindd_request request; struct winbindd_response response; char *username, *password; if (!PyArg_ParseTuple(args, "ss", &username, &password)) return NULL; ZERO_STRUCT(request); ZERO_STRUCT(response); fstrcpy(request.data.auth.user, username); fstrcpy(request.data.auth.pass, password);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?