Skip to contentSkip to conversation

Update system tray to populate Windows VPN flyout

PATCH Superseded Kevin Kane 4 participants 8 messages Jul 25, 2018 Kbuild

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore

Kevin Kane

author
#0 lore raw

PATCH 1/1 Update system tray to populate Windows VPN flyout

From ed96e2d91a0eb9ecdaab8d7104f397f7d77e5ced Mon Sep 17 00:00:00 2001
From: Kevin Kane <[email protected]...>
Date: Fri, 13 Jul 2018 09:50:00 -0700
Subject: Update system tray to populate Windows VPN flyout

Add a DLL to be wired in as a custom dialer, which introduces new build dependencies Add copyright notices as required where Microsoft has contributed code

---

.gitignore   |   3 +
BUILD.rst    |   1 +
Makefile.am  |  10 ++-
configure.ac |   4 ++
dialer.c     | 171 +++++++++++++++++++++++++++++++++++++++++++++++++++
tray.c       | 117 +++++++++++++++++++++++++++++++++++
tray.h       |   2 +
7 files changed, 307 insertions(+), 1 deletion(-)

create mode 100644 dialer.c

.gitignore +0 -0
index ac37772..e36e0a6 100644
@@ -10,6 +10,8 @@

*.log
*.tar.gz
*.bak
+*.lo
+*.la

.deps
Makefile
@@ -30,3 +32,4 @@ depcomp
stamp-h1
install-sh
missing
+libtool

BUILD.rst +1 -3
index 9354784..3c70b52 100644
@@ -24,6 +24,7 @@ their dependencies. You can install these packages using the standard
- mingw64-x86_64-gcc-core
- mingw64-x86_64-g++
- mingw64-x86_64-openssl
+- libtool
 
 Build
Makefile.am +0 -0
index 8301087..d8435ed 100644
@@ -2,6 +2,7 @@

#
# Copyright (C) 2004 Mathias Sundman <[email protected]...>
# 2010 Heiko Hund <[email protected]...>
+# Portions Copyright (C) 2018 Microsoft Corporation
#
# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by

@@ -22,6 +23,7 @@ RCCOMPILE = $(WINDRES) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
     $(AM_CPPFLAGS) $(CPPFLAGS)

AUTOMAKE_OPTIONS = foreign 1.9
+ACLOCAL_AMFLAGS = -I m4

MAINTAINERCLEANFILES = \
                config.log config.status \
@@ -106,7 +108,13 @@ openvpn_gui_LDADD = \
                -lnetapi32 \
                -lole32 \
                -lshlwapi \

- -lsecur32
+ -lsecur32 \
+ -lrasapi32

openvpn-gui-res.o: $(openvpn_gui_RESOURCES) $(srcdir)/openvpn-gui-res.h

                $(RCCOMPILE) -i $< -o $@
+
+lib_LTLIBRARIES              = libopenvpndialer.la
+libopenvpndialer_la_SOURCES  = dialer.c
+libopenvpndialer_la_LDFLAGS  = -no-undefined
+libopenvpndialer_la_LIBADD   = -lrasapi32

\ No newline at end of file

configure.ac +0 -0
index 9a2ba75..4fe6b81 100644
@@ -2,6 +2,7 @@ dnl  OpenVPN-GUI -- A Windows GUI for OpenVPN.

