2017-01-26 12:51:24 +01:00
/*
2007-12-21 11:59:56 -06:00
Unix SMB / CIFS implementation .
Winbind Utility functions
Copyright ( C ) Gerald ( Jerry ) Carter 2007
2009-08-07 12:09:21 +02:00
2007-12-21 11:59:56 -06: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 3 of the License , or
( at your option ) any later version .
2009-08-07 12:09:21 +02:00
2007-12-21 11:59:56 -06: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 .
2009-08-07 12:09:21 +02:00
2007-12-21 11:59:56 -06:00
You should have received a copy of the GNU General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# include "includes.h"
2010-10-12 15:27:50 +11:00
# include "../libcli/security/security.h"
2011-03-02 16:11:00 +01:00
# include "../lib/util/util_pw.h"
2011-03-30 14:03:13 +02:00
# include "nsswitch/libwbclient/wbclient.h"
2007-12-21 11:59:56 -06:00
2011-02-24 22:30:16 +01:00
# include "lib/winbind_util.h"
2007-12-21 11:59:56 -06:00
2019-03-05 11:50:48 -07:00
# if defined(WITH_WINBIND)
2009-02-10 11:06:44 -08:00
struct passwd * winbind_getpwnam ( const char * name )
{
wbcErr result ;
struct passwd * tmp_pwd = NULL ;
struct passwd * pwd = NULL ;
result = wbcGetpwnam ( name , & tmp_pwd ) ;
if ( result ! = WBC_ERR_SUCCESS )
return pwd ;
pwd = tcopy_passwd ( talloc_tos ( ) , tmp_pwd ) ;
wbcFreeMemory ( tmp_pwd ) ;
return pwd ;
}
2010-05-21 11:25:01 +10:00
struct passwd * winbind_getpwsid ( const struct dom_sid * sid )
2009-02-10 11:06:44 -08:00
{
wbcErr result ;
struct passwd * tmp_pwd = NULL ;
struct passwd * pwd = NULL ;
struct wbcDomainSid dom_sid ;
memcpy ( & dom_sid , sid , sizeof ( dom_sid ) ) ;
result = wbcGetpwsid ( & dom_sid , & tmp_pwd ) ;
if ( result ! = WBC_ERR_SUCCESS )
return pwd ;
pwd = tcopy_passwd ( talloc_tos ( ) , tmp_pwd ) ;
wbcFreeMemory ( tmp_pwd ) ;
return pwd ;
}
2007-12-21 11:59:56 -06:00
/* Call winbindd to convert a name to a sid */
2010-05-21 11:25:01 +10:00
bool winbind_lookup_name ( const char * dom_name , const char * name , struct dom_sid * sid ,
2007-12-21 11:59:56 -06:00
enum lsa_SidType * name_type )
{
struct wbcDomainSid dom_sid ;
wbcErr result ;
2017-01-26 12:51:24 +01:00
enum wbcSidType type ;
2007-12-21 11:59:56 -06:00
result = wbcLookupName ( dom_name , name , & dom_sid , & type ) ;
if ( result ! = WBC_ERR_SUCCESS )
2008-01-02 14:54:25 -06:00
return false ;
2007-12-21 11:59:56 -06:00
2010-05-21 11:25:01 +10:00
memcpy ( sid , & dom_sid , sizeof ( struct dom_sid ) ) ;
2017-01-26 12:51:24 +01:00
* name_type = ( enum lsa_SidType ) type ;
2007-12-21 11:59:56 -06:00
2017-01-26 12:51:24 +01:00
return true ;
2007-12-21 11:59:56 -06:00
}
/* Call winbindd to convert sid to name */
2010-05-21 11:25:01 +10:00
bool winbind_lookup_sid ( TALLOC_CTX * mem_ctx , const struct dom_sid * sid ,
2007-12-21 11:59:56 -06:00
const char * * domain , const char * * name ,
enum lsa_SidType * name_type )
{
struct wbcDomainSid dom_sid ;
wbcErr result ;
enum wbcSidType type ;
char * domain_name = NULL ;
char * account_name = NULL ;
2018-12-13 21:22:27 +01:00
struct dom_sid_buf buf ;
2007-12-21 11:59:56 -06:00
2017-01-26 12:51:24 +01:00
memcpy ( & dom_sid , sid , sizeof ( dom_sid ) ) ;
2007-12-21 11:59:56 -06:00
result = wbcLookupSid ( & dom_sid , & domain_name , & account_name , & type ) ;
if ( result ! = WBC_ERR_SUCCESS )
2008-01-02 14:54:25 -06:00
return false ;
2007-12-21 11:59:56 -06:00
/* Copy out result */
2017-01-26 12:51:24 +01:00
if ( domain ) {
2007-12-21 11:59:56 -06:00
* domain = talloc_strdup ( mem_ctx , domain_name ) ;
}
if ( name ) {
* name = talloc_strdup ( mem_ctx , account_name ) ;
}
* name_type = ( enum lsa_SidType ) type ;
2017-01-26 12:51:24 +01:00
DEBUG ( 10 , ( " winbind_lookup_sid: SUCCESS: SID %s -> %s %s \n " ,
2018-12-13 21:22:27 +01:00
dom_sid_str_buf ( sid , & buf ) , domain_name , account_name ) ) ;
2007-12-21 11:59:56 -06:00
2008-01-02 14:50:59 -06:00
wbcFreeMemory ( domain_name ) ;
wbcFreeMemory ( account_name ) ;
2009-08-07 12:09:21 +02:00
2017-01-26 12:51:24 +01:00
if ( ( domain & & ! * domain ) | | ( name & & ! * name ) ) {
2007-12-21 11:59:56 -06:00
DEBUG ( 0 , ( " winbind_lookup_sid: talloc() failed! \n " ) ) ;
2008-01-02 14:54:25 -06:00
return false ;
2017-01-26 12:51:24 +01:00
}
2007-12-21 11:59:56 -06:00
2008-01-02 14:54:25 -06:00
return true ;
2007-12-21 11:59:56 -06:00
}
/* Ping winbindd to see it is alive */
bool winbind_ping ( void )
{
wbcErr result = wbcPing ( ) ;
return ( result = = WBC_ERR_SUCCESS ) ;
}
/* Call winbindd to convert SID to uid */
2010-05-21 11:25:01 +10:00
bool winbind_sid_to_uid ( uid_t * puid , const struct dom_sid * sid )
2007-12-21 11:59:56 -06:00
{
struct wbcDomainSid dom_sid ;
wbcErr result ;
2017-01-26 12:51:24 +01:00
memcpy ( & dom_sid , sid , sizeof ( dom_sid ) ) ;
2007-12-21 11:59:56 -06:00
2017-01-26 12:51:24 +01:00
result = wbcSidToUid ( & dom_sid , puid ) ;
2007-12-21 11:59:56 -06:00
2017-01-26 12:51:24 +01:00
return ( result = = WBC_ERR_SUCCESS ) ;
2007-12-21 11:59:56 -06:00
}
/* Call winbindd to convert SID to gid */
2010-05-21 11:25:01 +10:00
bool winbind_sid_to_gid ( gid_t * pgid , const struct dom_sid * sid )
2007-12-21 11:59:56 -06:00
{
struct wbcDomainSid dom_sid ;
wbcErr result ;
2017-01-26 12:51:24 +01:00
memcpy ( & dom_sid , sid , sizeof ( dom_sid ) ) ;
2007-12-21 11:59:56 -06:00
2017-01-26 12:51:24 +01:00
result = wbcSidToGid ( & dom_sid , pgid ) ;
2007-12-21 11:59:56 -06:00
2017-01-26 12:51:24 +01:00
return ( result = = WBC_ERR_SUCCESS ) ;
2007-12-21 11:59:56 -06:00
}
2019-02-26 14:45:32 +01:00
bool winbind_xid_to_sid ( struct dom_sid * sid , const struct unixid * xid )
{
struct wbcUnixId wbc_xid ;
struct wbcDomainSid dom_sid ;
wbcErr result ;
switch ( xid - > type ) {
case ID_TYPE_UID :
wbc_xid = ( struct wbcUnixId ) {
. type = WBC_ID_TYPE_UID , . id . uid = xid - > id
} ;
break ;
case ID_TYPE_GID :
wbc_xid = ( struct wbcUnixId ) {
. type = WBC_ID_TYPE_GID , . id . gid = xid - > id
} ;
break ;
default :
return false ;
}
result = wbcUnixIdsToSids ( & wbc_xid , 1 , & dom_sid ) ;
if ( result ! = WBC_ERR_SUCCESS ) {
return false ;
}
memcpy ( sid , & dom_sid , sizeof ( struct dom_sid ) ) ;
return true ;
}
2007-12-21 11:59:56 -06:00
/* Check for a trusted domain */
wbcErr wb_is_trusted_domain ( const char * domain )
{
wbcErr result ;
2007-12-21 13:47:45 -06:00
struct wbcDomainInfo * info = NULL ;
2009-08-07 12:09:21 +02:00
2007-12-21 11:59:56 -06:00
result = wbcDomainInfo ( domain , & info ) ;
2007-12-21 13:47:45 -06:00
if ( WBC_ERROR_IS_OK ( result ) ) {
wbcFreeMemory ( info ) ;
2007-12-21 11:59:56 -06:00
}
2017-01-26 12:51:24 +01:00
return result ;
2007-12-21 11:59:56 -06:00
}
/* Lookup a set of rids in a given domain */
bool winbind_lookup_rids ( TALLOC_CTX * mem_ctx ,
2010-05-21 11:25:01 +10:00
const struct dom_sid * domain_sid ,
2015-05-09 16:33:10 -07:00
int num_rids , uint32_t * rids ,
2007-12-21 11:59:56 -06:00
const char * * domain_name ,
const char * * * names , enum lsa_SidType * * types )
{
const char * dom_name = NULL ;
const char * * namelist = NULL ;
enum wbcSidType * name_types = NULL ;
struct wbcDomainSid dom_sid ;
wbcErr ret ;
2017-01-26 12:51:24 +01:00
int i ;
2009-08-07 12:09:21 +02:00
2007-12-21 11:59:56 -06:00
memcpy ( & dom_sid , domain_sid , sizeof ( struct wbcDomainSid ) ) ;
2009-08-07 12:09:21 +02:00
2007-12-21 11:59:56 -06:00
ret = wbcLookupRids ( & dom_sid , num_rids , rids ,
& dom_name , & namelist , & name_types ) ;
2017-01-26 12:51:24 +01:00
if ( ret ! = WBC_ERR_SUCCESS ) {
2008-01-02 14:54:25 -06:00
return false ;
2017-01-26 12:51:24 +01:00
}
2009-08-07 12:09:21 +02:00
2007-12-21 11:59:56 -06:00
* domain_name = talloc_strdup ( mem_ctx , dom_name ) ;
2011-06-07 11:30:12 +10:00
* names = talloc_array ( mem_ctx , const char * , num_rids ) ;
* types = talloc_array ( mem_ctx , enum lsa_SidType , num_rids ) ;
2007-12-21 11:59:56 -06:00
for ( i = 0 ; i < num_rids ; i + + ) {
2008-01-14 21:32:59 +03:00
( * names ) [ i ] = talloc_strdup ( * names , namelist [ i ] ) ;
2007-12-21 11:59:56 -06:00
( * types ) [ i ] = ( enum lsa_SidType ) name_types [ i ] ;
}
2008-01-02 14:50:59 -06:00
2011-05-05 10:41:59 -07:00
wbcFreeMemory ( discard_const_p ( char , dom_name ) ) ;
2008-01-02 14:50:59 -06:00
wbcFreeMemory ( namelist ) ;
wbcFreeMemory ( name_types ) ;
2009-08-07 12:09:21 +02:00
2017-01-26 12:51:24 +01:00
return true ;
2007-12-21 11:59:56 -06:00
}
/* Ask Winbind to allocate a new uid for us */
bool winbind_allocate_uid ( uid_t * uid )
{
wbcErr ret ;
2009-08-07 12:09:21 +02:00
2007-12-21 11:59:56 -06:00
ret = wbcAllocateUid ( uid ) ;
2009-08-07 12:09:21 +02:00
2007-12-21 11:59:56 -06:00
return ( ret = = WBC_ERR_SUCCESS ) ;
}
/* Ask Winbind to allocate a new gid for us */
bool winbind_allocate_gid ( gid_t * gid )
{
wbcErr ret ;
2009-08-07 12:09:21 +02:00
2007-12-21 11:59:56 -06:00
ret = wbcAllocateGid ( gid ) ;
2009-08-07 12:09:21 +02:00
2007-12-21 11:59:56 -06:00
return ( ret = = WBC_ERR_SUCCESS ) ;
}
2013-12-16 12:57:20 +01:00
bool winbind_lookup_usersids ( TALLOC_CTX * mem_ctx ,
const struct dom_sid * user_sid ,
uint32_t * p_num_sids ,
struct dom_sid * * p_sids )
{
wbcErr ret ;
struct wbcDomainSid dom_sid ;
struct wbcDomainSid * sid_list = NULL ;
uint32_t num_sids ;
memcpy ( & dom_sid , user_sid , sizeof ( dom_sid ) ) ;
ret = wbcLookupUserSids ( & dom_sid ,
false ,
& num_sids ,
& sid_list ) ;
if ( ret ! = WBC_ERR_SUCCESS ) {
return false ;
}
* p_sids = talloc_array ( mem_ctx , struct dom_sid , num_sids ) ;
if ( * p_sids = = NULL ) {
wbcFreeMemory ( sid_list ) ;
return false ;
}
memcpy ( * p_sids , sid_list , sizeof ( dom_sid ) * num_sids ) ;
* p_num_sids = num_sids ;
wbcFreeMemory ( sid_list ) ;
return true ;
}
2007-12-21 11:59:56 -06:00
# else /* WITH_WINBIND */
2009-02-10 11:06:44 -08:00
struct passwd * winbind_getpwnam ( const char * name )
{
return NULL ;
}
2010-05-21 11:25:01 +10:00
struct passwd * winbind_getpwsid ( const struct dom_sid * sid )
2009-02-10 11:06:44 -08:00
{
return NULL ;
}
2010-05-21 11:25:01 +10:00
bool winbind_lookup_name ( const char * dom_name , const char * name , struct dom_sid * sid ,
2007-12-21 11:59:56 -06:00
enum lsa_SidType * name_type )
{
2008-01-02 14:54:25 -06:00
return false ;
2007-12-21 11:59:56 -06:00
}
/* Call winbindd to convert sid to name */
2010-05-21 11:25:01 +10:00
bool winbind_lookup_sid ( TALLOC_CTX * mem_ctx , const struct dom_sid * sid ,
2007-12-21 11:59:56 -06:00
const char * * domain , const char * * name ,
enum lsa_SidType * name_type )
{
2008-01-02 14:54:25 -06:00
return false ;
2007-12-21 11:59:56 -06:00
}
/* Ping winbindd to see it is alive */
bool winbind_ping ( void )
{
2008-01-02 14:54:25 -06:00
return false ;
2007-12-21 11:59:56 -06:00
}
/* Call winbindd to convert SID to uid */
2010-05-21 11:25:01 +10:00
bool winbind_sid_to_uid ( uid_t * puid , const struct dom_sid * sid )
2007-12-21 11:59:56 -06:00
{
2008-01-02 14:54:25 -06:00
return false ;
2007-12-21 11:59:56 -06:00
}
/* Call winbindd to convert SID to gid */
2010-05-21 11:25:01 +10:00
bool winbind_sid_to_gid ( gid_t * pgid , const struct dom_sid * sid )
2007-12-21 11:59:56 -06:00
{
2017-01-26 12:51:24 +01:00
return false ;
2007-12-21 11:59:56 -06:00
}
2019-03-05 11:56:49 -07:00
/* Call winbindd to convert uid or gid to SID */
bool winbind_xid_to_sid ( struct dom_sid * sid , const struct unixid * xid )
{
return false ;
}
2007-12-21 11:59:56 -06:00
/* Check for a trusted domain */
wbcErr wb_is_trusted_domain ( const char * domain )
{
return WBC_ERR_UNKNOWN_FAILURE ;
}
/* Lookup a set of rids in a given domain */
bool winbind_lookup_rids ( TALLOC_CTX * mem_ctx ,
2010-05-21 11:25:01 +10:00
const struct dom_sid * domain_sid ,
2015-05-09 16:33:10 -07:00
int num_rids , uint32_t * rids ,
2007-12-21 11:59:56 -06:00
const char * * domain_name ,
const char * * * names , enum lsa_SidType * * types )
{
2008-01-02 14:54:25 -06:00
return false ;
2007-12-21 11:59:56 -06:00
}
/* Ask Winbind to allocate a new uid for us */
bool winbind_allocate_uid ( uid_t * uid )
{
2008-01-02 14:54:25 -06:00
return false ;
2007-12-21 11:59:56 -06:00
}
/* Ask Winbind to allocate a new gid for us */
bool winbind_allocate_gid ( gid_t * gid )
{
2008-01-02 14:54:25 -06:00
return false ;
2007-12-21 11:59:56 -06:00
}
2014-05-09 15:01:23 +02:00
bool winbind_lookup_usersids ( TALLOC_CTX * mem_ctx ,
const struct dom_sid * user_sid ,
uint32_t * p_num_sids ,
struct dom_sid * * p_sids )
{
return false ;
}
2007-12-21 11:59:56 -06:00
# endif /* WITH_WINBIND */