2007-06-14 15:29:35 +04:00
/*
* Unix SMB / CIFS implementation .
* Authentication utility functions
* Copyright ( C ) Andrew Tridgell 1992 - 1998
2023-09-14 09:24:36 +03:00
* Copyright ( C ) Andrew Bartlett 2001 - 2023
2007-06-14 15:29:35 +04:00
* Copyright ( C ) Jeremy Allison 2000 - 2001
* Copyright ( C ) Rafal Szczesniak 2002
* Copyright ( C ) Volker Lendecke 2006
* Copyright ( C ) Michael Adam 2007
2008-02-29 20:23:53 +03:00
* Copyright ( C ) Guenther Deschner 2007
2007-06-14 15:29:35 +04:00
*
* 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-06-14 15:29:35 +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-06-14 15:29:35 +04:00
*/
/* function(s) moved from auth/auth_util.c to minimize linker deps */
# include "includes.h"
2010-10-12 08:27:50 +04:00
# include "../libcli/security/security.h"
2007-06-14 15:29:35 +04:00
2008-02-29 20:23:53 +03:00
/****************************************************************************
merge NT tokens
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2023-09-15 03:08:20 +03:00
NTSTATUS merge_with_system_token ( TALLOC_CTX * mem_ctx ,
const struct security_token * token_1 ,
struct security_token * * token_out )
2008-02-29 20:23:53 +03:00
{
2023-09-15 03:08:20 +03:00
const struct security_token * token_2 = get_system_token ( ) ;
2010-08-26 14:04:11 +04:00
struct security_token * token = NULL ;
2008-02-29 20:23:53 +03:00
NTSTATUS status ;
2021-01-15 18:02:52 +03:00
uint32_t i ;
2008-02-29 20:23:53 +03:00
if ( ! token_1 | | ! token_2 | | ! token_out ) {
return NT_STATUS_INVALID_PARAMETER ;
}
2011-06-07 05:44:43 +04:00
token = talloc_zero ( mem_ctx , struct security_token ) ;
2008-02-29 20:23:53 +03:00
NT_STATUS_HAVE_NO_MEMORY ( token ) ;
for ( i = 0 ; i < token_1 - > num_sids ; i + + ) {
status = add_sid_to_array_unique ( mem_ctx ,
2010-08-31 03:32:52 +04:00
& token_1 - > sids [ i ] ,
& token - > sids ,
2008-02-29 20:23:53 +03:00
& token - > num_sids ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
TALLOC_FREE ( token ) ;
return status ;
}
}
for ( i = 0 ; i < token_2 - > num_sids ; i + + ) {
status = add_sid_to_array_unique ( mem_ctx ,
2010-08-31 03:32:52 +04:00
& token_2 - > sids [ i ] ,
& token - > sids ,
2008-02-29 20:23:53 +03:00
& token - > num_sids ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
TALLOC_FREE ( token ) ;
return status ;
}
}
2010-08-30 07:14:40 +04:00
token - > privilege_mask | = token_1 - > privilege_mask ;
token - > privilege_mask | = token_2 - > privilege_mask ;
2008-02-29 20:23:53 +03:00
2010-09-17 10:23:53 +04:00
token - > rights_mask | = token_1 - > rights_mask ;
token - > rights_mask | = token_2 - > rights_mask ;
2023-09-15 03:08:20 +03:00
/*
* We don ' t need to merge claims as the system token has no
* claims
*/
2008-02-29 20:23:53 +03:00
* token_out = token ;
return NT_STATUS_OK ;
}
2009-03-01 19:59:30 +03:00
/*******************************************************************
2010-05-18 05:25:38 +04:00
Check if this struct security_ace has a SID in common with the token .
2009-03-01 19:59:30 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2010-08-26 16:08:22 +04:00
bool token_sid_in_ace ( const struct security_token * token , const struct security_ace * ace )
2009-03-01 19:59:30 +03:00
{
size_t i ;
for ( i = 0 ; i < token - > num_sids ; i + + ) {
2010-08-26 17:48:50 +04:00
if ( dom_sid_equal ( & ace - > trustee , & token - > sids [ i ] ) )
2009-03-01 19:59:30 +03:00
return true ;
}
return false ;
}