⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 srv_lsa_nt.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 4 页
字号:
NTSTATUS _lsa_open_policy2(pipes_struct *p, LSA_Q_OPEN_POL2 *q_u, LSA_R_OPEN_POL2 *r_u){	struct lsa_info *info;	SEC_DESC *psd = NULL;	size_t sd_size;	uint32 des_access=q_u->des_access;	uint32 acc_granted;	NTSTATUS status;	/* map the generic bits to the lsa policy ones */	se_map_generic(&des_access, &lsa_generic_mapping);	/* get the generic lsa policy SD until we store it */	lsa_get_generic_sd(p->mem_ctx, &psd, &sd_size);	if(!se_access_check(psd, p->pipe_user.nt_user_token, des_access, &acc_granted, &status)) {		if (geteuid() != 0) {			return status;		}		DEBUG(4,("ACCESS should be DENIED (granted: %#010x;  required: %#010x)\n",			 acc_granted, des_access));		DEBUGADD(4,("but overwritten by euid == 0\n"));	}	/* This is needed for lsa_open_account and rpcclient .... :-) */	if (geteuid() == 0)		acc_granted = POLICY_ALL_ACCESS;	/* associate the domain SID with the (unique) handle. */	if ((info = SMB_MALLOC_P(struct lsa_info)) == NULL)		return NT_STATUS_NO_MEMORY;	ZERO_STRUCTP(info);	sid_copy(&info->sid,get_global_sam_sid());	info->access = acc_granted;	/* set up the LSA QUERY INFO response */	if (!create_policy_hnd(p, &r_u->pol, free_lsa_info, (void *)info))		return NT_STATUS_OBJECT_NAME_NOT_FOUND;	return NT_STATUS_OK;}/*************************************************************************** _lsa_open_policy ***************************************************************************/NTSTATUS _lsa_open_policy(pipes_struct *p, LSA_Q_OPEN_POL *q_u, LSA_R_OPEN_POL *r_u){	struct lsa_info *info;	SEC_DESC *psd = NULL;	size_t sd_size;	uint32 des_access=q_u->des_access;	uint32 acc_granted;	NTSTATUS status;	/* map the generic bits to the lsa policy ones */	se_map_generic(&des_access, &lsa_generic_mapping);	/* get the generic lsa policy SD until we store it */	lsa_get_generic_sd(p->mem_ctx, &psd, &sd_size);	if(!se_access_check(psd, p->pipe_user.nt_user_token, des_access, &acc_granted, &status)) {		if (geteuid() != 0) {			return status;		}		DEBUG(4,("ACCESS should be DENIED (granted: %#010x;  required: %#010x)\n",			 acc_granted, des_access));		DEBUGADD(4,("but overwritten by euid == 0\n"));		acc_granted = des_access;	}	/* associate the domain SID with the (unique) handle. */	if ((info = SMB_MALLOC_P(struct lsa_info)) == NULL)		return NT_STATUS_NO_MEMORY;	ZERO_STRUCTP(info);	sid_copy(&info->sid,get_global_sam_sid());	info->access = acc_granted;	/* set up the LSA QUERY INFO response */	if (!create_policy_hnd(p, &r_u->pol, free_lsa_info, (void *)info))		return NT_STATUS_OBJECT_NAME_NOT_FOUND;	return NT_STATUS_OK;}/*************************************************************************** _lsa_enum_trust_dom - this needs fixing to do more than return NULL ! JRA. ufff, done :)  mimir ***************************************************************************/NTSTATUS _lsa_enum_trust_dom(pipes_struct *p, LSA_Q_ENUM_TRUST_DOM *q_u, LSA_R_ENUM_TRUST_DOM *r_u){	struct lsa_info *info;	uint32 enum_context = q_u->enum_context;	/*	 * preferred length is set to 5 as a "our" preferred length	 * nt sets this parameter to 2	 * update (20.08.2002): it's not preferred length, but preferred size!	 * it needs further investigation how to optimally choose this value	 */	uint32 max_num_domains = q_u->preferred_len < 5 ? q_u->preferred_len : 10;	TRUSTDOM **trust_doms;	uint32 num_domains;	NTSTATUS nt_status;	if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&info))		return NT_STATUS_INVALID_HANDLE;	/* check if the user have enough rights */	if (!(info->access & POLICY_VIEW_LOCAL_INFORMATION))		return NT_STATUS_ACCESS_DENIED;	nt_status = secrets_get_trusted_domains(p->mem_ctx, (int *)&enum_context, max_num_domains, (int *)&num_domains, &trust_doms);	if (!NT_STATUS_IS_OK(nt_status) &&	    !NT_STATUS_EQUAL(nt_status, STATUS_MORE_ENTRIES) &&	    !NT_STATUS_EQUAL(nt_status, NT_STATUS_NO_MORE_ENTRIES)) {		return nt_status;	} else {		r_u->status = nt_status;	}	/* set up the lsa_enum_trust_dom response */	init_r_enum_trust_dom(p->mem_ctx, r_u, enum_context, max_num_domains, num_domains, trust_doms);	return r_u->status;}/*************************************************************************** _lsa_query_info. See the POLICY_INFOMATION_CLASS docs at msdn. ***************************************************************************/NTSTATUS _lsa_query_info(pipes_struct *p, LSA_Q_QUERY_INFO *q_u, LSA_R_QUERY_INFO *r_u){	struct lsa_info *handle;	LSA_INFO_UNION *info = &r_u->dom;	DOM_SID domain_sid;	const char *name;	DOM_SID *sid = NULL;	r_u->status = NT_STATUS_OK;	if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&handle))		return NT_STATUS_INVALID_HANDLE;	switch (q_u->info_class) {	case 0x02:		{		unsigned int i;		/* check if the user have enough rights */		if (!(handle->access & POLICY_VIEW_AUDIT_INFORMATION))			return NT_STATUS_ACCESS_DENIED;		/* fake info: We audit everything. ;) */		info->id2.auditing_enabled = 1;		info->id2.count1 = 7;		info->id2.count2 = 7;		if ((info->id2.auditsettings = TALLOC_ARRAY(p->mem_ctx,uint32, 7)) == NULL)			return NT_STATUS_NO_MEMORY;		for (i = 0; i < 7; i++)			info->id2.auditsettings[i] = 3;		break;		}	case 0x03:		/* check if the user have enough rights */		if (!(handle->access & POLICY_VIEW_LOCAL_INFORMATION))			return NT_STATUS_ACCESS_DENIED;		/* Request PolicyPrimaryDomainInformation. */		switch (lp_server_role()) {			case ROLE_DOMAIN_PDC:			case ROLE_DOMAIN_BDC:				name = get_global_sam_name();				sid = get_global_sam_sid();				break;			case ROLE_DOMAIN_MEMBER:				name = lp_workgroup();				/* We need to return the Domain SID here. */				if (secrets_fetch_domain_sid(lp_workgroup(), &domain_sid))					sid = &domain_sid;				else					return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;				break;			case ROLE_STANDALONE:				name = lp_workgroup();				sid = NULL;				break;			default:				return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;		}		init_dom_query(&r_u->dom.id3, name, sid);		break;	case 0x05:		/* check if the user have enough rights */		if (!(handle->access & POLICY_VIEW_LOCAL_INFORMATION))			return NT_STATUS_ACCESS_DENIED;		/* Request PolicyAccountDomainInformation. */		name = get_global_sam_name();		sid = get_global_sam_sid();		init_dom_query(&r_u->dom.id5, name, sid);		break;	case 0x06:		/* check if the user have enough rights */		if (!(handle->access & POLICY_VIEW_LOCAL_INFORMATION))			return NT_STATUS_ACCESS_DENIED;		switch (lp_server_role()) {			case ROLE_DOMAIN_BDC:				/*				 * only a BDC is a backup controller				 * of the domain, it controls.				 */				info->id6.server_role = 2;				break;			default:				/*				 * any other role is a primary				 * of the domain, it controls.				 */				info->id6.server_role = 3;				break; 		}		break;	default:		DEBUG(0,("_lsa_query_info: unknown info level in Lsa Query: %d\n", q_u->info_class));		r_u->status = NT_STATUS_INVALID_INFO_CLASS;		break;	}	if (NT_STATUS_IS_OK(r_u->status)) {		r_u->undoc_buffer = 0x22000000; /* bizarre */		r_u->info_class = q_u->info_class;	}	return r_u->status;}/*************************************************************************** _lsa_lookup_sids ***************************************************************************/NTSTATUS _lsa_lookup_sids(pipes_struct *p, LSA_Q_LOOKUP_SIDS *q_u, LSA_R_LOOKUP_SIDS *r_u){	struct lsa_info *handle;	DOM_SID2 *sid = q_u->sids.sid;	int num_entries = q_u->sids.num_entries;	DOM_R_REF *ref = NULL;	LSA_TRANS_NAME_ENUM *names = NULL;	uint32 mapped_count = 0;	if (num_entries >  MAX_LOOKUP_SIDS) {		num_entries = 0;		DEBUG(5,("_lsa_lookup_sids: limit of %d exceeded, truncating SID lookup list to %d\n", MAX_LOOKUP_SIDS, num_entries));		r_u->status = NT_STATUS_NONE_MAPPED;	}	ref = TALLOC_ZERO_P(p->mem_ctx, DOM_R_REF);	names = TALLOC_ZERO_P(p->mem_ctx, LSA_TRANS_NAME_ENUM);	if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&handle)) {		r_u->status = NT_STATUS_INVALID_HANDLE;		goto done;	}	/* check if the user have enough rights */	if (!(handle->access & POLICY_LOOKUP_NAMES)) {		r_u->status = NT_STATUS_ACCESS_DENIED;		goto done;	}	if (!ref || !names)		return NT_STATUS_NO_MEMORY;done:	/* set up the LSA Lookup SIDs response */	init_lsa_trans_names(p->mem_ctx, ref, names, num_entries, sid, &mapped_count);	if (NT_STATUS_IS_OK(r_u->status)) {		if (mapped_count == 0)			r_u->status = NT_STATUS_NONE_MAPPED;		else if (mapped_count != num_entries)			r_u->status = STATUS_SOME_UNMAPPED;	}	init_reply_lookup_sids(r_u, ref, names, mapped_count);	return r_u->status;}/***************************************************************************lsa_reply_lookup_names ***************************************************************************/NTSTATUS _lsa_lookup_names(pipes_struct *p,LSA_Q_LOOKUP_NAMES *q_u, LSA_R_LOOKUP_NAMES *r_u){	struct lsa_info *handle;	UNISTR2 *names = q_u->uni_name;	int num_entries = q_u->num_entries;	DOM_R_REF *ref;	DOM_RID2 *rids;	uint32 mapped_count = 0;	if (num_entries >  MAX_LOOKUP_SIDS) {		num_entries = MAX_LOOKUP_SIDS;		DEBUG(5,("_lsa_lookup_names: truncating name lookup list to %d\n", num_entries));	}			ref = TALLOC_ZERO_P(p->mem_ctx, DOM_R_REF);	rids = TALLOC_ZERO_ARRAY(p->mem_ctx, DOM_RID2, num_entries);	if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&handle)) {		r_u->status = NT_STATUS_INVALID_HANDLE;		goto done;	}	/* check if the user have enough rights */	if (!(handle->access & POLICY_LOOKUP_NAMES)) {		r_u->status = NT_STATUS_ACCESS_DENIED;		goto done;	}	if (!ref || !rids)		return NT_STATUS_NO_MEMORY;done:	/* set up the LSA Lookup RIDs response */	init_lsa_rid2s(ref, rids, num_entries, names, &mapped_count, p->endian);	if (NT_STATUS_IS_OK(r_u->status)) {		if (mapped_count == 0)			r_u->status = NT_STATUS_NONE_MAPPED;		else if (mapped_count != num_entries)			r_u->status = STATUS_SOME_UNMAPPED;	}	init_reply_lookup_names(r_u, ref, num_entries, rids, mapped_count);	return r_u->status;}/*************************************************************************** _lsa_close. Also weird - needs to check if lsa handle is correct. JRA. ***************************************************************************/NTSTATUS _lsa_close(pipes_struct *p, LSA_Q_CLOSE *q_u, LSA_R_CLOSE *r_u){	if (!find_policy_by_hnd(p, &q_u->pol, NULL))		return NT_STATUS_INVALID_HANDLE;	close_policy_hnd(p, &q_u->pol);	return NT_STATUS_OK;}/*************************************************************************** ***************************************************************************/NTSTATUS _lsa_open_secret(pipes_struct *p, LSA_Q_OPEN_SECRET *q_u, LSA_R_OPEN_SECRET *r_u){	return NT_STATUS_OBJECT_NAME_NOT_FOUND;}/*************************************************************************** ***************************************************************************/NTSTATUS _lsa_open_trusted_domain(pipes_struct *p, LSA_Q_OPEN_TRUSTED_DOMAIN *q_u, LSA_R_OPEN_TRUSTED_DOMAIN *r_u){	return NT_STATUS_OBJECT_NAME_NOT_FOUND;}/*************************************************************************** ***************************************************************************/NTSTATUS _lsa_create_trusted_domain(pipes_struct *p, LSA_Q_CREATE_TRUSTED_DOMAIN *q_u, LSA_R_CREATE_TRUSTED_DOMAIN *r_u){	return NT_STATUS_ACCESS_DENIED;}/*************************************************************************** ***************************************************************************/NTSTATUS _lsa_create_secret(pipes_struct *p, LSA_Q_CREATE_SECRET *q_u, LSA_R_CREATE_SECRET *r_u){	return NT_STATUS_ACCESS_DENIED;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -