Fix bug #7054 - X account flag does not work when pwdlastset is 0.
authorJeremy Allison <jra@samba.org>
Tue, 24 May 2011 00:14:47 +0000 (17:14 -0700)
committerJeremy Allison <jra@samba.org>
Tue, 24 May 2011 18:14:35 +0000 (20:14 +0200)
Don't allow pass_last_set_time to be set to zero (which means
"user must change password on next logon") if user object doesn't
allow password change.

Don't automatically allow user object password change if
"user must change password on next logon" is set.

Jim please check.

Jeremy.

source3/passdb/pdb_get_set.c
source3/rpc_server/samr/srv_samr_util.c

index 6c1a2ab23d7680b4c4b456090a6a527b94156e4c..782c08fc1c36caccbffb4e0cfa956744ff86435b 100644 (file)
@@ -123,8 +123,7 @@ time_t pdb_get_pass_must_change_time(const struct samu *sampass)
 
 bool pdb_get_pass_can_change(const struct samu *sampass)
 {
-       if (sampass->pass_can_change_time == get_time_t_max() &&
-           sampass->pass_last_set_time != 0)
+       if (sampass->pass_can_change_time == get_time_t_max())
                return False;
        return True;
 }
index 29123321f86f255b8711470cb6d9df8c7148a694..d052846b2e5b756488f207affae3ba678e2263dd 100644 (file)
@@ -612,7 +612,16 @@ void copy_id21_to_sam_passwd(const char *log_prefix,
                DEBUG(10,("%s SAMR_FIELD_EXPIRED_FLAG: %02X\n", l,
                        from->password_expired));
                if (from->password_expired != 0) {
-                       pdb_set_pass_last_set_time(to, 0, PDB_CHANGED);
+                       /* Only allow the set_time to zero (which means
+                          "User Must Change Password on Next Login"
+                          if the user object allows password change. */
+                       if (pdb_get_pass_can_change(to)) {
+                               pdb_set_pass_last_set_time(to, 0, PDB_CHANGED);
+                       } else {
+                               DEBUG(10,("%s Disallowing set of 'User Must "
+                                       "Change Password on Next Login' as "
+                                       "user object disallows this.\n", l));
+                       }
                } else {
                        /* A subtlety here: some windows commands will
                           clear the expired flag even though it's not