summaryrefslogtreecommitdiff
path: root/source3/passdb
diff options
context:
space:
mode:
authorGerald Carter <jerry@samba.org>2000-12-12 16:50:23 +0000
committerGerald Carter <jerry@samba.org>2000-12-12 16:50:23 +0000
commitd21325dbd90659bf06b0570ab8a9330de808ee0a (patch)
tree3fcb52642c2fb9ea4fd2547dea623344dc43ba5f /source3/passdb
parent76dca9c1fb42ea461dbf95e7357385e8692bc94b (diff)
downloadsamba-d21325dbd90659bf06b0570ab8a9330de808ee0a.tar.gz
samba-d21325dbd90659bf06b0570ab8a9330de808ee0a.tar.bz2
samba-d21325dbd90659bf06b0570ab8a9330de808ee0a.zip
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 3b7d0fe7eb3a9275d2713d7b3325de0ab510ea62)
Diffstat (limited to 'source3/passdb')
-rw-r--r--source3/passdb/pdb_tdb.c193
1 files changed, 59 insertions, 134 deletions
diff --git a/source3/passdb/pdb_tdb.c b/source3/passdb/pdb_tdb.c
index 0591be68d8..1b0cce08fb 100644
--- a/source3/passdb/pdb_tdb.c
+++ b/source3/passdb/pdb_tdb.c
@@ -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;
-
- /* open the accounts TDB */
- if (!(pwd_tdb = tdb_open(tdbfile, 0, 0, O_RDONLY, 0600)))
- {
- DEBUG(0, ("pdb_getsampwuid: Unable to open TDB uid database!\n"));
- return False;
- }
+ struct passwd *pw;
+ fstring name;
- /* get the record */
- data = tdb_fetch (pwd_tdb, key);
- if (!data.dptr)
+ pw = sys_getpwuid(uid);
+ if (pw == NULL)
{
- 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 */