[SCM] Samba Shared Repository - branch master updated - f29d31a7e0f7b397cbcbb83d1b1c0ce233e948e9

Günther Deschner gd at samba.org
Fri Dec 5 15:35:28 GMT 2008


The branch, master has been updated
       via  f29d31a7e0f7b397cbcbb83d1b1c0ce233e948e9 (commit)
       via  c0b67b4aa6253434ebbb71bf78f599ace351803f (commit)
       via  97c3ae12cff3d301d0bb0b259d7bcee4a55a6e4d (commit)
      from  b514da4afd73251dfcce24162f33803d5d0ca616 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit f29d31a7e0f7b397cbcbb83d1b1c0ce233e948e9
Author: Günther Deschner <gd at samba.org>
Date:   Fri Dec 5 16:11:15 2008 +0100

    s4-smbtorture: do full level 18, 21, 23, 24, 25, 26 testing in pwdlastset test.
    
    Guenther

commit c0b67b4aa6253434ebbb71bf78f599ace351803f
Author: Günther Deschner <gd at samba.org>
Date:   Fri Dec 5 16:07:06 2008 +0100

    s4-smbtorture: add support for level 18 and 21 in test_SetUserPass_level_ex.
    
    Guenther

commit 97c3ae12cff3d301d0bb0b259d7bcee4a55a6e4d
Author: Günther Deschner <gd at samba.org>
Date:   Tue Dec 2 23:22:14 2008 +0100

    s4-smbtorture: more tests for RPC-SAMR-PASSWORDS-PWDLASTSET.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 source4/torture/rpc/samr.c |  452 ++++++++++++++++++++++++++------------------
 1 files changed, 268 insertions(+), 184 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/torture/rpc/samr.c b/source4/torture/rpc/samr.c
