[SCM] Samba Shared Repository - branch v3-2-test updated - initial-v3-2-unstable-914-g9e80b96

Volker Lendecke vl at samba.org
Wed Dec 26 18:37:08 GMT 2007


The branch, v3-2-test has been updated
       via  9e80b969fb40766de2c9b1a05d16bf4d4c6e46f7 (commit)
       via  8a8f2583b8bda22f65c7483dea54ac823ed1c0c3 (commit)
       via  514cf532248723e7f775dc5f8f2e6936e02b7a1c (commit)
       via  84af4fb65677cf137f14f57c8820c77c9d006d89 (commit)
       via  02f0b0bd393bd942fc934f251bd6afed8e5424b0 (commit)
      from  6e6ec0a563f8b7e3d4618ce60e776bcce53f40c4 (commit)

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


- Log -----------------------------------------------------------------
commit 9e80b969fb40766de2c9b1a05d16bf4d4c6e46f7
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Dec 26 17:58:55 2007 +0100

    Remove the sampwent interface

commit 8a8f2583b8bda22f65c7483dea54ac823ed1c0c3
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Dec 26 17:45:49 2007 +0100

    Convert pdbedit to use pdb_search_users

commit 514cf532248723e7f775dc5f8f2e6936e02b7a1c
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Dec 26 17:06:06 2007 +0100

    Properly destroy the pdb search object

commit 84af4fb65677cf137f14f57c8820c77c9d006d89
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Dec 25 00:04:39 2007 +0100

    smbpasswd_search_users

commit 02f0b0bd393bd942fc934f251bd6afed8e5424b0
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Dec 24 12:58:40 2007 +0100

    Add tdbsam_search_users

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

Summary of changes:
 source/include/passdb.h       |    9 +-
 source/passdb/pdb_interface.c |  123 +------------------
 source/passdb/pdb_ldap.c      |  102 ---------------
 source/passdb/pdb_smbpasswd.c |  190 +++++++++++++++++-----------
 source/passdb/pdb_tdb.c       |  280 ++++++++++++++++++++---------------------
 source/torture/pdbtest.c      |   18 ---
 source/utils/net_sam.c        |    2 +-
 source/utils/pdbedit.c        |  201 ++++++++++++++++++------------
 8 files changed, 375 insertions(+), 550 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/include/passdb.h b/source/include/passdb.h
