[SCM] Samba Shared Repository - branch v3-2-test updated - release-3-2-0pre2-563-gc4f248d

Günther Deschner gd at samba.org
Mon Mar 31 18:57:06 GMT 2008


The branch, v3-2-test has been updated
       via  c4f248df8e34c6a028bf8d789fe9763b0ea063fe (commit)
       via  35a70c65beed1c4a1fab4113af7a5b232f23063b (commit)
       via  98606c667a425113d87b2756ee7df34f67445539 (commit)
       via  8f6f0d1601cb93af51f8d493382cd707c3eb0cdf (commit)
      from  3414eac439b731ad7204b821ddc4fec54fe4435d (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit c4f248df8e34c6a028bf8d789fe9763b0ea063fe
Author: Günther Deschner <gd at samba.org>
Date:   Mon Mar 31 20:43:18 2008 +0200

    Re-add support for the samr parameters string.
    
    (dialin settings, terminal server settings, etc.)
    
    Guenther

commit 35a70c65beed1c4a1fab4113af7a5b232f23063b
Author: Günther Deschner <gd at samba.org>
Date:   Mon Mar 31 20:42:26 2008 +0200

    Re-run make idl.
    
    Guenther

commit 98606c667a425113d87b2756ee7df34f67445539
Author: Günther Deschner <gd at samba.org>
Date:   Mon Mar 31 20:40:56 2008 +0200

    The parameters string (aka munged dial string) in samr is not a normal lsa_String.
    
    Guenther

commit 8f6f0d1601cb93af51f8d493382cd707c3eb0cdf
Author: Günther Deschner <gd at samba.org>
Date:   Mon Mar 31 20:40:16 2008 +0200

    Add init_samr_parameters_string().
    
    Guenther

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

Summary of changes:
 source/librpc/gen_ndr/ndr_samr.c  |   20 ++++----
 source/librpc/gen_ndr/samr.h      |    4 +-
 source/librpc/idl/samr.idl        |    4 +-
 source/rpc_client/init_samr.c     |   10 ++--
 source/rpc_server/srv_samr_nt.c   |   86 ++++++++++++++++++++++++------------
 source/rpc_server/srv_samr_util.c |   17 +++----
 source/rpcclient/cmd_samr.c       |   16 ++++++-
 7 files changed, 99 insertions(+), 58 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/librpc/gen_ndr/ndr_samr.c b/source/librpc/gen_ndr/ndr_samr.c
index 3af589f..46b3a07 100644
--- a/source/librpc/gen_ndr/ndr_samr.c
+++ b/source/librpc/gen_ndr/ndr_samr.c
@@ -2613,10 +2613,10 @@ static enum ndr_err_code ndr_push_samr_UserInfo20(struct ndr_push *ndr, int ndr_
 {
 	if (ndr_flags & NDR_SCALARS) {
 		NDR_CHECK(ndr_push_align(ndr, 4));
-		NDR_CHECK(ndr_push_lsa_String(ndr, NDR_SCALARS, &r->parameters));
+		NDR_CHECK(ndr_push_lsa_BinaryString(ndr, NDR_SCALARS, &r->parameters));
 	}
 	if (ndr_flags & NDR_BUFFERS) {
-		NDR_CHECK(ndr_push_lsa_String(ndr, NDR_BUFFERS, &r->parameters));
+		NDR_CHECK(ndr_push_lsa_BinaryString(ndr, NDR_BUFFERS, &r->parameters));
 	}
 	return NDR_ERR_SUCCESS;
 }
@@ -2625,10 +2625,10 @@ static enum ndr_err_code ndr_pull_samr_UserInfo20(struct ndr_pull *ndr, int ndr_
 {
 	if (ndr_flags & NDR_SCALARS) {
 		NDR_CHECK(ndr_pull_align(ndr, 4));
-		NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_SCALARS, &r->parameters));
+		NDR_CHECK(ndr_pull_lsa_BinaryString(ndr, NDR_SCALARS, &r->parameters));
 	}
 	if (ndr_flags & NDR_BUFFERS) {
-		NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_BUFFERS, &r->parameters));
+		NDR_CHECK(ndr_pull_lsa_BinaryString(ndr, NDR_BUFFERS, &r->parameters));
 	}
 	return NDR_ERR_SUCCESS;
 }
