2017-01-26 14:51:24 +03:00
/*
2007-12-21 20:59:56 +03:00
Unix SMB / CIFS implementation .
Winbind Utility functions
Copyright ( C ) Gerald ( Jerry ) Carter 2007
2009-08-07 14:09:21 +04:00
2007-12-21 20:59:56 +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 3 of the License , or
( at your option ) any later version .
2009-08-07 14:09:21 +04:00
2007-12-21 20:59:56 +03: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 14:09:21 +04:00
2007-12-21 20:59:56 +03: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 08:27:50 +04:00
# include "../libcli/security/security.h"
2011-03-02 18:11:00 +03:00
# include "../lib/util/util_pw.h"
2011-03-30 16:03:13 +04:00
# include "nsswitch/libwbclient/wbclient.h"
2007-12-21 20:59:56 +03:00
2011-02-25 00:30:16 +03:00
# include "lib/winbind_util.h"
2007-12-21 20:59:56 +03:00
2019-03-05 21:50:48 +03:00
# if defined(WITH_WINBIND)
2009-02-10 22:06:44 +03: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 05:25:01 +04:00
struct passwd * winbind_getpwsid ( const struct dom_sid * sid )
2009-02-10 22:06:44 +03: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 20:59:56 +03:00
/* Call winbindd to convert a name to a sid */
2010-05-21 05:25:01 +04:00
bool winbind_lookup_name ( const char * dom_name , const char * name , struct dom_sid * sid ,
2007-12-21 20:59:56 +03:00
enum lsa_SidType * name_type )
{
struct wbcDomainSid dom_sid ;
wbcErr result ;
2017-01-26 14:51:24 +03:00
enum wbcSidType type ;
2007-12-21 20:59:56 +03:00
result = wbcLookupName ( dom_name , name , & dom_sid , & type ) ;
if ( result ! = WBC_ERR_SUCCESS )
2008-01-02 23:54:25 +03:00
return false ;
2007-12-21 20:59:56 +03:00
2010-05-21 05:25:01 +04:00
memcpy ( sid , & dom_sid , sizeof ( struct dom_sid ) ) ;
2017-01-26 14:51:24 +03:00
* name_type = ( enum lsa_SidType ) type ;
2007-12-21 20:59:56 +03:00
2017-01-26 14:51:24 +03:00
return true ;
2007-12-21 20:59:56 +03:00
}
2024-02-08 20:20:15 +03:00
/* Same as winbind_lookup_name(), but returning NTSTATUS instead of bool */
_PRIVATE_
NTSTATUS winbind_lookup_name_ex ( const char * dom_name ,
const char * name ,
struct dom_sid * sid ,
enum lsa_SidType * name_type )
{
struct wbcDomainSid dom_sid ;
wbcErr result ;
enum wbcSidType type ;
NTSTATUS status ;
result = wbcLookupName ( dom_name , name , & dom_sid , & type ) ;
status = map_nt_error_from_wbcErr ( result ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
if ( ( lp_security ( ) < SEC_DOMAIN ) & &
NT_STATUS_EQUAL ( status , NT_STATUS_SERVER_DISABLED ) )
{
/*
* If we ' re not a domain member and winbind is not
* running , treat this as not mapped .
*/
status = NT_STATUS_NONE_MAPPED ;
}
if ( ! NT_STATUS_EQUAL ( status , NT_STATUS_NONE_MAPPED ) ) {
return status ;
}
* name_type = SID_NAME_UNKNOWN ;
ZERO_STRUCTP ( sid ) ;
return NT_STATUS_OK ;
}
memcpy ( sid , & dom_sid , sizeof ( struct dom_sid ) ) ;
* name_type = ( enum lsa_SidType ) type ;
return NT_STATUS_OK ;
}
2007-12-21 20:59:56 +03:00
/* Call winbindd to convert sid to name */
2010-05-21 05:25:01 +04:00
bool winbind_lookup_sid ( TALLOC_CTX * mem_ctx , const struct dom_sid * sid ,
2007-12-21 20:59:56 +03: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 23:22:27 +03:00
struct dom_sid_buf buf ;
2007-12-21 20:59:56 +03:00
2017-01-26 14:51:24 +03:00
memcpy ( & dom_sid , sid , sizeof ( dom_sid ) ) ;
2007-12-21 20:59:56 +03:00
result = wbcLookupSid ( & dom_sid , & domain_name , & account_name , & type ) ;
if ( result ! = WBC_ERR_SUCCESS )
2008-01-02 23:54:25 +03:00
return false ;
2007-12-21 20:59:56 +03:00
/* Copy out result */
2017-01-26 14:51:24 +03:00
if ( domain ) {
2007-12-21 20:59:56 +03: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 14:51:24 +03:00
DEBUG ( 10 , ( " winbind_lookup_sid: SUCCESS: SID %s -> %s %s \n " ,
2018-12-13 23:22:27 +03:00
dom_sid_str_buf ( sid , & buf ) , domain_name , account_name ) ) ;
2007-12-21 20:59:56 +03:00
2008-01-02 23:50:59 +03:00
wbcFreeMemory ( domain_name ) ;
wbcFreeMemory ( account_name ) ;
2009-08-07 14:09:21 +04:00
2017-01-26 14:51:24 +03:00
if ( ( domain & & ! * domain ) | | ( name & & ! * name ) ) {
2007-12-21 20:59:56 +03:00
DEBUG ( 0 , ( " winbind_lookup_sid: talloc() failed! \n " ) ) ;
2008-01-02 23:54:25 +03:00
return false ;
2017-01-26 14:51:24 +03:00
}
2007-12-21 20:59:56 +03:00
2008-01-02 23:54:25 +03:00
return true ;
2007-12-21 20:59:56 +03: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 05:25:01 +04:00
bool winbind_sid_to_uid ( uid_t * puid , const struct dom_sid * sid )
2007-12-21 20:59:56 +03:00
{
struct wbcDomainSid dom_sid ;
wbcErr result ;
2017-01-26 14:51:24 +03:00
memcpy ( & dom_sid , sid , sizeof ( dom_sid ) ) ;
2007-12-21 20:59:56 +03:00
2017-01-26 14:51:24 +03:00
result = wbcSidToUid ( & dom_sid , puid ) ;
2007-12-21 20:59:56 +03:00
2017-01-26 14:51:24 +03:00
return ( result = = WBC_ERR_SUCCESS ) ;
2007-12-21 20:59:56 +03:00
}
/* Call winbindd to convert SID to gid */
2010-05-21 05:25:01 +04:00
bool winbind_sid_to_gid ( gid_t * pgid , const struct dom_sid * sid )
2007-12-21 20:59:56 +03:00
{
struct wbcDomainSid dom_sid ;
wbcErr result ;
2017-01-26 14:51:24 +03:00
memcpy ( & dom_sid , sid , sizeof ( dom_sid ) ) ;
2007-12-21 20:59:56 +03:00
2017-01-26 14:51:24 +03:00
result = wbcSidToGid ( & dom_sid , pgid ) ;
2007-12-21 20:59:56 +03:00
2017-01-26 14:51:24 +03:00
return ( result = = WBC_ERR_SUCCESS ) ;
2007-12-21 20:59:56 +03:00
}
2019-02-26 16:45:32 +03: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 20:59:56 +03:00
/* Check for a trusted domain */
wbcErr wb_is_trusted_domain ( const char * domain )
{
wbcErr result ;
2007-12-21 22:47:45 +03:00
struct wbcDomainInfo * info = NULL ;
2009-08-07 14:09:21 +04:00
2007-12-21 20:59:56 +03:00
result = wbcDomainInfo ( domain , & info ) ;
2007-12-21 22:47:45 +03:00
if ( WBC_ERROR_IS_OK ( result ) ) {
wbcFreeMemory ( info ) ;
2007-12-21 20:59:56 +03:00
}
2017-01-26 14:51:24 +03:00
return result ;
2007-12-21 20:59:56 +03:00
}
/* Lookup a set of rids in a given domain */
bool winbind_lookup_rids ( TALLOC_CTX * mem_ctx ,
2010-05-21 05:25:01 +04:00
const struct dom_sid * domain_sid ,
2015-05-10 02:33:10 +03:00
int num_rids , uint32_t * rids ,
2007-12-21 20:59:56 +03: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 14:51:24 +03:00
int i ;
2009-08-07 14:09:21 +04:00
2007-12-21 20:59:56 +03:00
memcpy ( & dom_sid , domain_sid , sizeof ( struct wbcDomainSid ) ) ;
2009-08-07 14:09:21 +04:00
2007-12-21 20:59:56 +03:00
ret = wbcLookupRids ( & dom_sid , num_rids , rids ,
& dom_name , & namelist , & name_types ) ;
2017-01-26 14:51:24 +03:00
if ( ret ! = WBC_ERR_SUCCESS ) {
2008-01-02 23:54:25 +03:00
return false ;
2017-01-26 14:51:24 +03:00
}
2009-08-07 14:09:21 +04:00
2007-12-21 20:59:56 +03:00
* domain_name = talloc_strdup ( mem_ctx , dom_name ) ;
2011-06-07 05:30:12 +04:00
* names = talloc_array ( mem_ctx , const char * , num_rids ) ;
* types = talloc_array ( mem_ctx , enum lsa_SidType , num_rids ) ;
2007-12-21 20:59:56 +03: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 20:59:56 +03:00
( * types ) [ i ] = ( enum lsa_SidType ) name_types [ i ] ;
}
2008-01-02 23:50:59 +03:00
2011-05-05 21:41:59 +04:00
wbcFreeMemory ( discard_const_p ( char , dom_name ) ) ;
2008-01-02 23:50:59 +03:00
wbcFreeMemory ( namelist ) ;
wbcFreeMemory ( name_types ) ;
2009-08-07 14:09:21 +04:00
2017-01-26 14:51:24 +03:00
return true ;
2007-12-21 20:59:56 +03:00
}
/* Ask Winbind to allocate a new uid for us */
bool winbind_allocate_uid ( uid_t * uid )
{
wbcErr ret ;
2009-08-07 14:09:21 +04:00
2007-12-21 20:59:56 +03:00
ret = wbcAllocateUid ( uid ) ;
2009-08-07 14:09:21 +04:00
2007-12-21 20:59:56 +03: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 14:09:21 +04:00
2007-12-21 20:59:56 +03:00
ret = wbcAllocateGid ( gid ) ;
2009-08-07 14:09:21 +04:00
2007-12-21 20:59:56 +03:00
return ( ret = = WBC_ERR_SUCCESS ) ;
}
2013-12-16 15:57:20 +04: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 20:59:56 +03:00
# else /* WITH_WINBIND */
2009-02-10 22:06:44 +03:00
struct passwd * winbind_getpwnam ( const char * name )
{
return NULL ;
}
2010-05-21 05:25:01 +04:00
struct passwd * winbind_getpwsid ( const struct dom_sid * sid )
2009-02-10 22:06:44 +03:00
{
return NULL ;
}
2010-05-21 05:25:01 +04:00
bool winbind_lookup_name ( const char * dom_name , const char * name , struct dom_sid * sid ,
2007-12-21 20:59:56 +03:00
enum lsa_SidType * name_type )
{
2008-01-02 23:54:25 +03:00
return false ;
2007-12-21 20:59:56 +03:00
}
2024-08-06 18:20:38 +03:00
_PRIVATE_
NTSTATUS winbind_lookup_name_ex ( const char * dom_name ,
const char * name ,
struct dom_sid * sid ,
enum lsa_SidType * name_type )
{
* name_type = SID_NAME_UNKNOWN ;
ZERO_STRUCTP ( sid ) ;
return NT_STATUS_OK ;
}
2007-12-21 20:59:56 +03:00
/* Call winbindd to convert sid to name */
2010-05-21 05:25:01 +04:00
bool winbind_lookup_sid ( TALLOC_CTX * mem_ctx , const struct dom_sid * sid ,
2007-12-21 20:59:56 +03:00
const char * * domain , const char * * name ,
enum lsa_SidType * name_type )
{
2008-01-02 23:54:25 +03:00
return false ;
2007-12-21 20:59:56 +03:00
}
/* Ping winbindd to see it is alive */
bool winbind_ping ( void )
{
2008-01-02 23:54:25 +03:00
return false ;
2007-12-21 20:59:56 +03:00
}
/* Call winbindd to convert SID to uid */
2010-05-21 05:25:01 +04:00
bool winbind_sid_to_uid ( uid_t * puid , const struct dom_sid * sid )
2007-12-21 20:59:56 +03:00
{
2008-01-02 23:54:25 +03:00
return false ;
2007-12-21 20:59:56 +03:00
}
/* Call winbindd to convert SID to gid */
2010-05-21 05:25:01 +04:00
bool winbind_sid_to_gid ( gid_t * pgid , const struct dom_sid * sid )
2007-12-21 20:59:56 +03:00
{
2017-01-26 14:51:24 +03:00
return false ;
2007-12-21 20:59:56 +03:00
}
2019-03-05 21:56:49 +03: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 20:59:56 +03: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 05:25:01 +04:00
const struct dom_sid * domain_sid ,
2015-05-10 02:33:10 +03:00
int num_rids , uint32_t * rids ,
2007-12-21 20:59:56 +03:00
const char * * domain_name ,
const char * * * names , enum lsa_SidType * * types )
{
2008-01-02 23:54:25 +03:00
return false ;
2007-12-21 20:59:56 +03:00
}
/* Ask Winbind to allocate a new uid for us */
bool winbind_allocate_uid ( uid_t * uid )
{
2008-01-02 23:54:25 +03:00
return false ;
2007-12-21 20:59:56 +03:00
}
/* Ask Winbind to allocate a new gid for us */
bool winbind_allocate_gid ( gid_t * gid )
{
2008-01-02 23:54:25 +03:00
return false ;
2007-12-21 20:59:56 +03:00
}
2014-05-09 17:01:23 +04: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 20:59:56 +03:00
# endif /* WITH_WINBIND */