[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Sat Aug 13 05:50:02 MDT 2011


The branch, master has been updated
       via  813bdf4 ldb: Remove use after free in error case
       via  070b970 s4-provision Add support for fixing the DC rid to a particular value
       via  daa78ea s3-smbd Avoid races creating 'ncaclrpc dir' with epmd in a child process
       via  b51f973 s4-param Set szConfigFile even for s3 loadparm contexts
       via  305cb56 upgrade: Add missing bits for the s3 to s4 upgrade script
       via  64ec42d tests: Update test for s3 to s4 upgrade with two cases
       via  1c1f7df s3-passdb: Added python method to get_global_sam_sid
       via  e580f33 s3-passdb: Return dom_sid and guid with correct python types.
       via  a252e69 passdb: Move python wrapper for passdb in samba3 python package
       via  9a4a2b0 py-samba3: Create samba3 python package to hold other modules
       via  6d139d6 s3-param: Add python wrapper for s3 parameters
       via  6a18664 s3-passdb: Connect to specified samdb if location is provided, otherwise use default
       via  d7ab07e s3-passdb: Fix the error messages and return correct NTSTATUS
       via  ae65b97 s4-dsdb: Provide additional method to connect to specified database path
       via  8e4e408 s3-param: Make sure we have talloc stack frame before calling in s3 code
       via  7c9ecf3 param: Add smb.conf loading support to s3/s4 loadparm bridge
       via  11698a2 s4-dsdb ensure we honour the hash_values control, even for really odd hashes
       via  2d6e98e s4-dsdb Give a less worrying error message on failure to get a transaction
       via  93e8d3b s4-scripting Rename passdb upgrade routine to avoid conflict with upgradeprovision
       via  00364e4 s3-passdb Add support for pdb_add_sam_account() and password hashes to pdb_samba4
       via  2993113 s4-dsdb Add ability to force a particular SID in the upgrade case
       via  add8505 s3-passdb Make pdb_element_is_changed available to all passdb modules
       via  c5e41a2 s4-dsdb Add flag to set DSDB_BYPASS_PASSWORD_HASH control
       via  65e12c0 passdb: Allocate talloc stackframe before calling in pdb functions.
       via  ae9a327 passdb: Call with correct backend methods instead of default methods
       via  2e0ccc4 passdb: Added python wrapper to passdb
       via  08ccc6e passdb: Add a function to read secrets db from a specified path
       via  6f21f55 passdb: Add a function to expose loaded backend list.
       via  a1088d0 waf: Add SAMBA3_PYTHON context to build python wrappers in samba3
       via  4967b04 samba-tool: Remove gpo setacl command
      from  eeb0298 s3:smb2cli: pass more fields to smb2cli_req_create()/smb2cli_req_send()

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


- Log -----------------------------------------------------------------
commit 813bdf466d1e0262c7b4bdf98343451db08c60f6
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Sat Aug 13 13:42:04 2011 +1000

    ldb: Remove use after free in error case
    
    Autobuild-User: Andrew Bartlett <abartlet at samba.org>
    Autobuild-Date: Sat Aug 13 13:49:44 CEST 2011 on sn-devel-104

commit 070b970a9d0b4c490d652eb1c5aa5fb23cc7b6a6
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Sat Aug 13 13:32:18 2011 +1000

    s4-provision Add support for fixing the DC rid to a particular value
    
    This will allow an upgraded DC to keep its SID, while being upgraded
    to AD.  We also watch for the highest RID in the existing DB to set
    next_rid for other additional users.
    
    Andrew Bartlett

commit daa78ead19fcbfcd5aa169d96c11ab8df49efe4b
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Sat Aug 13 13:30:16 2011 +1000

    s3-smbd Avoid races creating 'ncaclrpc dir' with epmd in a child process

commit b51f97325b8ea330e20ee7c4bf673c4475dd0a0e
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Fri Aug 12 22:17:26 2011 +1000

    s4-param Set szConfigFile even for s3 loadparm contexts

commit 305cb567f4f14ef329efc4756a17483076d9270c
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Aug 12 11:37:57 2011 +1000

    upgrade: Add missing bits for the s3 to s4 upgrade script
    
    Use passdb backend to import/export users
    
    Remove unused options for upgrade_from_s3 command (--blank) and credentials options
    Config file is specified with -s/--configfile option and no need to specify as an argument.
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit 64ec42d64f0a6029b135c49cfeb8bc5c6f8cbdbe
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Aug 12 17:47:49 2011 +1000

    tests: Update test for s3 to s4 upgrade with two cases
    
    S3-member to S4-member and S3-dc to S4-dc
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit 1c1f7df956de9658a0bc4594af3202badbdaeeeb
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Aug 12 17:10:17 2011 +1000

    s3-passdb: Added python method to get_global_sam_sid
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit e580f33b131471b9fa70764d3fc395db592accd2
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Aug 12 17:09:19 2011 +1000

    s3-passdb: Return dom_sid and guid with correct python types.
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit a252e69db28c1e65fe1ba74ce5b6db7d34c2bcff
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Aug 12 16:20:11 2011 +1000

    passdb: Move python wrapper for passdb in samba3 python package

commit 9a4a2b0f0d1411c98194a838390862bff8c184dd
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Aug 12 16:19:06 2011 +1000

    py-samba3: Create samba3 python package to hold other modules
    
    This will include passdb and param.

commit 6d139d6b0f3d38be395626a7fb4e8d02151102ab
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Aug 12 15:48:03 2011 +1000

    s3-param: Add python wrapper for s3 parameters
    
    This provids a get_context() method to return s3 context as s4 context type.
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit 6a18664d511ac77bde3df040e3c95ffef385c186
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Aug 12 15:45:43 2011 +1000

    s3-passdb: Connect to specified samdb if location is provided, otherwise use default
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit d7ab07e86f421de1cb4dbd3905ec2567f0e34c1b
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Aug 12 15:44:39 2011 +1000

    s3-passdb: Fix the error messages and return correct NTSTATUS
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit ae65b971ac1492da53b1259d113f686504e570cd
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Aug 12 15:43:04 2011 +1000

    s4-dsdb: Provide additional method to connect to specified database path
    
    samdb_connect() now calls samdb_connect_url() with default "sam.ldb".
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit 8e4e408e3a96c0fb5540d2f9a99269c09226e4a4
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Aug 12 15:40:26 2011 +1000

    s3-param: Make sure we have talloc stack frame before calling in s3 code
    
    When loading parameters as s4 context in s3 code, ensure we have a
    talloc stack frame. This is required for python wrapping s3 params.

commit 7c9ecf35fa92395ce46d1410ae0b343f6dc24774
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Fri Aug 12 11:26:42 2011 +1000

    param: Add smb.conf loading support to s3/s4 loadparm bridge

commit 11698a287e2ca1e937a465225af033e269749eb3
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Thu Aug 11 15:50:54 2011 +1000

    s4-dsdb ensure we honour the hash_values control, even for really odd hashes

commit 2d6e98e5c8f44b20b1f071c34ff791e39d3bb052
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Thu Aug 11 15:49:37 2011 +1000

    s4-dsdb Give a less worrying error message on failure to get a transaction

commit 93e8d3b38185538e3549aee0ee4c1134118626c9
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Thu Aug 11 16:19:24 2011 +1000

    s4-scripting Rename passdb upgrade routine to avoid conflict with upgradeprovision

commit 00364e4e0d3d091e1b8cc9dd2b1b30eb84f2f085
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Thu Aug 11 15:47:01 2011 +1000

    s3-passdb Add support for pdb_add_sam_account() and password hashes to pdb_samba4
    
    This will help when using this as part of the Samba3 passdb -> Samba4
    ldb database upgrade script.
    
    Andrew Bartlett

commit 2993113a56032be89272a626a7ef4c436d73080a
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Thu Aug 11 15:46:26 2011 +1000

    s4-dsdb Add ability to force a particular SID in the upgrade case

commit add8505fde9d178b3a0dbb71a207485cdb8fc161
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Thu Aug 11 15:39:47 2011 +1000

    s3-passdb Make pdb_element_is_changed available to all passdb modules
    
    This will allow pdb_samba4 to use this
    
    Andrew Bartlett

commit c5e41a21dd2dad9b43b40b38f75cea0da67c2cce
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Thu Aug 11 16:14:36 2011 +1000

    s4-dsdb Add flag to set DSDB_BYPASS_PASSWORD_HASH control

commit 65e12c05012b714dc1060650419f72266bf5ad07
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Thu Aug 11 13:59:00 2011 +1000

    passdb: Allocate talloc stackframe before calling in pdb functions.

commit ae9a3274bc511a302ab52ec94b43b7a0abd84fe9
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Wed Aug 10 17:32:32 2011 +1000

    passdb: Call with correct backend methods instead of default methods
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit 2e0ccc47723e5117180a4ece8a260920fc66b2b8
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Wed Aug 10 13:53:43 2011 +1000

    passdb: Added python wrapper to passdb
    
     - Added python wrapper for samu structure.
    
     - Added python wrapper for passdb methods:
    
       domain_info(), getsampwnam(), getsampwsid(), create_user(),
       delete_user(), add_sam_account(), delete_sam_account(),
       update_sam_account(), rename_sam_account(), search_users()
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit 08ccc6ed5121dae8485328fc2ac8ad4f35db2729
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Wed Aug 10 13:50:26 2011 +1000

    passdb: Add a function to read secrets db from a specified path
    
    This allows to load secrets db from a different location. The original
    secrets_init() now calls secrets_init_path() with lp_private_dir().

commit 6f21f556c1e9a6df9f7dc00aa1e270ff91ffd850
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Wed Aug 10 13:46:34 2011 +1000

    passdb: Add a function to expose loaded backend list.
    
    This function is used in python wrapper to list available python backends.

commit a1088d08430bbf487c34236bbad367158621ecd9
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Wed Aug 10 13:43:18 2011 +1000

    waf: Add SAMBA3_PYTHON context to build python wrappers in samba3

commit 4967b04ada42d82acb1dfdade0f776ee7885f99d
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Wed Aug 3 15:09:19 2011 +1000

    samba-tool: Remove gpo setacl command

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

Summary of changes:
 buildtools/wafsamba/samba3.py                      |    5 +
 lib/ldb/ldb_tdb/ldb_tdb.c                          |    1 -
 source3/include/secrets.h                          |    1 +
 source3/param/loadparm_ctx.c                       |   13 +
 source3/param/pyparam.c                            |   87 +
 source3/passdb/passdb.c                            |   14 +-
 source3/passdb/pdb_get_set.c                       |   23 +
 source3/passdb/pdb_interface.c                     |   14 +-
 source3/passdb/pdb_ldap.c                          |   35 +-
 source3/passdb/pdb_samba4.c                        |  311 +++-
 source3/passdb/proto.h                             |    8 +-
 source3/passdb/py_passdb.c                         | 1638 ++++++++++++++++++++
 source3/passdb/secrets.c                           |   22 +-
 source3/passdb/wscript_build                       |    7 +
 source3/smbd/server.c                              |    9 +
 source3/wscript_build                              |    7 +
 source4/dsdb/common/util.c                         |    8 +
 source4/dsdb/common/util.h                         |    1 +
 source4/dsdb/common/util_samr.c                    |   19 +-
 source4/dsdb/samdb/ldb_modules/password_hash.c     |    6 +-
 source4/dsdb/samdb/samdb.c                         |   21 +-
 source4/param/loadparm.c                           |    4 +
 source4/rpc_server/samr/dcesrv_samr.c              |    3 +-
 source4/script/mks3param.pl                        |    1 +
 source4/scripting/python/samba/netcmd/gpo.py       |    5 -
 .../scripting/python/samba/provision/__init__.py   |   34 +-
 .../python/samba/{samba3.py => samba3/__init__.py} |   36 +-
 source4/scripting/python/samba/upgrade.py          |  110 +-
 source4/selftest/tests.py                          |    2 +-
 source4/setup/tests/blackbox_s3upgrade.sh          |   62 +
 source4/setup/upgrade_from_s3                      |   23 +-
 31 files changed, 2311 insertions(+), 219 deletions(-)
 create mode 100644 source3/param/pyparam.c
 create mode 100644 source3/passdb/py_passdb.c
 rename source4/scripting/python/samba/{samba3.py => samba3/__init__.py} (98%)
 create mode 100755 source4/setup/tests/blackbox_s3upgrade.sh


Changeset truncated at 500 lines:

diff --git a/buildtools/wafsamba/samba3.py b/buildtools/wafsamba/samba3.py
index e1411e1..b2a3655 100644
--- a/buildtools/wafsamba/samba3.py
+++ b/buildtools/wafsamba/samba3.py
@@ -110,3 +110,8 @@ def SAMBA3_BINARY(bld, name, *args, **kwargs):
 	s3_fix_kwargs(bld, kwargs)
 	return bld.SAMBA_BINARY(name, *args, **kwargs)
 Build.BuildContext.SAMBA3_BINARY = SAMBA3_BINARY
+
+def SAMBA3_PYTHON(bld, name, *args, **kwargs):
+    s3_fix_kwargs(bld, kwargs)
+    return bld.SAMBA_PYTHON(name, *args, **kwargs)
+Build.BuildContext.SAMBA3_PYTHON = SAMBA3_PYTHON
diff --git a/lib/ldb/ldb_tdb/ldb_tdb.c b/lib/ldb/ldb_tdb/ldb_tdb.c
index d111e01..f07a9d2 100644
--- a/lib/ldb/ldb_tdb/ldb_tdb.c
+++ b/lib/ldb/ldb_tdb/ldb_tdb.c
@@ -1511,7 +1511,6 @@ static int ltdb_connect(struct ldb_context *ldb, const char *url,
 
 	if (ltdb_cache_load(module) != 0) {
 		talloc_free(module);
-		talloc_free(ltdb);
 		return LDB_ERR_OPERATIONS_ERROR;
 	}
 
diff --git a/source3/include/secrets.h b/source3/include/secrets.h
index 4c23335..3e36f2e 100644
--- a/source3/include/secrets.h
+++ b/source3/include/secrets.h
@@ -81,6 +81,7 @@ struct afs_keyfile {
 
 /* The following definitions come from passdb/secrets.c  */
 
+bool secrets_init_path(const char *private_dir);
 bool secrets_init(void);
 struct db_context *secrets_db_ctx(void);
 void secrets_shutdown(void);
diff --git a/source3/param/loadparm_ctx.c b/source3/param/loadparm_ctx.c
index 7c59ca7..3aadda1 100644
--- a/source3/param/loadparm_ctx.c
+++ b/source3/param/loadparm_ctx.c
@@ -20,6 +20,18 @@
 #include "includes.h"
 #include "../source4/param/s3_param.h"
 
+static bool lp_load_for_s4_ctx(const char *filename)
+{
+	TALLOC_CTX *mem_ctx;
+	bool status;
+
+	mem_ctx = talloc_stackframe();
+	status =  lp_load(filename, false, false, false, false);
+	talloc_free(mem_ctx);
+
+	return status;
+}
+
 /* These are in the order that they appear in the s4 loadparm file.
  * All of the s4 loadparm functions should be here eventually, once
  * they are implemented in the s3 loadparm, have the same format (enum
@@ -33,6 +45,7 @@ static const struct loadparm_s3_context s3_fns =
 	.get_servicebynum = lp_servicebynum,
 	.get_default_loadparm_service = lp_default_loadparm_service,
 	.get_numservices = lp_numservices,
+	.load = lp_load_for_s4_ctx,
 	.set_cmdline = lp_set_cmdline,
 
 	.server_role = lp_server_role,
diff --git a/source3/param/pyparam.c b/source3/param/pyparam.c
new file mode 100644
index 0000000..ff234ac
--- /dev/null
+++ b/source3/param/pyparam.c
@@ -0,0 +1,87 @@
+/*
+   Unix SMB/CIFS implementation.
+   Samba utility functions
+   Copyright (C) Amitay Isaacs <amitay at gmail.com> 2011
+
+   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 <Python.h>
+#include "includes.h"
+#include "param/param.h"
+#include "param/loadparm.h"
+#include "lib/talloc/pytalloc.h"
+
+static PyTypeObject *loadparm_Type = NULL;
+
+void initparam(void);
+
+static PyObject *py_get_context(PyObject *self)
+{
+	PyObject *py_loadparm;
+	const struct loadparm_s3_context *s3_context;
+	const struct loadparm_context *s4_context;
+	TALLOC_CTX *mem_ctx;
+
+	mem_ctx = talloc_new(NULL);
+	if (mem_ctx == NULL) {
+		PyErr_NoMemory();
+		return NULL;
+	}
+
+	s3_context = loadparm_s3_context();
+
+	s4_context = loadparm_init_s3(mem_ctx, s3_context);
+	if (s4_context == NULL) {
+		PyErr_NoMemory();
+		return NULL;
+	}
+
+	py_loadparm = pytalloc_steal(loadparm_Type, discard_const_p(struct loadparm_context, s4_context));
+	if (py_loadparm == NULL) {
+		talloc_free(mem_ctx);
+		PyErr_NoMemory();
+		return NULL;
+	}
+
+	talloc_free(mem_ctx);
+
+	return py_loadparm;
+}
+
+static PyMethodDef pyparam_methods[] = {
+    { "get_context", (PyCFunction)py_get_context, METH_NOARGS,
+        "Returns LoadParm context." },
+    { NULL }
+};
+
+void initparam(void)
+{
+	PyObject *m, *mod;
+
+	m = Py_InitModule3("param", pyparam_methods, "Parsing and writing Samba3 configuration files.");
+	if (m == NULL)
+		return;
+
+	mod = PyImport_ImportModule("samba.param");
+	if (mod == NULL) {
+		return;
+	}
+
+	loadparm_Type = (PyTypeObject *)PyObject_GetAttrString(mod, "LoadParm");
+	Py_DECREF(mod);
+	if (loadparm_Type == NULL) {
+		return;
+	}
+}
diff --git a/source3/passdb/passdb.c b/source3/passdb/passdb.c
index faa608c..62dcb5d 100644
--- a/source3/passdb/passdb.c
+++ b/source3/passdb/passdb.c
@@ -146,7 +146,8 @@ static int count_commas(const char *str)
  attributes and a user SID.
 *********************************************************************/
 
-static NTSTATUS samu_set_unix_internal(struct samu *user, const struct passwd *pwd, bool create)
+static NTSTATUS samu_set_unix_internal(struct pdb_methods *methods,
+				       struct samu *user, const struct passwd *pwd, bool create)
 {
 	const char *guest_account = lp_guestaccount();
 	const char *domain = lp_netbios_name();
@@ -246,11 +247,11 @@ static NTSTATUS samu_set_unix_internal(struct samu *user, const struct passwd *p
 	   initialized and will fill in these fields later (such as from a 
 	   netr_SamInfo3 structure) */
 
-	if ( create && (pdb_capabilities() & PDB_CAP_STORE_RIDS)) {
+	if ( create && (methods->capabilities(methods) & PDB_CAP_STORE_RIDS)) {
 		uint32_t user_rid;
 		struct dom_sid user_sid;
 
-		if ( !pdb_new_rid( &user_rid ) ) {
+		if ( !methods->new_rid(methods, &user_rid) ) {
 			DEBUG(3, ("Could not allocate a new RID\n"));
 			return NT_STATUS_ACCESS_DENIED;
 		}
@@ -282,12 +283,13 @@ static NTSTATUS samu_set_unix_internal(struct samu *user, const struct passwd *p
 
 NTSTATUS samu_set_unix(struct samu *user, const struct passwd *pwd)
 {
-	return samu_set_unix_internal( user, pwd, False );
+	return samu_set_unix_internal( NULL, user, pwd, False );
 }
 
-NTSTATUS samu_alloc_rid_unix(struct samu *user, const struct passwd *pwd)
+NTSTATUS samu_alloc_rid_unix(struct pdb_methods *methods,
+			     struct samu *user, const struct passwd *pwd)
 {
-	return samu_set_unix_internal( user, pwd, True );
+	return samu_set_unix_internal( methods, user, pwd, True );
 }
 
 /**********************************************************
diff --git a/source3/passdb/pdb_get_set.c b/source3/passdb/pdb_get_set.c
index 4ff1380..d0d7317 100644
--- a/source3/passdb/pdb_get_set.c
+++ b/source3/passdb/pdb_get_set.c
@@ -1088,3 +1088,26 @@ uint32_t pdb_build_fields_present(struct samu *sampass)
 	/* value set to all for testing */
 	return 0x00ffffff;
 }
+
+/**********************************************************************
+ Helper function to determine for update_sam_account whether
+ we need LDAP modification.
+*********************************************************************/
+
+bool pdb_element_is_changed(const struct samu *sampass,
+			    enum pdb_elements element)
+{
+	return IS_SAM_CHANGED(sampass, element);
+}
+
+/**********************************************************************
+ Helper function to determine for update_sam_account whether
+ we need LDAP modification.
+ *********************************************************************/
+
+bool pdb_element_is_set_or_changed(const struct samu *sampass,
+				   enum pdb_elements element)
+{
+	return (IS_SAM_SET(sampass, element) ||
+		IS_SAM_CHANGED(sampass, element));
+}
diff --git a/source3/passdb/pdb_interface.c b/source3/passdb/pdb_interface.c
index c92b22a..44e7421 100644
--- a/source3/passdb/pdb_interface.c
+++ b/source3/passdb/pdb_interface.c
@@ -99,6 +99,12 @@ struct pdb_init_function_entry *pdb_find_backend_entry(const char *name)
 	return NULL;
 }
 
+const struct pdb_init_function_entry *pdb_get_backends(void)
+{
+	return backends;
+}
+
+
 /*
  * The event context for the passdb backend. I know this is a bad hack and yet
  * another static variable, but our pdb API is a global thing per
@@ -490,7 +496,7 @@ static NTSTATUS pdb_default_create_user(struct pdb_methods *methods,
 
 	/* we have a valid SID coming out of this call */
 
-	status = samu_alloc_rid_unix( sam_pass, pwd );
+	status = samu_alloc_rid_unix(methods, sam_pass, pwd);
 
 	TALLOC_FREE( pwd );
 
@@ -515,7 +521,7 @@ static NTSTATUS pdb_default_create_user(struct pdb_methods *methods,
 
 	pdb_set_acct_ctrl(sam_pass, acb_info, PDB_CHANGED);
 
-	status = pdb_add_sam_account(sam_pass);
+	status = methods->add_sam_account(methods, sam_pass);
 
 	TALLOC_FREE(sam_pass);
 
@@ -573,7 +579,9 @@ static NTSTATUS pdb_default_delete_user(struct pdb_methods *methods,
 	NTSTATUS status;
 	fstring username;
 
-	status = pdb_delete_sam_account(sam_acct);
+	memcache_flush(NULL, PDB_GETPWSID_CACHE);
+
+	status = methods->delete_sam_account(methods, sam_acct);
 	if (!NT_STATUS_IS_OK(status)) {
 		return status;
 	}
diff --git a/source3/passdb/pdb_ldap.c b/source3/passdb/pdb_ldap.c
index f8da0ff..74dccec 100644
--- a/source3/passdb/pdb_ldap.c
+++ b/source3/passdb/pdb_ldap.c
@@ -1942,17 +1942,6 @@ static NTSTATUS ldapsam_delete_sam_account(struct pdb_methods *my_methods,
 }
 
 /**********************************************************************
- Helper function to determine for update_sam_account whether
- we need LDAP modification.
-*********************************************************************/
-
-static bool element_is_changed(const struct samu *sampass,
-			       enum pdb_elements element)
-{
-	return IS_SAM_CHANGED(sampass, element);
-}
-
-/**********************************************************************
  Update struct samu.
 *********************************************************************/
 
@@ -1997,7 +1986,7 @@ static NTSTATUS ldapsam_update_sam_account(struct pdb_methods *my_methods, struc
 	DEBUG(4, ("ldapsam_update_sam_account: user %s to be modified has dn: %s\n", pdb_get_username(newpwd), dn));
 
 	if (!init_ldap_from_sam(ldap_state, entry, &mods, newpwd,
-				element_is_changed)) {
+				pdb_element_is_changed)) {
 		DEBUG(0, ("ldapsam_update_sam_account: init_ldap_from_sam failed!\n"));
 		TALLOC_FREE(dn);
 		if (mods != NULL)
@@ -2013,7 +2002,7 @@ static NTSTATUS ldapsam_update_sam_account(struct pdb_methods *my_methods, struc
 		return NT_STATUS_OK;
 	}
 
-	ret = ldapsam_modify_entry(my_methods,newpwd,dn,mods,LDAP_MOD_REPLACE, element_is_changed);
+	ret = ldapsam_modify_entry(my_methods,newpwd,dn,mods,LDAP_MOD_REPLACE, pdb_element_is_changed);
 
 	if (mods != NULL) {
 		ldap_mods_free(mods,True);
@@ -2133,18 +2122,6 @@ static NTSTATUS ldapsam_rename_sam_account(struct pdb_methods *my_methods,
 }
 
 /**********************************************************************
- Helper function to determine for update_sam_account whether
- we need LDAP modification.
- *********************************************************************/
-
-static bool element_is_set_or_changed(const struct samu *sampass,
-				      enum pdb_elements element)
-{
-	return (IS_SAM_SET(sampass, element) ||
-		IS_SAM_CHANGED(sampass, element));
-}
-
-/**********************************************************************
  Add struct samu to LDAP.
 *********************************************************************/
 
@@ -2194,7 +2171,7 @@ static NTSTATUS ldapsam_add_sam_account(struct pdb_methods *my_methods, struct s
 	ldap_msgfree(result);
 	result = NULL;
 
-	if (element_is_set_or_changed(newpwd, PDB_USERSID)) {
+	if (pdb_element_is_set_or_changed(newpwd, PDB_USERSID)) {
 		rc = ldapsam_get_ldap_user_by_sid(ldap_state,
 						  sid, &result);
 		if (rc == LDAP_SUCCESS) {
@@ -2330,7 +2307,7 @@ static NTSTATUS ldapsam_add_sam_account(struct pdb_methods *my_methods, struct s
 	}
 
 	if (!init_ldap_from_sam(ldap_state, entry, &mods, newpwd,
-				element_is_set_or_changed)) {
+				pdb_element_is_set_or_changed)) {
 		DEBUG(0, ("ldapsam_add_sam_account: init_ldap_from_sam failed!\n"));
 		if (mods != NULL) {
 			ldap_mods_free(mods, true);
@@ -2354,7 +2331,7 @@ static NTSTATUS ldapsam_add_sam_account(struct pdb_methods *my_methods, struct s
 			break;
 	}
 
-	ret = ldapsam_modify_entry(my_methods,newpwd,dn,mods,ldap_op, element_is_set_or_changed);
+	ret = ldapsam_modify_entry(my_methods,newpwd,dn,mods,ldap_op, pdb_element_is_set_or_changed);
 	if (!NT_STATUS_IS_OK(ret)) {
 		DEBUG(0,("ldapsam_add_sam_account: failed to modify/add user with uid = %s (dn = %s)\n",
 			 pdb_get_username(newpwd),dn));
@@ -5367,7 +5344,7 @@ static NTSTATUS ldapsam_create_user(struct pdb_methods *my_methods,
 		return NT_STATUS_UNSUCCESSFUL;
 	}
 
-	if (!init_ldap_from_sam(ldap_state, entry, &mods, user, element_is_set_or_changed)) {
+	if (!init_ldap_from_sam(ldap_state, entry, &mods, user, pdb_element_is_set_or_changed)) {
 		DEBUG(1,("ldapsam_create_user: Unable to fill user structs\n"));
 		return NT_STATUS_UNSUCCESSFUL;
 	}
diff --git a/source3/passdb/pdb_samba4.c b/source3/passdb/pdb_samba4.c
index 5848c23..ae38133 100644
--- a/source3/passdb/pdb_samba4.c
+++ b/source3/passdb/pdb_samba4.c
@@ -33,6 +33,7 @@
 #include "source4/auth/session.h"
 #include "source4/auth/system_session_proto.h"
 #include "source4/param/param.h"
+#include "source4/dsdb/common/util.h"
 
 struct pdb_samba4_state {
 	struct tevent_context *ev;
@@ -328,115 +329,224 @@ static bool pdb_samba4_add_time(struct ldb_message *msg,
 	return ldb_msg_add_fmt(msg, attrib, "%llu", (unsigned long long) nt_time);
 }
 
-/* Like in pdb_ldap(), this will need to be a function pointer when we
- * start to support 'adds' for migrations from samba3 passdb backends
- * to samba4 */
-static bool update_required(struct samu *sam, enum pdb_elements element)
-{
-	return (IS_SAM_CHANGED(sam, element));
-}
-
-static bool pdb_samba4_init_samba4_from_sam(struct pdb_samba4_state *state,
-					    struct ldb_message *existing,
-					    TALLOC_CTX *mem_ctx,
-					    struct ldb_message **pmods, 
-					    struct samu *sam)
+static int pdb_samba4_replace_by_sam(struct pdb_samba4_state *state,
+				     bool (*need_update)(const struct samu *,
+							 enum pdb_elements),
+				     struct ldb_dn *dn,
+				     struct samu *sam)
 {
 	int ret = LDB_SUCCESS;
 	const char *pw;
 	struct ldb_message *msg;
-
+	struct ldb_request *req;
+	uint32_t dsdb_flags = 0;
 	/* TODO: All fields :-) */
 
-	msg = ldb_msg_new(mem_ctx);
+	msg = ldb_msg_new(talloc_tos());
 	if (!msg) {
 		return false;
 	}
 
-	msg->dn = existing->dn;
+	msg->dn = dn;
+
+	/* build modify request */
+	ret = ldb_build_mod_req(&req, state->ldb, talloc_tos(), msg, NULL, NULL,
+				ldb_op_default_callback,
+				NULL);
+        if (ret != LDB_SUCCESS) {
+		talloc_free(msg);
+		return ret;
+        }
 
 	pw = pdb_get_plaintext_passwd(sam);
-	if (update_required(sam, PDB_PLAINTEXT_PW)) {
+	if (need_update(sam, PDB_PLAINTEXT_PW)) {
 		if (pw == NULL) {
-			ret = LDB_ERR_OPERATIONS_ERROR;
-			goto fail;
+			return LDB_ERR_OPERATIONS_ERROR;
 		}
 		
 		ret |= ldb_msg_add_string(msg, "clearTextPassword", pw);
+	} else {
+		bool changed_lm_pw = false;
+		bool changed_nt_pw = false;
+		bool changed_history = false;
+		if (need_update(sam, PDB_LMPASSWD)) {
+			struct ldb_val val;
+			val.data = pdb_get_lanman_passwd(sam);
+			if (!val.data) {
+				samdb_msg_add_delete(state->ldb, msg, msg,
+						     "dBCSPwd");
+			} else {
+				val.length = LM_HASH_LEN;
+				ret |= ldb_msg_add_value(msg, "dBCSPwd", &val, NULL);
+			}
+			changed_lm_pw = true;
+		}
+		if (need_update(sam, PDB_NTPASSWD)) {
+			struct ldb_val val;
+			val.data = pdb_get_lanman_passwd(sam);
+			if (!val.data) {
+				samdb_msg_add_delete(state->ldb, msg, msg,
+						     "unicodePwd");
+			} else {
+				val.length = NT_HASH_LEN;
+				ret |= ldb_msg_add_value(msg, "unicodePwd", &val, NULL);
+			}
+			changed_nt_pw = true;
+		}
+
+		/* Try to ensure we don't get out of sync */
+		if (changed_lm_pw && !changed_nt_pw) {
+			samdb_msg_add_delete(state->ldb, msg, msg,
+					     "unicodePwd");
+		} else if (changed_nt_pw && !changed_lm_pw) {
+			samdb_msg_add_delete(state->ldb, msg, msg,
+					     "dBCSPwd");
+		}
+		if (changed_lm_pw || changed_nt_pw) {
+			samdb_msg_add_delete(state->ldb, msg, msg,
+					     "supplementalCredentials");
+
+		}
+
+		/* If we set a plaintext password, the system will
+		 * force the pwdLastSet to now(), and it isn't worth
+		 * working around this for the real world use cases of
+		 * pdb_samba4 */
+		if (need_update(sam, PDB_PASSLASTSET)) {
+			ret |= pdb_samba4_add_time(msg, "pwdLastSet",
+						   pdb_get_pass_last_set_time(sam));
+		}


-- 
Samba Shared Repository


More information about the samba-cvs mailing list