dnl
dnl Copyright (C) 2004 Mathias Sundman <[email protected]...>
dnl 2010 Heiko Hund <[email protected]...>
+dnl Portions Copyright (C) 2018 Microsoft Corporation
dnl
dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
@@ -29,10 +30,13 @@ AC_DEFINE([CORE_COPYRIGHT_YEAR_END], ["2018"], [Last copyright year for daemon i AC_CONFIG_AUX_DIR([.])
AM_CONFIG_HEADER([config.h])
AC_CONFIG_SRCDIR([main.h])
+AC_CONFIG_MACRO_DIRS([m4])
AM_INIT_AUTOMAKE
AC_CANONICAL_HOST
AC_USE_SYSTEM_EXTENSIONS
AC_PROG_CC_C99
+LT_INIT([win32-dll])
+AC_LIBTOOL_WIN32_DLL
AC_CHECK_TOOL([WINDRES], [windres])

AC_ARG_ENABLE(

dialer.c new file +171 -0

171 lines not on this page · raw message

tray.c +1 -0
index 1e1dc2e..9ce27a0 100644
@@ -3,6 +3,7 @@
  *
  *  Copyright (C) 2004 Mathias Sundman <[email protected]...>
  *                2010 Heiko Hund <[email protected]...>
+ *  Portions Copyright (C) 2018 Microsoft Corporation
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -28,6 +29,8 @@

#include <shellapi.h>
#include <tchar.h>
#include <time.h>
+#include <ras.h>
+#include <raserror.h>

#include "tray.h"
#include "service.h"
@@ -47,6 +50,116 @@ HMENU hMenuService;
NOTIFYICONDATA ni;
extern options_t o;

+static const TCHAR VpnEntryPrefix[] = _T("OpenVPN "); +static const TCHAR WindowCaption[] = _T("OpenVPN-GUI"); +
+/* Delete OpenVPN entries from Windows networking/VPN flyout */ +void
+ClearNetworkFlyout()
+{

+    DWORD result = ERROR_SUCCESS;
+    LPRASENTRYNAME entryName = NULL;
+    DWORD entryNameSize = 0;
+    DWORD entryCount = 0;
+
+    /* Determine memory required */
+    result = RasEnumEntries(NULL, NULL, NULL, &entryNameSize, &entryCount);
+    if (ERROR_BUFFER_TOO_SMALL != result)
+    {
+        /* Anything else is unexpected. */
+        MessageBox(NULL, _T("ClearNetworkFlyout: Could not get memory needed for RAS entries"), WindowCaption, MB_OK);
+        return;
+    }
+
+    entryName = (LPRASENTRYNAME)malloc(entryNameSize);
+    if (NULL == entryName)
+    {
+        /* No memory! */
+        MessageBox(NULL, _T("ClearNetworkFlyout: No memory allocating entry name"), WindowCaption, MB_OK);
+        return;

+ }
+
+ entryName[0].dwSize = sizeof(RASENTRYNAME);
+

+    result = RasEnumEntries(NULL, NULL, entryName, &entryNameSize, &entryCount);
+    if (ERROR_SUCCESS != result)
+    {
+        MessageBox(NULL, _T("ClearNetworkFlyout: Could not enumerate RAS entries"), WindowCaption, MB_OK);
+        free(entryName);
+        return;

+ }
+
+ for (DWORD i = 0; i < entryCount; i++)
+ {
+ if ((entryName[i].dwFlags == REN_User) &&
+ (0 == _tcsncmp(VpnEntryPrefix, entryName[i].szEntryName, _countof(VpnEntryPrefix) - 1)))
+ {
+ /* TODO: Retrieve the entry and verify that it references our custom dialer DLL? RasEnumEntries doesn't

+             * give us this information but we could retrieve the entry and check. This would keep us from purging any
+             * entries which for some inexplicable reason started with the VpnEntryPrefix string.
+             */
+            result = RasDeleteEntry(NULL, entryName[i].szEntryName);
+            if (ERROR_SUCCESS != result)
+            {

+ MessageBox(NULL, _T("ClearNetworkFlyout: Failed to delete entry"), WindowCaption, MB_OK);
+ /* Continue processing; don't return. */
+ }
+ }
+ }
+
+ free(entryName);
+
+ return;
+}
+
+static const TCHAR DialerFileName[] = _T("libopenvpndialer-0.dll"); +static const TCHAR DeviceName[] = _T("TAP-Windows Adapter V9"); +
+/* Create VPN flyout entry for a new connection */ +static void
+CreateNetworkFlyoutEntry(const connection_t *c, int number) +{

+    DWORD result = ERROR_SUCCESS;
+    RASENTRY entry;
+    TCHAR entryName[RAS_MaxEntryName + 1];
+
+    memset(&entry, 0, sizeof(entry));
+    entry.dwSize = sizeof(entry);
+    _tcsncpy(entry.szDeviceType, RASDT_Vpn, _countof(RASDT_Vpn));
+    _tcsncpy(entry.szDeviceName, DeviceName, _countof(DeviceName));
+
+    entry.dwfOptions = RASEO_Custom;
+    /* Take the exe_path, strip off everything after the last backslash, and append DialerFileName */
+    TCHAR* lastBackslash = _tcsrchr(o.exe_path, _T('\\'));
+    if (NULL == lastBackslash)
+    {
+        MessageBox(NULL, _T("CreateNetworkFlyoutEntry: No last backslash found"), WindowCaption, MB_OK);
+        return;
+    }
+    _tcsncpy(entry.szCustomDialDll, o.exe_path, (lastBackslash - o.exe_path + 1));
+    /* Check for possible overrun */
+    if (_tcslen(entry.szCustomDialDll) + _countof(DialerFileName) >= _countof(entry.szCustomDialDll))
+    {

+ MessageBox(NULL, _T("CreateNetworkFlyoutEntry: Not enough space for custom dialer DLL filename"), WindowCaption, MB_OK);
+ return;
+ }
+ _tcsncat(entry.szCustomDialDll, DialerFileName, _countof(DialerFileName));
+

+    /* Use the local phone number space to store the entry number for the custom dialer to use. */
+    _sntprintf_0(entry.szLocalPhoneNumber, _T("%d"), number);
+    entry.dwType = RASET_Vpn;
+    entry.dwEncryptionType = ET_Optional;
+
+    _sntprintf_0(entryName, _T("%s%s"), VpnEntryPrefix, c->config_name);
+    result = RasSetEntryProperties(NULL, entryName, &entry, sizeof(entry), NULL, 0);
+    if (ERROR_SUCCESS != result)
+    {
+        TCHAR message[512];
+        _sntprintf_0(message, _T("CreateNetworkFlyoutEntry: Could not RasSetEntryProperties: %lu"), result);
+        MessageBox(NULL, message, WindowCaption, MB_OK);
+        return;

+ }
+}

/* Create popup menus */
void
@@ -92,6 +205,7 @@ CreatePopupMenus()

         AppendMenu(hMenu, MF_STRING ,IDM_CLOSE, LoadLocalizedString(IDS_MENU_CLOSE));

         SetMenuStatus(&o.conn[0],  o.conn[0].state);
+        CreateNetworkFlyoutEntry(&o.conn[0], 0);
     }
     else {
         /* Create Main menu with all connections */

@@ -135,6 +249,7 @@ CreatePopupMenus()
#endif

             SetMenuStatus(&o.conn[i], o.conn[i].state);
+            CreateNetworkFlyoutEntry(&o.conn[i], i);
         }
     }

@@ -152,6 +267,7 @@ DestroyPopupMenus()

     DestroyMenu(hMenuService);
     DestroyMenu(hMenu);

+ ClearNetworkFlyout();
}

