[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha7-1098-g4afcde9

Volker Lendecke vlendec at samba.org
Mon Apr 20 06:28:15 GMT 2009


The branch, master has been updated
       via  4afcde91b9736df8ce03f91ec7ea34f1446933e6 (commit)
      from  62480385c1e551448e40b01fff8e9dee318c29c1 (commit)

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


- Log -----------------------------------------------------------------
commit 4afcde91b9736df8ce03f91ec7ea34f1446933e6
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Apr 19 22:58:09 2009 +0200

    Convert the domain handles to type-safe policy handles

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

Summary of changes:
 source3/rpc_server/srv_samr_nt.c |  480 ++++++++++++++++----------------------
 1 files changed, 197 insertions(+), 283 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/rpc_server/srv_samr_nt.c b/source3/rpc_server/srv_samr_nt.c
index 538feba..cc25dbb 100644
--- a/source3/rpc_server/srv_samr_nt.c
+++ b/source3/rpc_server/srv_samr_nt.c
@@ -52,6 +52,11 @@ struct samr_connect_info {
 	uint8_t dummy;
 };
 
+struct samr_domain_info {
+	struct dom_sid sid;
+	struct disp_info *disp_info;
+};
+
 typedef struct disp_info {
 	DOM_SID sid; /* identify which domain this is. */
 	struct pdb_search *users; /* querydispinfo 1 and 4 */
@@ -595,7 +600,7 @@ NTSTATUS _samr_OpenDomain(pipes_struct *p,
 			  struct samr_OpenDomain *r)
 {
 	struct samr_connect_info *cinfo;
-	struct    samr_info *info;
+	struct samr_domain_info *dinfo;
 	SEC_DESC *psd = NULL;
 	uint32    acc_granted;
 	uint32    des_access = r->in.access_mask;
@@ -632,14 +637,13 @@ NTSTATUS _samr_OpenDomain(pipes_struct *p,
 		return NT_STATUS_NO_SUCH_DOMAIN;
 	}
 
-	/* associate the domain SID with the (unique) handle. */
-	if ((info = get_samr_info_by_sid(p->mem_ctx, r->in.sid))==NULL)
-		return NT_STATUS_NO_MEMORY;
-	info->acc_granted = acc_granted;
-
-	/* get a (unique) handle.  open a policy on it. */
-	if (!create_policy_hnd(p, r->out.domain_handle, info))
-		return NT_STATUS_OBJECT_NAME_NOT_FOUND;
+	dinfo = policy_handle_create(p, r->out.domain_handle, acc_granted,
+				     struct samr_domain_info, &status);
+	if (!NT_STATUS_IS_OK(status)) {
+		return status;
+	}
+	dinfo->sid = *r->in.sid;
+	dinfo->disp_info = get_samr_dispinfo_by_sid(r->in.sid);
 
 	DEBUG(5,("_samr_OpenDomain: %d\n", __LINE__));
 
@@ -958,7 +962,7 @@ NTSTATUS _samr_EnumDomainUsers(pipes_struct *p,
 			       struct samr_EnumDomainUsers *r)
 {
 	NTSTATUS status;
-	struct samr_info *info = NULL;
+	struct samr_domain_info *dinfo;
 	int num_account;
 	uint32 enum_context = *r->in.resume_handle;
 	enum remote_arch_types ra_type = get_remote_arch();
@@ -968,20 +972,16 @@ NTSTATUS _samr_EnumDomainUsers(pipes_struct *p,
 	struct samr_SamArray *samr_array = NULL;
 	struct samr_SamEntry *samr_entries = NULL;
 
-	/* find the policy handle.  open a policy on it. */
-	if (!find_policy_by_hnd(p, r->in.domain_handle, (void **)(void *)&info))
-		return NT_STATUS_INVALID_HANDLE;
+	DEBUG(5,("_samr_EnumDomainUsers: %d\n", __LINE__));
 
-	status = access_check_samr_function(info->acc_granted,
-					    SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
-					    "_samr_EnumDomainUsers");
+	dinfo = policy_handle_find(p, r->in.domain_handle,
+				   SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS, NULL,
+				   struct samr_domain_info, &status);
 	if (!NT_STATUS_IS_OK(status)) {
 		return status;
 	}
 
-	DEBUG(5,("_samr_EnumDomainUsers: %d\n", __LINE__));
-
-	if (sid_check_is_builtin(&info->sid)) {
+	if (sid_check_is_builtin(&dinfo->sid)) {
 		/* No users in builtin. */
 		*r->out.resume_handle = *r->in.resume_handle;
 		DEBUG(5,("_samr_EnumDomainUsers: No users in BUILTIN\n"));
@@ -998,24 +998,24 @@ NTSTATUS _samr_EnumDomainUsers(pipes_struct *p,
 
 	/* AS ROOT !!!! */
 
-	if ((info->disp_info->enum_users != NULL) &&
-	    (info->disp_info->enum_acb_mask != r->in.acct_flags)) {
-		TALLOC_FREE(info->disp_info->enum_users);
+	if ((dinfo->disp_info->enum_users != NULL) &&
+	    (dinfo->disp_info->enum_acb_mask != r->in.acct_flags)) {
+		TALLOC_FREE(dinfo->disp_info->enum_users);
 	}
 
-	if (info->disp_info->enum_users == NULL) {
-		info->disp_info->enum_users = pdb_search_users(
-			info->disp_info, r->in.acct_flags);
-		info->disp_info->enum_acb_mask = r->in.acct_flags;
+	if (dinfo->disp_info->enum_users == NULL) {
+		dinfo->disp_info->enum_users = pdb_search_users(
+			dinfo->disp_info, r->in.acct_flags);
+		dinfo->disp_info->enum_acb_mask = r->in.acct_flags;
 	}
 
-	if (info->disp_info->enum_users == NULL) {
+	if (dinfo->disp_info->enum_users == NULL) {
 		/* END AS ROOT !!!! */
 		unbecome_root();
 		return NT_STATUS_ACCESS_DENIED;
 	}
 
-	num_account = pdb_search_entries(info->disp_info->enum_users,
+	num_account = pdb_search_entries(dinfo->disp_info->enum_users,
 					 enum_context, max_entries,
 					 &entries);
 
@@ -1044,7 +1044,7 @@ NTSTATUS _samr_EnumDomainUsers(pipes_struct *p,
 	}
 
 	/* Ensure we cache this enumeration. */
-	set_disp_info_cache_timeout(info->disp_info, DISP_INFO_CACHE_TIMEOUT);
+	set_disp_info_cache_timeout(dinfo->disp_info, DISP_INFO_CACHE_TIMEOUT);
 
 	DEBUG(5, ("_samr_EnumDomainUsers: %d\n", __LINE__));
 
@@ -1101,26 +1101,22 @@ NTSTATUS _samr_EnumDomainGroups(pipes_struct *p,
 				struct samr_EnumDomainGroups *r)
 {
 	NTSTATUS status;
-	struct samr_info *info = NULL;
+	struct samr_domain_info *dinfo;
 	struct samr_displayentry *groups;
 	uint32 num_groups;
 	struct samr_SamArray *samr_array = NULL;
 	struct samr_SamEntry *samr_entries = NULL;
 
-	/* find the policy handle.  open a policy on it. */
-	if (!find_policy_by_hnd(p, r->in.domain_handle, (void **)(void *)&info))
-		return NT_STATUS_INVALID_HANDLE;
-
-	status = access_check_samr_function(info->acc_granted,
-					    SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
-					    "_samr_EnumDomainGroups");
+	dinfo = policy_handle_find(p, r->in.domain_handle,
+				   SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS, NULL,
+				   struct samr_domain_info, &status);
 	if (!NT_STATUS_IS_OK(status)) {
 		return status;
 	}
 
 	DEBUG(5,("_samr_EnumDomainGroups: %d\n", __LINE__));
 
-	if (sid_check_is_builtin(&info->sid)) {
+	if (sid_check_is_builtin(&dinfo->sid)) {
 		/* No groups in builtin. */
 		*r->out.resume_handle = *r->in.resume_handle;
 		DEBUG(5,("_samr_EnumDomainGroups: No groups in BUILTIN\n"));
@@ -1136,22 +1132,22 @@ NTSTATUS _samr_EnumDomainGroups(pipes_struct *p,
 
 	become_root();
 
-	if (info->disp_info->groups == NULL) {
-		info->disp_info->groups = pdb_search_groups(info->disp_info);
+	if (dinfo->disp_info->groups == NULL) {
+		dinfo->disp_info->groups = pdb_search_groups(dinfo->disp_info);
 
-		if (info->disp_info->groups == NULL) {
+		if (dinfo->disp_info->groups == NULL) {
 			unbecome_root();
 			return NT_STATUS_ACCESS_DENIED;
 		}
 	}
 
-	num_groups = pdb_search_entries(info->disp_info->groups,
+	num_groups = pdb_search_entries(dinfo->disp_info->groups,
 					*r->in.resume_handle,
 					MAX_SAM_ENTRIES, &groups);
 	unbecome_root();
 
 	/* Ensure we cache this enumeration. */
-	set_disp_info_cache_timeout(info->disp_info, DISP_INFO_CACHE_TIMEOUT);
+	set_disp_info_cache_timeout(dinfo->disp_info, DISP_INFO_CACHE_TIMEOUT);
 
 	make_group_sam_entry_list(p->mem_ctx, &samr_entries,
 				  num_groups, groups);
@@ -1176,26 +1172,22 @@ NTSTATUS _samr_EnumDomainAliases(pipes_struct *p,
 				 struct samr_EnumDomainAliases *r)
 {
 	NTSTATUS status;
-	struct samr_info *info;
+	struct samr_domain_info *dinfo;
 	struct samr_displayentry *aliases;
 	uint32 num_aliases = 0;
 	struct samr_SamArray *samr_array = NULL;
 	struct samr_SamEntry *samr_entries = NULL;
 
-	/* find the policy handle.  open a policy on it. */
-	if (!find_policy_by_hnd(p, r->in.domain_handle, (void **)(void *)&info))
-		return NT_STATUS_INVALID_HANDLE;
-
-	DEBUG(5,("_samr_EnumDomainAliases: sid %s\n",
-		 sid_string_dbg(&info->sid)));
-
-	status = access_check_samr_function(info->acc_granted,
-					    SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
-					    "_samr_EnumDomainAliases");
+	dinfo = policy_handle_find(p, r->in.domain_handle,
+				   SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS, NULL,
+				   struct samr_domain_info, &status);
 	if (!NT_STATUS_IS_OK(status)) {
 		return status;
 	}
 
+	DEBUG(5,("_samr_EnumDomainAliases: sid %s\n",
+		 sid_string_dbg(&dinfo->sid)));
+
 	samr_array = TALLOC_ZERO_P(p->mem_ctx, struct samr_SamArray);
 	if (!samr_array) {
 		return NT_STATUS_NO_MEMORY;
@@ -1203,22 +1195,22 @@ NTSTATUS _samr_EnumDomainAliases(pipes_struct *p,
 
 	become_root();
 
-	if (info->disp_info->aliases == NULL) {
-		info->disp_info->aliases = pdb_search_aliases(
-			info->disp_info, &info->sid);
-		if (info->disp_info->aliases == NULL) {
+	if (dinfo->disp_info->aliases == NULL) {
+		dinfo->disp_info->aliases = pdb_search_aliases(
+			dinfo->disp_info, &dinfo->sid);
+		if (dinfo->disp_info->aliases == NULL) {
 			unbecome_root();
 			return NT_STATUS_ACCESS_DENIED;
 		}
 	}
 
-	num_aliases = pdb_search_entries(info->disp_info->aliases,
+	num_aliases = pdb_search_entries(dinfo->disp_info->aliases,
 					 *r->in.resume_handle,
 					 MAX_SAM_ENTRIES, &aliases);
 	unbecome_root();
 
 	/* Ensure we cache this enumeration. */
-	set_disp_info_cache_timeout(info->disp_info, DISP_INFO_CACHE_TIMEOUT);
+	set_disp_info_cache_timeout(dinfo->disp_info, DISP_INFO_CACHE_TIMEOUT);
 
 	make_group_sam_entry_list(p->mem_ctx, &samr_entries,
 				  num_aliases, aliases);
@@ -1441,7 +1433,7 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
 				struct samr_QueryDisplayInfo *r)
 {
 	NTSTATUS status;
-	struct samr_info *info = NULL;
+	struct samr_domain_info *dinfo;
 	uint32 struct_size=0x20; /* W2K always reply that, client doesn't care */
 
 	uint32 max_entries = r->in.max_entries;
@@ -1459,18 +1451,9 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
 
 	DEBUG(5,("_samr_QueryDisplayInfo: %d\n", __LINE__));
 
-	/* find the policy handle.  open a policy on it. */
-	if (!find_policy_by_hnd(p, r->in.domain_handle, (void **)(void *)&info))
-		return NT_STATUS_INVALID_HANDLE;
-
-	if (sid_check_is_builtin(&info->sid)) {
-		DEBUG(5,("_samr_QueryDisplayInfo: Nothing in BUILTIN\n"));
-		return NT_STATUS_OK;
-	}
-
-	status = access_check_samr_function(info->acc_granted,
-					    SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
-					    "_samr_QueryDisplayInfo");
+	dinfo = policy_handle_find(p, r->in.domain_handle,
+				   SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS, NULL,
+				   struct samr_domain_info, &status);
 	if (!NT_STATUS_IS_OK(status)) {
 		return status;
 	}
@@ -1535,10 +1518,10 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
 	switch (r->in.level) {
 	case 0x1:
 	case 0x4:
-		if (info->disp_info->users == NULL) {
-			info->disp_info->users = pdb_search_users(
-				info->disp_info, ACB_NORMAL);
-			if (info->disp_info->users == NULL) {
+		if (dinfo->disp_info->users == NULL) {
+			dinfo->disp_info->users = pdb_search_users(
+				dinfo->disp_info, ACB_NORMAL);
+			if (dinfo->disp_info->users == NULL) {
 				unbecome_root();
 				return NT_STATUS_ACCESS_DENIED;
 			}
@@ -1549,15 +1532,15 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
 				(unsigned  int)enum_context ));
 		}
 
-		num_account = pdb_search_entries(info->disp_info->users,
+		num_account = pdb_search_entries(dinfo->disp_info->users,
 						 enum_context, max_entries,
 						 &entries);
 		break;
 	case 0x2:
-		if (info->disp_info->machines == NULL) {
-			info->disp_info->machines = pdb_search_users(
-				info->disp_info, ACB_WSTRUST|ACB_SVRTRUST);
-			if (info->disp_info->machines == NULL) {
+		if (dinfo->disp_info->machines == NULL) {
+			dinfo->disp_info->machines = pdb_search_users(
+				dinfo->disp_info, ACB_WSTRUST|ACB_SVRTRUST);
+			if (dinfo->disp_info->machines == NULL) {
 				unbecome_root();
 				return NT_STATUS_ACCESS_DENIED;
 			}
@@ -1568,16 +1551,16 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
 				(unsigned  int)enum_context ));
 		}
 
-		num_account = pdb_search_entries(info->disp_info->machines,
+		num_account = pdb_search_entries(dinfo->disp_info->machines,
 						 enum_context, max_entries,
 						 &entries);
 		break;
 	case 0x3:
 	case 0x5:
-		if (info->disp_info->groups == NULL) {
-			info->disp_info->groups = pdb_search_groups(
-				info->disp_info);
-			if (info->disp_info->groups == NULL) {
+		if (dinfo->disp_info->groups == NULL) {
+			dinfo->disp_info->groups = pdb_search_groups(
+				dinfo->disp_info);
+			if (dinfo->disp_info->groups == NULL) {
 				unbecome_root();
 				return NT_STATUS_ACCESS_DENIED;
 			}
@@ -1588,7 +1571,7 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
 				(unsigned  int)enum_context ));
 		}
 
-		num_account = pdb_search_entries(info->disp_info->groups,
+		num_account = pdb_search_entries(dinfo->disp_info->groups,
 						 enum_context, max_entries,
 						 &entries);
 		break;
@@ -1645,7 +1628,7 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
 	}
 
 	/* Ensure we cache this enumeration. */
-	set_disp_info_cache_timeout(info->disp_info, DISP_INFO_CACHE_TIMEOUT);
+	set_disp_info_cache_timeout(dinfo->disp_info, DISP_INFO_CACHE_TIMEOUT);
 
 	DEBUG(5, ("_samr_QueryDisplayInfo: %d\n", __LINE__));
 
@@ -1770,25 +1753,20 @@ NTSTATUS _samr_QueryAliasInfo(pipes_struct *p,
 NTSTATUS _samr_LookupNames(pipes_struct *p,
 			   struct samr_LookupNames *r)
 {
+	struct samr_domain_info *dinfo;
 	NTSTATUS status;
 	uint32 *rid;
 	enum lsa_SidType *type;
 	int i;
 	int num_rids = r->in.num_names;
-	DOM_SID pol_sid;
-	uint32  acc_granted;
 	struct samr_Ids rids, types;
 	uint32_t num_mapped = 0;
 
 	DEBUG(5,("_samr_LookupNames: %d\n", __LINE__));
 
-	if (!get_lsa_policy_samr_sid(p, r->in.domain_handle, &pol_sid, &acc_granted, NULL)) {
-		return NT_STATUS_OBJECT_TYPE_MISMATCH;
-	}
-
-	status = access_check_samr_function(acc_granted,
-					    0, /* Don't know the acc_bits yet */
-					    "_samr_LookupNames");
+	dinfo = policy_handle_find(p, r->in.domain_handle,
+				   0 /* Don't know the acc_bits yet */, NULL,
+				   struct samr_domain_info, &status);
 	if (!NT_STATUS_IS_OK(status)) {
 		return status;
 	}
@@ -1805,7 +1783,7 @@ NTSTATUS _samr_LookupNames(pipes_struct *p,
 	NT_STATUS_HAVE_NO_MEMORY(type);
 
 	DEBUG(5,("_samr_LookupNames: looking name on SID %s\n",
-		 sid_string_dbg(&pol_sid)));
+		 sid_string_dbg(&dinfo->sid)));
 
 	for (i = 0; i < num_rids; i++) {
 
@@ -1814,7 +1792,7 @@ NTSTATUS _samr_LookupNames(pipes_struct *p,
 
 		rid[i] = 0xffffffff;
 
-		if (sid_check_is_builtin(&pol_sid)) {
+		if (sid_check_is_builtin(&dinfo->sid)) {
 			if (lookup_builtin_name(r->in.names[i].string,
 						&rid[i]))
 			{
@@ -2031,13 +2009,12 @@ static bool make_samr_lookup_rids(TALLOC_CTX *ctx, uint32 num_names,
 NTSTATUS _samr_LookupRids(pipes_struct *p,
 			  struct samr_LookupRids *r)
 {
+	struct samr_domain_info *dinfo;
 	NTSTATUS status;
 	const char **names;
 	enum lsa_SidType *attrs = NULL;
 	uint32 *wire_attrs = NULL;
-	DOM_SID pol_sid;
 	int num_rids = (int)r->in.num_rids;
-	uint32 acc_granted;
 	int i;
 	struct lsa_Strings names_array;
 	struct samr_Ids types_array;
@@ -2045,13 +2022,9 @@ NTSTATUS _samr_LookupRids(pipes_struct *p,
 
 	DEBUG(5,("_samr_LookupRids: %d\n", __LINE__));
 
-	/* find the policy handle.  open a policy on it. */
-	if (!get_lsa_policy_samr_sid(p, r->in.domain_handle, &pol_sid, &acc_granted, NULL))
-		return NT_STATUS_INVALID_HANDLE;
-
-	status = access_check_samr_function(acc_granted,
-					    0, /* Don't know the acc_bits yet */
-					    "_samr_LookupRids");
+	dinfo = policy_handle_find(p, r->in.domain_handle,
+				   0 /* Don't know the acc_bits yet */, NULL,
+				   struct samr_domain_info, &status);
 	if (!NT_STATUS_IS_OK(status)) {
 		return status;
 	}
@@ -2076,7 +2049,7 @@ NTSTATUS _samr_LookupRids(pipes_struct *p,
 	}
 
 	become_root();  /* lookup_sid can require root privs */
-	status = pdb_lookup_rids(&pol_sid, num_rids, r->in.rids,
+	status = pdb_lookup_rids(&dinfo->sid, num_rids, r->in.rids,
 				 names, attrs);
 	unbecome_root();
 
@@ -2117,7 +2090,8 @@ NTSTATUS _samr_OpenUser(pipes_struct *p,
 {
 	struct samu *sampass=NULL;
 	DOM_SID sid;
-	struct samr_info *info = NULL;
+	struct samr_domain_info *dinfo;
+	struct samr_info *info;
 	SEC_DESC *psd = NULL;
 	uint32    acc_granted;
 	uint32    des_access = r->in.access_mask;
@@ -2125,18 +2099,14 @@ NTSTATUS _samr_OpenUser(pipes_struct *p,
 	bool ret;
 	NTSTATUS nt_status;
 	SE_PRIV se_rights;
+	NTSTATUS status;
 
-	/* find the domain policy handle and get domain SID / access bits in the domain policy. */
-
-	if ( !get_lsa_policy_samr_sid(p, r->in.domain_handle, &sid, &acc_granted, NULL) )
-		return NT_STATUS_INVALID_HANDLE;
-
-	nt_status = access_check_samr_function(acc_granted,
-					       SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
-					       "_samr_OpenUser" );
-
-	if ( !NT_STATUS_IS_OK(nt_status) )
-		return nt_status;
+	dinfo = policy_handle_find(p, r->in.domain_handle,
+				   SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT, NULL,
+				   struct samr_domain_info, &status);
+	if (!NT_STATUS_IS_OK(status)) {
+		return status;
+	}
 
 	if ( !(sampass = samu_new( p->mem_ctx )) ) {
 		return NT_STATUS_NO_MEMORY;
@@ -2144,7 +2114,7 @@ NTSTATUS _samr_OpenUser(pipes_struct *p,
 
 	/* append the user's RID to it */
 
-	if (!sid_append_rid(&sid, r->in.rid))
+	if (!sid_compose(&sid, &dinfo->sid, r->in.rid))
 		return NT_STATUS_NO_SUCH_USER;
 
 	/* check if access can be granted as requested by client. */
@@ -2782,7 +2752,7 @@ NTSTATUS _samr_QueryDomainInfo(pipes_struct *p,
 			       struct samr_QueryDomainInfo *r)
 {
 	NTSTATUS status = NT_STATUS_OK;
-	struct samr_info *info = NULL;
+	struct samr_domain_info *dinfo;
 	union samr_DomainInfo *dom_info;
 	time_t u_expire, u_min_age;
 
@@ -2796,23 +2766,18 @@ NTSTATUS _samr_QueryDomainInfo(pipes_struct *p,
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list