[SCM] Samba Shared Repository - branch master updated

Günther Deschner gd at samba.org
Wed Jun 30 13:46:50 MDT 2010


The branch, master has been updated
       via  6961048... s4-smbtorture: in extended setvalue winreg test, reduce max random buffer length to 16 bytes.
       via  17ddefe... s3-docs: try to make "default case" explanation a little clearer.
       via  6625aad... s3-libsmb: move change_trust_account_password out of smbd into libsmb.
       via  e1c185d... s4-smbtorture: enable QueryMultipleValues{2} torture tests against samba3.
       via  2a4bd64... s3-winreg: implement _winreg_QueryMultipleValues().
       via  de0d9e0... s3-winreg: implement _winreg_QueryMultipleValues2().
       via  21869f5... s3-registry: add reg_querymultiplevalues() to reg_api.
       via  a329dd0... s4-smbtorture: add some more multiple_values_tests to RPC-WINREG.
      from  14f8953... s4:dsdb: move dsdb python tests from lib/ldb/ to dsdb/

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


- Log -----------------------------------------------------------------
commit 69610484872bb8c9d52cd1b12c56a3bf99be78ae
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jun 30 17:13:42 2010 +0200

    s4-smbtorture: in extended setvalue winreg test, reduce max random buffer length to 16 bytes.
    
    Guenther

commit 17ddefef8a3dd299fd318a9e3908396beba62cbb
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jun 30 13:25:28 2010 +0200

    s3-docs: try to make "default case" explanation a little clearer.
    
    Guenther

commit 6625aada8174d61f52d6ef22d49edefa15f4a9bb
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jun 30 12:10:55 2010 +0200

    s3-libsmb: move change_trust_account_password out of smbd into libsmb.
    
    Guenther

commit e1c185d07db69827435812227a392e711bc06db0
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jun 30 02:07:15 2010 +0200

    s4-smbtorture: enable QueryMultipleValues{2} torture tests against samba3.
    
    Guenther

commit 2a4bd64973252d87b34f90e14872285ed12135ed
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jun 30 16:31:46 2010 +0200

    s3-winreg: implement _winreg_QueryMultipleValues().
    
    Guenther

commit de0d9e0bff7d39c3f784112bd043095aeaa1042a
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jun 30 02:03:27 2010 +0200

    s3-winreg: implement _winreg_QueryMultipleValues2().
    
    Guenther

commit 21869f5ed00af5a05f1d109339cd8b725fcc7d61
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jun 30 02:02:43 2010 +0200

    s3-registry: add reg_querymultiplevalues() to reg_api.
    
    Guenther

commit a329dd02674010e673fbcc7acf369a19befb6738
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jun 30 17:13:14 2010 +0200

    s4-smbtorture: add some more multiple_values_tests to RPC-WINREG.
    
    Guenther

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

Summary of changes:
 docs-xml/manpages-3/smb.conf.5.xml |   10 ++--
 source3/Makefile.in                |    2 +-
 source3/include/proto.h            |    5 +-
 source3/include/registry.h         |    6 ++
 source3/libsmb/trusts_util.c       |   74 +++++++++++++++++++
 source3/registry/reg_api.c         |   50 +++++++++++++
 source3/rpc_server/srv_winreg_nt.c |  138 +++++++++++++++++++++++++++++++++---
 source3/smbd/change_trust_pw.c     |  102 --------------------------
 source4/torture/rpc/winreg.c       |   20 ++++--
 9 files changed, 280 insertions(+), 127 deletions(-)
 delete mode 100644 source3/smbd/change_trust_pw.c


Changeset truncated at 500 lines:

