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

📄 ndr_sec_helper.c

📁 samba服务器!
💻 C
📖 第 1 页 / 共 2 页
字号:
/*    Unix SMB/CIFS implementation.   fast routines for getting the wire size of security objects   Copyright (C) Andrew Tridgell 2003      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 2 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, write to the Free Software   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/#include "includes.h"/*  return the wire size of a dom_sid*/size_t ndr_size_dom_sid(const struct dom_sid *sid, int flags){	if (!sid) return 0;	return 8 + 4*sid->num_auths;}/*  return the wire size of a security_ace*/size_t ndr_size_security_ace(const struct security_ace *ace, int flags){	if (!ace) return 0;	return 8 + ndr_size_dom_sid(&ace->trustee, flags);}/*  return the wire size of a security_acl*/size_t ndr_size_security_acl(const struct security_acl *acl, int flags){	size_t ret;	int i;	if (!acl) return 0;	ret = 8;	for (i=0;i<acl->num_aces;i++) {		ret += ndr_size_security_ace(&acl->aces[i], flags);	}	return ret;}/*  return the wire size of a security descriptor*/size_t ndr_size_security_descriptor(const struct security_descriptor *sd, int flags){	size_t ret;	if (!sd) return 0;		ret = 20;	ret += ndr_size_dom_sid(sd->owner_sid, flags);	ret += ndr_size_dom_sid(sd->group_sid, flags);	ret += ndr_size_security_acl(sd->dacl, flags);	ret += ndr_size_security_acl(sd->sacl, flags);	return ret;}/*  print a dom_sid*/void ndr_print_dom_sid(struct ndr_print *ndr, const char *name, const struct dom_sid *sid){	ndr->print(ndr, "%-25s: %s", name, dom_sid_string(ndr, sid));}void ndr_print_dom_sid2(struct ndr_print *ndr, const char *name, const struct dom_sid *sid){	ndr_print_dom_sid(ndr, name, sid);}void ndr_print_dom_sid28(struct ndr_print *ndr, const char *name, const struct dom_sid *sid){	ndr_print_dom_sid(ndr, name, sid);}static NTSTATUS ndr_push_security_ace_flags(struct ndr_push *ndr, int ndr_flags, uint8_t r){	NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, r));	return NT_STATUS_OK;}static NTSTATUS ndr_pull_security_ace_flags(struct ndr_pull *ndr, int ndr_flags, uint8_t *r){	uint8_t v;	NDR_CHECK(ndr_pull_uint8(ndr, NDR_SCALARS, &v));	*r = v;	return NT_STATUS_OK;}void ndr_print_security_ace_flags(struct ndr_print *ndr, const char *name, uint8_t r){	ndr_print_uint8(ndr, name, r);	ndr->depth++;	ndr_print_bitmap_flag(ndr, sizeof(uint8_t), "SEC_ACE_FLAG_OBJECT_INHERIT", SEC_ACE_FLAG_OBJECT_INHERIT, r);	ndr_print_bitmap_flag(ndr, sizeof(uint8_t), "SEC_ACE_FLAG_CONTAINER_INHERIT", SEC_ACE_FLAG_CONTAINER_INHERIT, r);	ndr_print_bitmap_flag(ndr, sizeof(uint8_t), "SEC_ACE_FLAG_NO_PROPAGATE_INHERIT", SEC_ACE_FLAG_NO_PROPAGATE_INHERIT, r);	ndr_print_bitmap_flag(ndr, sizeof(uint8_t), "SEC_ACE_FLAG_INHERIT_ONLY", SEC_ACE_FLAG_INHERIT_ONLY, r);	ndr_print_bitmap_flag(ndr, sizeof(uint8_t), "SEC_ACE_FLAG_INHERITED_ACE", SEC_ACE_FLAG_INHERITED_ACE, r);	ndr_print_bitmap_flag(ndr, sizeof(uint8_t), "SEC_ACE_FLAG_VALID_INHERIT", SEC_ACE_FLAG_VALID_INHERIT, r);	ndr_print_bitmap_flag(ndr, sizeof(uint8_t), "SEC_ACE_FLAG_SUCCESSFUL_ACCESS", SEC_ACE_FLAG_SUCCESSFUL_ACCESS, r);	ndr_print_bitmap_flag(ndr, sizeof(uint8_t), "SEC_ACE_FLAG_FAILED_ACCESS", SEC_ACE_FLAG_FAILED_ACCESS, r);	ndr->depth--;}static NTSTATUS ndr_push_security_ace_type(struct ndr_push *ndr, int ndr_flags, enum security_ace_type r){	NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, r));	return NT_STATUS_OK;}static NTSTATUS ndr_pull_security_ace_type(struct ndr_pull *ndr, int ndr_flags, enum security_ace_type *r){	uint8_t v;	NDR_CHECK(ndr_pull_uint8(ndr, NDR_SCALARS, &v));	*r = (enum security_ace_type)v;	return NT_STATUS_OK;}void ndr_print_security_ace_type(struct ndr_print *ndr, const char *name, enum security_ace_type r){	const char *val = NULL;	switch (r) {		case SEC_ACE_TYPE_ACCESS_ALLOWED: val = "SEC_ACE_TYPE_ACCESS_ALLOWED"; break;		case SEC_ACE_TYPE_ACCESS_DENIED: val = "SEC_ACE_TYPE_ACCESS_DENIED"; break;		case SEC_ACE_TYPE_SYSTEM_AUDIT: val = "SEC_ACE_TYPE_SYSTEM_AUDIT"; break;		case SEC_ACE_TYPE_SYSTEM_ALARM: val = "SEC_ACE_TYPE_SYSTEM_ALARM"; break;		case SEC_ACE_TYPE_ALLOWED_COMPOUND: val = "SEC_ACE_TYPE_ALLOWED_COMPOUND"; break;		case SEC_ACE_TYPE_ACCESS_ALLOWED_OBJECT: val = "SEC_ACE_TYPE_ACCESS_ALLOWED_OBJECT"; break;		case SEC_ACE_TYPE_ACCESS_DENIED_OBJECT: val = "SEC_ACE_TYPE_ACCESS_DENIED_OBJECT"; break;		case SEC_ACE_TYPE_SYSTEM_AUDIT_OBJECT: val = "SEC_ACE_TYPE_SYSTEM_AUDIT_OBJECT"; break;		case SEC_ACE_TYPE_SYSTEM_ALARM_OBJECT: val = "SEC_ACE_TYPE_SYSTEM_ALARM_OBJECT"; break;	}	ndr_print_enum(ndr, name, "ENUM", val, r);}static NTSTATUS ndr_push_security_ace_object_flags(struct ndr_push *ndr, int ndr_flags, uint32_t r){	NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));	return NT_STATUS_OK;}static NTSTATUS ndr_pull_security_ace_object_flags(struct ndr_pull *ndr, int ndr_flags, uint32_t *r){	uint32_t v;	NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));	*r = v;	return NT_STATUS_OK;}void ndr_print_security_ace_object_flags(struct ndr_print *ndr, const char *name, uint32_t r){	ndr_print_uint32(ndr, name, r);	ndr->depth++;	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "SEC_ACE_OBJECT_TYPE_PRESENT", SEC_ACE_OBJECT_TYPE_PRESENT, r);	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "SEC_ACE_INHERITED_OBJECT_TYPE_PRESENT", SEC_ACE_INHERITED_OBJECT_TYPE_PRESENT, r);	ndr->depth--;}static NTSTATUS ndr_push_security_ace_object_type(struct ndr_push *ndr, int ndr_flags, const union security_ace_object_type *r){	int level;	level = ndr_push_get_switch_value(ndr, r);	if (ndr_flags & NDR_SCALARS) {		switch (level) {			case SEC_ACE_OBJECT_TYPE_PRESENT:				NDR_CHECK(ndr_push_GUID(ndr, NDR_SCALARS, &r->type));			break;			default:			break;		}	}	if (ndr_flags & NDR_BUFFERS) {		switch (level) {			case SEC_ACE_OBJECT_TYPE_PRESENT:			break;			default:			break;		}	}	return NT_STATUS_OK;}static NTSTATUS ndr_pull_security_ace_object_type(struct ndr_pull *ndr, int ndr_flags, union security_ace_object_type *r){	int level;	level = ndr_pull_get_switch_value(ndr, r);	if (ndr_flags & NDR_SCALARS) {		switch (level) {			case SEC_ACE_OBJECT_TYPE_PRESENT: {				NDR_CHECK(ndr_pull_GUID(ndr, NDR_SCALARS, &r->type));			break; }			default: {			break; }		}	}	if (ndr_flags & NDR_BUFFERS) {		switch (level) {			case SEC_ACE_OBJECT_TYPE_PRESENT:			break;			default:			break;		}	}	return NT_STATUS_OK;}void ndr_print_security_ace_object_type(struct ndr_print *ndr, const char *name, const union security_ace_object_type *r){	int level;	level = ndr_print_get_switch_value(ndr, r);	ndr_print_union(ndr, name, level, "security_ace_object_type");	switch (level) {		case SEC_ACE_OBJECT_TYPE_PRESENT:			ndr_print_GUID(ndr, "type", &r->type);		break;		default:		break;	}}static NTSTATUS ndr_push_security_ace_object_inherited_type(struct ndr_push *ndr, int ndr_flags, const union security_ace_object_inherited_type *r){	int level;	level = ndr_push_get_switch_value(ndr, r);	if (ndr_flags & NDR_SCALARS) {		switch (level) {			case SEC_ACE_INHERITED_OBJECT_TYPE_PRESENT:				NDR_CHECK(ndr_push_GUID(ndr, NDR_SCALARS, &r->inherited_type));			break;			default:			break;		}	}	if (ndr_flags & NDR_BUFFERS) {		switch (level) {			case SEC_ACE_INHERITED_OBJECT_TYPE_PRESENT:			break;			default:			break;		}	}	return NT_STATUS_OK;}static NTSTATUS ndr_pull_security_ace_object_inherited_type(struct ndr_pull *ndr, int ndr_flags, union security_ace_object_inherited_type *r){	int level;	level = ndr_pull_get_switch_value(ndr, r);	if (ndr_flags & NDR_SCALARS) {		switch (level) {			case SEC_ACE_INHERITED_OBJECT_TYPE_PRESENT: {				NDR_CHECK(ndr_pull_GUID(ndr, NDR_SCALARS, &r->inherited_type));			break; }			default: {			break; }		}	}	if (ndr_flags & NDR_BUFFERS) {		switch (level) {			case SEC_ACE_INHERITED_OBJECT_TYPE_PRESENT:			break;			default:			break;		}	}	return NT_STATUS_OK;}void ndr_print_security_ace_object_inherited_type(struct ndr_print *ndr, const char *name, const union security_ace_object_inherited_type *r){	int level;	level = ndr_print_get_switch_value(ndr, r);	ndr_print_union(ndr, name, level, "security_ace_object_inherited_type");	switch (level) {		case SEC_ACE_INHERITED_OBJECT_TYPE_PRESENT:			ndr_print_GUID(ndr, "inherited_type", &r->inherited_type);		break;		default:		break;	}}static NTSTATUS ndr_push_security_ace_object(struct ndr_push *ndr, int ndr_flags, const struct security_ace_object *r){	if (ndr_flags & NDR_SCALARS) {		NDR_CHECK(ndr_push_align(ndr, 4));		NDR_CHECK(ndr_push_security_ace_object_flags(ndr, NDR_SCALARS, r->flags));		NDR_CHECK(ndr_push_set_switch_value(ndr, &r->type, r->flags&SEC_ACE_OBJECT_TYPE_PRESENT));		NDR_CHECK(ndr_push_security_ace_object_type(ndr, NDR_SCALARS, &r->type));		NDR_CHECK(ndr_push_set_switch_value(ndr, &r->inherited_type, r->flags&SEC_ACE_INHERITED_OBJECT_TYPE_PRESENT));		NDR_CHECK(ndr_push_security_ace_object_inherited_type(ndr, NDR_SCALARS, &r->inherited_type));	}	if (ndr_flags & NDR_BUFFERS) {		NDR_CHECK(ndr_push_security_ace_object_type(ndr, NDR_BUFFERS, &r->type));		NDR_CHECK(ndr_push_security_ace_object_inherited_type(ndr, NDR_BUFFERS, &r->inherited_type));	}	return NT_STATUS_OK;}static NTSTATUS ndr_pull_security_ace_object(struct ndr_pull *ndr, int ndr_flags, struct security_ace_object *r){	if (ndr_flags & NDR_SCALARS) {		NDR_CHECK(ndr_pull_align(ndr, 4));		NDR_CHECK(ndr_pull_security_ace_object_flags(ndr, NDR_SCALARS, &r->flags));		NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->type, r->flags&SEC_ACE_OBJECT_TYPE_PRESENT));		NDR_CHECK(ndr_pull_security_ace_object_type(ndr, NDR_SCALARS, &r->type));		NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->inherited_type, r->flags&SEC_ACE_INHERITED_OBJECT_TYPE_PRESENT));		NDR_CHECK(ndr_pull_security_ace_object_inherited_type(ndr, NDR_SCALARS, &r->inherited_type));	}	if (ndr_flags & NDR_BUFFERS) {		NDR_CHECK(ndr_pull_security_ace_object_type(ndr, NDR_BUFFERS, &r->type));		NDR_CHECK(ndr_pull_security_ace_object_inherited_type(ndr, NDR_BUFFERS, &r->inherited_type));	}	return NT_STATUS_OK;}void ndr_print_security_ace_object(struct ndr_print *ndr, const char *name, const struct security_ace_object *r){	ndr_print_struct(ndr, name, "security_ace_object");	ndr->depth++;	ndr_print_security_ace_object_flags(ndr, "flags", r->flags);	ndr_print_set_switch_value(ndr, &r->type, r->flags&SEC_ACE_OBJECT_TYPE_PRESENT);	ndr_print_security_ace_object_type(ndr, "type", &r->type);	ndr_print_set_switch_value(ndr, &r->inherited_type, r->flags&SEC_ACE_INHERITED_OBJECT_TYPE_PRESENT);	ndr_print_security_ace_object_inherited_type(ndr, "inherited_type", &r->inherited_type);	ndr->depth--;}static NTSTATUS ndr_push_security_ace_object_ctr(struct ndr_push *ndr, int ndr_flags, const union security_ace_object_ctr *r){	int level;	level = ndr_push_get_switch_value(ndr, r);	if (ndr_flags & NDR_SCALARS) {		switch (level) {			case SEC_ACE_TYPE_ACCESS_ALLOWED_OBJECT:				NDR_CHECK(ndr_push_security_ace_object(ndr, NDR_SCALARS, &r->object));			break;			case SEC_ACE_TYPE_ACCESS_DENIED_OBJECT:				NDR_CHECK(ndr_push_security_ace_object(ndr, NDR_SCALARS, &r->object));			break;			case SEC_ACE_TYPE_SYSTEM_AUDIT_OBJECT:				NDR_CHECK(ndr_push_security_ace_object(ndr, NDR_SCALARS, &r->object));			break;			case SEC_ACE_TYPE_SYSTEM_ALARM_OBJECT:				NDR_CHECK(ndr_push_security_ace_object(ndr, NDR_SCALARS, &r->object));			break;			default:			break;		}	}	if (ndr_flags & NDR_BUFFERS) {		switch (level) {			case SEC_ACE_TYPE_ACCESS_ALLOWED_OBJECT:				NDR_CHECK(ndr_push_security_ace_object(ndr, NDR_BUFFERS, &r->object));			break;			case SEC_ACE_TYPE_ACCESS_DENIED_OBJECT:				NDR_CHECK(ndr_push_security_ace_object(ndr, NDR_BUFFERS, &r->object));			break;			case SEC_ACE_TYPE_SYSTEM_AUDIT_OBJECT:				NDR_CHECK(ndr_push_security_ace_object(ndr, NDR_BUFFERS, &r->object));			break;			case SEC_ACE_TYPE_SYSTEM_ALARM_OBJECT:				NDR_CHECK(ndr_push_security_ace_object(ndr, NDR_BUFFERS, &r->object));			break;			default:			break;		}	}	return NT_STATUS_OK;}static NTSTATUS ndr_pull_security_ace_object_ctr(struct ndr_pull *ndr, int ndr_flags, union security_ace_object_ctr *r){	int level;	level = ndr_pull_get_switch_value(ndr, r);	if (ndr_flags & NDR_SCALARS) {		switch (level) {			case SEC_ACE_TYPE_ACCESS_ALLOWED_OBJECT: {				NDR_CHECK(ndr_pull_security_ace_object(ndr, NDR_SCALARS, &r->object));			break; }			case SEC_ACE_TYPE_ACCESS_DENIED_OBJECT: {				NDR_CHECK(ndr_pull_security_ace_object(ndr, NDR_SCALARS, &r->object));			break; }			case SEC_ACE_TYPE_SYSTEM_AUDIT_OBJECT: {				NDR_CHECK(ndr_pull_security_ace_object(ndr, NDR_SCALARS, &r->object));			break; }			case SEC_ACE_TYPE_SYSTEM_ALARM_OBJECT: {				NDR_CHECK(ndr_pull_security_ace_object(ndr, NDR_SCALARS, &r->object));			break; }			default: {			break; }		}	}	if (ndr_flags & NDR_BUFFERS) {		switch (level) {			case SEC_ACE_TYPE_ACCESS_ALLOWED_OBJECT:				NDR_CHECK(ndr_pull_security_ace_object(ndr, NDR_BUFFERS, &r->object));			break;

⌨️ 快捷键说明

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