summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/passdb/nispass.c330
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 */