From b5757b8502e27db7bc0d44294dca6608a81db0c2 Mon Sep 17 00:00:00 2001 From: Max Moser Date: Thu, 5 Apr 2018 19:32:34 +0200 Subject: [PATCH] Fix naming of created interface Previously it was not possible to create interfaces with names containing whitespaces (or other special characters). --- shared/nm-service-defines.h | 2 +- src/nm-wireguard-service.c | 40 +++++++++++++++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/shared/nm-service-defines.h b/shared/nm-service-defines.h index 1e9722a..d2cdbb4 100644 --- a/shared/nm-service-defines.h +++ b/shared/nm-service-defines.h @@ -41,7 +41,7 @@ #define NM_WG_KEY_PUBLIC_KEY "peer-public-key" #define NM_WG_KEY_ALLOWED_IPS "peer-allowed-ips" #define NM_WG_KEY_ENDPOINT "peer-endpoint" -#define NM_WG_KEY_PRESHARED_KEY "preshared-key" +#define NM_WG_KEY_PRESHARED_KEY "peer-preshared-key" #define NM_OPENVPN_KEY_AUTH "auth" #define NM_OPENVPN_KEY_CA "ca" diff --git a/src/nm-wireguard-service.c b/src/nm-wireguard-service.c index 64fbff1..9649855 100644 --- a/src/nm-wireguard-service.c +++ b/src/nm-wireguard-service.c @@ -153,6 +153,37 @@ wg_quick_find_exepath (void) return NULL; } +// create a valid interface name from the specified string +// this allocates memory which should be freed after usage +// +// wg-quick uses the following regular expression to check the interface name +// for validity: +// [a-zA-Z0-9_=+.-]{1,15} +static gchar * +create_interface_name_from_string(const char *str) +{ + int i; + int len = MIN(strlen(str), 15); + char ch; + gchar *interface_name = g_strndup(str, len); + + for(i = 0; i < len; i++){ + ch = interface_name[i]; + if(!g_ascii_isalnum(ch) && + (ch != '_') && + (ch != '=') && + (ch != '+') && + (ch != '.') && + (ch != '-')){ + + // if we come across an invalid character, let's replace it with '-' + interface_name[i] = '-'; + } + } + + return interface_name; +} + /*****************************************************************************/ // disconnect from the current connection @@ -318,6 +349,7 @@ set_config(NMVpnServicePlugin *plugin, NMConnection *connection) GVariant *config, *ip4config, *ip6config; GVariant *val; const char *setting; + const gchar *if_name; guint64 subnet = 24; gboolean has_ip4 = FALSE; gboolean has_ip6 = FALSE; @@ -381,9 +413,11 @@ set_config(NMVpnServicePlugin *plugin, NMConnection *connection) g_variant_builder_add(&ip4builder, "{sv}", NM_VPN_PLUGIN_IP4_CONFIG_NEVER_DEFAULT, val); g_variant_builder_add(&ip6builder, "{sv}", NM_VPN_PLUGIN_IP6_CONFIG_NEVER_DEFAULT, val); - val = g_variant_new_string(nm_connection_get_id(connection)); + if_name = create_interface_name_from_string(nm_connection_get_id(connection)); + val = g_variant_new_string(if_name); g_variant_builder_add(&builder, "{sv}", NM_VPN_PLUGIN_CONFIG_TUNDEV, val); g_variant_builder_add(&ip4builder, "{sv}", NM_VPN_PLUGIN_IP4_CONFIG_TUNDEV, val); + g_free((gchar *)if_name); setting = get_setting(s_vpn, NM_WG_KEY_ADDR_IP6); if(setting){ @@ -442,6 +476,7 @@ connect_common(NMVpnServicePlugin *plugin, NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE(plugin); const char *wg_quick_path = wg_quick_find_exepath(); const char *connection_name = nm_connection_get_id(connection); + const gchar *if_name = create_interface_name_from_string(connection_name); char *command; int retcode = 1; char *filename = NULL; @@ -464,7 +499,7 @@ connect_common(NMVpnServicePlugin *plugin, return FALSE; } priv->connection_config = connection_config; - filename = g_strdup_printf("/tmp/%s.conf", connection_name); + filename = g_strdup_printf("/tmp/%s.conf", if_name); priv->connection_file = filename; if(!do_export(filename, connection, error)){ @@ -484,6 +519,7 @@ connect_common(NMVpnServicePlugin *plugin, // remove the file and free the command string g_remove(filename); g_free(command); + g_free((gchar *)if_name); set_config(plugin, connection);