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 + -
显示快捷键?