/*
Unix SMB / Netbios implementation .
Version 2.0
winbind client code
Copyright ( C ) Tim Potter 2000
Copyright ( C ) Andrew Tridgell 2000
This library is free software ; you can redistribute it and / or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation ; either
version 2 of the License , or ( at your option ) any later version .
This library 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
Library General Public License for more details .
You should have received a copy of the GNU Library General Public
License along with this library ; if not , write to the
Free Software Foundation , Inc . , 59 Temple Place - Suite 330 ,
Boston , MA 02111 - 1307 , USA .
*/
# include "includes.h"
/* Call winbindd to convert a name to a sid */
BOOL winbind_lookup_name ( char * name , DOM_SID * sid , uint8 * name_type )
{
extern pstring global_myname ;
struct winbindd_request request ;
struct winbindd_response response ;
enum nss_status result ;
if ( ! sid | | ! name_type )
return False ;
/* Send off request */
ZERO_STRUCT ( request ) ;
ZERO_STRUCT ( response ) ;
fstrcpy ( request . data . name , name ) ;
if ( ( result = winbindd_request ( WINBINDD_LOOKUPNAME , & request ,
& response ) ) = = NSS_STATUS_SUCCESS ) {
string_to_sid ( sid , response . data . sid . sid ) ;
* name_type = response . data . sid . type ;
} else {
/*
* Try a local lookup - winbindd may not
* be running .
*/
return lookup_local_name ( global_myname , name , sid , name_type ) ;
}
return result = = NSS_STATUS_SUCCESS ;
}
/* Call winbindd to convert sid to name */
BOOL winbind_lookup_sid ( DOM_SID * sid , fstring dom_name , fstring name ,
uint8 * name_type )
{
struct winbindd_request request ;
struct winbindd_response response ;
enum nss_status result ;
DOM_SID tmp_sid ;
uint32 rid ;
fstring sid_str ;
if ( ! name_type )
return False ;
/* Check if this is our own sid. This should perhaps be done by
winbind ? For the moment handle it here . */
if ( sid - > num_auths = = 5 ) {
sid_copy ( & tmp_sid , sid ) ;
sid_split_rid ( & tmp_sid , & rid ) ;
if ( sid_equal ( & global_sam_sid , & tmp_sid ) ) {
return map_domain_sid_to_name ( & tmp_sid , dom_name ) & &
lookup_local_rid ( rid , name , name_type ) ;
}
}
/* Initialise request */
ZERO_STRUCT ( request ) ;
ZERO_STRUCT ( response ) ;
sid_to_string ( sid_str , sid ) ;
fstrcpy ( request . data . sid , sid_str ) ;
/* Make request */
result = winbindd_request ( WINBINDD_LOOKUPSID , & request , & response ) ;
/* Copy out result */
if ( result = = NSS_STATUS_SUCCESS ) {
parse_domain_user ( response . data . name . name , dom_name , name ) ;
* name_type = response . data . name . type ;
} else {
DEBUG ( 10 , ( " winbind_lookup_sid: winbind lookup for %s failed - trying builtin. \n " ,
sid_str ) ) ;
sid_copy ( & tmp_sid , sid ) ;
sid_split_rid ( & tmp_sid , & rid ) ;
return map_domain_sid_to_name ( & tmp_sid , dom_name ) & &
lookup_known_rid ( & tmp_sid , rid , name , name_type ) ;
}
return ( result = = NSS_STATUS_SUCCESS ) ;
}
/* Call winbindd to convert uid to sid */
BOOL winbind_uid_to_sid ( uid_t uid , DOM_SID * sid )
{
struct winbindd_request request ;
struct winbindd_response response ;
int result ;
if ( ! sid ) return False ;
/* Initialise request */
ZERO_STRUCT ( request ) ;
ZERO_STRUCT ( response ) ;
request . data . uid = uid ;
/* Make request */
result = winbindd_request ( WINBINDD_UID_TO_SID , & request , & response ) ;
/* Copy out result */
if ( result = = NSS_STATUS_SUCCESS ) {
string_to_sid ( sid , response . data . sid . sid ) ;
} else {
sid_copy ( sid , & global_sid_NULL ) ;
}
return ( result = = NSS_STATUS_SUCCESS ) ;
}
/* Call winbindd to convert uid to sid */
BOOL winbind_gid_to_sid ( gid_t gid , DOM_SID * sid )
{
struct winbindd_request request ;
struct winbindd_response response ;
int result ;
if ( ! sid ) return False ;
/* Initialise request */
ZERO_STRUCT ( request ) ;
ZERO_STRUCT ( response ) ;
request . data . gid = gid ;
/* Make request */
result = winbindd_request ( WINBINDD_GID_TO_SID , & request , & response ) ;
/* Copy out result */
if ( result = = NSS_STATUS_SUCCESS ) {
string_to_sid ( sid , response . data . sid . sid ) ;
} else {
sid_copy ( sid , & global_sid_NULL ) ;
}
return ( result = = NSS_STATUS_SUCCESS ) ;
}