@@ -218,6 +334,7 @@ void
OnDestroyTray()

{
     DestroyMenu(hMenu);
+    ClearNetworkFlyout();
     Shell_NotifyIcon(NIM_DELETE, &ni);
}
tray.h +1 -0
index 1ce5e07..f5a9ff4 100644
@@ -3,6 +3,7 @@
  *
  *  Copyright (C) 2004 Mathias Sundman <[email protected]...>
  *                2010 Heiko Hund <[email protected]...>
+ *  Portions Copyright (C) 2018 Microsoft Corporation
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -51,5 +52,6 @@ void SetMenuStatus(connection_t *, conn_state_t);

void SetServiceMenuStatus();
void ShowTrayBalloon(TCHAR *, TCHAR *);
void CheckAndSetTrayIcon();
+void ClearNetworkFlyout();

#endif
--
2.17.1.windows.2

#1 lore raw

Hi,

Quoted 10 lines · Kevin Kane via Openvpn-devel

From ed96e2d91a0eb9ecdaab8d7104f397f7d77e5ced Mon Sep 17 00:00:00 2001

From: Kevin Kane <[email protected]...>

Date: Fri, 13 Jul 2018 09:50:00 -0700

Subject: Update system tray to populate Windows VPN flyout

Quoted 9 lines

