Make first steps towards WG plugin from OVPN plugin
This commit is contained in:
		
							parent
							
								
									337d10e1e0
								
							
						
					
					
						commit
						4517f7590f
					
				@ -22,11 +22,11 @@
 | 
			
		||||
#ifndef __NM_SERVICE_DEFINES_H__
 | 
			
		||||
#define __NM_SERVICE_DEFINES_H__
 | 
			
		||||
 | 
			
		||||
#define NM_VPN_SERVICE_TYPE_OPENVPN "org.freedesktop.NetworkManager.openvpn"
 | 
			
		||||
#define NM_VPN_SERVICE_TYPE_OPENVPN "org.freedesktop.NetworkManager.wireguard"
 | 
			
		||||
 | 
			
		||||
#define NM_DBUS_SERVICE_OPENVPN    "org.freedesktop.NetworkManager.openvpn"
 | 
			
		||||
#define NM_DBUS_INTERFACE_OPENVPN  "org.freedesktop.NetworkManager.openvpn"
 | 
			
		||||
#define NM_DBUS_PATH_OPENVPN       "/org/freedesktop/NetworkManager/openvpn"
 | 
			
		||||
#define NM_DBUS_SERVICE_OPENVPN    "org.freedesktop.NetworkManager.wireguard"
 | 
			
		||||
#define NM_DBUS_INTERFACE_OPENVPN  "org.freedesktop.NetworkManager.wireguard"
 | 
			
		||||
#define NM_DBUS_PATH_OPENVPN       "/org/freedesktop/NetworkManager/wireguard"
 | 
			
		||||
 | 
			
		||||
#define NM_OPENVPN_KEY_AUTH "auth"
 | 
			
		||||
#define NM_OPENVPN_KEY_CA "ca"
 | 
			
		||||
 | 
			
		||||
@ -52,6 +52,20 @@
 | 
			
		||||
# define DIST_VERSION VERSION
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// TODO remove me -- just for getting rid of error underlining
 | 
			
		||||
#ifndef LOCALSTATEDIR
 | 
			
		||||
#define LOCALSTATEDIR ""
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef LIBEXECDIR
 | 
			
		||||
#define LIBEXECDIR ""
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef NM_OPENVPN_LOCALEDIR
 | 
			
		||||
#define NM_OPENVPN_LOCALEDIR ""
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef NM_WIREGUARD_LOCALEDIR
 | 
			
		||||
#define NM_WIREGUARD_LOCALEDIR ""
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define RUNDIR  LOCALSTATEDIR"/run/NetworkManager"
 | 
			
		||||
 | 
			
		||||
static struct {
 | 
			
		||||
@ -66,24 +80,24 @@ static struct {
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#define NM_TYPE_OPENVPN_PLUGIN            (nm_openvpn_plugin_get_type ())
 | 
			
		||||
#define NM_OPENVPN_PLUGIN(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_OPENVPN_PLUGIN, NMOpenvpnPlugin))
 | 
			
		||||
#define NM_OPENVPN_PLUGIN_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_OPENVPN_PLUGIN, NMOpenvpnPluginClass))
 | 
			
		||||
#define NM_IS_OPENVPN_PLUGIN(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_OPENVPN_PLUGIN))
 | 
			
		||||
#define NM_IS_OPENVPN_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_OPENVPN_PLUGIN))
 | 
			
		||||
#define NM_OPENVPN_PLUGIN_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_OPENVPN_PLUGIN, NMOpenvpnPluginClass))
 | 
			
		||||
#define NM_TYPE_WIREGUARD_PLUGIN            (nm_wireguard_plugin_get_type ())
 | 
			
		||||
#define NM_WIREGUARD_PLUGIN(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_WIREGUARD_PLUGIN, NMWireguardPlugin))
 | 
			
		||||
#define NM_WIREGUARD_PLUGIN_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_WIREGUARD_PLUGIN, NMWireguardPluginClass))
 | 
			
		||||
#define NM_IS_WIREGUARD_PLUGIN(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_WIREGUARD_PLUGIN))
 | 
			
		||||
#define NM_IS_WIREGUARD_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_WIREGUARD_PLUGIN))
 | 
			
		||||
#define NM_WIREGUARD_PLUGIN_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_WIREGUARD_PLUGIN, NMWireguardPluginClass))
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
	NMVpnServicePlugin parent;
 | 
			
		||||
} NMOpenvpnPlugin;
 | 
			
