STORM-1112 First pass at cleanup of SOCKS 5 proxy code based on Linden Coding Standard and comments in the code review.

master
Logan Dethrow 2011-06-10 17:34:00 -04:00
parent 7cb18f5318
commit 6ce2c20a06
9 changed files with 389 additions and 381 deletions

View File

@ -28,16 +28,6 @@
#include "llpacketring.h"
// linden library includes
#include "llerror.h"
#include "lltimer.h"
#include "timing.h"
#include "llrand.h"
#include "u64.h"
#include "llsocks5.h"
#include "message.h"
#if LL_WINDOWS
#include <winsock2.h>
#else
@ -45,6 +35,20 @@
#include <netinet/in.h>
#endif
// linden library includes
#include "llerror.h"
#include "message.h"
#include "llsocks5.h"
#include "lltimer.h"
#include "timing.h"
#include "llrand.h"
#include "u64.h"
///////////////////////////////////////////////////////////
LLPacketRing::LLPacketRing () :
@ -241,8 +245,7 @@ S32 LLPacketRing::receivePacket (S32 socket, char *datap)
packet_size=0;
}
proxywrap_t * header;
header = (proxywrap_t *)buffer;
proxywrap_t * header = (proxywrap_t *)buffer;
mLastSender.setAddress(header->addr);
mLastSender.setPort(ntohs(header->port));
}

View File