Add a DLL to be wired in as a custom dialer, which introduces new build dependencies

Add copyright notices as required where Microsoft has contributed code

As discussed in a previous thread, I'm not sure we should have this in its current form:

(i) It adds and entry per config to network connections which will be a nuisance for users who have far too many configs (there are some users with 100's of config files) -- so we at least need an option to enable/disable this.

(ii) This only supports connect, not disconnect and the entry does not show whether its connected or not -- so this is a feature of very dubious utility.

(iii) Communicating with the GUI using COPYDATA message (we support connect, disconnect, status etc.) should be preferred over hard-coding IDM_CONNECTMENU.

Selva

author
#2 lore raw

I agree. This was the consensus when we discussed this feature before, but there was some interest in possibly taking this work in an experimental branch and later building something more production-ready on top of the plumbing work. It is with that expectation I'm offering it upstream.

-----Original Message-----
From: Selva Nair <[email protected]...>
Sent: Wednesday, July 25, 2018 10:28 AM
To: Kevin Kane <[email protected]...>
Cc: openvpn-devel <[email protected]>
Subject: Re: [Openvpn-devel] [PATCH] [openvpn-gui] Update system tray to populate Windows VPN flyout

Hi,

Quoted 10 lines · Kevin Kane via Openvpn-devel

From ed96e2d91a0eb9ecdaab8d7104f397f7d77e5ced Mon Sep 17 00:00:00 2001

From: Kevin Kane <[email protected]...>

Date: Fri, 13 Jul 2018 09:50:00 -0700

Subject: Update system tray to populate Windows VPN flyout

Quoted 9 lines

Add a DLL to be wired in as a custom dialer, which introduces new build dependencies

Add copyright notices as required where Microsoft has contributed code

As discussed in a previous thread, I'm not sure we should have this in its current form:

(i) It adds and entry per config to network connections which will be a nuisance for users who have far too many configs (there are some users with 100's of config files) -- so we at least need an option to enable/disable this.

(ii) This only supports connect, not disconnect and the entry does not show whether its connected or not -- so this is a feature of very dubious utility.

(iii) Communicating with the GUI using COPYDATA message (we support connect, disconnect, status etc.) should be preferred over hard-coding IDM_CONNECTMENU.

Selva

#3 lore raw
In reply to Kevin Kane

Hi,

as a side note, your mail client massacres leading whitespace, so the patch is all squeezed to the left side:

Makefile.am line 6

Quoted 10 lines · Kevin Kane via Openvpn-devel
Makefile.am +1 -0
index 8301087..d8435ed 100644
@@ -2,6 +2,7 @@
 #
 #  Copyright (C) 2004 Mathias Sundman <[email protected]...>
 #                2010 Heiko Hund <[email protected]...>
+#  Portions Copyright (C) 2018 Microsoft Corporation
 #

... which makes it impossible to apply without manually adding the leading space in non-changed lines.

Interesting enough...

Quoted 7 lines
Makefile.am +0 -0
  *
  *  Copyright (C) 2004 Mathias Sundman <[email protected]...>

* 2010 Heiko Hund <[email protected]...>
+ * Portions Copyright (C) 2018 Microsoft Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

... the effect differs...

But anyway. If possible, use "git send-email" (which is much better at not massacring things than the standard clients) - and point it to something which is not Exchange. Unfortunately, we've seen that as well, git-send-email sending via SMTP to Exchange, and Exchange hacking and slaying at the patch...

thanks :)

gert

Signature · 6 lines
"If was one thing all people took for granted, was conviction that if you 
 feed honest figures into a computer, honest figures come out. Never doubted 
 it myself till I met a computer with a sense of humor."
                             Robert A. Heinlein, The Moon is a Harsh Mistress

Gert Doering - Munich, Germany                             [email protected]...
author
#4 lore raw

Ugh. Thanks, Outlook. I'd have to use a personal e-mail account to use something other than Exchange.

The other option is for me to add the files to the e-mail as attachments. Is that acceptable, or do you really need the patch text to be in the message body?

-----Original Message-----
From: Gert Doering <[email protected]...>
Sent: Wednesday, July 25, 2018 11:00 AM
To: Kevin Kane <[email protected]...>
Cc: openvpn-devel <[email protected]>
Subject: Re: [Openvpn-devel] [PATCH] [openvpn-gui] Update system tray to populate Windows VPN flyout

Hi,

as a side note, your mail client massacres leading whitespace, so the patch is all squeezed to the left side:

Makefile.am line 6

Quoted 9 lines · Kevin Kane via Openvpn-devel
Makefile.am +1 -0
@@ -2,6 +2,7 @@
 #
 #  Copyright (C) 2004 Mathias Sundman <[email protected]...>
 #                2010 Heiko Hund <[email protected]...>
+#  Portions Copyright (C) 2018 Microsoft Corporation
 #

... which makes it impossible to apply without manually adding the leading space in non-changed lines.

Interesting enough...

Quoted 8 lines
Makefile.am +0 -0
  *
  *  Copyright (C) 2004 Mathias Sundman <[email protected]...>

* 2010 Heiko Hund <[email protected]...>
+ * Portions Copyright (C) 2018 Microsoft Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
by

... the effect differs...

But anyway. If possible, use "git send-email" (which is much better at not massacring things than the standard clients) - and point it to something which is not Exchange. Unfortunately, we've seen that as well, git-send-email sending via SMTP to Exchange, and Exchange hacking and slaying at the patch...

thanks :)

