mirror of
https://github.com/samba-team/samba.git
synced 2025-01-26 10:04:02 +03:00
Merge branch 'master' of ssh://git.samba.org/data/git/samba
This commit is contained in:
commit
72a1e3acfa
@ -12,7 +12,7 @@
|
||||
</command> call to ensure the data is written to disk. Note that
|
||||
the <parameter moreinfo="none">strict sync</parameter> parameter must be set to
|
||||
<constant>yes</constant> in order for this parameter to have
|
||||
any affect.</para>
|
||||
any effect.</para>
|
||||
</description>
|
||||
|
||||
<related>strict sync</related>
|
||||
|
@ -136,6 +136,20 @@ interface security
|
||||
const int SEC_RIGHTS_DIR_EXECUTE = SEC_RIGHTS_FILE_EXECUTE;
|
||||
const int SEC_RIGHTS_DIR_ALL = SEC_RIGHTS_FILE_ALL;
|
||||
|
||||
/* combinations of standard masks. */
|
||||
const int STANDARD_RIGHTS_ALL_ACCESS = SEC_STD_ALL; /* 0x001f0000 */
|
||||
const int STANDARD_RIGHTS_MODIFY_ACCESS = SEC_STD_READ_CONTROLS; /* 0x00020000 */
|
||||
const int STANDARD_RIGHTS_EXECUTE_ACCESS = SEC_STD_READ_CONTROLS; /* 0x00020000 */
|
||||
const int STANDARD_RIGHTS_READ_ACCESS = SEC_STD_READ_CONTROLS; /* 0x00020000 */
|
||||
const int STANDARD_RIGHTS_WRITE_ACCESS =
|
||||
(SEC_STD_WRITE_OWNER |
|
||||
SEC_STD_WRITE_DAC |
|
||||
SEC_STD_DELETE); /* 0x000d0000 */
|
||||
const int STANDARD_RIGHTS_REQUIRED_ACCESS =
|
||||
(SEC_STD_DELETE |
|
||||
SEC_STD_READ_CONTROL |
|
||||
SEC_STD_WRITE_DAC |
|
||||
SEC_STD_WRITE_OWNER); /* 0x000f0000 */
|
||||
|
||||
/***************************************************************/
|
||||
/* WELL KNOWN SIDS */
|
||||
|
@ -1417,9 +1417,8 @@ WERROR registry_push_value(TALLOC_CTX *mem_ctx,
|
||||
void se_map_generic(uint32 *access_mask, const struct generic_mapping *mapping);
|
||||
void security_acl_map_generic(struct security_acl *sa, const struct generic_mapping *mapping);
|
||||
void se_map_standard(uint32 *access_mask, struct standard_mapping *mapping);
|
||||
bool se_access_check(const SEC_DESC *sd, const NT_USER_TOKEN *token,
|
||||
uint32 acc_desired, uint32 *acc_granted,
|
||||
NTSTATUS *status);
|
||||
NTSTATUS se_access_check(const SEC_DESC *sd, const NT_USER_TOKEN *token,
|
||||
uint32 acc_desired, uint32 *acc_granted);
|
||||
NTSTATUS samr_make_sam_obj_sd(TALLOC_CTX *ctx, SEC_DESC **psd, size_t *sd_size);
|
||||
|
||||
/* The following definitions come from lib/util_sec.c */
|
||||
|
@ -214,177 +214,6 @@ struct standard_mapping {
|
||||
SA_RIGHT_FILE_WRITE_DATA | \
|
||||
SA_RIGHT_FILE_READ_DATA)
|
||||
|
||||
/* SAM server specific access rights */
|
||||
|
||||
#define SA_RIGHT_SAM_CONNECT_SERVER 0x00000001
|
||||
#define SA_RIGHT_SAM_SHUTDOWN_SERVER 0x00000002
|
||||
#define SA_RIGHT_SAM_INITIALISE_SERVER 0x00000004
|
||||
#define SA_RIGHT_SAM_CREATE_DOMAIN 0x00000008
|
||||
#define SA_RIGHT_SAM_ENUM_DOMAINS 0x00000010
|
||||
#define SA_RIGHT_SAM_OPEN_DOMAIN 0x00000020
|
||||
|
||||
#define SA_RIGHT_SAM_ALL_ACCESS 0x0000003F
|
||||
|
||||
#define GENERIC_RIGHTS_SAM_ALL_ACCESS \
|
||||
(STANDARD_RIGHTS_REQUIRED_ACCESS| \
|
||||
SA_RIGHT_SAM_ALL_ACCESS)
|
||||
|
||||
#define GENERIC_RIGHTS_SAM_READ \
|
||||
(STANDARD_RIGHTS_READ_ACCESS | \
|
||||
SA_RIGHT_SAM_ENUM_DOMAINS)
|
||||
|
||||
#define GENERIC_RIGHTS_SAM_WRITE \
|
||||
(STANDARD_RIGHTS_WRITE_ACCESS | \
|
||||
SA_RIGHT_SAM_CREATE_DOMAIN | \
|
||||
SA_RIGHT_SAM_INITIALISE_SERVER | \
|
||||
SA_RIGHT_SAM_SHUTDOWN_SERVER)
|
||||
|
||||
#define GENERIC_RIGHTS_SAM_EXECUTE \
|
||||
(STANDARD_RIGHTS_EXECUTE_ACCESS | \
|
||||
SA_RIGHT_SAM_OPEN_DOMAIN | \
|
||||
SA_RIGHT_SAM_CONNECT_SERVER)
|
||||
|
||||
|
||||
/* Domain Object specific access rights */
|
||||
|
||||
#define SA_RIGHT_DOMAIN_LOOKUP_INFO_1 0x00000001
|
||||
#define SA_RIGHT_DOMAIN_SET_INFO_1 0x00000002
|
||||
#define SA_RIGHT_DOMAIN_LOOKUP_INFO_2 0x00000004
|
||||
#define SA_RIGHT_DOMAIN_SET_INFO_2 0x00000008
|
||||
#define SA_RIGHT_DOMAIN_CREATE_USER 0x00000010
|
||||
#define SA_RIGHT_DOMAIN_CREATE_GROUP 0x00000020
|
||||
#define SA_RIGHT_DOMAIN_CREATE_ALIAS 0x00000040
|
||||
#define SA_RIGHT_DOMAIN_LOOKUP_ALIAS_BY_MEM 0x00000080
|
||||
#define SA_RIGHT_DOMAIN_ENUM_ACCOUNTS 0x00000100
|
||||
#define SA_RIGHT_DOMAIN_OPEN_ACCOUNT 0x00000200
|
||||
#define SA_RIGHT_DOMAIN_SET_INFO_3 0x00000400
|
||||
|
||||
#define SA_RIGHT_DOMAIN_ALL_ACCESS 0x000007FF
|
||||
|
||||
#define GENERIC_RIGHTS_DOMAIN_ALL_ACCESS \
|
||||
(STANDARD_RIGHTS_REQUIRED_ACCESS| \
|
||||
SA_RIGHT_DOMAIN_ALL_ACCESS)
|
||||
|
||||
#define GENERIC_RIGHTS_DOMAIN_READ \
|
||||
(STANDARD_RIGHTS_READ_ACCESS | \
|
||||
SA_RIGHT_DOMAIN_LOOKUP_ALIAS_BY_MEM | \
|
||||
SA_RIGHT_DOMAIN_LOOKUP_INFO_2)
|
||||
|
||||
#define GENERIC_RIGHTS_DOMAIN_WRITE \
|
||||
(STANDARD_RIGHTS_WRITE_ACCESS | \
|
||||
SA_RIGHT_DOMAIN_SET_INFO_3 | \
|
||||
SA_RIGHT_DOMAIN_CREATE_ALIAS | \
|
||||
SA_RIGHT_DOMAIN_CREATE_GROUP | \
|
||||
SA_RIGHT_DOMAIN_CREATE_USER | \
|
||||
SA_RIGHT_DOMAIN_SET_INFO_2 | \
|
||||
SA_RIGHT_DOMAIN_SET_INFO_1)
|
||||
|
||||
#define GENERIC_RIGHTS_DOMAIN_EXECUTE \
|
||||
(STANDARD_RIGHTS_EXECUTE_ACCESS | \
|
||||
SA_RIGHT_DOMAIN_OPEN_ACCOUNT | \
|
||||
SA_RIGHT_DOMAIN_ENUM_ACCOUNTS | \
|
||||
SA_RIGHT_DOMAIN_LOOKUP_INFO_1)
|
||||
|
||||
|
||||
/* User Object specific access rights */
|
||||
|
||||
#define SA_RIGHT_USER_GET_NAME_ETC 0x00000001
|
||||
#define SA_RIGHT_USER_GET_LOCALE 0x00000002
|
||||
#define SA_RIGHT_USER_SET_LOC_COM 0x00000004
|
||||
#define SA_RIGHT_USER_GET_LOGONINFO 0x00000008
|
||||
#define SA_RIGHT_USER_ACCT_FLAGS_EXPIRY 0x00000010
|
||||
#define SA_RIGHT_USER_SET_ATTRIBUTES 0x00000020
|
||||
#define SA_RIGHT_USER_CHANGE_PASSWORD 0x00000040
|
||||
#define SA_RIGHT_USER_SET_PASSWORD 0x00000080
|
||||
#define SA_RIGHT_USER_GET_GROUPS 0x00000100
|
||||
#define SA_RIGHT_USER_READ_GROUP_MEM 0x00000200
|
||||
#define SA_RIGHT_USER_CHANGE_GROUP_MEM 0x00000400
|
||||
|
||||
#define SA_RIGHT_USER_ALL_ACCESS 0x000007FF
|
||||
|
||||
#define GENERIC_RIGHTS_USER_ALL_ACCESS \
|
||||
(STANDARD_RIGHTS_REQUIRED_ACCESS| \
|
||||
SA_RIGHT_USER_ALL_ACCESS) /* 0x000f07ff */
|
||||
|
||||
#define GENERIC_RIGHTS_USER_READ \
|
||||
(STANDARD_RIGHTS_READ_ACCESS | \
|
||||
SA_RIGHT_USER_READ_GROUP_MEM | \
|
||||
SA_RIGHT_USER_GET_GROUPS | \
|
||||
SA_RIGHT_USER_ACCT_FLAGS_EXPIRY | \
|
||||
SA_RIGHT_USER_GET_LOGONINFO | \
|
||||
SA_RIGHT_USER_GET_LOCALE) /* 0x0002031a */
|
||||
|
||||
#define GENERIC_RIGHTS_USER_WRITE \
|
||||
(STANDARD_RIGHTS_WRITE_ACCESS | \
|
||||
SA_RIGHT_USER_CHANGE_PASSWORD | \
|
||||
SA_RIGHT_USER_SET_LOC_COM | \
|
||||
SA_RIGHT_USER_SET_ATTRIBUTES | \
|
||||
SA_RIGHT_USER_SET_PASSWORD | \
|
||||
SA_RIGHT_USER_CHANGE_GROUP_MEM) /* 0x000204e4 */
|
||||
|
||||
#define GENERIC_RIGHTS_USER_EXECUTE \
|
||||
(STANDARD_RIGHTS_EXECUTE_ACCESS | \
|
||||
SA_RIGHT_USER_CHANGE_PASSWORD | \
|
||||
SA_RIGHT_USER_GET_NAME_ETC ) /* 0x00020041 */
|
||||
|
||||
|
||||
/* Group Object specific access rights */
|
||||
|
||||
#define SA_RIGHT_GROUP_LOOKUP_INFO 0x00000001
|
||||
#define SA_RIGHT_GROUP_SET_INFO 0x00000002
|
||||
#define SA_RIGHT_GROUP_ADD_MEMBER 0x00000004
|
||||
#define SA_RIGHT_GROUP_REMOVE_MEMBER 0x00000008
|
||||
#define SA_RIGHT_GROUP_GET_MEMBERS 0x00000010
|
||||
|
||||
#define SA_RIGHT_GROUP_ALL_ACCESS 0x0000001F
|
||||
|
||||
#define GENERIC_RIGHTS_GROUP_ALL_ACCESS \
|
||||
(STANDARD_RIGHTS_REQUIRED_ACCESS| \
|
||||
SA_RIGHT_GROUP_ALL_ACCESS) /* 0x000f001f */
|
||||
|
||||
#define GENERIC_RIGHTS_GROUP_READ \
|
||||
(STANDARD_RIGHTS_READ_ACCESS | \
|
||||
SA_RIGHT_GROUP_GET_MEMBERS) /* 0x00020010 */
|
||||
|
||||
#define GENERIC_RIGHTS_GROUP_WRITE \
|
||||
(STANDARD_RIGHTS_WRITE_ACCESS | \
|
||||
SA_RIGHT_GROUP_REMOVE_MEMBER | \
|
||||
SA_RIGHT_GROUP_ADD_MEMBER | \
|
||||
SA_RIGHT_GROUP_SET_INFO ) /* 0x0002000e */
|
||||
|
||||
#define GENERIC_RIGHTS_GROUP_EXECUTE \
|
||||
(STANDARD_RIGHTS_EXECUTE_ACCESS | \
|
||||
SA_RIGHT_GROUP_LOOKUP_INFO) /* 0x00020001 */
|
||||
|
||||
|
||||
/* Alias Object specific access rights */
|
||||
|
||||
#define SA_RIGHT_ALIAS_ADD_MEMBER 0x00000001
|
||||
#define SA_RIGHT_ALIAS_REMOVE_MEMBER 0x00000002
|
||||
#define SA_RIGHT_ALIAS_GET_MEMBERS 0x00000004
|
||||
#define SA_RIGHT_ALIAS_LOOKUP_INFO 0x00000008
|
||||
#define SA_RIGHT_ALIAS_SET_INFO 0x00000010
|
||||
|
||||
#define SA_RIGHT_ALIAS_ALL_ACCESS 0x0000001F
|
||||
|
||||
#define GENERIC_RIGHTS_ALIAS_ALL_ACCESS \
|
||||
(STANDARD_RIGHTS_REQUIRED_ACCESS| \
|
||||
SA_RIGHT_ALIAS_ALL_ACCESS) /* 0x000f001f */
|
||||
|
||||
#define GENERIC_RIGHTS_ALIAS_READ \
|
||||
(STANDARD_RIGHTS_READ_ACCESS | \
|
||||
SA_RIGHT_ALIAS_GET_MEMBERS ) /* 0x00020004 */
|
||||
|
||||
#define GENERIC_RIGHTS_ALIAS_WRITE \
|
||||
(STANDARD_RIGHTS_WRITE_ACCESS | \
|
||||
SA_RIGHT_ALIAS_REMOVE_MEMBER | \
|
||||
SA_RIGHT_ALIAS_ADD_MEMBER | \
|
||||
SA_RIGHT_ALIAS_SET_INFO ) /* 0x00020013 */
|
||||
|
||||
#define GENERIC_RIGHTS_ALIAS_EXECUTE \
|
||||
(STANDARD_RIGHTS_EXECUTE_ACCESS | \
|
||||
SA_RIGHT_ALIAS_LOOKUP_INFO ) /* 0x00020008 */
|
||||
|
||||
/*
|
||||
* Access Bits for registry ACLS
|
||||
*/
|
||||
|
@ -287,11 +287,11 @@ bool share_access_check(const NT_USER_TOKEN *token, const char *sharename,
|
||||
return True;
|
||||
}
|
||||
|
||||
ret = se_access_check(psd, token, desired_access, &granted, &status);
|
||||
status = se_access_check(psd, token, desired_access, &granted);
|
||||
|
||||
TALLOC_FREE(psd);
|
||||
|
||||
return ret;
|
||||
return NT_STATUS_IS_OK(status);
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
|
@ -1,8 +1,10 @@
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
Copyright (C) Luke Kenneth Casson Leighton 1996-2000.
|
||||
Copyright (C) Tim Potter 2000.
|
||||
Copyright (C) Re-written by Jeremy Allison 2000.
|
||||
|
||||
Copyright (C) Andrew Tridgell 2004
|
||||
Copyright (C) Gerald Carter 2005
|
||||
Copyright (C) Volker Lendecke 2007
|
||||
Copyright (C) Jeremy Allison 2008
|
||||
|
||||
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
|
||||
@ -22,125 +24,6 @@
|
||||
|
||||
extern NT_USER_TOKEN anonymous_token;
|
||||
|
||||
/*********************************************************************************
|
||||
Check an ACE against a SID. We return the remaining needed permission
|
||||
bits not yet granted. Zero means permission allowed (no more needed bits).
|
||||
**********************************************************************************/
|
||||
|
||||
static uint32 check_ace(SEC_ACE *ace, const NT_USER_TOKEN *token, uint32 acc_desired,
|
||||
NTSTATUS *status)
|
||||
{
|
||||
uint32_t mask = ace->access_mask;
|
||||
|
||||
/*
|
||||
* Inherit only is ignored.
|
||||
*/
|
||||
|
||||
if (ace->flags & SEC_ACE_FLAG_INHERIT_ONLY) {
|
||||
return acc_desired;
|
||||
}
|
||||
|
||||
/*
|
||||
* If this ACE has no SID in common with the token,
|
||||
* ignore it as it cannot be used to make an access
|
||||
* determination.
|
||||
*/
|
||||
|
||||
if (!token_sid_in_ace( token, ace))
|
||||
return acc_desired;
|
||||
|
||||
switch (ace->type) {
|
||||
case SEC_ACE_TYPE_ACCESS_ALLOWED:
|
||||
/*
|
||||
* This is explicitly allowed.
|
||||
* Remove the bits from the remaining
|
||||
* access required. Return the remaining
|
||||
* bits needed.
|
||||
*/
|
||||
acc_desired &= ~mask;
|
||||
break;
|
||||
case SEC_ACE_TYPE_ACCESS_DENIED:
|
||||
/*
|
||||
* This is explicitly denied.
|
||||
* If any bits match terminate here,
|
||||
* we are denied.
|
||||
*/
|
||||
if (acc_desired & mask) {
|
||||
*status = NT_STATUS_ACCESS_DENIED;
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
break;
|
||||
case SEC_ACE_TYPE_SYSTEM_ALARM:
|
||||
case SEC_ACE_TYPE_SYSTEM_AUDIT:
|
||||
*status = NT_STATUS_NOT_IMPLEMENTED;
|
||||
return 0xFFFFFFFF;
|
||||
default:
|
||||
*status = NT_STATUS_INVALID_PARAMETER;
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
return acc_desired;
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
Maximum access was requested. Calculate the max possible. Fail if it doesn't
|
||||
include other bits requested.
|
||||
**********************************************************************************/
|
||||
|
||||
static bool get_max_access( SEC_ACL *the_acl, const NT_USER_TOKEN *token, uint32 *granted,
|
||||
uint32 desired,
|
||||
NTSTATUS *status)
|
||||
{
|
||||
uint32 acc_denied = 0;
|
||||
uint32 acc_granted = 0;
|
||||
size_t i;
|
||||
|
||||
for ( i = 0 ; i < the_acl->num_aces; i++) {
|
||||
SEC_ACE *ace = &the_acl->aces[i];
|
||||
uint32 mask = ace->access_mask;
|
||||
|
||||
if (!token_sid_in_ace( token, ace))
|
||||
continue;
|
||||
|
||||
switch (ace->type) {
|
||||
case SEC_ACE_TYPE_ACCESS_ALLOWED:
|
||||
acc_granted |= (mask & ~acc_denied);
|
||||
break;
|
||||
case SEC_ACE_TYPE_ACCESS_DENIED:
|
||||
acc_denied |= (mask & ~acc_granted);
|
||||
break;
|
||||
case SEC_ACE_TYPE_SYSTEM_ALARM:
|
||||
case SEC_ACE_TYPE_SYSTEM_AUDIT:
|
||||
*status = NT_STATUS_NOT_IMPLEMENTED;
|
||||
*granted = 0;
|
||||
return False;
|
||||
default:
|
||||
*status = NT_STATUS_INVALID_PARAMETER;
|
||||
*granted = 0;
|
||||
return False;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If we were granted no access, or we desired bits that we
|
||||
* didn't get, then deny.
|
||||
*/
|
||||
|
||||
if ((acc_granted == 0) || ((acc_granted & desired) != desired)) {
|
||||
*status = NT_STATUS_ACCESS_DENIED;
|
||||
*granted = 0;
|
||||
return False;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the access we did get.
|
||||
*/
|
||||
|
||||
*granted = acc_granted;
|
||||
*status = NT_STATUS_OK;
|
||||
return True;
|
||||
}
|
||||
|
||||
/* Map generic access rights to object specific rights. This technique is
|
||||
used to give meaning to assigning read, write, execute and all access to
|
||||
objects. Each type of object has its own mapping of generic to object
|
||||
@ -203,13 +86,13 @@ void se_map_standard(uint32 *access_mask, struct standard_mapping *mapping)
|
||||
{
|
||||
uint32 old_mask = *access_mask;
|
||||
|
||||
if (*access_mask & READ_CONTROL_ACCESS) {
|
||||
*access_mask &= ~READ_CONTROL_ACCESS;
|
||||
if (*access_mask & SEC_STD_READ_CONTROL) {
|
||||
*access_mask &= ~SEC_STD_READ_CONTROL;
|
||||
*access_mask |= mapping->std_read;
|
||||
}
|
||||
|
||||
if (*access_mask & (DELETE_ACCESS|WRITE_DAC_ACCESS|WRITE_OWNER_ACCESS|SYNCHRONIZE_ACCESS)) {
|
||||
*access_mask &= ~(DELETE_ACCESS|WRITE_DAC_ACCESS|WRITE_OWNER_ACCESS|SYNCHRONIZE_ACCESS);
|
||||
if (*access_mask & (SEC_STD_DELETE|SEC_STD_WRITE_DAC|SEC_STD_WRITE_OWNER|SEC_STD_SYNCHRONIZE)) {
|
||||
*access_mask &= ~(SEC_STD_DELETE|SEC_STD_WRITE_DAC|SEC_STD_WRITE_OWNER|SEC_STD_SYNCHRONIZE);
|
||||
*access_mask |= mapping->std_all;
|
||||
}
|
||||
|
||||
@ -219,122 +102,140 @@ void se_map_standard(uint32 *access_mask, struct standard_mapping *mapping)
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
Check access rights of a user against a security descriptor. Look at
|
||||
each ACE in the security descriptor until an access denied ACE denies
|
||||
any of the desired rights to the user or any of the users groups, or one
|
||||
or more ACEs explicitly grant all requested access rights. See
|
||||
"Access-Checking" document in MSDN.
|
||||
*****************************************************************************/
|
||||
|
||||
bool se_access_check(const SEC_DESC *sd, const NT_USER_TOKEN *token,
|
||||
uint32 acc_desired, uint32 *acc_granted,
|
||||
NTSTATUS *status)
|
||||
/*
|
||||
perform a SEC_FLAG_MAXIMUM_ALLOWED access check
|
||||
*/
|
||||
static uint32_t access_check_max_allowed(const struct security_descriptor *sd,
|
||||
const NT_USER_TOKEN *token)
|
||||
{
|
||||
size_t i;
|
||||
SEC_ACL *the_acl;
|
||||
uint32 tmp_acc_desired = acc_desired;
|
||||
|
||||
if (!status || !acc_granted)
|
||||
return False;
|
||||
|
||||
if (!token)
|
||||
token = &anonymous_token;
|
||||
|
||||
*status = NT_STATUS_OK;
|
||||
*acc_granted = 0;
|
||||
|
||||
DEBUG(10,("se_access_check: requested access 0x%08x, for NT token "
|
||||
"with %u entries and first sid %s.\n",
|
||||
(unsigned int)acc_desired, (unsigned int)token->num_sids,
|
||||
sid_string_dbg(&token->user_sids[0])));
|
||||
|
||||
/*
|
||||
* No security descriptor or security descriptor with no DACL
|
||||
* present allows all access.
|
||||
*/
|
||||
|
||||
/* ACL must have something in it */
|
||||
|
||||
if (!sd || (sd && (!(sd->type & SEC_DESC_DACL_PRESENT) || sd->dacl == NULL))) {
|
||||
*status = NT_STATUS_OK;
|
||||
*acc_granted = acc_desired;
|
||||
DEBUG(5, ("se_access_check: no sd or blank DACL, access allowed\n"));
|
||||
return True;
|
||||
uint32_t denied = 0, granted = 0;
|
||||
unsigned i;
|
||||
|
||||
if (is_sid_in_token(token, sd->owner_sid)) {
|
||||
granted |= SEC_STD_WRITE_DAC | SEC_STD_READ_CONTROL | SEC_STD_DELETE;
|
||||
} else if (user_has_privileges(token, &se_restore)) {
|
||||
granted |= SEC_STD_DELETE;
|
||||
}
|
||||
|
||||
/* The user sid is the first in the token */
|
||||
if (DEBUGLVL(3)) {
|
||||
DEBUG(3, ("se_access_check: user sid is %s\n",
|
||||
sid_string_dbg(
|
||||
&token->user_sids[PRIMARY_USER_SID_INDEX])));
|
||||
|
||||
for (i = 1; i < token->num_sids; i++) {
|
||||
DEBUGADD(3, ("se_access_check: also %s\n",
|
||||
sid_string_dbg(&token->user_sids[i])));
|
||||
if (sd->dacl == NULL) {
|
||||
return granted & ~denied;
|
||||
}
|
||||
|
||||
for (i = 0;i<sd->dacl->num_aces; i++) {
|
||||
struct security_ace *ace = &sd->dacl->aces[i];
|
||||
|
||||
if (ace->flags & SEC_ACE_FLAG_INHERIT_ONLY) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!is_sid_in_token(token, &ace->trustee)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (ace->type) {
|
||||
case SEC_ACE_TYPE_ACCESS_ALLOWED:
|
||||
granted |= ace->access_mask;
|
||||
break;
|
||||
case SEC_ACE_TYPE_ACCESS_DENIED:
|
||||
case SEC_ACE_TYPE_ACCESS_DENIED_OBJECT:
|
||||
denied |= ace->access_mask;
|
||||
break;
|
||||
default: /* Other ACE types not handled/supported */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Is the token the owner of the SID ? */
|
||||
|
||||
if (sd->owner_sid) {
|
||||
for (i = 0; i < token->num_sids; i++) {
|
||||
if (sid_equal(&token->user_sids[i], sd->owner_sid)) {
|
||||
/*
|
||||
* The owner always has SEC_RIGHTS_WRITE_DAC & READ_CONTROL.
|
||||
*/
|
||||
if (tmp_acc_desired & WRITE_DAC_ACCESS)
|
||||
tmp_acc_desired &= ~WRITE_DAC_ACCESS;
|
||||
if (tmp_acc_desired & READ_CONTROL_ACCESS)
|
||||
tmp_acc_desired &= ~READ_CONTROL_ACCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
the_acl = sd->dacl;
|
||||
|
||||
if (tmp_acc_desired & MAXIMUM_ALLOWED_ACCESS) {
|
||||
tmp_acc_desired &= ~MAXIMUM_ALLOWED_ACCESS;
|
||||
return get_max_access( the_acl, token, acc_granted, tmp_acc_desired,
|
||||
status);
|
||||
}
|
||||
|
||||
for ( i = 0 ; i < the_acl->num_aces && tmp_acc_desired != 0; i++) {
|
||||
SEC_ACE *ace = &the_acl->aces[i];
|
||||
|
||||
DEBUGADD(10,("se_access_check: ACE %u: type %d, flags = "
|
||||
"0x%02x, SID = %s mask = %x, current desired "
|
||||
"= %x\n", (unsigned int)i, ace->type, ace->flags,
|
||||
sid_string_dbg(&ace->trustee),
|
||||
(unsigned int) ace->access_mask,
|
||||
(unsigned int)tmp_acc_desired ));
|
||||
|
||||
tmp_acc_desired = check_ace( ace, token, tmp_acc_desired, status);
|
||||
if (NT_STATUS_V(*status)) {
|
||||
*acc_granted = 0;
|
||||
DEBUG(5,("se_access_check: ACE %u denied with status %s.\n", (unsigned int)i, nt_errstr(*status)));
|
||||
return False;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If there are no more desired permissions left then
|
||||
* access was allowed.
|
||||
*/
|
||||
|
||||
if (tmp_acc_desired == 0) {
|
||||
*acc_granted = acc_desired;
|
||||
*status = NT_STATUS_OK;
|
||||
DEBUG(5,("se_access_check: access (%x) granted.\n", (unsigned int)acc_desired ));
|
||||
return True;
|
||||
}
|
||||
|
||||
*acc_granted = 0;
|
||||
*status = NT_STATUS_ACCESS_DENIED;
|
||||
DEBUG(5,("se_access_check: access (%x) denied.\n", (unsigned int)acc_desired ));
|
||||
return False;
|
||||
return granted & ~denied;
|
||||
}
|
||||
|
||||
/*
|
||||
the main entry point for access checking.
|
||||
*/
|
||||
NTSTATUS se_access_check(const struct security_descriptor *sd,
|
||||
const NT_USER_TOKEN *token,
|
||||
uint32_t access_desired,
|
||||
uint32_t *access_granted)
|
||||
{
|
||||
int i;
|
||||
uint32_t bits_remaining;
|
||||
|
||||
*access_granted = access_desired;
|
||||
bits_remaining = access_desired;
|
||||
|
||||
/* handle the maximum allowed flag */
|
||||
if (access_desired & SEC_FLAG_MAXIMUM_ALLOWED) {
|
||||
access_desired |= access_check_max_allowed(sd, token);
|
||||
access_desired &= ~SEC_FLAG_MAXIMUM_ALLOWED;
|
||||
*access_granted = access_desired;
|
||||
bits_remaining = access_desired & ~SEC_STD_DELETE;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* We need to support SeSecurityPrivilege for this. */
|
||||
|
||||
if (access_desired & SEC_FLAG_SYSTEM_SECURITY) {
|
||||
if (user_has_privileges(token, &sec_security)) {
|
||||
bits_remaining &= ~SEC_FLAG_SYSTEM_SECURITY;
|
||||
} else {
|
||||
return NT_STATUS_PRIVILEGE_NOT_HELD;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* a NULL dacl allows access */
|
||||
if ((sd->type & SEC_DESC_DACL_PRESENT) && sd->dacl == NULL) {
|
||||
*access_granted = access_desired;
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
/* the owner always gets SEC_STD_WRITE_DAC, SEC_STD_READ_CONTROL and SEC_STD_DELETE */
|
||||
if ((bits_remaining & (SEC_STD_WRITE_DAC|SEC_STD_READ_CONTROL|SEC_STD_DELETE)) &&
|
||||
is_sid_in_token(token, sd->owner_sid)) {
|
||||
bits_remaining &= ~(SEC_STD_WRITE_DAC|SEC_STD_READ_CONTROL|SEC_STD_DELETE);
|
||||
}
|
||||
if ((bits_remaining & SEC_STD_DELETE) &&
|
||||
user_has_privileges(token, &se_restore)) {
|
||||
bits_remaining &= ~SEC_STD_DELETE;
|
||||
}
|
||||
|
||||
if (sd->dacl == NULL) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* check each ace in turn. */
|
||||
for (i=0; bits_remaining && i < sd->dacl->num_aces; i++) {
|
||||
struct security_ace *ace = &sd->dacl->aces[i];
|
||||
|
||||
if (ace->flags & SEC_ACE_FLAG_INHERIT_ONLY) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!is_sid_in_token(token, &ace->trustee)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (ace->type) {
|
||||
case SEC_ACE_TYPE_ACCESS_ALLOWED:
|
||||
bits_remaining &= ~ace->access_mask;
|
||||
break;
|
||||
case SEC_ACE_TYPE_ACCESS_DENIED:
|
||||
case SEC_ACE_TYPE_ACCESS_DENIED_OBJECT:
|
||||
if (bits_remaining & ace->access_mask) {
|
||||
return NT_STATUS_ACCESS_DENIED;
|
||||
}
|
||||
break;
|
||||
default: /* Other ACE types not handled/supported */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
if (bits_remaining != 0) {
|
||||
return NT_STATUS_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
samr_make_sam_obj_sd
|
||||
|
@ -8,6 +8,31 @@
|
||||
#ifndef _HEADER_samr
|
||||
#define _HEADER_samr
|
||||
|
||||
#define SAMR_ACCESS_ALL_ACCESS ( 0x0000003F )
|
||||
#define GENERIC_RIGHTS_SAM_ALL_ACCESS ( (STANDARD_RIGHTS_REQUIRED_ACCESS|SAMR_ACCESS_ALL_ACCESS) )
|
||||
#define GENERIC_RIGHTS_SAM_READ ( (STANDARD_RIGHTS_READ_ACCESS|SAMR_ACCESS_ENUM_DOMAINS) )
|
||||
#define GENERIC_RIGHTS_SAM_WRITE ( (STANDARD_RIGHTS_WRITE_ACCESS|SAMR_ACCESS_CREATE_DOMAIN|SAMR_ACCESS_INITIALIZE_SERVER|SAMR_ACCESS_SHUTDOWN_SERVER) )
|
||||
#define GENERIC_RIGHTS_SAM_EXECUTE ( (STANDARD_RIGHTS_EXECUTE_ACCESS|SAMR_ACCESS_OPEN_DOMAIN|SAMR_ACCESS_CONNECT_TO_SERVER) )
|
||||
#define SAMR_USER_ACCESS_ALL_ACCESS ( 0x000007FF )
|
||||
#define GENERIC_RIGHTS_USER_ALL_ACCESS ( (STANDARD_RIGHTS_REQUIRED_ACCESS|SAMR_USER_ACCESS_ALL_ACCESS) )
|
||||
#define GENERIC_RIGHTS_USER_READ ( (STANDARD_RIGHTS_READ_ACCESS|SAMR_USER_ACCESS_GET_GROUP_MEMBERSHIP|SAMR_USER_ACCESS_GET_GROUPS|SAMR_USER_ACCESS_GET_ATTRIBUTES|SAMR_USER_ACCESS_GET_LOGONINFO|SAMR_USER_ACCESS_GET_LOCALE) )
|
||||
#define GENERIC_RIGHTS_USER_WRITE ( (STANDARD_RIGHTS_WRITE_ACCESS|SAMR_USER_ACCESS_CHANGE_PASSWORD|SAMR_USER_ACCESS_SET_LOC_COM|SAMR_USER_ACCESS_SET_ATTRIBUTES|SAMR_USER_ACCESS_SET_PASSWORD|SAMR_USER_ACCESS_CHANGE_GROUP_MEMBERSHIP) )
|
||||
#define GENERIC_RIGHTS_USER_EXECUTE ( (STANDARD_RIGHTS_EXECUTE_ACCESS|SAMR_USER_ACCESS_CHANGE_PASSWORD|SAMR_USER_ACCESS_GET_NAME_ETC) )
|
||||
#define SAMR_DOMAIN_ACCESS_ALL_ACCESS ( 0x000007FF )
|
||||
#define GENERIC_RIGHTS_DOMAIN_ALL_ACCESS ( (STANDARD_RIGHTS_REQUIRED_ACCESS|SAMR_DOMAIN_ACCESS_ALL_ACCESS) )
|
||||
#define GENERIC_RIGHTS_DOMAIN_READ ( (STANDARD_RIGHTS_READ_ACCESS|SAMR_DOMAIN_ACCESS_LOOKUP_ALIAS|SAMR_DOMAIN_ACCESS_LOOKUP_INFO_2) )
|
||||
#define GENERIC_RIGHTS_DOMAIN_WRITE ( (STANDARD_RIGHTS_WRITE_ACCESS|SAMR_DOMAIN_ACCESS_SET_INFO_3|SAMR_DOMAIN_ACCESS_CREATE_ALIAS|SAMR_DOMAIN_ACCESS_CREATE_GROUP|SAMR_DOMAIN_ACCESS_CREATE_USER|SAMR_DOMAIN_ACCESS_SET_INFO_2|SAMR_DOMAIN_ACCESS_SET_INFO_1) )
|
||||
#define GENERIC_RIGHTS_DOMAIN_EXECUTE ( (STANDARD_RIGHTS_EXECUTE_ACCESS|SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT|SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS|SAMR_DOMAIN_ACCESS_LOOKUP_INFO_1) )
|
||||
#define SAMR_GROUP_ACCESS_ALL_ACCESS ( 0x0000001F )
|
||||
#define GENERIC_RIGHTS_GROUP_ALL_ACCESS ( (STANDARD_RIGHTS_REQUIRED_ACCESS|SAMR_GROUP_ACCESS_ALL_ACCESS) )
|
||||
#define GENERIC_RIGHTS_GROUP_READ ( (STANDARD_RIGHTS_READ_ACCESS|SAMR_GROUP_ACCESS_GET_MEMBERS) )
|
||||
#define GENERIC_RIGHTS_GROUP_WRITE ( (STANDARD_RIGHTS_WRITE_ACCESS|SAMR_GROUP_ACCESS_REMOVE_MEMBER|SAMR_GROUP_ACCESS_ADD_MEMBER|SAMR_GROUP_ACCESS_SET_INFO) )
|
||||
#define GENERIC_RIGHTS_GROUP_EXECUTE ( (STANDARD_RIGHTS_EXECUTE_ACCESS|SAMR_GROUP_ACCESS_LOOKUP_INFO) )
|
||||
#define SAMR_ALIAS_ACCESS_ALL_ACCESS ( 0x0000001F )
|
||||
#define GENERIC_RIGHTS_ALIAS_ALL_ACCESS ( (STANDARD_RIGHTS_REQUIRED_ACCESS|SAMR_ALIAS_ACCESS_ALL_ACCESS) )
|
||||
#define GENERIC_RIGHTS_ALIAS_READ ( (STANDARD_RIGHTS_READ_ACCESS|SAMR_ALIAS_ACCESS_GET_MEMBERS) )
|
||||
#define GENERIC_RIGHTS_ALIAS_WRITE ( (STANDARD_RIGHTS_WRITE_ACCESS|SAMR_ALIAS_ACCESS_REMOVE_MEMBER|SAMR_ALIAS_ACCESS_ADD_MEMBER|SAMR_ALIAS_ACCESS_SET_INFO) )
|
||||
#define GENERIC_RIGHTS_ALIAS_EXECUTE ( (STANDARD_RIGHTS_EXECUTE_ACCESS|SAMR_ALIAS_ACCESS_LOOKUP_INFO) )
|
||||
#define MAX_SAM_ENTRIES_W2K ( 0x400 )
|
||||
#define MAX_SAM_ENTRIES_W95 ( 50 )
|
||||
#define SAMR_ENUM_USERS_MULTIPLIER ( 54 )
|
||||
|
@ -40,6 +40,8 @@ import "misc.idl", "lsa.idl", "security.idl";
|
||||
ACB_NO_AUTH_DATA_REQD = 0x00080000 /* 1 = No authorization data required */
|
||||
} samr_AcctFlags;
|
||||
|
||||
/* SAM server specific access rights */
|
||||
|
||||
typedef [bitmap32bit] bitmap {
|
||||
SAMR_ACCESS_CONNECT_TO_SERVER = 0x00000001,
|
||||
SAMR_ACCESS_SHUTDOWN_SERVER = 0x00000002,
|
||||
@ -49,6 +51,29 @@ import "misc.idl", "lsa.idl", "security.idl";
|
||||
SAMR_ACCESS_OPEN_DOMAIN = 0x00000020
|
||||
} samr_ConnectAccessMask;
|
||||
|
||||
const int SAMR_ACCESS_ALL_ACCESS = 0x0000003F;
|
||||
|
||||
const int GENERIC_RIGHTS_SAM_ALL_ACCESS =
|
||||
(STANDARD_RIGHTS_REQUIRED_ACCESS |
|
||||
SAMR_ACCESS_ALL_ACCESS);
|
||||
|
||||
const int GENERIC_RIGHTS_SAM_READ =
|
||||
(STANDARD_RIGHTS_READ_ACCESS |
|
||||
SAMR_ACCESS_ENUM_DOMAINS);
|
||||
|
||||
const int GENERIC_RIGHTS_SAM_WRITE =
|
||||
(STANDARD_RIGHTS_WRITE_ACCESS |
|
||||
SAMR_ACCESS_CREATE_DOMAIN |
|
||||
SAMR_ACCESS_INITIALIZE_SERVER |
|
||||
SAMR_ACCESS_SHUTDOWN_SERVER);
|
||||
|
||||
const int GENERIC_RIGHTS_SAM_EXECUTE =
|
||||
(STANDARD_RIGHTS_EXECUTE_ACCESS |
|
||||
SAMR_ACCESS_OPEN_DOMAIN |
|
||||
SAMR_ACCESS_CONNECT_TO_SERVER);
|
||||
|
||||
/* User Object specific access rights */
|
||||
|
||||
typedef [bitmap32bit] bitmap {
|
||||
SAMR_USER_ACCESS_GET_NAME_ETC = 0x00000001,
|
||||
SAMR_USER_ACCESS_GET_LOCALE = 0x00000002,
|
||||
@ -63,6 +88,35 @@ import "misc.idl", "lsa.idl", "security.idl";
|
||||
SAMR_USER_ACCESS_CHANGE_GROUP_MEMBERSHIP = 0x00000400
|
||||
} samr_UserAccessMask;
|
||||
|
||||
const int SAMR_USER_ACCESS_ALL_ACCESS = 0x000007FF;
|
||||
|
||||
const int GENERIC_RIGHTS_USER_ALL_ACCESS =
|
||||
(STANDARD_RIGHTS_REQUIRED_ACCESS |
|
||||
SAMR_USER_ACCESS_ALL_ACCESS); /* 0x000f07ff */
|
||||
|
||||
const int GENERIC_RIGHTS_USER_READ =
|
||||
(STANDARD_RIGHTS_READ_ACCESS |
|
||||
SAMR_USER_ACCESS_GET_GROUP_MEMBERSHIP |
|
||||
SAMR_USER_ACCESS_GET_GROUPS |
|
||||
SAMR_USER_ACCESS_GET_ATTRIBUTES |
|
||||
SAMR_USER_ACCESS_GET_LOGONINFO |
|
||||
SAMR_USER_ACCESS_GET_LOCALE); /* 0x0002031a */
|
||||
|
||||
const int GENERIC_RIGHTS_USER_WRITE =
|
||||
(STANDARD_RIGHTS_WRITE_ACCESS |
|
||||
SAMR_USER_ACCESS_CHANGE_PASSWORD |
|
||||
SAMR_USER_ACCESS_SET_LOC_COM |
|
||||
SAMR_USER_ACCESS_SET_ATTRIBUTES |
|
||||
SAMR_USER_ACCESS_SET_PASSWORD |
|
||||
SAMR_USER_ACCESS_CHANGE_GROUP_MEMBERSHIP); /* 0x000204e4 */
|
||||
|
||||
const int GENERIC_RIGHTS_USER_EXECUTE =
|
||||
(STANDARD_RIGHTS_EXECUTE_ACCESS |
|
||||
SAMR_USER_ACCESS_CHANGE_PASSWORD |
|
||||
SAMR_USER_ACCESS_GET_NAME_ETC); /* 0x00020041 */
|
||||
|
||||
/* Domain Object specific access rights */
|
||||
|
||||
typedef [bitmap32bit] bitmap {
|
||||
SAMR_DOMAIN_ACCESS_LOOKUP_INFO_1 = 0x00000001,
|
||||
SAMR_DOMAIN_ACCESS_SET_INFO_1 = 0x00000002,
|
||||
@ -77,6 +131,34 @@ import "misc.idl", "lsa.idl", "security.idl";
|
||||
SAMR_DOMAIN_ACCESS_SET_INFO_3 = 0x00000400
|
||||
} samr_DomainAccessMask;
|
||||
|
||||
const int SAMR_DOMAIN_ACCESS_ALL_ACCESS = 0x000007FF;
|
||||
|
||||
const int GENERIC_RIGHTS_DOMAIN_ALL_ACCESS =
|
||||
(STANDARD_RIGHTS_REQUIRED_ACCESS |
|
||||
SAMR_DOMAIN_ACCESS_ALL_ACCESS);
|
||||
|
||||
const int GENERIC_RIGHTS_DOMAIN_READ =
|
||||
(STANDARD_RIGHTS_READ_ACCESS |
|
||||
SAMR_DOMAIN_ACCESS_LOOKUP_ALIAS |
|
||||
SAMR_DOMAIN_ACCESS_LOOKUP_INFO_2);
|
||||
|
||||
const int GENERIC_RIGHTS_DOMAIN_WRITE =
|
||||
(STANDARD_RIGHTS_WRITE_ACCESS |
|
||||
SAMR_DOMAIN_ACCESS_SET_INFO_3 |
|
||||
SAMR_DOMAIN_ACCESS_CREATE_ALIAS |
|
||||
SAMR_DOMAIN_ACCESS_CREATE_GROUP |
|
||||
SAMR_DOMAIN_ACCESS_CREATE_USER |
|
||||
SAMR_DOMAIN_ACCESS_SET_INFO_2 |
|
||||
SAMR_DOMAIN_ACCESS_SET_INFO_1);
|
||||
|
||||
const int GENERIC_RIGHTS_DOMAIN_EXECUTE =
|
||||
(STANDARD_RIGHTS_EXECUTE_ACCESS |
|
||||
SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT |
|
||||
SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS |
|
||||
SAMR_DOMAIN_ACCESS_LOOKUP_INFO_1);
|
||||
|
||||
/* Group Object specific access rights */
|
||||
|
||||
typedef [bitmap32bit] bitmap {
|
||||
SAMR_GROUP_ACCESS_LOOKUP_INFO = 0x00000001,
|
||||
SAMR_GROUP_ACCESS_SET_INFO = 0x00000002,
|
||||
@ -85,6 +167,28 @@ import "misc.idl", "lsa.idl", "security.idl";
|
||||
SAMR_GROUP_ACCESS_GET_MEMBERS = 0x00000010
|
||||
} samr_GroupAccessMask;
|
||||
|
||||
const int SAMR_GROUP_ACCESS_ALL_ACCESS = 0x0000001F;
|
||||
|
||||
const int GENERIC_RIGHTS_GROUP_ALL_ACCESS =
|
||||
(STANDARD_RIGHTS_REQUIRED_ACCESS |
|
||||
SAMR_GROUP_ACCESS_ALL_ACCESS); /* 0x000f001f */
|
||||
|
||||
const int GENERIC_RIGHTS_GROUP_READ =
|
||||
(STANDARD_RIGHTS_READ_ACCESS |
|
||||
SAMR_GROUP_ACCESS_GET_MEMBERS); /* 0x00020010 */
|
||||
|
||||
const int GENERIC_RIGHTS_GROUP_WRITE =
|
||||
(STANDARD_RIGHTS_WRITE_ACCESS |
|
||||
SAMR_GROUP_ACCESS_REMOVE_MEMBER |
|
||||
SAMR_GROUP_ACCESS_ADD_MEMBER |
|
||||
SAMR_GROUP_ACCESS_SET_INFO); /* 0x0002000e */
|
||||
|
||||
const int GENERIC_RIGHTS_GROUP_EXECUTE =
|
||||
(STANDARD_RIGHTS_EXECUTE_ACCESS |
|
||||
SAMR_GROUP_ACCESS_LOOKUP_INFO); /* 0x00020001 */
|
||||
|
||||
/* Alias Object specific access rights */
|
||||
|
||||
typedef [bitmap32bit] bitmap {
|
||||
SAMR_ALIAS_ACCESS_ADD_MEMBER = 0x00000001,
|
||||
SAMR_ALIAS_ACCESS_REMOVE_MEMBER = 0x00000002,
|
||||
@ -93,6 +197,26 @@ import "misc.idl", "lsa.idl", "security.idl";
|
||||
SAMR_ALIAS_ACCESS_SET_INFO = 0x00000010
|
||||
} samr_AliasAccessMask;
|
||||
|
||||
const int SAMR_ALIAS_ACCESS_ALL_ACCESS = 0x0000001F;
|
||||
|
||||
const int GENERIC_RIGHTS_ALIAS_ALL_ACCESS =
|
||||
(STANDARD_RIGHTS_REQUIRED_ACCESS |
|
||||
SAMR_ALIAS_ACCESS_ALL_ACCESS); /* 0x000f001f */
|
||||
|
||||
const int GENERIC_RIGHTS_ALIAS_READ =
|
||||
(STANDARD_RIGHTS_READ_ACCESS |
|
||||
SAMR_ALIAS_ACCESS_GET_MEMBERS); /* 0x00020004 */
|
||||
|
||||
const int GENERIC_RIGHTS_ALIAS_WRITE =
|
||||
(STANDARD_RIGHTS_WRITE_ACCESS |
|
||||
SAMR_ALIAS_ACCESS_REMOVE_MEMBER |
|
||||
SAMR_ALIAS_ACCESS_ADD_MEMBER |
|
||||
SAMR_ALIAS_ACCESS_SET_INFO); /* 0x00020013 */
|
||||
|
||||
const int GENERIC_RIGHTS_ALIAS_EXECUTE =
|
||||
(STANDARD_RIGHTS_EXECUTE_ACCESS |
|
||||
SAMR_ALIAS_ACCESS_LOOKUP_INFO); /* 0x00020008 */
|
||||
|
||||
/******************/
|
||||
/* Function: 0x00 */
|
||||
NTSTATUS samr_Connect (
|
||||
|
@ -376,11 +376,11 @@ static int open_acl_xattr(vfs_handle_struct *handle,
|
||||
&pdesc);
|
||||
if (NT_STATUS_IS_OK(status)) {
|
||||
/* See if we can access it. */
|
||||
if (!se_access_check(pdesc,
|
||||
status = se_access_check(pdesc,
|
||||
handle->conn->server_info->ptok,
|
||||
fsp->access_mask,
|
||||
&access_granted,
|
||||
&status)) {
|
||||
&access_granted);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
errno = map_errno_from_nt_status(status);
|
||||
return -1;
|
||||
}
|
||||
|
@ -5825,10 +5825,10 @@ bool print_access_check(struct auth_serversupplied_info *server_info, int snum,
|
||||
}
|
||||
|
||||
/* Check access */
|
||||
result = se_access_check(secdesc->sd, server_info->ptok, access_type,
|
||||
&access_granted, &status);
|
||||
status = se_access_check(secdesc->sd, server_info->ptok, access_type,
|
||||
&access_granted);
|
||||
|
||||
DEBUG(4, ("access check was %s\n", result ? "SUCCESS" : "FAILURE"));
|
||||
DEBUG(4, ("access check was %s\n", NT_STATUS_IS_OK(status) ? "SUCCESS" : "FAILURE"));
|
||||
|
||||
/* see if we need to try the printer admin list */
|
||||
|
||||
@ -5842,11 +5842,11 @@ bool print_access_check(struct auth_serversupplied_info *server_info, int snum,
|
||||
|
||||
talloc_destroy(mem_ctx);
|
||||
|
||||
if (!result) {
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
errno = EACCES;
|
||||
}
|
||||
|
||||
return result;
|
||||
return NT_STATUS_IS_OK(status);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -170,7 +170,8 @@ bool regkey_access_check( REGISTRY_KEY *key, uint32 requested, uint32 *granted,
|
||||
|
||||
se_map_generic( &requested, ®_generic_map );
|
||||
|
||||
if (!se_access_check(sec_desc, token, requested, granted, &status)) {
|
||||
status =se_access_check(sec_desc, token, requested, granted);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
TALLOC_FREE(mem_ctx);
|
||||
return false;
|
||||
}
|
||||
|
@ -71,8 +71,7 @@ static bool elog_check_access( EVENTLOG_INFO *info, NT_USER_TOKEN *token )
|
||||
{
|
||||
char *tdbname = elog_tdbname(talloc_tos(), info->logname );
|
||||
SEC_DESC *sec_desc;
|
||||
bool ret;
|
||||
NTSTATUS ntstatus;
|
||||
NTSTATUS status;
|
||||
|
||||
if ( !tdbname )
|
||||
return False;
|
||||
@ -97,15 +96,15 @@ static bool elog_check_access( EVENTLOG_INFO *info, NT_USER_TOKEN *token )
|
||||
|
||||
/* run the check, try for the max allowed */
|
||||
|
||||
ret = se_access_check( sec_desc, token, MAXIMUM_ALLOWED_ACCESS,
|
||||
&info->access_granted, &ntstatus );
|
||||
status = se_access_check( sec_desc, token, MAXIMUM_ALLOWED_ACCESS,
|
||||
&info->access_granted);
|
||||
|
||||
if ( sec_desc )
|
||||
TALLOC_FREE( sec_desc );
|
||||
|
||||
if ( !ret ) {
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
DEBUG(8,("elog_check_access: se_access_check() return %s\n",
|
||||
nt_errstr( ntstatus)));
|
||||
nt_errstr(status)));
|
||||
return False;
|
||||
}
|
||||
|
||||
|
@ -381,7 +381,8 @@ NTSTATUS _lsa_OpenPolicy2(pipes_struct *p,
|
||||
/* 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)) {
|
||||
status = se_access_check(psd, p->pipe_user.nt_user_token, des_access, &acc_granted);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
if (p->pipe_user.ut.uid != sec_initial_uid()) {
|
||||
return status;
|
||||
}
|
||||
@ -431,7 +432,8 @@ NTSTATUS _lsa_OpenPolicy(pipes_struct *p,
|
||||
/* 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)) {
|
||||
status = se_access_check(psd, p->pipe_user.nt_user_token, des_access, &acc_granted);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
if (p->pipe_user.ut.uid != sec_initial_uid()) {
|
||||
return status;
|
||||
}
|
||||
|
@ -38,10 +38,10 @@
|
||||
|
||||
#define SAMR_USR_RIGHTS_WRITE_PW \
|
||||
( READ_CONTROL_ACCESS | \
|
||||
SA_RIGHT_USER_CHANGE_PASSWORD | \
|
||||
SA_RIGHT_USER_SET_LOC_COM )
|
||||
SAMR_USER_ACCESS_CHANGE_PASSWORD | \
|
||||
SAMR_USER_ACCESS_SET_LOC_COM)
|
||||
#define SAMR_USR_RIGHTS_CANT_WRITE_PW \
|
||||
( READ_CONTROL_ACCESS | SA_RIGHT_USER_SET_LOC_COM )
|
||||
( READ_CONTROL_ACCESS | SAMR_USER_ACCESS_SET_LOC_COM )
|
||||
|
||||
#define DISP_INFO_CACHE_TIMEOUT 10
|
||||
|
||||
@ -91,7 +91,7 @@ static const struct generic_mapping usr_generic_mapping = {
|
||||
static const struct generic_mapping usr_nopwchange_generic_mapping = {
|
||||
GENERIC_RIGHTS_USER_READ,
|
||||
GENERIC_RIGHTS_USER_WRITE,
|
||||
GENERIC_RIGHTS_USER_EXECUTE & ~SA_RIGHT_USER_CHANGE_PASSWORD,
|
||||
GENERIC_RIGHTS_USER_EXECUTE & ~SAMR_USER_ACCESS_CHANGE_PASSWORD,
|
||||
GENERIC_RIGHTS_USER_ALL_ACCESS};
|
||||
static const struct generic_mapping grp_generic_mapping = {
|
||||
GENERIC_RIGHTS_GROUP_READ,
|
||||
@ -186,8 +186,10 @@ static NTSTATUS access_check_samr_object( SEC_DESC *psd, NT_USER_TOKEN *token,
|
||||
|
||||
/* check the security descriptor first */
|
||||
|
||||
if ( se_access_check(psd, token, des_access, acc_granted, &status) )
|
||||
status = se_access_check(psd, token, des_access, acc_granted);
|
||||
if (NT_STATUS_IS_OK(status)) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* give root a free pass */
|
||||
|
||||
@ -620,7 +622,7 @@ NTSTATUS _samr_OpenDomain(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(info->acc_granted,
|
||||
SA_RIGHT_SAM_OPEN_DOMAIN,
|
||||
SAMR_ACCESS_OPEN_DOMAIN,
|
||||
"_samr_OpenDomain" );
|
||||
|
||||
if ( !NT_STATUS_IS_OK(status) )
|
||||
@ -789,7 +791,7 @@ NTSTATUS _samr_SetSecurity(pipes_struct *p,
|
||||
if (sid_equal(&pol_sid, &dacl->aces[i].trustee)) {
|
||||
ret = pdb_set_pass_can_change(sampass,
|
||||
(dacl->aces[i].access_mask &
|
||||
SA_RIGHT_USER_CHANGE_PASSWORD) ?
|
||||
SAMR_USER_ACCESS_CHANGE_PASSWORD) ?
|
||||
True: False);
|
||||
break;
|
||||
}
|
||||
@ -801,7 +803,7 @@ NTSTATUS _samr_SetSecurity(pipes_struct *p,
|
||||
}
|
||||
|
||||
status = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_USER_SET_ATTRIBUTES,
|
||||
SAMR_USER_ACCESS_SET_ATTRIBUTES,
|
||||
"_samr_SetSecurity");
|
||||
if (NT_STATUS_IS_OK(status)) {
|
||||
become_root();
|
||||
@ -988,7 +990,7 @@ NTSTATUS _samr_EnumDomainUsers(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(info->acc_granted,
|
||||
SA_RIGHT_DOMAIN_ENUM_ACCOUNTS,
|
||||
SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
|
||||
"_samr_EnumDomainUsers");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -1127,7 +1129,7 @@ NTSTATUS _samr_EnumDomainGroups(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(info->acc_granted,
|
||||
SA_RIGHT_DOMAIN_ENUM_ACCOUNTS,
|
||||
SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
|
||||
"_samr_EnumDomainGroups");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -1207,7 +1209,7 @@ NTSTATUS _samr_EnumDomainAliases(pipes_struct *p,
|
||||
sid_string_dbg(&info->sid)));
|
||||
|
||||
status = access_check_samr_function(info->acc_granted,
|
||||
SA_RIGHT_DOMAIN_ENUM_ACCOUNTS,
|
||||
SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
|
||||
"_samr_EnumDomainAliases");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -1480,7 +1482,7 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(info->acc_granted,
|
||||
SA_RIGHT_DOMAIN_ENUM_ACCOUNTS,
|
||||
SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
|
||||
"_samr_QueryDisplayInfo");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -1735,7 +1737,7 @@ NTSTATUS _samr_QueryAliasInfo(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_ALIAS_LOOKUP_INFO,
|
||||
SAMR_ALIAS_ACCESS_LOOKUP_INFO,
|
||||
"_samr_QueryAliasInfo");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -2060,8 +2062,8 @@ NTSTATUS _samr_LookupRids(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_DOMAIN_ENUM_ACCOUNTS,
|
||||
"_samr__LookupRids");
|
||||
SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
|
||||
"_samr_LookupRids");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
}
|
||||
@ -2144,7 +2146,7 @@ NTSTATUS _samr_OpenUser(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
nt_status = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_DOMAIN_OPEN_ACCOUNT,
|
||||
SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
|
||||
"_samr_OpenUser" );
|
||||
|
||||
if ( !NT_STATUS_IS_OK(nt_status) )
|
||||
@ -2639,7 +2641,7 @@ NTSTATUS _samr_QueryUserInfo(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(info->acc_granted,
|
||||
SA_RIGHT_DOMAIN_OPEN_ACCOUNT,
|
||||
SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
|
||||
"_samr_QueryUserInfo");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -2762,7 +2764,7 @@ NTSTATUS _samr_GetGroupsForUser(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
result = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_USER_GET_GROUPS,
|
||||
SAMR_USER_ACCESS_GET_GROUPS,
|
||||
"_samr_GetGroupsForUser");
|
||||
if (!NT_STATUS_IS_OK(result)) {
|
||||
return result;
|
||||
@ -2889,7 +2891,7 @@ NTSTATUS _samr_QueryDomainInfo(pipes_struct *p,
|
||||
}
|
||||
|
||||
status = access_check_samr_function(info->acc_granted,
|
||||
SA_RIGHT_SAM_OPEN_DOMAIN,
|
||||
SAMR_ACCESS_OPEN_DOMAIN,
|
||||
"_samr_QueryDomainInfo" );
|
||||
|
||||
if ( !NT_STATUS_IS_OK(status) )
|
||||
@ -3145,7 +3147,7 @@ NTSTATUS _samr_CreateUser2(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
nt_status = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_DOMAIN_CREATE_USER,
|
||||
SAMR_DOMAIN_ACCESS_CREATE_USER,
|
||||
"_samr_CreateUser2");
|
||||
if (!NT_STATUS_IS_OK(nt_status)) {
|
||||
return nt_status;
|
||||
@ -3282,14 +3284,14 @@ NTSTATUS _samr_Connect(pipes_struct *p,
|
||||
if ((info = get_samr_info_by_sid(NULL)) == NULL)
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
|
||||
/* don't give away the farm but this is probably ok. The SA_RIGHT_SAM_ENUM_DOMAINS
|
||||
/* don't give away the farm but this is probably ok. The SAMR_ACCESS_ENUM_DOMAINS
|
||||
was observed from a win98 client trying to enumerate users (when configured
|
||||
user level access control on shares) --jerry */
|
||||
|
||||
map_max_allowed_access(p->pipe_user.nt_user_token, &des_access);
|
||||
|
||||
se_map_generic( &des_access, &sam_generic_mapping );
|
||||
info->acc_granted = des_access & (SA_RIGHT_SAM_ENUM_DOMAINS|SA_RIGHT_SAM_OPEN_DOMAIN);
|
||||
info->acc_granted = des_access & (SAMR_ACCESS_ENUM_DOMAINS|SAMR_ACCESS_OPEN_DOMAIN);
|
||||
|
||||
/* get a (unique) handle. open a policy on it. */
|
||||
if (!create_policy_hnd(p, r->out.connect_handle, free_samr_info, (void *)info))
|
||||
@ -3472,11 +3474,11 @@ NTSTATUS _samr_LookupDomain(pipes_struct *p,
|
||||
if (!find_policy_by_hnd(p, r->in.connect_handle, (void**)(void *)&info))
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
/* win9x user manager likes to use SA_RIGHT_SAM_ENUM_DOMAINS here.
|
||||
/* win9x user manager likes to use SAMR_ACCESS_ENUM_DOMAINS here.
|
||||
Reverted that change so we will work with RAS servers again */
|
||||
|
||||
status = access_check_samr_function(info->acc_granted,
|
||||
SA_RIGHT_SAM_OPEN_DOMAIN,
|
||||
SAMR_ACCESS_OPEN_DOMAIN,
|
||||
"_samr_LookupDomain");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -3522,7 +3524,7 @@ NTSTATUS _samr_EnumDomains(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(info->acc_granted,
|
||||
SA_RIGHT_SAM_ENUM_DOMAINS,
|
||||
SAMR_ACCESS_ENUM_DOMAINS,
|
||||
"_samr_EnumDomains");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -3580,7 +3582,7 @@ NTSTATUS _samr_OpenAlias(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_DOMAIN_OPEN_ACCOUNT,
|
||||
SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
|
||||
"_samr_OpenAlias");
|
||||
|
||||
if ( !NT_STATUS_IS_OK(status) )
|
||||
@ -4107,9 +4109,9 @@ NTSTATUS _samr_SetUserInfo(pipes_struct *p,
|
||||
}
|
||||
|
||||
/* This is tricky. A WinXP domain join sets
|
||||
(SA_RIGHT_USER_SET_PASSWORD|SA_RIGHT_USER_SET_ATTRIBUTES|SA_RIGHT_USER_ACCT_FLAGS_EXPIRY)
|
||||
(SAMR_USER_ACCESS_SET_PASSWORD|SAMR_USER_ACCESS_SET_ATTRIBUTES|SAMR_USER_ACCESS_GET_ATTRIBUTES)
|
||||
The MMC lusrmgr plugin includes these perms and more in the SamrOpenUser(). But the
|
||||
standard Win32 API calls just ask for SA_RIGHT_USER_SET_PASSWORD in the SamrOpenUser().
|
||||
standard Win32 API calls just ask for SAMR_USER_ACCESS_SET_PASSWORD in the SamrOpenUser().
|
||||
This should be enough for levels 18, 24, 25,& 26. Info level 23 can set more so
|
||||
we'll use the set from the WinXP join as the basis. */
|
||||
|
||||
@ -4118,12 +4120,12 @@ NTSTATUS _samr_SetUserInfo(pipes_struct *p,
|
||||
case 24:
|
||||
case 25:
|
||||
case 26:
|
||||
acc_required = SA_RIGHT_USER_SET_PASSWORD;
|
||||
acc_required = SAMR_USER_ACCESS_SET_PASSWORD;
|
||||
break;
|
||||
default:
|
||||
acc_required = SA_RIGHT_USER_SET_PASSWORD |
|
||||
SA_RIGHT_USER_SET_ATTRIBUTES |
|
||||
SA_RIGHT_USER_ACCT_FLAGS_EXPIRY;
|
||||
acc_required = SAMR_USER_ACCESS_SET_PASSWORD |
|
||||
SAMR_USER_ACCESS_SET_ATTRIBUTES |
|
||||
SAMR_USER_ACCESS_GET_ATTRIBUTES;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -4340,10 +4342,10 @@ NTSTATUS _samr_GetAliasMembership(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
ntstatus1 = access_check_samr_function(info->acc_granted,
|
||||
SA_RIGHT_DOMAIN_LOOKUP_ALIAS_BY_MEM,
|
||||
SAMR_DOMAIN_ACCESS_LOOKUP_ALIAS,
|
||||
"_samr_GetAliasMembership");
|
||||
ntstatus2 = access_check_samr_function(info->acc_granted,
|
||||
SA_RIGHT_DOMAIN_OPEN_ACCOUNT,
|
||||
SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
|
||||
"_samr_GetAliasMembership");
|
||||
|
||||
if (!NT_STATUS_IS_OK(ntstatus1) || !NT_STATUS_IS_OK(ntstatus2)) {
|
||||
@ -4410,7 +4412,7 @@ NTSTATUS _samr_GetMembersInAlias(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_ALIAS_GET_MEMBERS,
|
||||
SAMR_ALIAS_ACCESS_GET_MEMBERS,
|
||||
"_samr_GetMembersInAlias");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -4478,7 +4480,7 @@ NTSTATUS _samr_QueryGroupMember(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_GROUP_GET_MEMBERS,
|
||||
SAMR_GROUP_ACCESS_GET_MEMBERS,
|
||||
"_samr_QueryGroupMember");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -4542,7 +4544,7 @@ NTSTATUS _samr_AddAliasMember(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_ALIAS_ADD_MEMBER,
|
||||
SAMR_ALIAS_ACCESS_ADD_MEMBER,
|
||||
"_samr_AddAliasMember");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -4591,7 +4593,7 @@ NTSTATUS _samr_DeleteAliasMember(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_ALIAS_REMOVE_MEMBER,
|
||||
SAMR_ALIAS_ACCESS_REMOVE_MEMBER,
|
||||
"_samr_DeleteAliasMember");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -4642,7 +4644,7 @@ NTSTATUS _samr_AddGroupMember(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_GROUP_ADD_MEMBER,
|
||||
SAMR_GROUP_ACCESS_ADD_MEMBER,
|
||||
"_samr_AddGroupMember");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -4702,7 +4704,7 @@ NTSTATUS _samr_DeleteGroupMember(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_GROUP_REMOVE_MEMBER,
|
||||
SAMR_GROUP_ACCESS_REMOVE_MEMBER,
|
||||
"_samr_DeleteGroupMember");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -4983,7 +4985,7 @@ NTSTATUS _samr_CreateDomainGroup(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_DOMAIN_CREATE_GROUP,
|
||||
SAMR_DOMAIN_ACCESS_CREATE_GROUP,
|
||||
"_samr_CreateDomainGroup");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -5065,7 +5067,7 @@ NTSTATUS _samr_CreateDomAlias(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
result = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_DOMAIN_CREATE_ALIAS,
|
||||
SAMR_DOMAIN_ACCESS_CREATE_ALIAS,
|
||||
"_samr_CreateDomAlias");
|
||||
if (!NT_STATUS_IS_OK(result)) {
|
||||
return result;
|
||||
@ -5157,7 +5159,7 @@ NTSTATUS _samr_QueryGroupInfo(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_GROUP_LOOKUP_INFO,
|
||||
SAMR_GROUP_ACCESS_LOOKUP_INFO,
|
||||
"_samr_QueryGroupInfo");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -5263,7 +5265,7 @@ NTSTATUS _samr_SetGroupInfo(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_GROUP_SET_INFO,
|
||||
SAMR_GROUP_ACCESS_SET_INFO,
|
||||
"_samr_SetGroupInfo");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -5328,7 +5330,7 @@ NTSTATUS _samr_SetAliasInfo(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_ALIAS_SET_INFO,
|
||||
SAMR_ALIAS_ACCESS_SET_INFO,
|
||||
"_samr_SetAliasInfo");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -5472,7 +5474,7 @@ NTSTATUS _samr_OpenGroup(pipes_struct *p,
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
|
||||
status = access_check_samr_function(acc_granted,
|
||||
SA_RIGHT_DOMAIN_OPEN_ACCOUNT,
|
||||
SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
|
||||
"_samr_OpenGroup");
|
||||
|
||||
if ( !NT_STATUS_IS_OK(status) )
|
||||
@ -5626,11 +5628,11 @@ NTSTATUS _samr_SetDomainInfo(pipes_struct *p,
|
||||
* levels here, but we're really just looking for
|
||||
* GENERIC_RIGHTS_DOMAIN_WRITE access. Unfortunately
|
||||
* this maps to different specific bits. So
|
||||
* assume if we have SA_RIGHT_DOMAIN_SET_INFO_1
|
||||
* assume if we have SAMR_DOMAIN_ACCESS_SET_INFO_1
|
||||
* set we are ok. */
|
||||
|
||||
result = access_check_samr_function(info->acc_granted,
|
||||
SA_RIGHT_DOMAIN_SET_INFO_1,
|
||||
SAMR_DOMAIN_ACCESS_SET_INFO_1,
|
||||
"_samr_SetDomainInfo");
|
||||
|
||||
if (!NT_STATUS_IS_OK(result))
|
||||
@ -5703,7 +5705,7 @@ NTSTATUS _samr_GetDisplayEnumerationIndex(pipes_struct *p,
|
||||
}
|
||||
|
||||
status = access_check_samr_function(info->acc_granted,
|
||||
SA_RIGHT_DOMAIN_ENUM_ACCOUNTS,
|
||||
SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
|
||||
"_samr_GetDisplayEnumerationIndex");
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
|
@ -123,16 +123,12 @@ static struct service_control_op* find_service_by_name( const char *name )
|
||||
static NTSTATUS svcctl_access_check( SEC_DESC *sec_desc, NT_USER_TOKEN *token,
|
||||
uint32 access_desired, uint32 *access_granted )
|
||||
{
|
||||
NTSTATUS result;
|
||||
|
||||
if ( geteuid() == sec_initial_uid() ) {
|
||||
DEBUG(5,("svcctl_access_check: using root's token\n"));
|
||||
token = get_root_nt_token();
|
||||
}
|
||||
|
||||
se_access_check( sec_desc, token, access_desired, access_granted, &result );
|
||||
|
||||
return result;
|
||||
return se_access_check( sec_desc, token, access_desired, access_granted);
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
|
@ -30,7 +30,6 @@ bool can_access_file_acl(struct connection_struct *conn,
|
||||
const char * fname,
|
||||
uint32_t access_mask)
|
||||
{
|
||||
bool result;
|
||||
NTSTATUS status;
|
||||
uint32_t access_granted;
|
||||
struct security_descriptor *secdesc = NULL;
|
||||
@ -45,10 +44,10 @@ bool can_access_file_acl(struct connection_struct *conn,
|
||||
return false;
|
||||
}
|
||||
|
||||
result = se_access_check(secdesc, conn->server_info->ptok,
|
||||
access_mask, &access_granted, &status);
|
||||
status = se_access_check(secdesc, conn->server_info->ptok,
|
||||
access_mask, &access_granted);
|
||||
TALLOC_FREE(secdesc);
|
||||
return result;
|
||||
return NT_STATUS_IS_OK(status);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -1447,8 +1447,7 @@ void reply_sesssetup_and_X(struct smb_request *req)
|
||||
remove_from_common_flags2(FLAGS2_32_BIT_ERROR_CODES);
|
||||
|
||||
if ((passlen1 > MAX_PASS_LEN)
|
||||
|| (passlen1 > smb_bufrem(req->inbuf,
|
||||
smb_buf(req->inbuf)))) {
|
||||
|| (passlen1 > smb_buflen(req->inbuf))) {
|
||||
reply_nterror(req, nt_status_squash(
|
||||
NT_STATUS_INVALID_PARAMETER));
|
||||
END_PROFILE(SMBsesssetupX);
|
||||
|
@ -4285,16 +4285,15 @@ static void show_userlist(struct rpc_pipe_client *pipe_hnd,
|
||||
uint32 acc_granted;
|
||||
|
||||
if (share_sd != NULL) {
|
||||
if (!se_access_check(share_sd, &tokens[i].token,
|
||||
1, &acc_granted, &status)) {
|
||||
status = se_access_check(share_sd, &tokens[i].token,
|
||||
1, &acc_granted);
|
||||
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
DEBUG(1, ("Could not check share_sd for "
|
||||
"user %s\n",
|
||||
tokens[i].name));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!NT_STATUS_IS_OK(status))
|
||||
continue;
|
||||
}
|
||||
|
||||
if (root_sd == NULL) {
|
||||
@ -4302,16 +4301,13 @@ static void show_userlist(struct rpc_pipe_client *pipe_hnd,
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!se_access_check(root_sd, &tokens[i].token,
|
||||
1, &acc_granted, &status)) {
|
||||
status = se_access_check(root_sd, &tokens[i].token,
|
||||
1, &acc_granted);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
DEBUG(1, ("Could not check root_sd for user %s\n",
|
||||
tokens[i].name));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!NT_STATUS_IS_OK(status))
|
||||
continue;
|
||||
|
||||
d_printf(" %s\n", tokens[i].name);
|
||||
}
|
||||
|
||||
@ -6117,7 +6113,7 @@ static int rpc_trustdom_list(struct net_context *c, int argc, const char **argv)
|
||||
/* SamrConnect2 */
|
||||
nt_status = rpccli_samr_Connect2(pipe_hnd, mem_ctx,
|
||||
pipe_hnd->desthost,
|
||||
SA_RIGHT_SAM_OPEN_DOMAIN,
|
||||
SAMR_ACCESS_OPEN_DOMAIN,
|
||||
&connect_hnd);
|
||||
if (!NT_STATUS_IS_OK(nt_status)) {
|
||||
DEBUG(0, ("Couldn't open SAMR policy handle. Error was %s\n",
|
||||
@ -6131,7 +6127,7 @@ static int rpc_trustdom_list(struct net_context *c, int argc, const char **argv)
|
||||
able to enumerate accounts*/
|
||||
nt_status = rpccli_samr_OpenDomain(pipe_hnd, mem_ctx,
|
||||
&connect_hnd,
|
||||
SA_RIGHT_DOMAIN_ENUM_ACCOUNTS,
|
||||
SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
|
||||
queried_dom_sid,
|
||||
&domain_hnd);
|
||||
if (!NT_STATUS_IS_OK(nt_status)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user