2010-09-01 23:50:06 +04:00
/*
* NTLMSSP Acceptor
* DCERPC Server functions
* Copyright ( C ) Simo Sorce 2010.
2011-12-16 06:19:06 +04:00
* Copyright ( C ) Andrew Bartlett 2011.
2010-09-01 23:50:06 +04: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 .
*
* 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 "rpc_server/dcesrv_ntlmssp.h"
# include "ntlmssp_wrap.h"
2011-03-24 14:08:15 +03:00
# include "auth.h"
2011-10-18 13:58:47 +04:00
# include "auth/gensec/gensec.h"
2010-09-01 23:50:06 +04:00
2011-12-21 07:32:43 +04:00
NTSTATUS auth_generic_server_start ( TALLOC_CTX * mem_ctx ,
const char * oid ,
2010-09-01 23:50:06 +04:00
bool do_sign ,
bool do_seal ,
bool is_dcerpc ,
DATA_BLOB * token_in ,
DATA_BLOB * token_out ,
2011-06-15 13:15:06 +04:00
const struct tsocket_address * remote_address ,
2011-10-19 11:39:27 +04:00
struct gensec_security * * ctx )
2010-09-01 23:50:06 +04:00
{
2011-12-16 09:07:24 +04:00
struct auth_generic_state * a = NULL ;
2010-09-01 23:50:06 +04:00
NTSTATUS status ;
2011-12-16 09:08:56 +04:00
status = auth_generic_prepare ( remote_address , & a ) ;
2010-09-01 23:50:06 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2011-12-16 09:08:56 +04:00
DEBUG ( 0 , ( __location__ " : auth_generic_prepare failed: %s \n " ,
2010-09-01 23:50:06 +04:00
nt_errstr ( status ) ) ) ;
return status ;
}
if ( do_sign ) {
2011-10-18 14:43:40 +04:00
gensec_want_feature ( a - > gensec_security , GENSEC_FEATURE_SIGN ) ;
2010-09-01 23:50:06 +04:00
}
if ( do_seal ) {
2011-12-16 09:44:17 +04:00
gensec_want_feature ( a - > gensec_security , GENSEC_FEATURE_SIGN ) ;
2011-10-18 14:43:40 +04:00
gensec_want_feature ( a - > gensec_security , GENSEC_FEATURE_SEAL ) ;
2010-09-01 23:50:06 +04:00
}
2011-12-16 08:55:08 +04:00
if ( is_dcerpc ) {
gensec_want_feature ( a - > gensec_security , GENSEC_FEATURE_DCE_STYLE ) ;
}
2011-12-21 07:32:43 +04:00
status = auth_generic_start ( a , oid ) ;
2011-07-26 04:19:54 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2011-12-16 09:38:53 +04:00
DEBUG ( 0 , ( __location__ " : auth_generic_start failed: %s \n " ,
2011-07-26 04:19:54 +04:00
nt_errstr ( status ) ) ) ;
return status ;
}
2011-10-18 14:13:16 +04:00
status = gensec_update ( a - > gensec_security , mem_ctx , NULL , * token_in , token_out ) ;
2010-09-01 23:50:06 +04:00
if ( ! NT_STATUS_EQUAL ( status , NT_STATUS_MORE_PROCESSING_REQUIRED ) ) {
DEBUG ( 0 , ( __location__ " : auth_ntlmssp_update failed: %s \n " ,
nt_errstr ( status ) ) ) ;
goto done ;
}
/* steal ntlmssp context too */
2011-10-19 11:39:27 +04:00
* ctx = talloc_move ( mem_ctx , & a - > gensec_security ) ;
2010-09-01 23:50:06 +04:00
status = NT_STATUS_OK ;
done :
2011-10-19 11:39:27 +04:00
TALLOC_FREE ( a ) ;
2010-09-01 23:50:06 +04:00
return status ;
}
2011-12-21 07:40:04 +04:00
NTSTATUS auth_generic_server_step ( struct gensec_security * gensec_security ,
2010-09-01 23:50:06 +04:00
TALLOC_CTX * mem_ctx ,
DATA_BLOB * token_in ,
DATA_BLOB * token_out )
{
NTSTATUS status ;
/* this has to be done as root in order to verify the password */
become_root ( ) ;
2011-10-19 11:39:27 +04:00
status = gensec_update ( gensec_security , mem_ctx , NULL , * token_in , token_out ) ;
2010-09-01 23:50:06 +04:00
unbecome_root ( ) ;
return status ;
}
2011-12-21 07:40:04 +04:00
NTSTATUS auth_generic_server_check_flags ( struct gensec_security * gensec_security ,
2010-09-01 23:50:06 +04:00
bool do_sign , bool do_seal )
{
2011-10-19 11:39:27 +04:00
if ( do_sign & & ! gensec_have_feature ( gensec_security , GENSEC_FEATURE_SIGN ) ) {
2010-09-01 23:50:06 +04:00
DEBUG ( 1 , ( __location__ " Integrity was requested but client "
" failed to negotiate signing. \n " ) ) ;
return NT_STATUS_ACCESS_DENIED ;
}
2011-10-19 11:39:27 +04:00
if ( do_seal & & ! gensec_have_feature ( gensec_security , GENSEC_FEATURE_SEAL ) ) {
2010-09-01 23:50:06 +04:00
DEBUG ( 1 , ( __location__ " Privacy was requested but client "
" failed to negotiate sealing. \n " ) ) ;
return NT_STATUS_ACCESS_DENIED ;
}
return NT_STATUS_OK ;
}
2011-12-21 07:40:04 +04:00
NTSTATUS auth_generic_server_get_user_info ( struct gensec_security * gensec_security ,
2010-09-01 23:50:06 +04:00
TALLOC_CTX * mem_ctx ,
2011-07-18 07:06:47 +04:00
struct auth_session_info * * session_info )
2010-09-01 23:50:06 +04:00
{
NTSTATUS status ;
2011-10-19 11:39:27 +04:00
status = gensec_session_info ( gensec_security , mem_ctx , session_info ) ;
2010-09-01 23:50:06 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
DEBUG ( 1 , ( __location__ " : Failed to get authenticated user "
" info: %s \n " , nt_errstr ( status ) ) ) ;
return status ;
}
2011-07-21 13:29:10 +04:00
DEBUG ( 5 , ( __location__ " OK: user: %s domain: %s \n " ,
( * session_info ) - > info - > account_name ,
( * session_info ) - > info - > domain_name ) ) ;
2010-09-01 23:50:06 +04:00
return NT_STATUS_OK ;
}