diff options
-rw-r--r-- | source3/passdb/nispass.c | 330 |
1 files changed, 330 insertions, 0 deletions
diff --git a/source3/passdb/nispass.c b/source3/passdb/nispass.c new file mode 100644 index 0000000000..270ad8683e --- /dev/null +++ b/source3/passdb/nispass.c @@ -0,0 +1,330 @@ +/* + * Unix SMB/Netbios implementation. Version 1.9. SMB parameters and setup + * Copyright (C) Andrew Tridgell 1992-1998 Modified by Jeremy Allison 1995. + * Copyright (C) Benny Holmgren 1998 <bigfoot@astrakan.hgs.se> + * Copyright (C) Luke Kenneth Casson Leighton 1996-1998. + * + * 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. + */ + +#ifdef NISPLUS + +#include "includes.h" + +extern int DEBUGLEVEL; + +#include <rpcsvc/nis.h> + + +static int gotalarm; + +/*************************************************************** + Signal function to tell us we timed out. +****************************************************************/ + +static void gotalarm_sig(void) +{ + gotalarm = 1; +} + +/*************************************************************** + Start to enumerate the nisplus passwd list. Returns a void pointer + to ensure no modification outside this module. + + do not call this function directly. use passdb.c instead. + + ****************************************************************/ +void *startnisppwent(BOOL update) +{ +} + +/*************************************************************** + End enumeration of the nisplus passwd list. +****************************************************************/ +void endnisppwent(void *vp) +{ +} + +/************************************************************************* + Routine to return the next entry in the nisplus passwd list. + this function is a nice, messy combination of reading: + - the nisplus passwd file + - the unix password database + - nisp.conf options (not done at present). + + do not call this function directly. use passdb.c instead. + + *************************************************************************/ +struct sam_passwd *getnisp21pwent(void *vp) +{ +} + +/************************************************************************* + Routine to return the next entry in the nisplus passwd list. + + do not call this function directly. use passdb.c instead. + + *************************************************************************/ +struct smb_passwd *getnisppwent(void *vp) +{ + DEBUG(5,("getnisppwent: end of file reached.\n")); + return NULL; +} + +/************************************************************************* + Return the current position in the nisplus passwd list as an unsigned long. + This must be treated as an opaque token. + + do not call this function directly. use passdb.c instead. + +*************************************************************************/ +unsigned long getnisppwpos(void *vp) +{ + return 0; +} + +/************************************************************************* + Set the current position in the nisplus passwd list from unsigned long. + This must be treated as an opaque token. + + do not call this function directly. use passdb.c instead. + +*************************************************************************/ +BOOL setnisppwpos(void *vp, unsigned long tok) +{ + return False; +} + +/************************************************************************ + Routine to add an entry to the nisplus passwd file. + + do not call this function directly. use passdb.c instead. + +*************************************************************************/ +BOOL add_nisppwd_entry(struct smb_passwd *newpwd) +{ + return False; +} + +/************************************************************************ + Routine to search the nisplus passwd file for an entry matching the username. + and then modify its password entry. We can't use the startnisppwent()/ + getnisppwent()/endnisppwent() interfaces here as we depend on looking + in the actual file to decide how much room we have to write data. + override = False, normal + override = True, override XXXXXXXX'd out password or NO PASS + + do not call this function directly. use passdb.c instead. + +************************************************************************/ +BOOL mod_nisppwd_entry(struct smb_passwd* pwd, BOOL override) +{ + return False; +} + +/************************************************************************ + makes a struct smb_passwd from a NIS+ result. + ************************************************************************/ +BOOL make_smb_from_nisp(struct smb_passwd *pw_buf, nis_result *result) +{ + int uidval; + static pstring user_name; + static unsigned char smbpwd[16]; + static unsigned char smbntpwd[16]; + + if (pw_buf == NULL || result == NULL) return False; + + bzero(pw_buf, sizeof(*pw_buf)); + + if (result->status != NIS_SUCCESS) + { + DEBUG(0, ("make_smb_from_nisp: %s: NIS+ lookup failure: %s\n", + nisname, nis_sperrno(result->status))); + return False; + } + + /* User not found. */ + if (NIS_RES_NUMOBJ(result) <= 0) + { + DEBUG(10, ("make_smb_from_nisp: %s not found in NIS+\n", nisname)); + return False; + } + + if (NIS_RES_NUMOBJ(result) > 1) + { + DEBUG(10, ("make_smb_from_nisp: WARNING: Multiple entries for %s in NIS+ table!\n", nisname)); + } + + /* Grab the first hit. */ + obj = &NIS_RES_OBJECT(result)[0]; + + /* Check the lanman password column. */ + p = (uchar *)ENTRY_VAL(obj, 2); + if (strlen((char *)p) != 32 || !gethexpwd((char *)p, (char *)smbpwd)) + { + DEBUG(0, ("make_smb_from_nisp: malformed LM pwd entry.\n")); + return False; + } + + /* Check the NT password column. */ + p = (uchar *)ENTRY_VAL(obj, 3); + if (strlen((char *)p) != 32 || !gethexpwd((char *)p, (char *)smbntpwd)) + { + DEBUG(0, ("make_smb_from_nisp: malformed NT pwd entry\n")); + return False; + } + + strncpy(user_name, ENTRY_VAL(obj, 0), sizeof(user_name)); + uidval = atoi(ENTRY_VAL(obj, 1)); + + pw_buf->smb_name = user_name; + pw_buf->smb_userid = uidval; + pw_buf->smb_passwd = smbpwd; + pw_buf->smb_nt_passwd = smbntpwd; + + return True; +} + +/************************************************************************* + Routine to search the nisplus passwd file for an entry matching the username + *************************************************************************/ +struct smb_passwd *getnisppwnam(char *name) +{ + /* Static buffers we will return. */ + static struct smb_passwd pw_buf; + char linebuf[256]; + char readbuf[16 * 1024]; + unsigned char c; + unsigned char *p; + long uidval; + long linebuf_len; + FILE *fp; + int lockfd; + char *pfile = lp_smb_passwd_file(); + nis_result *result; + nis_object *obj; + char *nisname, *nisnamefmt; + BOOL ret; + + if (!*pfile) + { + DEBUG(0, ("No SMB password file set\n")); + return (NULL); + } + + DEBUG(10, ("getnisppwnam: search by name: %s\n", name)); + DEBUG(10, ("getnisppwnam: using NIS+ table %s\n", pfile)); + + nisnamefmt = "[name=%s],%s"; + nisname = (char *)malloc(strlen(nisnamefmt) + strlen(pfile) + strlen(name)); + + if (!nisname) + { + DEBUG(0,("getnisppwnam: Can't allocate nisname")); + return NULL; + } + + safe_sprintf(nisname, nisnamefmt, name, pfile); + + /* Search the table. */ + gotalarm = 0; + signal(SIGALRM, SIGNAL_CAST gotalarm_sig); + alarm(5); + + result = nis_list(nisname, FOLLOW_PATH | EXPAND_NAME | HARD_LOOKUP, NULL, NULL); + free(nisname); + + alarm(0); + signal(SIGALRM, SIGNAL_CAST SIG_DFL); + + if (gotalarm) + { + DEBUG(0,("getnisppwnam: NIS+ lookup time out\n")); + nis_freeresult(result); + return NULL; + } + + ret = make_smb_from_nisp(&pw_buf, result); + nis_freeresult(result); + + return ret ? &pw_buf : NULL; +} + +/************************************************************************* + Routine to search the nisplus passwd file for an entry matching the username + *************************************************************************/ +struct smb_passwd *getnisppwnam(int uid) +{ + /* Static buffers we will return. */ + static struct smb_passwd pw_buf; + char linebuf[256]; + char readbuf[16 * 1024]; + unsigned char c; + unsigned char *p; + long linebuf_len; + FILE *fp; + int lockfd; + char *pfile = lp_smb_passwd_file(); + nis_result *result; + nis_object *obj; + char *nisname, *nisnamefmt; + + if (!*pfile) + { + DEBUG(0, ("No SMB password file set\n")); + return NULL; + } + + DEBUG(10, ("getnisppwuid: search by uid: %d\n", uid)); + DEBUG(10, ("getnisppwuid: using NIS+ table %s\n", pfile)); + + nisnamefmt = "[uid=%d],%s"; + nisname = (char *)malloc(strlen(nisnamefmt) + strlen(pfile)+ sizeof(smb_userid)); + + if (!nisname) + { + DEBUG(0,("getnisppwuid: Can't allocate nisname")); + return NULL; + } + + safe_sprintf(nisname, nisnamefmt, smb_userid, pfile); + + /* Search the table. */ + gotalarm = 0; + signal(SIGALRM, SIGNAL_CAST gotalarm_sig); + alarm(5); + + result = nis_list(nisname, FOLLOW_PATH | EXPAND_NAME | HARD_LOOKUP, NULL, NULL); + free(nisname); + + alarm(0); + signal(SIGALRM, SIGNAL_CAST SIG_DFL); + + if (gotalarm) + { + DEBUG(0,("getnisppwuid: NIS+ lookup time out\n")); + nis_freeresult(result); + return NULL; + } + + ret = make_smb_from_nisp(&pw_buf, result); + nis_freeresult(result); + + return ret ? &pw_buf : NULL; +} + +#else +static void dummy_function(void) { } /* stop some compilers complaining */ +#endif /* NISPLUS */ |