mirror of
https://github.com/SoftEtherVPN/SoftEtherVPN.git
synced 2025-07-12 10:44:58 +03:00
Add support for SOCKS5 proxy protocol
This commit is contained in:
@ -3057,6 +3057,7 @@ void PcMain(PC *pc)
|
||||
{"AccountProxyNone", PcAccountProxyNone},
|
||||
{"AccountProxyHttp", PcAccountProxyHttp},
|
||||
{"AccountProxySocks", PcAccountProxySocks},
|
||||
{"AccountProxySocks5", PcAccountProxySocks5},
|
||||
{"AccountServerCertEnable", PcAccountServerCertEnable},
|
||||
{"AccountServerCertDisable", PcAccountServerCertDisable},
|
||||
{"AccountRetryOnServerCertEnable", PcAccountRetryOnServerCertEnable},
|
||||
@ -4075,6 +4076,8 @@ wchar_t *GetProtocolName(UINT n)
|
||||
return _UU("PROTO_HTTP_PROXY");
|
||||
case PROXY_SOCKS:
|
||||
return _UU("PROTO_SOCKS_PROXY");
|
||||
case PROXY_SOCKS5:
|
||||
return _UU("PROTO_SOCKS5_PROXY");
|
||||
}
|
||||
|
||||
return _UU("PROTO_UNKNOWN");
|
||||
@ -5239,7 +5242,7 @@ UINT PcAccountProxyHttp(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Set the connection method of the connection settings to the SOCKS proxy server connection
|
||||
// Set the connection method of the connection settings to the SOCKS4 proxy server connection
|
||||
UINT PcAccountProxySocks(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
{
|
||||
LIST *o;
|
||||
@ -5276,7 +5279,7 @@ UINT PcAccountProxySocks(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
UINT port;
|
||||
|
||||
// Data change
|
||||
if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 8080))
|
||||
if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 1080))
|
||||
{
|
||||
t.ClientOption->ProxyType = PROXY_SOCKS;
|
||||
StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
|
||||
@ -5311,6 +5314,78 @@ UINT PcAccountProxySocks(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Set the connection method of the connection settings to the SOCKS5 proxy server connection
|
||||
UINT PcAccountProxySocks5(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
{
|
||||
LIST *o;
|
||||
PC *pc = (PC *)param;
|
||||
UINT ret = ERR_NO_ERROR;
|
||||
RPC_CLIENT_GET_ACCOUNT t;
|
||||
// Parameter list that can be specified
|
||||
PARAM args[] =
|
||||
{
|
||||
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
||||
{"SERVER", CmdPrompt, _UU("CMD_AccountProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
|
||||
{"USERNAME", CmdPrompt, NULL, NULL, NULL},
|
||||
{"PASSWORD", CmdPrompt, NULL, NULL, NULL},
|
||||
};
|
||||
|
||||
// Get the parameter list
|
||||
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
||||
if (o == NULL)
|
||||
{
|
||||
return ERR_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
// RPC call
|
||||
Zero(&t, sizeof(t));
|
||||
|
||||
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
||||
|
||||
ret = CcGetAccount(pc->RemoteClient, &t);
|
||||
|
||||
if (ret == ERR_NO_ERROR)
|
||||
{
|
||||
RPC_CLIENT_CREATE_ACCOUNT z;
|
||||
char *host;
|
||||
UINT port;
|
||||
|
||||
// Data change
|
||||
if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 1080))
|
||||
{
|
||||
t.ClientOption->ProxyType = PROXY_SOCKS5;
|
||||
StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
|
||||
t.ClientOption->ProxyPort = port;
|
||||
StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
|
||||
StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
|
||||
Free(host);
|
||||
}
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
z.StartupAccount = t.StartupAccount;
|
||||
|
||||
ret = CcSetAccount(pc->RemoteClient, &z);
|
||||
}
|
||||
|
||||
if (ret != ERR_NO_ERROR)
|
||||
{
|
||||
// Error has occurred
|
||||
CmdPrintError(c, ret);
|
||||
}
|
||||
|
||||
CiFreeClientGetAccount(&t);
|
||||
|
||||
// Release of the parameter list
|
||||
FreeParamValueList(o);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Enable validation option for server certificate of connection settings
|
||||
UINT PcAccountServerCertEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
{
|
||||
@ -7403,6 +7478,7 @@ void PsMain(PS *ps)
|
||||
{"CascadeProxyNone", PsCascadeProxyNone},
|
||||
{"CascadeProxyHttp", PsCascadeProxyHttp},
|
||||
{"CascadeProxySocks", PsCascadeProxySocks},
|
||||
{"CascadeProxySocks5", PsCascadeProxySocks5},
|
||||
{"CascadeServerCertEnable", PsCascadeServerCertEnable},
|
||||
{"CascadeServerCertDisable", PsCascadeServerCertDisable},
|
||||
{"CascadeServerCertSet", PsCascadeServerCertSet},
|
||||
@ -13644,7 +13720,7 @@ UINT PsCascadeProxyHttp(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Set the cascade connection method as the mode via SOCKS proxy server
|
||||
// Set the cascade connection method as the mode via SOCKS4 proxy server
|
||||
UINT PsCascadeProxySocks(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
{
|
||||
LIST *o;
|
||||
@ -13695,7 +13771,7 @@ UINT PsCascadeProxySocks(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
UINT port;
|
||||
|
||||
// Data change
|
||||
if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 8080))
|
||||
if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 1080))
|
||||
{
|
||||
t.ClientOption->ProxyType = PROXY_SOCKS;
|
||||
StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
|
||||
@ -13722,6 +13798,84 @@ UINT PsCascadeProxySocks(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Set the cascade connection method as the mode via SOCKS5 proxy server
|
||||
UINT PsCascadeProxySocks5(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
{
|
||||
LIST *o;
|
||||
PS *ps = (PS *)param;
|
||||
UINT ret = 0;
|
||||
RPC_CREATE_LINK t;
|
||||
// Parameter list that can be specified
|
||||
PARAM args[] =
|
||||
{
|
||||
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
||||
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
||||
{"SERVER", CmdPrompt, _UU("CMD_CascadeProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
|
||||
{"USERNAME", NULL, NULL, NULL, NULL},
|
||||
{"PASSWORD", NULL, NULL, NULL, NULL},
|
||||
};
|
||||
|
||||
// If virtual HUB is not selected, it's an error
|
||||
if (ps->HubName == NULL)
|
||||
{
|
||||
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
||||
return ERR_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
||||
if (o == NULL)
|
||||
{
|
||||
return ERR_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Zero(&t, sizeof(t));
|
||||
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
||||
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
||||
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
||||
|
||||
// RPC call
|
||||
ret = ScGetLink(ps->Rpc, &t);
|
||||
|
||||
if (ret != ERR_NO_ERROR)
|
||||
{
|
||||
// An error has occured
|
||||
CmdPrintError(c, ret);
|
||||
FreeParamValueList(o);
|
||||
return ret;
|
||||
}
|
||||
else
|
||||
{
|
||||
char *host;
|
||||
UINT port;
|
||||
|
||||
// Data change
|
||||
if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 1080))
|
||||
{
|
||||
t.ClientOption->ProxyType = PROXY_SOCKS5;
|
||||
StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
|
||||
t.ClientOption->ProxyPort = port;
|
||||
StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
|
||||
StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
|
||||
Free(host);
|
||||
}
|
||||
|
||||
ret = ScSetLink(ps->Rpc, &t);
|
||||
if (ret != ERR_NO_ERROR)
|
||||
{
|
||||
// An error has occured
|
||||
CmdPrintError(c, ret);
|
||||
FreeParamValueList(o);
|
||||
return ret;
|
||||
}
|
||||
|
||||
FreeRpcCreateLink(&t);
|
||||
}
|
||||
|
||||
FreeParamValueList(o);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Enable the validation options for the server certificate of cascade connection
|
||||
UINT PsCascadeServerCertEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
{
|
||||
|
Reference in New Issue
Block a user