Change the passdb interface to use allocated strings.
[ira/wip.git] / source3 / passdb / pdb_tdb.c
index 332118425b881fd2aef1534f6b70c77d587f5620..90976b3fefd602de36024fc13b2a6792ced9977d 100644 (file)
@@ -31,8 +31,6 @@
 #define RIDPREFIX              "RID_"
 
 extern int             DEBUGLEVEL;
-extern pstring                 samlogon_user;
-extern BOOL            sam_logon_in_ssb;
 
 struct tdb_enum_info {
        TDB_CONTEXT     *passwd_tdb;
@@ -82,6 +80,11 @@ static BOOL init_sam_from_buffer (SAM_ACCOUNT *sampass, uint8 *buf, uint32 bufle
        uint32          len = 0;
        uint32          lmpwlen, ntpwlen, hourslen;
        BOOL ret = True;
+       
+       if(sampass == NULL || buf == NULL) {
+               DEBUG(0, ("init_sam_from_buffer: NULL parameters found!\n"));
+               return False;
+       }
                                                                        
        /* unpack the buffer into variables */
        len = tdb_unpack (buf, buflen, TDB_FORMAT_STRING,
@@ -131,15 +134,21 @@ 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);
-       pdb_set_dir_drive    (sampass, dir_drive_len?dir_drive:NULL);
-       pdb_set_logon_script (sampass, logon_script_len?logon_script:NULL);
-       pdb_set_profile_path (sampass, profile_path_len?profile_path: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);
-       pdb_set_lanman_passwd(sampass, lmpwlen?lm_pw_ptr:NULL);
-       pdb_set_nt_passwd    (sampass, ntpwlen?nt_pw_ptr:NULL);
+       if (!pdb_set_lanman_passwd(sampass, lmpwlen?lm_pw_ptr:NULL)) {
+               ret = False;
+               goto done;
+       }
+       if (!pdb_set_nt_passwd(sampass, ntpwlen?nt_pw_ptr:NULL)) {
+               ret = False;
+               goto done;
+       }
 
        /*pdb_set_uid(sampass, uid);
        pdb_set_gid(sampass, gid);*/
@@ -150,7 +159,7 @@ static BOOL init_sam_from_buffer (SAM_ACCOUNT *sampass, uint8 *buf, uint32 bufle
        pdb_set_unknown_5(sampass, unknown_5);
        pdb_set_unknown_6(sampass, unknown_6);
        pdb_set_acct_ctrl(sampass, acct_ctrl);
-       pdb_set_logons_divs(sampass, logon_divs);
+       pdb_set_logon_divs(sampass, logon_divs);
        pdb_set_hours(sampass, hours);
 
 done:
@@ -209,9 +218,11 @@ static uint32 init_buffer_from_sam (uint8 **buf, const 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;
 
@@ -406,7 +417,7 @@ void pdb_endsampwent(void)
                global_tdb_ent.passwd_tdb = NULL;
        }
        
-       DEBUG(7, ("endtdbpwent: closed password file.\n"));
+       DEBUG(7, ("endtdbpwent: closed sam database.\n"));
 }
 
 /*****************************************************************
@@ -422,15 +433,18 @@ BOOL pdb_getsampwent(SAM_ACCOUNT *user)
        char *prefix = USERPREFIX;
        int  prefixlen = strlen (prefix);
 
+       const char *sam_user;
+       pstring sam_subst;
+
        if (user==NULL) {
                DEBUG(0,("pdb_get_sampwent: SAM_ACCOUNT is NULL.\n"));
                return False;
        }
 
-       /* skip all RID entries */
-       while ((global_tdb_ent.key.dsize != 0) && (strncmp (global_tdb_ent.key.dptr, prefix, prefixlen)))
+       /* 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);
+               global_tdb_ent.key = tdb_nextkey(global_tdb_ent.passwd_tdb, global_tdb_ent.key);
 
        /* do we have an valid interation pointer? */
        if(global_tdb_ent.passwd_tdb == NULL) {
@@ -438,14 +452,14 @@ BOOL pdb_getsampwent(SAM_ACCOUNT *user)
                return False;
        }
 
-       data = tdb_fetch (global_tdb_ent.passwd_tdb, global_tdb_ent.key);
+       data = tdb_fetch(global_tdb_ent.passwd_tdb, global_tdb_ent.key);
        if (!data.dptr) {
                DEBUG(5,("pdb_getsampwent: database entry not found.\n"));
                return False;
        }
   
        /* unpack the buffer */
-       if (!init_sam_from_buffer (user, data.dptr, data.dsize)) {
+       if (!init_sam_from_buffer(user, data.dptr, data.dsize)) {
                DEBUG(0,("pdb_getsampwent: Bad SAM_ACCOUNT entry returned from TDB!\n"));
                SAFE_FREE(data.dptr);
                return False;
@@ -463,11 +477,25 @@ BOOL pdb_getsampwent(SAM_ACCOUNT *user)
 
        uid = pw->pw_uid;
        gid = pw->pw_gid;
-       pdb_set_uid (user, &uid);
-       pdb_set_gid (user, &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);
+
+       sam_user = pdb_get_username(user);
+       pstrcpy(sam_subst, pdb_get_logon_script(user));
+       standard_sub_advanced(-1, sam_user, "", gid, sam_user, sam_subst);
+       pdb_set_logon_script(user, sam_subst, True);
+       pstrcpy(sam_subst, pdb_get_profile_path(user));
+       standard_sub_advanced(-1, pdb_get_username(user), "", gid, pdb_get_username(user), sam_subst);
+       pdb_set_profile_path(user, sam_subst, True);
+       pstrcpy(sam_subst, pdb_get_homedir(user));
+       standard_sub_advanced(-1, pdb_get_username(user), "", gid, pdb_get_username(user), sam_subst);
+       pdb_set_homedir(user, sam_subst, True);
 
        /* increment to next in line */
-       global_tdb_ent.key = tdb_nextkey (global_tdb_ent.passwd_tdb, global_tdb_ent.key);
+       global_tdb_ent.key = tdb_nextkey(global_tdb_ent.passwd_tdb, global_tdb_ent.key);
 
        return True;
 }
@@ -487,6 +515,8 @@ BOOL pdb_getsampwnam (SAM_ACCOUNT *user, const char *sname)
        uid_t           uid;
        gid_t           gid;
 
+       const char *sam_user;
+       pstring sam_subst;
 
        if (user==NULL) {
                DEBUG(0,("pdb_getsampwnam: SAM_ACCOUNT is NULL.\n"));
@@ -497,12 +527,12 @@ BOOL pdb_getsampwnam (SAM_ACCOUNT *user, const char *sname)
        unix_strlower(sname, -1, name, sizeof(name));
 
        get_private_directory(tdbfile);
-       pstrcat (tdbfile, PASSDB_FILE_NAME);
+       pstrcat(tdbfile, PASSDB_FILE_NAME);
        
        /* set search key */
        slprintf(keystr, sizeof(keystr)-1, "%s%s", USERPREFIX, name);
        key.dptr = keystr;
-       key.dsize = strlen (keystr) + 1;
+       key.dsize = strlen(keystr) + 1;
 
        /* open the accounts TDB */
        if (!(pwd_tdb = tdb_open_log(tdbfile, 0, TDB_DEFAULT, O_RDONLY, 0600))) {
@@ -511,61 +541,56 @@ BOOL pdb_getsampwnam (SAM_ACCOUNT *user, const char *sname)
        }
 
        /* get the record */
-       data = tdb_fetch (pwd_tdb, key);
+       data = tdb_fetch(pwd_tdb, key);
        if (!data.dptr) {
                DEBUG(5,("pdb_getsampwnam (TDB): error fetching database.\n"));
                DEBUGADD(5, (" Error: %s\n", tdb_errorstr(pwd_tdb)));
-               tdb_close (pwd_tdb);
+               tdb_close(pwd_tdb);
                return False;
        }
   
        /* unpack the buffer */
-       if (!init_sam_from_buffer (user, data.dptr, data.dsize)) {
+       if (!init_sam_from_buffer(user, data.dptr, data.dsize)) {
                DEBUG(0,("pdb_getsampwent: Bad SAM_ACCOUNT entry returned from TDB!\n"));
                SAFE_FREE(data.dptr);
+               tdb_close(pwd_tdb);
                return False;
        }
        SAFE_FREE(data.dptr);
+
+       /* 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 instaed of Get_Pwnam() as we do not need to try case
+          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);
+               pdb_set_uid(user, uid);
+               pdb_set_gid(user, gid);
+
+               /* 21 days from present */
+               pdb_set_pass_must_change_time(user, time(NULL)+1814400);
+
+               sam_user = pdb_get_username(user);
+               pstrcpy(sam_subst, pdb_get_logon_script(user));
+               standard_sub_advanced(-1, sam_user, "", gid, sam_user, sam_subst);
+               pdb_set_logon_script(user, sam_subst, True);
+               pstrcpy(sam_subst, pdb_get_profile_path(user));
+               standard_sub_advanced(-1, pdb_get_username(user), "", gid, pdb_get_username(user), sam_subst);
+               pdb_set_profile_path(user, sam_subst, True);
+               pstrcpy(sam_subst, pdb_get_homedir(user));
+               standard_sub_advanced(-1, pdb_get_username(user), "", gid, pdb_get_username(user), sam_subst);
+               pdb_set_homedir(user, sam_subst, True);
        }
-       
-       /* cleanup */
-       tdb_close (pwd_tdb);
-
-       return True;
-}
-
-/***************************************************************************
- Search by uid
- **************************************************************************/
-
-BOOL pdb_getsampwuid (SAM_ACCOUNT* user, uid_t uid)
-{
-       struct passwd   *pw;
-       fstring         name;
-
-       if (user==NULL) {
-               DEBUG(0,("pdb_getsampwuid: SAM_ACCOUNT is NULL.\n"));
-               return False;
-       }
-
-       pw = sys_getpwuid(uid);
-       if (pw == NULL) {
-               DEBUG(0,("pdb_getsampwuid: getpwuid(%d) return NULL. User does not exist!\n", uid));
+       else {
+               DEBUG(0,("pdb_getsampwent: getpwnam(%s) return NULL.  User does not exist!\n", 
+                         pdb_get_username(user)));
                return False;
        }
-       fstrcpy (name, pw->pw_name);
-
-       return pdb_getsampwnam (user, name);
 
+       return True;
 }
 
 /***************************************************************************
@@ -656,7 +681,7 @@ BOOL pdb_delete_sam_account(const char *sname)
        }
   
        /* unpack the buffer */
-       if (!pdb_init_sam (&sam_pass)) {
+       if (!NT_STATUS_IS_OK(pdb_init_sam (&sam_pass))) {
                tdb_close (pwd_tdb);
                return False;
        }