		||||
} NMWireguardPlugin;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
	NMVpnServicePluginClass parent;
 | 
			
		||||
} NMOpenvpnPluginClass;
 | 
			
		||||
} NMWireguardPluginClass;
 | 
			
		||||
 | 
			
		||||
GType nm_openvpn_plugin_get_type (void);
 | 
			
		||||
GType nm_wireguard_plugin_get_type (void);
 | 
			
		||||
 | 
			
		||||
NMOpenvpnPlugin *nm_openvpn_plugin_new (const char *bus_name);
 | 
			
		||||
NMWireguardPlugin *nm_wireguard_plugin_new (const char *bus_name);
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
 | 
			
		||||
@ -98,7 +112,7 @@ typedef struct {
 | 
			
		||||
	GPid pid;
 | 
			
		||||
	guint watch_id;
 | 
			
		||||
	guint kill_id;
 | 
			
		||||
	NMOpenvpnPlugin *plugin;
 | 
			
		||||
	NMWireguardPlugin *plugin;
 | 
			
		||||
} PidsPendingData;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
@ -113,20 +127,20 @@ typedef struct {
 | 
			
		||||
	char *challenge_text;
 | 
			
		||||
	GIOChannel *socket_channel;
 | 
			
		||||
	guint socket_channel_eventid;
 | 
			
		||||
} NMOpenvpnPluginIOData;
 | 
			
		||||
} NMWireguardPluginIOData;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
	GPid pid;
 | 
			
		||||
	guint connect_timer;
 | 
			
		||||
	guint connect_count;
 | 
			
		||||
	NMOpenvpnPluginIOData *io_data;
 | 
			
		||||
	NMWireguardPluginIOData *io_data;
 | 
			
		||||
	gboolean interactive;
 | 
			
		||||
	char *mgt_path;
 | 
			
		||||
} NMOpenvpnPluginPrivate;
 | 
			
		||||
} NMWireguardPluginPrivate;
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE (NMOpenvpnPlugin, nm_openvpn_plugin, NM_TYPE_VPN_SERVICE_PLUGIN)
 | 
			
		||||
G_DEFINE_TYPE (NMWireguardPlugin, nm_wireguard_plugin, NM_TYPE_VPN_SERVICE_PLUGIN)
 | 
			
		||||
 | 
			
		||||
#define NM_OPENVPN_PLUGIN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_OPENVPN_PLUGIN, NMOpenvpnPluginPrivate))
 | 
			
		||||
#define NM_WIREGUARD_PLUGIN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_WIREGUARD_PLUGIN, NMWireguardPluginPrivate))
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
 | 
			
		||||
