2005-06-08 22:10:34 +00:00
/*
Unix SMB / CIFS implementation .
Async helpers for blocking functions
Copyright ( C ) Volker Lendecke 2005
2006-07-13 18:10:29 +00:00
Copyright ( C ) Gerald Carter 2006
2008-11-26 14:01:22 +01:00
2005-06-08 22:10:34 +00:00
The helpers always consist of three functions :
* A request setup function that takes the necessary parameters together
with a continuation function that is to be called upon completion
* A private continuation function that is internal only . This is to be
called by the lower - level functions in do_async ( ) . Its only task is to
properly call the continuation function named above .
* A worker function that is called inside the appropriate child process .
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 19:25:36 +00:00
the Free Software Foundation ; either version 3 of the License , or
2005-06-08 22:10:34 +00:00
( at your option ) any later version .
2008-11-26 14:01:22 +01:00
2005-06-08 22:10:34 +00:00
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 .
2008-11-26 14:01:22 +01:00
2005-06-08 22:10:34 +00:00
You should have received a copy of the GNU General Public License
2007-07-10 00:52:41 +00:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2005-06-08 22:10:34 +00:00
*/
# include "includes.h"
# include "winbindd.h"
# undef DBGC_CLASS
# define DBGC_CLASS DBGC_WINBIND
struct do_async_state {
TALLOC_CTX * mem_ctx ;
struct winbindd_request request ;
struct winbindd_response response ;
void ( * cont ) ( TALLOC_CTX * mem_ctx ,
2007-10-18 17:40:25 -07:00
bool success ,
2005-06-08 22:10:34 +00:00
struct winbindd_response * response ,
2005-06-24 20:25:18 +00:00
void * c , void * private_data ) ;
void * c , * private_data ;
2005-06-08 22:10:34 +00:00
} ;
2007-10-18 17:40:25 -07:00
static void do_async_recv ( void * private_data , bool success )
2005-06-08 22:10:34 +00:00
{
struct do_async_state * state =
2005-06-24 20:25:18 +00:00
talloc_get_type_abort ( private_data , struct do_async_state ) ;
2005-06-08 22:10:34 +00:00
state - > cont ( state - > mem_ctx , success , & state - > response ,
2005-06-24 20:25:18 +00:00
state - > c , state - > private_data ) ;
2005-06-08 22:10:34 +00:00
}
2007-10-08 10:54:33 +00:00
void do_async ( TALLOC_CTX * mem_ctx , struct winbindd_child * child ,
const struct winbindd_request * request ,
void ( * cont ) ( TALLOC_CTX * mem_ctx , bool success ,
struct winbindd_response * response ,
void * c , void * private_data ) ,
void * c , void * private_data )
2005-06-08 22:10:34 +00:00
{
struct do_async_state * state ;
2006-10-16 00:12:00 +00:00
state = TALLOC_ZERO_P ( mem_ctx , struct do_async_state ) ;
2005-06-08 22:10:34 +00:00
if ( state = = NULL ) {
DEBUG ( 0 , ( " talloc failed \n " ) ) ;
2005-06-24 20:25:18 +00:00
cont ( mem_ctx , False , NULL , c , private_data ) ;
2005-06-08 22:10:34 +00:00
return ;
}
state - > mem_ctx = mem_ctx ;
state - > request = * request ;
state - > request . length = sizeof ( state - > request ) ;
state - > cont = cont ;
state - > c = c ;
2005-06-24 20:25:18 +00:00
state - > private_data = private_data ;
2005-06-08 22:10:34 +00:00
async_request ( mem_ctx , child , & state - > request ,
& state - > response , do_async_recv , state ) ;
}
2009-02-13 16:40:17 +01:00
static void do_async_domain ( TALLOC_CTX * mem_ctx , struct winbindd_domain * domain ,
const struct winbindd_request * request ,
void ( * cont ) ( TALLOC_CTX * mem_ctx , bool success ,
struct winbindd_response * response ,
void * c , void * private_data ) ,
void * c , void * private_data )
2005-06-08 22:10:34 +00:00
{
struct do_async_state * state ;
2006-10-16 00:12:00 +00:00
state = TALLOC_ZERO_P ( mem_ctx , struct do_async_state ) ;
2005-06-08 22:10:34 +00:00
if ( state = = NULL ) {
DEBUG ( 0 , ( " talloc failed \n " ) ) ;
2005-06-24 20:25:18 +00:00
cont ( mem_ctx , False , NULL , c , private_data ) ;
2005-06-08 22:10:34 +00:00
return ;
}
state - > mem_ctx = mem_ctx ;
state - > request = * request ;
state - > request . length = sizeof ( state - > request ) ;
state - > cont = cont ;
state - > c = c ;
2005-06-24 20:25:18 +00:00
state - > private_data = private_data ;
2005-06-08 22:10:34 +00:00
async_domain_request ( mem_ctx , domain , & state - > request ,
& state - > response , do_async_recv , state ) ;
}
2007-05-06 19:01:54 +00:00
struct lookupsid_state {
DOM_SID sid ;
void * caller_private_data ;
} ;
2007-10-18 17:40:25 -07:00
static void lookupsid_recv2 ( TALLOC_CTX * mem_ctx , bool success ,
2007-05-06 19:01:54 +00:00
struct winbindd_response * response ,
void * c , void * private_data )
{
2007-10-18 17:40:25 -07:00
void ( * cont ) ( void * priv , bool succ , const char * dom_name ,
2007-05-06 19:01:54 +00:00
const char * name , enum lsa_SidType type ) =
2007-10-18 17:40:25 -07:00
( void ( * ) ( void * , bool , const char * , const char * ,
2007-05-06 19:01:54 +00:00
enum lsa_SidType ) ) c ;
struct lookupsid_state * s = talloc_get_type_abort ( private_data ,
struct lookupsid_state ) ;
if ( ! success ) {
DEBUG ( 5 , ( " Could not trigger lookupsid \n " ) ) ;
cont ( s - > caller_private_data , False , NULL , NULL , SID_NAME_UNKNOWN ) ;
return ;
}
if ( response - > result ! = WINBINDD_OK ) {
DEBUG ( 5 , ( " lookupsid (forest root) returned an error \n " ) ) ;
cont ( s - > caller_private_data , False , NULL , NULL , SID_NAME_UNKNOWN ) ;
return ;
}
cont ( s - > caller_private_data , True , response - > data . name . dom_name ,
response - > data . name . name ,
( enum lsa_SidType ) response - > data . name . type ) ;
}
2007-10-18 17:40:25 -07:00
static void lookupsid_recv ( TALLOC_CTX * mem_ctx , bool success ,
2005-06-08 22:10:34 +00:00
struct winbindd_response * response ,
2005-06-24 20:25:18 +00:00
void * c , void * private_data )
2005-06-08 22:10:34 +00:00
{
2007-10-18 17:40:25 -07:00
void ( * cont ) ( void * priv , bool succ , const char * dom_name ,
2006-09-08 14:28:06 +00:00
const char * name , enum lsa_SidType type ) =
2007-10-18 17:40:25 -07:00
( void ( * ) ( void * , bool , const char * , const char * ,
2006-09-08 14:28:06 +00:00
enum lsa_SidType ) ) c ;
2007-05-06 19:01:54 +00:00
struct lookupsid_state * s = talloc_get_type_abort ( private_data ,
struct lookupsid_state ) ;
2005-06-08 22:10:34 +00:00
if ( ! success ) {
DEBUG ( 5 , ( " Could not trigger lookupsid \n " ) ) ;
2007-05-06 19:01:54 +00:00
cont ( s - > caller_private_data , False , NULL , NULL , SID_NAME_UNKNOWN ) ;
2005-06-08 22:10:34 +00:00
return ;
}
if ( response - > result ! = WINBINDD_OK ) {
2007-05-06 19:01:54 +00:00
/* Try again using the forest root */
struct winbindd_domain * root_domain = find_root_domain ( ) ;
struct winbindd_request request ;
2008-11-26 14:01:22 +01:00
2007-05-06 19:01:54 +00:00
if ( ! root_domain ) {
DEBUG ( 5 , ( " lookupsid_recv: unable to determine forest root \n " ) ) ;
cont ( s - > caller_private_data , False , NULL , NULL , SID_NAME_UNKNOWN ) ;
return ;
}
ZERO_STRUCT ( request ) ;
request . cmd = WINBINDD_LOOKUPSID ;
2007-12-15 22:47:30 +01:00
sid_to_fstring ( request . data . sid , & s - > sid ) ;
2007-05-06 19:01:54 +00:00
do_async_domain ( mem_ctx , root_domain , & request , lookupsid_recv2 ,
( void * ) cont , s ) ;
2005-06-08 22:10:34 +00:00
return ;
}
2007-05-06 19:01:54 +00:00
cont ( s - > caller_private_data , True , response - > data . name . dom_name ,
2006-07-11 18:01:26 +00:00
response - > data . name . name ,
2006-09-08 14:28:06 +00:00
( enum lsa_SidType ) response - > data . name . type ) ;
2005-06-08 22:10:34 +00:00
}
void winbindd_lookupsid_async ( TALLOC_CTX * mem_ctx , const DOM_SID * sid ,
2007-10-18 17:40:25 -07:00
void ( * cont ) ( void * private_data , bool success ,
2005-06-08 22:10:34 +00:00
const char * dom_name ,
const char * name ,
2006-09-08 14:28:06 +00:00
enum lsa_SidType type ) ,
2005-06-24 20:25:18 +00:00
void * private_data )
2005-06-08 22:10:34 +00:00
{
struct winbindd_domain * domain ;
struct winbindd_request request ;
2007-05-06 19:01:54 +00:00
struct lookupsid_state * s ;
2005-06-08 22:10:34 +00:00
domain = find_lookup_domain_from_sid ( sid ) ;
if ( domain = = NULL ) {
DEBUG ( 5 , ( " Could not find domain for sid %s \n " ,
2007-12-15 21:11:36 +01:00
sid_string_dbg ( sid ) ) ) ;
2005-06-24 20:25:18 +00:00
cont ( private_data , False , NULL , NULL , SID_NAME_UNKNOWN ) ;
2005-06-08 22:10:34 +00:00
return ;
}
ZERO_STRUCT ( request ) ;
request . cmd = WINBINDD_LOOKUPSID ;
2007-12-15 22:47:30 +01:00
sid_to_fstring ( request . data . sid , sid ) ;
2005-06-08 22:10:34 +00:00
2007-05-06 19:01:54 +00:00
if ( ( s = TALLOC_ZERO_P ( mem_ctx , struct lookupsid_state ) ) = = NULL ) {
DEBUG ( 0 , ( " winbindd_lookupsid_async: talloc failed \n " ) ) ;
cont ( private_data , False , NULL , NULL , SID_NAME_UNKNOWN ) ;
return ;
}
sid_copy ( & s - > sid , sid ) ;
s - > caller_private_data = private_data ;
2005-06-08 22:10:34 +00:00
do_async_domain ( mem_ctx , domain , & request , lookupsid_recv ,
2007-05-06 19:42:25 +00:00
( void * ) cont , s ) ;
2005-06-08 22:10:34 +00:00
}
enum winbindd_result winbindd_dual_lookupsid ( struct winbindd_domain * domain ,
struct winbindd_cli_state * state )
{
2006-09-08 14:28:06 +00:00
enum lsa_SidType type ;
2005-06-08 22:10:34 +00:00
DOM_SID sid ;
2006-12-13 16:39:50 +00:00
char * name ;
char * dom_name ;
2005-06-08 22:10:34 +00:00
/* Ensure null termination */
2009-05-07 22:46:27 +02:00
state - > request - > data . sid [ sizeof ( state - > request - > data . sid ) - 1 ] = ' \0 ' ;
2005-06-08 22:10:34 +00:00
DEBUG ( 3 , ( " [%5lu]: lookupsid %s \n " , ( unsigned long ) state - > pid ,
2009-05-07 22:46:27 +02:00
state - > request - > data . sid ) ) ;
2005-06-08 22:10:34 +00:00
/* Lookup sid from PDC using lsa_lookup_sids() */
2009-05-07 22:46:27 +02:00
if ( ! string_to_sid ( & sid , state - > request - > data . sid ) ) {
DEBUG ( 5 , ( " %s not a SID \n " , state - > request - > data . sid ) ) ;
2005-06-08 22:10:34 +00:00
return WINBINDD_ERROR ;
}
/* Lookup the sid */
2007-05-06 19:01:54 +00:00
if ( ! winbindd_lookup_name_by_sid ( state - > mem_ctx , domain , & sid ,
& dom_name , & name , & type ) )
{
2006-12-12 14:52:13 +00:00
TALLOC_FREE ( dom_name ) ;
TALLOC_FREE ( name ) ;
2005-06-08 22:10:34 +00:00
return WINBINDD_ERROR ;
}
2009-06-14 12:41:46 +02:00
fstrcpy ( state - > response - > data . name . dom_name , dom_name ) ;
fstrcpy ( state - > response - > data . name . name , name ) ;
state - > response - > data . name . type = type ;
2005-06-08 22:10:34 +00:00
2006-12-12 14:52:13 +00:00
TALLOC_FREE ( dom_name ) ;
TALLOC_FREE ( name ) ;
2005-06-08 22:10:34 +00:00
return WINBINDD_OK ;
}
2007-01-02 21:48:47 +00:00
/********************************************************************
This is the second callback after contacting the forest root
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-05-06 19:01:54 +00:00
struct lookupname_state {
char * dom_name ;
char * name ;
void * caller_private_data ;
} ;
2007-10-18 17:40:25 -07:00
static void lookupname_recv2 ( TALLOC_CTX * mem_ctx , bool success ,
2005-06-08 22:10:34 +00:00
struct winbindd_response * response ,
2005-06-24 20:25:18 +00:00
void * c , void * private_data )
2005-06-08 22:10:34 +00:00
{
2007-10-18 17:40:25 -07:00
void ( * cont ) ( void * priv , bool succ , const DOM_SID * sid ,
2006-09-08 14:28:06 +00:00
enum lsa_SidType type ) =
2007-10-18 17:40:25 -07:00
( void ( * ) ( void * , bool , const DOM_SID * , enum lsa_SidType ) ) c ;
2005-06-08 22:10:34 +00:00
DOM_SID sid ;
2008-02-05 16:51:46 -08:00
struct lookupname_state * s = talloc_get_type_abort ( private_data ,
2007-05-06 19:01:54 +00:00
struct lookupname_state ) ;
2005-06-08 22:10:34 +00:00
if ( ! success ) {
DEBUG ( 5 , ( " Could not trigger lookup_name \n " ) ) ;
2007-05-06 19:01:54 +00:00
cont ( s - > caller_private_data , False , NULL , SID_NAME_UNKNOWN ) ;
2005-06-08 22:10:34 +00:00
return ;
}
if ( response - > result ! = WINBINDD_OK ) {
DEBUG ( 5 , ( " lookup_name returned an error \n " ) ) ;
2007-05-06 19:01:54 +00:00
cont ( s - > caller_private_data , False , NULL , SID_NAME_UNKNOWN ) ;
2005-06-08 22:10:34 +00:00
return ;
}
if ( ! string_to_sid ( & sid , response - > data . sid . sid ) ) {
DEBUG ( 0 , ( " Could not convert string %s to sid \n " ,
response - > data . sid . sid ) ) ;
2007-05-06 19:01:54 +00:00
cont ( s - > caller_private_data , False , NULL , SID_NAME_UNKNOWN ) ;
2005-06-08 22:10:34 +00:00
return ;
}
2007-05-06 19:01:54 +00:00
cont ( s - > caller_private_data , True , & sid ,
2006-09-08 14:28:06 +00:00
( enum lsa_SidType ) response - > data . sid . type ) ;
2005-06-08 22:10:34 +00:00
}
2007-01-02 21:48:47 +00:00
/********************************************************************
2008-02-05 16:51:46 -08:00
This is the first callback after contacting our own domain
2007-01-02 21:48:47 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-10-18 17:40:25 -07:00
static void lookupname_recv ( TALLOC_CTX * mem_ctx , bool success ,
2007-01-02 21:48:47 +00:00
struct winbindd_response * response ,
void * c , void * private_data )
{
2007-10-18 17:40:25 -07:00
void ( * cont ) ( void * priv , bool succ , const DOM_SID * sid ,
2007-01-02 21:48:47 +00:00
enum lsa_SidType type ) =
2007-10-18 17:40:25 -07:00
( void ( * ) ( void * , bool , const DOM_SID * , enum lsa_SidType ) ) c ;
2007-01-02 21:48:47 +00:00
DOM_SID sid ;
2008-02-05 16:51:46 -08:00
struct lookupname_state * s = talloc_get_type_abort ( private_data ,
2007-05-06 19:01:54 +00:00
struct lookupname_state ) ;
2007-01-02 21:48:47 +00:00
if ( ! success ) {
DEBUG ( 5 , ( " lookupname_recv: lookup_name() failed! \n " ) ) ;
2007-05-06 19:01:54 +00:00
cont ( s - > caller_private_data , False , NULL , SID_NAME_UNKNOWN ) ;
2007-01-02 21:48:47 +00:00
return ;
}
if ( response - > result ! = WINBINDD_OK ) {
/* Try again using the forest root */
struct winbindd_domain * root_domain = find_root_domain ( ) ;
2008-02-05 16:51:46 -08:00
struct winbindd_request request ;
2007-01-02 21:48:47 +00:00
if ( ! root_domain ) {
2007-02-13 10:42:53 +00:00
DEBUG ( 5 , ( " lookupname_recv: unable to determine forest root \n " ) ) ;
2007-05-06 19:01:54 +00:00
cont ( s - > caller_private_data , False , NULL , SID_NAME_UNKNOWN ) ;
2007-01-02 21:48:47 +00:00
return ;
}
ZERO_STRUCT ( request ) ;
request . cmd = WINBINDD_LOOKUPNAME ;
2007-05-06 19:01:54 +00:00
fstrcpy ( request . data . name . dom_name , s - > dom_name ) ;
2008-02-05 16:51:46 -08:00
fstrcpy ( request . data . name . name , s - > name ) ;
2007-01-02 21:48:47 +00:00
do_async_domain ( mem_ctx , root_domain , & request , lookupname_recv2 ,
2007-05-06 19:01:54 +00:00
( void * ) cont , s ) ;
2007-01-02 21:48:47 +00:00
return ;
}
if ( ! string_to_sid ( & sid , response - > data . sid . sid ) ) {
DEBUG ( 0 , ( " Could not convert string %s to sid \n " ,
response - > data . sid . sid ) ) ;
2007-05-06 19:01:54 +00:00
cont ( s - > caller_private_data , False , NULL , SID_NAME_UNKNOWN ) ;
2007-01-02 21:48:47 +00:00
return ;
}
2007-05-06 19:01:54 +00:00
cont ( s - > caller_private_data , True , & sid ,
2007-01-02 21:48:47 +00:00
( enum lsa_SidType ) response - > data . sid . type ) ;
}
/********************************************************************
The lookup name call first contacts a DC in its own domain
2008-09-22 14:51:51 +02:00
and fallbacks to contact a DC if the forest in our domain doesn ' t
2007-01-02 21:48:47 +00:00
know the name .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void winbindd_lookupname_async ( TALLOC_CTX * mem_ctx ,
const char * dom_name , const char * name ,
2007-10-18 17:40:25 -07:00
void ( * cont ) ( void * private_data , bool success ,
2005-06-08 22:10:34 +00:00
const DOM_SID * sid ,
2006-09-08 14:28:06 +00:00
enum lsa_SidType type ) ,
2007-05-30 19:47:35 +00:00
enum winbindd_cmd orig_cmd ,
2005-06-24 20:25:18 +00:00
void * private_data )
2005-06-08 22:10:34 +00:00
{
struct winbindd_request request ;
struct winbindd_domain * domain ;
2008-02-05 16:51:46 -08:00
struct lookupname_state * s ;
2005-06-08 22:10:34 +00:00
2007-01-02 21:48:47 +00:00
if ( ( domain = find_lookup_domain_from_name ( dom_name ) ) = = NULL ) {
2007-12-06 01:49:37 +01:00
DEBUG ( 5 , ( " Could not find domain for name '%s' \n " , dom_name ) ) ;
2005-06-24 20:25:18 +00:00
cont ( private_data , False , NULL , SID_NAME_UNKNOWN ) ;
2005-06-08 22:10:34 +00:00
return ;
}
ZERO_STRUCT ( request ) ;
request . cmd = WINBINDD_LOOKUPNAME ;
2007-05-30 19:47:35 +00:00
request . original_cmd = orig_cmd ;
2005-06-08 22:10:34 +00:00
fstrcpy ( request . data . name . dom_name , dom_name ) ;
fstrcpy ( request . data . name . name , name ) ;
2007-05-06 19:01:54 +00:00
if ( ( s = TALLOC_ZERO_P ( mem_ctx , struct lookupname_state ) ) = = NULL ) {
DEBUG ( 0 , ( " winbindd_lookupname_async: talloc failed \n " ) ) ;
cont ( private_data , False , NULL , SID_NAME_UNKNOWN ) ;
return ;
}
s - > dom_name = talloc_strdup ( s , dom_name ) ;
s - > name = talloc_strdup ( s , name ) ;
2008-02-05 16:51:46 -08:00
if ( ! s - > dom_name | | ! s - > name ) {
cont ( private_data , False , NULL , SID_NAME_UNKNOWN ) ;
return ;
}
2007-05-30 19:47:35 +00:00
s - > caller_private_data = private_data ;
2007-05-06 19:01:54 +00:00
2005-06-08 22:10:34 +00:00
do_async_domain ( mem_ctx , domain , & request , lookupname_recv ,
2007-05-06 19:01:54 +00:00
( void * ) cont , s ) ;
2005-06-08 22:10:34 +00:00
}
enum winbindd_result winbindd_dual_lookupname ( struct winbindd_domain * domain ,
struct winbindd_cli_state * state )
{
2006-09-08 14:28:06 +00:00
enum lsa_SidType type ;
2005-06-08 22:10:34 +00:00
char * name_domain , * name_user ;
DOM_SID sid ;
char * p ;
/* Ensure null termination */
2009-05-07 22:46:27 +02:00
state - > request - > data . name . dom_name [ sizeof ( state - > request - > data . name . dom_name ) - 1 ] = ' \0 ' ;
2005-06-08 22:10:34 +00:00
/* Ensure null termination */
2009-05-07 22:46:27 +02:00
state - > request - > data . name . name [ sizeof ( state - > request - > data . name . name ) - 1 ] = ' \0 ' ;
2005-06-08 22:10:34 +00:00
/* cope with the name being a fully qualified name */
2009-05-07 22:46:27 +02:00
p = strstr ( state - > request - > data . name . name , lp_winbind_separator ( ) ) ;
2005-06-08 22:10:34 +00:00
if ( p ) {
* p = 0 ;
2009-05-07 22:46:27 +02:00
name_domain = state - > request - > data . name . name ;
2005-06-08 22:10:34 +00:00
name_user = p + 1 ;
} else {
2009-05-07 22:46:27 +02:00
name_domain = state - > request - > data . name . dom_name ;
name_user = state - > request - > data . name . name ;
2005-06-08 22:10:34 +00:00
}
DEBUG ( 3 , ( " [%5lu]: lookupname %s%s%s \n " , ( unsigned long ) state - > pid ,
name_domain , lp_winbind_separator ( ) , name_user ) ) ;
2007-02-13 10:42:53 +00:00
/* Lookup name from DC using lsa_lookup_names() */
2009-05-07 22:46:27 +02:00
if ( ! winbindd_lookup_sid_by_name ( state - > mem_ctx , state - > request - > original_cmd , domain , name_domain ,
2005-06-08 22:10:34 +00:00
name_user , & sid , & type ) ) {
return WINBINDD_ERROR ;
}
2009-06-14 12:41:46 +02:00
sid_to_fstring ( state - > response - > data . sid . sid , & sid ) ;
state - > response - > data . sid . type = type ;
2005-06-08 22:10:34 +00:00
return WINBINDD_OK ;
}
2008-06-26 14:02:39 -07:00
/* This is the first callback after enumerating users/groups from a domain */
static void listent_recv ( TALLOC_CTX * mem_ctx , bool success ,
2008-05-21 20:16:33 -07:00
struct winbindd_response * response ,
void * c , void * private_data )
{
void ( * cont ) ( void * priv , bool succ , fstring dom_name , char * data ) =
( void ( * ) ( void * , bool , fstring , char * ) ) c ;
if ( ! success | | response - > result ! = WINBINDD_OK ) {
2008-06-26 14:02:39 -07:00
DEBUG ( 5 , ( " list_ent() failed! \n " ) ) ;
2008-05-21 20:16:33 -07:00
cont ( private_data , False , response - > data . name . dom_name , NULL ) ;
return ;
}
cont ( private_data , True , response - > data . name . dom_name ,
2008-05-25 13:51:14 +02:00
( char * ) response - > extra_data . data ) ;
2008-05-21 20:16:33 -07:00
}
2008-06-26 14:02:39 -07:00
/* Request the name of all users/groups in a single domain */
void winbindd_listent_async ( TALLOC_CTX * mem_ctx ,
2008-05-21 20:16:33 -07:00
struct winbindd_domain * domain ,
void ( * cont ) ( void * private_data , bool success ,
fstring dom_name , char * extra_data ) ,
2008-06-26 14:02:39 -07:00
void * private_data , enum ent_type type )
2008-05-21 20:16:33 -07:00
{
struct winbindd_request request ;
ZERO_STRUCT ( request ) ;
2008-06-26 14:02:39 -07:00
if ( type = = LIST_USERS )
request . cmd = WINBINDD_LIST_USERS ;
else if ( type = = LIST_GROUPS )
request . cmd = WINBINDD_LIST_GROUPS ;
2008-05-21 20:16:33 -07:00
2008-06-26 14:02:39 -07:00
do_async_domain ( mem_ctx , domain , & request , listent_recv ,
2008-05-21 20:16:33 -07:00
( void * ) cont , private_data ) ;
}
2008-11-26 14:01:22 +01:00
2008-06-26 14:02:39 -07:00
enum winbindd_result winbindd_dual_list_users ( struct winbindd_domain * domain ,
struct winbindd_cli_state * state )
{
WINBIND_USERINFO * info ;
NTSTATUS status ;
struct winbindd_methods * methods ;
uint32 num_entries = 0 ;
2009-05-12 17:47:22 +02:00
char * extra_data ;
2008-06-26 14:02:39 -07:00
uint32_t extra_data_len = 0 , i ;
/* Must copy domain into response first for debugging in parent */
2009-06-14 12:41:46 +02:00
fstrcpy ( state - > response - > data . name . dom_name , domain - > name ) ;
2008-06-26 14:02:39 -07:00
/* Query user info */
methods = domain - > methods ;
status = methods - > query_user_list ( domain , state - > mem_ctx ,
& num_entries , & info ) ;
2008-11-26 14:01:22 +01:00
2008-06-26 14:02:39 -07:00
if ( ! NT_STATUS_IS_OK ( status ) )
return WINBINDD_ERROR ;
if ( num_entries = = 0 )
return WINBINDD_OK ;
/* Allocate some memory for extra data. Note that we limit
account names to sizeof ( fstring ) = 256 characters .
+ 1 for the ' , ' between group names */
2009-05-12 17:47:22 +02:00
extra_data = talloc_array ( state - > mem_ctx , char ,
( sizeof ( fstring ) + 1 ) * num_entries ) ;
2008-11-26 14:01:22 +01:00
2008-06-26 14:02:39 -07:00
if ( ! extra_data ) {
DEBUG ( 0 , ( " failed to enlarge buffer! \n " ) ) ;
return WINBINDD_ERROR ;
}
/* Pack user list into extra data fields */
for ( i = 0 ; i < num_entries ; i + + ) {
fstring acct_name , name ;
2008-11-26 14:01:22 +01:00
2008-06-26 14:02:39 -07:00
if ( info [ i ] . acct_name = = NULL )
fstrcpy ( acct_name , " " ) ;
else
fstrcpy ( acct_name , info [ i ] . acct_name ) ;
2008-11-26 14:01:22 +01:00
2008-06-26 14:02:39 -07:00
fill_domain_username ( name , domain - > name , acct_name , True ) ;
/* Append to extra data */
memcpy ( & extra_data [ extra_data_len ] , name , strlen ( name ) ) ;
extra_data_len + = strlen ( name ) ;
extra_data [ extra_data_len + + ] = ' , ' ;
}
/* Assign extra_data fields in response structure */
if ( extra_data ) {
/* remove trailing ',' */
extra_data [ extra_data_len - 1 ] = ' \0 ' ;
2009-06-14 12:41:46 +02:00
state - > response - > extra_data . data = extra_data ;
state - > response - > length + = extra_data_len ;
2008-06-26 14:02:39 -07:00
}
return WINBINDD_OK ;
}
2008-05-21 20:16:33 -07:00
enum winbindd_result winbindd_dual_list_groups ( struct winbindd_domain * domain ,
struct winbindd_cli_state * state )
{
2008-07-01 14:24:47 +02:00
struct getent_state groups ;
2009-05-12 17:47:22 +02:00
char * extra_data ;
2008-06-26 14:02:39 -07:00
uint32_t extra_data_len = 0 , i ;
2008-05-21 20:16:33 -07:00
2008-07-01 14:24:47 +02:00
ZERO_STRUCT ( groups ) ;
2008-06-26 14:02:39 -07:00
/* Must copy domain into response first for debugging in parent */
2009-06-14 12:41:46 +02:00
fstrcpy ( state - > response - > data . name . dom_name , domain - > name ) ;
2008-05-21 20:16:33 -07:00
fstrcpy ( groups . domain_name , domain - > name ) ;
/* Get list of sam groups */
if ( ! get_sam_group_entries ( & groups ) ) {
/* this domain is empty or in an error state */
return WINBINDD_ERROR ;
}
/* Allocate some memory for extra data. Note that we limit
account names to sizeof ( fstring ) = 256 characters .
+ 1 for the ' , ' between group names */
2009-05-12 17:47:22 +02:00
extra_data = talloc_array (
state - > mem_ctx , char ,
2008-05-21 20:16:33 -07:00
( sizeof ( fstring ) + 1 ) * groups . num_sam_entries ) ;
if ( ! extra_data ) {
DEBUG ( 0 , ( " failed to enlarge buffer! \n " ) ) ;
SAFE_FREE ( groups . sam_entries ) ;
return WINBINDD_ERROR ;
}
/* Pack group list into extra data fields */
for ( i = 0 ; i < groups . num_sam_entries ; i + + ) {
char * group_name = ( ( struct acct_info * )
groups . sam_entries ) [ i ] . acct_name ;
fstring name ;
fill_domain_username ( name , domain - > name , group_name , True ) ;
/* Append to extra data */
memcpy ( & extra_data [ extra_data_len ] , name , strlen ( name ) ) ;
extra_data_len + = strlen ( name ) ;
extra_data [ extra_data_len + + ] = ' , ' ;
}
SAFE_FREE ( groups . sam_entries ) ;
/* Assign extra_data fields in response structure */
if ( extra_data ) {
/* remove trailing ',' */
extra_data [ extra_data_len - 1 ] = ' \0 ' ;
2009-06-14 12:41:46 +02:00
state - > response - > extra_data . data = extra_data ;
state - > response - > length + = extra_data_len ;
2008-05-21 20:16:33 -07:00
}
return WINBINDD_OK ;
}
2007-10-18 17:40:25 -07:00
bool print_sidlist ( TALLOC_CTX * mem_ctx , const DOM_SID * sids ,
2005-10-18 03:24:00 +00:00
size_t num_sids , char * * result , ssize_t * len )
2005-06-08 22:10:34 +00:00
{
2005-10-18 03:24:00 +00:00
size_t i ;
2005-06-08 22:10:34 +00:00
size_t buflen = 0 ;
2005-09-30 17:13:37 +00:00
* len = 0 ;
2005-06-08 22:10:34 +00:00
* result = NULL ;
for ( i = 0 ; i < num_sids ; i + + ) {
2007-12-15 22:00:39 +01:00
fstring tmp ;
2005-09-30 17:13:37 +00:00
sprintf_append ( mem_ctx , result , len , & buflen ,
2007-12-15 22:47:30 +01:00
" %s \n " , sid_to_fstring ( tmp , & sids [ i ] ) ) ;
2005-06-08 22:10:34 +00:00
}
if ( ( num_sids ! = 0 ) & & ( * result = = NULL ) ) {
return False ;
}
return True ;
}
2009-02-10 13:59:10 -08:00
bool parse_sidlist ( TALLOC_CTX * mem_ctx , char * sidstr ,
DOM_SID * * sids , size_t * num_sids )
2005-06-08 22:10:34 +00:00
{
char * p , * q ;
p = sidstr ;
if ( p = = NULL )
2005-09-30 17:13:37 +00:00
return False ;
2005-06-08 22:10:34 +00:00
while ( p [ 0 ] ! = ' \0 ' ) {
DOM_SID sid ;
q = strchr ( p , ' \n ' ) ;
if ( q = = NULL ) {
DEBUG ( 0 , ( " Got invalid sidstr: %s \n " , p ) ) ;
return False ;
}
* q = ' \0 ' ;
q + = 1 ;
if ( ! string_to_sid ( & sid , p ) ) {
DEBUG ( 0 , ( " Could not parse sid %s \n " , p ) ) ;
return False ;
}
2008-01-09 00:11:31 +01:00
if ( ! NT_STATUS_IS_OK ( add_sid_to_array ( mem_ctx , & sid , sids ,
num_sids ) ) )
{
2006-12-09 02:58:18 +00:00
return False ;
}
2005-06-08 22:10:34 +00:00
p = q ;
}
return True ;
}
2007-10-18 17:40:25 -07:00
static bool parse_ridlist ( TALLOC_CTX * mem_ctx , char * ridstr ,
2006-07-11 18:01:26 +00:00
uint32 * * rids , size_t * num_rids )
2005-09-30 17:13:37 +00:00
{
char * p ;
p = ridstr ;
if ( p = = NULL )
return False ;
while ( p [ 0 ] ! = ' \0 ' ) {
uint32 rid ;
char * q ;
rid = strtoul ( p , & q , 10 ) ;
if ( * q ! = ' \n ' ) {
DEBUG ( 0 , ( " Got invalid ridstr: %s \n " , p ) ) ;
return False ;
}
p = q + 1 ;
2006-07-11 18:01:26 +00:00
ADD_TO_ARRAY ( mem_ctx , uint32 , rid , rids , num_rids ) ;
2005-09-30 17:13:37 +00:00
}
return True ;
}
2006-07-11 18:01:26 +00:00
enum winbindd_result winbindd_dual_lookuprids ( struct winbindd_domain * domain ,
struct winbindd_cli_state * state )
{
uint32 * rids = NULL ;
size_t i , buflen , num_rids = 0 ;
ssize_t len ;
DOM_SID domain_sid ;
char * domain_name ;
char * * names ;
2006-09-08 14:28:06 +00:00
enum lsa_SidType * types ;
2006-07-11 18:01:26 +00:00
NTSTATUS status ;
char * result ;
DEBUG ( 10 , ( " Looking up RIDs for domain %s (%s) \n " ,
2009-05-07 22:46:27 +02:00
state - > request - > domain_name ,
state - > request - > data . sid ) ) ;
2006-07-11 18:01:26 +00:00
2009-05-07 22:46:27 +02:00
if ( ! parse_ridlist ( state - > mem_ctx , state - > request - > extra_data . data ,
2006-07-11 18:01:26 +00:00
& rids , & num_rids ) ) {
DEBUG ( 5 , ( " Could not parse ridlist \n " ) ) ;
return WINBINDD_ERROR ;
}
2009-05-07 22:46:27 +02:00
if ( ! string_to_sid ( & domain_sid , state - > request - > data . sid ) ) {
2006-07-11 18:01:26 +00:00
DEBUG ( 5 , ( " Could not parse domain sid %s \n " ,
2009-05-07 22:46:27 +02:00
state - > request - > data . sid ) ) ;
2006-07-11 18:01:26 +00:00
return WINBINDD_ERROR ;
}
status = domain - > methods - > rids_to_names ( domain , state - > mem_ctx ,
& domain_sid , rids , num_rids ,
& domain_name ,
& names , & types ) ;
if ( ! NT_STATUS_IS_OK ( status ) & &
! NT_STATUS_EQUAL ( status , STATUS_SOME_UNMAPPED ) ) {
return WINBINDD_ERROR ;
}
len = 0 ;
buflen = 0 ;
result = NULL ;
for ( i = 0 ; i < num_rids ; i + + ) {
sprintf_append ( state - > mem_ctx , & result , & len , & buflen ,
" %d %s \n " , types [ i ] , names [ i ] ) ;
}
2009-06-14 12:41:46 +02:00
fstrcpy ( state - > response - > data . domain_name , domain_name ) ;
2006-07-11 18:01:26 +00:00
if ( result ! = NULL ) {
2009-06-14 12:41:46 +02:00
state - > response - > extra_data . data = result ;
state - > response - > length + = len + 1 ;
2006-07-11 18:01:26 +00:00
}
return WINBINDD_OK ;
}
2007-10-18 17:40:25 -07:00
static void getsidaliases_recv ( TALLOC_CTX * mem_ctx , bool success ,
2005-06-08 22:10:34 +00:00
struct winbindd_response * response ,
2005-06-24 20:25:18 +00:00
void * c , void * private_data )
2005-06-08 22:10:34 +00:00
{
2007-10-18 17:40:25 -07:00
void ( * cont ) ( void * priv , bool succ ,
2006-07-11 18:01:26 +00:00
DOM_SID * aliases , size_t num_aliases ) =
2007-10-18 17:40:25 -07:00
( void ( * ) ( void * , bool , DOM_SID * , size_t ) ) c ;
2005-06-08 22:10:34 +00:00
char * aliases_str ;
DOM_SID * sids = NULL ;
2005-10-18 03:24:00 +00:00
size_t num_sids = 0 ;
2005-06-08 22:10:34 +00:00
if ( ! success ) {
DEBUG ( 5 , ( " Could not trigger getsidaliases \n " ) ) ;
2005-06-24 20:25:18 +00:00
cont ( private_data , success , NULL , 0 ) ;
2005-06-08 22:10:34 +00:00
return ;
}
if ( response - > result ! = WINBINDD_OK ) {
DEBUG ( 5 , ( " getsidaliases returned an error \n " ) ) ;
2005-06-24 20:25:18 +00:00
cont ( private_data , False , NULL , 0 ) ;
2005-06-08 22:10:34 +00:00
return ;
}
2006-07-11 18:01:26 +00:00
aliases_str = ( char * ) response - > extra_data . data ;
2005-06-08 22:10:34 +00:00
if ( aliases_str = = NULL ) {
DEBUG ( 10 , ( " getsidaliases return 0 SIDs \n " ) ) ;
2005-06-24 20:25:18 +00:00
cont ( private_data , True , NULL , 0 ) ;
2005-06-08 22:10:34 +00:00
return ;
}
if ( ! parse_sidlist ( mem_ctx , aliases_str , & sids , & num_sids ) ) {
DEBUG ( 0 , ( " Could not parse sids \n " ) ) ;
2005-06-24 20:25:18 +00:00
cont ( private_data , False , NULL , 0 ) ;
2005-06-08 22:10:34 +00:00
return ;
}
2005-06-24 20:25:18 +00:00
cont ( private_data , True , sids , num_sids ) ;
2005-06-08 22:10:34 +00:00
}
void winbindd_getsidaliases_async ( struct winbindd_domain * domain ,
TALLOC_CTX * mem_ctx ,
2005-10-18 03:24:00 +00:00
const DOM_SID * sids , size_t num_sids ,
2005-06-24 20:25:18 +00:00
void ( * cont ) ( void * private_data ,
2007-10-18 17:40:25 -07:00
bool success ,
2005-06-08 22:10:34 +00:00
const DOM_SID * aliases ,
2005-10-18 03:24:00 +00:00
size_t num_aliases ) ,
2005-06-24 20:25:18 +00:00
void * private_data )
2005-06-08 22:10:34 +00:00
{
struct winbindd_request request ;
char * sidstr = NULL ;
2005-09-30 17:13:37 +00:00
ssize_t len ;
2005-06-08 22:10:34 +00:00
if ( num_sids = = 0 ) {
2005-06-24 20:25:18 +00:00
cont ( private_data , True , NULL , 0 ) ;
2005-06-08 22:10:34 +00:00
return ;
}
2005-09-30 17:13:37 +00:00
if ( ! print_sidlist ( mem_ctx , sids , num_sids , & sidstr , & len ) ) {
2005-06-24 20:25:18 +00:00
cont ( private_data , False , NULL , 0 ) ;
2005-06-08 22:10:34 +00:00
return ;
}
ZERO_STRUCT ( request ) ;
request . cmd = WINBINDD_DUAL_GETSIDALIASES ;
2005-09-30 17:13:37 +00:00
request . extra_len = len ;
2006-04-12 14:10:39 +00:00
request . extra_data . data = sidstr ;
2005-06-08 22:10:34 +00:00
do_async_domain ( mem_ctx , domain , & request , getsidaliases_recv ,
2006-07-11 18:01:26 +00:00
( void * ) cont , private_data ) ;
2005-06-08 22:10:34 +00:00
}
struct gettoken_state {
TALLOC_CTX * mem_ctx ;
DOM_SID user_sid ;
struct winbindd_domain * alias_domain ;
2006-03-24 22:04:16 +00:00
struct winbindd_domain * local_alias_domain ;
2005-06-08 22:10:34 +00:00
struct winbindd_domain * builtin_domain ;
DOM_SID * sids ;
2005-10-18 03:24:00 +00:00
size_t num_sids ;
2007-10-18 17:40:25 -07:00
void ( * cont ) ( void * private_data , bool success , DOM_SID * sids , size_t num_sids ) ;
2005-06-24 20:25:18 +00:00
void * private_data ;
2005-06-08 22:10:34 +00:00
} ;
2007-10-18 17:40:25 -07:00
static void gettoken_recvdomgroups ( TALLOC_CTX * mem_ctx , bool success ,
2005-06-08 22:10:34 +00:00
struct winbindd_response * response ,
2005-06-24 20:25:18 +00:00
void * c , void * private_data ) ;
2007-10-18 17:40:25 -07:00
static void gettoken_recvaliases ( void * private_data , bool success ,
2005-06-08 22:10:34 +00:00
const DOM_SID * aliases ,
2005-10-18 03:24:00 +00:00
size_t num_aliases ) ;
2008-11-26 14:01:22 +01:00
2005-06-08 22:10:34 +00:00
void winbindd_gettoken_async ( TALLOC_CTX * mem_ctx , const DOM_SID * user_sid ,
2007-10-18 17:40:25 -07:00
void ( * cont ) ( void * private_data , bool success ,
2005-10-18 03:24:00 +00:00
DOM_SID * sids , size_t num_sids ) ,
2005-06-24 20:25:18 +00:00
void * private_data )
2005-06-08 22:10:34 +00:00
{
struct winbindd_domain * domain ;
struct winbindd_request request ;
struct gettoken_state * state ;
2006-10-16 00:12:00 +00:00
state = TALLOC_ZERO_P ( mem_ctx , struct gettoken_state ) ;
2005-06-08 22:10:34 +00:00
if ( state = = NULL ) {
DEBUG ( 0 , ( " talloc failed \n " ) ) ;
2005-06-24 20:25:18 +00:00
cont ( private_data , False , NULL , 0 ) ;
2005-06-08 22:10:34 +00:00
return ;
}
state - > mem_ctx = mem_ctx ;
sid_copy ( & state - > user_sid , user_sid ) ;
state - > alias_domain = find_our_domain ( ) ;
2006-03-24 22:04:16 +00:00
state - > local_alias_domain = find_domain_from_name ( get_global_sam_name ( ) ) ;
2005-06-08 22:10:34 +00:00
state - > builtin_domain = find_builtin_domain ( ) ;
state - > cont = cont ;
2005-06-24 20:25:18 +00:00
state - > private_data = private_data ;
2005-06-08 22:10:34 +00:00
domain = find_domain_from_sid_noinit ( user_sid ) ;
if ( domain = = NULL ) {
DEBUG ( 5 , ( " Could not find domain from SID %s \n " ,
2007-12-15 21:11:36 +01:00
sid_string_dbg ( user_sid ) ) ) ;
2005-06-24 20:25:18 +00:00
cont ( private_data , False , NULL , 0 ) ;
2005-06-08 22:10:34 +00:00
return ;
}
ZERO_STRUCT ( request ) ;
request . cmd = WINBINDD_GETUSERDOMGROUPS ;
2007-12-15 22:47:30 +01:00
sid_to_fstring ( request . data . sid , user_sid ) ;
2005-06-08 22:10:34 +00:00
do_async_domain ( mem_ctx , domain , & request , gettoken_recvdomgroups ,
NULL , state ) ;
}
2007-10-18 17:40:25 -07:00
static void gettoken_recvdomgroups ( TALLOC_CTX * mem_ctx , bool success ,
2005-06-08 22:10:34 +00:00
struct winbindd_response * response ,
2005-06-24 20:25:18 +00:00
void * c , void * private_data )
2005-06-08 22:10:34 +00:00
{
struct gettoken_state * state =
2005-06-24 20:25:18 +00:00
talloc_get_type_abort ( private_data , struct gettoken_state ) ;
2005-06-08 22:10:34 +00:00
char * sids_str ;
2008-11-26 14:01:22 +01:00
2005-06-08 22:10:34 +00:00
if ( ! success ) {
DEBUG ( 10 , ( " Could not get domain groups \n " ) ) ;
2005-06-24 20:25:18 +00:00
state - > cont ( state - > private_data , False , NULL , 0 ) ;
2005-06-08 22:10:34 +00:00
return ;
}
2006-07-11 18:01:26 +00:00
sids_str = ( char * ) response - > extra_data . data ;
2005-06-08 22:10:34 +00:00
if ( sids_str = = NULL ) {
2006-03-15 03:46:20 +00:00
/* This could be normal if we are dealing with a
local user and local groups */
if ( ! sid_check_is_in_our_domain ( & state - > user_sid ) ) {
DEBUG ( 10 , ( " Received no domain groups \n " ) ) ;
state - > cont ( state - > private_data , True , NULL , 0 ) ;
return ;
}
2005-06-08 22:10:34 +00:00
}
state - > sids = NULL ;
state - > num_sids = 0 ;
2008-01-09 00:11:31 +01:00
if ( ! NT_STATUS_IS_OK ( add_sid_to_array ( mem_ctx , & state - > user_sid ,
& state - > sids , & state - > num_sids ) ) )
{
2006-12-09 02:58:18 +00:00
DEBUG ( 0 , ( " Out of memory \n " ) ) ;
state - > cont ( state - > private_data , False , NULL , 0 ) ;
return ;
}
2005-06-08 22:10:34 +00:00
2006-03-15 03:46:20 +00:00
if ( sids_str & & ! parse_sidlist ( mem_ctx , sids_str , & state - > sids ,
2005-06-08 22:10:34 +00:00
& state - > num_sids ) ) {
DEBUG ( 0 , ( " Could not parse sids \n " ) ) ;
2005-06-24 20:25:18 +00:00
state - > cont ( state - > private_data , False , NULL , 0 ) ;
2005-06-08 22:10:34 +00:00
return ;
}
if ( state - > alias_domain = = NULL ) {
DEBUG ( 10 , ( " Don't expand domain local groups \n " ) ) ;
2005-06-24 20:25:18 +00:00
state - > cont ( state - > private_data , True , state - > sids ,
2005-06-08 22:10:34 +00:00
state - > num_sids ) ;
return ;
}
winbindd_getsidaliases_async ( state - > alias_domain , mem_ctx ,
state - > sids , state - > num_sids ,
gettoken_recvaliases , state ) ;
}
2007-10-18 17:40:25 -07:00
static void gettoken_recvaliases ( void * private_data , bool success ,
2005-06-08 22:10:34 +00:00
const DOM_SID * aliases ,
2005-10-18 03:24:00 +00:00
size_t num_aliases )
2005-06-08 22:10:34 +00:00
{
2006-07-11 18:01:26 +00:00
struct gettoken_state * state = ( struct gettoken_state * ) private_data ;
2005-10-18 03:24:00 +00:00
size_t i ;
2005-06-08 22:10:34 +00:00
if ( ! success ) {
DEBUG ( 10 , ( " Could not receive domain local groups \n " ) ) ;
2005-06-24 20:25:18 +00:00
state - > cont ( state - > private_data , False , NULL , 0 ) ;
2005-06-08 22:10:34 +00:00
return ;
}
2006-12-09 02:58:18 +00:00
for ( i = 0 ; i < num_aliases ; i + + ) {
2008-01-09 00:11:31 +01:00
if ( ! NT_STATUS_IS_OK ( add_sid_to_array ( state - > mem_ctx ,
& aliases [ i ] ,
& state - > sids ,
& state - > num_sids ) ) )
{
2006-12-09 02:58:18 +00:00
DEBUG ( 0 , ( " Out of memory \n " ) ) ;
state - > cont ( state - > private_data , False , NULL , 0 ) ;
return ;
}
}
2005-06-08 22:10:34 +00:00
2006-03-24 22:04:16 +00:00
if ( state - > local_alias_domain ! = NULL ) {
struct winbindd_domain * local_domain = state - > local_alias_domain ;
DEBUG ( 10 , ( " Expanding our own local groups \n " ) ) ;
state - > local_alias_domain = NULL ;
winbindd_getsidaliases_async ( local_domain , state - > mem_ctx ,
state - > sids , state - > num_sids ,
gettoken_recvaliases , state ) ;
return ;
}
2005-06-08 22:10:34 +00:00
if ( state - > builtin_domain ! = NULL ) {
struct winbindd_domain * builtin_domain = state - > builtin_domain ;
2006-03-24 22:04:16 +00:00
DEBUG ( 10 , ( " Expanding our own BUILTIN groups \n " ) ) ;
2005-06-08 22:10:34 +00:00
state - > builtin_domain = NULL ;
winbindd_getsidaliases_async ( builtin_domain , state - > mem_ctx ,
state - > sids , state - > num_sids ,
gettoken_recvaliases , state ) ;
return ;
}
2005-06-24 20:25:18 +00:00
state - > cont ( state - > private_data , True , state - > sids , state - > num_sids ) ;
2005-06-08 22:10:34 +00:00
}
2007-10-18 17:40:25 -07:00
static void query_user_recv ( TALLOC_CTX * mem_ctx , bool success ,
2005-06-08 22:10:34 +00:00
struct winbindd_response * response ,
2005-06-24 20:25:18 +00:00
void * c , void * private_data )
2005-06-08 22:10:34 +00:00
{
2007-10-18 17:40:25 -07:00
void ( * cont ) ( void * priv , bool succ , const char * acct_name ,
2005-06-29 14:03:53 +00:00
const char * full_name , const char * homedir ,
2007-01-24 01:48:08 +00:00
const char * shell , uint32 gid , uint32 group_rid ) =
2007-10-18 17:40:25 -07:00
( void ( * ) ( void * , bool , const char * , const char * ,
2007-01-24 01:48:08 +00:00
const char * , const char * , uint32 , uint32 ) ) c ;
2005-06-08 22:10:34 +00:00
if ( ! success ) {
DEBUG ( 5 , ( " Could not trigger query_user \n " ) ) ;
2007-01-24 01:48:08 +00:00
cont ( private_data , False , NULL , NULL , NULL , NULL , - 1 , - 1 ) ;
2005-06-08 22:10:34 +00:00
return ;
}
2007-05-06 20:16:12 +00:00
if ( response - > result ! = WINBINDD_OK ) {
DEBUG ( 5 , ( " query_user returned an error \n " ) ) ;
cont ( private_data , False , NULL , NULL , NULL , NULL , - 1 , - 1 ) ;
return ;
}
2005-06-24 20:25:18 +00:00
cont ( private_data , True , response - > data . user_info . acct_name ,
2005-06-08 22:10:34 +00:00
response - > data . user_info . full_name ,
2005-06-29 14:03:53 +00:00
response - > data . user_info . homedir ,
response - > data . user_info . shell ,
2007-01-24 01:48:08 +00:00
response - > data . user_info . primary_gid ,
2005-06-08 22:10:34 +00:00
response - > data . user_info . group_rid ) ;
}
void query_user_async ( TALLOC_CTX * mem_ctx , struct winbindd_domain * domain ,
const DOM_SID * sid ,
2007-10-18 17:40:25 -07:00
void ( * cont ) ( void * private_data , bool success ,
2005-06-08 22:10:34 +00:00
const char * acct_name ,
const char * full_name ,
2005-06-29 14:03:53 +00:00
const char * homedir ,
const char * shell ,
2007-01-24 01:48:08 +00:00
gid_t gid ,
2005-06-08 22:10:34 +00:00
uint32 group_rid ) ,
2005-06-24 20:25:18 +00:00
void * private_data )
2005-06-08 22:10:34 +00:00
{
struct winbindd_request request ;
ZERO_STRUCT ( request ) ;
request . cmd = WINBINDD_DUAL_USERINFO ;
2007-12-15 22:47:30 +01:00
sid_to_fstring ( request . data . sid , sid ) ;
2005-06-08 22:10:34 +00:00
do_async_domain ( mem_ctx , domain , & request , query_user_recv ,
2006-07-11 18:01:26 +00:00
( void * ) cont , private_data ) ;
2005-06-08 22:10:34 +00:00
}
2009-05-16 13:43:03 +02:00
enum winbindd_result winbindd_dual_ping ( struct winbindd_domain * domain ,
struct winbindd_cli_state * state )
{
return WINBINDD_OK ;
}