@ -35,184 +35,185 @@
// Static class variable instances
// We want this to be static to avoid excessive indirection on every
// incomming packet just to do a simple bool test. The getter for this
// incoming packet just to do a simple bool test. The getter for this
// member is also static
bool LLSocks::sUdpProxyEnabled;
bool LLSocks::sHttpProxyEnabled;
LLSocks::LLSocks()
{
sUdpProxyEnabled = false;
sHttpProxyEnabled = false;
hProxyControlChannel = 0;
mProxyType = LLPROXY_SOCKS;
sUdpProxyEnabled = false;
sHttpProxyEnabled = false;
mProxyControlChannel = 0;
mProxyType = LLPROXY_SOCKS;
}
// Perform a Socks5 authentication and UDP assioacation to the proxy
// specified by proxy, and assiocate UDP port message_port
// Perform a Socks5 authentication and UDP association to the proxy
// specified by proxy, and associate UDP port message_port
int LLSocks::proxyHandshake(LLHost proxy, U32 message_port)
{
int result;
int result;
/* Socks 5 Auth request */
socks_auth_request_t socks_auth_request;
socks_auth_response_t socks_auth_response;
/* Socks 5 Auth request */
socks_auth_request_t socks_auth_request;
socks_auth_response_t socks_auth_response;
socks_auth_request.version = SOCKS_VERSION; // Socks version 5
socks_auth_request.num_methods = 1; // Sending 1 method
socks_auth_request.methods = mAuthMethodSelected; // send only the selected metho
socks_auth_request.version = SOCKS_VERSION; // Socks version 5
socks_auth_request.num_methods = 1; // Sending 1 method
socks_auth_request.methods = mAuthMethodSelected; // send only the selected method
result = tcp_handshake(hProxyControlChannel, (char*)&socks_auth_request, sizeof(socks_auth_request_t), (char*)&socks_auth_response, sizeof(socks_auth_response_t));
if (result != 0)
{
llwarns << "Socks authentication request failed, error on TCP control channel : " << result << llendl;
stopProxy();
return SOCKS_CONNECT_ERROR;
}
if (socks_auth_response.method == AUTH_NOT_ACCEPTABLE)
{
llwarns << "Socks5 server refused all our authentication methods" << llendl;
stopProxy();
return SOCKS_NOT_ACCEPTABLE;
}
result = tcp_handshake(mProxyControlChannel, (char*)&socks_auth_request, sizeof(socks_auth_request_t), (char*)&socks_auth_response, sizeof(socks_auth_response_t));
if (result != 0)
{
llwarns << "Socks authentication request failed, error on TCP control channel : " << result << llendl;
stopProxy();
return SOCKS_CONNECT_ERROR;
}
// SOCKS5 USERNAME/PASSWORD authentication
if (socks_auth_response.method == METHOD_PASSWORD)
{
// The server has requested a username/password combination
U32 request_size = mSocksUsername.size() + mSocksPassword.size() + 3;
char * password_auth = (char *)malloc(request_size);
password_auth[0] = 0x01;
password_auth[1] = mSocksUsername.size();
memcpy(&password_auth[2],mSocksUsername.c_str(), mSocksUsername.size());
password_auth[mSocksUsername.size()+2] = mSocksPassword.size();
memcpy(&password_auth[mSocksUsername.size()+3], mSocksPassword.c_str(), mSocksPassword.size());
if (socks_auth_response.method == AUTH_NOT_ACCEPTABLE)
{
llwarns << "Socks5 server refused all our authentication methods" << llendl;
stopProxy();
return SOCKS_NOT_ACCEPTABLE;
}
authmethod_password_reply_t password_reply;
// SOCKS5 USERNAME/PASSWORD authentication
if (socks_auth_response.method == METHOD_PASSWORD)
{
// The server has requested a username/password combination
U32 request_size = mSocksUsername.size() + mSocksPassword.size() + 3;
// char * password_auth = (char *)malloc(request_size);
char * password_auth = new char[request_size];
password_auth[0] = 0x01;
password_auth[1] = mSocksUsername.size();
memcpy(&password_auth[2], mSocksUsername.c_str(), mSocksUsername.size());
password_auth[mSocksUsername.size()+2] = mSocksPassword.size();
memcpy(&password_auth[mSocksUsername.size()+3], mSocksPassword.c_str(), mSocksPassword.size());
result = tcp_handshake(hProxyControlChannel, password_auth, request_size, (char*)&password_reply, sizeof(authmethod_password_reply_t));
free (password_auth);
authmethod_password_reply_t password_reply;
if (result != 0)
{
llwarns << "Socks authentication failed, error on TCP control channel : " << result << llendl;
stopProxy();
return SOCKS_CONNECT_ERROR;
}
result = tcp_handshake(mProxyControlChannel, password_auth, request_size, (char*)&password_reply, sizeof(authmethod_password_reply_t));
delete[] password_auth;
if (password_reply.status != AUTH_SUCCESS)
{
llwarns << "Socks authentication failed" << llendl;
stopProxy();
return SOCKS_AUTH_FAIL;
}
}
if (result != 0)
{
llwarns << "Socks authentication failed, error on TCP control channel : " << result << llendl;
stopProxy();
return SOCKS_CONNECT_ERROR;
}
/* SOCKS5 connect request */
if (password_reply.status != AUTH_SUCCESS)
{
llwarns << "Socks authentication failed" << llendl;
stopProxy();
return SOCKS_AUTH_FAIL;
}
}
socks_command_request_t connect_request;
socks_command_response_t connect_reply;
/* SOCKS5 connect request */
connect_request.version = SOCKS_VERSION; //Socks V5
connect_request.command = COMMAND_UDP_ASSOCIATE; // Associate UDP
connect_request.flag = FIELD_RESERVED;
connect_request.atype = ADDRESS_IPV4;
connect_request.address = 0; // 0.0.0.0 We are not fussy about address
// UDP is promiscious receive for our protocol
connect_request.port = 0; // Port must be 0 if you ever want to connect via NAT and your router does port rewrite for you
socks_command_request_t connect_request;
socks_command_response_t connect_reply;
result = tcp_handshake(hProxyControlChannel, (char*)&connect_request, sizeof(socks_command_request_t), (char*)&connect_reply, sizeof(socks_command_response_t));
if (result != 0)
{
llwarns << "Socks connect request failed, error on TCP control channel : " << result << llendl;
stopProxy();
return SOCKS_CONNECT_ERROR;
}
connect_request.version = SOCKS_VERSION; //Socks V5
connect_request.command = COMMAND_UDP_ASSOCIATE; // Associate UDP
connect_request.flag = FIELD_RESERVED;
connect_request.atype = ADDRESS_IPV4;
connect_request.address = 0; // 0.0.0.0 We are not fussy about address
// UDP is promiscuous receive for our protocol
connect_request.port = 0; // Port must be 0 if you ever want to connect via NAT and your router does port rewrite for you
if (connect_reply.reply != REPLY_REQUEST_GRANTED)
{
//Something went wrong
llwarns << "Connection to SOCKS5 server failed, UDP forward request not granted" << llendl;
stopProxy();
return SOCKS_UDP_FWD_NOT_GRANTED;
}
result = tcp_handshake(mProxyControlChannel, (char*)&connect_request, sizeof(socks_command_request_t), (char*)&connect_reply, sizeof(socks_command_response_t));
if (result != 0)
{
llwarns << "Socks connect request failed, error on TCP control channel : " << result << llendl;
stopProxy();
return SOCKS_CONNECT_ERROR;
}
mUDPProxy.setPort(ntohs(connect_reply.port)); // reply port is in network byte order
mUDPProxy.setAddress(proxy.getAddress());
// All good now we have been given the UDP port to send requests that need forwarding.
llinfos << "Socks 5 UDP proxy connected on " << mUDPProxy << llendl;
return SOCKS_OK;
if (connect_reply.reply != REPLY_REQUEST_GRANTED)
{
//Something went wrong
llwarns << "Connection to SOCKS5 server failed, UDP forward request not granted" << llendl;
stopProxy();
return SOCKS_UDP_FWD_NOT_GRANTED;
}
mUDPProxy.setPort(ntohs(connect_reply.port)); // reply port is in network byte order
mUDPProxy.setAddress(proxy.getAddress());
// All good now we have been given the UDP port to send requests that need forwarding.
llinfos << "Socks 5 UDP proxy connected on " << mUDPProxy << llendl;
return SOCKS_OK;
}
int LLSocks::startProxy(LLHost proxy, U32 message_port)
{
int status;
int status;
mTCPProxy = proxy;
mTCPProxy = proxy;
if (hProxyControlChannel)
{
tcp_close_channel(hProxyControlChannel);
hProxyControlChannel=0;
}
if (mProxyControlChannel)
{
tcp_close_channel(mProxyControlChannel);
mProxyControlChannel = 0;
}
hProxyControlChannel = tcp_open_channel(proxy);
if (hProxyControlChannel == -1)
{
return SOCKS_HOST_CONNECT_FAILED;
}
mProxyControlChannel = tcp_open_channel(proxy);
if (mProxyControlChannel == -1)
{
return SOCKS_HOST_CONNECT_FAILED;
}
status = proxyHandshake(proxy, message_port);
if (status == SOCKS_OK)
{
sUdpProxyEnabled=true;
}
return status;
status = proxyHandshake(proxy, message_port);
if (status == SOCKS_OK)
{
sUdpProxyEnabled = true;
}
return status;
}
int LLSocks::startProxy(std::string host, U32 port)
{
mTCPProxy.setHostByName(host);
mTCPProxy.setPort(port);
return startProxy(mTCPProxy, (U32)gMessageSystem->mPort);
mTCPProxy.setHostByName(host);
mTCPProxy.setPort(port);
return startProxy(mTCPProxy, (U32)gMessageSystem->mPort);
}
void LLSocks::stopProxy()
{
sUdpProxyEnabled = false;
sUdpProxyEnabled = false;
// If the Socks proxy is requested to stop and we are using that for http as well
// then we must shut down any http proxy operations. But it is allowable if web
// proxy is being used to continue proxying http.
// If the Socks proxy is requested to stop and we are using that for http as well
// then we must shut down any http proxy operations. But it is allowable if web
// proxy is being used to continue proxying http.
if(LLPROXY_SOCKS == mProxyType)
{
sHttpProxyEnabled = false;
}
if(LLPROXY_SOCKS == mProxyType)
{
sHttpProxyEnabled = false;
}
if (hProxyControlChannel)
{
tcp_close_channel(hProxyControlChannel);
hProxyControlChannel=0;
}
if (mProxyControlChannel)
{
tcp_close_channel(mProxyControlChannel);
mProxyControlChannel = 0;
}
}
void LLSocks::setAuthNone()
{
mAuthMethodSelected = METHOD_NOAUTH;
mAuthMethodSelected = METHOD_NOAUTH;
}
void LLSocks::setAuthPassword(std::string username, std::string password)
{
mAuthMethodSelected = METHOD_PASSWORD;
mSocksUsername = username;
mSocksPassword = password;
mAuthMethodSelected = METHOD_PASSWORD;
mSocksUsername = username;
mSocksPassword = password;
}
void LLSocks::EnableHttpProxy(LLHost httpHost, LLHttpProxyType type)
void LLSocks::enableHttpProxy(LLHost httpHost, LLHttpProxyType type)
{
sHttpProxyEnabled = true;
mHTTPProxy = httpHost;
mProxyType = type;
sHttpProxyEnabled = true;
mHTTPProxy = httpHost;
mProxyType = type;
}

