summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimo Sorce <idra@samba.org>2002-01-20 14:42:13 +0000
committerSimo Sorce <idra@samba.org>2002-01-20 14:42:13 +0000
commit2aa8f4395f40489407729cd03aaf43d2a7df38d2 (patch)
treed4b7c69562899dda9f560de388a00e05888556f3
parent989478c054491761473d4cf86c4ba5dd8ee99c18 (diff)
downloadsamba-2aa8f4395f40489407729cd03aaf43d2a7df38d2.tar.gz
samba-2aa8f4395f40489407729cd03aaf43d2a7df38d2.tar.xz
samba-2aa8f4395f40489407729cd03aaf43d2a7df38d2.zip
change to use the SAM_ACCOUNT flags and make user existence cheks in init_sam_from_buffer as pdb_ldap do.
-rw-r--r--source/passdb/pdb_tdb.c234
1 files changed, 122 insertions, 112 deletions
diff --git a/source/passdb/pdb_tdb.c b/source/passdb/pdb_tdb.c
index e1b982a009a..219b0ee7bd6 100644
--- a/source/passdb/pdb_tdb.c
+++ b/source/passdb/pdb_tdb.c
@@ -82,6 +82,10 @@ static BOOL init_sam_from_buffer (SAM_ACCOUNT *sampass, uint8 *buf, uint32 bufle
uint32 len = 0;
uint32 lmpwlen, ntpwlen, hourslen;
BOOL ret = True;
+ BOOL setflag;
+ struct passwd *pw;
+ uid_t uid;
+ gid_t gid;
if(sampass == NULL || buf == NULL) {
DEBUG(0, ("init_sam_from_buffer: NULL parameters found!\n"));
@@ -125,6 +129,22 @@ static BOOL init_sam_from_buffer (SAM_ACCOUNT *sampass, uint8 *buf, uint32 bufle
goto done;
}
+ /* validate the account and fill in UNIX uid and gid. Standard
+ * getpwnam() is used instead of Get_Pwnam() as we do not need
+ * to try case permutations
+ */
+ if (!username || !(pw=getpwnam(username))) {
+ DEBUG(0,("tdb_sam: getpwnam(%s) return NULL. User does not exist!\n",
+ username?username:"NULL"));
+ ret = False;
+ goto done;
+ }
+
+ uid = pw->pw_uid;
+ gid = pw->pw_gid;
+ pdb_set_uid(sampass, uid);
+ pdb_set_gid(sampass, gid);
+
pdb_set_logon_time(sampass, logon_time);
pdb_set_logoff_time(sampass, logoff_time);
pdb_set_kickoff_time(sampass, kickoff_time);
@@ -136,18 +156,55 @@ static BOOL init_sam_from_buffer (SAM_ACCOUNT *sampass, uint8 *buf, uint32 bufle
pdb_set_domain (sampass, domain_len?domain:NULL);
pdb_set_nt_username (sampass, nt_username_len?nt_username:NULL);
pdb_set_fullname (sampass, fullname_len?fullname:NULL);
- pdb_set_homedir (sampass, homedir_len?homedir:NULL, True);
- pdb_set_dir_drive (sampass, dir_drive_len?dir_drive:NULL, True);
- pdb_set_logon_script (sampass, logon_script_len?logon_script:NULL, True);
- pdb_set_profile_path (sampass, profile_path_len?profile_path:NULL, True);
- pdb_set_acct_desc (sampass, acct_desc_len?acct_desc:NULL);
- pdb_set_workstations (sampass, workstations_len?workstations:NULL);
- pdb_set_munged_dial (sampass, munged_dial_len?munged_dial:NULL);
- if (!pdb_set_lanman_passwd(sampass, lmpwlen?lm_pw_ptr:NULL)) {
+
+ if (homedir) setflag = True;
+ else {
+ setflag = False;
+ homedir = strdup(lp_logon_home());
+ if(!homedir) { ret = False; goto done; }
+ standard_sub_advanced(-1, username, "", gid, homedir);
+ DEBUG(5,("Home directory set back to %s\n", homedir));
+ }
+ pdb_set_homedir(sampass, homedir, setflag);
+
+ if (dir_drive) setflag = True;
+ else {
+ setflag = False;
+ dir_drive = strdup(lp_logon_drive());
+ if(!dir_drive) { ret = False; goto done; }
+ standard_sub_advanced(-1, username, "", gid, dir_drive);
+ DEBUG(5,("Home directory set back to %s\n", dir_drive));
+ }
+ pdb_set_dir_drive(sampass, dir_drive, setflag);
+
+ if (logon_script) setflag = True;
+ else {
+ setflag = False;
+ logon_script = strdup(lp_logon_script());
+ if(!logon_script) { ret = False; goto done; }
+ standard_sub_advanced(-1, username, "", gid, logon_script);
+ DEBUG(5,("Home directory set back to %s\n", logon_script));
+ }
+ pdb_set_logon_script(sampass, logon_script, setflag);
+
+ if (profile_path) setflag = True;
+ else {
+ setflag = False;
+ profile_path = strdup(lp_logon_path());
+ if(!profile_path) { ret = False; goto done; }
+ standard_sub_advanced(-1, username, "", gid, profile_path);
+ DEBUG(5,("Home directory set back to %s\n", profile_path));
+ }
+ pdb_set_profile_path(sampass, profile_path, setflag);
+
+ pdb_set_acct_desc (sampass, acct_desc);
+ pdb_set_workstations (sampass, workstations);
+ pdb_set_munged_dial (sampass, munged_dial);
+ if (!pdb_set_lanman_passwd(sampass, lm_pw_ptr)) {
ret = False;
goto done;
}
- if (!pdb_set_nt_passwd(sampass, ntpwlen?nt_pw_ptr:NULL)) {
+ if (!pdb_set_nt_passwd(sampass, nt_pw_ptr)) {
ret = False;
goto done;
}
@@ -220,8 +277,10 @@ static uint32 init_buffer_from_sam (uint8 **buf, SAM_ACCOUNT *sampass)
uint32 nt_pw_len = 16;
/* do we have a valid SAM_ACCOUNT pointer? */
- if (sampass == NULL)
+ if (sampass == NULL) {
+ DEBUG(0, ("init_buffer_from_sam: SAM_ACCOUNT is NULL!\n"));
return -1;
+ }
*buf = NULL;
buflen = 0;
@@ -235,71 +294,65 @@ static uint32 init_buffer_from_sam (uint8 **buf, SAM_ACCOUNT *sampass)
username = pdb_get_username(sampass);
- if (username)
- username_len = strlen(username) +1;
- else
- username_len = 0;
+ if (username) username_len = strlen(username) +1;
+ else username_len = 0;
+
domain = pdb_get_domain(sampass);
- if (domain)
- domain_len = strlen(domain) +1;
- else
- domain_len = 0;
+ if (domain) domain_len = strlen(domain) +1;
+ else domain_len = 0;
+
nt_username = pdb_get_nt_username(sampass);
- if (nt_username)
- nt_username_len = strlen(nt_username) +1;
- else
- nt_username_len = 0;
- dir_drive = pdb_get_dirdrive(sampass);
- if (dir_drive)
- dir_drive_len = strlen(dir_drive) +1;
- else
- dir_drive_len = 0;
- unknown_str = NULL;
- unknown_str_len = 0;
- munged_dial = pdb_get_munged_dial(sampass);
- if (munged_dial)
- munged_dial_len = strlen(munged_dial) +1;
- else
- munged_dial_len = 0;
-
+ if (nt_username) nt_username_len = strlen(nt_username) +1;
+ else nt_username_len = 0;
+
fullname = pdb_get_fullname(sampass);
- if (fullname)
- fullname_len = strlen(fullname) +1;
- else
- fullname_len = 0;
- homedir = pdb_get_homedir(sampass);
- if (homedir)
- homedir_len = strlen(homedir) +1;
- else
- homedir_len = 0;
- logon_script = pdb_get_logon_script(sampass);
- if (logon_script)
- logon_script_len = strlen(logon_script) +1;
- else
- logon_script_len = 0;
- profile_path = pdb_get_profile_path(sampass);
- if (profile_path)
- profile_path_len = strlen(profile_path) +1;
- else
- profile_path_len = 0;
- acct_desc = pdb_get_acct_desc(sampass);
- if (acct_desc)
- acct_desc_len = strlen(acct_desc) +1;
- else
- acct_desc_len = 0;
- workstations = pdb_get_workstations(sampass);
- if (workstations)
- workstations_len = strlen(workstations) +1;
- else
- workstations_len = 0;
+ if (fullname) fullname_len = strlen(fullname) +1;
+ else fullname_len = 0;
+
+ /*
+ * Only updates fields which have been set (not defaults from smb.conf)
+ */
+
+ if (IS_SAM_SET(sampass, FLAG_SAM_DRIVE)) dir_drive = pdb_get_dirdrive(sampass);
+ else dir_drive = NULL;
+ if (dir_drive) dir_drive_len = strlen(dir_drive) +1;
+ else dir_drive_len = 0;
+
+ if (IS_SAM_SET(sampass, FLAG_SAM_SMBHOME)) homedir = pdb_get_homedir(sampass);
+ else homedir = NULL;
+ if (homedir) homedir_len = strlen(homedir) +1;
+ else homedir_len = 0;
+
+ if (IS_SAM_SET(sampass, FLAG_SAM_LOGONSCRIPT)) logon_script = pdb_get_logon_script(sampass);
+ else logon_script = NULL;
+ if (logon_script) logon_script_len = strlen(logon_script) +1;
+ else logon_script_len = 0;
+
+ if (IS_SAM_SET(sampass, FLAG_SAM_PROFILE)) profile_path = pdb_get_profile_path(sampass);
+ else profile_path = NULL;
+ if (profile_path) profile_path_len = strlen(profile_path) +1;
+ else profile_path_len = 0;
lm_pw = pdb_get_lanman_passwd(sampass);
- if (!lm_pw)
- lm_pw_len = 0;
+ if (!lm_pw) lm_pw_len = 0;
nt_pw = pdb_get_nt_passwd(sampass);
- if (!nt_pw)
- nt_pw_len = 0;
+ if (!nt_pw) nt_pw_len = 0;
+
+ acct_desc = pdb_get_acct_desc(sampass);
+ if (acct_desc) acct_desc_len = strlen(acct_desc) +1;
+ else acct_desc_len = 0;
+
+ workstations = pdb_get_workstations(sampass);
+ if (workstations) workstations_len = strlen(workstations) +1;
+ else workstations_len = 0;
+
+ unknown_str = NULL;
+ unknown_str_len = 0;
+
+ munged_dial = pdb_get_munged_dial(sampass);
+ if (munged_dial) munged_dial_len = strlen(munged_dial) +1;
+ else munged_dial_len = 0;
/* one time to get the size needed */
len = tdb_pack(NULL, 0, TDB_FORMAT_STRING,
@@ -438,7 +491,7 @@ BOOL pdb_getsampwent(SAM_ACCOUNT *user)
return False;
}
- /* skip all non-USER entries (eg. RIDS) */
+ /* skip all non-USER entries (eg. RIDS) */
while ((global_tdb_ent.key.dsize != 0) && (strncmp(global_tdb_ent.key.dptr, prefix, prefixlen)))
/* increment to next in line */
global_tdb_ent.key = tdb_nextkey(global_tdb_ent.passwd_tdb, global_tdb_ent.key);
@@ -463,27 +516,6 @@ BOOL pdb_getsampwent(SAM_ACCOUNT *user)
}
SAFE_FREE(data.dptr);
- /* validate the account and fill in UNIX uid and gid. sys_getpwnam()
- is used instaed of Get_Pwnam() as we do not need to try case
- permutations */
- if ((pw=sys_getpwnam(pdb_get_username(user))) == NULL) {
- DEBUG(0,("pdb_getsampwent: getpwnam(%s) return NULL. User does not exist!\n",
- pdb_get_username(user)));
- return False;
- }
-
- uid = pw->pw_uid;
- gid = pw->pw_gid;
- pdb_set_uid(user, uid);
- pdb_set_gid(user, gid);
-
- /* 21 days from present */
- pdb_set_pass_must_change_time(user, time(NULL)+1814400);
-
- standard_sub_advanced(-1, pdb_get_username(user), "", gid, pdb_get_logon_script(user));
- standard_sub_advanced(-1, pdb_get_username(user), "", gid, pdb_get_profile_path(user));
- standard_sub_advanced(-1, pdb_get_username(user), "", gid, pdb_get_homedir(user));
-
/* increment to next in line */
global_tdb_ent.key = tdb_nextkey(global_tdb_ent.passwd_tdb, global_tdb_ent.key);
@@ -550,28 +582,6 @@ BOOL pdb_getsampwnam (SAM_ACCOUNT *user, char *sname)
/* no further use for database, close it now */
tdb_close(pwd_tdb);
- /* validate the account and fill in UNIX uid and gid. sys_getpwnam()
- is used instead of Get_Pwnam() as we do not need to try case
- permutations */
- if ((pw=sys_getpwnam(pdb_get_username(user)))) {
- uid = pw->pw_uid;
- gid = pw->pw_gid;
- pdb_set_uid (user, uid);
- pdb_set_gid (user, gid);
-
- /* 21 days from present */
- pdb_set_pass_must_change_time(user, time(NULL)+1814400);
-
- standard_sub_advanced(-1, pdb_get_username(user), "", gid, pdb_get_logon_script(user));
- standard_sub_advanced(-1, pdb_get_username(user), "", gid, pdb_get_profile_path(user));
- standard_sub_advanced(-1, pdb_get_username(user), "", gid, pdb_get_homedir(user));
- }
- else {
- DEBUG(0,("pdb_getsampwent: getpwnam(%s) return NULL. User does not exist!\n",
- pdb_get_username(user)));
- return False;
- }
-
return True;
}