Make first steps towards WG plugin from OVPN plugin
parent
337d10e1e0
commit
4517f7590f
|
@ -22,11 +22,11 @@
|
||||||
#ifndef __NM_SERVICE_DEFINES_H__
|
#ifndef __NM_SERVICE_DEFINES_H__
|
||||||
#define __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_SERVICE_OPENVPN "org.freedesktop.NetworkManager.wireguard"
|
||||||
#define NM_DBUS_INTERFACE_OPENVPN "org.freedesktop.NetworkManager.openvpn"
|
#define NM_DBUS_INTERFACE_OPENVPN "org.freedesktop.NetworkManager.wireguard"
|
||||||
#define NM_DBUS_PATH_OPENVPN "/org/freedesktop/NetworkManager/openvpn"
|
#define NM_DBUS_PATH_OPENVPN "/org/freedesktop/NetworkManager/wireguard"
|
||||||
|
|
||||||
#define NM_OPENVPN_KEY_AUTH "auth"
|
#define NM_OPENVPN_KEY_AUTH "auth"
|
||||||
#define NM_OPENVPN_KEY_CA "ca"
|
#define NM_OPENVPN_KEY_CA "ca"
|
||||||
|
|
|
@ -52,6 +52,20 @@
|
||||||
# define DIST_VERSION VERSION
|
# define DIST_VERSION VERSION
|
||||||
#endif
|
#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"
|
#define RUNDIR LOCALSTATEDIR"/run/NetworkManager"
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
|
@ -66,24 +80,24 @@ static struct {
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define NM_TYPE_OPENVPN_PLUGIN (nm_openvpn_plugin_get_type ())
|
#define NM_TYPE_WIREGUARD_PLUGIN (nm_wireguard_plugin_get_type ())
|
||||||
#define NM_OPENVPN_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_OPENVPN_PLUGIN, NMOpenvpnPlugin))
|
#define NM_WIREGUARD_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_WIREGUARD_PLUGIN, NMWireguardPlugin))
|
||||||
#define NM_OPENVPN_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_OPENVPN_PLUGIN, NMOpenvpnPluginClass))
|
#define NM_WIREGUARD_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_WIREGUARD_PLUGIN, NMWireguardPluginClass))
|
||||||
#define NM_IS_OPENVPN_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_OPENVPN_PLUGIN))
|
#define NM_IS_WIREGUARD_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_WIREGUARD_PLUGIN))
|
||||||
#define NM_IS_OPENVPN_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_OPENVPN_PLUGIN))
|
#define NM_IS_WIREGUARD_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_WIREGUARD_PLUGIN))
|
||||||
#define NM_OPENVPN_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_OPENVPN_PLUGIN, NMOpenvpnPluginClass))
|
#define NM_WIREGUARD_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_WIREGUARD_PLUGIN, NMWireguardPluginClass))
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
NMVpnServicePlugin parent;
|
NMVpnServicePlugin parent;
|
||||||
} NMOpenvpnPlugin;
|
} NMWireguardPlugin;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
NMVpnServicePluginClass parent;
|
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;
|
GPid pid;
|
||||||
guint watch_id;
|
guint watch_id;
|
||||||
guint kill_id;
|
guint kill_id;
|
||||||
NMOpenvpnPlugin *plugin;
|
NMWireguardPlugin *plugin;
|
||||||
} PidsPendingData;
|
} PidsPendingData;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -113,20 +127,20 @@ typedef struct {
|
||||||
char *challenge_text;
|
char *challenge_text;
|
||||||
GIOChannel *socket_channel;
|
GIOChannel *socket_channel;
|
||||||
guint socket_channel_eventid;
|
guint socket_channel_eventid;
|
||||||
} NMOpenvpnPluginIOData;
|
} NMWireguardPluginIOData;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
GPid pid;
|
GPid pid;
|
||||||
guint connect_timer;
|
guint connect_timer;
|
||||||
guint connect_count;
|
guint connect_count;
|
||||||
NMOpenvpnPluginIOData *io_data;
|
NMWireguardPluginIOData *io_data;
|
||||||
gboolean interactive;
|
gboolean interactive;
|
||||||
char *mgt_path;
|
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);
|
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
|
static void
|
||||||
pids_pending_child_watch_cb (GPid pid, gint status, gpointer user_data)
|
pids_pending_child_watch_cb (GPid pid, gint status, gpointer user_data)
|
||||||
{
|
{
|
||||||
PidsPendingData *pid_data = user_data;
|
PidsPendingData *pid_data = user_data;
|
||||||
NMOpenvpnPlugin *plugin;
|
NMWireguardPlugin *plugin;
|
||||||
|
|
||||||
if (WIFEXITED (status)) {
|
if (WIFEXITED (status)) {
|
||||||
int exit_status;
|
int exit_status;
|
||||||
|
@ -360,11 +374,11 @@ pids_pending_child_watch_cb (GPid pid, gint status, gpointer user_data)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
pids_pending_add (GPid pid, NMOpenvpnPlugin *plugin)
|
pids_pending_add (GPid pid, NMWireguardPlugin *plugin)
|
||||||
{
|
{
|
||||||
PidsPendingData *pid_data;
|
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);
|
g_return_if_fail (pid > 0);
|
||||||
|
|
||||||
_LOGI ("openvpn[%ld] started", (long) pid);
|
_LOGI ("openvpn[%ld] started", (long) pid);
|
||||||
|
@ -557,10 +571,10 @@ nm_openvpn_secrets_validate (NMSettingVpn *s_vpn, GError **error)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nm_openvpn_disconnect_management_socket (NMOpenvpnPlugin *plugin)
|
nm_openvpn_disconnect_management_socket (NMWireguardPlugin *plugin)
|
||||||
{
|
{
|
||||||
NMOpenvpnPluginPrivate *priv = NM_OPENVPN_PLUGIN_GET_PRIVATE (plugin);
|
NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE (plugin);
|
||||||
NMOpenvpnPluginIOData *io_data = priv->io_data;
|
NMWireguardPluginIOData *io_data = priv->io_data;
|
||||||
|
|
||||||
/* This should not throw a warning since this can happen in
|
/* This should not throw a warning since this can happen in
|
||||||
non-password modes */
|
non-password modes */
|
||||||
|
@ -695,7 +709,7 @@ write_user_pass (GIOChannel *channel,
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
handle_auth (NMOpenvpnPluginIOData *io_data,
|
handle_auth (NMWireguardPluginIOData *io_data,
|
||||||
const char *requested_auth,
|
const char *requested_auth,
|
||||||
const char **out_message,
|
const char **out_message,
|
||||||
char ***out_hints)
|
char ***out_hints)
|
||||||
|
@ -795,12 +809,12 @@ handle_auth (NMOpenvpnPluginIOData *io_data,
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
handle_management_socket (NMOpenvpnPlugin *plugin,
|
handle_management_socket (NMWireguardPlugin *plugin,
|
||||||
GIOChannel *source,
|
GIOChannel *source,
|
||||||
GIOCondition condition,
|
GIOCondition condition,
|
||||||
NMVpnPluginFailure *out_failure)
|
NMVpnPluginFailure *out_failure)
|
||||||
{
|
{
|
||||||
NMOpenvpnPluginPrivate *priv = NM_OPENVPN_PLUGIN_GET_PRIVATE (plugin);
|
NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE (plugin);
|
||||||
gboolean again = TRUE;
|
gboolean again = TRUE;
|
||||||
char *str = NULL, *auth = NULL;
|
char *str = NULL, *auth = NULL;
|
||||||
const char *message = NULL;
|
const char *message = NULL;
|
||||||
|
@ -899,7 +913,7 @@ out:
|
||||||
static gboolean
|
static gboolean
|
||||||
nm_openvpn_socket_data_cb (GIOChannel *source, GIOCondition condition, gpointer user_data)
|
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;
|
NMVpnPluginFailure failure = NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED;
|
||||||
|
|
||||||
if (!handle_management_socket (plugin, source, condition, &failure)) {
|
if (!handle_management_socket (plugin, source, condition, &failure)) {
|
||||||
|
@ -913,9 +927,9 @@ nm_openvpn_socket_data_cb (GIOChannel *source, GIOCondition condition, gpointer
|
||||||
static gboolean
|
static gboolean
|
||||||
nm_openvpn_connect_timer_cb (gpointer data)
|
nm_openvpn_connect_timer_cb (gpointer data)
|
||||||
{
|
{
|
||||||
NMOpenvpnPlugin *plugin = NM_OPENVPN_PLUGIN (data);
|
NMWireguardPlugin *plugin = NM_WIREGUARD_PLUGIN (data);
|
||||||
NMOpenvpnPluginPrivate *priv = NM_OPENVPN_PLUGIN_GET_PRIVATE (plugin);
|
NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE (plugin);
|
||||||
NMOpenvpnPluginIOData *io_data = priv->io_data;
|
NMWireguardPluginIOData *io_data = priv->io_data;
|
||||||
struct sockaddr_un remote = { 0 };
|
struct sockaddr_un remote = { 0 };
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
|
@ -955,24 +969,24 @@ out:
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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)
|
if (priv->connect_timer == 0)
|
||||||
priv->connect_timer = g_timeout_add (200, nm_openvpn_connect_timer_cb, plugin);
|
priv->connect_timer = g_timeout_add (200, nm_openvpn_connect_timer_cb, plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
NMVpnPluginFailure failure = NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED;
|
||||||
gboolean good_exit = FALSE;
|
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. */
|
/* Reap child if needed. */
|
||||||
if (priv->pid != pid) {
|
if (priv->pid != pid) {
|
||||||
/* the dead child is not the currently active process. Nothing to do, we just
|
/* 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
|
static void
|
||||||
update_io_data_from_vpn_setting (NMOpenvpnPluginIOData *io_data,
|
update_io_data_from_vpn_setting (NMWireguardPluginIOData *io_data,
|
||||||
NMSettingVpn *s_vpn,
|
NMSettingVpn *s_vpn,
|
||||||
const char *default_username)
|
const char *default_username)
|
||||||
{
|
{
|
||||||
|
@ -1247,11 +1261,22 @@ check_chroot_dir_usability (const char *chdir, const char *user)
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
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,
|
NMConnection *connection,
|
||||||
GError **error)
|
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;
|
const char *openvpn_binary, *auth, *tmp, *tmp2, *tmp3, *tmp4;
|
||||||
gs_unref_ptrarray GPtrArray *args = NULL;
|
gs_unref_ptrarray GPtrArray *args = NULL;
|
||||||
GPid pid;
|
GPid pid;
|
||||||
|
@ -1912,7 +1937,7 @@ nm_openvpn_start_openvpn_binary (NMOpenvpnPlugin *plugin,
|
||||||
|| !strcmp (connection_type, NM_OPENVPN_CONTYPE_PASSWORD_TLS)
|
|| !strcmp (connection_type, NM_OPENVPN_CONTYPE_PASSWORD_TLS)
|
||||||
|| nm_setting_vpn_get_data_item (s_vpn, NM_OPENVPN_KEY_HTTP_PROXY_USERNAME)) {
|
|| 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,
|
update_io_data_from_vpn_setting (priv->io_data, s_vpn,
|
||||||
nm_setting_vpn_get_user_name (s_vpn));
|
nm_setting_vpn_get_user_name (s_vpn));
|
||||||
nm_openvpn_schedule_connect_timer (plugin);
|
nm_openvpn_schedule_connect_timer (plugin);
|
||||||
|
@ -1979,11 +2004,20 @@ check_need_secrets (NMSettingVpn *s_vpn, gboolean *need_secrets)
|
||||||
return ctype;
|
return ctype;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IMPLEMENT ME RIGHT
|
||||||
|
static gboolean
|
||||||
|
test_disconnect(NMVpnServicePlugin *plugin,
|
||||||
|
GError **err)
|
||||||
|
{
|
||||||
|
_LOGI("Did a disconnect!");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
real_disconnect (NMVpnServicePlugin *plugin,
|
real_disconnect (NMVpnServicePlugin *plugin,
|
||||||
GError **err)
|
GError **err)
|
||||||
{
|
{
|
||||||
NMOpenvpnPluginPrivate *priv = NM_OPENVPN_PLUGIN_GET_PRIVATE (plugin);
|
NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE (plugin);
|
||||||
|
|
||||||
if (priv->mgt_path) {
|
if (priv->mgt_path) {
|
||||||
/* openvpn does not cleanup the management socket upon exit,
|
/* openvpn does not cleanup the management socket upon exit,
|
||||||
|
@ -2000,6 +2034,39 @@ real_disconnect (NMVpnServicePlugin *plugin,
|
||||||
return TRUE;
|
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
|
static gboolean
|
||||||
_connect_common (NMVpnServicePlugin *plugin,
|
_connect_common (NMVpnServicePlugin *plugin,
|
||||||
NMConnection *connection,
|
NMConnection *connection,
|
||||||
|
@ -2013,7 +2080,7 @@ _connect_common (NMVpnServicePlugin *plugin,
|
||||||
g_error_free (local);
|
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,
|
connection,
|
||||||
error);
|
error);
|
||||||
}
|
}
|
||||||
|
@ -2035,10 +2102,21 @@ real_connect_interactive (NMVpnServicePlugin *plugin,
|
||||||
if (!_connect_common (plugin, connection, details, error))
|
if (!_connect_common (plugin, connection, details, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
NM_OPENVPN_PLUGIN_GET_PRIVATE (plugin)->interactive = TRUE;
|
NM_WIREGUARD_PLUGIN_GET_PRIVATE (plugin)->interactive = TRUE;
|
||||||
return 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
|
static gboolean
|
||||||
real_need_secrets (NMVpnServicePlugin *plugin,
|
real_need_secrets (NMVpnServicePlugin *plugin,
|
||||||
NMConnection *connection,
|
NMConnection *connection,
|
||||||
|
@ -2081,12 +2159,22 @@ real_need_secrets (NMVpnServicePlugin *plugin,
|
||||||
return need_secrets;
|
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
|
static gboolean
|
||||||
real_new_secrets (NMVpnServicePlugin *plugin,
|
real_new_secrets (NMVpnServicePlugin *plugin,
|
||||||
NMConnection *connection,
|
NMConnection *connection,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
NMOpenvpnPluginPrivate *priv = NM_OPENVPN_PLUGIN_GET_PRIVATE (plugin);
|
NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE (plugin);
|
||||||
NMSettingVpn *s_vpn;
|
NMSettingVpn *s_vpn;
|
||||||
const char *message = NULL;
|
const char *message = NULL;
|
||||||
char **hints = NULL;
|
char **hints = NULL;
|
||||||
|
@ -2124,14 +2212,29 @@ real_new_secrets (NMVpnServicePlugin *plugin,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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
|
static void
|
||||||
dispose (GObject *object)
|
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);
|
nm_clear_g_source (&priv->connect_timer);
|
||||||
|
|
||||||
|
@ -2140,33 +2243,34 @@ dispose (GObject *object)
|
||||||
priv->pid = 0;
|
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
|
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);
|
GObjectClass *object_class = G_OBJECT_CLASS (plugin_class);
|
||||||
NMVpnServicePluginClass *parent_class = NM_VPN_SERVICE_PLUGIN_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;
|
object_class->dispose = dispose;
|
||||||
|
|
||||||
/* virtual methods */
|
/* virtual methods */
|
||||||
parent_class->connect = real_connect;
|
// IMPLEMENT ME RIGHT
|
||||||
parent_class->connect_interactive = real_connect_interactive;
|
parent_class->connect = test_connect;
|
||||||
parent_class->need_secrets = real_need_secrets;
|
parent_class->connect_interactive = test_connect_interactive;
|
||||||
parent_class->disconnect = real_disconnect;
|
parent_class->need_secrets = test_need_secrets;
|
||||||
parent_class->new_secrets = real_new_secrets;
|
parent_class->disconnect = test_disconnect;
|
||||||
|
parent_class->new_secrets = test_new_secrets;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
plugin_state_changed (NMOpenvpnPlugin *plugin,
|
plugin_state_changed (NMWireguardPlugin *plugin,
|
||||||
NMVpnServiceState state,
|
NMVpnServiceState state,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
NMOpenvpnPluginPrivate *priv = NM_OPENVPN_PLUGIN_GET_PRIVATE (plugin);
|
NMWireguardPluginPrivate *priv = NM_WIREGUARD_PLUGIN_GET_PRIVATE (plugin);
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case NM_VPN_SERVICE_STATE_UNKNOWN:
|
case NM_VPN_SERVICE_STATE_UNKNOWN:
|
||||||
|
@ -2183,19 +2287,34 @@ plugin_state_changed (NMOpenvpnPlugin *plugin,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NMOpenvpnPlugin *
|
NMWireguardPlugin *
|
||||||
nm_openvpn_plugin_new (const char *bus_name)
|
nm_wireguard_plugin_new (const char *bus_name)
|
||||||
{
|
{
|
||||||
NMOpenvpnPlugin *plugin;
|
NMWireguardPlugin *plugin;
|
||||||
GError *error = NULL;
|
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_SERVICE_NAME, bus_name,
|
||||||
NM_VPN_SERVICE_PLUGIN_DBUS_WATCH_PEER, !gl.debug,
|
NM_VPN_SERVICE_PLUGIN_DBUS_WATCH_PEER, !gl.debug,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
if (plugin) {
|
if (plugin) {
|
||||||
g_signal_connect (G_OBJECT (plugin), "state-changed", G_CALLBACK (plugin_state_changed), NULL);
|
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 {
|
} else {
|
||||||
_LOGW ("Failed to initialize a plugin instance: %s", error->message);
|
_LOGW ("Failed to initialize a plugin instance: %s", error->message);
|
||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
|
@ -2220,7 +2339,7 @@ quit_mainloop (NMVpnServicePlugin *plugin, gpointer user_data)
|
||||||
int
|
int
|
||||||
main (int argc, char *argv[])
|
main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
NMOpenvpnPlugin *plugin;
|
NMWireguardPlugin *plugin;
|
||||||
gboolean persist = FALSE;
|
gboolean persist = FALSE;
|
||||||
GOptionContext *opt_ctx = NULL;
|
GOptionContext *opt_ctx = NULL;
|
||||||
gchar *bus_name = NM_DBUS_SERVICE_OPENVPN;
|
gchar *bus_name = NM_DBUS_SERVICE_OPENVPN;
|
||||||
|
@ -2238,13 +2357,14 @@ main (int argc, char *argv[])
|
||||||
g_type_init ();
|
g_type_init ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (getenv ("OPENVPN_DEBUG"))
|
// TODO rem, was: "OPENVPN_DEBUG"
|
||||||
|
if (getenv ("WIREGUARD_DEBUG"))
|
||||||
gl.debug = TRUE;
|
gl.debug = TRUE;
|
||||||
|
|
||||||
/* locale will be set according to environment LC_* variables */
|
/* locale will be set according to environment LC_* variables */
|
||||||
setlocale (LC_ALL, "");
|
setlocale (LC_ALL, "");
|
||||||
|
|
||||||
bindtextdomain (GETTEXT_PACKAGE, NM_OPENVPN_LOCALEDIR);
|
bindtextdomain (GETTEXT_PACKAGE, NM_WIREGUARD_LOCALEDIR);
|
||||||
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
|
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
|
||||||
textdomain (GETTEXT_PACKAGE);
|
textdomain (GETTEXT_PACKAGE);
|
||||||
|
|
||||||
|
@ -2255,6 +2375,7 @@ main (int argc, char *argv[])
|
||||||
g_option_context_set_help_enabled (opt_ctx, TRUE);
|
g_option_context_set_help_enabled (opt_ctx, TRUE);
|
||||||
g_option_context_add_main_entries (opt_ctx, options, NULL);
|
g_option_context_add_main_entries (opt_ctx, options, NULL);
|
||||||
|
|
||||||
|
// TODO translate
|
||||||
g_option_context_set_summary (opt_ctx,
|
g_option_context_set_summary (opt_ctx,
|
||||||
_("nm-openvpn-service provides integrated "
|
_("nm-openvpn-service provides integrated "
|
||||||
"OpenVPN capability to NetworkManager."));
|
"OpenVPN capability to NetworkManager."));
|
||||||
|
@ -2292,15 +2413,23 @@ main (int argc, char *argv[])
|
||||||
10, 0, 1,
|
10, 0, 1,
|
||||||
gl.debug ? 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)
|
if ( !g_file_test ("/sys/class/misc/tun", G_FILE_TEST_EXISTS)
|
||||||
&& (system ("/sbin/modprobe tun") == -1))
|
&& (system ("/sbin/modprobe tun") == -1)){
|
||||||
exit (EXIT_FAILURE);
|
|
||||||
|
printf("tun stuff not found :>\n");
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
printf("tun stuff seems okay tho\n");
|
||||||
|
|
||||||
plugin = nm_openvpn_plugin_new (bus_name);
|
// TODO fails here:
|
||||||
if (!plugin)
|
// 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);
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
loop = g_main_loop_new (NULL, FALSE);
|
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 (SIGTERM, signal_handler, loop);
|
||||||
g_unix_signal_add (SIGINT, signal_handler, loop);
|
g_unix_signal_add (SIGINT, signal_handler, loop);
|
||||||
|
|
||||||
|
printf("Running the main loop ;>\n");
|
||||||
|
|
||||||
g_main_loop_run (loop);
|
g_main_loop_run (loop);
|
||||||
g_object_unref (plugin);
|
g_object_unref (plugin);
|
||||||
|
|
||||||
|
@ -2318,5 +2449,7 @@ main (int argc, char *argv[])
|
||||||
|
|
||||||
g_main_loop_unref (loop);
|
g_main_loop_unref (loop);
|
||||||
|
|
||||||
|
printf("Exiting...\n");
|
||||||
|
|
||||||
exit (EXIT_SUCCESS);
|
exit (EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue