Fix naming of created interface
Previously it was not possible to create interfaces with names containing whitespaces (or other special characters).
This commit is contained in:
		
							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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user