📄 ndr_sec_helper.c
字号:
/* 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 + -