View File

@ -35,12 +35,12 @@
// Error codes returned from the StartProxy method
#define SOCKS_OK 0
#define SOCKS_CONNECT_ERROR -1
#define SOCKS_NOT_PERMITTED -2
#define SOCKS_NOT_ACCEPTABLE -3
#define SOCKS_AUTH_FAIL -4
#define SOCKS_UDP_FWD_NOT_GRANTED -5
#define SOCKS_HOST_CONNECT_FAILED -6
#define SOCKS_CONNECT_ERROR (-1)
#define SOCKS_NOT_PERMITTED (-2)
#define SOCKS_NOT_ACCEPTABLE (-3)
#define SOCKS_AUTH_FAIL (-4)
#define SOCKS_UDP_FWD_NOT_GRANTED (-5)
#define SOCKS_HOST_CONNECT_FAILED (-6)
#ifndef MAXHOSTNAMELEN
#define MAXHOSTNAMELEN (255 + 1) /* socks5: 255, +1 for len. */
@ -56,8 +56,8 @@
// Lets just use our own ipv4 struct rather than dragging in system
// specific headers
union ipv4_address_t {
unsigned char octects[4];
U32 addr32;
unsigned char octets[4];
U32 addr32;
};
// Socks 5 control channel commands
@ -86,53 +86,53 @@ union ipv4_address_t {
// Socks5 command packet
struct socks_command_request_t {
unsigned char version;
unsigned char command;
unsigned char flag;
unsigned char atype;
U32 address;
U16 port;
unsigned char version;
unsigned char command;
unsigned char flag;
unsigned char atype;
U32 address;
U16 port;
};
// Standard socks5 reply packet
struct socks_command_response_t {
unsigned char version;
unsigned char reply;
unsigned char flag;
unsigned char atype;
unsigned char add_bytes[4];
U16 port;
unsigned char version;
unsigned char reply;
unsigned char flag;
unsigned char atype;
unsigned char add_bytes[4];
U16 port;
};
#define AUTH_NOT_ACCEPTABLE 0xFF // reply if prefered methods are not avaiable
#define AUTH_SUCCESS 0x00 // reply if authentication successfull
#define AUTH_NOT_ACCEPTABLE 0xFF // reply if preferred methods are not available
#define AUTH_SUCCESS 0x00 // reply if authentication successful
// socks 5 authentication request, stating which methods the client supports
struct socks_auth_request_t {
unsigned char version;
unsigned char num_methods;
unsigned char methods; // We are only using a single method currently
unsigned char version;
unsigned char num_methods;
unsigned char methods; // We are only using a single method currently
};
// socks 5 authentication response packet, stating server prefered method
struct socks_auth_response_t {
unsigned char version;
unsigned char method;
unsigned char version;
unsigned char method;
};
// socks 5 password reply packet
struct authmethod_password_reply_t {
unsigned char version;
unsigned char status;
unsigned char version;
unsigned char status;
};
// socks 5 UDP packet header
struct proxywrap_t {
U16 rsv;
U8 frag;
U8 atype;
U32 addr;
U16 port;
U16 rsv;
U8 frag;
U8 atype;
U32 addr;
U16 port;
};
#pragma pack(pop) /* restore original alignment from stack */
@ -141,97 +141,97 @@ struct proxywrap_t {
// Currently selected http proxy type
enum LLHttpProxyType
{
LLPROXY_SOCKS = 0,
LLPROXY_HTTP = 1
LLPROXY_SOCKS = 0,
LLPROXY_HTTP = 1
};
// Auth types
enum LLSocks5AuthType
{
METHOD_NOAUTH = 0x00, // Client supports no auth
METHOD_GSSAPI = 0x01, // Client supports GSSAPI (Not currently supported)
METHOD_PASSWORD = 0x02 // Client supports username/password
METHOD_NOAUTH = 0x00, // Client supports no auth
METHOD_GSSAPI = 0x01, // Client supports GSSAPI (Not currently supported)
METHOD_PASSWORD = 0x02 // Client supports username/password
};
class LLSocks: public LLSingleton<LLSocks>
{
public:
LLSocks();
LLSocks();
// Start a connection to the socks 5 proxy
int startProxy(std::string host,U32 port);
int startProxy(LLHost proxy,U32 messagePort);
// Start a connection to the socks 5 proxy
int startProxy(std::string host,U32 port);
int startProxy(LLHost proxy,U32 messagePort);
// Disconnect and clean up any connection to the socks 5 proxy
void stopProxy();
// Disconnect and clean up any connection to the socks 5 proxy
void stopProxy();
// Set up to use Password auth when connecting to the socks proxy
void setAuthPassword(std::string username,std::string password);
// Set up to use Password auth when connecting to the socks proxy
void setAuthPassword(std::string username,std::string password);
// Set up to use No Auth when connecting to the socks proxy;
void setAuthNone();
// Set up to use No Auth when connecting to the socks proxy
void setAuthNone();
// get the currently selected auth method
LLSocks5AuthType getSelectedAuthMethod() { return mAuthMethodSelected; };
// get the currently selected auth method
LLSocks5AuthType getSelectedAuthMethod() const { return mAuthMethodSelected; }
// static check for enabled status for UDP packets
static bool isEnabled(){return sUdpProxyEnabled;};
// static check for enabled status for UDP packets
static bool isEnabled() { return sUdpProxyEnabled; }
// static check for enabled status for http packets
static bool isHttpProxyEnabled(){return sHttpProxyEnabled;};
// static check for enabled status for http packets
static bool isHttpProxyEnabled() { return sHttpProxyEnabled; }
// Proxy http packets via httpHost, which can be a Socks5 or a http proxy
// as specified in type
void EnableHttpProxy(LLHost httpHost,LLHttpProxyType type);
// Proxy http packets via httpHost, which can be a Socks5 or a http proxy
// as specified in type
void enableHttpProxy(LLHost httpHost, LLHttpProxyType type);
// Stop proxying http packets
void DisableHttpProxy() {sHttpProxyEnabled = false;};
// Stop proxying http packets
void disableHttpProxy() { sHttpProxyEnabled = false; };
// get the UDP proxy address and port
LLHost getUDPProxy(){return mUDPProxy;};
// Get the UDP proxy address and port
LLHost getUDPProxy() const { return mUDPProxy; }
// get the socks 5 TCP control channel address and port
LLHost getTCPProxy(){return mTCPProxy;};
// Get the socks 5 TCP control channel address and port
LLHost getTCPProxy() const { return mTCPProxy; }
//get the http proxy address and port
LLHost getHTTPProxy(){return mHTTPProxy;};
// Get the http proxy address and port
LLHost getHTTPProxy() const { return mHTTPProxy; }
// get the currently selected http proxy type
LLHttpProxyType getHttpProxyType(){return mProxyType;};
// Get the currently selected http proxy type
LLHttpProxyType getHttpProxyType() const { return mProxyType; }
//Get the username password in a curl compatible format
std::string getProxyUserPwd(){ return (mSocksUsername + ":" + mSocksPassword);};
// Get the username password in a curl compatible format
std::string getProxyUserPwd() const { return (mSocksUsername + ":" + mSocksPassword); }
private:
// Open a communication channel to the socks5 proxy proxy, at port messagePort
int proxyHandshake(LLHost proxy,U32 messagePort);
// Open a communication channel to the socks5 proxy proxy, at port messagePort
int proxyHandshake(LLHost proxy,U32 messagePort);
// socket handle to proxy tcp control channel
S32 hProxyControlChannel;
// socket handle to proxy tcp control channel
S32 mProxyControlChannel;
// is the UDP proxy enabled
static bool sUdpProxyEnabled;
// is the http proxy enabled
static bool sHttpProxyEnabled;
// is the UDP proxy enabled?
static bool sUdpProxyEnabled;
// is the http proxy enabled?
static bool sHttpProxyEnabled;
// currently selected http proxy type
LLHttpProxyType mProxyType;
// currently selected http proxy type
LLHttpProxyType mProxyType;
// UDP proxy address and port
LLHost mUDPProxy;
// TCP Proxy control channel address and port
LLHost mTCPProxy;
// HTTP proxy address and port
LLHost mHTTPProxy;
// UDP proxy address and port
LLHost mUDPProxy;
// TCP Proxy control channel address and port
LLHost mTCPProxy;
// HTTP proxy address and port
LLHost mHTTPProxy;
// socks 5 auth method selected
LLSocks5AuthType mAuthMethodSelected;
// socks 5 auth method selected
LLSocks5AuthType mAuthMethodSelected;
// socks 5 username
std::string mSocksUsername;
// socks 5 password
std::string mSocksPassword;
// socks 5 username
std::string mSocksUsername;
// socks 5 password
std::string mSocksPassword;
};
#endif

View File

@ -175,7 +175,7 @@ U32 ip_string_to_u32(const char* ip_string)
// use wildcard addresses. -Ambroff
U32 ip = inet_addr(ip_string);
if (ip == INADDR_NONE
&& strncmp(ip_string, BROADCAST_ADDRESS_STRING, MAXADDRSTR) != 0)
&& strncmp(ip_string, BROADCAST_ADDRESS_STRING, MAXADDRSTR) != 0)
{
llwarns << "ip_string_to_u32() failed, Error: Invalid IP string '" << ip_string << "'" << llendl;
return INVALID_HOST_IP_ADDRESS;
@ -220,9 +220,10 @@ S32 tcp_open_channel(LLHost host)
S32 handle;
handle = socket(AF_INET, SOCK_STREAM, 0);
if (!handle)
if (INVALID_SOCKET == handle)
{
llwarns << "Error opening TCP control socket, socket() returned " << handle << llendl;
llwarns << "Error opening TCP control socket, socket() returned "
<< WSAGetLastError() << ", " << DecodeError(WSAGetLastError()) << llendl;
return -1;
}
@ -232,15 +233,15 @@ S32 tcp_open_channel(LLHost host)
address.sin_addr.s_addr = host.getAddress();
// Non blocking
WSAEVENT hEvent=WSACreateEvent();
WSAEVENT hEvent = WSACreateEvent();
WSAEventSelect(handle, hEvent, FD_CONNECT) ;
connect(handle, (struct sockaddr*)&address, sizeof(address)) ;
// Wait fot 5 seconds, if we can't get a TCP channel open in this
// Wait for 5 seconds, if we can't get a TCP channel open in this
// time frame then there is something badly wrong.
WaitForSingleObject(hEvent, 1000*5); // 5 seconds time out
WaitForSingleObject(hEvent, 1000 * 5); // 5 seconds time out
WSANETWORKEVENTS netevents;
WSAEnumNetworkEvents(handle,hEvent,&netevents);
WSAEnumNetworkEvents(handle, hEvent, &netevents);
// Check the async event status to see if we connected
if ((netevents.lNetworkEvents & FD_CONNECT) == FD_CONNECT)
@ -249,6 +250,7 @@ S32 tcp_open_channel(LLHost host)
{
llwarns << "Unable to open TCP channel, WSA returned an error code of " << netevents.iErrorCode[FD_CONNECT_BIT] << llendl;
WSACloseEvent(hEvent);
tcp_close_channel(handle);
return -1;
}
@ -264,6 +266,7 @@ S32 tcp_open_channel(LLHost host)
}
llwarns << "Unable to open TCP channel, Timeout is the host up?" << netevents.iErrorCode[FD_CONNECT_BIT] << llendl;
tcp_close_channel(handle);
return -1;
}
@ -277,7 +280,7 @@ void tcp_close_channel(S32 handle)
S32 start_net(S32& socket_out, int& nPort)
{
// Create socket, make non-blocking
// Init WinSock
// Init WinSock
int nRet;
int hSocket;
@ -286,7 +289,7 @@ S32 start_net(S32& socket_out, int& nPort)
int buff_size = 4;
// Initialize windows specific stuff
if(WSAStartup(0x0202, &stWSAData))
if (WSAStartup(0x0202, &stWSAData))
{
S32 err = WSAGetLastError();
WSACleanup();
@ -295,8 +298,8 @@ S32 start_net(S32& socket_out, int& nPort)
}
// Get a datagram socket
hSocket = (int)socket(AF_INET, SOCK_DGRAM, 0);
if (hSocket == INVALID_SOCKET)
hSocket = (int)socket(AF_INET, SOCK_DGRAM, 0);
if (hSocket == INVALID_SOCKET)
{
S32 err = WSAGetLastError();
WSACleanup();
@ -389,7 +392,7 @@ S32 start_net(S32& socket_out, int& nPort)
// Setup a destination address
stDstAddr.sin_family = AF_INET;
stDstAddr.sin_addr.s_addr = INVALID_HOST_IP_ADDRESS;
stDstAddr.sin_port = htons(nPort);
stDstAddr.sin_port = htons(nPort);
socket_out = hSocket;
return 0;
@ -492,9 +495,9 @@ S32 tcp_open_channel(LLHost host)
{
S32 handle;
handle = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (!handle)
if (-1 == handle)
{
llwarns << "Error opening TCP control socket, socket() returned " << handle << llendl;
llwarns << "Error opening TCP control socket, socket() returned " << handle << "error code: " << errno << llendl;
return -1;
}
@ -511,6 +514,7 @@ S32 tcp_open_channel(LLHost host)
if (error && (errno != EINPROGRESS))
{
llwarns << "Unable to open TCP channel, error code: " << errno << llendl;
tcp_close_channel(handle);
return -1;
}
@ -521,12 +525,13 @@ S32 tcp_open_channel(LLHost host)
FD_ZERO(&fds);
FD_SET(handle, &fds);
// See if we have connectde or time out after 5 seconds
U32 rc = select(sizeof(fds)*8, NULL, &fds, NULL, &timeout);
// See if we have connected or time out after 5 seconds
S32 rc = select(sizeof(fds)*8, NULL, &fds, NULL, &timeout);
if (rc != 1) // we require exactly one descriptor to be set
{
llwarns << "Unable to open TCP channel" << llendl;
tcp_close_channel(handle);
return -1;
}
@ -549,10 +554,10 @@ S32 start_net(S32& socket_out, int& nPort)
int rec_size = RECEIVE_BUFFER_SIZE;
socklen_t buff_size = 4;
// Create socket
hSocket = socket(AF_INET, SOCK_DGRAM, 0);
if (hSocket < 0)
hSocket = socket(AF_INET, SOCK_DGRAM, 0);
if (hSocket < 0)
{
llwarns << "socket() failed" << llendl;
return 1;
@ -585,7 +590,7 @@ S32 start_net(S32& socket_out, int& nPort)
}
else
{
// Name the socket (assign the local port number to receive on)
// Name the socket (assign the local port number to receive on)
stLclAddr.sin_family = AF_INET;
stLclAddr.sin_addr.s_addr = htonl(INADDR_ANY);
stLclAddr.sin_port = htons(nPort);
@ -630,7 +635,7 @@ S32 start_net(S32& socket_out, int& nPort)
nPort = attempt_port;
}
// Set socket to be non-blocking
fcntl(hSocket, F_SETFL, O_NONBLOCK);
fcntl(hSocket, F_SETFL, O_NONBLOCK);
// set a large receive buffer
nRet = setsockopt(hSocket, SOL_SOCKET, SO_RCVBUF, (char *)&rec_size, buff_size);
if (nRet)
@ -666,8 +671,8 @@ S32 start_net(S32& socket_out, int& nPort)
// Setup a destination address
char achMCAddr[MAXADDRSTR] = "127.0.0.1"; /* Flawfinder: ignore */
stDstAddr.sin_family = AF_INET;
stDstAddr.sin_addr.s_addr = ip_string_to_u32(achMCAddr);
stDstAddr.sin_port = htons(nPort);
stDstAddr.sin_addr.s_addr = ip_string_to_u32(achMCAddr);
stDstAddr.sin_port = htons(nPort);
socket_out = hSocket;
return 0;
@ -693,7 +698,7 @@ static int recvfrom_destip( int socket, void *buf, int len, struct sockaddr *fro
iov[0].iov_base = buf;
iov[0].iov_len = len;
memset( &msg, 0, sizeof msg );
memset(&msg, 0, sizeof msg);
msg.msg_name = from;
msg.msg_namelen = *fromlen;
msg.msg_iov = iov;
@ -701,14 +706,14 @@ static int recvfrom_destip( int socket, void *buf, int len, struct sockaddr *fro
msg.msg_control = &cmsg;
msg.msg_controllen = sizeof(cmsg);
size = recvmsg( socket, &msg, 0 );
size = recvmsg(socket, &msg, 0);
if( size == -1 )
if (size == -1)
{
return -1;
}
for( cmsgptr = CMSG_FIRSTHDR(&msg); cmsgptr != NULL; cmsgptr = CMSG_NXTHDR( &msg, cmsgptr ) )
for (cmsgptr = CMSG_FIRSTHDR(&msg); cmsgptr != NULL; cmsgptr = CMSG_NXTHDR( &msg, cmsgptr))
{
if( cmsgptr->cmsg_level == SOL_IP && cmsgptr->cmsg_type == IP_PKTINFO )
{
@ -806,7 +811,7 @@ BOOL send_packet(int hSocket, const char * sendBuffer, int size, U32 recipient,
}
}
}
while ( resend && send_attempts < 3);
while (resend && send_attempts < 3);
if (send_attempts >= 3)
{

View File

@ -46,10 +46,10 @@ S32 receive_packet(int hSocket, char * receiveBuffer);
BOOL send_packet(int hSocket, const char *sendBuffer, int size, U32 recipient, int nPort); // Returns TRUE on success.
//void get_sender(char * tmp);
LLHost get_sender();
LLHost get_sender();
U32 get_sender_port();
U32 get_sender_ip(void);
LLHost get_receiving_interface();
LLHost get_receiving_interface();
U32 get_receiving_interface_ip(void);
// Some helpful tcp functions added for the socks 5 proxy support

View File

@ -343,7 +343,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.getUIColor", boost::bind(&LLFloaterPreference::getUIColor, this ,_1, _2));
mCommitCallbackRegistrar.add("Pref.MaturitySettings", boost::bind(&LLFloaterPreference::onChangeMaturity, this));
mCommitCallbackRegistrar.add("Pref.BlockList", boost::bind(&LLFloaterPreference::onClickBlockList, this));
mCommitCallbackRegistrar.add("Pref.Proxy", boost::bind(&LLFloaterPreference::onClickProxySettings, this));
mCommitCallbackRegistrar.add("Pref.Proxy", boost::bind(&LLFloaterPreference::onClickProxySettings, this));
sSkin = gSavedSettings.getString("SkinCurrent");
@ -1545,7 +1545,7 @@ void LLFloaterPreference::updateDoubleClickSettings()
void LLFloaterPreference::onClickProxySettings()
{
LLFloaterReg::showInstance("prefs_proxy");
LLFloaterReg::showInstance("prefs_proxy");
}
void LLFloaterPreference::updateDoubleClickControls()
@ -1916,16 +1916,13 @@ void LLPanelPreferenceGraphics::setHardwareDefaults()
LLPanelPreference::setHardwareDefaults();
}
/* ------------------------------------------------------------ */
LLFloaterPreferenceProxy::LLFloaterPreferenceProxy(const LLSD& key)
: LLFloater(key),
mSocksSettingsDirty(false)
: LLFloater(key),
mSocksSettingsDirty(false)
{
mCommitCallbackRegistrar.add("Proxy.OK", boost::bind(&LLFloaterPreferenceProxy::onBtnOk, this));
mCommitCallbackRegistrar.add("Proxy.Cancel", boost::bind(&LLFloaterPreferenceProxy::onBtnCancel, this));
mCommitCallbackRegistrar.add("Proxy.Change", boost::bind(&LLFloaterPreferenceProxy::onChangeSocksSettings, this));
mCommitCallbackRegistrar.add("Proxy.OK", boost::bind(&LLFloaterPreferenceProxy::onBtnOk, this));
mCommitCallbackRegistrar.add("Proxy.Cancel", boost::bind(&LLFloaterPreferenceProxy::onBtnCancel, this));
mCommitCallbackRegistrar.add("Proxy.Change", boost::bind(&LLFloaterPreferenceProxy::onChangeSocksSettings, this));
}
LLFloaterPreferenceProxy::~LLFloaterPreferenceProxy()
@ -1934,142 +1931,142 @@ LLFloaterPreferenceProxy::~LLFloaterPreferenceProxy()
BOOL LLFloaterPreferenceProxy::postBuild()
{
LLLineEditor* edit = getChild<LLLineEditor>("socks_password_editor");
if (edit) edit->setDrawAsterixes(TRUE);
LLLineEditor* edit = getChild<LLLineEditor>("socks_password_editor");
if (edit) edit->setDrawAsterixes(TRUE);
LLRadioGroup* socksAuth = getChild<LLRadioGroup>("socks5_auth_type");
if(socksAuth->getSelectedValue().asString() == "None")
{
getChild<LLLineEditor>("socks5_username")->setEnabled(false);
getChild<LLLineEditor>("socks5_password")->setEnabled(false);
}
LLRadioGroup* socksAuth = getChild<LLRadioGroup>("socks5_auth_type");
if(socksAuth->getSelectedValue().asString() == "None")
{
getChild<LLLineEditor>("socks5_username")->setEnabled(false);
getChild<LLLineEditor>("socks5_password")->setEnabled(false);
}
center();
return TRUE;
center();
return TRUE;
}
void LLFloaterPreferenceProxy::onOpen(const LLSD& key)
{
saveSettings();
saveSettings();
}
void LLFloaterPreferenceProxy::onClose(bool app_quitting)
{
if(mSocksSettingsDirty)
{
if(mSocksSettingsDirty)
{
// If the user plays with the Socks proxy settings after login, its only fair we let them know
// it will not be updated untill next restart.
if(LLStartUp::getStartupState()>STATE_LOGIN_WAIT)
{
if(this->mSocksSettingsDirty == true )
{
LLNotifications::instance().add("ChangeSocks5Settings",LLSD(),LLSD());
mSocksSettingsDirty = false; // we have notified the user now be quiet again
}
}
}
// If the user plays with the Socks proxy settings after login, it's only fair we let them know
// it will not be updated until next restart.
if(LLStartUp::getStartupState()>STATE_LOGIN_WAIT)
{
if(this->mSocksSettingsDirty == true )
{
LLNotifications::instance().add("ChangeSocks5Settings",LLSD(),LLSD());
mSocksSettingsDirty = false; // we have notified the user now be quiet again
}
}
}
}
void LLFloaterPreferenceProxy::saveSettings()
{
// Save the value of all controls in the hierarchy
mSavedValues.clear();
std::list<LLView*> view_stack;
view_stack.push_back(this);
while(!view_stack.empty())
{
// Process view on top of the stack
LLView* curview = view_stack.front();
view_stack.pop_front();
// Save the value of all controls in the hierarchy
mSavedValues.clear();
std::list<LLView*> view_stack;
view_stack.push_back(this);
while(!view_stack.empty())
{
// Process view on top of the stack
LLView* curview = view_stack.front();
view_stack.pop_front();
LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview);
if (ctrl)
{
LLControlVariable* control = ctrl->getControlVariable();
if (control)
{
mSavedValues[control] = control->getValue();
}
}
// Push children onto the end of the work stack
for (child_list_t::const_iterator iter = curview->getChildList()->begin();
iter != curview->getChildList()->end(); ++iter)
{
view_stack.push_back(*iter);
}
}
LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview);
if (ctrl)
{
LLControlVariable* control = ctrl->getControlVariable();
if (control)
{
mSavedValues[control] = control->getValue();
}
}
// Push children onto the end of the work stack
for (child_list_t::const_iterator iter = curview->getChildList()->begin();
iter != curview->getChildList()->end(); ++iter)
{
view_stack.push_back(*iter);
}
}
}
void LLFloaterPreferenceProxy::onBtnOk()
{
// commit any outstanding text entry
if (hasFocus())
{
LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
if (cur_focus && cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
}
}
closeFloater(false);
// commit any outstanding text entry
if (hasFocus())
{
LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
if (cur_focus && cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
}
}
closeFloater(false);
}
void LLFloaterPreferenceProxy::onBtnCancel()
{
if (hasFocus())
{
LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
if (cur_focus && cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
}
refresh();
}
cancel();
if (hasFocus())
{
LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
if (cur_focus && cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
}
refresh();
}
cancel();
}
void LLFloaterPreferenceProxy::cancel()
{
for (control_values_map_t::iterator iter = mSavedValues.begin();
iter != mSavedValues.end(); ++iter)
{
LLControlVariable* control = iter->first;
LLSD ctrl_value = iter->second;
control->set(ctrl_value);
}
closeFloater();
for (control_values_map_t::iterator iter = mSavedValues.begin();
iter != mSavedValues.end(); ++iter)
{
LLControlVariable* control = iter->first;
LLSD ctrl_value = iter->second;
control->set(ctrl_value);
}
closeFloater();
}
void LLFloaterPreferenceProxy::onChangeSocksSettings()
{
mSocksSettingsDirty = true;
mSocksSettingsDirty = true;
LLRadioGroup* socksAuth = getChild<LLRadioGroup>("socks5_auth_type");
if(socksAuth->getSelectedValue().asString() == "None")
{
getChild<LLLineEditor>("socks5_username")->setEnabled(false);
getChild<LLLineEditor>("socks5_password")->setEnabled(false);
}
else
{
getChild<LLLineEditor>("socks5_username")->setEnabled(true);
getChild<LLLineEditor>("socks5_password")->setEnabled(true);
}
LLRadioGroup* socksAuth = getChild<LLRadioGroup>("socks5_auth_type");
if(socksAuth->getSelectedValue().asString() == "None")
{
getChild<LLLineEditor>("socks5_username")->setEnabled(false);
getChild<LLLineEditor>("socks5_password")->setEnabled(false);
}
else
{
getChild<LLLineEditor>("socks5_username")->setEnabled(true);
getChild<LLLineEditor>("socks5_password")->setEnabled(true);
}
//Check for invalid states for the other http proxy radio
LLRadioGroup* otherHttpProxy = getChild<LLRadioGroup>("other_http_proxy_selection");
if( (otherHttpProxy->getSelectedValue().asString() == "Socks" &&
getChild<LLCheckBoxCtrl>("socks_proxy_enabled")->get() == FALSE )||(
otherHttpProxy->getSelectedValue().asString() == "Web" &&
getChild<LLCheckBoxCtrl>("web_proxy_enabled")->get() == FALSE ) )
{
otherHttpProxy->selectFirstItem();
}
//Check for invalid states for the other http proxy radio
LLRadioGroup* otherHttpProxy = getChild<LLRadioGroup>("other_http_proxy_selection");
if( (otherHttpProxy->getSelectedValue().asString() == "Socks" &&
getChild<LLCheckBoxCtrl>("socks_proxy_enabled")->get() == FALSE )||(
otherHttpProxy->getSelectedValue().asString() == "Web" &&
getChild<LLCheckBoxCtrl>("web_proxy_enabled")->get() == FALSE ) )
{
otherHttpProxy->selectFirstItem();
}
};
};

View File

@ -2770,18 +2770,18 @@ bool LLStartUp::handleSocksProxy(bool reportOK)
LLHost httpHost;
httpHost.setHostByName(gSavedSettings.getString("BrowserProxyAddress"));
httpHost.setPort(gSavedSettings.getS32("BrowserProxyPort"));
LLSocks::getInstance()->EnableHttpProxy(httpHost,LLPROXY_HTTP);
LLSocks::getInstance()->enableHttpProxy(httpHost,LLPROXY_HTTP);
}
else if ((httpProxyType.compare("Socks") == 0) && gSavedSettings.getBOOL("Socks5ProxyEnabled"))
{
LLHost httpHost;
httpHost.setHostByName(gSavedSettings.getString("Socks5ProxyHost"));
httpHost.setPort(gSavedSettings.getU32("Socks5ProxyPort"));
LLSocks::getInstance()->EnableHttpProxy(httpHost,LLPROXY_SOCKS);
LLSocks::getInstance()->enableHttpProxy(httpHost,LLPROXY_SOCKS);
}
else
{
LLSocks::getInstance()->DisableHttpProxy();
LLSocks::getInstance()->disableHttpProxy();
}
bool use_socks_proxy = gSavedSettings.getBOOL("Socks5ProxyEnabled");
@ -2843,7 +2843,7 @@ bool LLStartUp::handleSocksProxy(bool reportOK)
}
else
{
LLSocks::getInstance()->stopProxy(); //ensure no UDP proxy is running and its all cleaned up
LLSocks::getInstance()->stopProxy(); // ensure no UDP proxy is running and it's all cleaned up
}
return true;

View File

@ -319,15 +319,17 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)
{
mCurlRequest->setopt(CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
if(LLSocks::getInstance()->getSelectedAuthMethod()==METHOD_PASSWORD)
{
mCurlRequest->setoptString(CURLOPT_PROXYUSERPWD,LLSocks::getInstance()->getProxyUserPwd());
}
}
else
{
mCurlRequest->setopt(CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
}
mCurlRequest->setopt(CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
}
}
// mCurlRequest->setopt(CURLOPT_VERBOSE, 1); // usefull for debugging
// mCurlRequest->setopt(CURLOPT_VERBOSE, 1); // useful for debugging
mCurlRequest->setopt(CURLOPT_NOSIGNAL, 1);
mCurlRequest->setWriteCallback(&curlDownloadCallback, (void*)this);
BOOL vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert");

View File

@ -60,7 +60,7 @@
layout="topleft"
value="None"
width="120"
tool_tip="Non web Http trafic should NOT be sent to any proxy."/>
tool_tip="Non web Http traffic should NOT be sent to any proxy."/>
<radio_item
height="16"
label="Use Socks 5 Proxy"