2007-05-11 19:08:05 +04:00
/*
* Unix SMB / CIFS implementation .
* Group Policy Object Support
* Copyright ( C ) Guenther Deschner 2007
*
* 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
2007-07-09 23:25:36 +04:00
* the Free Software Foundation ; either version 3 of the License , or
2007-05-11 19:08:05 +04:00
* ( 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
2007-07-10 09:23:25 +04:00
* along with this program ; if not , see < http : //www.gnu.org/licenses/>.
2007-05-11 19:08:05 +04:00
*/
# include "includes.h"
2007-07-11 13:39:08 +04:00
/****************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-05-11 19:28:07 +04:00
2007-07-11 13:39:08 +04:00
static BOOL gpo_sd_check_agp_object_guid ( const struct security_ace_object * object )
{
struct GUID ext_right_apg_guid ;
NTSTATUS status ;
if ( ! object ) {
return False ;
}
2007-05-11 19:28:07 +04:00
2007-07-11 13:39:08 +04:00
status = GUID_from_string ( ADS_EXTENDED_RIGHT_APPLY_GROUP_POLICY ,
& ext_right_apg_guid ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return False ;
}
2007-05-11 19:28:07 +04:00
2007-07-11 13:39:08 +04:00
switch ( object - > flags ) {
case SEC_ACE_OBJECT_PRESENT :
if ( GUID_equal ( & object - > type . type ,
& ext_right_apg_guid ) ) {
return True ;
}
case SEC_ACE_OBJECT_INHERITED_PRESENT :
if ( GUID_equal ( & object - > inherited_type . inherited_type ,
& ext_right_apg_guid ) ) {
return True ;
}
default :
break ;
}
2007-05-11 19:28:07 +04:00
2007-07-11 13:39:08 +04:00
return False ;
}
/****************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL gpo_sd_check_agp_object ( const SEC_ACE * ace )
{
if ( sec_ace_object ( ace - > type ) ) {
return gpo_sd_check_agp_object_guid ( & ace - > object . object ) ;
}
return False ;
}
2007-05-11 19:28:07 +04:00
/****************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL gpo_sd_check_agp_access_bits ( uint32 access_mask )
{
2007-07-11 13:39:08 +04:00
return ( access_mask & SEC_RIGHTS_EXTENDED ) ;
2007-05-11 19:28:07 +04:00
}
2007-06-05 14:23:56 +04:00
#if 0
2007-05-11 19:28:07 +04:00
/****************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL gpo_sd_check_read_access_bits ( uint32 access_mask )
{
uint32 read_bits = SEC_RIGHTS_LIST_CONTENTS |
SEC_RIGHTS_READ_ALL_PROP |
SEC_RIGHTS_READ_PERMS ;
return ( read_bits = = ( access_mask & read_bits ) ) ;
}
2007-06-05 14:23:56 +04:00
# endif
2007-05-11 19:28:07 +04:00
/****************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL gpo_sd_check_trustee_in_sid_token ( const DOM_SID * trustee ,
const struct GPO_SID_TOKEN * token )
{
int i ;
if ( sid_equal ( trustee , & token - > object_sid ) ) {
return True ;
}
if ( sid_equal ( trustee , & token - > primary_group_sid ) ) {
return True ;
}
for ( i = 0 ; i < token - > num_token_sids ; i + + ) {
if ( sid_equal ( trustee , & token - > token_sids [ i ] ) ) {
return True ;
}
}
return False ;
}
/****************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static NTSTATUS gpo_sd_check_ace_denied_object ( const SEC_ACE * ace ,
const struct GPO_SID_TOKEN * token )
{
2007-07-11 13:39:08 +04:00
if ( gpo_sd_check_agp_object ( ace ) & &
gpo_sd_check_agp_access_bits ( ace - > access_mask ) & &
2007-05-11 19:28:07 +04:00
gpo_sd_check_trustee_in_sid_token ( & ace - > trustee , token ) ) {
DEBUG ( 10 , ( " gpo_sd_check_ace_denied_object: Access denied as of ace for %s \n " ,
sid_string_static ( & ace - > trustee ) ) ) ;
return NT_STATUS_ACCESS_DENIED ;
}
return STATUS_MORE_ENTRIES ;
}
/****************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static NTSTATUS gpo_sd_check_ace_allowed_object ( const SEC_ACE * ace ,
const struct GPO_SID_TOKEN * token )
{
2007-07-11 13:39:08 +04:00
if ( gpo_sd_check_agp_object ( ace ) & &
gpo_sd_check_agp_access_bits ( ace - > access_mask ) & &
2007-05-11 19:28:07 +04:00
gpo_sd_check_trustee_in_sid_token ( & ace - > trustee , token ) ) {
DEBUG ( 10 , ( " gpo_sd_check_ace_allowed_object: Access granted as of ace for %s \n " ,
sid_string_static ( & ace - > trustee ) ) ) ;
return NT_STATUS_OK ;
}
return STATUS_MORE_ENTRIES ;
}
/****************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static NTSTATUS gpo_sd_check_ace ( const SEC_ACE * ace ,
const struct GPO_SID_TOKEN * token )
{
switch ( ace - > type ) {
case SEC_ACE_TYPE_ACCESS_DENIED_OBJECT :
return gpo_sd_check_ace_denied_object ( ace , token ) ;
case SEC_ACE_TYPE_ACCESS_ALLOWED_OBJECT :
return gpo_sd_check_ace_allowed_object ( ace , token ) ;
default :
return STATUS_MORE_ENTRIES ;
}
}
2007-05-11 19:08:05 +04:00
/****************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
NTSTATUS gpo_apply_security_filtering ( const struct GROUP_POLICY_OBJECT * gpo ,
const struct GPO_SID_TOKEN * token )
{
2007-05-11 19:28:07 +04:00
SEC_DESC * sd = gpo - > security_descriptor ;
SEC_ACL * dacl = NULL ;
NTSTATUS status = NT_STATUS_ACCESS_DENIED ;
int i ;
if ( ! token ) {
return NT_STATUS_INVALID_USER_BUFFER ;
}
if ( ! sd ) {
return NT_STATUS_INVALID_SECURITY_DESCR ;
}
dacl = sd - > dacl ;
if ( ! dacl ) {
return NT_STATUS_INVALID_SECURITY_DESCR ;
}
/* check all aces and only return NT_STATUS_OK (== Access granted) or
* NT_STATUS_ACCESS_DENIED ( = = Access denied ) - the default is to
* deny access */
for ( i = 0 ; i < dacl - > num_aces ; i + + ) {
status = gpo_sd_check_ace ( & dacl - > aces [ i ] , token ) ;
if ( NT_STATUS_EQUAL ( status , NT_STATUS_ACCESS_DENIED ) ) {
return status ;
} else if ( NT_STATUS_IS_OK ( status ) ) {
return status ;
}
continue ;
}
return NT_STATUS_ACCESS_DENIED ;
2007-05-11 19:08:05 +04:00
}