mirror of https://github.com/OpenVPN/openvpn-gui
Add a button for detaching from the management interface
Useful for releasing the management interface if the user wants to connect to it by other means. Detached connections are set to state = detached (no disconnected) and auto_connect disabled, so that they could be handled properly during a re-attach. Signed-off-by: Selva Nair <selva.nair@gmail.com>pull/519/head
parent
0e76e4b544
commit
7f794eec3d
6
main.c
6
main.c
|
@ -358,7 +358,7 @@ StopAllOpenVPN()
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < o.num_configs; i++)
|
for (i = 0; i < o.num_configs; i++)
|
||||||
{
|
{
|
||||||
if (o.conn[i].state != disconnected)
|
if (o.conn[i].state != disconnected && o.conn[i].state != detached)
|
||||||
{
|
{
|
||||||
if (o.conn[i].flags & FLAG_DAEMON_PERSISTENT)
|
if (o.conn[i].flags & FLAG_DAEMON_PERSISTENT)
|
||||||
{
|
{
|
||||||
|
@ -374,7 +374,7 @@ StopAllOpenVPN()
|
||||||
/* Wait for all connections to terminate (Max 5 sec) */
|
/* Wait for all connections to terminate (Max 5 sec) */
|
||||||
for (i = 0; i < 20; i++, Sleep(250))
|
for (i = 0; i < 20; i++, Sleep(250))
|
||||||
{
|
{
|
||||||
if (CountConnState(disconnected) == o.num_configs)
|
if (CountConnState(disconnected) + CountConnState(detached) == o.num_configs)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -522,7 +522,7 @@ ManagePersistent(HWND hwnd, UINT UNUSED msg, UINT_PTR id, DWORD UNUSED now)
|
||||||
{
|
{
|
||||||
if (o.conn[i].flags & FLAG_DAEMON_PERSISTENT
|
if (o.conn[i].flags & FLAG_DAEMON_PERSISTENT
|
||||||
&& o.conn[i].auto_connect
|
&& o.conn[i].auto_connect
|
||||||
&& o.conn[i].state == disconnected)
|
&& (o.conn[i].state == disconnected || o.conn[i].state == detached))
|
||||||
{
|
{
|
||||||
/* disable auto-connect to avoid repeated re-connect
|
/* disable auto-connect to avoid repeated re-connect
|
||||||
* after unrecoverable errors. Re-enabled on successful
|
* after unrecoverable errors. Re-enabled on successful
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
#define ID_RESTART 164
|
#define ID_RESTART 164
|
||||||
#define ID_HIDE 165
|
#define ID_HIDE 165
|
||||||
#define ID_TXT_VERSION 166
|
#define ID_TXT_VERSION 166
|
||||||
|
#define ID_DETACH 167
|
||||||
#define ID_TXT_BYTECOUNT 168
|
#define ID_TXT_BYTECOUNT 168
|
||||||
#define ID_TXT_IP 169
|
#define ID_TXT_IP 169
|
||||||
|
|
||||||
|
|
40
openvpn.c
40
openvpn.c
|
@ -140,7 +140,8 @@ void
|
||||||
OnHold(connection_t *c, UNUSED char *msg)
|
OnHold(connection_t *c, UNUSED char *msg)
|
||||||
{
|
{
|
||||||
EnableWindow(GetDlgItem(c->hwndStatus, ID_RESTART), TRUE);
|
EnableWindow(GetDlgItem(c->hwndStatus, ID_RESTART), TRUE);
|
||||||
if ((c->flags & FLAG_DAEMON_PERSISTENT) && (c->state == disconnecting))
|
if ((c->flags & FLAG_DAEMON_PERSISTENT)
|
||||||
|
&& (c->state == disconnecting || c->state == resuming))
|
||||||
{
|
{
|
||||||
/* retain the hold state if we are here while disconnecting */
|
/* retain the hold state if we are here while disconnecting */
|
||||||
c->state = onhold;
|
c->state = onhold;
|
||||||
|
@ -1343,11 +1344,25 @@ OnStop(connection_t *c, UNUSED char *msg)
|
||||||
c->failed_psw_attempts = 0;
|
c->failed_psw_attempts = 0;
|
||||||
c->failed_auth_attempts = 0;
|
c->failed_auth_attempts = 0;
|
||||||
c->state = disconnected;
|
c->state = disconnected;
|
||||||
|
if (c->flags & FLAG_DAEMON_PERSISTENT)
|
||||||
|
{
|
||||||
|
/* user initiated disconnection -- stay detached and do not auto-reconnect */
|
||||||
|
c->state = detached;
|
||||||
|
c->auto_connect = false;
|
||||||
|
}
|
||||||
CheckAndSetTrayIcon();
|
CheckAndSetTrayIcon();
|
||||||
SetDlgItemText(c->hwndStatus, ID_TXT_STATUS, LoadLocalizedString(IDS_NFO_STATE_DISCONNECTED));
|
SetDlgItemText(c->hwndStatus, ID_TXT_STATUS, LoadLocalizedString(IDS_NFO_STATE_DISCONNECTED));
|
||||||
SendMessage(c->hwndStatus, WM_CLOSE, 0, 0);
|
SendMessage(c->hwndStatus, WM_CLOSE, 0, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case onhold:
|
||||||
|
/* stop triggered while on hold -- possibly the daemon exited. Treat same as detaching */
|
||||||
|
case detaching:
|
||||||
|
c->state = detached;
|
||||||
|
CheckAndSetTrayIcon();
|
||||||
|
SendMessage(c->hwndStatus, WM_CLOSE, 0, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
case suspending:
|
case suspending:
|
||||||
c->state = suspended;
|
c->state = suspended;
|
||||||
CheckAndSetTrayIcon();
|
CheckAndSetTrayIcon();
|
||||||
|
@ -1844,6 +1859,7 @@ RenderStatusWindow(HWND hwndDlg, UINT w, UINT h)
|
||||||
MoveWindow(GetDlgItem(hwndDlg, ID_TXT_VERSION), w-DPI_SCALE(180), h - DPI_SCALE(55), DPI_SCALE(170), DPI_SCALE(15), TRUE);
|
MoveWindow(GetDlgItem(hwndDlg, ID_TXT_VERSION), w-DPI_SCALE(180), h - DPI_SCALE(55), DPI_SCALE(170), DPI_SCALE(15), TRUE);
|
||||||
MoveWindow(GetDlgItem(hwndDlg, ID_DISCONNECT), DPI_SCALE(20), h - DPI_SCALE(30), DPI_SCALE(110), DPI_SCALE(23), TRUE);
|
MoveWindow(GetDlgItem(hwndDlg, ID_DISCONNECT), DPI_SCALE(20), h - DPI_SCALE(30), DPI_SCALE(110), DPI_SCALE(23), TRUE);
|
||||||
MoveWindow(GetDlgItem(hwndDlg, ID_RESTART), DPI_SCALE(145), h - DPI_SCALE(30), DPI_SCALE(110), DPI_SCALE(23), TRUE);
|
MoveWindow(GetDlgItem(hwndDlg, ID_RESTART), DPI_SCALE(145), h - DPI_SCALE(30), DPI_SCALE(110), DPI_SCALE(23), TRUE);
|
||||||
|
MoveWindow(GetDlgItem(hwndDlg, ID_DETACH), DPI_SCALE(270), h - DPI_SCALE(30), DPI_SCALE(110), DPI_SCALE(23), TRUE);
|
||||||
MoveWindow(GetDlgItem(hwndDlg, ID_HIDE), w - DPI_SCALE(130), h - DPI_SCALE(30), DPI_SCALE(110), DPI_SCALE(23), TRUE);
|
MoveWindow(GetDlgItem(hwndDlg, ID_HIDE), w - DPI_SCALE(130), h - DPI_SCALE(30), DPI_SCALE(110), DPI_SCALE(23), TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1908,6 +1924,14 @@ StatusDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
rect.top + rand()%100, 0, 0, SWP_NOSIZE);
|
rect.top + rand()%100, 0, 0, SWP_NOSIZE);
|
||||||
GetClientRect(hwndDlg, &rect);
|
GetClientRect(hwndDlg, &rect);
|
||||||
RenderStatusWindow(hwndDlg, rect.right, rect.bottom);
|
RenderStatusWindow(hwndDlg, rect.right, rect.bottom);
|
||||||
|
if (c->flags & FLAG_DAEMON_PERSISTENT && o.enable_persistent > 0)
|
||||||
|
{
|
||||||
|
EnableWindow(GetDlgItem(hwndDlg, ID_DETACH), TRUE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ShowWindow(GetDlgItem(hwndDlg, ID_DETACH), SW_HIDE);
|
||||||
|
}
|
||||||
/* Set focus on the LogWindow so it scrolls automatically */
|
/* Set focus on the LogWindow so it scrolls automatically */
|
||||||
SetFocus(hLogWnd);
|
SetFocus(hLogWnd);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -1944,6 +1968,11 @@ StatusDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
SetFocus(GetDlgItem(c->hwndStatus, ID_EDT_LOG));
|
SetFocus(GetDlgItem(c->hwndStatus, ID_EDT_LOG));
|
||||||
RestartOpenVPN(c);
|
RestartOpenVPN(c);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
case ID_DETACH:
|
||||||
|
SetFocus(GetDlgItem(c->hwndStatus, ID_EDT_LOG));
|
||||||
|
DetachOpenVPN(c);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1958,7 +1987,7 @@ StatusDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
|
|
||||||
case WM_CLOSE:
|
case WM_CLOSE:
|
||||||
c = (connection_t *) GetProp(hwndDlg, cfgProp);
|
c = (connection_t *) GetProp(hwndDlg, cfgProp);
|
||||||
if (c->state != disconnected)
|
if (c->state != disconnected && c->state != detached)
|
||||||
ShowWindow(hwndDlg, SW_HIDE);
|
ShowWindow(hwndDlg, SW_HIDE);
|
||||||
else
|
else
|
||||||
DestroyWindow(hwndDlg);
|
DestroyWindow(hwndDlg);
|
||||||
|
@ -2004,7 +2033,7 @@ StatusDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
case WM_OVPN_DETACH:
|
case WM_OVPN_DETACH:
|
||||||
c = (connection_t *) GetProp(hwndDlg, cfgProp);
|
c = (connection_t *) GetProp(hwndDlg, cfgProp);
|
||||||
/* just stop the thread keeping openvpn.exe running */
|
/* just stop the thread keeping openvpn.exe running */
|
||||||
c->state = disconnecting;
|
c->state = detaching;
|
||||||
EnableWindow(GetDlgItem(c->hwndStatus, ID_DISCONNECT), FALSE);
|
EnableWindow(GetDlgItem(c->hwndStatus, ID_DISCONNECT), FALSE);
|
||||||
EnableWindow(GetDlgItem(c->hwndStatus, ID_RESTART), FALSE);
|
EnableWindow(GetDlgItem(c->hwndStatus, ID_RESTART), FALSE);
|
||||||
OnStop(c, NULL);
|
OnStop(c, NULL);
|
||||||
|
@ -2071,7 +2100,7 @@ ThreadOpenVPNStatus(void *p)
|
||||||
_tcsncpy(conn_name, c->config_file, _countof(conn_name));
|
_tcsncpy(conn_name, c->config_file, _countof(conn_name));
|
||||||
conn_name[_tcslen(conn_name) - _tcslen(o.ext_string) - 1] = _T('\0');
|
conn_name[_tcslen(conn_name) - _tcslen(o.ext_string) - 1] = _T('\0');
|
||||||
|
|
||||||
c->state = ((c->state == suspended) ? resuming : connecting);
|
c->state = (c->state == suspended || c->state == detached) ? resuming : connecting;
|
||||||
|
|
||||||
/* Create and Show Status Dialog */
|
/* Create and Show Status Dialog */
|
||||||
c->hwndStatus = CreateLocalizedDialogParam(ID_DLG_STATUS, StatusDialogFunc, (LPARAM) c);
|
c->hwndStatus = CreateLocalizedDialogParam(ID_DLG_STATUS, StatusDialogFunc, (LPARAM) c);
|
||||||
|
@ -2271,7 +2300,7 @@ StartOpenVPN(connection_t *c)
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
else if (c->state != disconnected)
|
else if (c->state != disconnected && c->state != detached)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -2517,6 +2546,7 @@ DetachOpenVPN(connection_t *c)
|
||||||
/* currently supported only for persistent connections */
|
/* currently supported only for persistent connections */
|
||||||
if (c->flags & FLAG_DAEMON_PERSISTENT)
|
if (c->flags & FLAG_DAEMON_PERSISTENT)
|
||||||
{
|
{
|
||||||
|
c->auto_connect = false;
|
||||||
PostMessage(c->hwndStatus, WM_OVPN_DETACH, 0, 0);
|
PostMessage(c->hwndStatus, WM_OVPN_DETACH, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,6 +73,8 @@ typedef enum {
|
||||||
suspending,
|
suspending,
|
||||||
suspended,
|
suspended,
|
||||||
resuming,
|
resuming,
|
||||||
|
detaching,
|
||||||
|
detached,
|
||||||
} conn_state_t;
|
} conn_state_t;
|
||||||
|
|
||||||
/* Interactive Service IO parameters */
|
/* Interactive Service IO parameters */
|
||||||
|
|
|
@ -102,6 +102,7 @@ BEGIN
|
||||||
LTEXT "", ID_TXT_IP, 20, 160, 300, 10
|
LTEXT "", ID_TXT_IP, 20, 160, 300, 10
|
||||||
PUSHBUTTON "&Disconnect", ID_DISCONNECT, 50, 190, 50, 14
|
PUSHBUTTON "&Disconnect", ID_DISCONNECT, 50, 190, 50, 14
|
||||||
PUSHBUTTON "&Reconnect", ID_RESTART, 150, 190, 50, 14
|
PUSHBUTTON "&Reconnect", ID_RESTART, 150, 190, 50, 14
|
||||||
|
PUSHBUTTON "De&tach", ID_DETACH, 180, 190, 50, 14, WS_DISABLED
|
||||||
PUSHBUTTON "&Hide", ID_HIDE, 100, 190, 50, 14
|
PUSHBUTTON "&Hide", ID_HIDE, 100, 190, 50, 14
|
||||||
END
|
END
|
||||||
|
|
||||||
|
|
6
tray.c
6
tray.c
|
@ -511,11 +511,11 @@ SetMenuStatusById(int i, conn_state_t state)
|
||||||
int checked = 0;
|
int checked = 0;
|
||||||
|
|
||||||
if (state == connected || state == disconnecting) checked = 1;
|
if (state == connected || state == disconnecting) checked = 1;
|
||||||
else if (state != disconnected) checked = 2;
|
else if (state != disconnected && state != detached && state != onhold) checked = 2;
|
||||||
|
|
||||||
if (o.num_configs == 1)
|
if (o.num_configs == 1)
|
||||||
{
|
{
|
||||||
if (state == disconnected)
|
if (state == disconnected || state == detached)
|
||||||
{
|
{
|
||||||
EnableMenuItem(hMenu, IDM_CONNECTMENU, MF_ENABLED);
|
EnableMenuItem(hMenu, IDM_CONNECTMENU, MF_ENABLED);
|
||||||
EnableMenuItem(hMenu, IDM_DISCONNECTMENU, MF_GRAYED);
|
EnableMenuItem(hMenu, IDM_DISCONNECTMENU, MF_GRAYED);
|
||||||
|
@ -581,7 +581,7 @@ SetMenuStatusById(int i, conn_state_t state)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state == disconnected)
|
if (state == disconnected || state == detached)
|
||||||
{
|
{
|
||||||
EnableMenuItem(hMenuConn[i], IDM_CONNECTMENU, MF_ENABLED);
|
EnableMenuItem(hMenuConn[i], IDM_CONNECTMENU, MF_ENABLED);
|
||||||
EnableMenuItem(hMenuConn[i], IDM_DISCONNECTMENU, MF_GRAYED);
|
EnableMenuItem(hMenuConn[i], IDM_DISCONNECTMENU, MF_GRAYED);
|
||||||
|
|
Loading…
Reference in New Issue