@@ -2637,7 +2637,7 @@ _PUBLIC_ void ndr_print_samr_UserInfo20(struct ndr_print *ndr, const char *name,
 {
 	ndr_print_struct(ndr, name, "samr_UserInfo20");
 	ndr->depth++;
-	ndr_print_lsa_String(ndr, "parameters", &r->parameters);
+	ndr_print_lsa_BinaryString(ndr, "parameters", &r->parameters);
 	ndr->depth--;
 }
 
@@ -2711,7 +2711,7 @@ static enum ndr_err_code ndr_push_samr_UserInfo21(struct ndr_push *ndr, int ndr_
 		NDR_CHECK(ndr_push_lsa_String(ndr, NDR_SCALARS, &r->description));
 		NDR_CHECK(ndr_push_lsa_String(ndr, NDR_SCALARS, &r->workstations));
 		NDR_CHECK(ndr_push_lsa_String(ndr, NDR_SCALARS, &r->comment));
-		NDR_CHECK(ndr_push_lsa_String(ndr, NDR_SCALARS, &r->parameters));
+		NDR_CHECK(ndr_push_lsa_BinaryString(ndr, NDR_SCALARS, &r->parameters));
 		NDR_CHECK(ndr_push_lsa_String(ndr, NDR_SCALARS, &r->unknown1));
 		NDR_CHECK(ndr_push_lsa_String(ndr, NDR_SCALARS, &r->unknown2));
 		NDR_CHECK(ndr_push_lsa_String(ndr, NDR_SCALARS, &r->unknown3));
@@ -2741,7 +2741,7 @@ static enum ndr_err_code ndr_push_samr_UserInfo21(struct ndr_push *ndr, int ndr_
 		NDR_CHECK(ndr_push_lsa_String(ndr, NDR_BUFFERS, &r->description));
 		NDR_CHECK(ndr_push_lsa_String(ndr, NDR_BUFFERS, &r->workstations));
 		NDR_CHECK(ndr_push_lsa_String(ndr, NDR_BUFFERS, &r->comment));
-		NDR_CHECK(ndr_push_lsa_String(ndr, NDR_BUFFERS, &r->parameters));
+		NDR_CHECK(ndr_push_lsa_BinaryString(ndr, NDR_BUFFERS, &r->parameters));
 		NDR_CHECK(ndr_push_lsa_String(ndr, NDR_BUFFERS, &r->unknown1));
 		NDR_CHECK(ndr_push_lsa_String(ndr, NDR_BUFFERS, &r->unknown2));
 		NDR_CHECK(ndr_push_lsa_String(ndr, NDR_BUFFERS, &r->unknown3));
@@ -2775,7 +2775,7 @@ static enum ndr_err_code ndr_pull_samr_UserInfo21(struct ndr_pull *ndr, int ndr_
 		NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_SCALARS, &r->description));
 		NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_SCALARS, &r->workstations));
 		NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_SCALARS, &r->comment));
-		NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_SCALARS, &r->parameters));
+		NDR_CHECK(ndr_pull_lsa_BinaryString(ndr, NDR_SCALARS, &r->parameters));
 		NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_SCALARS, &r->unknown1));
 		NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_SCALARS, &r->unknown2));
 		NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_SCALARS, &r->unknown3));
@@ -2810,7 +2810,7 @@ static enum ndr_err_code ndr_pull_samr_UserInfo21(struct ndr_pull *ndr, int ndr_
 		NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_BUFFERS, &r->description));
 		NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_BUFFERS, &r->workstations));
 		NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_BUFFERS, &r->comment));
-		NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_BUFFERS, &r->parameters));
+		NDR_CHECK(ndr_pull_lsa_BinaryString(ndr, NDR_BUFFERS, &r->parameters));
 		NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_BUFFERS, &r->unknown1));
 		NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_BUFFERS, &r->unknown2));
 		NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_BUFFERS, &r->unknown3));
