[PATCH] pdb_set_*

Stefan (metze) Metzmacher metze at metzemix.de
Mon Oct 7 08:01:01 GMT 2002


Hi Andrew,

here're the first steps of my pdb_set_* patch (THIS is NOT ready!!!)

every pdb_set function gets a uint8 flag (DEFAULT | SET | CHANGED)

then the backends can decide to only store changed values...


metze
-----------------------------------------------------------------------------
Stefan "metze" Metzmacher <metze at metzemix.de>
-------------- next part --------------
diff -Npur --exclude=CVS --exclude=*.bak --exclude=*.o --exclude=*.po --exclude=.#* HEAD/source/include/smb.h HEAD-pdb/source/include/smb.h
--- HEAD/source/include/smb.h	Mon Oct  7 06:58:17 2002
+++ HEAD-pdb/source/include/smb.h	Mon Oct  7 09:55:35 2002
@@ -569,25 +569,67 @@ typedef struct {
 /*
  * bit flags representing initialized fields in SAM_ACCOUNT
  */
-#define FLAG_SAM_UNINIT		0x00000000
-#define FLAG_SAM_UID		0x00000001
-#define FLAG_SAM_GID		0x00000002
-#define FLAG_SAM_SMBHOME	0x00000004
-#define FLAG_SAM_PROFILE	0x00000008
-#define FLAG_SAM_DRIVE          0x00000010
-#define FLAG_SAM_LOGONSCRIPT	0x00000020
-#define FLAG_SAM_LOGONTIME	0x00000040
-#define FLAG_SAM_LOGOFFTIME	0x00000080
-#define FLAG_SAM_KICKOFFTIME	0x00000100
-#define FLAG_SAM_CANCHANGETIME	0x00000200
-#define FLAG_SAM_MUSTCHANGETIME	0x00000400
-#define FLAG_SAM_PLAINTEXT_PW   0x00000800
+#define FLAG_SAM_UNINIT			0x00000000
+#define FLAG_SAM_USERNAME_CHANGED	0x00000001
+#define FLAG_SAM_FULLNAME_CHANGED	0x00000002
+#define FLAG_SAM_DOMAIN_DEFAULT		0x00000003
+#define FLAG_SAM_DOMAIN_CHANGED		0x00000004
+#define FLAG_SAM_NTUSERNAME_CHANGED	0x00000005
+#define FLAG_SAM_ACCTDESC_CHANGED	0x00000006
+#define FLAG_SAM_UID_SET		0x00000007
+#define FLAG_SAM_UID_CHANGED		0x00000008
+#define FLAG_SAM_GID_SET		0x00000009
+#define FLAG_SAM_GID_CHANGED		0x0000000A
+#define FLAG_SAM_USERSID_SET		0x0000000B
+#define FLAG_SAM_USERSID_CHANGED	0x0000000C
+#define FLAG_SAM_GROUPSID_SET		0x0000000D
+#define FLAG_SAM_GROUPSID_CHANGED	0x0000000E
+#define FLAG_SAM_ACCTCTRL_CHANGED	0x0000000F
+#define FLAG_SAM_SMBHOME_DEFAULT	0x00000010
+#define FLAG_SAM_SMBHOME_CHANGED	0x00000011
+#define FLAG_SAM_PROFILE_DEFAULT	0x00000012
+#define FLAG_SAM_PROFILE_CHANGED	0x00000013
+#define FLAG_SAM_DRIVE_DEFAULT		0x00000014
+#define FLAG_SAM_DRIVE_CHANGED		0x00000015
+#define FLAG_SAM_LOGONSCRIPT_DEFAULT	0x00000016
+#define FLAG_SAM_LOGONSCRIPT_CHANGED	0x00000017
+#define FLAG_SAM_HOURS_CHANGED		0x00000018
+#define FLAG_SAM_HOURS_DEFAULT		0x00000019
+#define FLAG_SAM_HOURSLEN_CHANGED	0x0000001A
+#define FLAG_SAM_HOURSLEN_DEFAULT	0x0000001B
+#define FLAG_SAM_LOGONDIVS_CHANGED	0x0000001C
+#define FLAG_SAM_UNIXHOMEDIR_CHANGED	0x0000001D
+#define FLAG_SAM_WORKSTATIONS_CHANGED	0x0000001E
+#define FLAG_SAM_MUNGEDDIAL_CHANGED	0x0000001F
+#define FLAG_SAM_PLAINTEXT_PW_CHANGED	0x00000020
+#define FLAG_SAM_LMPASSWD_CHANGED	0x00000021
+#define FLAG_SAM_NTPASSWD_CHANGED	0x00000022
+#define FLAG_SAM_PASSLASTSET_CHANGED	0x00000023
+#define FLAG_SAM_CANCHANGETIME_DEFAULT	0x00000024
+#define FLAG_SAM_CANCHANGETIME_CHANGED	0x00000025
+#define FLAG_SAM_MUSTCHANGETIME_DEFAULT	0x00000026
+#define FLAG_SAM_MUSTCHANGETIME_CHANGED	0x00000027
+#define FLAG_SAM_LOGONTIME_DEFAULT	0x00000028
+#define FLAG_SAM_LOGONTIME_CHANGED	0x00000029
+#define FLAG_SAM_LOGOFFTIME_DEFAULT	0x0000002A
+#define FLAG_SAM_LOGOFFTIME_CHANGED	0x0000002B
+#define FLAG_SAM_KICKOFFTIME_DEFAULT	0x0000002C
+#define FLAG_SAM_KICKOFFTIME_CHANGED	0x0000002D
+#define FLAG_SAM_UNKNOWNSTR_CHANGED	0x0000002E
+#define FLAG_SAM_UNKNOWN3_CHANGED	0x0000002F
+#define FLAG_SAM_UNKNOWN5_CHANGED	0x00000030
+#define FLAG_SAM_UNKNOWN6_CHANGED	0x00000031
+
+/* if you add a flag increment FLAG_SAM_COUNT */
+#define FLAG_SAM_COUNT			0x00000031
+
+enum(DEFAULT,SET,CHANGED);
 
 #define IS_SAM_UNIX_USER(x) \
-	((pdb_get_init_flag(x) & FLAG_SAM_UID) \
-	 && (pdb_get_init_flag(x) & FLAG_SAM_GID))
+	((pdb_get_init_flag(x,FLAG_SAM_UID_SET) \
+	 && (pdb_get_init_flag(x,FLAG_SAM_GID_SET)))
 
-#define IS_SAM_SET(x, flag)	((x)->private.init_flag & (flag))
+#define IS_SAM_SET(x, flag)	pdb_get_init_flag(x, flag)
 		
 typedef struct sam_passwd
 {
@@ -599,7 +641,7 @@ typedef struct sam_passwd
 
 	struct user_data {
 		/* initiailization flags */
-		uint32 init_flag;
+		struct bitmap *init_flag;
 		
 		time_t logon_time;            /* logon time */
 		time_t logoff_time;           /* logoff time */
diff -Npur --exclude=CVS --exclude=*.bak --exclude=*.o --exclude=*.po --exclude=.#* HEAD/source/include/stamp-h HEAD-pdb/source/include/stamp-h
--- HEAD/source/include/stamp-h	Thu Jan  1 01:00:00 1970
+++ HEAD-pdb/source/include/stamp-h	Thu Sep 19 08:33:52 2002
@@ -0,0 +1 @@
+Sun Jul 18 20:32:29 UTC 1999
diff -Npur --exclude=CVS --exclude=*.bak --exclude=*.o --exclude=*.po --exclude=.#* HEAD/source/passdb/pdb_get_set.c HEAD-pdb/source/passdb/pdb_get_set.c
--- HEAD/source/passdb/pdb_get_set.c	Fri Sep 27 07:40:04 2002
+++ HEAD-pdb/source/passdb/pdb_get_set.c	Mon Oct  7 09:22:01 2002
@@ -178,12 +178,12 @@ const DOM_SID *pdb_get_group_sid(const S
  * @return the flags indicating the members initialised in the struct.
  **/
  
-uint32 pdb_get_init_flag (const SAM_ACCOUNT *sampass)
+BOOL pdb_get_init_flag (const SAM_ACCOUNT *sampass, uint32 flag)
 {
-        if (sampass)
-		return sampass->private.init_flag;
-	else 
-                return FLAG_SAM_UNINIT;
+        if (!sampass || !sampass->private.init_flags)
+        	return False;
+        	
+        return bitmap_query(sampass->private.init_flags, flag);
 }
 
 uid_t pdb_get_uid (const SAM_ACCOUNT *sampass)
@@ -334,109 +334,279 @@ uint32 pdb_get_unknown6 (const SAM_ACCOU
  Collection of set...() functions for SAM_ACCOUNT_INFO.
  ********************************************************************/
 
-BOOL pdb_set_acct_ctrl (SAM_ACCOUNT *sampass, uint16 flags)
+BOOL pdb_set_acct_ctrl (SAM_ACCOUNT *sampass, uint16 acct_ctrl, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_ACCTCTRL_CHANGED;
+
 	if (!sampass)
 		return False;
 		
-	if (sampass) {
-		sampass->private.acct_ctrl = flags;
-		return True;
+	sampass->private.acct_ctrl = acct_ctrl;
+
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			break;
+		case DEFAULT:
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			break;
 	}
-	
+
 	return False;
 }
 
-BOOL pdb_set_logon_time (SAM_ACCOUNT *sampass, time_t mytime, BOOL store)
+BOOL pdb_set_logon_time (SAM_ACCOUNT *sampass, time_t mytime, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_LOGONTIME_CHANGED;
+	uint32 sam_flag_default = FLAG_SAM_LOGONTIME_DEFAULT;
+	
 	if (!sampass)
 		return False;
 
 	sampass->private.logon_time = mytime;
 
-	if (store)
-		pdb_set_init_flag(sampass, FLAG_SAM_LOGONTIME); 
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case DEFAULT:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+	} 
 
 	return True;
 }
 
-BOOL pdb_set_logoff_time (SAM_ACCOUNT *sampass, time_t mytime, BOOL store)
+BOOL pdb_set_logoff_time (SAM_ACCOUNT *sampass, time_t mytime, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_LOGOFFTIME_CHANGED;
+	uint32 sam_flag_default = FLAG_SAM_LOGOFFTIME_DEFAULT;
+	
 	if (!sampass)
 		return False;
 
 	sampass->private.logoff_time = mytime;
 
-	if (store)
-		pdb_set_init_flag(sampass, FLAG_SAM_LOGOFFTIME); 
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case DEFAULT:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+	}
 
 	return True;
 }
 
-BOOL pdb_set_kickoff_time (SAM_ACCOUNT *sampass, time_t mytime, BOOL store)
+BOOL pdb_set_kickoff_time (SAM_ACCOUNT *sampass, time_t mytime, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_KICKOFFTIME_CHANGED;
+	uint32 sam_flag_default = FLAG_SAM_KICKOFFTIME_DEFAULT;
+	
 	if (!sampass)
 		return False;
 
 	sampass->private.kickoff_time = mytime;
 
-	if (store)
-		pdb_set_init_flag(sampass, FLAG_SAM_KICKOFFTIME); 
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case DEFAULT:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+	} 
 
 	return True;
 }
 
-BOOL pdb_set_pass_can_change_time (SAM_ACCOUNT *sampass, time_t mytime, BOOL store)
+BOOL pdb_set_pass_can_change_time (SAM_ACCOUNT *sampass, time_t mytime, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_CANCHANGETIME_CHANGED;
+	uint32 sam_flag_default = FLAG_SAM_CANCHANGETIME_DEFAULT;
+	
 	if (!sampass)
 		return False;
 
 	sampass->private.pass_can_change_time = mytime;
 
-	if (store)
-		pdb_set_init_flag(sampass, FLAG_SAM_CANCHANGETIME); 
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case DEFAULT:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+	} 
 
 	return True;
 }
 
-BOOL pdb_set_pass_must_change_time (SAM_ACCOUNT *sampass, time_t mytime, BOOL store)
+BOOL pdb_set_pass_must_change_time (SAM_ACCOUNT *sampass, time_t mytime, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_MUSTCHANGETIME_CHANGED;
+	uint32 sam_flag_default = FLAG_SAM_MUSTCHANGETIME_DEFAULT;
+	
 	if (!sampass)
 		return False;
 
 	sampass->private.pass_must_change_time = mytime;
 
-	if (store)
-		pdb_set_init_flag(sampass, FLAG_SAM_MUSTCHANGETIME); 
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case DEFAULT:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+	}
 
 	return True;
 }
 
-BOOL pdb_set_pass_last_set_time (SAM_ACCOUNT *sampass, time_t mytime)
+BOOL pdb_set_pass_last_set_time (SAM_ACCOUNT *sampass, time_t mytime, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_PASSLASTSET_CHANGED;
+
 	if (!sampass)
 		return False;
 
 	sampass->private.pass_last_set_time = mytime;
 
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			break;
+		case DEFAULT:
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			break;
+	}
+
 	return True;
 }
 
