2011-12-16 09:55:36 +04:00
/*
Unix SMB / Netbios implementation .
Version 3.0
handle NLTMSSP , server side
Copyright ( C ) Andrew Tridgell 2001
Copyright ( C ) Andrew Bartlett 2001 - 2003 , 2011
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 "auth.h"
# include "../lib/tsocket/tsocket.h"
# include "auth/gensec/gensec.h"
# include "lib/param/param.h"
2011-12-26 05:13:21 +04:00
NTSTATUS auth_generic_prepare ( TALLOC_CTX * mem_ctx ,
const struct tsocket_address * remote_address ,
2011-12-26 07:23:15 +04:00
struct gensec_security * * gensec_security_out )
2011-12-16 09:55:36 +04:00
{
2011-12-26 07:23:15 +04:00
struct gensec_security * gensec_security ;
2011-12-16 09:55:36 +04:00
struct auth_context * auth_context ;
NTSTATUS nt_status ;
2011-12-26 07:23:15 +04:00
TALLOC_CTX * tmp_ctx = talloc_new ( mem_ctx ) ;
NT_STATUS_HAVE_NO_MEMORY ( tmp_ctx ) ;
2011-12-16 09:55:36 +04:00
2011-12-26 07:23:15 +04:00
nt_status = make_auth_context_subsystem ( tmp_ctx , & auth_context ) ;
2011-12-16 09:55:36 +04:00
if ( ! NT_STATUS_IS_OK ( nt_status ) ) {
2011-12-26 07:23:15 +04:00
TALLOC_FREE ( tmp_ctx ) ;
2011-12-16 09:55:36 +04:00
return nt_status ;
}
if ( auth_context - > prepare_gensec ) {
2011-12-26 07:23:15 +04:00
nt_status = auth_context - > prepare_gensec ( tmp_ctx ,
& gensec_security ) ;
2011-12-16 09:55:36 +04:00
if ( ! NT_STATUS_IS_OK ( nt_status ) ) {
2011-12-26 07:23:15 +04:00
TALLOC_FREE ( tmp_ctx ) ;
2011-12-16 09:55:36 +04:00
return nt_status ;
}
} else {
struct gensec_settings * gensec_settings ;
struct loadparm_context * lp_ctx ;
2011-12-26 07:23:15 +04:00
lp_ctx = loadparm_init_s3 ( tmp_ctx , loadparm_s3_context ( ) ) ;
2011-12-16 09:55:36 +04:00
if ( lp_ctx = = NULL ) {
DEBUG ( 10 , ( " loadparm_init_s3 failed \n " ) ) ;
2011-12-26 07:23:15 +04:00
TALLOC_FREE ( tmp_ctx ) ;
2011-12-16 09:55:36 +04:00
return NT_STATUS_INVALID_SERVER_STATE ;
}
2011-12-26 07:23:15 +04:00
gensec_settings = lpcfg_gensec_settings ( tmp_ctx , lp_ctx ) ;
2011-12-16 09:55:36 +04:00
if ( lp_ctx = = NULL ) {
DEBUG ( 10 , ( " lpcfg_gensec_settings failed \n " ) ) ;
2011-12-26 07:23:15 +04:00
TALLOC_FREE ( tmp_ctx ) ;
2011-12-16 09:55:36 +04:00
return NT_STATUS_NO_MEMORY ;
}
2011-12-26 04:39:29 +04:00
gensec_settings - > backends = talloc_zero_array ( gensec_settings , struct gensec_security_ops * , 2 ) ;
if ( gensec_settings - > backends = = NULL ) {
2011-12-26 07:23:15 +04:00
TALLOC_FREE ( tmp_ctx ) ;
2011-12-26 04:39:29 +04:00
return NT_STATUS_NO_MEMORY ;
}
gensec_settings - > backends [ 0 ] = & gensec_ntlmssp3_server_ops ;
2011-12-26 07:23:15 +04:00
nt_status = gensec_server_start ( tmp_ctx , gensec_settings ,
NULL , & gensec_security ) ;
2011-12-16 09:55:36 +04:00
if ( ! NT_STATUS_IS_OK ( nt_status ) ) {
2011-12-26 07:23:15 +04:00
TALLOC_FREE ( tmp_ctx ) ;
2011-12-16 09:55:36 +04:00
return nt_status ;
}
2011-12-26 07:23:15 +04:00
talloc_unlink ( tmp_ctx , lp_ctx ) ;
talloc_unlink ( tmp_ctx , gensec_settings ) ;
2011-12-16 09:55:36 +04:00
}
2011-12-26 07:23:15 +04:00
nt_status = gensec_set_remote_address ( gensec_security ,
2011-12-16 09:55:36 +04:00
remote_address ) ;
if ( ! NT_STATUS_IS_OK ( nt_status ) ) {
2011-12-26 07:23:15 +04:00
TALLOC_FREE ( tmp_ctx ) ;
2011-12-16 09:55:36 +04:00
return nt_status ;
}
2011-12-26 07:23:15 +04:00
* gensec_security_out = talloc_steal ( mem_ctx , gensec_security ) ;
TALLOC_FREE ( tmp_ctx ) ;
2011-12-16 09:55:36 +04:00
return NT_STATUS_OK ;
}