diff options
author | Jiří Klimeš <jklimes@redhat.com> | 2014-09-11 10:07:47 +0200 |
---|---|---|
committer | Jiří Klimeš <jklimes@redhat.com> | 2014-09-26 13:54:25 +0200 |
commit | 502eb2daf9f3e390547aac38c42b24ea1ae75df7 (patch) | |
tree | 8ce2a6563ec9530225aa0e09268bce80a6a9ed05 | |
parent | 54a5f4513b5d137c299c21e37f27245eae7d5c07 (diff) | |
download | NetworkManager-502eb2daf9f3e390547aac38c42b24ea1ae75df7.tar.gz |
core: add ClearSecrets() D-Bus call
It clears all secrets in a connection.
-rw-r--r-- | introspection/nm-settings-connection.xml | 8 | ||||
-rw-r--r-- | src/settings/nm-settings-connection.c | 76 |
2 files changed, 78 insertions, 6 deletions
diff --git a/introspection/nm-settings-connection.xml b/introspection/nm-settings-connection.xml index b5bd2cd0e0..b02762d6be 100644 --- a/introspection/nm-settings-connection.xml +++ b/introspection/nm-settings-connection.xml @@ -93,6 +93,14 @@ </arg> </method> + <method name="ClearSecrets"> + <tp:docstring> + Clear the secrets belonging to this network connection profile. + </tp:docstring> + <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_settings_connection_clear_secrets"/> + <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> + </method> + <method name="Save"> <tp:docstring> Saves a "dirty" connection (that had previously been diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c index c0e6794a85..6b0d38c738 100644 --- a/src/settings/nm-settings-connection.c +++ b/src/settings/nm-settings-connection.c @@ -66,6 +66,9 @@ static void impl_settings_connection_get_secrets (NMSettingsConnection *connecti const gchar *setting_name, DBusGMethodInvocation *context); +static void impl_settings_connection_clear_secrets (NMSettingsConnection *connection, + DBusGMethodInvocation *context); + #include "nm-settings-connection-glue.h" static void nm_settings_connection_connection_interface_init (NMConnectionInterface *iface); @@ -1577,11 +1580,11 @@ dbus_get_agent_secrets_cb (NMSettingsConnection *self, } static void -dbus_secrets_auth_cb (NMSettingsConnection *self, - DBusGMethodInvocation *context, - NMAuthSubject *subject, - GError *error, - gpointer user_data) +dbus_get_secrets_auth_cb (NMSettingsConnection *self, + DBusGMethodInvocation *context, + NMAuthSubject *subject, + GError *error, + gpointer user_data) { NMSettingsConnectionPrivate *priv = NM_SETTINGS_CONNECTION_GET_PRIVATE (self); char *setting_name = user_data; @@ -1625,7 +1628,7 @@ impl_settings_connection_get_secrets (NMSettingsConnection *self, context, subject, get_modify_permission_basic (self), - dbus_secrets_auth_cb, + dbus_get_secrets_auth_cb, g_strdup (setting_name)); g_object_unref (subject); } else { @@ -1634,6 +1637,67 @@ impl_settings_connection_get_secrets (NMSettingsConnection *self, } } +static void +clear_secrets_cb (NMSettingsConnection *self, + GError *error, + gpointer user_data) +{ + DBusGMethodInvocation *context = (DBusGMethodInvocation *) user_data; + + if (error) + dbus_g_method_return_error (context, error); + else + dbus_g_method_return (context); +} + +static void +dbus_clear_secrets_auth_cb (NMSettingsConnection *self, + DBusGMethodInvocation *context, + NMAuthSubject *subject, + GError *error, + gpointer user_data) +{ + NMSettingsConnectionPrivate *priv = NM_SETTINGS_CONNECTION_GET_PRIVATE (self); + + if (error) + dbus_g_method_return_error (context, error); + else { + /* Clear secrets in connection and caches */ + nm_connection_clear_secrets (NM_CONNECTION (self)); + if (priv->system_secrets) + nm_connection_clear_secrets (priv->system_secrets); + if (priv->agent_secrets) + nm_connection_clear_secrets (priv->agent_secrets); + + /* Tell agents to remove secrets for this connection */ + nm_agent_manager_delete_secrets (priv->agent_mgr, NM_CONNECTION (self)); + + nm_settings_connection_commit_changes (self, clear_secrets_cb, context); + } +} + +static void +impl_settings_connection_clear_secrets (NMSettingsConnection *self, + DBusGMethodInvocation *context) +{ + NMAuthSubject *subject; + GError *error = NULL; + + subject = _new_auth_subject (context, &error); + if (subject) { + auth_start (self, + context, + subject, + get_modify_permission_basic (self), + dbus_clear_secrets_auth_cb, + NULL); + g_object_unref (subject); + } else { + dbus_g_method_return_error (context, error); + g_error_free (error); + } +} + /**************************************************************/ void |