index bb8a336..b72ec6b 100644
--- a/source/include/passdb.h
+++ b/source/include/passdb.h
@@ -242,20 +242,15 @@ struct pdb_search {
  * changed to version 14 to move lookup_rids and lookup_names to return
  * enum lsa_SidType rather than uint32.
  * Changed to 16 for access to the trusted domain passwords (obnox).
+ * Changed to 17, the sampwent interface is gone.
  */
 
-#define PASSDB_INTERFACE_VERSION 16
+#define PASSDB_INTERFACE_VERSION 17
 
 struct pdb_methods 
 {
 	const char *name; /* What name got this module */
 
-	NTSTATUS (*setsampwent)(struct pdb_methods *, bool update, uint32 acb_mask);
-	
-	void (*endsampwent)(struct pdb_methods *);
-	
-	NTSTATUS (*getsampwent)(struct pdb_methods *, struct samu *user);
-	
 	NTSTATUS (*getsampwnam)(struct pdb_methods *, struct samu *sam_acct, const char *username);
 	
 	NTSTATUS (*getsampwsid)(struct pdb_methods *, struct samu *sam_acct, const DOM_SID *sid);
diff --git a/source/passdb/pdb_interface.c b/source/passdb/pdb_interface.c
index 1989605..2102b57 100644
--- a/source/passdb/pdb_interface.c
+++ b/source/passdb/pdb_interface.c
@@ -208,33 +208,6 @@ static struct pdb_methods *pdb_get_methods(void)
 	return pdb_get_methods_reload(False);
 }
 
-/******************************************************************
- Backward compatibility functions for the original passdb interface
-*******************************************************************/
-
-bool pdb_setsampwent(bool update, uint16 acb_mask) 
-{
-	struct pdb_methods *pdb = pdb_get_methods();
-	return NT_STATUS_IS_OK(pdb->setsampwent(pdb, update, acb_mask));
-}
-
-void pdb_endsampwent(void) 
-{
-	struct pdb_methods *pdb = pdb_get_methods();
-	pdb->endsampwent(pdb);
-}
-
-bool pdb_getsampwent(struct samu *user) 
-{
-	struct pdb_methods *pdb = pdb_get_methods();
-
-	if ( !NT_STATUS_IS_OK(pdb->getsampwent(pdb, user) ) ) {
-		return False;
-	}
-
-	return True;
-}
-
 bool pdb_getsampwnam(struct samu *sam_acct, const char *username) 
 {
 	struct pdb_methods *pdb = pdb_get_methods();
@@ -1181,21 +1154,6 @@ static NTSTATUS pdb_default_update_login_attempts (struct pdb_methods *methods,
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-static NTSTATUS pdb_default_setsampwent(struct pdb_methods *methods, bool update, uint32 acb_mask)
-{
-	return NT_STATUS_NOT_IMPLEMENTED;
-}
-
-static NTSTATUS pdb_default_getsampwent(struct pdb_methods *methods, struct samu *user)
-{
-	return NT_STATUS_NOT_IMPLEMENTED;
-}
-
-static void pdb_default_endsampwent(struct pdb_methods *methods)
-{
-	return; /* NT_STATUS_NOT_IMPLEMENTED; */
-}
-
 static NTSTATUS pdb_default_get_account_policy(struct pdb_methods *methods, int policy_index, uint32 *value)
 {
 	return account_policy_get(policy_index, value) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;
@@ -1738,7 +1696,7 @@ static NTSTATUS pdb_default_lookup_names(struct pdb_methods *methods,
 }
 #endif
 
-static struct pdb_search *pdb_search_init(enum pdb_search_type type)
+struct pdb_search *pdb_search_init(enum pdb_search_type type)
 {
 	TALLOC_CTX *mem_ctx;
 	struct pdb_search *result;
@@ -1795,81 +1753,6 @@ static void fill_displayentry(TALLOC_CTX *mem_ctx, uint32 rid,
 		entry->description = "";
 }
 
-static bool user_search_in_progress = False;
-struct user_search {
-	uint16 acct_flags;
-};
-
-static bool next_entry_users(struct pdb_search *s,
-			     struct samr_displayentry *entry)
-{
-	struct user_search *state = (struct user_search *)s->private_data;
-	struct samu *user = NULL;
-
- next:
-	if ( !(user = samu_new( NULL )) ) {
-		DEBUG(0, ("next_entry_users: samu_new() failed!\n"));
-		return False;
-	}
-
-	if (!pdb_getsampwent(user)) {
-		TALLOC_FREE(user);
-		return False;
-	}
-
- 	if ((state->acct_flags != 0) &&
-	    ((pdb_get_acct_ctrl(user) & state->acct_flags) == 0)) {
-		TALLOC_FREE(user);
-		goto next;
-	}
-
-	fill_displayentry(s->mem_ctx, pdb_get_user_rid(user),
-			  pdb_get_acct_ctrl(user), pdb_get_username(user),
-			  pdb_get_fullname(user), pdb_get_acct_desc(user),
-			  entry);
-
-	TALLOC_FREE(user);
-	return True;
-}
-
-static void search_end_users(struct pdb_search *search)
-{
-	pdb_endsampwent();
-	user_search_in_progress = False;
-}
-
-static bool pdb_default_search_users(struct pdb_methods *methods,
-				     struct pdb_search *search,
-				     uint32 acct_flags)
-{
-	struct user_search *state;
-
-	if (user_search_in_progress) {
-		DEBUG(1, ("user search in progress\n"));
-		return False;
-	}
-
-	if (!pdb_setsampwent(False, acct_flags)) {
-		DEBUG(5, ("Could not start search\n"));
-		return False;
-	}
-
-	user_search_in_progress = True;
-
-	state = TALLOC_P(search->mem_ctx, struct user_search);
-	if (state == NULL) {
-		DEBUG(0, ("talloc failed\n"));
-		return False;
-	}
-
-	state->acct_flags = acct_flags;
-
-	search->private_data = state;
-	search->next_entry = next_entry_users;
-	search->search_end = search_end_users;
-	return True;
-}
-
 struct group_search {
 	GROUP_MAP *groups;
 	size_t num_groups, current_group;
@@ -2136,9 +2019,6 @@ NTSTATUS make_pdb_method( struct pdb_methods **methods )
 		return NT_STATUS_NO_MEMORY;
 	}
 
-	(*methods)->setsampwent = pdb_default_setsampwent;
-	(*methods)->endsampwent = pdb_default_endsampwent;
-	(*methods)->getsampwent = pdb_default_getsampwent;
 	(*methods)->getsampwnam = pdb_default_getsampwnam;
 	(*methods)->getsampwsid = pdb_default_getsampwsid;
 	(*methods)->create_user = pdb_default_create_user;
@@ -2180,7 +2060,6 @@ NTSTATUS make_pdb_method( struct pdb_methods **methods )
 	(*methods)->gid_to_sid = pdb_default_gid_to_sid;
 	(*methods)->sid_to_id = pdb_default_sid_to_id;
 
-	(*methods)->search_users = pdb_default_search_users;
 	(*methods)->search_groups = pdb_default_search_groups;
 	(*methods)->search_aliases = pdb_default_search_aliases;
 
diff --git a/source/passdb/pdb_ldap.c b/source/passdb/pdb_ldap.c
index bc912ad..b638219 100644
--- a/source/passdb/pdb_ldap.c
+++ b/source/passdb/pdb_ldap.c
@@ -1454,79 +1454,6 @@ static bool init_ldap_from_sam (struct ldapsam_privates *ldap_state,
 }
 
 /**********************************************************************
- Connect to LDAP server for password enumeration.
-*********************************************************************/
-
-static NTSTATUS ldapsam_setsampwent(struct pdb_methods *my_methods, bool update, uint32 acb_mask)
-{
-	struct ldapsam_privates *ldap_state = (struct ldapsam_privates *)my_methods->private_data;
-	int rc;
-	char *filter = NULL;
-	const char *suffix;
-	const char **attr_list;
-	bool machine_mask = False, user_mask = False;
-	NTSTATUS status = NT_STATUS_OK;
-	TALLOC_CTX *ctx = talloc_init("ldapsam_setsampwent");
-
-	if (!ctx) {
-		return NT_STATUS_NO_MEMORY;
-	}
-	filter = talloc_asprintf(ctx, "(&%s%s)", "(uid=%u)",
-		get_objclass_filter(ldap_state->schema_ver));
-	if (!filter) {
-		status = NT_STATUS_NO_MEMORY;
-		goto out;
-	}
-
-	filter = talloc_all_string_sub(ctx, filter, "%u", "*");
-	if (!filter) {
-		status = NT_STATUS_NO_MEMORY;
-		goto out;
-	}
-
-	machine_mask 	= ((acb_mask != 0) && (acb_mask & (ACB_WSTRUST|ACB_SVRTRUST|ACB_DOMTRUST)));
-	user_mask 	= ((acb_mask != 0) && (acb_mask & ACB_NORMAL));
-
-	if (machine_mask) {
-		suffix = lp_ldap_machine_suffix();
-	} else if (user_mask) {
-		suffix = lp_ldap_user_suffix();
-	} else {
-		suffix = lp_ldap_suffix();
-	}
-
-	DEBUG(10,("ldapsam_setsampwent: LDAP Query for acb_mask 0x%x will use suffix %s\n", 
-		acb_mask, suffix));
-
-	attr_list = get_userattr_list(NULL, ldap_state->schema_ver);
-	rc = smbldap_search(ldap_state->smbldap_state, suffix, LDAP_SCOPE_SUBTREE, filter, 
-			    attr_list, 0, &ldap_state->result);
-	TALLOC_FREE( attr_list );
-
-	if (rc != LDAP_SUCCESS) {
-		DEBUG(0, ("ldapsam_setsampwent: LDAP search failed: %s\n", ldap_err2string(rc)));
-		DEBUG(3, ("ldapsam_setsampwent: Query was: %s, %s\n", suffix, filter));
-		ldap_msgfree(ldap_state->result);
-		ldap_state->result = NULL;
-		status = NT_STATUS_UNSUCCESSFUL;
-		goto out;
-	}
-
-	DEBUG(2, ("ldapsam_setsampwent: %d entries in the base %s\n",
-		ldap_count_entries(ldap_state->smbldap_state->ldap_struct,
-		ldap_state->result), suffix));
-
-	ldap_state->entry = ldap_first_entry(ldap_state->smbldap_state->ldap_struct,
-				 ldap_state->result);
-	ldap_state->index = 0;
-
-  out:
-
-	TALLOC_FREE(ctx);
-	return status;
-}
-
-/**********************************************************************
  End enumeration of the LDAP password list.
 *********************************************************************/
 
@@ -1539,32 +1466,6 @@ static void ldapsam_endsampwent(struct pdb_methods *my_methods)
 	}
 }
 
-/**********************************************************************
-Get the next entry in the LDAP password database.
-*********************************************************************/
-
-static NTSTATUS ldapsam_getsampwent(struct pdb_methods *my_methods,
-				    struct samu *user)
-{
-	NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
-	struct ldapsam_privates *ldap_state =
-		(struct ldapsam_privates *)my_methods->private_data;
-	bool bret = False;
-
-	while (!bret) {
-		if (!ldap_state->entry)
-			return ret;
-		
-		ldap_state->index++;
-		bret = init_sam_from_ldap(ldap_state, user, ldap_state->entry);
-		
-		ldap_state->entry = ldap_next_entry(priv2ld(ldap_state),
-						    ldap_state->entry);	
-	}
-
-	return NT_STATUS_OK;
-}
-
 static void append_attr(TALLOC_CTX *mem_ctx, const char ***attr_list,
 			const char *new_attr)
 {
@@ -6172,9 +6073,6 @@ static NTSTATUS pdb_init_ldapsam_common(struct pdb_methods **pdb_method, const c
 
 	(*pdb_method)->name = "ldapsam";
 
-	(*pdb_method)->setsampwent = ldapsam_setsampwent;
-	(*pdb_method)->endsampwent = ldapsam_endsampwent;
-	(*pdb_method)->getsampwent = ldapsam_getsampwent;
 	(*pdb_method)->getsampwnam = ldapsam_getsampwnam;
 	(*pdb_method)->getsampwsid = ldapsam_getsampwsid;
 	(*pdb_method)->add_sam_account = ldapsam_add_sam_account;
diff --git a/source/passdb/pdb_smbpasswd.c b/source/passdb/pdb_smbpasswd.c
index 6a3bdb8..6cf54fb 100644
--- a/source/passdb/pdb_smbpasswd.c
+++ b/source/passdb/pdb_smbpasswd.c
@@ -1264,79 +1264,6 @@ static bool build_sam_account(struct smbpasswd_privates *smbpasswd_state,
  Functions to be implemented by the new passdb API 
  ****************************************************************/
 
-static NTSTATUS smbpasswd_setsampwent (struct pdb_methods *my_methods, bool update, uint32 acb_mask)
-{
-	struct smbpasswd_privates *smbpasswd_state = (struct smbpasswd_privates*)my_methods->private_data;
-	
-	smbpasswd_state->pw_file = startsmbfilepwent(smbpasswd_state->smbpasswd_file, 
-						       update ? PWF_UPDATE : PWF_READ, 
-						       &(smbpasswd_state->pw_file_lock_depth));
-				   
-	/* did we fail?  Should we try to create it? */
-	if (!smbpasswd_state->pw_file && update && errno == ENOENT) {
-		FILE *fp;
-		/* slprintf(msg_str,msg_str_len-1,
-		   "smbpasswd file did not exist - attempting to create it.\n"); */
-		DEBUG(0,("smbpasswd file did not exist - attempting to create it.\n"));
-		fp = sys_fopen(smbpasswd_state->smbpasswd_file, "w");
-		if (fp) {
-			fprintf(fp, "# Samba SMB password file\n");
-			fclose(fp);
-		}
-		
-		smbpasswd_state->pw_file = startsmbfilepwent(smbpasswd_state->smbpasswd_file, 
-							     update ? PWF_UPDATE : PWF_READ, 
-							     &(smbpasswd_state->pw_file_lock_depth));
-	}
-	
-	if (smbpasswd_state->pw_file != NULL)
-		return NT_STATUS_OK;
-	else
-		return NT_STATUS_UNSUCCESSFUL;  
-}
-
-static void smbpasswd_endsampwent (struct pdb_methods *my_methods)
-{
-	struct smbpasswd_privates *smbpasswd_state = (struct smbpasswd_privates*)my_methods->private_data;
-	endsmbfilepwent(smbpasswd_state->pw_file, &(smbpasswd_state->pw_file_lock_depth));
-}
- 
-/*****************************************************************
- ****************************************************************/
-
-static NTSTATUS smbpasswd_getsampwent(struct pdb_methods *my_methods, struct samu *user)
-{
-	NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
-	struct smbpasswd_privates *smbpasswd_state = (struct smbpasswd_privates*)my_methods->private_data;
-	struct smb_passwd *pw_buf=NULL;
-	bool done = False;
-
-	DEBUG(5,("pdb_getsampwent\n"));
-
-	if ( !user ) {
-		DEBUG(5,("pdb_getsampwent (smbpasswd): user is NULL\n"));
-		return nt_status;
-	}
-
-	while (!done) {
-		/* do we have an entry? */
-		pw_buf = getsmbfilepwent(smbpasswd_state, smbpasswd_state->pw_file);
-		if (pw_buf == NULL) 
-			return nt_status;
-
-		/* build the struct samu entry from the smb_passwd struct. 
-		   We loop in case the user in the pdb does not exist in 
-		   the local system password file */
-		if (build_sam_account(smbpasswd_state, user, pw_buf))
-			done = True;
-	}
-
-	DEBUG(5,("getsampwent (smbpasswd): done\n"));
-
-	/* success */
-	return NT_STATUS_OK;
-}
-
 /****************************************************************
  Search smbpasswd file by iterating over the entries.  Do not
  call getpwnam() for unix account information until we have found
@@ -1606,6 +1533,119 @@ static void free_private_data(void **vp)
 	/* No need to free any further, as it is talloc()ed */
 }
 
+struct smbpasswd_search_state {
+	uint32_t acct_flags;
+
+	struct samr_displayentry *entries;
+	uint32_t num_entries;
+	ssize_t array_size;
+	uint32_t current;
+};
+
+static void smbpasswd_search_end(struct pdb_search *search)
+{
+	struct smbpasswd_search_state *state = talloc_get_type_abort(
+		search->private_data, struct smbpasswd_search_state);
+	TALLOC_FREE(state);
+}
+
+static bool smbpasswd_search_next_entry(struct pdb_search *search,
+					struct samr_displayentry *entry)
+{
+	struct smbpasswd_search_state *state = talloc_get_type_abort(
+		search->private_data, struct smbpasswd_search_state);
+
+	if (state->current == state->num_entries) {
+		return false;
+	}
+
+	*entry = state->entries[state->current++];
+
+	return true;
+}
+
+static bool smbpasswd_search_users(struct pdb_methods *methods,
+				   struct pdb_search *search,
+				   uint32_t acct_flags)
+{
+	struct smbpasswd_privates *smbpasswd_state =
+		(struct smbpasswd_privates*)methods->private_data;
+
+	struct smbpasswd_search_state *search_state;
+	struct smb_passwd *pwd;
+	FILE *fp;
+
+	search_state = TALLOC_ZERO_P(search->mem_ctx,
+				     struct smbpasswd_search_state);
+	if (search_state == NULL) {
+		DEBUG(0, ("talloc failed\n"));
+		return false;
+	}
+	search_state->acct_flags = acct_flags;
+
+	fp = startsmbfilepwent(smbpasswd_state->smbpasswd_file, PWF_READ,
+			       &smbpasswd_state->pw_file_lock_depth);
+
+	if (fp == NULL) {
+		DEBUG(10, ("Unable to open smbpasswd file.\n"));
+		TALLOC_FREE(search_state);
+		return false;
+	}
+
+	while ((pwd = getsmbfilepwent(smbpasswd_state, fp)) != NULL) {
+		struct samr_displayentry entry;
+		struct samu *user;
+
+		if ((acct_flags != 0)
+		    && ((acct_flags & pwd->acct_ctrl) == 0)) {
+			continue;
+		}
+
+		user = samu_new(talloc_tos());
+		if (user == NULL) {
+			DEBUG(0, ("samu_new failed\n"));
+			break;
+		}
+
+		if (!build_sam_account(smbpasswd_state, user, pwd)) {
+			/* Already got debug msgs... */
+			break;
+		}
+
+		ZERO_STRUCT(entry);
+
+		entry.acct_flags = pdb_get_acct_ctrl(user);
+		sid_peek_rid(pdb_get_user_sid(user), &entry.rid);
+		entry.account_name = talloc_strdup(
+			search_state, pdb_get_username(user));
+		entry.fullname = talloc_strdup(
+			search_state, pdb_get_fullname(user));
+		entry.description = talloc_strdup(
+			search_state, pdb_get_acct_desc(user));


-- 
Samba Shared Repository


More information about the samba-cvs mailing list