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;
}