diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2021-02-11 09:45:00 +0100 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2021-02-12 14:15:51 +0100 |
commit | 514d033b8d0b9e411ba7e878ddbfa338c6720e6f (patch) | |
tree | 818f85aa5658a886ea829b5e3611f85526b865d7 | |
parent | 84890e59577a32fc1ac3e2c033e6f34fdbadb74c (diff) | |
download | network-manager-applet-bg/applet-wireguard.tar.gz |
applet: support activating WireGuard connections as VPNsbg/applet-wireguard
Display WireGuard connections in the VPN submenu and allow
[de]activating them.
https://gitlab.gnome.org/GNOME/network-manager-applet/-/issues/77
-rw-r--r-- | src/applet.c | 65 |
1 files changed, 45 insertions, 20 deletions
diff --git a/src/applet.c b/src/applet.c index 8ebac755..8cf6dc43 100644 --- a/src/applet.c +++ b/src/applet.c @@ -876,6 +876,13 @@ applet_is_any_device_activating (NMApplet *applet) } static gboolean +connection_is_vpn (NMConnection *connection) +{ + return nm_connection_is_type (connection, NM_SETTING_VPN_SETTING_NAME) + || nm_connection_is_type (connection, NM_SETTING_WIREGUARD_SETTING_NAME); +} + +static gboolean applet_is_any_vpn_activating (NMApplet *applet) { const GPtrArray *connections; @@ -1062,10 +1069,13 @@ nma_menu_vpn_item_clicked (GtkMenuItem *item, gpointer user_data) return; } - active = applet_get_default_active_connection (applet, &device, FALSE); - if (!active || !device) { - g_warning ("%s: no active connection or device.", __func__); - return; + if (nm_connection_is_type (connection, NM_SETTING_VPN_SETTING_NAME)) { + active = applet_get_default_active_connection (applet, &device, FALSE); + if (!active || !device) { + /* FIXME: show a UI notification ? */ + g_warning ("%s: no active connection or device.", __func__); + return; + } } info = g_malloc0 (sizeof (VPNActivateInfo)); @@ -1076,7 +1086,7 @@ nma_menu_vpn_item_clicked (GtkMenuItem *item, gpointer user_data) nm_client_activate_connection_async (applet->nm_client, connection, device, - nm_object_get_path (NM_OBJECT (active)), + active ? nm_object_get_path (NM_OBJECT (active)) : NULL, NULL, activate_vpn_cb, info); @@ -1112,6 +1122,25 @@ nma_menu_add_vpn_item_activate (GtkMenuItem *item, gpointer user_data) g_spawn_async (NULL, (gchar **) argv, NULL, 0, NULL, NULL, NULL, NULL); } +static NMVpnConnectionState +ac_state_to_vpn_state (NMActiveConnectionState ac_state) +{ + switch (ac_state) { + case NM_ACTIVE_CONNECTION_STATE_UNKNOWN: + return NM_VPN_CONNECTION_STATE_UNKNOWN; + case NM_ACTIVE_CONNECTION_STATE_ACTIVATING: + return NM_VPN_CONNECTION_STATE_PREPARE; + case NM_ACTIVE_CONNECTION_STATE_ACTIVATED: + case NM_ACTIVE_CONNECTION_STATE_DEACTIVATING: + return NM_VPN_CONNECTION_STATE_ACTIVATED; + case NM_ACTIVE_CONNECTION_STATE_DEACTIVATED: + return NM_VPN_CONNECTION_STATE_DISCONNECTED; + } + + nm_assert_not_reached (); + return NM_VPN_CONNECTION_STATE_UNKNOWN; +} + /* * applet_get_active_vpn_connection: * @@ -1121,7 +1150,7 @@ nma_menu_add_vpn_item_activate (GtkMenuItem *item, gpointer user_data) */ static NMActiveConnection * applet_get_active_vpn_connection (NMApplet *applet, - NMVpnConnectionState *out_state) + NMVpnConnectionState *out_state) { const GPtrArray *active_list; NMActiveConnection *ret = NULL; @@ -1132,7 +1161,6 @@ applet_get_active_vpn_connection (NMApplet *applet, for (i = 0; active_list && (i < active_list->len); i++) { NMActiveConnection *candidate; NMConnection *connection; - NMSettingConnection *s_con; candidate = g_ptr_array_index (active_list, i); @@ -1140,17 +1168,20 @@ applet_get_active_vpn_connection (NMApplet *applet, if (!connection) continue; - s_con = nm_connection_get_setting_connection (connection); - if (!s_con) + if (!connection_is_vpn (connection)) continue; - if (!strcmp (nm_setting_connection_get_connection_type (s_con), NM_SETTING_VPN_SETTING_NAME)) { - ret = candidate; + ret = candidate; + if (nm_connection_is_type (connection, NM_SETTING_VPN_SETTING_NAME)) { state = nm_vpn_connection_get_vpn_state (NM_VPN_CONNECTION (candidate)); + } else { + NMActiveConnectionState ac_state; - if (state != NM_VPN_CONNECTION_STATE_ACTIVATED) - break; + ac_state = nm_active_connection_get_state (candidate); + state = ac_state_to_vpn_state (ac_state); } + if (state != NM_VPN_CONNECTION_STATE_ACTIVATED) + break; } if (ret && out_state) @@ -1453,15 +1484,9 @@ get_vpn_connections (NMApplet *applet) for (i = 0; i < all_connections->len; i++) { NMConnection *connection = NM_CONNECTION (all_connections->pdata[i]); - if (!nm_connection_is_type (connection, NM_SETTING_VPN_SETTING_NAME)) + if (!connection_is_vpn (connection)) continue; - if (!nm_connection_get_setting_vpn (connection)) { - g_warning ("%s: VPN connection '%s' didn't have required vpn setting.", __func__, - nm_connection_get_id (connection)); - continue; - } - g_ptr_array_add (vpn_connections, g_object_ref (connection)); } |