177 lines
5.1 KiB
C++
177 lines
5.1 KiB
C++
//----------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) Intel Corporation, 2006 - 2007.
|
|
//
|
|
// File: SocksConsumer.h
|
|
//
|
|
// Contents: Handles outgoing Socks messages.
|
|
//
|
|
// Notes:
|
|
//----------------------------------------------------------------------------
|
|
|
|
//===================================================
|
|
// INCLUDES
|
|
//===================================================
|
|
#include <ace/Message_Block.h>
|
|
#include <ace/SOCK_Stream.h>
|
|
|
|
|
|
#include "SOCKSv5.h"
|
|
#include "TcpConsumer.h"
|
|
#include "global.h"
|
|
#include "OptionsUtils.h"
|
|
#include "SocksSvcHandler.h"
|
|
//===================================================
|
|
// SocksSupplier Implementation
|
|
//===================================================
|
|
//-----------------------------------------
|
|
// send Socks version message
|
|
//-----------------------------------------
|
|
STATUS SocksConsumer::sendVersionMsg(SOCKS_V5_METHOD support_method)
|
|
{
|
|
ACE_TRACE(ACE_TEXT("SocksConsumer::sendVersionMs"));
|
|
SOCKSv5_ServerVersion s_version;
|
|
|
|
// Prepare the version reply.
|
|
s_version.VER = SOCKS_V5_PROTOCOL_VERSION;
|
|
s_version.METHOD = support_method;
|
|
|
|
ACE_Message_Block *mb = 0;
|
|
s_version.write(mb);
|
|
|
|
if (sendData(mb) != STATUS_SUCCESS)
|
|
{
|
|
ACE_DEBUG((MY_DEBUG
|
|
ACE_TEXT("Failed to send SOCKS version message\n")));
|
|
return STATUS_FAILURE;
|
|
}
|
|
|
|
if (_svc_handler != NULL)
|
|
{
|
|
/*ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex,
|
|
locker,
|
|
_svc_handler->_output_mutex,
|
|
STATUS_LOCK_FAILURE); */
|
|
|
|
if (NOT_ACCEPTABLE == support_method)
|
|
((Socks_Svc_Handler*)_svc_handler)->_socks_state = Socks_Svc_Handler::CONNECTION_FAILURE;
|
|
else
|
|
{
|
|
const bool* needAuthenticationPtr = getSocksNeedAuthentication();
|
|
const ACE_TString* socksDllNamePtr = getSocksDllName();
|
|
const ACE_TString* socksDllParametersPtr = getSocksDllParameters();
|
|
|
|
if (needAuthenticationPtr == NULL || socksDllNamePtr == NULL || socksDllParametersPtr == NULL) {
|
|
ACE_DEBUG((MY_DEBUG
|
|
ACE_TEXT("Failed to get SOCKS Authentication details\n")));
|
|
return STATUS_FAILURE;
|
|
}
|
|
Authentication_Param socks_auth_params( *needAuthenticationPtr,
|
|
*socksDllNamePtr,
|
|
*socksDllParametersPtr);
|
|
if (socks_auth_params._authenticate)
|
|
((Socks_Svc_Handler*)_svc_handler)->_socks_state = Socks_Svc_Handler::AUTHENTICATION;
|
|
else
|
|
((Socks_Svc_Handler*)_svc_handler)->_socks_state = Socks_Svc_Handler::NEGOTIATION;
|
|
}
|
|
}
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// send Socks authentication message
|
|
//-----------------------------------------
|
|
STATUS SocksConsumer::sendAuthMsg(SOCKS_V5_REP status)
|
|
{
|
|
ACE_TRACE(ACE_TEXT("SocksConsumer::sendAuthMsg"));
|
|
SOCKSv5_UssrPwdSubNegotiateReply s_version;
|
|
|
|
// Prepare the version reply.
|
|
s_version.VER = 1;
|
|
s_version.AUTH_REPLAY = status;
|
|
|
|
ACE_Message_Block *mb = 0;
|
|
s_version.write(mb);
|
|
|
|
if (sendData(mb) != STATUS_SUCCESS)
|
|
{
|
|
ACE_DEBUG((MY_DEBUG
|
|
ACE_TEXT("failed to send SOCKS authentication message\n")));
|
|
return STATUS_FAILURE;
|
|
}
|
|
|
|
if (_svc_handler != NULL)
|
|
{
|
|
/*ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex,
|
|
locker,
|
|
_svc_handler->_output_mutex,
|
|
STATUS_LOCK_FAILURE); */
|
|
|
|
if (status == SOCKS_SUCCEEDED)
|
|
((Socks_Svc_Handler*)_svc_handler)->_socks_state = Socks_Svc_Handler::NEGOTIATION;
|
|
else
|
|
((Socks_Svc_Handler*)_svc_handler)->_socks_state = Socks_Svc_Handler::CONNECTION_FAILURE;
|
|
}
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// send Socks negotiation message according to
|
|
// openChannel reply -
|
|
// This method is called from the socks supplier in case the tunnel was not found
|
|
// and from the Tunnel Supplier in any other case
|
|
//-----------------------------------------
|
|
STATUS SocksConsumer::openRep(Tcp_Consumer::REP_STATUS status,
|
|
SocksConsumer::CHANNEL_REP_REASON reason)
|
|
{
|
|
ACE_TRACE(ACE_TEXT("SocksConsumer::openRep"));
|
|
SOCKSv5_ServerReply s_reply;
|
|
|
|
/*ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex,
|
|
locker,
|
|
_svc_handler->_output_mutex,
|
|
STATUS_LOCK_FAILURE); */
|
|
//
|
|
//prepare SOCKS message:
|
|
//-----------------------
|
|
s_reply.VER = SOCKS_V5_PROTOCOL_VERSION;
|
|
s_reply.RSV = 0;
|
|
s_reply.ATYP = IPV4;
|
|
s_reply.BND_ADR_LEN = 4; // IPv4 address length
|
|
|
|
unsigned long address = inet_addr("127.0.0.1");
|
|
s_reply.BND_ADDR.set((char*)(&address), 4, true);
|
|
if (status == SUCCESS)
|
|
{
|
|
ACE_DEBUG ((MY_DEBUG ACE_TEXT("Management console successfully connected to Intel remote client machine\n\n")));
|
|
// Prepare server reply
|
|
s_reply.REP = SUCCEEDED;
|
|
|
|
((Socks_Svc_Handler*)_svc_handler)->_socks_state = Socks_Svc_Handler::CONNECTED;
|
|
|
|
}
|
|
else
|
|
{
|
|
s_reply.REP = reason;
|
|
ACE_DEBUG ((MY_DEBUG
|
|
ACE_TEXT("Management console failed to connect to Intel remote client machine\n\treason = %d\n"),
|
|
reason));
|
|
((Socks_Svc_Handler*)_svc_handler)->_socks_state =
|
|
Socks_Svc_Handler::CONNECTION_FAILURE;
|
|
}
|
|
|
|
//
|
|
//send message:
|
|
//-----------------------
|
|
ACE_Message_Block *mb = 0;
|
|
s_reply.write(mb);
|
|
|
|
if (sendData(mb) != STATUS_SUCCESS)
|
|
{
|
|
ACE_DEBUG((MY_DEBUG
|
|
ACE_TEXT("failed to send reply to SOCKS negotiation message\n")));
|
|
return STATUS_FAILURE;
|
|
}
|
|
|
|
return STATUS_SUCCESS;
|
|
} |