gert
--
"If was one thing all people took for granted, was conviction that if you feed honest figures into a computer, honest figures come out. Never doubted it myself till I met a computer with a sense of humor."
Robert A. Heinlein, The Moon is a Harsh Mistress

Gert Doering - Munich, Germany [email protected]...

#5 lore raw

Hi,

Quoted 3 lines · Kevin Kane

Ugh. Thanks, Outlook. I'd have to use a personal e-mail account to use something other than Exchange.

The other option is for me to add the files to the e-mail as attachments. Is that acceptable, or do you really need the patch text to be in the message body?

For applying with "git am" and for reviewing with "I can just quote parts of the patch and comment on it", attachments in anything that is not text/plain format are also not ideal, but we can try that.

We've had a few patches come in recently that were attachment in a signed mail, and neither patchwork nor git could handle these mails in a satisfying way - as in: patchwork did not recognize them as "patch", and "git am" declared "no patch in there" - so "save patch as individual file, git am, manually add in-reply-to to the auto- generated "patch applied" reply mail, etc.

It's a bit of try and error what works in a given environment.

(git send-email talking SMTP to Exchange might actually work more nicely than outlook. Maybe that was just one particularily weird version of Exchange, or "too many virus scanner plugins hooked in", given that this was Sophos...)

gert

Signature · 6 lines
"If was one thing all people took for granted, was conviction that if you 
 feed honest figures into a computer, honest figures come out. Never doubted 
 it myself till I met a computer with a sense of humor."
                             Robert A. Heinlein, The Moon is a Harsh Mistress