-BOOL pdb_set_hours_len (SAM_ACCOUNT *sampass, uint32 len)
+BOOL pdb_set_hours_len (SAM_ACCOUNT *sampass, uint32 len, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_HOURSLEN_CHANGED;
+	uint32 sam_flag_default = FLAG_SAM_HOURSLEN_DEFAULT;
+	
 	if (!sampass)
 		return False;
 
 	sampass->private.hours_len = len;
+
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case DEFAULT:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+	}
+
 	return True;
 }
 
-BOOL pdb_set_logon_divs (SAM_ACCOUNT *sampass, uint16 hours)
+BOOL pdb_set_logon_divs (SAM_ACCOUNT *sampass, uint16 hours, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_LOGONDIVS_CHANGED;
+
 	if (!sampass)
 		return False;
 
 	sampass->private.logon_divs = hours;
+
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			break;
+		case DEFAULT:
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			break;
+	}
+
 	return True;
 }
 
@@ -449,16 +619,53 @@ BOOL pdb_set_logon_divs (SAM_ACCOUNT *sa
  
 BOOL pdb_set_init_flag (SAM_ACCOUNT *sampass, uint32 flag)
 {
-        if (!sampass)
+        if (!sampass || !sampass->mem_ctx)
+                return False;
+
+        if (!sampass->private.init_flags) {
+        	if ((sampass->private.init_flags = 
+        		bitmap_talloc(sampass->mem_ctx, 
+        				FLAG_SAM_COUNT))==NULL) {
+        		DEBUG(0,("bitmap_talloc failed\n"));
+        		return False;
+        	}
+        }
+
+	if (!bitmap_set(sampass->private.init_flags, flag)) {
+		DEBUG(0,("Can't set flag: %08X\n",flag));
+		return False;
+	}
+
+        return True;
+}
+
+BOOL pdb_unset_init_flag (SAM_ACCOUNT *sampass, uint32 flag)
+{
+        if (!sampass || !sampass->mem_ctx)
                 return False;
 
-        sampass->private.init_flag |= flag;
+        if (!sampass->private.init_flags) {
+        	if ((sampass->private.init_flags = 
+        		bitmap_talloc(sampass->mem_ctx, 
+        				FLAG_SAM_COUNT))==NULL) {
+        		DEBUG(0,("bitmap_talloc failed\n"));
+        		return False;
+        	}
+        }
+
+	if (!bitmap_clear(sampass->private.init_flags, flag)) {
+		DEBUG(0,("Can't set flag: %08X\n",flag));
+		return False;
+	}
 
         return True;
 }
 
-BOOL pdb_set_uid (SAM_ACCOUNT *sampass, const uid_t uid)
+BOOL pdb_set_uid (SAM_ACCOUNT *sampass, const uid_t uid, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_UID_CHANGED;
+	uint32 sam_flag_set = FLAG_SAM_UID_SET;
+	
 	if (!sampass)
 		return False;
 	
@@ -466,14 +673,37 @@ BOOL pdb_set_uid (SAM_ACCOUNT *sampass, 
 		   (int)uid, (int)sampass->private.uid));
  
 	sampass->private.uid = uid;
-	pdb_set_init_flag(sampass, FLAG_SAM_UID); 
+	
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_set)
+				return False;
+			break;
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_set)
+				return False;
+			break;
+		case DEFAULT:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_set)
+				return False;
+			break;
+	}
 
 	return True;
 
 }
 
