Fix naming of created interface
Previously it was not possible to create interfaces with names containing whitespaces (or other special characters).master
parent
2470f6ad1f
commit
b5757b8502
|
@ -41,7 +41,7 @@
|
||||||
#define NM_WG_KEY_PUBLIC_KEY "peer-public-key"
|
#define NM_WG_KEY_PUBLIC_KEY "peer-public-key"
|
||||||
#define NM_WG_KEY_ALLOWED_IPS "peer-allowed-ips"
|
#define NM_WG_KEY_ALLOWED_IPS "peer-allowed-ips"
|
||||||
#define NM_WG_KEY_ENDPOINT "peer-endpoint"
|
#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_AUTH "auth"
|
||||||
#define NM_OPENVPN_KEY_CA "ca"
|
#define NM_OPENVPN_KEY_CA "ca"
|
||||||
|
|
|
@ -153,6 +153,37 @@ wg_quick_find_exepath (void)
|
||||||
return NULL;
|
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
|
// disconnect from the current connection
|
||||||
|
@ -318,6 +349,7 @@ set_config(NMVpnServicePlugin *plugin, NMConnection *connection)
|
||||||
GVariant *config, *ip4config, *ip6config;
|
GVariant *config, *ip4config, *ip6config;
|
||||||
GVariant *val;
|
GVariant *val;
|
||||||
const char *setting;
|
const char *setting;
|
||||||
|
const gchar *if_name;
|
||||||
guint64 subnet = 24;
|
guint64 subnet = 24;
|
||||||
gboolean has_ip4 = FALSE;
|
gboolean has_ip4 = FALSE;
|
||||||
gboolean has_ip6 = 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(&ip4builder, "{sv}", NM_VPN_PLUGIN_IP4_CONFIG_NEVER_DEFAULT, val);
|
||||||
g_variant_builder_add(&ip6builder, "{sv}", NM_VPN_PLUGIN_IP6_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(&builder, "{sv}", NM_VPN_PLUGIN_CONFIG_TUNDEV, val);
|
||||||
g_variant_builder_add(&ip4builder, "{sv}", NM_VPN_PLUGIN_IP4_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);
|
setting = get_setting(s_vpn, NM_WG_KEY_ADDR_IP6);
|
||||||
if(setting){
|
if(setting){
|
||||||
|
@ -442,6 +476,7 @@ connect_common(NMVpnServicePlugin *plugin,
|
||||||
NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE(plugin);
|
NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE(plugin);
|
||||||
const char *wg_quick_path = wg_quick_find_exepath();
|
const char *wg_quick_path = wg_quick_find_exepath();
|
||||||
const char *connection_name = nm_connection_get_id(connection);
|
const char *connection_name = nm_connection_get_id(connection);
|
||||||
|
const gchar *if_name = create_interface_name_from_string(connection_name);
|
||||||
char *command;
|
char *command;
|
||||||
int retcode = 1;
|
int retcode = 1;
|
||||||
char *filename = NULL;
|
char *filename = NULL;
|
||||||
|
@ -464,7 +499,7 @@ connect_common(NMVpnServicePlugin *plugin,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
priv->connection_config = connection_config;
|
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;
|
priv->connection_file = filename;
|
||||||
|
|
||||||
if(!do_export(filename, connection, error)){
|
if(!do_export(filename, connection, error)){
|
||||||
|
@ -484,6 +519,7 @@ connect_common(NMVpnServicePlugin *plugin,
|
||||||
// remove the file and free the command string
|
// remove the file and free the command string
|
||||||
g_remove(filename);
|
g_remove(filename);
|
||||||
g_free(command);
|
g_free(command);
|
||||||
|
g_free((gchar *)if_name);
|
||||||
|
|
||||||
set_config(plugin, connection);
|
set_config(plugin, connection);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue