2010-05-31 17:12:32 +02:00
/*
* Unix SMB / CIFS implementation .
*
* ID mapping : abstract r / w new - mapping mechanism
*
* Copyright ( C ) Michael Adam 2010
*
* 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 .
*
* 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 .
*
* 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"
# include "winbindd.h"
# include "idmap.h"
# include "idmap_rw.h"
2018-12-14 21:09:51 +01:00
# include "libcli/security/dom_sid.h"
2010-05-31 17:12:32 +02:00
# undef DBGC_CLASS
# define DBGC_CLASS DBGC_IDMAP
NTSTATUS idmap_rw_new_mapping ( struct idmap_domain * dom ,
struct idmap_rw_ops * ops ,
struct id_map * map )
{
2018-12-14 21:09:51 +01:00
struct dom_sid_buf buf ;
2010-05-31 17:12:32 +02:00
NTSTATUS status ;
if ( map = = NULL ) {
return NT_STATUS_INVALID_PARAMETER ;
}
2020-09-15 17:26:11 +02:00
if ( map - > sid = = NULL ) {
2010-05-31 17:12:32 +02:00
return NT_STATUS_INVALID_PARAMETER ;
}
2020-09-15 17:26:11 +02:00
switch ( map - > xid . type ) {
case ID_TYPE_NOT_SPECIFIED :
/*
* We need to know if we need a user or group mapping .
* Ask the winbindd parent to provide a valid type hint .
*/
DBG_INFO ( " %s ID_TYPE_NOT_SPECIFIED => ID_REQUIRE_TYPE \n " ,
dom_sid_str_buf ( map - > sid , & buf ) ) ;
map - > status = ID_REQUIRE_TYPE ;
return NT_STATUS_SOME_NOT_MAPPED ;
case ID_TYPE_BOTH :
/*
* For now we still require
* an explicit type as hint
* and don ' t support ID_TYPE_BOTH
*/
DBG_INFO ( " %s ID_TYPE_BOTH => ID_REQUIRE_TYPE \n " ,
dom_sid_str_buf ( map - > sid , & buf ) ) ;
map - > status = ID_REQUIRE_TYPE ;
return NT_STATUS_SOME_NOT_MAPPED ;
case ID_TYPE_UID :
break ;
case ID_TYPE_GID :
break ;
default :
2010-05-31 17:12:32 +02:00
return NT_STATUS_INVALID_PARAMETER ;
}
status = ops - > get_new_id ( dom , & map - > xid ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
DEBUG ( 3 , ( " Could not allocate id: %s \n " , nt_errstr ( status ) ) ) ;
return status ;
}
DEBUG ( 10 , ( " Setting mapping: %s <-> %s %lu \n " ,
2018-12-14 21:09:51 +01:00
dom_sid_str_buf ( map - > sid , & buf ) ,
2010-05-31 17:12:32 +02:00
( map - > xid . type = = ID_TYPE_UID ) ? " UID " : " GID " ,
( unsigned long ) map - > xid . id ) ) ;
map - > status = ID_MAPPED ;
status = ops - > set_mapping ( dom , map ) ;
if ( NT_STATUS_EQUAL ( status , NT_STATUS_OBJECT_NAME_COLLISION ) ) {
struct id_map * ids [ 2 ] ;
DEBUG ( 5 , ( " Mapping for %s exists - retrying to map sid \n " ,
2018-12-14 21:09:51 +01:00
dom_sid_str_buf ( map - > sid , & buf ) ) ) ;
2010-05-31 17:12:32 +02:00
ids [ 0 ] = map ;
ids [ 1 ] = NULL ;
status = dom - > methods - > sids_to_unixids ( dom , ids ) ;
}
if ( ! NT_STATUS_IS_OK ( status ) ) {
DEBUG ( 3 , ( " Could not store the new mapping: %s \n " ,
nt_errstr ( status ) ) ) ;
return status ;
}
return NT_STATUS_OK ;
}