@ -321,13 +335,13 @@ pids_pending_get (GPid pid)
 | 
			
		||||
	g_return_val_if_reached (NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void openvpn_child_terminated (NMOpenvpnPlugin *plugin, GPid pid, gint status);
 | 
			
		||||
static void openvpn_child_terminated (NMWireguardPlugin *plugin, GPid pid, gint status);
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
pids_pending_child_watch_cb (GPid pid, gint status, gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	PidsPendingData *pid_data = user_data;
 | 
			
		||||
	NMOpenvpnPlugin *plugin;
 | 
			
		||||
	NMWireguardPlugin *plugin;
 | 
			
		||||
 | 
			
		||||
	if (WIFEXITED (status)) {
 | 
			
		||||
		int exit_status;
 | 
			
		||||
@ -360,11 +374,11 @@ pids_pending_child_watch_cb (GPid pid, gint status, gpointer user_data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
pids_pending_add (GPid pid, NMOpenvpnPlugin *plugin)
 | 
			
		||||
pids_pending_add (GPid pid, NMWireguardPlugin *plugin)
 | 
			
		||||
{
 | 
			
		||||
	PidsPendingData *pid_data;
 | 
			
		||||
 | 
			
		||||
	g_return_if_fail (NM_IS_OPENVPN_PLUGIN (plugin));
 | 
			
		||||
	g_return_if_fail (NM_IS_WIREGUARD_PLUGIN (plugin));
 | 
			
		||||
	g_return_if_fail (pid > 0);
 | 
			
		||||
 | 
			
		||||
	_LOGI ("openvpn[%ld] started", (long) pid);
 | 
			
		||||
@ -557,10 +571,10 @@ nm_openvpn_secrets_validate (NMSettingVpn *s_vpn, GError **error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
nm_openvpn_disconnect_management_socket (NMOpenvpnPlugin *plugin)
 | 
			
		||||
nm_openvpn_disconnect_management_socket (NMWireguardPlugin *plugin)
 | 
			
		||||
{
 | 
			
		||||
	NMOpenvpnPluginPrivate *priv = NM_OPENVPN_PLUGIN_GET_PRIVATE (plugin);
 | 
			
		||||
	NMOpenvpnPluginIOData *io_data = priv->io_data;
 | 
			
		||||
	NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE (plugin);
 | 
			
		||||
	NMWireguardPluginIOData *io_data = priv->io_data;
 | 
			
		||||
 | 
			
		||||
	/* This should not throw a warning since this can happen in
 | 
			
		||||
	   non-password modes */
 | 
			
		||||
@ -695,7 +709,7 @@ write_user_pass (GIOChannel *channel,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
handle_auth (NMOpenvpnPluginIOData *io_data,
 | 
			
		||||
handle_auth (NMWireguardPluginIOData *io_data,
 | 
			
		||||
             const char *requested_auth,
 | 
			
		||||
             const char **out_message,
 | 
			
		||||
             char ***out_hints)
 | 
			
		||||
@ -795,12 +809,12 @@ handle_auth (NMOpenvpnPluginIOData *io_data,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
handle_management_socket (NMOpenvpnPlugin *plugin,
 | 
			
		||||
handle_management_socket (NMWireguardPlugin *plugin,
 | 
			
		||||
                          GIOChannel *source,
 | 
			
		||||
                          GIOCondition condition,
 | 
			
		||||
                          NMVpnPluginFailure *out_failure)
 | 
			
		||||
{
 | 
			
		||||
	NMOpenvpnPluginPrivate *priv = NM_OPENVPN_PLUGIN_GET_PRIVATE (plugin);
 | 
			
		||||
	NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE (plugin);
 | 
			
		||||
	gboolean again = TRUE;
 | 
			
		||||
	char *str = NULL, *auth = NULL;
 | 
			
		||||
	const char *message = NULL;
 | 
			
		||||
@ -899,7 +913,7 @@ out:
 | 
			
		||||
static gboolean
 | 
			
		||||
nm_openvpn_socket_data_cb (GIOChannel *source, GIOCondition condition, gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	NMOpenvpnPlugin *plugin = NM_OPENVPN_PLUGIN (user_data);
 | 
			
		||||
	NMWireguardPlugin *plugin = NM_WIREGUARD_PLUGIN (user_data);
 | 
			
		||||
	NMVpnPluginFailure failure = NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED;
 | 
			
		||||
 | 
			
		||||
	if (!handle_management_socket (plugin, source, condition, &failure)) {
 | 
			
		||||
@ -913,9 +927,9 @@ nm_openvpn_socket_data_cb (GIOChannel *source, GIOCondition condition, gpointer
 | 
			
		||||
static gboolean
 | 
			
		||||
nm_openvpn_connect_timer_cb (gpointer data)
 | 
			
		||||
{
 | 
			
		||||
	NMOpenvpnPlugin *plugin = NM_OPENVPN_PLUGIN (data);
 | 
			
		||||
	NMOpenvpnPluginPrivate *priv = NM_OPENVPN_PLUGIN_GET_PRIVATE (plugin);
 | 
			
		||||
	NMOpenvpnPluginIOData *io_data = priv->io_data;
 | 
			
		||||
	NMWireguardPlugin *plugin = NM_WIREGUARD_PLUGIN (data);
 | 
			
		||||
	NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE (plugin);
 | 
			
		||||
	NMWireguardPluginIOData *io_data = priv->io_data;
 | 
			
		||||
	struct sockaddr_un remote = { 0 };
 | 
			
		||||
	int fd;
 | 
			
		||||
 | 
			
		||||
@ -955,24 +969,24 @@ out:
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
nm_openvpn_schedule_connect_timer (NMOpenvpnPlugin *plugin)
 | 
			
		||||
nm_openvpn_schedule_connect_timer (NMWireguardPlugin *plugin)
 | 
			
		||||
{
 | 
			
		||||
	NMOpenvpnPluginPrivate *priv = NM_OPENVPN_PLUGIN_GET_PRIVATE (plugin);
 | 
			
		||||
	NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE (plugin);
 | 
			
		||||
 | 
			
		||||
	if (priv->connect_timer == 0)
 | 
			
		||||
		priv->connect_timer = g_timeout_add (200, nm_openvpn_connect_timer_cb, plugin);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
openvpn_child_terminated (NMOpenvpnPlugin *plugin, GPid pid, gint status)
 | 
			
		||||
openvpn_child_terminated (NMWireguardPlugin *plugin, GPid pid, gint status)
 | 
			
		||||
{
 | 
			
		||||
	NMOpenvpnPluginPrivate *priv;
 | 
			
		||||
	NMWireguardPluginPrivate *priv;
 | 
			
		||||
	NMVpnPluginFailure failure = NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED;
 | 
			
		||||
	gboolean good_exit = FALSE;
 | 
			
		||||
 | 
			
		||||
	g_return_if_fail (NM_IS_OPENVPN_PLUGIN (plugin));
 | 
			
		||||
	g_return_if_fail (NM_IS_WIREGUARD_PLUGIN (plugin));
 | 
			
		||||
 | 
			
		||||
	priv = NM_OPENVPN_PLUGIN_GET_PRIVATE (plugin);
 | 
			
		||||
	priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE (plugin);
 | 
			
		||||
	/* Reap child if needed. */
 | 
			
		||||
	if (priv->pid != pid) {
 | 
			
		||||
		/* the dead child is not the currently active process. Nothing to do, we just
 | 
			
		||||
@ -1128,7 +1142,7 @@ add_cert_args (GPtrArray *args, NMSettingVpn *s_vpn)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
update_io_data_from_vpn_setting (NMOpenvpnPluginIOData *io_data,
 | 
			
		||||
update_io_data_from_vpn_setting (NMWireguardPluginIOData *io_data,
 | 
			
		||||
                                 NMSettingVpn *s_vpn,
 | 
			
		||||
                                 const char *default_username)
 | 
			
		||||
{
 | 
			
		||||
@ -1247,11 +1261,22 @@ check_chroot_dir_usability (const char *chdir, const char *user)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
nm_openvpn_start_openvpn_binary (NMOpenvpnPlugin *plugin,
 | 
			
		||||
nm_wireguard_start_interface(NMWireguardPlugin *plugin,
 | 
			
		||||
							 NMConnection *connection,
 | 
			
		||||
							 GError **error)
 | 
			
		||||
{
 | 
			
		||||
	NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE(plugin);
 | 
			
		||||
	const char *wg_connection_name = NULL;
 | 
			
		||||
 | 
			
		||||
	return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
nm_openvpn_start_openvpn_binary (NMWireguardPlugin *plugin,
 | 
			
		||||
                                 NMConnection *connection,
 | 
			
		||||
                                 GError **error)
 | 
			
		||||
{
 | 
			
		||||
	NMOpenvpnPluginPrivate *priv = NM_OPENVPN_PLUGIN_GET_PRIVATE (plugin);
 | 
			
		||||
	NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE (plugin);
 | 
			
		||||
	const char *openvpn_binary, *auth, *tmp, *tmp2, *tmp3, *tmp4;
 | 
			
		||||
	gs_unref_ptrarray GPtrArray *args = NULL;
 | 
			
		||||
	GPid pid;
 | 
			
		||||
@ -1912,7 +1937,7 @@ nm_openvpn_start_openvpn_binary (NMOpenvpnPlugin *plugin,
 | 
			
		||||
	    || !strcmp (connection_type, NM_OPENVPN_CONTYPE_PASSWORD_TLS)
 | 
			
		||||
	    || nm_setting_vpn_get_data_item (s_vpn, NM_OPENVPN_KEY_HTTP_PROXY_USERNAME)) {
 | 
			
		||||
 | 
			
		||||
		priv->io_data = g_malloc0 (sizeof (NMOpenvpnPluginIOData));
 | 
			
		||||
		priv->io_data = g_malloc0 (sizeof (NMWireguardPluginIOData));
 | 
			
		||||
		update_io_data_from_vpn_setting (priv->io_data, s_vpn,
 | 
			
		||||
		                                 nm_setting_vpn_get_user_name (s_vpn));
 | 
			
		||||
		nm_openvpn_schedule_connect_timer (plugin);
 | 
			
		||||
@ -1979,11 +2004,20 @@ check_need_secrets (NMSettingVpn *s_vpn, gboolean *need_secrets)
 | 
			
		||||
	return ctype;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IMPLEMENT ME RIGHT
 | 
			
		||||
static gboolean
 | 
			
		||||
test_disconnect(NMVpnServicePlugin *plugin,
 | 
			
		||||
				GError **err)
 | 
			
		||||
{
 | 
			
		||||
	_LOGI("Did a disconnect!");
 | 
			
		||||
	return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
real_disconnect (NMVpnServicePlugin *plugin,
 | 
			
		||||
                 GError **err)
 | 
			
		||||
{
 | 
			
		||||
	NMOpenvpnPluginPrivate *priv = NM_OPENVPN_PLUGIN_GET_PRIVATE (plugin);
 | 
			
		||||
	NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE (plugin);
 | 
			
		||||
 | 
			
		||||
	if (priv->mgt_path) {
 | 
			
		||||
		/* openvpn does not cleanup the management socket upon exit,
 | 
			
		||||
@ -2000,6 +2034,39 @@ real_disconnect (NMVpnServicePlugin *plugin,
 | 
			
		||||
	return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IMPLEMENT ME RIGHT
 | 
			
		||||
static gboolean
 | 
			
		||||
test_connect (NMVpnServicePlugin *plugin,
 | 
			
		||||
				NMConnection *connection,
 | 
			
		||||
				GError **error)
 | 
			
		||||
{
 | 
			
		||||
	_LOGI("Did a dummy connect");
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	printf("I Know It!\n");
 | 
			
		||||
	// FIXME find something useful
 | 
			
		||||
	char **cmd = {"touch", "/home/maxmanski/iknowhwatyoudidlastsummer", NULL};
 | 
			
		||||
	GPid pid = 0;
 | 
			
		||||
	GSpawnFlags spawn_flags = G_SPAWN_DO_NOT_REAP_CHILD;
 | 
			
		||||
	spawn_flags = G_SPAWN_DEFAULT;
 | 
			
		||||
 | 
			
		||||
	if (!g_spawn_async (NULL, cmd, NULL, spawn_flags, NULL, NULL, &pid, error)){
 | 
			
		||||
		return FALSE;
 | 
			
		||||
	}
 | 
			
		||||
	*/
 | 
			
		||||
 | 
			
		||||
	return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IMPLEMENT ME RIGHT
 | 
			
		||||
static gboolean
 | 
			
		||||
test_connect_interactive(NMVpnServicePlugin *plugin,
 | 
			
		||||
							NMConnection *connection,
 | 
			
		||||
							GError **error){
 | 
			
		||||
	_LOGI("Did an interactive dummy connect");
 | 
			
		||||
	return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
_connect_common (NMVpnServicePlugin   *plugin,
 | 
			
		||||
                 NMConnection  *connection,
 | 
			
		||||
@ -2013,7 +2080,7 @@ _connect_common (NMVpnServicePlugin   *plugin,
 | 
			
		||||
		g_error_free (local);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nm_openvpn_start_openvpn_binary (NM_OPENVPN_PLUGIN (plugin),
 | 
			
		||||
	return nm_openvpn_start_openvpn_binary (NM_WIREGUARD_PLUGIN (plugin),
 | 
			
		||||
	                                        connection,
 | 
			
		||||
	                                        error);
 | 
			
		||||
}
 | 
			
		||||
@ -2035,10 +2102,21 @@ real_connect_interactive (NMVpnServicePlugin   *plugin,
 | 
			
		||||
	if (!_connect_common (plugin, connection, details, error))
 | 
			
		||||
		return FALSE;
 | 
			
		||||
 | 
			
		||||
	NM_OPENVPN_PLUGIN_GET_PRIVATE (plugin)->interactive = TRUE;
 | 
			
		||||
	NM_WIREGUARD_PLUGIN_GET_PRIVATE (plugin)->interactive = TRUE;
 | 
			
		||||
	return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IMPLEMENT ME RIGHT
 | 
			
		||||
static gboolean
 | 
			
		||||
test_need_secrets (NMVpnServicePlugin *plugin,
 | 
			
		||||
					NMConnection *connection,
 | 
			
		||||
					const char **setting_name,
 | 
			
		||||
					GError **error)
 | 
			
		||||
{
 | 
			
		||||
	_LOGI("I require no secrets!");
 | 
			
		||||
	return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
real_need_secrets (NMVpnServicePlugin *plugin,
 | 
			
		||||
                   NMConnection *connection,
 | 
			
		||||
@ -2081,12 +2159,22 @@ real_need_secrets (NMVpnServicePlugin *plugin,
 | 
			
		||||
	return need_secrets;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IMPLEMENT ME RIGHT
 | 
			
		||||
static gboolean
 | 
			
		||||
test_new_secrets (NMVpnServicePlugin *plugin,
 | 
			
		||||
                  NMConnection *connection,
 | 
			
		||||
				  GError **error)
 | 
			
		||||
{
 | 
			
		||||
	_LOGI("New Secrets, anyone?");
 | 
			
		||||
	return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
real_new_secrets (NMVpnServicePlugin *plugin,
 | 
			
		||||
                  NMConnection *connection,
 | 
			
		||||
                  GError **error)
 | 
			
		||||
{
 | 
			
		||||
	NMOpenvpnPluginPrivate *priv = NM_OPENVPN_PLUGIN_GET_PRIVATE (plugin);
 | 
			
		||||
	NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE (plugin);
 | 
			
		||||
	NMSettingVpn *s_vpn;
 | 
			
		||||
	const char *message = NULL;
 | 
			
		||||
	char **hints = NULL;
 | 
			
		||||
@ -2124,14 +2212,29 @@ real_new_secrets (NMVpnServicePlugin *plugin,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
nm_openvpn_plugin_init (NMOpenvpnPlugin *plugin)
 | 
			
		||||
nm_wireguard_plugin_init (NMWireguardPlugin *plugin)
 | 
			
		||||
{
 | 
			
		||||
	// FIXME this is only for testing if the function gets called
 | 
			
		||||
	GPid pid = 0;
 | 
			
		||||
	GError *error = NULL;
 | 
			
		||||
	char **cmd = malloc(sizeof(char *) * 3);
 | 
			
		||||
	cmd[0] = "/usr/bin/touch";
 | 
			
		||||
	cmd[1] = "/home/maxmanski/givemeyournumber";
 | 
			
		||||
	cmd[2] = NULL;
 | 
			
		||||
	GSpawnFlags spawn_flags = G_SPAWN_DO_NOT_REAP_CHILD;
 | 
			
		||||
	spawn_flags = G_SPAWN_DEFAULT;
 | 
			
		||||
 | 
			
		||||
	if (!g_spawn_async (NULL, cmd, NULL, spawn_flags, NULL, NULL, &pid, &error)){
 | 
			
		||||
		printf("Could not spawn:%s\n", error->message);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	printf("Spawned:%d.\n", pid);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
dispose (GObject *object)
 | 
			
		||||
{
 | 
			
		||||
	NMOpenvpnPluginPrivate *priv = NM_OPENVPN_PLUGIN_GET_PRIVATE (object);
 | 
			
		||||
	NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE (object);
 | 
			
		||||
 | 
			
		||||
	nm_clear_g_source (&priv->connect_timer);
 | 
			
		||||
 | 
			
		||||
@ -2140,33 +2243,34 @@ dispose (GObject *object)
 | 
			
		||||
		priv->pid = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	G_OBJECT_CLASS (nm_openvpn_plugin_parent_class)->dispose (object);
 | 
			
		||||
	G_OBJECT_CLASS (nm_wireguard_plugin_parent_class)->dispose (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
nm_openvpn_plugin_class_init (NMOpenvpnPluginClass *plugin_class)
 | 
			
		||||
nm_wireguard_plugin_class_init (NMWireguardPluginClass *plugin_class)
 | 
			
		||||
{
 | 
			
		||||
	GObjectClass *object_class = G_OBJECT_CLASS (plugin_class);
 | 
			
		||||
	NMVpnServicePluginClass *parent_class = NM_VPN_SERVICE_PLUGIN_CLASS (plugin_class);
 | 
			
		||||
 | 
			
		||||
	g_type_class_add_private (object_class, sizeof (NMOpenvpnPluginPrivate));
 | 
			
		||||
	g_type_class_add_private (object_class, sizeof (NMWireguardPluginPrivate));
 | 
			
		||||
 | 
			
		||||
	object_class->dispose = dispose;
 | 
			
		||||
 | 
			
		||||
	/* virtual methods */
 | 
			
		||||
	parent_class->connect      = real_connect;
 | 
			
		||||
	parent_class->connect_interactive = real_connect_interactive;
 | 
			
		||||
	parent_class->need_secrets = real_need_secrets;
 | 
			
		||||
	parent_class->disconnect   = real_disconnect;
 | 
			
		||||
	parent_class->new_secrets  = real_new_secrets;
 | 
			
		||||
	// IMPLEMENT ME RIGHT
 | 
			
		||||
	parent_class->connect      = test_connect;
 | 
			
		||||
	parent_class->connect_interactive = test_connect_interactive;
 | 
			
		||||
	parent_class->need_secrets = test_need_secrets;
 | 
			
		||||
	parent_class->disconnect   = test_disconnect;
 | 
			
		||||
	parent_class->new_secrets  = test_new_secrets;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
plugin_state_changed (NMOpenvpnPlugin *plugin,
 | 
			
		||||
plugin_state_changed (NMWireguardPlugin *plugin,
 | 
			
		||||
                      NMVpnServiceState state,
 | 
			
		||||
                      gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	NMOpenvpnPluginPrivate *priv = NM_OPENVPN_PLUGIN_GET_PRIVATE (plugin);
 | 
			
		||||
	NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE (plugin);
 | 
			
		||||
 | 
			
		||||
	switch (state) {
 | 
			
		||||
	case NM_VPN_SERVICE_STATE_UNKNOWN:
 | 
			
		||||
@ -2183,19 +2287,34 @@ plugin_state_changed (NMOpenvpnPlugin *plugin,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
NMOpenvpnPlugin *
 | 
			
		||||
nm_openvpn_plugin_new (const char *bus_name)
 | 
			
		||||
NMWireguardPlugin *
 | 
			
		||||
nm_wireguard_plugin_new (const char *bus_name)
 | 
			
		||||
{
 | 
			
		||||
	NMOpenvpnPlugin *plugin;
 | 
			
		||||
	NMWireguardPlugin *plugin;
 | 
			
		||||
	GError *error = NULL;
 | 
			
		||||
 | 
			
		||||
	plugin =  (NMOpenvpnPlugin *) g_initable_new (NM_TYPE_OPENVPN_PLUGIN, NULL, &error,
 | 
			
		||||
	// TODO rem
 | 
			
		||||
	printf("%s\n", NM_VPN_SERVICE_PLUGIN_DBUS_SERVICE_NAME);
 | 
			
		||||
	printf("%s\n", bus_name);
 | 
			
		||||
 | 
			
		||||
	// NOTE: owning this name must be allowed in a DBUS configuration file:
 | 
			
		||||
	// "/etc/dbus-1/system.d/nm-wireguard-service.conf"
 | 
			
		||||
	// (an example conf file was copied to the root of this project)
 | 
			
		||||
	plugin =  (NMWireguardPlugin *) g_initable_new (NM_TYPE_WIREGUARD_PLUGIN, NULL, &error,
 | 
			
		||||
	                                              NM_VPN_SERVICE_PLUGIN_DBUS_SERVICE_NAME, bus_name,
 | 
			
		||||
	                                              NM_VPN_SERVICE_PLUGIN_DBUS_WATCH_PEER, !gl.debug,
 | 
			
		||||
	                                              NULL);
 | 
			
		||||
 | 
			
		||||
	if (plugin) {
 | 
			
		||||
		g_signal_connect (G_OBJECT (plugin), "state-changed", G_CALLBACK (plugin_state_changed), NULL);
 | 
			
		||||
 | 
			
		||||
		// FIXME export interface
 | 
			
		||||
		/*
 | 
			
		||||
		void *iface = NULL;
 | 
			
		||||
		void *conn = NULL;
 | 
			
		||||
		g_dbus_interface_skeleton_export(iface, conn, NM_DBUS_PATH_OPENVPN, &error);
 | 
			
		||||
		*/
 | 
			
		||||
 | 
			
		||||
	} else {
 | 
			
		||||
		_LOGW ("Failed to initialize a plugin instance: %s", error->message);
 | 
			
		||||
		g_error_free (error);
 | 
			
		||||
@ -2220,7 +2339,7 @@ quit_mainloop (NMVpnServicePlugin *plugin, gpointer user_data)
 | 
			
		||||
int
 | 
			
		||||
main (int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
	NMOpenvpnPlugin *plugin;
 | 
			
		||||
	NMWireguardPlugin *plugin;
 | 
			
		||||
	gboolean persist = FALSE;
 | 
			
		||||
	GOptionContext *opt_ctx = NULL;
 | 
			
		||||
	gchar *bus_name = NM_DBUS_SERVICE_OPENVPN;
 | 
			
		||||
@ -2238,13 +2357,14 @@ main (int argc, char *argv[])
 | 
			
		||||
	g_type_init ();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	if (getenv ("OPENVPN_DEBUG"))
 | 
			
		||||
	// TODO rem, was: "OPENVPN_DEBUG"
 | 
			
		||||
	if (getenv ("WIREGUARD_DEBUG"))
 | 
			
		||||
		gl.debug = TRUE;
 | 
			
		||||
 | 
			
		||||
	/* locale will be set according to environment LC_* variables */
 | 
			
		||||
	setlocale (LC_ALL, "");
 | 
			
		||||
 | 
			
		||||
	bindtextdomain (GETTEXT_PACKAGE, NM_OPENVPN_LOCALEDIR);
 | 
			
		||||
	bindtextdomain (GETTEXT_PACKAGE, NM_WIREGUARD_LOCALEDIR);
 | 
			
		||||
	bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
 | 
			
		||||
	textdomain (GETTEXT_PACKAGE);
 | 
			
		||||
 | 
			
		||||
@ -2255,6 +2375,7 @@ main (int argc, char *argv[])
 | 
			
		||||
	g_option_context_set_help_enabled (opt_ctx, TRUE);
 | 
			
		||||
	g_option_context_add_main_entries (opt_ctx, options, NULL);
 | 
			
		||||
 | 
			
		||||
	// TODO translate
 | 
			
		||||
	g_option_context_set_summary (opt_ctx,
 | 
			
		||||
	                              _("nm-openvpn-service provides integrated "
 | 
			
		||||
	                                "OpenVPN capability to NetworkManager."));
 | 
			
		||||
@ -2292,15 +2413,23 @@ main (int argc, char *argv[])
 | 
			
		||||
	                                              10, 0, 1,
 | 
			
		||||
	                                              gl.debug ? 0 : 1);
 | 
			
		||||
 | 
			
		||||
	_LOGD ("nm-openvpn-service (version " DIST_VERSION ") starting...");
 | 
			
		||||
	_LOGD ("nm-wireguard-service (version " DIST_VERSION ") starting...");
 | 
			
		||||
 | 
			
		||||
	// TODO what is this, rem
 | 
			
		||||
	if (   !g_file_test ("/sys/class/misc/tun", G_FILE_TEST_EXISTS)
 | 
			
		||||
	    && (system ("/sbin/modprobe tun") == -1))
 | 
			
		||||
		exit (EXIT_FAILURE);
 | 
			
		||||
	    && (system ("/sbin/modprobe tun") == -1)){
 | 
			
		||||
		
 | 
			
		||||
			printf("tun stuff not found :>\n");
 | 
			
		||||
			exit (EXIT_FAILURE);
 | 
			
		||||
		}
 | 
			
		||||
	printf("tun stuff seems okay tho\n");
 | 
			
		||||
 | 
			
		||||
	plugin = nm_openvpn_plugin_new (bus_name);
 | 
			
		||||
	if (!plugin)
 | 
			
		||||
	// TODO fails here:
 | 
			
		||||
	// nm-openvpn[27808] <warn>  Failed to initialize a plugin instance: Connection ":1.598" is not allowed to own the service "org.freedesktop.NetworkManager.openvpn" due to security policies in the configuration file
 | 
			
		||||
	plugin = nm_wireguard_plugin_new (bus_name);
 | 
			
		||||
	if (!plugin){
 | 
			
		||||
		exit (EXIT_FAILURE);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	loop = g_main_loop_new (NULL, FALSE);
 | 
			
		||||
 | 
			
		||||
@ -2311,6 +2440,8 @@ main (int argc, char *argv[])
 | 
			
		||||
	g_unix_signal_add (SIGTERM, signal_handler, loop);
 | 
			
		||||
	g_unix_signal_add (SIGINT, signal_handler, loop);
 | 
			
		||||
 | 
			
		||||
	printf("Running the main loop ;>\n");
 | 
			
		||||
 | 
			
		||||
	g_main_loop_run (loop);
 | 
			
		||||
	g_object_unref (plugin);
 | 
			
		||||
 | 
			
		||||
@ -2318,5 +2449,7 @@ main (int argc, char *argv[])
 | 
			
		||||
 | 
			
		||||
	g_main_loop_unref (loop);
 | 
			
		||||
 | 
			
		||||
	printf("Exiting...\n");
 | 
			
		||||
 | 
			
		||||
	exit (EXIT_SUCCESS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user