1998-11-05 19:51:34 +03:00
/*
Unix SMB / Netbios implementation .
Version 1.9 .
Samba utility functions
Copyright ( C ) Andrew Tridgell 1992 - 1998
1999-12-13 16:27:58 +03:00
Copyright ( C ) Luke Kenneth Caseson Leighton 1998 - 1999
Copyright ( C ) Jeremy Allison 1999
1998-11-05 19:51:34 +03: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
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 0213 9 , USA .
*/
# include "includes.h"
extern int DEBUGLEVEL ;
1999-12-13 16:27:58 +03:00
DOM_SID global_sam_sid ;
extern pstring global_myname ;
extern fstring global_myworkgroup ;
/*
* Some useful sids
*/
2000-12-12 05:36:14 +03:00
DOM_SID global_sid_Builtin ; /* Local well-known domain */
DOM_SID global_sid_World_Domain ; /* Everyone domain */
DOM_SID global_sid_World ; /* Everyone */
DOM_SID global_sid_Creator_Owner_Domain ; /* Creator Owner domain */
DOM_SID global_sid_Creator_Owner ; /* Creator Owner */
DOM_SID global_sid_NT_Authority ; /* NT Authority */
DOM_SID global_sid_NULL ; /* NULL sid */
DOM_SID global_sid_Builtin_Guests ; /* Builtin guest users */
DOM_SID global_sid_Authenticated_Users ; /* All authenticated rids */
DOM_SID global_sid_Network ; /* Network rids */
DOM_SID global_sid_Anonymous ; /* Anonymous login */
1999-12-13 16:27:58 +03:00
2000-06-08 12:41:28 +04:00
const DOM_SID * global_sid_everyone = & global_sid_World ;
1999-12-13 16:27:58 +03:00
typedef struct _known_sid_users {
uint32 rid ;
2000-08-23 04:45:40 +04:00
enum SID_NAME_USE sid_name_use ;
1999-12-13 16:27:58 +03:00
char * known_user_name ;
} known_sid_users ;
/* static known_sid_users no_users[] = {{0, 0, NULL}}; */
2000-12-12 05:36:14 +03:00
2000-10-04 05:03:23 +04:00
static known_sid_users everyone_users [ ] = {
{ 0 , SID_NAME_WKN_GRP , " Everyone " } ,
{ 0 , ( enum SID_NAME_USE ) 0 , NULL } } ;
2000-12-12 05:36:14 +03:00
2000-10-04 05:03:23 +04:00
static known_sid_users creator_owner_users [ ] = {
{ 0 , SID_NAME_ALIAS , " Creator Owner " } ,
{ 0 , ( enum SID_NAME_USE ) 0 , NULL } } ;
2000-12-12 05:36:14 +03:00
2000-05-29 05:23:48 +04:00
static known_sid_users nt_authority_users [ ] = {
{ 1 , SID_NAME_ALIAS , " Dialup " } ,
{ 2 , SID_NAME_ALIAS , " Network " } ,
{ 3 , SID_NAME_ALIAS , " Batch " } ,
{ 4 , SID_NAME_ALIAS , " Interactive " } ,
{ 6 , SID_NAME_ALIAS , " Service " } ,
{ 7 , SID_NAME_ALIAS , " AnonymousLogon " } ,
{ 8 , SID_NAME_ALIAS , " Proxy " } ,
{ 9 , SID_NAME_ALIAS , " ServerLogon " } ,
{ 11 , SID_NAME_ALIAS , " Authenticated Users " } ,
{ 18 , SID_NAME_ALIAS , " SYSTEM " } ,
2000-10-04 05:03:23 +04:00
{ 0 , ( enum SID_NAME_USE ) 0 , NULL } } ;
1999-12-13 16:27:58 +03:00
2001-01-15 21:36:50 +03:00
static known_sid_users builtin_groups [ ] = {
{ BUILTIN_ALIAS_RID_ADMINS , SID_NAME_ALIAS , " Administrators " } ,
{ BUILTIN_ALIAS_RID_USERS , SID_NAME_ALIAS , " Users " } ,
{ BUILTIN_ALIAS_RID_GUESTS , SID_NAME_ALIAS , " Guests " } ,
{ BUILTIN_ALIAS_RID_ACCOUNT_OPS , SID_NAME_ALIAS , " Account Operators " } ,
{ BUILTIN_ALIAS_RID_SYSTEM_OPS , SID_NAME_ALIAS , " Server Operators " } ,
{ BUILTIN_ALIAS_RID_PRINT_OPS , SID_NAME_ALIAS , " Print Operators " } ,
{ BUILTIN_ALIAS_RID_BACKUP_OPS , SID_NAME_ALIAS , " Backup Operators " } ,
2000-12-12 05:36:14 +03:00
{ 0 , ( enum SID_NAME_USE ) 0 , NULL } } ;
1999-12-13 16:27:58 +03:00
static struct sid_name_map_info
{
DOM_SID * sid ;
char * name ;
known_sid_users * known_users ;
}
sid_name_map [ ] =
{
{ & global_sam_sid , global_myname , NULL } ,
{ & global_sam_sid , global_myworkgroup , NULL } ,
2001-01-15 21:36:50 +03:00
{ & global_sid_Builtin , " BUILTIN " , & builtin_groups [ 0 ] } ,
1999-12-13 16:27:58 +03:00
{ & global_sid_World_Domain , " " , & everyone_users [ 0 ] } ,
{ & global_sid_Creator_Owner_Domain , " " , & creator_owner_users [ 0 ] } ,
{ & global_sid_NT_Authority , " NT Authority " , & nt_authority_users [ 0 ] } ,
{ NULL , NULL , NULL }
} ;
2000-12-12 05:36:14 +03:00
/*
* An NT compatible anonymous token .
*/
static DOM_SID anon_sid_array [ 3 ] ;
NT_USER_TOKEN anonymous_token = {
3 ,
anon_sid_array
} ;
1999-12-13 16:27:58 +03:00
/****************************************************************************
Creates some useful well known sids
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void generate_wellknown_sids ( void )
{
2000-08-04 02:38:43 +04:00
string_to_sid ( & global_sid_Builtin , " S-1-5-32 " ) ;
string_to_sid ( & global_sid_Builtin_Guests , " S-1-5-32-546 " ) ;
1999-12-13 16:27:58 +03:00
string_to_sid ( & global_sid_World_Domain , " S-1-1 " ) ;
string_to_sid ( & global_sid_World , " S-1-1-0 " ) ;
string_to_sid ( & global_sid_Creator_Owner_Domain , " S-1-3 " ) ;
string_to_sid ( & global_sid_Creator_Owner , " S-1-3-0 " ) ;
string_to_sid ( & global_sid_NT_Authority , " S-1-5 " ) ;
2000-07-06 10:48:54 +04:00
string_to_sid ( & global_sid_NULL , " S-1-0-0 " ) ;
2000-12-12 05:36:14 +03:00
string_to_sid ( & global_sid_Authenticated_Users , " S-1-5-11 " ) ;
string_to_sid ( & global_sid_Network , " S-1-5-2 " ) ;
string_to_sid ( & global_sid_Anonymous , " S-1-5-7 " ) ;
/* Create the anon token. */
sid_copy ( & anonymous_token . user_sids [ 0 ] , & global_sid_World ) ;
sid_copy ( & anonymous_token . user_sids [ 1 ] , & global_sid_Network ) ;
sid_copy ( & anonymous_token . user_sids [ 2 ] , & global_sid_Anonymous ) ;
1999-12-13 16:27:58 +03:00
}
/**************************************************************************
Turns a domain SID into a name , returned in the nt_domain argument .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL map_domain_sid_to_name ( DOM_SID * sid , char * nt_domain )
{
fstring sid_str ;
int i = 0 ;
sid_to_string ( sid_str , sid ) ;
DEBUG ( 5 , ( " map_domain_sid_to_name: %s \n " , sid_str ) ) ;
if ( nt_domain = = NULL )
return False ;
while ( sid_name_map [ i ] . sid ! = NULL ) {
sid_to_string ( sid_str , sid_name_map [ i ] . sid ) ;
DEBUG ( 5 , ( " map_domain_sid_to_name: compare: %s \n " , sid_str ) ) ;
if ( sid_equal ( sid_name_map [ i ] . sid , sid ) ) {
fstrcpy ( nt_domain , sid_name_map [ i ] . name ) ;
DEBUG ( 5 , ( " map_domain_sid_to_name: found '%s' \n " , nt_domain ) ) ;
return True ;
}
i + + ;
}
DEBUG ( 5 , ( " map_domain_sid_to_name: mapping for %s not found \n " , sid_str ) ) ;
return False ;
}
/**************************************************************************
Looks up a known username from one of the known domains .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2000-08-23 04:45:40 +04:00
BOOL lookup_known_rid ( DOM_SID * sid , uint32 rid , char * name , enum SID_NAME_USE * psid_name_use )
1999-12-13 16:27:58 +03:00
{
int i = 0 ;
struct sid_name_map_info * psnm ;
for ( i = 0 ; sid_name_map [ i ] . sid ! = NULL ; i + + ) {
psnm = & sid_name_map [ i ] ;
if ( sid_equal ( psnm - > sid , sid ) ) {
int j ;
for ( j = 0 ; psnm - > known_users & & psnm - > known_users [ j ] . known_user_name ! = NULL ; j + + ) {
if ( rid = = psnm - > known_users [ j ] . rid ) {
DEBUG ( 5 , ( " lookup_builtin_rid: rid = %u, domain = '%s', user = '%s' \n " ,
( unsigned int ) rid , psnm - > name , psnm - > known_users [ j ] . known_user_name ) ) ;
fstrcpy ( name , psnm - > known_users [ j ] . known_user_name ) ;
* psid_name_use = psnm - > known_users [ j ] . sid_name_use ;
return True ;
}
}
}
}
return False ;
}
/**************************************************************************
Turns a domain name into a SID .
* * * side - effect : if the domain name is NULL , it is set to our domain * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL map_domain_name_to_sid ( DOM_SID * sid , char * nt_domain )
{
int i = 0 ;
if ( nt_domain = = NULL ) {
DEBUG ( 5 , ( " map_domain_name_to_sid: mapping NULL domain to our SID. \n " ) ) ;
sid_copy ( sid , & global_sam_sid ) ;
return True ;
}
if ( nt_domain [ 0 ] = = 0 ) {
fstrcpy ( nt_domain , global_myname ) ;
DEBUG ( 5 , ( " map_domain_name_to_sid: overriding blank name to %s \n " , nt_domain ) ) ;
sid_copy ( sid , & global_sam_sid ) ;
return True ;
}
DEBUG ( 5 , ( " map_domain_name_to_sid: %s \n " , nt_domain ) ) ;
while ( sid_name_map [ i ] . name ! = NULL ) {
DEBUG ( 5 , ( " map_domain_name_to_sid: compare: %s \n " , sid_name_map [ i ] . name ) ) ;
if ( strequal ( sid_name_map [ i ] . name , nt_domain ) ) {
fstring sid_str ;
sid_copy ( sid , sid_name_map [ i ] . sid ) ;
sid_to_string ( sid_str , sid_name_map [ i ] . sid ) ;
DEBUG ( 5 , ( " map_domain_name_to_sid: found %s \n " , sid_str ) ) ;
return True ;
}
i + + ;
}
DEBUG ( 0 , ( " map_domain_name_to_sid: mapping to %s not found. \n " , nt_domain ) ) ;
return False ;
}
/**************************************************************************
Splits a name of format \ DOMAIN \ name or name into its two components .
Sets the DOMAIN name to global_myname if it has not been specified .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void split_domain_name ( const char * fullname , char * domain , char * name )
{
pstring full_name ;
2000-12-12 05:36:14 +03:00
char * p , * sep ;
sep = lp_winbind_separator ( ) ;
1999-12-13 16:27:58 +03:00
* domain = * name = ' \0 ' ;
1998-11-05 19:51:34 +03:00
2000-12-12 05:36:14 +03:00
if ( fullname [ 0 ] = = sep [ 0 ] | | fullname [ 0 ] = = ' \\ ' )
1999-12-13 16:27:58 +03:00
fullname + + ;
pstrcpy ( full_name , fullname ) ;
p = strchr ( full_name + 1 , ' \\ ' ) ;
2000-12-12 05:36:14 +03:00
if ( ! p ) p = strchr ( full_name + 1 , sep [ 0 ] ) ;
1999-12-13 16:27:58 +03:00
if ( p ! = NULL ) {
* p = 0 ;
fstrcpy ( domain , full_name ) ;
fstrcpy ( name , p + 1 ) ;
} else {
fstrcpy ( domain , global_myname ) ;
fstrcpy ( name , full_name ) ;
}
DEBUG ( 10 , ( " split_domain_name:name '%s' split into domain :'%s' and user :'%s' \n " ,
fullname , domain , name ) ) ;
}
1998-11-05 19:51:34 +03:00
/*****************************************************************
Convert a SID to an ascii string .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
char * sid_to_string ( fstring sidstr_out , DOM_SID * sid )
1998-11-05 19:51:34 +03:00
{
char subauth [ 16 ] ;
int i ;
/* BIG NOTE: this function only does SIDS where the identauth is not >= 2^32 */
uint32 ia = ( sid - > id_auth [ 5 ] ) +
( sid - > id_auth [ 4 ] < < 8 ) +
( sid - > id_auth [ 3 ] < < 16 ) +
( sid - > id_auth [ 2 ] < < 24 ) ;
1999-12-13 16:27:58 +03:00
slprintf ( sidstr_out , sizeof ( fstring ) - 1 , " S-%u-%lu " , ( unsigned int ) sid - > sid_rev_num , ( unsigned long ) ia ) ;
1998-11-05 19:51:34 +03:00
1999-12-13 16:27:58 +03:00
for ( i = 0 ; i < sid - > num_auths ; i + + ) {
1998-11-26 00:17:20 +03:00
slprintf ( subauth , sizeof ( subauth ) - 1 , " -%lu " , ( unsigned long ) sid - > sub_auths [ i ] ) ;
1999-12-13 16:27:58 +03:00
fstrcat ( sidstr_out , subauth ) ;
1998-11-05 19:51:34 +03:00
}
return sidstr_out ;
}
/*****************************************************************
Convert a string to a SID . Returns True on success , False on fail .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
BOOL string_to_sid ( DOM_SID * sidout , char * sidstr )
1998-11-05 19:51:34 +03:00
{
1999-12-13 16:27:58 +03:00
pstring tok ;
char * p = sidstr ;
/* BIG NOTE: this function only does SIDS where the identauth is not >= 2^32 */
uint32 ia ;
1998-11-05 19:51:34 +03:00
1999-12-13 16:27:58 +03:00
memset ( ( char * ) sidout , ' \0 ' , sizeof ( DOM_SID ) ) ;
1998-11-05 19:51:34 +03:00
1999-12-13 16:27:58 +03:00
if ( StrnCaseCmp ( sidstr , " S- " , 2 ) ) {
DEBUG ( 0 , ( " string_to_sid: Sid %s does not start with 'S-'. \n " , sidstr ) ) ;
return False ;
}
1998-11-05 19:51:34 +03:00
1999-12-13 16:27:58 +03:00
p + = 2 ;
if ( ! next_token ( & p , tok , " - " , sizeof ( tok ) ) ) {
DEBUG ( 0 , ( " string_to_sid: Sid %s is not in a valid format. \n " , sidstr ) ) ;
return False ;
}
1998-11-05 19:51:34 +03:00
1999-12-13 16:27:58 +03:00
/* Get the revision number. */
sidout - > sid_rev_num = ( uint8 ) strtoul ( tok , NULL , 10 ) ;
1998-11-05 19:51:34 +03:00
1999-12-13 16:27:58 +03:00
if ( ! next_token ( & p , tok , " - " , sizeof ( tok ) ) ) {
DEBUG ( 0 , ( " string_to_sid: Sid %s is not in a valid format. \n " , sidstr ) ) ;
return False ;
}
1998-11-05 19:51:34 +03:00
1999-12-13 16:27:58 +03:00
/* identauth in decimal should be < 2^32 */
ia = ( uint32 ) strtoul ( tok , NULL , 10 ) ;
/* NOTE - the ia value is in big-endian format. */
sidout - > id_auth [ 0 ] = 0 ;
sidout - > id_auth [ 1 ] = 0 ;
sidout - > id_auth [ 2 ] = ( ia & 0xff000000 ) > > 24 ;
sidout - > id_auth [ 3 ] = ( ia & 0x00ff0000 ) > > 16 ;
sidout - > id_auth [ 4 ] = ( ia & 0x0000ff00 ) > > 8 ;
sidout - > id_auth [ 5 ] = ( ia & 0x000000ff ) ;
sidout - > num_auths = 0 ;
while ( next_token ( & p , tok , " - " , sizeof ( tok ) ) & &
sidout - > num_auths < MAXSUBAUTHS ) {
/*
* NOTE - the subauths are in native machine - endian format . They
* are converted to little - endian when linearized onto the wire .
*/
sid_append_rid ( sidout , ( uint32 ) strtoul ( tok , NULL , 10 ) ) ;
}
1998-11-05 19:51:34 +03:00
1999-12-13 16:27:58 +03:00
DEBUG ( 7 , ( " string_to_sid: converted SID %s ok \n " , sidstr ) ) ;
1998-11-05 19:51:34 +03:00
1999-12-13 16:27:58 +03:00
return True ;
1998-11-05 19:51:34 +03:00
}
/*****************************************************************
1999-12-13 16:27:58 +03:00
Add a rid to the end of a sid
1998-11-05 19:51:34 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
1998-11-05 19:51:34 +03:00
BOOL sid_append_rid ( DOM_SID * sid , uint32 rid )
{
1999-12-13 16:27:58 +03:00
if ( sid - > num_auths < MAXSUBAUTHS ) {
1998-11-05 19:51:34 +03:00
sid - > sub_auths [ sid - > num_auths + + ] = rid ;
return True ;
}
return False ;
}
/*****************************************************************
1999-12-13 16:27:58 +03:00
Removes the last rid from the end of a sid
1998-11-05 19:51:34 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
1998-11-05 19:51:34 +03:00
BOOL sid_split_rid ( DOM_SID * sid , uint32 * rid )
{
1999-12-13 16:27:58 +03:00
if ( sid - > num_auths > 0 ) {
1998-11-05 19:51:34 +03:00
sid - > num_auths - - ;
1999-12-13 16:27:58 +03:00
* rid = sid - > sub_auths [ sid - > num_auths ] ;
1998-11-05 19:51:34 +03:00
return True ;
}
return False ;
}
/*****************************************************************
1999-12-13 16:27:58 +03:00
Copies a sid
1998-11-05 19:51:34 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2000-01-03 22:19:48 +03:00
void sid_copy ( DOM_SID * dst , const DOM_SID * src )
1998-11-29 23:03:33 +03:00
{
int i ;
2000-06-24 04:15:08 +04:00
memset ( ( char * ) dst , ' \0 ' , sizeof ( DOM_SID ) ) ;
1999-12-13 16:27:58 +03:00
dst - > sid_rev_num = src - > sid_rev_num ;
dst - > num_auths = src - > num_auths ;
1998-11-29 23:03:33 +03:00
1999-12-13 16:27:58 +03:00
memcpy ( & dst - > id_auth [ 0 ] , & src - > id_auth [ 0 ] , sizeof ( src - > id_auth ) ) ;
1998-11-29 23:03:33 +03:00
1999-12-13 16:27:58 +03:00
for ( i = 0 ; i < src - > num_auths ; i + + )
dst - > sub_auths [ i ] = src - > sub_auths [ i ] ;
1998-11-29 23:03:33 +03:00
}
1999-10-25 23:03:27 +04:00
/*****************************************************************
Duplicates a sid - mallocs the target .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
DOM_SID * sid_dup ( DOM_SID * src )
1999-10-25 23:03:27 +04:00
{
DOM_SID * dst ;
if ( ! src )
return NULL ;
1999-12-13 16:27:58 +03:00
if ( ( dst = malloc ( sizeof ( DOM_SID ) ) ) ! = NULL ) {
memset ( dst , ' \0 ' , sizeof ( DOM_SID ) ) ;
sid_copy ( dst , src ) ;
1999-10-25 23:03:27 +04:00
}
return dst ;
}
1999-11-20 22:43:37 +03:00
1999-12-13 16:27:58 +03:00
/*****************************************************************
Write a sid out into on - the - wire format .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-11-20 22:43:37 +03:00
1999-12-13 16:27:58 +03:00
BOOL sid_linearize ( char * outbuf , size_t len , DOM_SID * sid )
1999-11-20 22:43:37 +03:00
{
1999-12-13 16:27:58 +03:00
size_t i ;
1999-11-20 22:43:37 +03:00
1999-12-13 16:27:58 +03:00
if ( len < sid_size ( sid ) )
1999-11-20 22:43:37 +03:00
return False ;
1999-12-13 16:27:58 +03:00
SCVAL ( outbuf , 0 , sid - > sid_rev_num ) ;
SCVAL ( outbuf , 1 , sid - > num_auths ) ;
memcpy ( & outbuf [ 2 ] , sid - > id_auth , 6 ) ;
for ( i = 0 ; i < sid - > num_auths ; i + + )
SIVAL ( outbuf , 8 + ( i * 4 ) , sid - > sub_auths [ i ] ) ;
1999-11-20 22:43:37 +03:00
return True ;
1999-12-13 16:27:58 +03:00
}
1999-11-20 22:43:37 +03:00
1999-12-13 16:27:58 +03:00
/*****************************************************************
Compare two sids .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-11-20 22:43:37 +03:00
2000-05-27 05:56:26 +04:00
BOOL sid_equal ( const DOM_SID * sid1 , const DOM_SID * sid2 )
1999-11-20 22:43:37 +03:00
{
1999-12-13 16:27:58 +03:00
int i ;
1999-11-20 22:43:37 +03:00
2000-07-26 00:26:50 +04:00
if ( sid1 = = sid2 ) return True ;
if ( ! sid1 | | ! sid2 ) return False ;
1999-12-13 16:27:58 +03:00
/* compare most likely different rids, first: i.e start at end */
for ( i = sid1 - > num_auths - 1 ; i > = 0 ; - - i )
if ( sid1 - > sub_auths [ i ] ! = sid2 - > sub_auths [ i ] )
return False ;
1999-11-20 22:43:37 +03:00
1999-12-13 16:27:58 +03:00
if ( sid1 - > num_auths ! = sid2 - > num_auths )
return False ;
if ( sid1 - > sid_rev_num ! = sid2 - > sid_rev_num )
1999-11-20 22:43:37 +03:00
return False ;
1999-12-13 16:27:58 +03:00
for ( i = 0 ; i < 6 ; i + + )
if ( sid1 - > id_auth [ i ] ! = sid2 - > id_auth [ i ] )
1999-11-20 22:43:37 +03:00
return False ;
return True ;
1999-12-13 16:27:58 +03:00
}
1999-11-20 22:43:37 +03:00
1999-12-13 16:27:58 +03:00
/*****************************************************************
Calculates size of a sid .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-11-20 22:43:37 +03:00
1999-12-13 16:27:58 +03:00
size_t sid_size ( DOM_SID * sid )
{
if ( sid = = NULL )
return 0 ;
return sid - > num_auths * sizeof ( uint32 ) + 8 ;
1999-11-20 22:43:37 +03:00
}