-BOOL pdb_set_gid (SAM_ACCOUNT *sampass, const gid_t gid)
+BOOL pdb_set_gid (SAM_ACCOUNT *sampass, const gid_t gid, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_GID_CHANGED;
+	uint32 sam_flag_set = FLAG_SAM_GID_SET;
+	
 	if (!sampass)
 		return False;
 		
@@ -481,14 +711,37 @@ BOOL pdb_set_gid (SAM_ACCOUNT *sampass, 
 		   (int)gid, (int)sampass->private.gid));
  
 	sampass->private.gid = gid; 
-	pdb_set_init_flag(sampass, FLAG_SAM_GID); 
+
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_set)
+				return False;
+			break;
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_set)
+				return False;
+			break;
+		case DEFAULT:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_set)
+				return False;
+			break;
+	}   
 
 	return True;
 
 }
 
-BOOL pdb_set_user_sid (SAM_ACCOUNT *sampass, DOM_SID *u_sid)
+BOOL pdb_set_user_sid (SAM_ACCOUNT *sampass, DOM_SID *u_sid, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_USERSID_CHANGED;
+	uint32 sam_flag_set = FLAG_SAM_USERSID_SET;
+	
 	if (!sampass || !u_sid)
 		return False;
 	
@@ -496,13 +749,35 @@ BOOL pdb_set_user_sid (SAM_ACCOUNT *samp
 
 	DEBUG(10, ("pdb_set_user_sid: setting user sid %s\n", 
 		    sid_string_static(&sampass->private.user_sid)));
-	
+
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_set)
+				return False;
+			break;
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_set)
+				return False;
+			break;
+		case DEFAULT:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_set)
+				return False;
+			break;
+	}
+
 	return True;
 }
 