Gert Doering - Munich, Germany                             [email protected]...
author
#6 lore raw

Alright, I found the SMTP server and sent the patches out again with git send-email. Let me know how those look.

-----Original Message-----
From: Gert Doering <[email protected]...>
Sent: Wednesday, July 25, 2018 11:18 AM
To: Kevin Kane <[email protected]...>
Cc: Gert Doering <[email protected]...>; openvpn-devel <[email protected]>
Subject: Re: [Openvpn-devel] [PATCH] [openvpn-gui] Update system tray to populate Windows VPN flyout

Hi,

Quoted 3 lines · Kevin Kane

Ugh. Thanks, Outlook. I'd have to use a personal e-mail account to use something other than Exchange.

The other option is for me to add the files to the e-mail as attachments. Is that acceptable, or do you really need the patch text to be in the message body?

For applying with "git am" and for reviewing with "I can just quote parts of the patch and comment on it", attachments in anything that is not text/plain format are also not ideal, but we can try that.

We've had a few patches come in recently that were attachment in a signed mail, and neither patchwork nor git could handle these mails in a satisfying way - as in: patchwork did not recognize them as "patch", and "git am" declared "no patch in there" - so "save patch as individual file, git am, manually add in-reply-to to the auto- generated "patch applied" reply mail, etc.

It's a bit of try and error what works in a given environment.

(git send-email talking SMTP to Exchange might actually work more nicely than outlook. Maybe that was just one particularily weird version of Exchange, or "too many virus scanner plugins hooked in", given that this was Sophos...)

gert

--
"If was one thing all people took for granted, was conviction that if you feed honest figures into a computer, honest figures come out. Never doubted it myself till I met a computer with a sense of humor."
Robert A. Heinlein, The Moon is a Harsh Mistress

Gert Doering - Munich, Germany [email protected]...

#7 lore raw

чт, 26 июл. 2018 г. в 1:04, Kevin Kane via Openvpn-devel < [email protected]>:

Quoted 3 lines

Alright, I found the SMTP server and sent the patches out again with git send-email. Let me know how those look.

looks good from patchwork point of view:

https://patchwork.openvpn.net/project/openvpn2/list/

Quoted 59 lines

-----Original Message-----
From: Gert Doering <[email protected]...>
Sent: Wednesday, July 25, 2018 11:18 AM
To: Kevin Kane <[email protected]...>
Cc: Gert Doering <[email protected]...>; openvpn-devel < [email protected]>
Subject: Re: [Openvpn-devel] [PATCH] [openvpn-gui] Update system tray to populate Windows VPN flyout

Hi,

Quoted 1 line · Kevin Kane

Ugh. Thanks, Outlook. I'd have to use a personal e-mail account to use

something other than Exchange.

Quoted 2 lines

The other option is for me to add the files to the e-mail as

attachments. Is that acceptable, or do you really need the patch text to be in the message body?

For applying with "git am" and for reviewing with "I can just quote parts of the patch and comment on it", attachments in anything that is not text/plain format are also not ideal, but we can try that.

We've had a few patches come in recently that were attachment in a signed mail, and neither patchwork nor git could handle these mails in a satisfying way - as in: patchwork did not recognize them as "patch", and "git am" declared "no patch in there" - so "save patch as individual file, git am, manually add in-reply-to to the auto- generated "patch applied" reply mail, etc.

It's a bit of try and error what works in a given environment.

(git send-email talking SMTP to Exchange might actually work more nicely than outlook. Maybe that was just one particularily weird version of Exchange, or "too many virus scanner plugins hooked in", given that this was Sophos...)

gert

--
"If was one thing all people took for granted, was conviction that if you feed honest figures into a computer, honest figures come out. Never doubted it myself till I met a computer with a sense of humor."
Robert A. Heinlein, The Moon is a Harsh
Mistress

Gert Doering - Munich, Germany
[email protected]...

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Openvpn-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/openvpn-devel