diff options
author | Thomas Haller <thaller@redhat.com> | 2015-07-17 10:34:10 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2015-07-24 11:10:18 +0200 |
commit | 6a5657896f305eb1d624fd2687d3b9c1181dcbac (patch) | |
tree | 6fea468d423008a7adaa6941f9a9d42e2b964d28 | |
parent | 238cb02ed672834f2e04f6c30829c3ea9a769e67 (diff) | |
download | NetworkManager-6a5657896f305eb1d624fd2687d3b9c1181dcbac.tar.gz |
keyfile: rename keyfile when user changes connection id
Originally, if you change the ID of a connection,
the existing keyfile will not be renamed. That means
after renaming a connection, it's keyfile name will
mismatch.
Now, when th user modifies a connection via D-Bus and changes
the connection it, rename the file.
https://bugzilla.gnome.org/show_bug.cgi?id=740738
-rw-r--r-- | src/nm-manager.c | 4 | ||||
-rw-r--r-- | src/settings/nm-settings-connection.c | 14 | ||||
-rw-r--r-- | src/settings/nm-settings-connection.h | 7 | ||||
-rw-r--r-- | src/settings/plugins/ifcfg-rh/nm-ifcfg-connection.c | 5 | ||||
-rw-r--r-- | src/settings/plugins/ifnet/nm-ifnet-connection.c | 5 | ||||
-rw-r--r-- | src/settings/plugins/ifupdown/plugin.c | 2 | ||||
-rw-r--r-- | src/settings/plugins/keyfile/nm-keyfile-connection.c | 4 | ||||
-rw-r--r-- | src/settings/plugins/keyfile/plugin.c | 2 | ||||
-rw-r--r-- | src/settings/plugins/keyfile/writer.c | 6 | ||||
-rw-r--r-- | src/settings/plugins/keyfile/writer.h | 1 |
10 files changed, 39 insertions, 11 deletions
diff --git a/src/nm-manager.c b/src/nm-manager.c index cd73125213..d8072d1d69 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -3221,7 +3221,9 @@ activation_add_done (NMSettings *self, nm_active_connection_set_connection (info->active, NM_CONNECTION (new_connection)); if (_internal_activate_generic (info->manager, info->active, &local)) { - nm_settings_connection_commit_changes (new_connection, NULL, NULL); + nm_settings_connection_commit_changes (new_connection, + NM_SETTINGS_CONNECTION_COMMIT_REASON_USER_ACTION | NM_SETTINGS_CONNECTION_COMMIT_REASON_ID_CHANGED, + NULL, NULL); dbus_g_method_return (context, nm_connection_get_path (NM_CONNECTION (new_connection)), nm_active_connection_get_path (info->active)); diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c index cc0a5b6b53..c25dfac01a 100644 --- a/src/settings/nm-settings-connection.c +++ b/src/settings/nm-settings-connection.c @@ -593,9 +593,14 @@ replace_and_commit (NMSettingsConnection *self, gpointer user_data) { GError *error = NULL; + NMSettingsConnectionCommitReason commit_reason = NM_SETTINGS_CONNECTION_COMMIT_REASON_USER_ACTION; + + if (g_strcmp0 (nm_connection_get_id (NM_CONNECTION (self)), + nm_connection_get_id (new_connection)) != 0) + commit_reason |= NM_SETTINGS_CONNECTION_COMMIT_REASON_ID_CHANGED; if (nm_settings_connection_replace_settings (self, new_connection, TRUE, "replace-and-commit-disk", &error)) - nm_settings_connection_commit_changes (self, callback, user_data); + nm_settings_connection_commit_changes (self, commit_reason, callback, user_data); else { g_assert (error); if (callback) @@ -618,6 +623,7 @@ nm_settings_connection_replace_and_commit (NMSettingsConnection *self, static void commit_changes (NMSettingsConnection *self, + NMSettingsConnectionCommitReason commit_reason, NMSettingsConnectionCommitFunc callback, gpointer user_data) { @@ -633,6 +639,7 @@ commit_changes (NMSettingsConnection *self, void nm_settings_connection_commit_changes (NMSettingsConnection *self, + NMSettingsConnectionCommitReason commit_reason, NMSettingsConnectionCommitFunc callback, gpointer user_data) { @@ -640,6 +647,7 @@ nm_settings_connection_commit_changes (NMSettingsConnection *self, if (NM_SETTINGS_CONNECTION_GET_CLASS (self)->commit_changes) { NM_SETTINGS_CONNECTION_GET_CLASS (self)->commit_changes (self, + commit_reason, callback ? callback : ignore_cb, user_data); } else { @@ -916,7 +924,7 @@ agent_secrets_done_cb (NMAgentManager *manager, setting_name, call_id); - nm_settings_connection_commit_changes (self, new_secrets_commit_cb, NULL); + nm_settings_connection_commit_changes (self, NM_SETTINGS_CONNECTION_COMMIT_REASON_NONE, new_secrets_commit_cb, NULL); } else { _LOGD ("(%s:%u) new agent secrets processed", setting_name, @@ -1743,7 +1751,7 @@ dbus_clear_secrets_auth_cb (NMSettingsConnection *self, /* 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); + nm_settings_connection_commit_changes (self, NM_SETTINGS_CONNECTION_COMMIT_REASON_NONE, clear_secrets_cb, context); } } diff --git a/src/settings/nm-settings-connection.h b/src/settings/nm-settings-connection.h index 512112f032..0d3963d3df 100644 --- a/src/settings/nm-settings-connection.h +++ b/src/settings/nm-settings-connection.h @@ -78,6 +78,11 @@ typedef enum NM_SETTINGS_CONNECTION_FLAGS_ALL = ((__NM_SETTINGS_CONNECTION_FLAGS_LAST - 1) << 1) - 1, } NMSettingsConnectionFlags; +typedef enum { /*< skip >*/ + NM_SETTINGS_CONNECTION_COMMIT_REASON_NONE = 0, + NM_SETTINGS_CONNECTION_COMMIT_REASON_USER_ACTION = (1LL << 0), + NM_SETTINGS_CONNECTION_COMMIT_REASON_ID_CHANGED = (1LL << 1), +} NMSettingsConnectionCommitReason; typedef struct _NMSettingsConnectionClass NMSettingsConnectionClass; @@ -103,6 +108,7 @@ struct _NMSettingsConnectionClass { gpointer user_data); void (*commit_changes) (NMSettingsConnection *self, + NMSettingsConnectionCommitReason commit_reason, NMSettingsConnectionCommitFunc callback, gpointer user_data); @@ -117,6 +123,7 @@ struct _NMSettingsConnectionClass { GType nm_settings_connection_get_type (void); void nm_settings_connection_commit_changes (NMSettingsConnection *self, + NMSettingsConnectionCommitReason commit_reason, NMSettingsConnectionCommitFunc callback, gpointer user_data); diff --git a/src/settings/plugins/ifcfg-rh/nm-ifcfg-connection.c b/src/settings/plugins/ifcfg-rh/nm-ifcfg-connection.c index a18920c685..277e9d7a20 100644 --- a/src/settings/plugins/ifcfg-rh/nm-ifcfg-connection.c +++ b/src/settings/plugins/ifcfg-rh/nm-ifcfg-connection.c @@ -365,6 +365,7 @@ replace_and_commit (NMSettingsConnection *connection, static void commit_changes (NMSettingsConnection *connection, + NMSettingsConnectionCommitReason commit_reason, NMSettingsConnectionCommitFunc callback, gpointer user_data) { @@ -392,7 +393,7 @@ commit_changes (NMSettingsConnection *connection, /* Don't bother writing anything out if in-memory and on-disk data are the same */ if (same) { /* But chain up to parent to handle success - emits updated signal */ - NM_SETTINGS_CONNECTION_CLASS (nm_ifcfg_connection_parent_class)->commit_changes (connection, callback, user_data); + NM_SETTINGS_CONNECTION_CLASS (nm_ifcfg_connection_parent_class)->commit_changes (connection, commit_reason, callback, user_data); return; } } @@ -415,7 +416,7 @@ commit_changes (NMSettingsConnection *connection, if (success) { /* Chain up to parent to handle success */ - NM_SETTINGS_CONNECTION_CLASS (nm_ifcfg_connection_parent_class)->commit_changes (connection, callback, user_data); + NM_SETTINGS_CONNECTION_CLASS (nm_ifcfg_connection_parent_class)->commit_changes (connection, commit_reason, callback, user_data); } else { /* Otherwise immediate error */ callback (connection, error, user_data); diff --git a/src/settings/plugins/ifnet/nm-ifnet-connection.c b/src/settings/plugins/ifnet/nm-ifnet-connection.c index 693e653288..b31246408e 100644 --- a/src/settings/plugins/ifnet/nm-ifnet-connection.c +++ b/src/settings/plugins/ifnet/nm-ifnet-connection.c @@ -102,8 +102,9 @@ nm_ifnet_connection_get_conn_name (NMIfnetConnection *connection) static void commit_changes (NMSettingsConnection *connection, + NMSettingsConnectionCommitReason commit_reason, NMSettingsConnectionCommitFunc callback, - gpointer user_data) + gpointer user_data) { GError *error = NULL; NMIfnetConnectionPrivate *priv = NM_IFNET_CONNECTION_GET_PRIVATE (connection); @@ -139,7 +140,7 @@ commit_changes (NMSettingsConnection *connection, g_free (priv->conn_name); priv->conn_name = new_name; - NM_SETTINGS_CONNECTION_CLASS (nm_ifnet_connection_parent_class)->commit_changes (connection, callback, user_data); + NM_SETTINGS_CONNECTION_CLASS (nm_ifnet_connection_parent_class)->commit_changes (connection, commit_reason, callback, user_data); nm_log_info (LOGD_SETTINGS, "Successfully updated %s", priv->conn_name); } else { nm_log_warn (LOGD_SETTINGS, "Failed to update %s", diff --git a/src/settings/plugins/ifupdown/plugin.c b/src/settings/plugins/ifupdown/plugin.c index c3cb180b58..d67405b037 100644 --- a/src/settings/plugins/ifupdown/plugin.c +++ b/src/settings/plugins/ifupdown/plugin.c @@ -193,7 +193,7 @@ bind_device_to_connection (SCPluginIfupdown *self, g_object_set (s_wifi, NM_SETTING_WIRELESS_MAC_ADDRESS, address, NULL); } - nm_settings_connection_commit_changes (NM_SETTINGS_CONNECTION (exported), NULL, NULL); + nm_settings_connection_commit_changes (NM_SETTINGS_CONNECTION (exported), NM_SETTINGS_CONNECTION_COMMIT_REASON_NONE, NULL, NULL); } static void diff --git a/src/settings/plugins/keyfile/nm-keyfile-connection.c b/src/settings/plugins/keyfile/nm-keyfile-connection.c index c631faee5c..744ae9ccf3 100644 --- a/src/settings/plugins/keyfile/nm-keyfile-connection.c +++ b/src/settings/plugins/keyfile/nm-keyfile-connection.c @@ -91,6 +91,7 @@ nm_keyfile_connection_new (NMConnection *source, static void commit_changes (NMSettingsConnection *connection, + NMSettingsConnectionCommitReason commit_reason, NMSettingsConnectionCommitFunc callback, gpointer user_data) { @@ -99,6 +100,8 @@ commit_changes (NMSettingsConnection *connection, if (!nm_keyfile_plugin_write_connection (NM_CONNECTION (connection), nm_settings_connection_get_filename (connection), + NM_FLAGS_ALL (commit_reason, NM_SETTINGS_CONNECTION_COMMIT_REASON_USER_ACTION + | NM_SETTINGS_CONNECTION_COMMIT_REASON_ID_CHANGED), &path, &error)) { callback (connection, error, user_data); @@ -128,6 +131,7 @@ commit_changes (NMSettingsConnection *connection, g_free (path); NM_SETTINGS_CONNECTION_CLASS (nm_keyfile_connection_parent_class)->commit_changes (connection, + commit_reason, callback, user_data); } diff --git a/src/settings/plugins/keyfile/plugin.c b/src/settings/plugins/keyfile/plugin.c index 57b0d094fb..71f407dd57 100644 --- a/src/settings/plugins/keyfile/plugin.c +++ b/src/settings/plugins/keyfile/plugin.c @@ -514,7 +514,7 @@ add_connection (NMSystemConfigInterface *config, gs_free char *path = NULL; if (save_to_disk) { - if (!nm_keyfile_plugin_write_connection (connection, NULL, &path, error)) + if (!nm_keyfile_plugin_write_connection (connection, NULL, FALSE, &path, error)) return NULL; } return NM_SETTINGS_CONNECTION (update_connection (self, connection, path, NULL, FALSE, NULL, error)); diff --git a/src/settings/plugins/keyfile/writer.c b/src/settings/plugins/keyfile/writer.c index e962ed5522..e6ee7f97cc 100644 --- a/src/settings/plugins/keyfile/writer.c +++ b/src/settings/plugins/keyfile/writer.c @@ -234,6 +234,7 @@ _internal_write_connection (NMConnection *connection, uid_t owner_uid, pid_t owner_grp, const char *existing_path, + gboolean force_rename, char **out_path, GError **error) { @@ -268,7 +269,7 @@ _internal_write_connection (NMConnection *connection, /* If we have existing file path, use it. Else generate one from * connection's ID. */ - if (existing_path != NULL) { + if (existing_path != NULL && !force_rename) { path = g_strdup (existing_path); } else { char *filename_escaped = nm_keyfile_plugin_utils_escape_filename (id); @@ -365,6 +366,7 @@ _internal_write_connection (NMConnection *connection, gboolean nm_keyfile_plugin_write_connection (NMConnection *connection, const char *existing_path, + gboolean force_rename, char **out_path, GError **error) { @@ -372,6 +374,7 @@ nm_keyfile_plugin_write_connection (NMConnection *connection, KEYFILE_DIR, 0, 0, existing_path, + force_rename, out_path, error); } @@ -388,6 +391,7 @@ nm_keyfile_plugin_write_test_connection (NMConnection *connection, keyfile_dir, owner_uid, owner_grp, NULL, + FALSE, out_path, error); } diff --git a/src/settings/plugins/keyfile/writer.h b/src/settings/plugins/keyfile/writer.h index 8b08812d86..95885106df 100644 --- a/src/settings/plugins/keyfile/writer.h +++ b/src/settings/plugins/keyfile/writer.h @@ -27,6 +27,7 @@ gboolean nm_keyfile_plugin_write_connection (NMConnection *connection, const char *existing_path, + gboolean force_rename, char **out_path, GError **error); |