mirror of
https://github.com/samba-team/samba.git
synced 2024-12-27 03:21:53 +03:00
first non-compiling, unused, mostly stub version of NIS+ password database.
based on Benny Holmgren's samba patch (copyright acknowledged).
(This used to be commit 2a87cf0957
)
This commit is contained in:
parent
d36a24d2c8
commit
1f94f63653
330
source3/passdb/nispass.c
Normal file
330
source3/passdb/nispass.c
Normal file
@ -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 */
|
Loading…
Reference in New Issue
Block a user