-BOOL pdb_set_user_sid_from_string (SAM_ACCOUNT *sampass, fstring u_sid)
+BOOL pdb_set_user_sid_from_string (SAM_ACCOUNT *sampass, fstring u_sid, uint8 flag)
 {
 	DOM_SID new_sid;
+	
 	if (!sampass || !u_sid)
 		return False;
 
@@ -514,7 +789,7 @@ BOOL pdb_set_user_sid_from_string (SAM_A
 		return False;
 	}
 	 
-	if (!pdb_set_user_sid(sampass, &new_sid)) {
+	if (!pdb_set_user_sid(sampass, &new_sid, flag)) {
 		DEBUG(1, ("pdb_set_user_sid_from_string: could not set sid %s on SAM_ACCOUNT!\n", u_sid));
 		return False;
 	}
@@ -522,8 +797,11 @@ BOOL pdb_set_user_sid_from_string (SAM_A
 	return True;
 }
 
-BOOL pdb_set_group_sid (SAM_ACCOUNT *sampass, DOM_SID *g_sid)
+BOOL pdb_set_group_sid (SAM_ACCOUNT *sampass, DOM_SID *g_sid, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_GROUPSID_CHANGED;
+	uint32 sam_flag_set = FLAG_SAM_GROUPSID_SET;
+	
 	if (!sampass || !g_sid)
 		return False;
 
@@ -532,10 +810,31 @@ BOOL pdb_set_group_sid (SAM_ACCOUNT *sam
 	DEBUG(10, ("pdb_set_group_sid: setting group sid %s\n", 
 		    sid_string_static(&sampass->private.group_sid)));
 
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_set)
+				return False;
+			break;
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_set)
+				return False;
+			break;
+		case DEFAULT:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_set)
+				return False;
+			break;
+	} 
+
 	return True;
 }
 
