1998-03-12 00:11:04 +03:00
/*
2002-01-30 09:08:46 +03:00
* Unix SMB / CIFS implementation .
1998-03-12 00:11:04 +03:00
* RPC Pipe client / server routines
* Copyright ( C ) Andrew Tridgell 1992 - 1997 ,
* Copyright ( C ) Luke Kenneth Casson Leighton 1996 - 1997 ,
2003-02-14 03:48:28 +03:00
* Copyright ( C ) Paul Ashton 1997 ,
* Copyright ( C ) Jeremy Allison 1998 - 2001 ,
2003-08-01 19:30:44 +04:00
* Copyright ( C ) Jim McDonough < jmcd @ us . ibm . com > 2003.
1998-05-14 05:30:40 +04:00
*
1998-03-12 00:11:04 +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 2 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 , write to the Free Software
* Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
2001-03-11 03:32:10 +03:00
/* This is the interface to the netlogon pipe. */
1998-03-12 00:11:04 +03:00
# include "includes.h"
2002-07-15 14:35:28 +04:00
# undef DBGC_CLASS
# define DBGC_CLASS DBGC_RPC_SRV
1998-03-12 00:11:04 +03:00
/*************************************************************************
api_net_req_chal :
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
2000-06-16 12:12:23 +04:00
static BOOL api_net_req_chal ( pipes_struct * p )
1998-03-12 00:11:04 +03:00
{
2001-03-11 03:32:10 +03:00
NET_Q_REQ_CHAL q_u ;
NET_R_REQ_CHAL r_u ;
2000-06-16 12:12:23 +04:00
prs_struct * data = & p - > in_data . data ;
prs_struct * rdata = & p - > out_data . rdata ;
1998-03-12 00:11:04 +03:00
2001-03-11 03:32:10 +03:00
ZERO_STRUCT ( q_u ) ;
ZERO_STRUCT ( r_u ) ;
1998-03-12 00:11:04 +03:00
/* grab the challenge... */
2001-03-11 03:32:10 +03:00
if ( ! net_io_q_req_chal ( " " , & q_u , data , 0 ) ) {
1999-12-13 16:27:58 +03:00
DEBUG ( 0 , ( " api_net_req_chal: Failed to unmarshall NET_Q_REQ_CHAL. \n " ) ) ;
return False ;
}
1998-03-12 00:11:04 +03:00
2001-03-11 03:32:10 +03:00
r_u . status = _net_req_chal ( p , & q_u , & r_u ) ;
1998-03-12 00:11:04 +03:00
2001-03-11 03:32:10 +03:00
/* store the response in the SMB stream */
if ( ! net_io_r_req_chal ( " " , & r_u , rdata , 0 ) ) {
DEBUG ( 0 , ( " api_net_req_chal: Failed to marshall NET_R_REQ_CHAL. \n " ) ) ;
1999-12-13 16:27:58 +03:00
return False ;
2001-03-11 03:32:10 +03:00
}
1999-11-16 17:10:23 +03:00
1999-12-13 16:27:58 +03:00
return True ;
1999-11-16 17:10:23 +03:00
}
2001-04-24 03:31:09 +04:00
/*************************************************************************
api_net_auth :
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL api_net_auth ( pipes_struct * p )
{
NET_Q_AUTH q_u ;
NET_R_AUTH r_u ;
prs_struct * data = & p - > in_data . data ;
prs_struct * rdata = & p - > out_data . rdata ;
ZERO_STRUCT ( q_u ) ;
ZERO_STRUCT ( r_u ) ;
/* grab the challenge... */
if ( ! net_io_q_auth ( " " , & q_u , data , 0 ) ) {
DEBUG ( 0 , ( " api_net_auth: Failed to unmarshall NET_Q_AUTH. \n " ) ) ;
return False ;
}
r_u . status = _net_auth ( p , & q_u , & r_u ) ;
/* store the response in the SMB stream */
if ( ! net_io_r_auth ( " " , & r_u , rdata , 0 ) ) {
DEBUG ( 0 , ( " api_net_auth: Failed to marshall NET_R_AUTH. \n " ) ) ;
return False ;
}
return True ;
}
1998-03-12 00:11:04 +03:00
/*************************************************************************
api_net_auth_2 :
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
2000-06-16 12:12:23 +04:00
static BOOL api_net_auth_2 ( pipes_struct * p )
1998-03-12 00:11:04 +03:00
{
2001-03-11 03:32:10 +03:00
NET_Q_AUTH_2 q_u ;
NET_R_AUTH_2 r_u ;
2000-06-16 12:12:23 +04:00
prs_struct * data = & p - > in_data . data ;
prs_struct * rdata = & p - > out_data . rdata ;
1998-03-12 00:11:04 +03:00
2001-03-11 03:32:10 +03:00
ZERO_STRUCT ( q_u ) ;
ZERO_STRUCT ( r_u ) ;
1998-03-12 00:11:04 +03:00
/* grab the challenge... */
2001-03-11 03:32:10 +03:00
if ( ! net_io_q_auth_2 ( " " , & q_u , data , 0 ) ) {
1999-12-13 16:27:58 +03:00
DEBUG ( 0 , ( " api_net_auth_2: Failed to unmarshall NET_Q_AUTH_2. \n " ) ) ;
return False ;
}
1998-03-12 00:11:04 +03:00
2001-03-11 03:32:10 +03:00
r_u . status = _net_auth_2 ( p , & q_u , & r_u ) ;
1998-03-12 00:11:04 +03:00
2001-03-11 03:32:10 +03:00
/* store the response in the SMB stream */
if ( ! net_io_r_auth_2 ( " " , & r_u , rdata , 0 ) ) {
DEBUG ( 0 , ( " api_net_auth_2: Failed to marshall NET_R_AUTH_2. \n " ) ) ;
1999-12-13 16:27:58 +03:00
return False ;
2001-03-11 03:32:10 +03:00
}
1999-12-13 16:27:58 +03:00
return True ;
1998-03-12 00:11:04 +03:00
}
/*************************************************************************
api_net_srv_pwset :
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
2000-06-16 12:12:23 +04:00
static BOOL api_net_srv_pwset ( pipes_struct * p )
1998-03-12 00:11:04 +03:00
{
2001-03-11 03:32:10 +03:00
NET_Q_SRV_PWSET q_u ;
NET_R_SRV_PWSET r_u ;
2000-06-16 12:12:23 +04:00
prs_struct * data = & p - > in_data . data ;
prs_struct * rdata = & p - > out_data . rdata ;
1999-12-13 16:27:58 +03:00
2001-03-11 03:32:10 +03:00
ZERO_STRUCT ( q_u ) ;
ZERO_STRUCT ( r_u ) ;
1998-03-12 00:11:04 +03:00
/* grab the challenge and encrypted password ... */
2001-03-11 03:32:10 +03:00
if ( ! net_io_q_srv_pwset ( " " , & q_u , data , 0 ) ) {
1999-12-13 16:27:58 +03:00
DEBUG ( 0 , ( " api_net_srv_pwset: Failed to unmarshall NET_Q_SRV_PWSET. \n " ) ) ;
return False ;
}
1998-03-12 00:11:04 +03:00
2001-03-11 03:32:10 +03:00
r_u . status = _net_srv_pwset ( p , & q_u , & r_u ) ;
1998-03-12 00:11:04 +03:00
2001-03-11 03:32:10 +03:00
/* store the response in the SMB stream */
if ( ! net_io_r_srv_pwset ( " " , & r_u , rdata , 0 ) ) {
DEBUG ( 0 , ( " api_net_srv_pwset: Failed to marshall NET_R_SRV_PWSET. \n " ) ) ;
1999-12-13 16:27:58 +03:00
return False ;
2001-03-11 03:32:10 +03:00
}
1999-12-13 16:27:58 +03:00
return True ;
1998-03-12 00:11:04 +03:00
}
/*************************************************************************
api_net_sam_logoff :
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
2000-06-16 12:12:23 +04:00
static BOOL api_net_sam_logoff ( pipes_struct * p )
1998-03-12 00:11:04 +03:00
{
2001-03-11 03:32:10 +03:00
NET_Q_SAM_LOGOFF q_u ;
NET_R_SAM_LOGOFF r_u ;
2000-06-16 12:12:23 +04:00
prs_struct * data = & p - > in_data . data ;
prs_struct * rdata = & p - > out_data . rdata ;
1998-03-12 00:11:04 +03:00
2001-03-11 03:32:10 +03:00
ZERO_STRUCT ( q_u ) ;
ZERO_STRUCT ( r_u ) ;
1998-03-12 00:11:04 +03:00
2001-03-11 03:32:10 +03:00
if ( ! net_io_q_sam_logoff ( " " , & q_u , data , 0 ) ) {
1999-12-13 16:27:58 +03:00
DEBUG ( 0 , ( " api_net_sam_logoff: Failed to unmarshall NET_Q_SAM_LOGOFF. \n " ) ) ;
return False ;
}
1998-03-12 00:11:04 +03:00
2001-03-11 03:32:10 +03:00
r_u . status = _net_sam_logoff ( p , & q_u , & r_u ) ;
1998-03-12 00:11:04 +03:00
2001-03-11 03:32:10 +03:00
/* store the response in the SMB stream */
if ( ! net_io_r_sam_logoff ( " " , & r_u , rdata , 0 ) ) {
DEBUG ( 0 , ( " api_net_sam_logoff: Failed to marshall NET_R_SAM_LOGOFF. \n " ) ) ;
1999-12-13 16:27:58 +03:00
return False ;
1998-03-12 00:11:04 +03:00
}
2001-03-11 03:32:10 +03:00
return True ;
1998-03-12 00:11:04 +03:00
}
/*************************************************************************
api_net_sam_logon :
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-02-12 03:16:09 +03:00
2000-06-16 12:12:23 +04:00
static BOOL api_net_sam_logon ( pipes_struct * p )
1999-12-13 16:27:58 +03:00
{
2001-03-11 03:32:10 +03:00
NET_Q_SAM_LOGON q_u ;
NET_R_SAM_LOGON r_u ;
prs_struct * data = & p - > in_data . data ;
prs_struct * rdata = & p - > out_data . rdata ;
2000-04-04 04:35:34 +04:00
2001-03-11 03:32:10 +03:00
ZERO_STRUCT ( q_u ) ;
ZERO_STRUCT ( r_u ) ;
2006-02-09 03:23:40 +03:00
if ( ! net_io_q_sam_logon ( " " , & q_u , data , 0 ) ) {
DEBUG ( 0 , ( " api_net_sam_logon: Failed to unmarshall NET_Q_SAM_LOGON. \n " ) ) ;
return False ;
}
2001-03-11 03:32:10 +03:00
r_u . status = _net_sam_logon ( p , & q_u , & r_u ) ;
2000-09-06 05:06:39 +04:00
2001-03-11 03:32:10 +03:00
/* store the response in the SMB stream */
if ( ! net_io_r_sam_logon ( " " , & r_u , rdata , 0 ) ) {
DEBUG ( 0 , ( " api_net_sam_logon: Failed to marshall NET_R_SAM_LOGON. \n " ) ) ;
return False ;
}
2000-09-06 05:06:39 +04:00
2006-02-10 21:05:55 +03:00
return True ;
1998-03-12 00:11:04 +03:00
}
/*************************************************************************
api_net_trust_dom_list :
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
2000-06-16 12:12:23 +04:00
static BOOL api_net_trust_dom_list ( pipes_struct * p )
1998-03-12 00:11:04 +03:00
{
2001-03-11 03:32:10 +03:00
NET_Q_TRUST_DOM_LIST q_u ;
NET_R_TRUST_DOM_LIST r_u ;
2000-06-16 12:12:23 +04:00
prs_struct * data = & p - > in_data . data ;
prs_struct * rdata = & p - > out_data . rdata ;
1998-03-12 00:11:04 +03:00
2001-03-11 03:32:10 +03:00
ZERO_STRUCT ( q_u ) ;
ZERO_STRUCT ( r_u ) ;
1998-03-12 00:11:04 +03:00
/* grab the lsa trusted domain list query... */
2001-03-11 03:32:10 +03:00
if ( ! net_io_q_trust_dom ( " " , & q_u , data , 0 ) ) {
1999-12-13 16:27:58 +03:00
DEBUG ( 0 , ( " api_net_trust_dom_list: Failed to unmarshall NET_Q_TRUST_DOM_LIST. \n " ) ) ;
return False ;
}
1998-03-12 00:11:04 +03:00
/* construct reply. */
2001-03-11 03:32:10 +03:00
r_u . status = _net_trust_dom_list ( p , & q_u , & r_u ) ;
/* store the response in the SMB stream */
if ( ! net_io_r_trust_dom ( " " , & r_u , rdata , 0 ) ) {
DEBUG ( 0 , ( " net_reply_trust_dom_list: Failed to marshall NET_R_TRUST_DOM_LIST. \n " ) ) ;
1999-12-13 16:27:58 +03:00
return False ;
2001-03-11 03:32:10 +03:00
}
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
return True ;
1998-03-12 00:11:04 +03:00
}
/*************************************************************************
api_net_logon_ctrl2 :
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
2000-06-16 12:12:23 +04:00
static BOOL api_net_logon_ctrl2 ( pipes_struct * p )
1998-03-12 00:11:04 +03:00
{
2001-03-11 03:32:10 +03:00
NET_Q_LOGON_CTRL2 q_u ;
NET_R_LOGON_CTRL2 r_u ;
2000-06-16 12:12:23 +04:00
prs_struct * data = & p - > in_data . data ;
prs_struct * rdata = & p - > out_data . rdata ;
1998-03-12 00:11:04 +03:00
2001-03-11 03:32:10 +03:00
ZERO_STRUCT ( q_u ) ;
ZERO_STRUCT ( r_u ) ;
1998-03-12 00:11:04 +03:00
/* grab the lsa netlogon ctrl2 query... */
2001-03-11 03:32:10 +03:00
if ( ! net_io_q_logon_ctrl2 ( " " , & q_u , data , 0 ) ) {
1999-12-13 16:27:58 +03:00
DEBUG ( 0 , ( " api_net_logon_ctrl2: Failed to unmarshall NET_Q_LOGON_CTRL2. \n " ) ) ;
return False ;
}
1998-03-12 00:11:04 +03:00
2001-03-11 03:32:10 +03:00
r_u . status = _net_logon_ctrl2 ( p , & q_u , & r_u ) ;
if ( ! net_io_r_logon_ctrl2 ( " " , & r_u , rdata , 0 ) ) {
DEBUG ( 0 , ( " net_reply_logon_ctrl2: Failed to marshall NET_R_LOGON_CTRL2. \n " ) ) ;
1999-12-13 16:27:58 +03:00
return False ;
2001-03-11 03:32:10 +03:00
}
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
return True ;
1998-03-12 00:11:04 +03:00
}
2001-05-24 12:05:12 +04:00
/*************************************************************************
api_net_logon_ctrl :
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL api_net_logon_ctrl ( pipes_struct * p )
{
NET_Q_LOGON_CTRL q_u ;
NET_R_LOGON_CTRL r_u ;
prs_struct * data = & p - > in_data . data ;
prs_struct * rdata = & p - > out_data . rdata ;
ZERO_STRUCT ( q_u ) ;
ZERO_STRUCT ( r_u ) ;
/* grab the lsa netlogon ctrl query... */
if ( ! net_io_q_logon_ctrl ( " " , & q_u , data , 0 ) ) {
DEBUG ( 0 , ( " api_net_logon_ctrl: Failed to unmarshall NET_Q_LOGON_CTRL. \n " ) ) ;
return False ;
}
r_u . status = _net_logon_ctrl ( p , & q_u , & r_u ) ;
if ( ! net_io_r_logon_ctrl ( " " , & r_u , rdata , 0 ) ) {
2005-03-24 02:26:33 +03:00
DEBUG ( 0 , ( " net_reply_logon_ctrl2: Failed to marshall NET_R_LOGON_CTRL. \n " ) ) ;
2001-05-24 12:05:12 +04:00
return False ;
}
return True ;
}
2006-02-10 21:05:55 +03:00
/*************************************************************************
api_net_sam_logon_ex :
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL api_net_sam_logon_ex ( pipes_struct * p )
{
NET_Q_SAM_LOGON_EX q_u ;
NET_R_SAM_LOGON_EX r_u ;
prs_struct * data = & p - > in_data . data ;
prs_struct * rdata = & p - > out_data . rdata ;
ZERO_STRUCT ( q_u ) ;
ZERO_STRUCT ( r_u ) ;
if ( ! net_io_q_sam_logon_ex ( " " , & q_u , data , 0 ) ) {
DEBUG ( 0 , ( " api_net_sam_logon_ex: Failed to unmarshall NET_Q_SAM_LOGON_EX. \n " ) ) ;
return False ;
}
r_u . status = _net_sam_logon_ex ( p , & q_u , & r_u ) ;
/* store the response in the SMB stream */
if ( ! net_io_r_sam_logon_ex ( " " , & r_u , rdata , 0 ) ) {
DEBUG ( 0 , ( " api_net_sam_logon_ex: Failed to marshall NET_R_SAM_LOGON_EX. \n " ) ) ;
return False ;
}
return True ;
}
2004-04-13 18:39:48 +04:00
/*************************************************************************
api_ds_enum_dom_trusts :
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#if 0 /* JERRY */
static BOOL api_ds_enum_dom_trusts ( pipes_struct * p )
{
DS_Q_ENUM_DOM_TRUSTS q_u ;
DS_R_ENUM_DOM_TRUSTS r_u ;
prs_struct * data = & p - > in_data . data ;
prs_struct * rdata = & p - > out_data . rdata ;
ZERO_STRUCT ( q_u ) ;
ZERO_STRUCT ( r_u ) ;
DEBUG ( 6 , ( " api_ds_enum_dom_trusts \n " ) ) ;
if ( ! ds_io_q_enum_domain_trusts ( " " , data , 0 , & q_u ) ) {
DEBUG ( 0 , ( " api_ds_enum_domain_trusts: Failed to unmarshall DS_Q_ENUM_DOM_TRUSTS. \n " ) ) ;
return False ;
}
r_u . status = _ds_enum_dom_trusts ( p , & q_u , & r_u ) ;
if ( ! ds_io_r_enum_domain_trusts ( " " , rdata , 0 , & r_u ) ) {
DEBUG ( 0 , ( " api_ds_enum_domain_trusts: Failed to marshall DS_R_ENUM_DOM_TRUSTS. \n " ) ) ;
return False ;
}
DEBUG ( 6 , ( " api_ds_enum_dom_trusts \n " ) ) ;
return True ;
}
# endif /* JERRY */
1998-03-12 00:11:04 +03:00
/*******************************************************************
array of \ PIPE \ NETLOGON operations
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2003-08-15 01:14:28 +04:00
static struct api_struct api_net_cmds [ ] =
2003-02-14 03:48:28 +03:00
{
{ " NET_REQCHAL " , NET_REQCHAL , api_net_req_chal } ,
{ " NET_AUTH " , NET_AUTH , api_net_auth } ,
{ " NET_AUTH2 " , NET_AUTH2 , api_net_auth_2 } ,
{ " NET_SRVPWSET " , NET_SRVPWSET , api_net_srv_pwset } ,
{ " NET_SAMLOGON " , NET_SAMLOGON , api_net_sam_logon } ,
{ " NET_SAMLOGOFF " , NET_SAMLOGOFF , api_net_sam_logoff } ,
{ " NET_LOGON_CTRL2 " , NET_LOGON_CTRL2 , api_net_logon_ctrl2 } ,
{ " NET_TRUST_DOM_LIST " , NET_TRUST_DOM_LIST , api_net_trust_dom_list } ,
2004-04-13 18:39:48 +04:00
{ " NET_LOGON_CTRL " , NET_LOGON_CTRL , api_net_logon_ctrl } ,
2006-02-10 21:05:55 +03:00
{ " NET_SAMLOGON_EX " , NET_SAMLOGON_EX , api_net_sam_logon_ex } ,
2004-04-13 18:39:48 +04:00
#if 0 /* JERRY */
{ " DS_ENUM_DOM_TRUSTS " , DS_ENUM_DOM_TRUSTS , api_ds_enum_dom_trusts }
# endif /* JERRY */
2003-02-14 03:48:28 +03:00
} ;
2003-08-15 01:14:28 +04:00
void netlog_get_pipe_fns ( struct api_struct * * fns , int * n_fns )
{
* fns = api_net_cmds ;
* n_fns = sizeof ( api_net_cmds ) / sizeof ( struct api_struct ) ;
}
NTSTATUS rpc_net_init ( void )
{
2003-04-28 21:48:48 +04:00
return rpc_pipe_register_commands ( SMB_RPC_INTERFACE_VERSION , " NETLOGON " , " lsass " , api_net_cmds ,
2003-02-14 03:48:28 +03:00
sizeof ( api_net_cmds ) / sizeof ( struct api_struct ) ) ;
1998-03-12 00:11:04 +03:00
}