@@ -2849,7 +2849,7 @@ _PUBLIC_ void ndr_print_samr_UserInfo21(struct ndr_print *ndr, const char *name,
 	ndr_print_lsa_String(ndr, "description", &r->description);
 	ndr_print_lsa_String(ndr, "workstations", &r->workstations);
 	ndr_print_lsa_String(ndr, "comment", &r->comment);
-	ndr_print_lsa_String(ndr, "parameters", &r->parameters);
+	ndr_print_lsa_BinaryString(ndr, "parameters", &r->parameters);
 	ndr_print_lsa_String(ndr, "unknown1", &r->unknown1);
 	ndr_print_lsa_String(ndr, "unknown2", &r->unknown2);
 	ndr_print_lsa_String(ndr, "unknown3", &r->unknown3);
diff --git a/source/librpc/gen_ndr/samr.h b/source/librpc/gen_ndr/samr.h
index c0e2d9d..37e27aa 100644
--- a/source/librpc/gen_ndr/samr.h
+++ b/source/librpc/gen_ndr/samr.h
@@ -416,7 +416,7 @@ struct samr_UserInfo18 {
 };
 
 struct samr_UserInfo20 {
-	struct lsa_String parameters;
+	struct lsa_BinaryString parameters;
 };
 
 /* bitmap samr_FieldsPresent */
@@ -467,7 +467,7 @@ struct samr_UserInfo21 {
 	struct lsa_String description;
 	struct lsa_String workstations;
 	struct lsa_String comment;
-	struct lsa_String parameters;
+	struct lsa_BinaryString parameters;
 	struct lsa_String unknown1;
 	struct lsa_String unknown2;
 	struct lsa_String unknown3;
diff --git a/source/librpc/idl/samr.idl b/source/librpc/idl/samr.idl
index c2449d3..401de96 100644
--- a/source/librpc/idl/samr.idl
+++ b/source/librpc/idl/samr.idl
@@ -746,7 +746,7 @@ import "misc.idl", "lsa.idl", "security.idl";
 	} samr_UserInfo18;
 
 	typedef struct {
-		lsa_String parameters;
+		lsa_BinaryString parameters;
 	} samr_UserInfo20;
 
 	/* this defines the bits used for fields_present in info21 */
@@ -803,7 +803,7 @@ import "misc.idl", "lsa.idl", "security.idl";
 		lsa_String description;
 		lsa_String workstations;
 		lsa_String comment;
-		lsa_String parameters;
+		lsa_BinaryString parameters;
 		lsa_String unknown1;
 		lsa_String unknown2;
 		lsa_String unknown3;
diff --git a/source/rpc_client/init_samr.c b/source/rpc_client/init_samr.c
index 1275fc8..3b62e7e 100644
--- a/source/rpc_client/init_samr.c
+++ b/source/rpc_client/init_samr.c
@@ -308,9 +308,9 @@ void init_samr_user_info18(struct samr_UserInfo18 *r,
 ********************************************************************/
 
 void init_samr_user_info20(struct samr_UserInfo20 *r,
-			   const char *munged_dial)
+			   struct lsa_BinaryString *parameters)
 {
-	init_lsa_String(&r->parameters, munged_dial);
+	r->parameters = *parameters;
 }
 
 /*************************************************************************
@@ -333,7 +333,7 @@ void init_samr_user_info21(struct samr_UserInfo21 *r,
 			   const char *description,
 			   const char *workstations,
 			   const char *comment,
-			   const char *parameters,
+			   struct lsa_BinaryString *parameters,
 			   uint32_t rid,
 			   uint32_t primary_gid,
 			   uint32_t acct_flags,
@@ -362,7 +362,7 @@ void init_samr_user_info21(struct samr_UserInfo21 *r,
 	init_lsa_String(&r->description, description);
 	init_lsa_String(&r->workstations, workstations);
 	init_lsa_String(&r->comment, comment);
-	init_lsa_String(&r->parameters, parameters);
+	r->parameters = *parameters;
 	r->rid = rid;
 	r->primary_gid = primary_gid;
 	r->acct_flags = acct_flags;
@@ -397,7 +397,7 @@ void init_samr_user_info23(struct samr_UserInfo23 *r,
 			   const char *description,
 			   const char *workstations,
 			   const char *comment,
-			   const char *parameters,
+			   struct lsa_BinaryString *parameters,
 			   uint32_t rid,
 			   uint32_t primary_gid,
 			   uint32_t acct_flags,
diff --git a/source/rpc_server/srv_samr_nt.c b/source/rpc_server/srv_samr_nt.c
index eeb3e40..0f4a5b9 100644
--- a/source/rpc_server/srv_samr_nt.c
+++ b/source/rpc_server/srv_samr_nt.c
@@ -2155,6 +2155,41 @@ NTSTATUS _samr_OpenUser(pipes_struct *p,
 }
 
 /*************************************************************************
+ *************************************************************************/
+
+static NTSTATUS init_samr_parameters_string(TALLOC_CTX *mem_ctx,
+					    DATA_BLOB *blob,
+					    struct lsa_BinaryString **_r)
+{
+	struct lsa_BinaryString *r;
+
+	if (!blob || !_r) {
+		return NT_STATUS_INVALID_PARAMETER;
+	}
+
+	r = TALLOC_ZERO_P(mem_ctx, struct lsa_BinaryString);
+	if (!r) {
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	r->array = TALLOC_ZERO_ARRAY(mem_ctx, uint16_t, blob->length/2);
+	if (!r->array) {
+		return NT_STATUS_NO_MEMORY;
+	}
+	memcpy(r->array, blob->data, blob->length);
+	r->size = blob->length;
+	r->length = blob->length;
+
+	if (!r->array) {
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	*_r = r;
+
+	return NT_STATUS_OK;
+}
+
+/*************************************************************************
  get_user_info_7. Safe. Only gives out account_name.
  *************************************************************************/
 
@@ -2333,8 +2368,9 @@ static NTSTATUS get_user_info_20(TALLOC_CTX *mem_ctx,
 	struct samu *sampass=NULL;
 	bool ret;
 	const char *munged_dial = NULL;
-	const char *munged_dial_decoded = NULL;
 	DATA_BLOB blob;
+	NTSTATUS status;
+	struct lsa_BinaryString *parameters = NULL;
 
 	ZERO_STRUCTP(r);
 
@@ -2356,28 +2392,23 @@ static NTSTATUS get_user_info_20(TALLOC_CTX *mem_ctx,
 
 	samr_clear_sam_passwd(sampass);
 
-	DEBUG(3,("User:[%s]\n",  pdb_get_username(sampass) ));
+	DEBUG(3,("User:[%s] has [%s] (length: %d)\n", pdb_get_username(sampass),
+		munged_dial, strlen(munged_dial)));
 
 	if (munged_dial) {
 		blob = base64_decode_data_blob(munged_dial);
-		munged_dial_decoded = talloc_strndup(mem_ctx,
-						     (const char *)blob.data,
-						     blob.length);
-		data_blob_free(&blob);
-		if (!munged_dial_decoded) {
-			TALLOC_FREE(sampass);
-			return NT_STATUS_NO_MEMORY;
-		}
+	} else {
+		blob = data_blob_string_const("");
 	}
 
-#if 0
-	init_unistr2_from_datablob(&usr->uni_munged_dial, &blob);
-	init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
+	status = init_samr_parameters_string(mem_ctx, &blob, &parameters);
 	data_blob_free(&blob);
-#endif
-	init_samr_user_info20(r, munged_dial_decoded);
-
 	TALLOC_FREE(sampass);
+	if (!NT_STATUS_IS_OK(status)) {
+		return status;
+	}
+
+	init_samr_user_info20(r, parameters);
 
 	return NT_STATUS_OK;
 }
@@ -2392,6 +2423,7 @@ static NTSTATUS get_user_info_21(TALLOC_CTX *mem_ctx,
 				 DOM_SID *user_sid,
 				 DOM_SID *domain_sid)
 {
+	NTSTATUS status;
 	struct samu *pw = NULL;
 	bool ret;
 	const DOM_SID *sid_user, *sid_group;
@@ -2402,8 +2434,9 @@ static NTSTATUS get_user_info_21(TALLOC_CTX *mem_ctx,
 	uint8_t password_expired;
 	const char *account_name, *full_name, *home_directory, *home_drive,
 		   *logon_script, *profile_path, *description,
-		   *workstations, *comment, *parameters;
+		   *workstations, *comment;
 	struct samr_LogonHours logon_hours;
+	struct lsa_BinaryString *parameters = NULL;
 	const char *munged_dial = NULL;
 	DATA_BLOB blob;
 
@@ -2473,16 +2506,16 @@ static NTSTATUS get_user_info_21(TALLOC_CTX *mem_ctx,
 	munged_dial = pdb_get_munged_dial(pw);
 	if (munged_dial) {
 		blob = base64_decode_data_blob(munged_dial);
-		parameters = talloc_strndup(mem_ctx, (const char *)blob.data, blob.length);
-		data_blob_free(&blob);
-		if (!parameters) {
-			TALLOC_FREE(pw);
-			return NT_STATUS_NO_MEMORY;
-		}
 	} else {
-		parameters = NULL;
+		blob = data_blob_string_const("");
 	}
 
+	status = init_samr_parameters_string(mem_ctx, &blob, &parameters);
+	data_blob_free(&blob);
+	if (!NT_STATUS_IS_OK(status)) {
+		TALLOC_FREE(pw);
+		return status;
+	}
 
 	account_name = talloc_strdup(mem_ctx, pdb_get_username(pw));
 	full_name = talloc_strdup(mem_ctx, pdb_get_fullname(pw));
@@ -2507,11 +2540,6 @@ static NTSTATUS get_user_info_21(TALLOC_CTX *mem_ctx,
 	  -- Volker
 	*/
 
-#if 0
-	init_unistr2_from_datablob(&usr->uni_munged_dial, &munged_dial_blob);
-	init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
-	data_blob_free(&munged_dial_blob);
-#endif
 #endif
 
 	init_samr_user_info21(r,
diff --git a/source/rpc_server/srv_samr_util.c b/source/rpc_server/srv_samr_util.c
index 688d720..74daf46 100644
--- a/source/rpc_server/srv_samr_util.c
+++ b/source/rpc_server/srv_samr_util.c
@@ -50,11 +50,10 @@ void copy_id20_to_sam_passwd(struct samu *to,
 		return;
 	}
 
-	if (from->parameters.string) {
+	if (from->parameters.array) {
 		old_string = pdb_get_munged_dial(to);
-		mung.length = from->parameters.length;
-		mung.data = (uint8_t *)from->parameters.string;
-		mung.free = NULL;
+		mung = data_blob_const(from->parameters.array,
+				       from->parameters.length);
 		new_string = (mung.length == 0) ?
 			NULL : base64_encode_data_blob(talloc_tos(), mung);
 		DEBUG(10,("INFO_20 PARAMETERS: %s -> %s\n",
@@ -77,7 +76,6 @@ void copy_id21_to_sam_passwd(const char *log_prefix,
 {
 	time_t unix_time, stored_time;
 	const char *old_string, *new_string;
-	DATA_BLOB mung;
 	const char *l;
 
 	if (from == NULL || to == NULL) {
@@ -234,12 +232,13 @@ void copy_id21_to_sam_passwd(const char *log_prefix,
 	}
 
 	if ((from->fields_present & SAMR_FIELD_PARAMETERS) &&
-	    (from->parameters.string)) {
+	    (from->parameters.array)) {
 		char *newstr;
+		DATA_BLOB mung;
 		old_string = pdb_get_munged_dial(to);
-		mung.length = from->parameters.length;
-		mung.data = (uint8_t *)from->parameters.string;
-		mung.free = NULL;
+
+		mung = data_blob_const(from->parameters.array,
+				       from->parameters.length);
 		newstr = (mung.length == 0) ?
 			NULL : base64_encode_data_blob(talloc_tos(), mung);
 		DEBUG(10,("%s SAMR_FIELD_PARAMETERS: %s -> %s\n", l,
diff --git a/source/rpcclient/cmd_samr.c b/source/rpcclient/cmd_samr.c
index 2d20afe..9cc47d1 100644
--- a/source/rpcclient/cmd_samr.c
+++ b/source/rpcclient/cmd_samr.c
@@ -52,6 +52,16 @@ static void display_samr_user_info_16(struct samr_UserInfo16 *r)
 }
 
 /****************************************************************************
+ display samr_user_info_20 structure
+ ****************************************************************************/
+static void display_samr_user_info_20(struct samr_UserInfo20 *r)
+{
+	printf("\tRemote Dial :\n");
+	dump_data(0, (uint8_t *)r->parameters.array, r->parameters.length*2);
+}
+
+
+/****************************************************************************
  display samr_user_info_21 structure
  ****************************************************************************/
 static void display_samr_user_info_21(struct samr_UserInfo21 *r)
@@ -65,7 +75,8 @@ static void display_samr_user_info_21(struct samr_UserInfo21 *r)
 	printf("\tDescription :\t%s\n", r->description.string);
 	printf("\tWorkstations:\t%s\n", r->workstations.string);
 	printf("\tComment     :\t%s\n", r->comment.string);
-	printf("\tRemote Dial :\t%s\n", r->parameters.string);
+	printf("\tRemote Dial :\n");
+	dump_data(0, (uint8_t *)r->parameters.array, r->parameters.length*2);
 
 	printf("\tLogon Time               :\t%s\n",
 	       http_timestring(nt_time_to_unix(r->last_logon)));
@@ -374,6 +385,9 @@ static NTSTATUS cmd_samr_query_user(struct rpc_pipe_client *cli,
 	case 16:
 		display_samr_user_info_16(&info->info16);
 		break;
+	case 20:
+		display_samr_user_info_20(&info->info20);
+		break;
 	case 21:
 		display_samr_user_info_21(&info->info21);
 		break;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list