//---------------------------------------------------------------------------- // // Copyright (C) Intel Corporation, 2006 - 2007. // // File: SocksConsumer.h // // Contents: Handles outgoing Socks messages. // // Notes: //---------------------------------------------------------------------------- //=================================================== // INCLUDES //=================================================== #include #include #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; }