mirror of
				https://github.com/samba-team/samba.git
				synced 2025-10-30 08:23:49 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			162 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* 
 | |
|    Unix SMB/CIFS implementation.
 | |
| 
 | |
|    provide access to getpwnam() and related calls
 | |
| 
 | |
|    Copyright (C) Andrew Tridgell 2005
 | |
|    
 | |
|    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 "scripting/ejs/smbcalls.h"
 | |
| #include "lib/appweb/ejs/ejs.h"
 | |
| #include "system/passwd.h"
 | |
| 
 | |
| 
 | |
| /*
 | |
|   return a struct passwd as an object
 | |
| */
 | |
| static struct MprVar mpr_passwd(struct passwd *pwd)
 | |
| {
 | |
| 	struct MprVar ret;
 | |
| 	if (pwd == NULL) {
 | |
| 		return mprCreateUndefinedVar();
 | |
| 	}
 | |
| 	ret = mprObject("passwd");
 | |
| 
 | |
| 	mprSetVar(&ret, "pw_name",   mprString(pwd->pw_name));
 | |
| 	mprSetVar(&ret, "pw_passwd", mprString(pwd->pw_passwd));
 | |
| 	mprSetVar(&ret, "pw_uid",    mprCreateIntegerVar(pwd->pw_uid));
 | |
| 	mprSetVar(&ret, "pw_gid",    mprCreateIntegerVar(pwd->pw_gid));
 | |
| 	mprSetVar(&ret, "pw_gecos",  mprString(pwd->pw_gecos));
 | |
| 	mprSetVar(&ret, "pw_dir",    mprString(pwd->pw_dir));
 | |
| 	mprSetVar(&ret, "pw_shell",  mprString(pwd->pw_shell));
 | |
| 	return ret;
 | |
| }
 | |
| 
 | |
| /*
 | |
|   return a struct passwd as an object
 | |
| */
 | |
| static struct MprVar mpr_group(struct group *grp)
 | |
| {
 | |
| 	struct MprVar ret;
 | |
| 	if (grp == NULL) {
 | |
| 		return mprCreateUndefinedVar();
 | |
| 	}
 | |
| 	ret = mprObject("group");
 | |
| 
 | |
| 	mprSetVar(&ret, "gr_name",   mprString(grp->gr_name));
 | |
| 	mprSetVar(&ret, "gr_passwd", mprString(grp->gr_passwd));
 | |
| 	mprSetVar(&ret, "gr_gid",    mprCreateIntegerVar(grp->gr_gid));
 | |
| 	mprSetVar(&ret, "gr_mem",    mprList("gr_mem", (const char **)grp->gr_mem));
 | |
| 	return ret;
 | |
| }
 | |
| 
 | |
| 
 | |
| /*
 | |
|   usage:
 | |
|       var pw = nss.getpwnam("root");
 | |
| 
 | |
|   returns an object containing struct passwd entries
 | |
| */
 | |
| static int ejs_getpwnam(MprVarHandle eid, int argc, struct MprVar **argv)
 | |
| {
 | |
| 	/* validate arguments */
 | |
| 	if (argc != 1 || argv[0]->type != MPR_TYPE_STRING) {
 | |
| 		ejsSetErrorMsg(eid, "getpwnam invalid arguments");
 | |
| 		return -1;
 | |
| 	}
 | |
| 
 | |
| 	mpr_Return(eid, mpr_passwd(getpwnam(mprToString(argv[0]))));
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| /*
 | |
|   usage:
 | |
|       var pw = nss.getpwuid(0);
 | |
| 
 | |
|   returns an object containing struct passwd entries
 | |
| */
 | |
| static int ejs_getpwuid(MprVarHandle eid, int argc, struct MprVar **argv)
 | |
| {
 | |
| 	/* validate arguments */
 | |
| 	if (argc != 1 || !mprVarIsNumber(argv[0]->type)) {
 | |
| 		ejsSetErrorMsg(eid, "getpwuid invalid arguments");
 | |
| 		return -1;
 | |
| 	}
 | |
| 	mpr_Return(eid, mpr_passwd(getpwuid(mprToInt(argv[0]))));
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| /*
 | |
|   usage:
 | |
|       var pw = nss.getgrnam("users");
 | |
| 
 | |
|   returns an object containing struct group entries
 | |
| */
 | |
| static int ejs_getgrnam(MprVarHandle eid, int argc, struct MprVar **argv)
 | |
| {
 | |
| 	/* validate arguments */
 | |
| 	if (argc != 1 || argv[0]->type != MPR_TYPE_STRING) {
 | |
| 		ejsSetErrorMsg(eid, "getgrnam invalid arguments");
 | |
| 		return -1;
 | |
| 	}
 | |
| 	mpr_Return(eid, mpr_group(getgrnam(mprToString(argv[0]))));
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| /*
 | |
|   usage:
 | |
|       var pw = nss.getgrgid(0);
 | |
| 
 | |
|   returns an object containing struct group entries
 | |
| */
 | |
| static int ejs_getgrgid(MprVarHandle eid, int argc, struct MprVar **argv)
 | |
| {
 | |
| 	/* validate arguments */
 | |
| 	if (argc != 1 || argv[0]->type != MPR_TYPE_STRING) {
 | |
| 		ejsSetErrorMsg(eid, "getgrgid invalid arguments");
 | |
| 		return -1;
 | |
| 	}
 | |
| 	mpr_Return(eid, mpr_group(getgrgid(mprToInt(argv[0]))));
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| /*
 | |
|   initialise nss ejs subsystem
 | |
| */
 | |
| static int ejs_nss_init(MprVarHandle eid, int argc, struct MprVar **argv)
 | |
| {
 | |
| 	struct MprVar *nss = mprInitObject(eid, "nss", argc, argv);
 | |
| 
 | |
| 	mprSetCFunction(nss, "getpwnam", ejs_getpwnam);
 | |
| 	mprSetCFunction(nss, "getpwuid", ejs_getpwuid);
 | |
| 	mprSetCFunction(nss, "getgrnam", ejs_getgrnam);
 | |
| 	mprSetCFunction(nss, "getgrgid", ejs_getgrgid);
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| /*
 | |
|   setup C functions that be called from ejs
 | |
| */
 | |
| NTSTATUS smb_setup_ejs_nss(void)
 | |
| {
 | |
| 	ejsDefineCFunction(-1, "nss_init", ejs_nss_init, NULL, MPR_VAR_SCRIPT_HANDLE);
 | |
| 	return NT_STATUS_OK;
 | |
| }
 |