index 2e59a06..d29c864 100644
--- a/source4/torture/rpc/samr.c
+++ b/source4/torture/rpc/samr.c
@@ -1041,9 +1041,11 @@ static bool test_SetUserPass_level_ex(struct dcerpc_pipe *p,
 				      uint16_t level,
 				      uint32_t fields_present,
 				      char **password, uint8_t password_expired,
-				      bool use_setinfo2, NTSTATUS expected_error)
+				      bool use_setinfo2,
+				      bool *matched_expected_error)
 {
 	NTSTATUS status;
+	NTSTATUS expected_error = NT_STATUS_OK;
 	struct samr_SetUserInfo s;
 	struct samr_SetUserInfo2 s2;
 	union samr_UserInfo u;
@@ -1057,6 +1059,7 @@ static bool test_SetUserPass_level_ex(struct dcerpc_pipe *p,
 	struct samr_PwInfo info;
 	int policy_min_pw_len = 0;
 	const char *comment = NULL;
+	uint8_t lm_hash[16], nt_hash[16];
 
 	pwp.in.user_handle = handle;
 	pwp.out.info = &info;
@@ -1084,11 +1087,40 @@ static bool test_SetUserPass_level_ex(struct dcerpc_pipe *p,
 	ZERO_STRUCT(u);
 
 	switch (level) {
+	case 18:
+		E_md4hash(newpass, nt_hash);
+		E_deshash(newpass, lm_hash);
+
+		u.info18.nt_pwd_active = true;
+		u.info18.lm_pwd_active = true;
+		u.info18.password_expired = password_expired;
+
+		memcpy(u.info18.lm_pwd.hash, lm_hash, 16);
+		memcpy(u.info18.nt_pwd.hash, nt_hash, 16);
+
+		break;
 	case 21:
+		E_md4hash(newpass, nt_hash);
+		E_deshash(newpass, lm_hash);
+
 		u.info21.fields_present = fields_present;
 		u.info21.password_expired = password_expired;
 		u.info21.comment.string = comment;
 
+		if (fields_present & SAMR_FIELD_LM_PASSWORD_PRESENT) {
+			u.info21.lm_owf_password.length = 16;
+			u.info21.lm_owf_password.size = 16;
+			u.info21.lm_owf_password.array = (uint16_t *)lm_hash;
+			u.info21.lm_password_set = true;
+		}
+
+		if (fields_present & SAMR_FIELD_NT_PASSWORD_PRESENT) {
+			u.info21.nt_owf_password.length = 16;
+			u.info21.nt_owf_password.size = 16;
+			u.info21.nt_owf_password.array = (uint16_t *)nt_hash;
+			u.info21.nt_password_set = true;
+		}
+
 		break;
 	case 23:
 		u.info23.info.fields_present = fields_present;
@@ -1135,6 +1167,41 @@ static bool test_SetUserPass_level_ex(struct dcerpc_pipe *p,
 	MD5Final(confounded_session_key.data, &ctx);
 
 	switch (level) {
+	case 18:
+		{
+			DATA_BLOB in,out;
+			in = data_blob_const(u.info18.nt_pwd.hash, 16);
+			out = data_blob_talloc_zero(tctx, 16);
+			sess_crypt_blob(&out, &in, &session_key, true);
+			memcpy(u.info18.nt_pwd.hash, out.data, out.length);
+		}
+		{
+			DATA_BLOB in,out;
+			in = data_blob_const(u.info18.lm_pwd.hash, 16);
+			out = data_blob_talloc_zero(tctx, 16);
+			sess_crypt_blob(&out, &in, &session_key, true);
+			memcpy(u.info18.lm_pwd.hash, out.data, out.length);
+		}
+
+		break;
+	case 21:
+		if (fields_present & SAMR_FIELD_LM_PASSWORD_PRESENT) {
+			DATA_BLOB in,out;
+			in = data_blob_const(u.info21.lm_owf_password.array,
+					     u.info21.lm_owf_password.length);
+			out = data_blob_talloc_zero(tctx, 16);
+			sess_crypt_blob(&out, &in, &session_key, true);
+			u.info21.lm_owf_password.array = (uint16_t *)out.data;
+		}
+		if (fields_present & SAMR_FIELD_NT_PASSWORD_PRESENT) {
+			DATA_BLOB in,out;
+			in = data_blob_const(u.info21.nt_owf_password.array,
+					     u.info21.nt_owf_password.length);
+			out = data_blob_talloc_zero(tctx, 16);
+			sess_crypt_blob(&out, &in, &session_key, true);
+			u.info21.nt_owf_password.array = (uint16_t *)out.data;
+		}
+		break;
 	case 23:
 		arcfour_crypt_blob(u.info23.password.data, 516, &session_key);
 		break;
@@ -1157,6 +1224,15 @@ static bool test_SetUserPass_level_ex(struct dcerpc_pipe *p,
 		status = dcerpc_samr_SetUserInfo(p, tctx, &s);
 	}
 
+	if (!NT_STATUS_IS_OK(status)) {
+		if (fields_present == 0) {
+			expected_error = NT_STATUS_INVALID_PARAMETER;
+		}
+		if (fields_present & SAMR_FIELD_LAST_PWD_CHANGE) {
+			expected_error = NT_STATUS_ACCESS_DENIED;
+		}
+	}
+
 	if (!NT_STATUS_IS_OK(expected_error)) {
 		if (use_setinfo2) {
 			torture_assert_ntstatus_equal(tctx,
@@ -1167,6 +1243,7 @@ static bool test_SetUserPass_level_ex(struct dcerpc_pipe *p,
 				s.out.result,
 				expected_error, "SetUserInfo failed");
 		}
+		*matched_expected_error = true;
 		return true;
 	}
 
@@ -1175,9 +1252,7 @@ static bool test_SetUserPass_level_ex(struct dcerpc_pipe *p,
 		       use_setinfo2 ? "2":"", level, nt_errstr(status));
 		ret = false;
 	} else {
-		if (level != 21) {
-			*password = newpass;
-		}
+		*password = newpass;
 	}
 
 	return ret;
@@ -2550,7 +2625,7 @@ static bool test_SetPassword_level(struct dcerpc_pipe *p,
 				   uint16_t level,
 				   uint32_t fields_present,
 				   uint8_t password_expired,
-				   NTSTATUS expected_error,
+				   bool *matched_expected_error,
 				   bool use_setinfo2,
 				   char **password,
 				   bool use_queryinfo2,
@@ -2575,23 +2650,13 @@ static bool test_SetPassword_level(struct dcerpc_pipe *p,
 		use_setinfo2 ? "2":"", level, password_expired,
 		fields ? fields : "");
 
-	switch (level) {
-		case 21:
-		case 23:
-		case 24:
-		case 25:
-		case 26:
-			if (!test_SetUserPass_level_ex(p, tctx, handle, level,
-						       fields_present,
-						       password,
-						       password_expired,
-						       use_setinfo2,
-						       expected_error)) {
-				ret = false;
-			}
-			break;
-		default:
-			return false;
+	if (!test_SetUserPass_level_ex(p, tctx, handle, level,
+				       fields_present,
+				       password,
+				       password_expired,
+				       use_setinfo2,
+				       matched_expected_error)) {
+		ret = false;
 	}
 
 	if (!test_QueryUserInfo_pwdlastset(p, tctx, handle,
@@ -2609,144 +2674,26 @@ static bool test_SetPassword_pwdlastset(struct dcerpc_pipe *p,
 					struct policy_handle *handle,
 					char **password)
 {
-	int i, s = 0, q = 0;
+	int i, s = 0, q = 0, f = 0, l = 0, z = 0;
 	bool ret = true;
 	int delay = 500000;
 	bool set_levels[] = { false, true };
 	bool query_levels[] = { false, true };
-
-	struct {
-		uint16_t level;
-		uint8_t password_expired_nonzero;
-		uint32_t fields_present;
-		bool query_info2;
-		bool set_info2;
-		NTSTATUS set_error;
-	} pwd_tests[] = {
-
-		/* level 21 */
-		{
-			.level				= 21,
-			.password_expired_nonzero	= 1,
-			.fields_present			= SAMR_FIELD_EXPIRED_FLAG
-		},{
-			.level				= 21,
-			.password_expired_nonzero	= 1,
-			.fields_present			= SAMR_FIELD_LAST_PWD_CHANGE,
-			.set_error			= NT_STATUS_ACCESS_DENIED
-		},{
-			.level				= 21,
-			.password_expired_nonzero	= 1,
-			.fields_present			= 0,
-			.set_error			= NT_STATUS_INVALID_PARAMETER
-		},{
-			.level				= 21,
-			.password_expired_nonzero	= 1,
-			.fields_present			= SAMR_FIELD_COMMENT,
-
-#if 0
-	/* FIXME */
-		},{
-			.level				= 21,
-			.password_expired_nonzero	= 1,
-			.fields_present			= SAMR_FIELD_NT_PASSWORD_PRESENT |
-							  SAMR_FIELD_LM_PASSWORD_PRESENT |
-							  SAMR_FIELD_LAST_PWD_CHANGE,
-			.query_info2			= false,
-			.set_error			= NT_STATUS_ACCESS_DENIED
-#endif
-
-		/* level 23 */
-		},{
-			.level				= 23,
-			.password_expired_nonzero	= 1,
-			.fields_present			= SAMR_FIELD_EXPIRED_FLAG
-		},{
-			.level				= 23,
-			.password_expired_nonzero	= 1,
-			.fields_present			= SAMR_FIELD_LAST_PWD_CHANGE,
-			.set_error			= NT_STATUS_ACCESS_DENIED
-		},{
-			.level				= 23,
-			.password_expired_nonzero	= 1,
-			.fields_present			= SAMR_FIELD_LAST_PWD_CHANGE |
-							  SAMR_FIELD_NT_PASSWORD_PRESENT |
-							  SAMR_FIELD_LM_PASSWORD_PRESENT,
-			.set_error			= NT_STATUS_ACCESS_DENIED
-		},{
-			.level				= 23,
-			.password_expired_nonzero	= 1,
-			.fields_present			= SAMR_FIELD_LAST_PWD_CHANGE |
-							  SAMR_FIELD_NT_PASSWORD_PRESENT |
-							  SAMR_FIELD_LM_PASSWORD_PRESENT |
-							  SAMR_FIELD_EXPIRED_FLAG,
-			.set_error			= NT_STATUS_ACCESS_DENIED
-		},{
-			.level				= 23,
-			.password_expired_nonzero	= 1,
-			.fields_present			= SAMR_FIELD_NT_PASSWORD_PRESENT |
-							  SAMR_FIELD_LM_PASSWORD_PRESENT |
-							  SAMR_FIELD_EXPIRED_FLAG
-		},{
-			.level				= 23,
-			.password_expired_nonzero	= 1,
-			.fields_present			= SAMR_FIELD_NT_PASSWORD_PRESENT |
-							  SAMR_FIELD_LM_PASSWORD_PRESENT,
-		},{
-			.level				= 23,
-			.password_expired_nonzero	= 1,
-			.fields_present			= SAMR_FIELD_COMMENT,
-		},{
-			.level				= 23,
-			.password_expired_nonzero	= 1,
-			.fields_present			= 0,
-			.set_error			= NT_STATUS_INVALID_PARAMETER
-		},{
-
-		/* level 24 */
-
-			.level				= 24,
-			.password_expired_nonzero	= 1
-		},{
-			.level				= 24,
-			.password_expired_nonzero	= 24
-		},{
-
-		/* level 25 */
-
-			.level				= 25,
-			.password_expired_nonzero	= 1,
-			.fields_present			= SAMR_FIELD_LAST_PWD_CHANGE,
-			.set_error			= NT_STATUS_ACCESS_DENIED
-		},{
-			.level				= 25,
-			.password_expired_nonzero	= 1,
-			.fields_present			= SAMR_FIELD_EXPIRED_FLAG,
-		},{
-			.level				= 25,
-			.password_expired_nonzero	= 1,
-			.fields_present			= SAMR_FIELD_NT_PASSWORD_PRESENT |
-							  SAMR_FIELD_LM_PASSWORD_PRESENT |
-							  SAMR_FIELD_EXPIRED_FLAG
-		},{
-			.level				= 25,
-			.password_expired_nonzero	= 1,
-			.fields_present			= SAMR_FIELD_NT_PASSWORD_PRESENT |
-							  SAMR_FIELD_LM_PASSWORD_PRESENT,
-		},{
-			.level				= 25,
-			.password_expired_nonzero	= 1,
-			.fields_present			= SAMR_FIELD_COMMENT,
-		},{
-
-		/* level 26 */
-
-			.level				= 26,
-			.password_expired_nonzero	= 1
-		},{
-			.level				= 26,
-			.password_expired_nonzero	= 24
-		}
+	uint32_t levels[] = { 18, 21, 23, 24, 25, 26 };
+	uint32_t nonzeros[] = { 1, 24 };
+	uint32_t fields_present[] = {
+		0,
+		SAMR_FIELD_EXPIRED_FLAG,
+		SAMR_FIELD_LAST_PWD_CHANGE,
+		SAMR_FIELD_EXPIRED_FLAG | SAMR_FIELD_LAST_PWD_CHANGE,
+		SAMR_FIELD_COMMENT,
+		SAMR_FIELD_NT_PASSWORD_PRESENT,
+		SAMR_FIELD_NT_PASSWORD_PRESENT | SAMR_FIELD_LAST_PWD_CHANGE,
+		SAMR_FIELD_NT_PASSWORD_PRESENT | SAMR_FIELD_LM_PASSWORD_PRESENT,
+		SAMR_FIELD_NT_PASSWORD_PRESENT | SAMR_FIELD_LM_PASSWORD_PRESENT | SAMR_FIELD_LAST_PWD_CHANGE,
+		SAMR_FIELD_NT_PASSWORD_PRESENT | SAMR_FIELD_EXPIRED_FLAG,
+		SAMR_FIELD_NT_PASSWORD_PRESENT | SAMR_FIELD_LM_PASSWORD_PRESENT | SAMR_FIELD_EXPIRED_FLAG,
+		SAMR_FIELD_NT_PASSWORD_PRESENT | SAMR_FIELD_LM_PASSWORD_PRESENT | SAMR_FIELD_LAST_PWD_CHANGE | SAMR_FIELD_EXPIRED_FLAG
 	};
 
 	if (torture_setting_bool(tctx, "samba3", false)) {
@@ -2762,7 +2709,9 @@ static bool test_SetPassword_pwdlastset(struct dcerpc_pipe *p,
 #define TEST_SET_LEVELS 1
 #define TEST_QUERY_LEVELS 1
 #endif
-	for (i=0; i<ARRAY_SIZE(pwd_tests); i++) {
+	for (l=0; l<ARRAY_SIZE(levels); l++) {
+	for (z=0; z<ARRAY_SIZE(nonzeros); z++) {
+	for (f=0; f<ARRAY_SIZE(fields_present); f++) {
 #ifdef TEST_SET_LEVELS
 	for (s=0; s<ARRAY_SIZE(set_levels); s++) {
 #endif
@@ -2771,11 +2720,12 @@ static bool test_SetPassword_pwdlastset(struct dcerpc_pipe *p,
 #endif
 		NTTIME pwdlastset_old = 0;
 		NTTIME pwdlastset_new = 0;
+		bool matched_expected_error = false;
 
 		torture_comment(tctx, "------------------------------\n"
 				"Testing pwdLastSet attribute for flags: 0x%08x "
 				"(s: %d (l: %d), q: %d)\n",
-				acct_flags, s, pwd_tests[i].level, q);
+				acct_flags, s, levels[l], q);
 
 		/* set #1 */
 
@@ -2783,10 +2733,10 @@ static bool test_SetPassword_pwdlastset(struct dcerpc_pipe *p,
 		 * setting the password expired flag to a non-0 value */
 
 		if (!test_SetPassword_level(p, tctx, handle,
-					    pwd_tests[i].level,
-					    pwd_tests[i].fields_present,
-					    pwd_tests[i].password_expired_nonzero,
-					    pwd_tests[i].set_error,
+					    levels[l],
+					    fields_present[f],
+					    nonzeros[z],
+					    &matched_expected_error,
 					    set_levels[s],
 					    password,
 					    query_levels[q],
@@ -2794,7 +2744,7 @@ static bool test_SetPassword_pwdlastset(struct dcerpc_pipe *p,
 			ret = false;
 		}
 
-		if (!NT_STATUS_IS_OK(pwd_tests[i].set_error)) {
+		if (matched_expected_error == true) {
 			/* skipping on expected failure */
 			continue;
 		}
@@ -2802,12 +2752,12 @@ static bool test_SetPassword_pwdlastset(struct dcerpc_pipe *p,
 		/* pwdlastset must be 0 afterwards, except for a level 21, 23 and 25
 		 * set without the SAMR_FIELD_EXPIRED_FLAG */
 
-		switch (pwd_tests[i].level) {
+		switch (levels[l]) {
 		case 21:
 		case 23:
 		case 25:
 			if ((pwdlastset_new != 0) &&
-			    !(pwd_tests[i].fields_present & SAMR_FIELD_EXPIRED_FLAG)) {
+			    !(fields_present[f] & SAMR_FIELD_EXPIRED_FLAG)) {
 				torture_comment(tctx, "not considering a non-0 "
 					"pwdLastSet as a an error as the "
 					"SAMR_FIELD_EXPIRED_FLAG has not "
@@ -2824,6 +2774,27 @@ static bool test_SetPassword_pwdlastset(struct dcerpc_pipe *p,
 			break;
 		}
 
+		switch (levels[l]) {
+		case 21:
+		case 23:
+		case 25:
+			if (((fields_present[f] & SAMR_FIELD_NT_PASSWORD_PRESENT) ||
+			     (fields_present[f] & SAMR_FIELD_LM_PASSWORD_PRESENT)) &&
+			     (pwdlastset_old > 0) && (pwdlastset_new > 0) &&
+			     (pwdlastset_old >= pwdlastset_new)) {
+				torture_warning(tctx, "pwdlastset not increasing\n");
+				ret = false;
+			}
+			break;
+		default:
+			if ((pwdlastset_old > 0) && (pwdlastset_new > 0) &&
+			    (pwdlastset_old >= pwdlastset_new)) {
+				torture_warning(tctx, "pwdlastset not increasing\n");
+				ret = false;
+			}
+			break;
+		}
+
 		usleep(delay);
 
 		/* set #2 */
@@ -2831,22 +2802,22 @@ static bool test_SetPassword_pwdlastset(struct dcerpc_pipe *p,
 		/* set a password, pwdlastset needs to get updated (increased
 		 * value), password_expired value used here is 0 */
 
-		if (!test_SetPassword_level(p, tctx, handle, pwd_tests[i].level,
-					    pwd_tests[i].fields_present,
+		if (!test_SetPassword_level(p, tctx, handle,
+					    levels[l],
+					    fields_present[f],
 					    0,
-					    pwd_tests[i].set_error,
+					    &matched_expected_error,
 					    set_levels[s],
 					    password,
 					    query_levels[q],
 					    &pwdlastset_new)) {
-
 			ret = false;
 		}
 
 		/* when a password has been changed, pwdlastset must not be 0 afterwards
 		 * and must be larger then the old value */
 
-		switch (pwd_tests[i].level) {
+		switch (levels[l]) {
 		case 21:
 		case 23:
 		case 25:
@@ -2855,9 +2826,9 @@ static bool test_SetPassword_pwdlastset(struct dcerpc_pipe *p,
 			 * password has been changed, old and new pwdlastset
 			 * need to be the same value */
 
-			if (!(pwd_tests[i].fields_present & SAMR_FIELD_EXPIRED_FLAG) &&
-			    !((pwd_tests[i].fields_present & SAMR_FIELD_NT_PASSWORD_PRESENT) ||
-			      (pwd_tests[i].fields_present & SAMR_FIELD_LM_PASSWORD_PRESENT)))
+			if (!(fields_present[f] & SAMR_FIELD_EXPIRED_FLAG) &&
+			    !((fields_present[f] & SAMR_FIELD_NT_PASSWORD_PRESENT) ||
+			      (fields_present[f] & SAMR_FIELD_LM_PASSWORD_PRESENT)))
 			{
 				torture_assert_int_equal(tctx, pwdlastset_old,
 					pwdlastset_new, "pwdlastset must be equal");
@@ -2878,19 +2849,91 @@ static bool test_SetPassword_pwdlastset(struct dcerpc_pipe *p,
 			}
 		}
 
+		switch (levels[l]) {
+		case 21:
+		case 23:
+		case 25:
+			if (((fields_present[f] & SAMR_FIELD_NT_PASSWORD_PRESENT) ||
+			     (fields_present[f] & SAMR_FIELD_LM_PASSWORD_PRESENT)) &&
+			     (pwdlastset_old > 0) && (pwdlastset_new > 0) &&
+			     (pwdlastset_old >= pwdlastset_new)) {
+				torture_warning(tctx, "pwdlastset not increasing\n");
+				ret = false;
+			}
+			break;
+		default:
+			if ((pwdlastset_old > 0) && (pwdlastset_new > 0) &&
+			    (pwdlastset_old >= pwdlastset_new)) {
+				torture_warning(tctx, "pwdlastset not increasing\n");
+				ret = false;
+			}
+			break;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list