2007-12-21 20:57:34 +03:00
/*
Unix SMB / CIFS implementation .
Winbind client API
Copyright ( C ) Gerald ( Jerry ) Carter 2007
This library is free software ; you can redistribute it and / or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation ; either
version 3 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 Lesser General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
/* Required Headers */
2009-06-05 00:32:21 +04:00
# include "replace.h"
2007-12-21 20:57:34 +03:00
# include "libwbclient.h"
2008-12-09 15:18:06 +03:00
/* Convert a Windows SID to a Unix uid, allocating an uid if needed */
2007-12-21 20:57:34 +03:00
wbcErr wbcSidToUid ( const struct wbcDomainSid * sid , uid_t * puid )
{
struct winbindd_request request ;
struct winbindd_response response ;
char * sid_string = NULL ;
wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE ;
if ( ! sid | | ! puid ) {
wbc_status = WBC_ERR_INVALID_PARAM ;
BAIL_ON_WBC_ERROR ( wbc_status ) ;
}
/* Initialize request */
ZERO_STRUCT ( request ) ;
ZERO_STRUCT ( response ) ;
wbc_status = wbcSidToString ( sid , & sid_string ) ;
BAIL_ON_WBC_ERROR ( wbc_status ) ;
strncpy ( request . data . sid , sid_string , sizeof ( request . data . sid ) - 1 ) ;
wbcFreeMemory ( sid_string ) ;
/* Make request */
wbc_status = wbcRequestResponse ( WINBINDD_SID_TO_UID ,
& request ,
& response ) ;
BAIL_ON_WBC_ERROR ( wbc_status ) ;
* puid = response . data . uid ;
wbc_status = WBC_ERR_SUCCESS ;
done :
return wbc_status ;
}
2008-12-09 15:18:06 +03:00
/* Convert a Windows SID to a Unix uid if there already is a mapping */
2008-11-23 02:57:33 +03:00
wbcErr wbcQuerySidToUid ( const struct wbcDomainSid * sid ,
uid_t * puid )
{
return WBC_ERR_NOT_IMPLEMENTED ;
}
2008-12-09 15:18:06 +03:00
/* Convert a Unix uid to a Windows SID, allocating a SID if needed */
2007-12-21 20:57:34 +03:00
wbcErr wbcUidToSid ( uid_t uid , struct wbcDomainSid * sid )
{
wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE ;
struct winbindd_request request ;
struct winbindd_response response ;
if ( ! sid ) {
wbc_status = WBC_ERR_INVALID_PARAM ;
BAIL_ON_WBC_ERROR ( wbc_status ) ;
}
/* Initialize request */
ZERO_STRUCT ( request ) ;
ZERO_STRUCT ( response ) ;
request . data . uid = uid ;
/* Make request */
wbc_status = wbcRequestResponse ( WINBINDD_UID_TO_SID ,
& request ,
& response ) ;
BAIL_ON_WBC_ERROR ( wbc_status ) ;
wbc_status = wbcStringToSid ( response . data . sid . sid , sid ) ;
BAIL_ON_WBC_ERROR ( wbc_status ) ;
done :
return wbc_status ;
}
2008-12-09 15:18:06 +03:00
/* Convert a Unix uid to a Windows SID if there already is a mapping */
2008-11-23 02:57:33 +03:00
wbcErr wbcQueryUidToSid ( uid_t uid ,
struct wbcDomainSid * sid )
{
return WBC_ERR_NOT_IMPLEMENTED ;
}
/** @brief Convert a Windows SID to a Unix gid, allocating a gid if needed
2007-12-21 20:57:34 +03:00
*
* @ param * sid Pointer to the domain SID to be resolved
* @ param * pgid Pointer to the resolved gid_t value
*
* @ return # wbcErr
*
* */
wbcErr wbcSidToGid ( const struct wbcDomainSid * sid , gid_t * pgid )
{
struct winbindd_request request ;
struct winbindd_response response ;
wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE ;
char * sid_string = NULL ;
if ( ! sid | | ! pgid ) {
wbc_status = WBC_ERR_INVALID_PARAM ;
BAIL_ON_WBC_ERROR ( wbc_status ) ;
}
/* Initialize request */
ZERO_STRUCT ( request ) ;
ZERO_STRUCT ( response ) ;
wbc_status = wbcSidToString ( sid , & sid_string ) ;
BAIL_ON_WBC_ERROR ( wbc_status ) ;
strncpy ( request . data . sid , sid_string , sizeof ( request . data . sid ) - 1 ) ;
wbcFreeMemory ( sid_string ) ;
/* Make request */
wbc_status = wbcRequestResponse ( WINBINDD_SID_TO_GID ,
& request ,
& response ) ;
BAIL_ON_WBC_ERROR ( wbc_status ) ;
* pgid = response . data . gid ;
wbc_status = WBC_ERR_SUCCESS ;
done :
return wbc_status ;
}
2009-04-02 11:22:43 +04:00
2008-12-09 15:18:06 +03:00
/* Convert a Windows SID to a Unix gid if there already is a mapping */
2008-11-23 02:57:33 +03:00
wbcErr wbcQuerySidToGid ( const struct wbcDomainSid * sid ,
gid_t * pgid )
{
return WBC_ERR_NOT_IMPLEMENTED ;
}
2009-04-02 11:45:39 +04:00
2008-12-09 15:18:06 +03:00
/* Convert a Unix gid to a Windows SID, allocating a SID if needed */
2007-12-21 20:57:34 +03:00
wbcErr wbcGidToSid ( gid_t gid , struct wbcDomainSid * sid )
{
struct winbindd_request request ;
struct winbindd_response response ;
wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE ;
if ( ! sid ) {
wbc_status = WBC_ERR_INVALID_PARAM ;
BAIL_ON_WBC_ERROR ( wbc_status ) ;
}
/* Initialize request */
ZERO_STRUCT ( request ) ;
ZERO_STRUCT ( response ) ;
request . data . gid = gid ;
/* Make request */
wbc_status = wbcRequestResponse ( WINBINDD_GID_TO_SID ,
& request ,
& response ) ;
BAIL_ON_WBC_ERROR ( wbc_status ) ;
wbc_status = wbcStringToSid ( response . data . sid . sid , sid ) ;
BAIL_ON_WBC_ERROR ( wbc_status ) ;
done :
return wbc_status ;
}
2008-12-09 15:18:06 +03:00
/* Convert a Unix gid to a Windows SID if there already is a mapping */
2008-11-23 02:57:33 +03:00
wbcErr wbcQueryGidToSid ( gid_t gid ,
struct wbcDomainSid * sid )
{
return WBC_ERR_NOT_IMPLEMENTED ;
}
2008-12-09 15:18:06 +03:00
/* Obtain a new uid from Winbind */
2007-12-21 20:57:34 +03:00
wbcErr wbcAllocateUid ( uid_t * puid )
{
struct winbindd_request request ;
struct winbindd_response response ;
2007-12-23 02:35:06 +03:00
wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE ;
2007-12-21 20:57:34 +03:00
if ( ! puid )
return WBC_ERR_INVALID_PARAM ;
/* Initialise request */
ZERO_STRUCT ( request ) ;
ZERO_STRUCT ( response ) ;
/* Make request */
2010-04-13 14:09:21 +04:00
wbc_status = wbcRequestResponsePriv ( WINBINDD_ALLOCATE_UID ,
& request , & response ) ;
2007-12-23 02:35:06 +03:00
BAIL_ON_WBC_ERROR ( wbc_status ) ;
2007-12-21 20:57:34 +03:00
/* Copy out result */
* puid = response . data . uid ;
2007-12-23 02:35:06 +03:00
wbc_status = WBC_ERR_SUCCESS ;
done :
return wbc_status ;
2007-12-21 20:57:34 +03:00
}
2008-12-09 15:18:06 +03:00
/* Obtain a new gid from Winbind */
2008-04-06 13:27:36 +04:00
wbcErr wbcAllocateGid ( gid_t * pgid )
2007-12-21 20:57:34 +03:00
{
struct winbindd_request request ;
struct winbindd_response response ;
2007-12-23 02:35:06 +03:00
wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE ;
2007-12-21 20:57:34 +03:00
if ( ! pgid )
return WBC_ERR_INVALID_PARAM ;
/* Initialise request */
ZERO_STRUCT ( request ) ;
ZERO_STRUCT ( response ) ;
/* Make request */
2010-04-13 14:09:21 +04:00
wbc_status = wbcRequestResponsePriv ( WINBINDD_ALLOCATE_GID ,
& request , & response ) ;
2007-12-23 02:35:06 +03:00
BAIL_ON_WBC_ERROR ( wbc_status ) ;
2007-12-21 20:57:34 +03:00
/* Copy out result */
* pgid = response . data . gid ;
2007-12-23 02:35:06 +03:00
wbc_status = WBC_ERR_SUCCESS ;
done :
return wbc_status ;
2007-12-21 20:57:34 +03:00
}
2008-04-11 11:28:20 +04:00
/* we can't include smb.h here... */
# define _ID_TYPE_UID 1
# define _ID_TYPE_GID 2
2008-12-09 15:18:06 +03:00
/* Set an user id mapping */
2008-04-11 11:28:20 +04:00
wbcErr wbcSetUidMapping ( uid_t uid , const struct wbcDomainSid * sid )
{
struct winbindd_request request ;
struct winbindd_response response ;
wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE ;
char * sid_string = NULL ;
if ( ! sid ) {
return WBC_ERR_INVALID_PARAM ;
}
/* Initialise request */
ZERO_STRUCT ( request ) ;
ZERO_STRUCT ( response ) ;
/* Make request */
request . data . dual_idmapset . id = uid ;
request . data . dual_idmapset . type = _ID_TYPE_UID ;
wbc_status = wbcSidToString ( sid , & sid_string ) ;
BAIL_ON_WBC_ERROR ( wbc_status ) ;
strncpy ( request . data . dual_idmapset . sid , sid_string ,
sizeof ( request . data . dual_idmapset . sid ) - 1 ) ;
wbcFreeMemory ( sid_string ) ;
2010-04-13 14:09:21 +04:00
wbc_status = wbcRequestResponsePriv ( WINBINDD_SET_MAPPING ,
& request , & response ) ;
2008-04-11 11:28:20 +04:00
BAIL_ON_WBC_ERROR ( wbc_status ) ;
done :
return wbc_status ;
}
2008-12-09 15:18:06 +03:00
/* Set a group id mapping */
2008-04-11 11:28:20 +04:00
wbcErr wbcSetGidMapping ( gid_t gid , const struct wbcDomainSid * sid )
{
struct winbindd_request request ;
struct winbindd_response response ;
wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE ;
char * sid_string = NULL ;
if ( ! sid ) {
return WBC_ERR_INVALID_PARAM ;
}
/* Initialise request */
ZERO_STRUCT ( request ) ;
ZERO_STRUCT ( response ) ;
/* Make request */
request . data . dual_idmapset . id = gid ;
request . data . dual_idmapset . type = _ID_TYPE_GID ;
wbc_status = wbcSidToString ( sid , & sid_string ) ;
BAIL_ON_WBC_ERROR ( wbc_status ) ;
strncpy ( request . data . dual_idmapset . sid , sid_string ,
sizeof ( request . data . dual_idmapset . sid ) - 1 ) ;
wbcFreeMemory ( sid_string ) ;
2010-04-13 14:09:21 +04:00
wbc_status = wbcRequestResponsePriv ( WINBINDD_SET_MAPPING ,
& request , & response ) ;
2008-04-11 11:28:20 +04:00
BAIL_ON_WBC_ERROR ( wbc_status ) ;
done :
return wbc_status ;
}
2008-12-09 15:18:06 +03:00
/* Remove a user id mapping */
2008-10-28 09:37:55 +03:00
wbcErr wbcRemoveUidMapping ( uid_t uid , const struct wbcDomainSid * sid )
{
struct winbindd_request request ;
struct winbindd_response response ;
wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE ;
char * sid_string = NULL ;
if ( ! sid ) {
return WBC_ERR_INVALID_PARAM ;
}
/* Initialise request */
ZERO_STRUCT ( request ) ;
ZERO_STRUCT ( response ) ;
/* Make request */
request . data . dual_idmapset . id = uid ;
request . data . dual_idmapset . type = _ID_TYPE_UID ;
wbc_status = wbcSidToString ( sid , & sid_string ) ;
BAIL_ON_WBC_ERROR ( wbc_status ) ;
strncpy ( request . data . dual_idmapset . sid , sid_string ,
sizeof ( request . data . dual_idmapset . sid ) - 1 ) ;
wbcFreeMemory ( sid_string ) ;
2010-04-13 14:09:21 +04:00
wbc_status = wbcRequestResponsePriv ( WINBINDD_REMOVE_MAPPING ,
& request , & response ) ;
2008-10-28 09:37:55 +03:00
BAIL_ON_WBC_ERROR ( wbc_status ) ;
done :
return wbc_status ;
}
2008-12-09 15:18:06 +03:00
/* Remove a group id mapping */
2008-10-28 09:37:55 +03:00
wbcErr wbcRemoveGidMapping ( gid_t gid , const struct wbcDomainSid * sid )
{
struct winbindd_request request ;
struct winbindd_response response ;
wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE ;
char * sid_string = NULL ;
if ( ! sid ) {
return WBC_ERR_INVALID_PARAM ;
}
/* Initialise request */
ZERO_STRUCT ( request ) ;
ZERO_STRUCT ( response ) ;
/* Make request */
request . data . dual_idmapset . id = gid ;
request . data . dual_idmapset . type = _ID_TYPE_GID ;
wbc_status = wbcSidToString ( sid , & sid_string ) ;
BAIL_ON_WBC_ERROR ( wbc_status ) ;
strncpy ( request . data . dual_idmapset . sid , sid_string ,
sizeof ( request . data . dual_idmapset . sid ) - 1 ) ;
wbcFreeMemory ( sid_string ) ;
2010-04-13 14:09:21 +04:00
wbc_status = wbcRequestResponsePriv ( WINBINDD_REMOVE_MAPPING ,
& request , & response ) ;
2008-10-28 09:37:55 +03:00
BAIL_ON_WBC_ERROR ( wbc_status ) ;
done :
return wbc_status ;
}
2008-12-09 15:18:06 +03:00
/* Set the highwater mark for allocated uids. */
2008-04-11 11:28:20 +04:00
wbcErr wbcSetUidHwm ( uid_t uid_hwm )
{
struct winbindd_request request ;
struct winbindd_response response ;
wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE ;
/* Initialise request */
ZERO_STRUCT ( request ) ;
ZERO_STRUCT ( response ) ;
/* Make request */
request . data . dual_idmapset . id = uid_hwm ;
request . data . dual_idmapset . type = _ID_TYPE_UID ;
2010-04-13 14:09:21 +04:00
wbc_status = wbcRequestResponsePriv ( WINBINDD_SET_HWM ,
& request , & response ) ;
2008-04-11 11:28:20 +04:00
BAIL_ON_WBC_ERROR ( wbc_status ) ;
done :
return wbc_status ;
}
2008-12-09 15:18:06 +03:00
/* Set the highwater mark for allocated gids. */
2008-04-11 11:28:20 +04:00
wbcErr wbcSetGidHwm ( gid_t gid_hwm )
{
struct winbindd_request request ;
struct winbindd_response response ;
wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE ;
/* Initialise request */
ZERO_STRUCT ( request ) ;
ZERO_STRUCT ( response ) ;
/* Make request */
request . data . dual_idmapset . id = gid_hwm ;
request . data . dual_idmapset . type = _ID_TYPE_GID ;
2010-04-13 14:09:21 +04:00
wbc_status = wbcRequestResponsePriv ( WINBINDD_SET_HWM ,
& request , & response ) ;
2008-04-11 11:28:20 +04:00
BAIL_ON_WBC_ERROR ( wbc_status ) ;
done :
return wbc_status ;
}