Skip to content

Commit

Permalink
Detach persistent connections on switch user
Browse files Browse the repository at this point in the history
This allows a new user to attach to the mgmt i/f of
persistent connections which would be otherwise blocked
by the previously logged in user.

Signed-off-by: Selva Nair <selva.nair@gmail.com>
  • Loading branch information
selvanair committed Aug 8, 2022
1 parent 7f794ee commit 44990cd
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 0 deletions.
44 changes: 44 additions & 0 deletions main.c
Expand Up @@ -537,6 +537,40 @@ ManagePersistent(HWND hwnd, UINT UNUSED msg, UINT_PTR id, DWORD UNUSED now)
SetTimer(hwnd, id, 10000, ManagePersistent);
}

/* Detach from the mgmt i/f of all atatched persistent
* connections. Called on session lock so that another
* user can attach to these.
*/
static void
HandleSessionLock(void)
{
for (int i = 0; i < o.num_configs; i++)
{
if (o.conn[i].flags & FLAG_DAEMON_PERSISTENT
&& (o.conn[i].state != disconnected && o.conn[i].state != detached))
{
o.conn[i].auto_connect = false;
DetachOpenVPN(&o.conn[i]);
o.conn[i].flags |= FLAG_WAIT_UNLOCK;
}
}
}

/* Undo any actions done at session lock/disconnect.
*/
void
HandleSessionUnlock(void)
{
for (int i = 0; i < o.num_configs; i++)
{
if (o.conn[i].flags & FLAG_WAIT_UNLOCK)
{
o.conn[i].auto_connect = true; /* so that ManagePersistent will trigger attach */
o.conn[i].flags &= ~ FLAG_WAIT_UNLOCK;
}
}
}

/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
Expand Down Expand Up @@ -675,13 +709,23 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
case WM_WTSSESSION_CHANGE:
switch (wParam) {
case WTS_SESSION_LOCK:
PrintDebug(L"Session lock triggered");
o.session_locked = TRUE;
/* Detach persistent connections so that other users can connect to it */
HandleSessionLock();
break;

case WTS_SESSION_UNLOCK:
PrintDebug(L"Session unlock triggered");
o.session_locked = FALSE;
HandleSessionUnlock();
if (CountConnState(suspended) != 0)
ResumeConnections();
break;

default:
PrintDebug(L"Session change with wParam = %lu", wParam);
break;
}
break;

Expand Down
1 change: 1 addition & 0 deletions options.h
Expand Up @@ -91,6 +91,7 @@ typedef struct {
#define FLAG_DISABLE_SAVE_PASS (1<<6)
#define FLAG_DISABLE_ECHO_MSG (1<<7)
#define FLAG_DAEMON_PERSISTENT (1<<8)
#define FLAG_WAIT_UNLOCK (1<<9)

#define CONFIG_VIEW_AUTO (0)
#define CONFIG_VIEW_FLAT (1)
Expand Down

0 comments on commit 44990cd

Please sign in to comment.