mirror of
https://github.com/SoftEtherVPN/SoftEtherVPN.git
synced 2025-07-06 07:44:57 +03:00
Retry connection on untrusted server certificate
With server certificate validation enabled, vpnclient unconditionally stopped connection on untrusted server certificate. Added account configuration parameter to retry connection if server certivicate failed validation.
This commit is contained in:
committed by
Davide Beatrici
parent
828d3b2ffb
commit
28e8d4bcce
@ -6242,6 +6242,7 @@ void CmExportAccount(HWND hWnd, wchar_t *account_name)
|
||||
t.ClientAuth = a->ClientAuth;
|
||||
t.StartupAccount = a->Startup;
|
||||
t.CheckServerCert = a->CheckServerCert;
|
||||
t.RetryOnServerCert = a->RetryOnServerCert;
|
||||
t.ServerCert = a->ServerCert;
|
||||
t.ClientOption->FromAdminPack = false;
|
||||
|
||||
@ -6381,6 +6382,7 @@ void CmImportAccountMainEx(HWND hWnd, wchar_t *filename, bool overwrite)
|
||||
// Other Settings
|
||||
t->StartupAccount = get.StartupAccount;
|
||||
t->CheckServerCert = get.CheckServerCert;
|
||||
t->RetryOnServerCert = get.RetryOnServerCert;
|
||||
if (t->ServerCert != NULL)
|
||||
{
|
||||
FreeX(t->ServerCert);
|
||||
@ -6489,6 +6491,7 @@ void CmCopyAccount(HWND hWnd, wchar_t *account_name)
|
||||
c.ServerCert = CloneX(a->ServerCert);
|
||||
}
|
||||
c.CheckServerCert = a->CheckServerCert;
|
||||
c.RetryOnServerCert = a->RetryOnServerCert;
|
||||
c.StartupAccount = false; // Don't copy the startup attribute
|
||||
|
||||
CALL(hWnd, CcCreateAccount(cm->Client, &c));
|
||||
@ -8899,6 +8902,7 @@ CM_ACCOUNT *CmGetExistAccountObject(HWND hWnd, wchar_t *account_name)
|
||||
a = ZeroMalloc(sizeof(CM_ACCOUNT));
|
||||
a->EditMode = true;
|
||||
a->CheckServerCert = c.CheckServerCert;
|
||||
a->RetryOnServerCert = c.RetryOnServerCert;
|
||||
a->Startup = c.StartupAccount;
|
||||
if (c.ServerCert != NULL)
|
||||
{
|
||||
@ -8928,6 +8932,7 @@ CM_ACCOUNT *CmCreateNewAccountObject(HWND hWnd)
|
||||
a = ZeroMalloc(sizeof(CM_ACCOUNT));
|
||||
a->EditMode = false;
|
||||
a->CheckServerCert = false;
|
||||
a->RetryOnServerCert = false;
|
||||
a->Startup = false;
|
||||
a->ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
||||
|
||||
|
@ -236,6 +236,7 @@ typedef struct CM_ACCOUNT
|
||||
CLIENT_AUTH *ClientAuth; // Authentication data
|
||||
bool Startup; // Startup account
|
||||
bool CheckServerCert; // Check the server certificate
|
||||
bool RetryOnServerCert; // Retry on invalid server certificate
|
||||
X *ServerCert; // Server certificate
|
||||
char old_server_name[MAX_HOST_NAME_LEN + 1]; // Old server name
|
||||
bool Inited; // Initialization flag
|
||||
|
@ -2144,6 +2144,7 @@ RPC_CLIENT_CREATE_ACCOUNT *CiCfgToAccount(BUF *b)
|
||||
t->ClientAuth = a->ClientAuth;
|
||||
t->StartupAccount = a->StartupAccount;
|
||||
t->CheckServerCert = a->CheckServerCert;
|
||||
t->RetryOnServerCert = a->RetryOnServerCert;
|
||||
t->ServerCert = a->ServerCert;
|
||||
Free(a);
|
||||
|
||||
@ -2167,6 +2168,7 @@ BUF *CiAccountToCfg(RPC_CLIENT_CREATE_ACCOUNT *t)
|
||||
a.ClientOption = t->ClientOption;
|
||||
a.ClientAuth = t->ClientAuth;
|
||||
a.CheckServerCert = t->CheckServerCert;
|
||||
a.RetryOnServerCert = t->RetryOnServerCert;
|
||||
a.ServerCert = t->ServerCert;
|
||||
a.StartupAccount = t->StartupAccount;
|
||||
|
||||
@ -4704,6 +4706,7 @@ void InRpcClientCreateAccount(RPC_CLIENT_CREATE_ACCOUNT *c, PACK *p)
|
||||
|
||||
c->StartupAccount = PackGetInt(p, "StartupAccount") ? true : false;
|
||||
c->CheckServerCert = PackGetInt(p, "CheckServerCert") ? true : false;
|
||||
c->RetryOnServerCert = PackGetInt(p, "RetryOnServerCert") ? true : false;
|
||||
b = PackGetBuf(p, "ServerCert");
|
||||
if (b != NULL)
|
||||
{
|
||||
@ -4726,6 +4729,7 @@ void OutRpcClientCreateAccount(PACK *p, RPC_CLIENT_CREATE_ACCOUNT *c)
|
||||
|
||||
PackAddInt(p, "StartupAccount", c->StartupAccount);
|
||||
PackAddInt(p, "CheckServerCert", c->CheckServerCert);
|
||||
PackAddInt(p, "RetryOnServerCert", c->RetryOnServerCert);
|
||||
if (c->ServerCert != NULL)
|
||||
{
|
||||
b = XToBuf(c->ServerCert, false);
|
||||
@ -4873,6 +4877,7 @@ void InRpcClientGetAccount(RPC_CLIENT_GET_ACCOUNT *c, PACK *p)
|
||||
PackGetUniStr(p, "AccountName", c->AccountName, sizeof(c->AccountName));
|
||||
c->StartupAccount = PackGetInt(p, "StartupAccount") ? true : false;
|
||||
c->CheckServerCert = PackGetInt(p, "CheckServerCert") ? true : false;
|
||||
c->RetryOnServerCert = PackGetInt(p, "RetryOnServerCert") ? true : false;
|
||||
b = PackGetBuf(p, "ServerCert");
|
||||
if (b != NULL)
|
||||
{
|
||||
@ -4901,6 +4906,7 @@ void OutRpcClientGetAccount(PACK *p, RPC_CLIENT_GET_ACCOUNT *c)
|
||||
PackAddUniStr(p, "AccountName", c->AccountName);
|
||||
PackAddInt(p, "StartupAccount", c->StartupAccount);
|
||||
PackAddInt(p, "CheckServerCert", c->CheckServerCert);
|
||||
PackAddInt(p, "RetryOnServerCert", c->RetryOnServerCert);
|
||||
|
||||
if (c->ServerCert != NULL)
|
||||
{
|
||||
@ -6724,6 +6730,7 @@ bool CtGetAccount(CLIENT *c, RPC_CLIENT_GET_ACCOUNT *a)
|
||||
a->StartupAccount = r->StartupAccount;
|
||||
|
||||
a->CheckServerCert = r->CheckServerCert;
|
||||
a->RetryOnServerCert = r->RetryOnServerCert;
|
||||
a->ServerCert = NULL;
|
||||
if (r->ServerCert != NULL)
|
||||
{
|
||||
@ -7250,6 +7257,7 @@ bool CtSetAccount(CLIENT *c, RPC_CLIENT_CREATE_ACCOUNT *a, bool inner)
|
||||
ret->StartupAccount = a->StartupAccount;
|
||||
|
||||
ret->CheckServerCert = a->CheckServerCert;
|
||||
ret->RetryOnServerCert = a->RetryOnServerCert;
|
||||
|
||||
if (a->ServerCert != NULL)
|
||||
{
|
||||
@ -7356,6 +7364,7 @@ bool CtCreateAccount(CLIENT *c, RPC_CLIENT_CREATE_ACCOUNT *a, bool inner)
|
||||
new_account->StartupAccount = a->StartupAccount;
|
||||
|
||||
new_account->CheckServerCert = a->CheckServerCert;
|
||||
new_account->RetryOnServerCert = a->RetryOnServerCert;
|
||||
if (a->ServerCert != NULL)
|
||||
{
|
||||
new_account->ServerCert = CloneX(a->ServerCert);
|
||||
@ -9530,6 +9539,7 @@ ACCOUNT *CiLoadClientAccount(FOLDER *f)
|
||||
|
||||
a->StartupAccount = CfgGetBool(f, "StartupAccount");
|
||||
a->CheckServerCert = CfgGetBool(f, "CheckServerCert");
|
||||
a->RetryOnServerCert = CfgGetBool(f, "RetryOnServerCert");
|
||||
a->CreateDateTime = CfgGetInt64(f, "CreateDateTime");
|
||||
a->UpdateDateTime = CfgGetInt64(f, "UpdateDateTime");
|
||||
a->LastConnectDateTime = CfgGetInt64(f, "LastConnectDateTime");
|
||||
@ -10145,6 +10155,9 @@ void CiWriteAccountData(FOLDER *f, ACCOUNT *a)
|
||||
// Server certificate check flag
|
||||
CfgAddBool(f, "CheckServerCert", a->CheckServerCert);
|
||||
|
||||
// Retry on invalid server certificate flag
|
||||
CfgAddBool(f, "RetryOnServerCert", a->RetryOnServerCert);
|
||||
|
||||
// Date and time
|
||||
CfgAddInt64(f, "CreateDateTime", a->CreateDateTime);
|
||||
CfgAddInt64(f, "UpdateDateTime", a->UpdateDateTime);
|
||||
|
@ -170,6 +170,7 @@ struct ACCOUNT
|
||||
CLIENT_OPTION *ClientOption; // Client Option
|
||||
CLIENT_AUTH *ClientAuth; // Client authentication data
|
||||
bool CheckServerCert; // Check the server certificate
|
||||
bool RetryOnServerCert; // Retry on invalid server certificate
|
||||
X *ServerCert; // Server certificate
|
||||
bool StartupAccount; // Start-up account
|
||||
UCHAR ShortcutKey[SHA1_SIZE]; // Key
|
||||
@ -347,6 +348,7 @@ struct RPC_CLIENT_CREATE_ACCOUNT
|
||||
CLIENT_AUTH *ClientAuth; // Client authentication data
|
||||
bool StartupAccount; // Startup account
|
||||
bool CheckServerCert; // Checking of the server certificate
|
||||
bool RetryOnServerCert; // Retry on invalid server certificate
|
||||
X *ServerCert; // Server certificate
|
||||
UCHAR ShortcutKey[SHA1_SIZE]; // Shortcut Key
|
||||
};
|
||||
@ -399,6 +401,7 @@ struct RPC_CLIENT_GET_ACCOUNT
|
||||
CLIENT_AUTH *ClientAuth; // Client authentication data
|
||||
bool StartupAccount; // Startup account
|
||||
bool CheckServerCert; // Check the server certificate
|
||||
bool RetryOnServerCert; // Retry on invalid server certificate
|
||||
X *ServerCert; // Server certificate
|
||||
UCHAR ShortcutKey[SHA1_SIZE]; // Shortcut Key
|
||||
UINT64 CreateDateTime; // Creation date and time (Ver 3.0 or later)
|
||||
|
@ -3100,6 +3100,8 @@ void PcMain(PC *pc)
|
||||
{"AccountProxySocks", PcAccountProxySocks},
|
||||
{"AccountServerCertEnable", PcAccountServerCertEnable},
|
||||
{"AccountServerCertDisable", PcAccountServerCertDisable},
|
||||
{"AccountRetryOnServerCertEnable", PcAccountRetryOnServerCertEnable},
|
||||
{"AccountRetryOnServerCertDisable", PcAccountRetryOnServerCertDisable},
|
||||
{"AccountServerCertSet", PcAccountServerCertSet},
|
||||
{"AccountServerCertDelete", PcAccountServerCertDelete},
|
||||
{"AccountServerCertGet", PcAccountServerCertGet},
|
||||
@ -4328,6 +4330,7 @@ UINT PcAccountSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
c.ClientAuth = t.ClientAuth;
|
||||
c.ClientOption = t.ClientOption;
|
||||
c.CheckServerCert = t.CheckServerCert;
|
||||
c.RetryOnServerCert = t.RetryOnServerCert;
|
||||
c.ServerCert = t.ServerCert;
|
||||
c.StartupAccount = t.StartupAccount;
|
||||
|
||||
@ -4427,6 +4430,12 @@ UINT PcAccountGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_NAME"), tmp);
|
||||
}
|
||||
|
||||
if (t.CheckServerCert)
|
||||
{
|
||||
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_RETRY_ON_SERVER_CERT"),
|
||||
t.RetryOnServerCert ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
||||
}
|
||||
|
||||
// Device name to be used for the connection
|
||||
StrToUni(tmp, sizeof(tmp), t.ClientOption->DeviceName);
|
||||
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_DEVICE_NAME"), tmp);
|
||||
@ -4597,6 +4606,7 @@ UINT PcAccountUsernameSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -4654,6 +4664,7 @@ UINT PcAccountAnonymousSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -4735,6 +4746,7 @@ UINT PcAccountPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
{
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -4813,6 +4825,7 @@ UINT PcAccountCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -4933,6 +4946,7 @@ UINT PcAccountEncryptDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *par
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -4990,6 +5004,7 @@ UINT PcAccountEncryptEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *para
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -5047,6 +5062,7 @@ UINT PcAccountCompressEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *par
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -5104,6 +5120,7 @@ UINT PcAccountCompressDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *pa
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -5161,6 +5178,7 @@ UINT PcAccountProxyNone(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -5232,6 +5250,7 @@ UINT PcAccountProxyHttp(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -5303,6 +5322,7 @@ UINT PcAccountProxySocks(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -5360,6 +5380,7 @@ UINT PcAccountServerCertEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *p
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -5417,6 +5438,123 @@ UINT PcAccountServerCertDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *
|
||||
|
||||
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 retry option of the invalid server certificate of connection settings
|
||||
UINT PcAccountRetryOnServerCertEnable(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},
|
||||
};
|
||||
|
||||
// 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;
|
||||
// Change the settings
|
||||
t.RetryOnServerCert = true;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
// Disable retry option of the invalid server certificate of connection settings
|
||||
UINT PcAccountRetryOnServerCertDisable(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},
|
||||
};
|
||||
|
||||
// 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;
|
||||
// Change the settings
|
||||
t.RetryOnServerCert = false;
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -5488,6 +5626,7 @@ UINT PcAccountServerCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *para
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -5551,6 +5690,7 @@ UINT PcAccountServerCertDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *p
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -5613,6 +5753,7 @@ UINT PcAccountServerCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *para
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -5946,6 +6087,7 @@ UINT PcAccountNicSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
c.ClientAuth = t.ClientAuth;
|
||||
c.ClientOption = t.ClientOption;
|
||||
c.CheckServerCert = t.CheckServerCert;
|
||||
c.RetryOnServerCert = t.RetryOnServerCert;
|
||||
c.ServerCert = t.ServerCert;
|
||||
c.StartupAccount = t.StartupAccount;
|
||||
|
||||
@ -6001,6 +6143,7 @@ UINT PcAccountStatusShow(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -6058,6 +6201,7 @@ UINT PcAccountStatusHide(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -6121,6 +6265,7 @@ UINT PcAccountSecureCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *para
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -6190,6 +6335,7 @@ UINT PcAccountRetrySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -6248,6 +6394,7 @@ UINT PcAccountStartupSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
@ -6305,6 +6452,7 @@ UINT PcAccountStartupRemove(CONSOLE *c, char *cmd_name, wchar_t *str, void *para
|
||||
|
||||
Zero(&z, sizeof(z));
|
||||
z.CheckServerCert = t.CheckServerCert;
|
||||
z.RetryOnServerCert = t.RetryOnServerCert;
|
||||
z.ClientAuth = t.ClientAuth;
|
||||
z.ClientOption = t.ClientOption;
|
||||
z.ServerCert = t.ServerCert;
|
||||
|
@ -464,6 +464,8 @@ UINT PcAccountProxyHttp(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
||||
UINT PcAccountProxySocks(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
||||
UINT PcAccountServerCertEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
||||
UINT PcAccountServerCertDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
||||
UINT PcAccountRetryOnServerCertEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
||||
UINT PcAccountRetryOnServerCertDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
||||
UINT PcAccountServerCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
||||
UINT PcAccountServerCertDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
||||
UINT PcAccountServerCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
||||
|
@ -4916,7 +4916,8 @@ REDIRECTED:
|
||||
c->Err = ERR_SERVER_CERT_EXPIRES;
|
||||
}
|
||||
|
||||
if (c->Session->LinkModeClient == false && c->Err == ERR_CERT_NOT_TRUSTED)
|
||||
if (c->Session->LinkModeClient == false && c->Err == ERR_CERT_NOT_TRUSTED
|
||||
&& (c->Session->Account == NULL || ! c->Session->Account->RetryOnServerCert))
|
||||
{
|
||||
c->Session->ForceStopFlag = true;
|
||||
}
|
||||
|
Reference in New Issue
Block a user