2003-10-06 05:24:48 +04:00
/*
Unix SMB / CIFS implementation .
Privileges handling functions
2005-02-18 01:46:41 +03:00
Copyright ( C ) Jean François Micouleau 1998 - 2001
2003-10-06 05:24:48 +04:00
Copyright ( C ) Simo Sorce 2002 - 2003
2005-03-10 21:50:47 +03:00
Copyright ( C ) Gerald ( Jerry ) Carter 2005
2007-06-14 15:29:35 +04:00
Copyright ( C ) Michael Adam 2007
2003-10-06 05:24:48 +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
2003-10-06 05:24:48 +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 04:52:41 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2003-10-06 05:24:48 +04:00
*/
2005-01-13 21:20:37 +03:00
2003-10-06 05:24:48 +04:00
# include "includes.h"
2005-01-13 21:20:37 +03:00
# define PRIVPREFIX "PRIV_"
2003-10-06 05:24:48 +04:00
2005-03-22 18:39:24 +03:00
typedef struct {
2005-10-18 07:24:00 +04:00
size_t count ;
2005-03-22 18:39:24 +03:00
DOM_SID * list ;
} SID_LIST ;
typedef struct {
2007-09-09 00:30:51 +04:00
TALLOC_CTX * mem_ctx ;
2005-01-17 18:23:11 +03:00
SE_PRIV privilege ;
2005-01-13 21:20:37 +03:00
SID_LIST sids ;
} PRIV_SID_LIST ;
2003-10-06 05:24:48 +04:00
2003-12-04 07:31:29 +03:00
2007-10-19 04:40:25 +04:00
static bool get_privileges ( const DOM_SID * sid , SE_PRIV * mask )
2005-01-13 21:20:37 +03:00
{
TDB_CONTEXT * tdb = get_account_pol_tdb ( ) ;
2007-12-16 00:00:39 +03:00
fstring tmp , keystr ;
2007-03-27 13:59:32 +04:00
TDB_DATA data ;
2005-01-17 23:27:29 +03:00
/* Fail if the admin has not enable privileges */
if ( ! lp_enable_privileges ( ) ) {
return False ;
}
2005-01-13 21:20:37 +03:00
if ( ! tdb )
2005-01-15 05:20:30 +03:00
return False ;
2003-12-04 07:31:29 +03:00
2005-01-17 18:23:11 +03:00
/* PRIV_<SID> (NULL terminated) as the key */
2007-12-16 00:47:30 +03:00
fstr_sprintf ( keystr , " %s%s " , PRIVPREFIX , sid_to_fstring ( tmp , sid ) ) ;
2003-10-06 05:24:48 +04:00
2007-03-27 13:59:32 +04:00
data = tdb_fetch_bystring ( tdb , keystr ) ;
2005-01-17 18:23:11 +03:00
if ( ! data . dptr ) {
2007-12-15 23:11:36 +03:00
DEBUG ( 3 , ( " get_privileges: No privileges assigned to SID "
" [%s] \n " , sid_string_dbg ( sid ) ) ) ;
2005-01-15 05:20:30 +03:00
return False ;
2005-01-13 21:20:37 +03:00
}
2003-10-06 05:24:48 +04:00
2005-01-17 18:23:11 +03:00
SMB_ASSERT ( data . dsize = = sizeof ( SE_PRIV ) ) ;
se_priv_copy ( mask , ( SE_PRIV * ) data . dptr ) ;
2005-02-21 14:21:11 +03:00
SAFE_FREE ( data . dptr ) ;
2005-01-15 05:20:30 +03:00
return True ;
2003-10-06 05:24:48 +04:00
}
2005-01-13 21:20:37 +03:00
/***************************************************************************
Store the privilege mask ( set ) for a given SID
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2003-10-06 05:24:48 +04:00
2007-10-19 04:40:25 +04:00
static bool set_privileges ( const DOM_SID * sid , SE_PRIV * mask )
2005-01-13 21:20:37 +03:00
{
TDB_CONTEXT * tdb = get_account_pol_tdb ( ) ;
2007-12-16 00:00:39 +03:00
fstring tmp , keystr ;
2007-03-27 13:59:32 +04:00
TDB_DATA data ;
2005-01-13 21:20:37 +03:00
2005-01-26 02:32:19 +03:00
if ( ! lp_enable_privileges ( ) )
return False ;
2005-01-13 21:20:37 +03:00
if ( ! tdb )
return False ;
2003-10-06 05:24:48 +04:00
2005-09-23 19:23:16 +04:00
if ( ! sid | | ( sid - > num_auths = = 0 ) ) {
DEBUG ( 0 , ( " set_privileges: Refusing to store empty SID! \n " ) ) ;
return False ;
}
2005-01-17 18:23:11 +03:00
/* PRIV_<SID> (NULL terminated) as the key */
2007-12-16 00:47:30 +03:00
fstr_sprintf ( keystr , " %s%s " , PRIVPREFIX , sid_to_fstring ( tmp , sid ) ) ;
2005-01-17 18:23:11 +03:00
/* no packing. static size structure, just write it out */
2007-03-29 13:35:51 +04:00
data . dptr = ( uint8 * ) mask ;
2005-01-17 18:23:11 +03:00
data . dsize = sizeof ( SE_PRIV ) ;
2003-10-06 05:24:48 +04:00
2007-03-27 13:59:32 +04:00
return ( tdb_store_bystring ( tdb , keystr , data , TDB_REPLACE ) ! = - 1 ) ;
2003-10-06 05:24:48 +04:00
}
2005-01-13 21:20:37 +03:00
/*********************************************************************
2007-08-15 00:11:47 +04:00
get a list of all privileges for all sids in the list
2005-01-13 21:20:37 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-10-19 04:40:25 +04:00
bool get_privileges_for_sids ( SE_PRIV * privileges , DOM_SID * slist , int scount )
2003-10-06 05:24:48 +04:00
{
2005-01-17 18:23:11 +03:00
SE_PRIV mask ;
2005-01-13 21:20:37 +03:00
int i ;
2007-10-19 04:40:25 +04:00
bool found = False ;
2005-01-17 18:23:11 +03:00
se_priv_copy ( privileges , & se_priv_none ) ;
2005-01-13 21:20:37 +03:00
for ( i = 0 ; i < scount ; i + + ) {
/* don't add unless we actually have a privilege assigned */
2003-10-06 05:24:48 +04:00
2005-01-17 18:23:11 +03:00
if ( ! get_privileges ( & slist [ i ] , & mask ) )
2005-01-13 21:20:37 +03:00
continue ;
2005-01-15 05:20:30 +03:00
2007-12-15 23:11:36 +03:00
DEBUG ( 5 , ( " get_privileges_for_sids: sid = %s \n Privilege "
" set: \n " , sid_string_dbg ( & slist [ i ] ) ) ) ;
2005-01-17 18:23:11 +03:00
dump_se_priv ( DBGC_ALL , 5 , & mask ) ;
2005-01-13 21:20:37 +03:00
2005-01-17 18:23:11 +03:00
se_priv_add ( privileges , & mask ) ;
found = True ;
2005-01-13 21:20:37 +03:00
}
2005-01-17 18:23:11 +03:00
return found ;
2003-10-06 05:24:48 +04:00
}
2005-01-13 21:20:37 +03:00
/*********************************************************************
travseral functions for privilege_enumerate_accounts
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static int priv_traverse_fn ( TDB_CONTEXT * t , TDB_DATA key , TDB_DATA data , void * state )
2003-10-06 05:24:48 +04:00
{
2006-07-31 08:30:55 +04:00
PRIV_SID_LIST * priv = ( PRIV_SID_LIST * ) state ;
2005-01-13 21:20:37 +03:00
int prefixlen = strlen ( PRIVPREFIX ) ;
DOM_SID sid ;
fstring sid_string ;
2005-01-17 18:23:11 +03:00
/* easy check first */
if ( data . dsize ! = sizeof ( SE_PRIV ) )
return 0 ;
2003-10-06 05:24:48 +04:00
2005-01-13 21:20:37 +03:00
/* check we have a PRIV_+SID entry */
2003-10-06 05:24:48 +04:00
2007-03-29 13:35:51 +04:00
if ( strncmp ( ( const char * ) key . dptr , PRIVPREFIX , prefixlen ) ! = 0 )
2005-01-13 21:20:37 +03:00
return 0 ;
/* check to see if we are looking for a particular privilege */
2003-10-06 05:24:48 +04:00
2005-01-17 18:23:11 +03:00
if ( ! se_priv_equal ( & priv - > privilege , & se_priv_none ) ) {
SE_PRIV mask ;
se_priv_copy ( & mask , ( SE_PRIV * ) data . dptr ) ;
2005-01-13 21:20:37 +03:00
/* if the SID does not have the specified privilege
then just return */
2005-01-17 18:23:11 +03:00
if ( ! is_privilege_assigned ( & mask , & priv - > privilege ) )
2005-01-13 21:20:37 +03:00
return 0 ;
}
2007-03-29 13:35:51 +04:00
fstrcpy ( sid_string , ( const char * ) & key . dptr [ strlen ( PRIVPREFIX ) ] ) ;
2003-10-06 05:24:48 +04:00
2005-09-23 19:23:16 +04:00
/* this is a last ditch safety check to preventing returning
and invalid SID ( i ' ve somehow run into this on development branches ) */
if ( strcmp ( " S-0-0 " , sid_string ) = = 0 )
return 0 ;
2005-01-13 21:20:37 +03:00
if ( ! string_to_sid ( & sid , sid_string ) ) {
DEBUG ( 0 , ( " travsersal_fn_enum__acct: Could not convert SID [%s] \n " ,
sid_string ) ) ;
return 0 ;
2003-10-06 05:24:48 +04:00
}
2008-01-09 02:11:31 +03:00
if ( ! NT_STATUS_IS_OK ( add_sid_to_array ( priv - > mem_ctx , & sid ,
& priv - > sids . list ,
& priv - > sids . count ) ) )
{
2006-12-09 05:58:18 +03:00
return 0 ;
}
2005-01-13 21:20:37 +03:00
return 0 ;
2003-10-06 05:24:48 +04:00
}
2005-01-13 21:20:37 +03:00
/*********************************************************************
Retreive list of privileged SIDs ( for _lsa_enumerate_accounts ( )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
NTSTATUS privilege_enumerate_accounts ( DOM_SID * * sids , int * num_sids )
2003-10-06 05:24:48 +04:00
{
2005-01-13 21:20:37 +03:00
TDB_CONTEXT * tdb = get_account_pol_tdb ( ) ;
PRIV_SID_LIST priv ;
2006-06-20 05:32:50 +04:00
if ( ! tdb ) {
return NT_STATUS_ACCESS_DENIED ;
}
2005-01-13 21:20:37 +03:00
ZERO_STRUCT ( priv ) ;
2005-01-17 18:23:11 +03:00
se_priv_copy ( & priv . privilege , & se_priv_none ) ;
2003-10-06 05:24:48 +04:00
2005-01-13 21:20:37 +03:00
tdb_traverse ( tdb , priv_traverse_fn , & priv ) ;
2003-10-06 05:24:48 +04:00
2005-01-13 21:20:37 +03:00
/* give the memory away; caller will free */
* sids = priv . sids . list ;
* num_sids = priv . sids . count ;
2003-10-06 05:24:48 +04:00
2005-01-13 21:20:37 +03:00
return NT_STATUS_OK ;
}
2007-09-09 00:30:51 +04:00
/*********************************************************************
Retrieve list of SIDs granted a particular privilege
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
NTSTATUS privilege_enum_sids ( const SE_PRIV * mask , TALLOC_CTX * mem_ctx ,
DOM_SID * * sids , int * num_sids )
{
TDB_CONTEXT * tdb = get_account_pol_tdb ( ) ;
PRIV_SID_LIST priv ;
if ( ! tdb ) {
return NT_STATUS_ACCESS_DENIED ;
}
ZERO_STRUCT ( priv ) ;
se_priv_copy ( & priv . privilege , mask ) ;
priv . mem_ctx = mem_ctx ;
tdb_traverse ( tdb , priv_traverse_fn , & priv ) ;
/* give the memory away; caller will free */
* sids = priv . sids . list ;
* num_sids = priv . sids . count ;
return NT_STATUS_OK ;
}
2005-01-13 21:20:37 +03:00
/***************************************************************************
Add privilege to sid
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-10-19 04:40:25 +04:00
bool grant_privilege ( const DOM_SID * sid , const SE_PRIV * priv_mask )
2005-01-13 21:20:37 +03:00
{
2005-01-17 18:23:11 +03:00
SE_PRIV old_mask , new_mask ;
2003-10-06 05:24:48 +04:00
2005-07-04 17:19:05 +04:00
ZERO_STRUCT ( old_mask ) ;
ZERO_STRUCT ( new_mask ) ;
2005-01-15 05:20:30 +03:00
if ( get_privileges ( sid , & old_mask ) )
2005-01-17 18:23:11 +03:00
se_priv_copy ( & new_mask , & old_mask ) ;
2005-01-15 05:20:30 +03:00
else
2005-01-17 18:23:11 +03:00
se_priv_copy ( & new_mask , & se_priv_none ) ;
se_priv_add ( & new_mask , priv_mask ) ;
2005-01-13 21:20:37 +03:00
2007-12-15 23:11:36 +03:00
DEBUG ( 10 , ( " grant_privilege: %s \n " , sid_string_dbg ( sid ) ) ) ;
2005-01-17 18:23:11 +03:00
DEBUGADD ( 10 , ( " original privilege mask: \n " ) ) ;
dump_se_priv ( DBGC_ALL , 10 , & old_mask ) ;
2003-10-06 05:24:48 +04:00
2005-01-17 18:23:11 +03:00
DEBUGADD ( 10 , ( " new privilege mask: \n " ) ) ;
dump_se_priv ( DBGC_ALL , 10 , & new_mask ) ;
return set_privileges ( sid , & new_mask ) ;
2005-01-13 21:20:37 +03:00
}
2005-01-15 05:20:30 +03:00
/*********************************************************************
Add a privilege based on its name
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-10-19 04:40:25 +04:00
bool grant_privilege_by_name ( DOM_SID * sid , const char * name )
2005-01-15 05:20:30 +03:00
{
2007-06-14 15:29:35 +04:00
SE_PRIV mask ;
2005-01-15 05:20:30 +03:00
2007-06-14 15:29:35 +04:00
if ( ! se_priv_from_name ( name , & mask ) ) {
DEBUG ( 3 , ( " grant_privilege_by_name: "
" No Such Privilege Found (%s) \n " , name ) ) ;
return False ;
}
2005-01-15 05:20:30 +03:00
2007-06-14 15:29:35 +04:00
return grant_privilege ( sid , & mask ) ;
2005-01-15 05:20:30 +03:00
}
2005-01-13 21:20:37 +03:00
/***************************************************************************
Remove privilege from sid
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-10-19 04:40:25 +04:00
bool revoke_privilege ( const DOM_SID * sid , const SE_PRIV * priv_mask )
2005-01-13 21:20:37 +03:00
{
2005-01-17 18:23:11 +03:00
SE_PRIV mask ;
2005-01-13 21:20:37 +03:00
2005-01-17 18:23:11 +03:00
/* if the user has no privileges, then we can't revoke any */
if ( ! get_privileges ( sid , & mask ) )
return True ;
2007-12-15 23:11:36 +03:00
DEBUG ( 10 , ( " revoke_privilege: %s \n " , sid_string_dbg ( sid ) ) ) ;
2005-01-13 21:20:37 +03:00
2005-01-17 18:23:11 +03:00
DEBUGADD ( 10 , ( " original privilege mask: \n " ) ) ;
dump_se_priv ( DBGC_ALL , 10 , & mask ) ;
2005-01-13 21:20:37 +03:00
2005-01-17 18:23:11 +03:00
se_priv_remove ( & mask , priv_mask ) ;
2005-01-13 21:20:37 +03:00
2005-01-17 18:23:11 +03:00
DEBUGADD ( 10 , ( " new privilege mask: \n " ) ) ;
dump_se_priv ( DBGC_ALL , 10 , & mask ) ;
return set_privileges ( sid , & mask ) ;
}
/*********************************************************************
Revoke all privileges
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-10-19 04:40:25 +04:00
bool revoke_all_privileges ( DOM_SID * sid )
2005-01-17 18:23:11 +03:00
{
return revoke_privilege ( sid , & se_priv_all ) ;
2005-01-13 21:20:37 +03:00
}
2005-01-15 05:20:30 +03:00
/*********************************************************************
Add a privilege based on its name
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-10-19 04:40:25 +04:00
bool revoke_privilege_by_name ( DOM_SID * sid , const char * name )
2005-01-15 05:20:30 +03:00
{
2007-06-14 15:29:35 +04:00
SE_PRIV mask ;
2005-01-15 05:20:30 +03:00
2007-06-14 15:29:35 +04:00
if ( ! se_priv_from_name ( name , & mask ) ) {
DEBUG ( 3 , ( " revoke_privilege_by_name: "
" No Such Privilege Found (%s) \n " , name ) ) ;
return False ;
}
2005-01-15 05:20:30 +03:00
2007-06-14 15:29:35 +04:00
return revoke_privilege ( sid , & mask ) ;
2005-01-15 05:20:30 +03:00
}
2005-01-13 21:20:37 +03:00
/***************************************************************************
Retrieve the SIDs assigned to a given privilege
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
NTSTATUS privilege_create_account ( const DOM_SID * sid )
{
2005-01-17 18:23:11 +03:00
return ( grant_privilege ( sid , & se_priv_none ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ) ;
2005-01-13 21:20:37 +03:00
}
/****************************************************************************
initialise a privilege list and set the talloc context
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-06-09 19:20:11 +04:00
2005-01-13 21:20:37 +03:00
NTSTATUS privilege_set_init ( PRIVILEGE_SET * priv_set )
{
2005-01-14 11:14:22 +03:00
TALLOC_CTX * mem_ctx ;
2005-01-13 21:20:37 +03:00
ZERO_STRUCTP ( priv_set ) ;
2005-01-14 11:14:22 +03:00
mem_ctx = talloc_init ( " privilege set " ) ;
2005-01-17 23:27:29 +03:00
if ( ! mem_ctx ) {
DEBUG ( 0 , ( " privilege_set_init: failed to initialize talloc ctx! \n " ) ) ;
return NT_STATUS_NO_MEMORY ;
}
2005-01-13 21:20:37 +03:00
priv_set - > mem_ctx = mem_ctx ;
2005-01-17 23:27:29 +03:00
return NT_STATUS_OK ;
2003-10-06 05:24:48 +04:00
}
/****************************************************************************
2005-01-13 21:20:37 +03:00
initialise a privilege list and with someone else ' s talloc context
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
NTSTATUS privilege_set_init_by_ctx ( TALLOC_CTX * mem_ctx , PRIVILEGE_SET * priv_set )
{
ZERO_STRUCTP ( priv_set ) ;
priv_set - > mem_ctx = mem_ctx ;
priv_set - > ext_ctx = True ;
return NT_STATUS_OK ;
}
/****************************************************************************
Free all memory used by a PRIVILEGE_SET
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void privilege_set_free ( PRIVILEGE_SET * priv_set )
{
if ( ! priv_set )
return ;
if ( ! ( priv_set - > ext_ctx ) )
talloc_destroy ( priv_set - > mem_ctx ) ;
ZERO_STRUCTP ( priv_set ) ;
}
/****************************************************************************
duplicate alloc luid_attr
2003-10-06 05:24:48 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-01-13 21:20:37 +03:00
NTSTATUS dup_luid_attr ( TALLOC_CTX * mem_ctx , LUID_ATTR * * new_la , LUID_ATTR * old_la , int count )
2003-10-06 05:24:48 +04:00
{
int i ;
2005-01-13 21:20:37 +03:00
if ( ! old_la )
2003-10-06 05:24:48 +04:00
return NT_STATUS_OK ;
2007-04-30 06:39:34 +04:00
if ( count ) {
* new_la = TALLOC_ARRAY ( mem_ctx , LUID_ATTR , count ) ;
if ( ! * new_la ) {
DEBUG ( 0 , ( " dup_luid_attr: failed to alloc new LUID_ATTR array [%d] \n " , count ) ) ;
return NT_STATUS_NO_MEMORY ;
}
} else {
* new_la = NULL ;
2005-01-17 23:27:29 +03:00
}
2003-10-06 05:24:48 +04:00
2005-01-13 21:20:37 +03:00
for ( i = 0 ; i < count ; i + + ) {
( * new_la ) [ i ] . luid . high = old_la [ i ] . luid . high ;
( * new_la ) [ i ] . luid . low = old_la [ i ] . luid . low ;
( * new_la ) [ i ] . attr = old_la [ i ] . attr ;
2003-10-06 05:24:48 +04:00
}
2005-01-17 23:27:29 +03:00
return NT_STATUS_OK ;
2005-01-13 21:20:37 +03:00
}
2005-01-18 21:29:28 +03:00
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-10-19 04:40:25 +04:00
bool is_privileged_sid ( const DOM_SID * sid )
2005-01-18 21:29:28 +03:00
{
SE_PRIV mask ;
return get_privileges ( sid , & mask ) ;
}
2006-03-15 08:50:52 +03:00
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-10-19 04:40:25 +04:00
bool grant_all_privileges ( const DOM_SID * sid )
2006-03-15 08:50:52 +03:00
{
SE_PRIV mask ;
2007-06-14 15:29:35 +04:00
if ( ! se_priv_put_all_privileges ( & mask ) ) {
return False ;
2006-03-15 08:50:52 +03:00
}
2007-06-14 15:29:35 +04:00
2006-03-15 08:50:52 +03:00
return grant_privilege ( sid , & mask ) ;
}