1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00

more fixes from Simo. Also fixed the password expiration field

in the tdbsam to never expire (we don't support this yet).




jerry
(This used to be commit 3b7d0fe7eb)
This commit is contained in:
Gerald Carter 2000-12-12 16:50:23 +00:00
parent 76dca9c1fb
commit d21325dbd9

View File

@ -23,9 +23,10 @@
#ifdef WITH_TDBPWD
#define PASSDB_FILE_NAME "/passdb.tdb"
#define RIDDB_FILE_NAME "/riddb.tdb"
#define TDB_FORMAT_STRING "ddddddfffPPfPPPPffddBBwdwdBdd"
#define USERPREFIX "USER_"
#define UIDPREFIX "UID_"
#define RIDPREFIX "RID_"
extern int DEBUGLEVEL;
@ -283,14 +284,14 @@ static uint32 init_buffer_from_sam (BYTE **buf, SAM_ACCOUNT *sampass)
}
/***************************************************************
Open the TDB account SAM fo renumeration.
Open the TDB passwd database for SAM account enumeration.
****************************************************************/
BOOL pdb_setsampwent(BOOL update)
{
pstring tdbfile;
pstrcpy (tdbfile, lp_private_dir());
pstrcat (tdbfile, "/passdb.tdb");
pstrcat (tdbfile, PASSDB_FILE_NAME);
/* Open tdb passwd */
if (!(global_tdb_ent.passwd_tdb = tdb_open(tdbfile, 0, 0, update ? O_RDWR : O_RDONLY, 0600)))
@ -328,8 +329,10 @@ void pdb_endsampwent(void)
*****************************************************************/
SAM_ACCOUNT* pdb_getsampwent(void)
{
TDB_DATA data;
struct passwd *pw;
TDB_DATA data;
struct passwd *pw;
uid_t uid;
gid_t gid;
/* do we have an valid interation pointer? */
if(global_tdb_ent.passwd_tdb == NULL)
@ -362,9 +365,18 @@ SAM_ACCOUNT* pdb_getsampwent(void)
pdb_get_username(&global_sam_pass)));
return NULL;
}
pdb_set_uid (&global_sam_pass, pw->pw_uid);
pdb_set_gid (&global_sam_pass, pw->pw_gid);
uid = pw->pw_uid;
gid = pw->pw_gid;
pdb_set_uid (&global_sam_pass, uid);
pdb_set_gid (&global_sam_pass, gid);
/* 21 days from present */
pdb_set_pass_must_change_time(&global_sam_pass, time(NULL)+1814400);
standard_sub_advanced(-1, pdb_get_username(&global_sam_pass), "", gid, pdb_get_logon_script(&global_sam_pass));
standard_sub_advanced(-1, pdb_get_username(&global_sam_pass), "", gid, pdb_get_profile_path(&global_sam_pass));
standard_sub_advanced(-1, pdb_get_username(&global_sam_pass), "", gid, pdb_get_homedir(&global_sam_pass));
/* increment to next in line */
global_tdb_ent.key = tdb_nextkey (global_tdb_ent.passwd_tdb, global_tdb_ent.key);
@ -377,17 +389,19 @@ SAM_ACCOUNT* pdb_getsampwent(void)
******************************************************************/
SAM_ACCOUNT* pdb_getsampwnam (char *sname)
{
TDB_CONTEXT *pwd_tdb;
TDB_DATA data, key;
fstring keystr;
struct passwd *pw;
pstring tdbfile;
fstring name;
TDB_CONTEXT *pwd_tdb;
TDB_DATA data, key;
fstring keystr;
struct passwd *pw;
pstring tdbfile;
fstring name;
uid_t uid;
gid_t gid;
fstrcpy (name, sname);
strlower (name);
pstrcpy (tdbfile, lp_private_dir());
pstrcat (tdbfile, "/passdb.tdb");
pstrcat (tdbfile, PASSDB_FILE_NAME);
/* set search key */
slprintf(keystr, sizeof(keystr), "%s%s", USERPREFIX, name);
@ -429,9 +443,18 @@ SAM_ACCOUNT* pdb_getsampwnam (char *sname)
return NULL;
}
pdb_set_uid (&global_sam_pass, pw->pw_uid);
pdb_set_gid (&global_sam_pass, pw->pw_gid);
uid = pw->pw_uid;
gid = pw->pw_gid;
pdb_set_uid (&global_sam_pass, uid);
pdb_set_gid (&global_sam_pass, gid);
/* 21 days from present */
pdb_set_pass_must_change_time(&global_sam_pass, time(NULL)+1814400);
standard_sub_advanced(-1, pdb_get_username(&global_sam_pass), "", gid, pdb_get_logon_script(&global_sam_pass));
standard_sub_advanced(-1, pdb_get_username(&global_sam_pass), "", gid, pdb_get_profile_path(&global_sam_pass));
standard_sub_advanced(-1, pdb_get_username(&global_sam_pass), "", gid, pdb_get_homedir(&global_sam_pass));
/* cleanup */
tdb_close (pwd_tdb);
@ -440,52 +463,22 @@ SAM_ACCOUNT* pdb_getsampwnam (char *sname)
/***************************************************************************
Search by uid
I now know what the 'T' stands for in TDB :-( This is an unacceptable
solution. We need multiple indexes and transactional support. I'm
including this implementation only as an example.
**************************************************************************/
SAM_ACCOUNT* pdb_getsampwuid (uid_t uid)
{
SAM_ACCOUNT *pw = NULL;
TDB_CONTEXT *pwd_tdb;
TDB_DATA data, key;
fstring keystr;
pstring tdbfile;
fstring name;
pstrcpy (tdbfile, lp_private_dir());
pstrcat (tdbfile, "/uiddb.tdb");
/* set search key */
slprintf(keystr, sizeof(keystr), "%s%.5u", UIDPREFIX, uid);
key.dptr = keystr;
key.dsize = strlen (keystr) + 1;
struct passwd *pw;
fstring name;
/* open the accounts TDB */
if (!(pwd_tdb = tdb_open(tdbfile, 0, 0, O_RDONLY, 0600)))
pw = sys_getpwuid(uid);
if (pw == NULL)
{
DEBUG(0, ("pdb_getsampwuid: Unable to open TDB uid database!\n"));
return False;
}
/* get the record */
data = tdb_fetch (pwd_tdb, key);
if (!data.dptr)
{
DEBUG(5,("pdb_getsampwuid (TDB): error fetching database.\n"));
DEBUGADD(5, (" Error: %s\n", tdb_errorstr(pwd_tdb)));
tdb_close (pwd_tdb);
DEBUG(0,("pdb_getsampwuid: getpwuid(%d) return NULL. User does not exist!\n", uid));
return NULL;
}
fstrcpy (name, pw->pw_name);
fstrcpy (name, data.dptr);
return pdb_getsampwnam (name);
tdb_close (pwd_tdb);
pw = pdb_getsampwnam (name);
return pw;
}
/***************************************************************************
@ -493,7 +486,6 @@ SAM_ACCOUNT* pdb_getsampwuid (uid_t uid)
**************************************************************************/
SAM_ACCOUNT* pdb_getsampwrid (uint32 rid)
{
SAM_ACCOUNT *pw = NULL;
TDB_CONTEXT *pwd_tdb;
TDB_DATA data, key;
fstring keystr;
@ -501,7 +493,7 @@ SAM_ACCOUNT* pdb_getsampwrid (uint32 rid)
fstring name;
pstrcpy (tdbfile, lp_private_dir());
pstrcat (tdbfile, "/riddb.tdb");
pstrcat (tdbfile, RIDDB_FILE_NAME);
/* set search key */
slprintf(keystr, sizeof(keystr), "%s%.8x", RIDPREFIX, rid);
@ -529,10 +521,7 @@ SAM_ACCOUNT* pdb_getsampwrid (uint32 rid)
tdb_close (pwd_tdb);
pw = pdb_getsampwnam (name);
return pw;
return pdb_getsampwnam (name);
}
@ -554,7 +543,7 @@ BOOL pdb_delete_sam_account(char *sname)
strlower (name);
pstrcpy (tdbfile, lp_private_dir());
pstrcat (tdbfile, "/passdb.tdb");
pstrcat (tdbfile, PASSDB_FILE_NAME);
/* open the TDB */
if (!(pwd_tdb = tdb_open(tdbfile, 0, 0, O_RDWR, 0600)))
@ -572,7 +561,7 @@ BOOL pdb_delete_sam_account(char *sname)
data = tdb_fetch (pwd_tdb, key);
if (!data.dptr)
{
DEBUG(5,("pdb_getsampwnam (TDB): error fetching database.\n"));
DEBUG(5,("pdb_delete_sam_account (TDB): error fetching database.\n"));
DEBUGADD(5, (" Error: %s\n", tdb_errorstr(pwd_tdb)));
tdb_close (pwd_tdb);
return False;
@ -587,7 +576,6 @@ BOOL pdb_delete_sam_account(char *sname)
}
pwd = sys_getpwnam(global_sam_pass.username);
uid = pwd->pw_uid;
rid = pdb_uid_to_user_rid (uid);
/* it's outaa here! 8^) */
@ -601,33 +589,7 @@ BOOL pdb_delete_sam_account(char *sname)
tdb_close(pwd_tdb);
pstrcpy (tdbfile, lp_private_dir());
pstrcat (tdbfile, "/uiddb.tdb");
/* open the UID TDB */
if (!(pwd_tdb = tdb_open(tdbfile, 0, 0, O_RDWR, 0600)))
{
DEBUG(0, ("Unable to open TDB uid file!"));
return False;
}
/* set the search key */
slprintf(keystr, sizeof(keystr), "%s%.5u", UIDPREFIX, uid);
key.dptr = keystr;
key.dsize = strlen (keystr) + 1;
/* it's outaa here! 8^) */
if (tdb_delete(pwd_tdb, key) != TDB_SUCCESS)
{
DEBUG(5, ("Error deleting entry from tdb uid database!\n"));
DEBUGADD(5, (" Error: %s\n", tdb_errorstr(pwd_tdb)));
tdb_close(pwd_tdb);
return False;
}
tdb_close(pwd_tdb);
pstrcpy (tdbfile, lp_private_dir());
pstrcat (tdbfile, "/riddb.tdb");
pstrcat (tdbfile, RIDDB_FILE_NAME);
/* open the RID TDB */
if (!(pwd_tdb = tdb_open(tdbfile, 0, 0, O_RDWR, 0600)))
@ -637,7 +599,7 @@ BOOL pdb_delete_sam_account(char *sname)
}
/* set the search key */
slprintf(keystr, sizeof(keystr), "%s%.8x", UIDPREFIX, rid);
slprintf(keystr, sizeof(keystr), "%s%.8x", RIDPREFIX, rid);
key.dptr = keystr;
key.dsize = strlen (keystr) + 1;
@ -669,7 +631,7 @@ static BOOL tdb_update_sam(SAM_ACCOUNT* newpwd, BOOL override, int flag)
int newtdb = FALSE;
pstrcpy (tdbfile, lp_private_dir());
pstrcat (tdbfile, "/passdb.tdb");
pstrcat (tdbfile, PASSDB_FILE_NAME);
if ( (!newpwd->uid) || (!newpwd->gid) )
DEBUG (0,("tdb_update_sam: Storing a SAM_ACCOUNT for [%s] with uid %d and gid %d!\n",
@ -732,52 +694,15 @@ static BOOL tdb_update_sam(SAM_ACCOUNT* newpwd, BOOL override, int flag)
/* cleanup */
tdb_close (pwd_tdb);
/* setup UID/RID data */
/* setup RID data */
data.dsize = sizeof(fstring);
data.dptr = name;
pstrcpy (tdbfile, lp_private_dir());
pstrcat (tdbfile, "/uiddb.tdb");
/* setup the UID index key */
slprintf(keystr, sizeof(keystr), "%s%.5u", UIDPREFIX, pdb_get_uid(newpwd));
key.dptr = keystr;
key.dsize = strlen (keystr) + 1;
/* open the account TDB uid file*/
if (!(pwd_tdb = tdb_open(tdbfile, 0, 0, O_RDWR, 0600)))
{
DEBUG(0, ("tdb_update_sam: Unable to open TDB uid database!\n"));
if (newtdb == FALSE)
DEBUG(0, ("WARNING: uid database missing and passdb exist, check references integrity!\n"));
if (flag == TDB_INSERT)
{
DEBUG(0, ("Unable to open TDB uid file, trying create new!\n"));
if (!(pwd_tdb = tdb_open(tdbfile, 0, 0, O_RDWR | O_CREAT | O_EXCL, 0600)))
{
DEBUG(0, ("Unable to create TDB uid (uiddb.tdb) !!!\n"));
/* return False; */
}
}
}
/* add the reference */
if (tdb_store(pwd_tdb, key, data, flag) != TDB_SUCCESS)
{
DEBUG(0, ("Unable to modify TDB uid database!"));
DEBUGADD(0, (" Error: %s\n", tdb_errorstr(pwd_tdb)));
/* tdb_close (pwd_tdb);
return False; */
}
/* cleanup */
tdb_close (pwd_tdb);
pstrcpy (tdbfile, lp_private_dir());
pstrcat (tdbfile, "/riddb.tdb");
pstrcat (tdbfile, RIDDB_FILE_NAME);
/* setup the RID index key */
slprintf(keystr, sizeof(keystr), "%s%.8x", UIDPREFIX, pdb_get_user_rid(newpwd));
slprintf(keystr, sizeof(keystr), "%s%.8x", RIDPREFIX, pdb_get_user_rid(newpwd));
key.dptr = keystr;
key.dsize = strlen (keystr) + 1;
@ -803,8 +728,8 @@ static BOOL tdb_update_sam(SAM_ACCOUNT* newpwd, BOOL override, int flag)
{
DEBUG(0, ("Unable to modify TDB rid database!"));
DEBUGADD(0, (" Error: %s\n", tdb_errorstr(pwd_tdb)));
/* tdb_close (pwd_tdb);
return False; */
tdb_close (pwd_tdb);
return False;
}
/* cleanup */