diff --git a/docs-xml/manpages-3/smb.conf.5.xml b/docs-xml/manpages-3/smb.conf.5.xml
index 5df579e..7423fc4 100644
--- a/docs-xml/manpages-3/smb.conf.5.xml
+++ b/docs-xml/manpages-3/smb.conf.5.xml
@@ -628,11 +628,11 @@ chmod 1770 /usr/local/samba/lib/usershares
 		<term>default case = upper/lower</term>
 		<listitem><para>
 		controls what the default case is for new filenames (ie. files that don't currently exist in the filesystem).
-		Default <emphasis>lower</emphasis>.  IMPORTANT NOTE: This option will be used to modify the case of
-		<emphasis>all</emphasis> incoming client filenames, not just new filenames if the options <smbconfoption
-		name="case sensitive">yes</smbconfoption>, <smbconfoption name="preserve case">No</smbconfoption>,
-		<smbconfoption name="short preserve case">No</smbconfoption> are set.  This change is needed as part of the
-		optimisations for directories containing large numbers of files.
+		Default <emphasis>lower</emphasis>.  IMPORTANT NOTE: As part of the optimizations for directories containing
+		large numbers of files, the following special case applies. If the options
+		<smbconfoption 	name="case sensitive">yes</smbconfoption>, <smbconfoption name="preserve case">No</smbconfoption>, and
+		<smbconfoption name="short preserve case">No</smbconfoption> are set, then the case of <emphasis>all</emphasis>
+		incoming client filenames, not just new filenames, will be modified. See additional notes below.
 		</para></listitem>
 		</varlistentry> 
 	
diff --git a/source3/Makefile.in b/source3/Makefile.in
index 07b07df..905ab4c 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -801,7 +801,7 @@ SMBD_OBJ_SRV = smbd/server_reload.o \
 	       smbd/process.o smbd/service.o smbd/error.o \
 	       printing/printfsp.o lib/sysquotas.o lib/sysquotas_linux.o \
 	       lib/sysquotas_xfs.o lib/sysquotas_4A.o \
-	       smbd/change_trust_pw.o smbd/fake_file.o \
+	       smbd/fake_file.o \
 	       smbd/quotas.o smbd/ntquotas.o $(AFS_OBJ) smbd/msdfs.o \
 	       $(AFS_SETTOKEN_OBJ) smbd/aio.o smbd/statvfs.o \
 	       smbd/dmapi.o smbd/signing.o \
diff --git a/source3/include/proto.h b/source3/include/proto.h
index a654495..28feec3 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -3256,6 +3256,7 @@ NTSTATUS trust_pw_find_change_and_store_it(struct rpc_pipe_client *cli,
 bool enumerate_domain_trusts( TALLOC_CTX *mem_ctx, const char *domain,
                                      char ***domain_names, uint32 *num_domains,
 				     struct dom_sid **sids );
+NTSTATUS change_trust_account_password( const char *domain, const char *remote_machine);
 
 /* The following definitions come from libsmb/unexpected.c  */
 
@@ -5378,10 +5379,6 @@ struct blocking_lock_record *blocking_lock_cancel_smb1(files_struct *fsp,
 			unsigned char locktype,
                         NTSTATUS err);
 
-/* The following definitions come from smbd/change_trust_pw.c  */
-
-NTSTATUS change_trust_account_password( const char *domain, const char *remote_machine);
-
 /* The following definitions come from smbd/close.c  */
 
 void set_close_write_time(struct files_struct *fsp, struct timespec ts);
diff --git a/source3/include/registry.h b/source3/include/registry.h
index 703176f..00c27cf 100644
--- a/source3/include/registry.h
+++ b/source3/include/registry.h
@@ -163,6 +163,12 @@ WERROR reg_enumvalue(TALLOC_CTX *mem_ctx, struct registry_key *key,
 		     uint32 idx, char **pname, struct registry_value **pval);
 WERROR reg_queryvalue(TALLOC_CTX *mem_ctx, struct registry_key *key,
 		      const char *name, struct registry_value **pval);
+WERROR reg_querymultiplevalues(TALLOC_CTX *mem_ctx,
+			       struct registry_key *key,
+			       uint32_t num_names,
+			       const char **names,
+			       uint32_t *pnum_vals,
+			       struct registry_value **pvals);
 WERROR reg_queryinfokey(struct registry_key *key, uint32_t *num_subkeys,
 			uint32_t *max_subkeylen, uint32_t *max_subkeysize,
 			uint32_t *num_values, uint32_t *max_valnamelen,
diff --git a/source3/libsmb/trusts_util.c b/source3/libsmb/trusts_util.c
index 3a2d6d7..2daacec 100644
--- a/source3/libsmb/trusts_util.c
+++ b/source3/libsmb/trusts_util.c
@@ -23,6 +23,7 @@
 #include "../librpc/gen_ndr/cli_lsa.h"
 #include "rpc_client/cli_lsarpc.h"
 #include "rpc_client/cli_netlogon.h"
+#include "../librpc/gen_ndr/ndr_netlogon.h"
 
 /*********************************************************
  Change the domain password on the PDC.
@@ -222,3 +223,76 @@ done:
 
 	return NT_STATUS_IS_OK(result);
 }
+
+NTSTATUS change_trust_account_password( const char *domain, const char *remote_machine)
+{
+	NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
+	struct sockaddr_storage pdc_ss;
+	fstring dc_name;
+	struct cli_state *cli = NULL;
+	struct rpc_pipe_client *netlogon_pipe = NULL;
+
+	DEBUG(5,("change_trust_account_password: Attempting to change trust account password in domain %s....\n",
+		domain));
+
+	if (remote_machine == NULL || !strcmp(remote_machine, "*")) {
+		/* Use the PDC *only* for this */
+
+		if ( !get_pdc_ip(domain, &pdc_ss) ) {
+			DEBUG(0,("Can't get IP for PDC for domain %s\n", domain));
+			goto failed;
+		}
+
+		if ( !name_status_find( domain, 0x1b, 0x20, &pdc_ss, dc_name) )
+			goto failed;
+	} else {
+		/* supoport old deprecated "smbpasswd -j DOMAIN -r MACHINE" behavior */
+		fstrcpy( dc_name, remote_machine );
+	}
+
+	/* if this next call fails, then give up.  We can't do
+	   password changes on BDC's  --jerry */
+
+	if (!NT_STATUS_IS_OK(cli_full_connection(&cli, global_myname(), dc_name,
+					   NULL, 0,
+					   "IPC$", "IPC",
+					   "", "",
+					   "", 0, Undefined, NULL))) {
+		DEBUG(0,("modify_trust_password: Connection to %s failed!\n", dc_name));
+		nt_status = NT_STATUS_UNSUCCESSFUL;
+		goto failed;
+	}
+
+	/*
+	 * Ok - we have an anonymous connection to the IPC$ share.
+	 * Now start the NT Domain stuff :-).
+	 */
+
+	/* Shouldn't we open this with schannel ? JRA. */
+
+	nt_status = cli_rpc_pipe_open_noauth(
+		cli, &ndr_table_netlogon.syntax_id, &netlogon_pipe);
+	if (!NT_STATUS_IS_OK(nt_status)) {
+		DEBUG(0,("modify_trust_password: unable to open the domain client session to machine %s. Error was : %s.\n",
+			dc_name, nt_errstr(nt_status)));
+		cli_shutdown(cli);
+		cli = NULL;
+		goto failed;
+	}
+
+	nt_status = trust_pw_find_change_and_store_it(
+		netlogon_pipe, netlogon_pipe, domain);
+
+	cli_shutdown(cli);
+	cli = NULL;
+
+failed:
+	if (!NT_STATUS_IS_OK(nt_status)) {
+		DEBUG(0,("%s : change_trust_account_password: Failed to change password for domain %s.\n",
+			current_timestring(talloc_tos(), False), domain));
+	}
+	else
+		DEBUG(5,("change_trust_account_password: sucess!\n"));
+
+	return nt_status;
+}
diff --git a/source3/registry/reg_api.c b/source3/registry/reg_api.c
index 79b9a1e..1954fb5 100644
--- a/source3/registry/reg_api.c
+++ b/source3/registry/reg_api.c
@@ -402,6 +402,56 @@ WERROR reg_queryvalue(TALLOC_CTX *mem_ctx, struct registry_key *key,
 	return WERR_BADFILE;
 }
 
+WERROR reg_querymultiplevalues(TALLOC_CTX *mem_ctx,
+			       struct registry_key *key,
+			       uint32_t num_names,
+			       const char **names,
+			       uint32_t *pnum_vals,
+			       struct registry_value **pvals)
+{
+	WERROR err;
+	uint32_t i, n, found = 0;
+	struct registry_value *vals;
+
+	if (num_names == 0) {
+		return WERR_OK;
+	}
+
+	if (!(key->key->access_granted & KEY_QUERY_VALUE)) {
+		return WERR_ACCESS_DENIED;
+	}
+
+	if (!(W_ERROR_IS_OK(err = fill_value_cache(key)))) {
+		return err;
+	}
+
+	vals = talloc_zero_array(mem_ctx, struct registry_value, num_names);
+	if (vals == NULL) {
+		return WERR_NOMEM;
+	}
+
+	for (n=0; n < num_names; n++) {
+		for (i=0; i < regval_ctr_numvals(key->values); i++) {
+			struct regval_blob *blob;
+			blob = regval_ctr_specific_value(key->values, i);
+			if (strequal(regval_name(blob), names[n])) {
+				struct registry_value *v;
+				err = reg_enumvalue(mem_ctx, key, i, NULL, &v);
+				if (!W_ERROR_IS_OK(err)) {
+					return err;
+				}
+				vals[n] = *v;
+				found++;
+			}
+		}
+	}
+
+	*pvals = vals;
+	*pnum_vals = found;
+
+	return WERR_OK;
+}
+
 WERROR reg_queryinfokey(struct registry_key *key, uint32_t *num_subkeys,
 			uint32_t *max_subkeylen, uint32_t *max_subkeysize, 
 			uint32_t *num_values, uint32_t *max_valnamelen, 
diff --git a/source3/rpc_server/srv_winreg_nt.c b/source3/rpc_server/srv_winreg_nt.c
index 28d5ac9..1cf0903 100644
--- a/source3/rpc_server/srv_winreg_nt.c
+++ b/source3/rpc_server/srv_winreg_nt.c
@@ -968,26 +968,144 @@ WERROR _winreg_NotifyChangeKeyValue(pipes_struct *p, struct winreg_NotifyChangeK
  _winreg_QueryMultipleValues
  ********************************************************************/
 
-WERROR _winreg_QueryMultipleValues(pipes_struct *p, struct winreg_QueryMultipleValues *r)
+WERROR _winreg_QueryMultipleValues(pipes_struct *p,
+				   struct winreg_QueryMultipleValues *r)
 {
-	/* fill in your code here if you think this call should
-	   do anything */
+	struct winreg_QueryMultipleValues2 r2;
+	uint32_t needed;
+
+	r2.in.key_handle	= r->in.key_handle;
+	r2.in.values_in		= r->in.values_in;
+	r2.in.num_values	= r->in.num_values;
+	r2.in.offered		= r->in.buffer_size;
+	r2.in.buffer		= r->in.buffer;
+	r2.out.values_out	= r->out.values_out;
+	r2.out.needed		= &needed;
+	r2.out.buffer		= r->out.buffer;
+
+	return _winreg_QueryMultipleValues2(p, &r2);
+}
 
-	p->rng_fault_state = True;
-	return WERR_NOT_SUPPORTED;
+/*******************************************************************
+ ********************************************************************/
+
+static WERROR construct_multiple_entry(TALLOC_CTX *mem_ctx,
+				       const char *valuename,
+				       uint32_t value_length,
+				       uint32_t offset,
+				       enum winreg_Type type,
+				       struct QueryMultipleValue *r)
+{
+	r->ve_valuename = talloc_zero(mem_ctx, struct winreg_ValNameBuf);
+	if (r->ve_valuename == NULL) {
+		return WERR_NOMEM;
+	}
+
+	r->ve_valuename->name = talloc_strdup(r->ve_valuename, valuename ? valuename : "");
+	if (r->ve_valuename->name == NULL) {
+		return WERR_NOMEM;
+	}
+
+	r->ve_valuename->size = strlen_m_term(r->ve_valuename->name)*2;
+	r->ve_valuelen = value_length;
+	r->ve_valueptr = offset;
+	r->ve_type = type;
+
+	return WERR_OK;
 }
 
 /*******************************************************************
  _winreg_QueryMultipleValues2
  ********************************************************************/
 
-WERROR _winreg_QueryMultipleValues2(pipes_struct *p, struct winreg_QueryMultipleValues2 *r)
+WERROR _winreg_QueryMultipleValues2(pipes_struct *p,
+				    struct winreg_QueryMultipleValues2 *r)
 {
-	/* fill in your code here if you think this call should
-	   do anything */
+	struct registry_key *regkey = find_regkey_by_hnd(p, r->in.key_handle);
+	struct registry_value *vals = NULL;
+	const char **names = NULL;
+	uint32_t offset = 0, num_vals = 0;
+	DATA_BLOB result;
+	int i;
+	WERROR err;
 
-	p->rng_fault_state = True;
-	return WERR_NOT_SUPPORTED;
+	if (!regkey) {
+		return WERR_BADFID;
+	}
+
+	names = talloc_zero_array(p->mem_ctx, const char *, r->in.num_values);
+	if (names == NULL) {
+		return WERR_NOMEM;
+	}
+
+	for (i=0; i < r->in.num_values; i++) {
+		if (r->in.values_in[i].ve_valuename &&
+		    r->in.values_in[i].ve_valuename->name) {
+			names[i] = talloc_strdup(names,
+				r->in.values_in[i].ve_valuename->name);
+			if (names[i] == NULL) {
+				return WERR_NOMEM;
+			}
+		}
+	}
+
+	err = reg_querymultiplevalues(p->mem_ctx, regkey,
+				      r->in.num_values, names,
+				      &num_vals, &vals);
+	if (!W_ERROR_IS_OK(err)) {
+		return err;
+	}
+
+	result = data_blob_talloc(p->mem_ctx, NULL, 0);
+
+	for (i=0; i < r->in.num_values; i++) {
+		const char *valuename = NULL;
+		DATA_BLOB blob = data_blob_null;
+
+		if (vals[i].type != REG_NONE) {
+			err = registry_push_value(p->mem_ctx, &vals[i], &blob);
+			if (!W_ERROR_IS_OK(err)) {
+				return err;
+			}
+
+			if (!data_blob_append(p->mem_ctx, &result,
+					      blob.data, blob.length)) {
+				return WERR_NOMEM;
+			}
+		}
+
+		if (r->in.values_in[i].ve_valuename &&
+		    r->in.values_in[i].ve_valuename->name) {
+			valuename = r->in.values_in[i].ve_valuename->name;
+		}
+
+		err = construct_multiple_entry(r->out.values_out,
+					       valuename,
+					       blob.length,
+					       offset,
+					       vals[i].type,
+					       &r->out.values_out[i]);
+		if (!W_ERROR_IS_OK(err)) {
+			return err;
+		}
+
+		offset += blob.length;
+	}
+
+	*r->out.needed = result.length;
+
+	if (r->in.num_values != num_vals) {
+		return WERR_BADFILE;
+	}
+
+	if (*r->in.offered >= *r->out.needed) {
+		if (r->out.buffer) {
+			memcpy(r->out.buffer, result.data, MIN(result.length, *r->in.offered));
+		}
+		return WERR_OK;
+	} else {
+		return WERR_MORE_DATA;
+	}
 }
 
 /*******************************************************************
diff --git a/source3/smbd/change_trust_pw.c b/source3/smbd/change_trust_pw.c
deleted file mode 100644
index d02de7a..0000000
--- a/source3/smbd/change_trust_pw.c
+++ /dev/null
@@ -1,102 +0,0 @@
-/* 
- *  Unix SMB/CIFS implementation.
- *  Periodic Trust account password changing.
- *  Copyright (C) Andrew Tridgell              1992-1997,
- *  Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
- *  Copyright (C) Paul Ashton                       1997.
- *  Copyright (C) Jeremy Allison                    1998.
- *  Copyright (C) Andrew Bartlett                   2001.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *  
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *  
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "includes.h"
-#include "../librpc/gen_ndr/ndr_netlogon.h"
-
-/************************************************************************
- Change the trust account password for a domain.
-************************************************************************/
-
-NTSTATUS change_trust_account_password( const char *domain, const char *remote_machine)
-{
-	NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
-	struct sockaddr_storage pdc_ss;
-	fstring dc_name;
-	struct cli_state *cli = NULL;
-	struct rpc_pipe_client *netlogon_pipe = NULL;
-
-	DEBUG(5,("change_trust_account_password: Attempting to change trust account password in domain %s....\n",
-		domain));
-
-	if (remote_machine == NULL || !strcmp(remote_machine, "*")) {
-		/* Use the PDC *only* for this */
-	
-		if ( !get_pdc_ip(domain, &pdc_ss) ) {
-			DEBUG(0,("Can't get IP for PDC for domain %s\n", domain));
-			goto failed;
-		}
-
-		if ( !name_status_find( domain, 0x1b, 0x20, &pdc_ss, dc_name) )
-			goto failed;
-	} else {
-		/* supoport old deprecated "smbpasswd -j DOMAIN -r MACHINE" behavior */
-		fstrcpy( dc_name, remote_machine );
-	}
-	
-	/* if this next call fails, then give up.  We can't do
-	   password changes on BDC's  --jerry */
-	   
-	if (!NT_STATUS_IS_OK(cli_full_connection(&cli, global_myname(), dc_name, 
-					   NULL, 0,
-					   "IPC$", "IPC",  
-					   "", "",
-					   "", 0, Undefined, NULL))) {
-		DEBUG(0,("modify_trust_password: Connection to %s failed!\n", dc_name));
-		nt_status = NT_STATUS_UNSUCCESSFUL;
-		goto failed;
-	}
-      
-	/*
-	 * Ok - we have an anonymous connection to the IPC$ share.
-	 * Now start the NT Domain stuff :-).
-	 */
-
-	/* Shouldn't we open this with schannel ? JRA. */
-
-	nt_status = cli_rpc_pipe_open_noauth(
-		cli, &ndr_table_netlogon.syntax_id, &netlogon_pipe);
-	if (!NT_STATUS_IS_OK(nt_status)) {
-		DEBUG(0,("modify_trust_password: unable to open the domain client session to machine %s. Error was : %s.\n", 
-			dc_name, nt_errstr(nt_status)));
-		cli_shutdown(cli);
-		cli = NULL;
-		goto failed;
-	}
-
-	nt_status = trust_pw_find_change_and_store_it(
-		netlogon_pipe, netlogon_pipe, domain);
-  
-	cli_shutdown(cli);
-	cli = NULL;
-	
-failed:
-	if (!NT_STATUS_IS_OK(nt_status)) {
-		DEBUG(0,("%s : change_trust_account_password: Failed to change password for domain %s.\n", 
-			current_timestring(talloc_tos(), False), domain));
-	}
-	else
-		DEBUG(5,("change_trust_account_password: sucess!\n"));
-  
-	return nt_status;
-}
diff --git a/source4/torture/rpc/winreg.c b/source4/torture/rpc/winreg.c
index 0960440..92404d3 100644
--- a/source4/torture/rpc/winreg.c
+++ b/source4/torture/rpc/winreg.c
@@ -2279,7 +2279,7 @@ static bool test_SetValue_extended(struct dcerpc_binding_handle *b,
 	torture_comment(tctx, "Testing SetValue (extended formats)\n");
 
 	for (t=0; t < ARRAY_SIZE(types); t++) {
-	for (l=0; l < 32; l++) {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list