-BOOL pdb_set_group_sid_from_string (SAM_ACCOUNT *sampass, fstring g_sid)
+BOOL pdb_set_group_sid_from_string (SAM_ACCOUNT *sampass, fstring g_sid, uint8 flag)
 {
 	DOM_SID new_sid;
 	if (!sampass || !g_sid)
@@ -549,7 +848,7 @@ BOOL pdb_set_group_sid_from_string (SAM_
 		return False;
 	}
 	 
-	if (!pdb_set_group_sid(sampass, &new_sid)) {
+	if (!pdb_set_group_sid(sampass, &new_sid, flag)) {
 		DEBUG(1, ("pdb_set_group_sid_from_string: could not set sid %s on SAM_ACCOUNT!\n", g_sid));
 		return False;
 	}
@@ -560,8 +859,9 @@ BOOL pdb_set_group_sid_from_string (SAM_
  Set the user's UNIX name.
  ********************************************************************/
 
-BOOL pdb_set_username(SAM_ACCOUNT *sampass, const char *username)
-{	
+BOOL pdb_set_username(SAM_ACCOUNT *sampass, const char *username, uint8 flag)
+{
+	uint32 sam_flag_changed = FLAG_SAM_USERNAME_CHANGED;
 	if (!sampass)
 		return False;
  
@@ -579,6 +879,18 @@ BOOL pdb_set_username(SAM_ACCOUNT *sampa
 	} else {
 		sampass->private.username = PDB_NOT_QUITE_NULL;
 	}
+	
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			break;
+		case DEFAULT:
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			break;
+	}
 
 	return True;
 }
@@ -587,8 +899,11 @@ BOOL pdb_set_username(SAM_ACCOUNT *sampa
  Set the domain name.
  ********************************************************************/
 
-BOOL pdb_set_domain(SAM_ACCOUNT *sampass, const char *domain)
-{	
+BOOL pdb_set_domain(SAM_ACCOUNT *sampass, const char *domain, uint8 flag)
+{
+	uint32 sam_flag_changed = FLAG_SAM_DOMAIN_CHANGED;
+	uint32 sam_flag_default = FLAG_SAM_DOMAIN_DEFAULT;
+		
 	if (!sampass)
 		return False;
 
@@ -607,6 +922,27 @@ BOOL pdb_set_domain(SAM_ACCOUNT *sampass
 		sampass->private.domain = PDB_NOT_QUITE_NULL;
 	}
 
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case DEFAULT:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+	} 
+	
 	return True;
 }
 
@@ -616,6 +952,8 @@ BOOL pdb_set_domain(SAM_ACCOUNT *sampass
 
 BOOL pdb_set_nt_username(SAM_ACCOUNT *sampass, const char *nt_username)
 {
+	uint32 sam_flag_changed = FLAG_SAM_NTUSERNAME_CHANGED;
+
 	if (!sampass)
 		return False;
 
@@ -634,6 +972,18 @@ BOOL pdb_set_nt_username(SAM_ACCOUNT *sa
 		sampass->private.nt_username = PDB_NOT_QUITE_NULL;
 	}
 
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			break;
+		case DEFAULT:
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			break;
+	}
+
 	return True;
 }
 
@@ -643,6 +993,8 @@ BOOL pdb_set_nt_username(SAM_ACCOUNT *sa
 
 BOOL pdb_set_fullname(SAM_ACCOUNT *sampass, const char *full_name)
 {
+	uint32 sam_flag_changed = FLAG_SAM_FULLNAME_CHANGED;
+
 	if (!sampass)
 		return False;
 
@@ -661,6 +1013,18 @@ BOOL pdb_set_fullname(SAM_ACCOUNT *sampa
 		sampass->private.full_name = PDB_NOT_QUITE_NULL;
 	}
 
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			break;
+		case DEFAULT:
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			break;
+	}
+
 	return True;
 }
 
@@ -668,8 +1032,11 @@ BOOL pdb_set_fullname(SAM_ACCOUNT *sampa
  Set the user's logon script.
  ********************************************************************/
 
-BOOL pdb_set_logon_script(SAM_ACCOUNT *sampass, const char *logon_script, BOOL store)
+BOOL pdb_set_logon_script(SAM_ACCOUNT *sampass, const char *logon_script, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_LOGONSCRIPT_CHANGED;
+	uint32 sam_flag_default = FLAG_SAM_LOGONSCRIPT_DEFAULT;
+	
 	if (!sampass)
 		return False;
 
@@ -688,9 +1055,25 @@ BOOL pdb_set_logon_script(SAM_ACCOUNT *s
 		sampass->private.logon_script = PDB_NOT_QUITE_NULL;
 	}
 	
-	if (store) {
-		DEBUG(10, ("pdb_set_logon_script: setting logon script sam flag!\n"));
-		pdb_set_init_flag(sampass, FLAG_SAM_LOGONSCRIPT);
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case DEFAULT:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
 	}
 
 	return True;
@@ -700,8 +1083,11 @@ BOOL pdb_set_logon_script(SAM_ACCOUNT *s
  Set the user's profile path.
  ********************************************************************/
 
-BOOL pdb_set_profile_path (SAM_ACCOUNT *sampass, const char *profile_path, BOOL store)
+BOOL pdb_set_profile_path (SAM_ACCOUNT *sampass, const char *profile_path, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_PROFILEPATH_CHANGED;
+	uint32 sam_flag_default = FLAG_SAM_PROFILEPATH_DEFAULT;
+	
 	if (!sampass)
 		return False;
 
@@ -720,9 +1106,25 @@ BOOL pdb_set_profile_path (SAM_ACCOUNT *
 		sampass->private.profile_path = PDB_NOT_QUITE_NULL;
 	}
 
-	if (store) {
-		DEBUG(10, ("pdb_set_profile_path: setting profile path sam flag!\n"));
-		pdb_set_init_flag(sampass, FLAG_SAM_PROFILE);
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case DEFAULT:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
 	}
 
 	return True;
@@ -732,8 +1134,11 @@ BOOL pdb_set_profile_path (SAM_ACCOUNT *
  Set the user's directory drive.
  ********************************************************************/
 
-BOOL pdb_set_dir_drive (SAM_ACCOUNT *sampass, const char *dir_drive, BOOL store)
+BOOL pdb_set_dir_drive (SAM_ACCOUNT *sampass, const char *dir_drive, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_DIRDRIVE_CHANGED;
+	uint32 sam_flag_default = FLAG_SAM_DIRDRIVE_DEFAULT;
+	
 	if (!sampass)
 		return False;
 
@@ -752,9 +1157,25 @@ BOOL pdb_set_dir_drive (SAM_ACCOUNT *sam
 		sampass->private.dir_drive = PDB_NOT_QUITE_NULL;
 	}
 	
-	if (store) {
-		DEBUG(10, ("pdb_set_dir_drive: setting dir drive sam flag!\n"));
-		pdb_set_init_flag(sampass, FLAG_SAM_DRIVE);
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case DEFAULT:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
 	}
 
 	return True;
@@ -764,8 +1185,11 @@ BOOL pdb_set_dir_drive (SAM_ACCOUNT *sam
  Set the user's home directory.
  ********************************************************************/
 
-BOOL pdb_set_homedir (SAM_ACCOUNT *sampass, const char *home_dir, BOOL store)
+BOOL pdb_set_homedir (SAM_ACCOUNT *sampass, const char *home_dir, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_HOMEDIR_CHANGED;
+	uint32 sam_flag_default = FLAG_SAM_HOMEDIR_DEFAULT;
+	
 	if (!sampass)
 		return False;
 
@@ -784,9 +1208,25 @@ BOOL pdb_set_homedir (SAM_ACCOUNT *sampa
 		sampass->private.home_dir = PDB_NOT_QUITE_NULL;
 	}
 
-	if (store) {
-		DEBUG(10, ("pdb_set_homedir: setting home dir sam flag!\n"));
-		pdb_set_init_flag(sampass, FLAG_SAM_SMBHOME);
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case DEFAULT:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
 	}
 
 	return True;
@@ -796,8 +1236,10 @@ BOOL pdb_set_homedir (SAM_ACCOUNT *sampa
  Set the user's unix home directory.
  ********************************************************************/
 
-BOOL pdb_set_unix_homedir (SAM_ACCOUNT *sampass, const char *unix_home_dir)
+BOOL pdb_set_unix_homedir (SAM_ACCOUNT *sampass, const char *unix_home_dir, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_UNIXHOMEDIR_CHANGED;
+	
 	if (!sampass)
 		return False;
 
@@ -824,8 +1266,10 @@ BOOL pdb_set_unix_homedir (SAM_ACCOUNT *
  Set the user's account description.
  ********************************************************************/
 
-BOOL pdb_set_acct_desc (SAM_ACCOUNT *sampass, const char *acct_desc)
+BOOL pdb_set_acct_desc (SAM_ACCOUNT *sampass, const char *acct_desc, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_ACCTDESC_CHANGED;
+
 	if (!sampass)
 		return False;
 
@@ -848,8 +1292,10 @@ BOOL pdb_set_acct_desc (SAM_ACCOUNT *sam
  Set the user's workstation allowed list.
  ********************************************************************/
 
-BOOL pdb_set_workstations (SAM_ACCOUNT *sampass, const char *workstations)
+BOOL pdb_set_workstations (SAM_ACCOUNT *sampass, const char *workstations, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_WORKSTATIONS_CHANGED;
+	
 	if (!sampass)
 		return False;
 
@@ -875,8 +1321,10 @@ BOOL pdb_set_workstations (SAM_ACCOUNT *
  Set the user's 'unknown_str', whatever the heck this actually is...
  ********************************************************************/
 
-BOOL pdb_set_unknown_str (SAM_ACCOUNT *sampass, const char *unknown_str)
+BOOL pdb_set_unknown_str (SAM_ACCOUNT *sampass, const char *unknown_str, uint8)
 {
+	uint32 sam_flag_changed = FLAG_SAM_UNKNOWNSTR_CHANGED;
+	
 	if (!sampass)
 		return False;
 
@@ -899,8 +1347,10 @@ BOOL pdb_set_unknown_str (SAM_ACCOUNT *s
  Set the user's dial string.
  ********************************************************************/
 
-BOOL pdb_set_munged_dial (SAM_ACCOUNT *sampass, const char *munged_dial)
+BOOL pdb_set_munged_dial (SAM_ACCOUNT *sampass, const char *munged_dial, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_MUNGEDDIAL_CHANGED;
+
 	if (!sampass)
 		return False;
 
@@ -923,8 +1373,10 @@ BOOL pdb_set_munged_dial (SAM_ACCOUNT *s
  Set the user's NT hash.
  ********************************************************************/
 
-BOOL pdb_set_nt_passwd (SAM_ACCOUNT *sampass, const uint8 *pwd)
+BOOL pdb_set_nt_passwd (SAM_ACCOUNT *sampass, const uint8 pwd[NT_HASH_LEN], uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_NTPASSWD_CHANGED;
+
 	if (!sampass)
 		return False;
 
@@ -939,8 +1391,10 @@ BOOL pdb_set_nt_passwd (SAM_ACCOUNT *sam
  Set the user's LM hash.
  ********************************************************************/
 
-BOOL pdb_set_lanman_passwd (SAM_ACCOUNT *sampass, const uint8 pwd[16])
+BOOL pdb_set_lanman_passwd (SAM_ACCOUNT *sampass, const uint8 pwd[LM_HASH_LEN], uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_LMPASSWD_CHANGED;
+	
 	if (!sampass)
 		return False;
 
@@ -956,8 +1410,10 @@ BOOL pdb_set_lanman_passwd (SAM_ACCOUNT 
  below)
  ********************************************************************/
 
-BOOL pdb_set_plaintext_pw_only (SAM_ACCOUNT *sampass, const char *password)
+BOOL pdb_set_plaintext_pw_only (SAM_ACCOUNT *sampass, const char *password, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_PLAINTEXT_PW_CHANGED;
+
 	if (!sampass)
 		return False;
 
@@ -979,8 +1435,10 @@ BOOL pdb_set_plaintext_pw_only (SAM_ACCO
 	return True;
 }
 
-BOOL pdb_set_unknown_3 (SAM_ACCOUNT *sampass, uint32 unkn)
+BOOL pdb_set_unknown_3 (SAM_ACCOUNT *sampass, uint32 unkn, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_UNKNOWN3_CHANGED;
+
 	if (!sampass)
 		return False;
 
@@ -988,8 +1446,10 @@ BOOL pdb_set_unknown_3 (SAM_ACCOUNT *sam
 	return True;
 }
 
-BOOL pdb_set_unknown_5 (SAM_ACCOUNT *sampass, uint32 unkn)
+BOOL pdb_set_unknown_5 (SAM_ACCOUNT *sampass, uint32 unkn, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_UNKNOWN5_CHANGED;
+
 	if (!sampass)
 		return False;
 
@@ -997,8 +1457,10 @@ BOOL pdb_set_unknown_5 (SAM_ACCOUNT *sam
 	return True;
 }
 
-BOOL pdb_set_unknown_6 (SAM_ACCOUNT *sampass, uint32 unkn)
+BOOL pdb_set_unknown_6 (SAM_ACCOUNT *sampass, uint32 unkn, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_UNKNOW6_CHANGED;
+
 	if (!sampass)
 		return False;
 
@@ -1006,8 +1468,11 @@ BOOL pdb_set_unknown_6 (SAM_ACCOUNT *sam
 	return True;
 }
 
-BOOL pdb_set_hours (SAM_ACCOUNT *sampass, const uint8 *hours)
+BOOL pdb_set_hours (SAM_ACCOUNT *sampass, const uint8 *hours, uint8 flag)
 {
+	uint32 sam_flag_changed = FLAG_SAM_HOURS_CHANGED;
+	uint32 sam_flag_default = FLAG_SAM_HOURS_DEFAULT;
+	
 	if (!sampass)
 		return False;
 
@@ -1018,6 +1483,27 @@ BOOL pdb_set_hours (SAM_ACCOUNT *sampass
 	
 	memcpy (sampass->private.hours, hours, MAX_HOURS_LEN);
 
+	switch(flag) {
+		case CHANGED:
+			if (!pdb_set_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case SET:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_unset_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+		case DEFAULT:
+			if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+				return False;
+			if (!pdb_set_init_flag(sampass, sam_flag_default)
+				return False;
+			break;
+	}
+
 	return True;
 }
 
@@ -1041,12 +1527,12 @@ BOOL pdb_set_pass_changed_now (SAM_ACCOU
 
 	if (!account_policy_get(AP_MAX_PASSWORD_AGE, &expire) 
 	    || (expire==(uint32)-1)) {
-		if (!pdb_set_pass_must_change_time (sampass, get_time_t_max(), False))
+		if (!pdb_set_pass_must_change_time (sampass, get_time_t_max(), SET))
 			return False;
 	} else {
 		if (!pdb_set_pass_must_change_time (sampass, 
 						    pdb_get_pass_last_set_time(sampass)
-						    + expire, True))
+						    + expire, CHANGED))
 			return False;
 	}
 	
@@ -1068,13 +1554,13 @@ BOOL pdb_set_plaintext_passwd (SAM_ACCOU
 	
 	nt_lm_owf_gen (plaintext, new_nt_p16, new_lanman_p16);
 
-	if (!pdb_set_nt_passwd (sampass, new_nt_p16)) 
+	if (!pdb_set_nt_passwd (sampass, new_nt_p16, CHANGED)) 
 		return False;
 
-	if (!pdb_set_lanman_passwd (sampass, new_lanman_p16)) 
+	if (!pdb_set_lanman_passwd (sampass, new_lanman_p16, CHANGED)) 
 		return False;
 
-	if (!pdb_set_plaintext_pw_only (sampass, plaintext)) 
+	if (!pdb_set_plaintext_pw_only (sampass, plaintext, CHANGED)) 
 		return False;
 
 	if (!pdb_set_pass_changed_now (sampass))


More information about the samba-technical mailing list