summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2015-09-07 16:12:04 +0200
committerThomas Haller <thaller@redhat.com>2015-09-18 16:12:36 +0200
commitd5716eed5969fcda836cdb7055aabd835aef5cc3 (patch)
tree85f6a2e5baee83b66f899906bb88b31564124312
parent80a7b41613d2e6f69ac7616d314f90d56097275c (diff)
downloadNetworkManager-d5716eed5969fcda836cdb7055aabd835aef5cc3.tar.gz
secrets: make agent-manager independent from NMSettingsConnection
NMSecretAgent (and in turn NMAgentManager) used the @connection argument both for the connection data, but also for the connection path. Detangle these, and accept the path separate from the connection. This makes NMSecretAgent and NMAgentManager truly operate on a plain NMConnection, without the non-obvious requirement, that the path of the connection must be set.
-rw-r--r--src/settings/nm-agent-manager.c22
-rw-r--r--src/settings/nm-agent-manager.h3
-rw-r--r--src/settings/nm-secret-agent.c36
-rw-r--r--src/settings/nm-secret-agent.h3
-rw-r--r--src/settings/nm-settings-connection.c14
-rw-r--r--src/settings/nm-settings.c5
6 files changed, 59 insertions, 24 deletions
diff --git a/src/settings/nm-agent-manager.c b/src/settings/nm-agent-manager.c
index 8685f3b21f..2bdb41baee 100644
--- a/src/settings/nm-agent-manager.c
+++ b/src/settings/nm-agent-manager.c
@@ -29,7 +29,6 @@
#include "nm-secret-agent.h"
#include "nm-auth-utils.h"
#include "nm-setting-vpn.h"
-#include "nm-setting-connection.h"
#include "nm-enum-types.h"
#include "nm-auth-manager.h"
#include "nm-bus-manager.h"
@@ -455,6 +454,7 @@ struct _NMAgentManagerCallId {
union {
struct {
+ char *path;
NMConnection *connection;
NMAuthChain *chain;
@@ -506,6 +506,7 @@ request_free (Request *req)
case REQUEST_TYPE_CON_SAVE:
case REQUEST_TYPE_CON_DEL:
g_object_unref (req->con.connection);
+ g_free (req->con.path);
if (req->con.chain)
nm_auth_chain_unref (req->con.chain);
if (req->request_type == REQUEST_TYPE_CON_GET) {
@@ -943,6 +944,7 @@ _con_get_request_start_proceed (Request *req, gboolean include_system_secrets)
}
req->current_call_id = nm_secret_agent_get_secrets (req->current,
+ req->con.path,
tmp,
req->con.get.setting_name,
(const char **) req->con.get.hints,
@@ -1157,6 +1159,7 @@ _con_get_try_complete_early (Request *req)
/**
* nm_agent_manager_get_secrets:
* @self:
+ * @path:
* @connection:
* @subject:
* @existing_secrets:
@@ -1179,6 +1182,7 @@ _con_get_try_complete_early (Request *req)
*/
NMAgentManagerCallId
nm_agent_manager_get_secrets (NMAgentManager *self,
+ const char *path,
NMConnection *connection,
NMAuthSubject *subject,
GVariant *existing_secrets,
@@ -1194,12 +1198,13 @@ nm_agent_manager_get_secrets (NMAgentManager *self,
Request *req;
g_return_val_if_fail (self != NULL, 0);
+ g_return_val_if_fail (path && *path, 0);
g_return_val_if_fail (NM_IS_CONNECTION (connection), 0);
g_return_val_if_fail (callback != NULL, 0);
nm_log_dbg (LOGD_SETTINGS,
"Secrets requested for connection %s (%s/%s)",
- nm_connection_get_path (connection),
+ path,
nm_connection_get_id (connection),
setting_name);
@@ -1213,6 +1218,7 @@ nm_agent_manager_get_secrets (NMAgentManager *self,
nm_connection_get_id (connection),
subject);
+ req->con.path = g_strdup (path);
req->con.connection = g_object_ref (connection);
if (existing_secrets)
req->con.get.existing_secrets = g_variant_ref (existing_secrets);
@@ -1296,6 +1302,7 @@ static void
_con_save_request_start (Request *req)
{
req->current_call_id = nm_secret_agent_save_secrets (req->current,
+ req->con.path,
req->con.connection,
_con_save_request_done,
req);
@@ -1307,6 +1314,7 @@ _con_save_request_start (Request *req)
void
nm_agent_manager_save_secrets (NMAgentManager *self,
+ const char *path,
NMConnection *connection,
NMAuthSubject *subject)
{
@@ -1314,17 +1322,19 @@ nm_agent_manager_save_secrets (NMAgentManager *self,
Request *req;
g_return_if_fail (self);
+ g_return_if_fail (path && *path);
g_return_if_fail (NM_IS_CONNECTION (connection));
nm_log_dbg (LOGD_SETTINGS,
"Saving secrets for connection %s (%s)",
- nm_connection_get_path (connection),
+ path,
nm_connection_get_id (connection));
req = request_new (self,
REQUEST_TYPE_CON_SAVE,
nm_connection_get_id (connection),
subject);
+ req->con.path = g_strdup (path);
req->con.connection = g_object_ref (connection);
if (!g_hash_table_add (priv->requests, req))
g_assert_not_reached ();
@@ -1378,6 +1388,7 @@ static void
_con_del_request_start (Request *req)
{
req->current_call_id = nm_secret_agent_delete_secrets (req->current,
+ req->con.path,
req->con.connection,
_con_del_request_done,
req);
@@ -1389,6 +1400,7 @@ _con_del_request_start (Request *req)
void
nm_agent_manager_delete_secrets (NMAgentManager *self,
+ const char *path,
NMConnection *connection)
{
NMAgentManagerPrivate *priv = NM_AGENT_MANAGER_GET_PRIVATE (self);
@@ -1396,11 +1408,12 @@ nm_agent_manager_delete_secrets (NMAgentManager *self,
Request *req;
g_return_if_fail (self != NULL);
+ g_return_if_fail (path && *path);
g_return_if_fail (NM_IS_CONNECTION (connection));
nm_log_dbg (LOGD_SETTINGS,
"Deleting secrets for connection %s (%s)",
- nm_connection_get_path (connection),
+ path,
nm_connection_get_id (connection));
subject = nm_auth_subject_new_internal ();
@@ -1408,6 +1421,7 @@ nm_agent_manager_delete_secrets (NMAgentManager *self,
REQUEST_TYPE_CON_DEL,
nm_connection_get_id (connection),
subject);
+ req->con.path = g_strdup (path);
req->con.connection = g_object_ref (connection);
g_object_unref (subject);
if (!g_hash_table_add (priv->requests, req))
diff --git a/src/settings/nm-agent-manager.h b/src/settings/nm-agent-manager.h
index 35564aa103..bfccabd081 100644
--- a/src/settings/nm-agent-manager.h
+++ b/src/settings/nm-agent-manager.h
@@ -66,6 +66,7 @@ typedef void (*NMAgentSecretsResultFunc) (NMAgentManager *manager,
gpointer other_data3);
NMAgentManagerCallId nm_agent_manager_get_secrets (NMAgentManager *manager,
+ const char *path,
NMConnection *connection,
NMAuthSubject *subject,
GVariant *existing_secrets,
@@ -81,10 +82,12 @@ void nm_agent_manager_cancel_secrets (NMAgentManager *manager,
NMAgentManagerCallId request_id);
void nm_agent_manager_save_secrets (NMAgentManager *manager,
+ const char *path,
NMConnection *connection,
NMAuthSubject *subject);
void nm_agent_manager_delete_secrets (NMAgentManager *manager,
+ const char *path,
NMConnection *connection);
NMSecretAgent *nm_agent_manager_get_agent_by_user (NMAgentManager *manager,
diff --git a/src/settings/nm-secret-agent.c b/src/settings/nm-secret-agent.c
index ca30d46211..1032027c39 100644
--- a/src/settings/nm-secret-agent.c
+++ b/src/settings/nm-secret-agent.c
@@ -332,6 +332,7 @@ get_callback (GObject *proxy,
NMSecretAgentCallId
nm_secret_agent_get_secrets (NMSecretAgent *self,
+ const char *path,
NMConnection *connection,
const char *setting_name,
const char **hints,
@@ -344,8 +345,9 @@ nm_secret_agent_get_secrets (NMSecretAgent *self,
GVariant *dict;
Request *r;
- g_return_val_if_fail (self != NULL, NULL);
- g_return_val_if_fail (connection != NULL, NULL);
+ g_return_val_if_fail (NM_IS_SECRET_AGENT (self), NULL);
+ g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
+ g_return_val_if_fail (path && *path, NULL);
g_return_val_if_fail (setting_name != NULL, NULL);
priv = NM_SECRET_AGENT_GET_PRIVATE (self);
@@ -357,12 +359,12 @@ nm_secret_agent_get_secrets (NMSecretAgent *self,
flags &= ~NM_SECRET_AGENT_GET_SECRETS_FLAG_ONLY_SYSTEM;
flags &= ~NM_SECRET_AGENT_GET_SECRETS_FLAG_NO_ERRORS;
- r = request_new (self, "GetSecrets", nm_connection_get_path (connection), setting_name, callback, callback_data);
+ r = request_new (self, "GetSecrets", path, setting_name, callback, callback_data);
r->is_get_secrets = TRUE;
g_hash_table_add (priv->requests, r);
nmdbus_secret_agent_call_get_secrets (priv->proxy,
dict,
- nm_connection_get_path (connection),
+ path,
setting_name,
hints ? hints : no_hints,
flags,
@@ -497,6 +499,7 @@ agent_save_cb (GObject *proxy,
NMSecretAgentCallId
nm_secret_agent_save_secrets (NMSecretAgent *self,
+ const char *path,
NMConnection *connection,
NMSecretAgentCallback callback,
gpointer callback_data)
@@ -504,21 +507,21 @@ nm_secret_agent_save_secrets (NMSecretAgent *self,
NMSecretAgentPrivate *priv;
GVariant *dict;
Request *r;
- const char *cpath;
- g_return_val_if_fail (self != NULL, NULL);
- g_return_val_if_fail (connection != NULL, NULL);
+ g_return_val_if_fail (NM_IS_SECRET_AGENT (self), NULL);
+ g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
+ g_return_val_if_fail (path && *path, NULL);
priv = NM_SECRET_AGENT_GET_PRIVATE (self);
- cpath = nm_connection_get_path (connection);
/* Caller should have ensured that only agent-owned secrets exist in 'connection' */
dict = nm_connection_to_dbus (connection, NM_CONNECTION_SERIALIZE_ALL);
- r = request_new (self, "SaveSecrets", cpath, NULL, callback, callback_data);
+ r = request_new (self, "SaveSecrets", path, NULL, callback, callback_data);
g_hash_table_add (priv->requests, r);
nmdbus_secret_agent_call_save_secrets (priv->proxy,
- dict, cpath,
+ dict,
+ path,
NULL, /* cancelling the request does *not* cancel the D-Bus call. */
agent_save_cb, r);
@@ -549,6 +552,7 @@ agent_delete_cb (GObject *proxy,
NMSecretAgentCallId
nm_secret_agent_delete_secrets (NMSecretAgent *self,
+ const char *path,
NMConnection *connection,
NMSecretAgentCallback callback,
gpointer callback_data)
@@ -556,21 +560,21 @@ nm_secret_agent_delete_secrets (NMSecretAgent *self,
NMSecretAgentPrivate *priv;
GVariant *dict;
Request *r;
- const char *cpath;
- g_return_val_if_fail (self != NULL, NULL);
- g_return_val_if_fail (connection != NULL, NULL);
+ g_return_val_if_fail (NM_IS_SECRET_AGENT (self), NULL);
+ g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
+ g_return_val_if_fail (path && *path, NULL);
priv = NM_SECRET_AGENT_GET_PRIVATE (self);
- cpath = nm_connection_get_path (connection);
/* No secrets sent; agents must be smart enough to track secrets using the UUID or something */
dict = nm_connection_to_dbus (connection, NM_CONNECTION_SERIALIZE_NO_SECRETS);
- r = request_new (self, "DeleteSecrets", cpath, NULL, callback, callback_data);
+ r = request_new (self, "DeleteSecrets", path, NULL, callback, callback_data);
g_hash_table_add (priv->requests, r);
nmdbus_secret_agent_call_delete_secrets (priv->proxy,
- dict, cpath,
+ dict,
+ path,
NULL, /* cancelling the request does *not* cancel the D-Bus call. */
agent_delete_cb, r);
diff --git a/src/settings/nm-secret-agent.h b/src/settings/nm-secret-agent.h
index b220dfd53f..333aa461c1 100644
--- a/src/settings/nm-secret-agent.h
+++ b/src/settings/nm-secret-agent.h
@@ -82,6 +82,7 @@ typedef void (*NMSecretAgentCallback) (NMSecretAgent *agent,
gpointer user_data);
NMSecretAgentCallId nm_secret_agent_get_secrets (NMSecretAgent *agent,
+ const char *path,
NMConnection *connection,
const char *setting_name,
const char **hints,
@@ -93,11 +94,13 @@ void nm_secret_agent_cancel_secrets (NMSecretAgent *agent,
NMSecretAgentCallId call_id);
NMSecretAgentCallId nm_secret_agent_save_secrets (NMSecretAgent *agent,
+ const char *path,
NMConnection *connection,
NMSecretAgentCallback callback,
gpointer callback_data);
NMSecretAgentCallId nm_secret_agent_delete_secrets (NMSecretAgent *agent,
+ const char *path,
NMConnection *connection,
NMSecretAgentCallback callback,
gpointer callback_data);
diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c
index 77ae7995d9..e0e9a25655 100644
--- a/src/settings/nm-settings-connection.c
+++ b/src/settings/nm-settings-connection.c
@@ -749,7 +749,9 @@ do_delete (NMSettingsConnection *self,
/* Tell agents to remove secrets for this connection */
for_agents = nm_simple_connection_new_clone (NM_CONNECTION (self));
nm_connection_clear_secrets (for_agents);
- nm_agent_manager_delete_secrets (priv->agent_mgr, for_agents);
+ nm_agent_manager_delete_secrets (priv->agent_mgr,
+ nm_connection_get_path (NM_CONNECTION (self)),
+ for_agents);
g_object_unref (for_agents);
/* Remove timestamp from timestamps database file */
@@ -1039,6 +1041,7 @@ nm_settings_connection_get_secrets (NMSettingsConnection *self,
if (existing_secrets)
g_variant_ref_sink (existing_secrets);
call_id_a = nm_agent_manager_get_secrets (priv->agent_mgr,
+ nm_connection_get_path (NM_CONNECTION (self)),
NM_CONNECTION (self),
subject,
existing_secrets,
@@ -1413,7 +1416,10 @@ con_update_cb (NMSettingsConnection *self,
nm_connection_clear_secrets_with_flags (for_agent,
secrets_filter_cb,
GUINT_TO_POINTER (NM_SETTING_SECRET_FLAG_AGENT_OWNED));
- nm_agent_manager_save_secrets (info->agent_mgr, for_agent, info->subject);
+ nm_agent_manager_save_secrets (info->agent_mgr,
+ nm_connection_get_path (NM_CONNECTION (self)),
+ for_agent,
+ info->subject);
g_object_unref (for_agent);
}
@@ -1795,7 +1801,9 @@ dbus_clear_secrets_auth_cb (NMSettingsConnection *self,
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_agent_manager_delete_secrets (priv->agent_mgr,
+ nm_connection_get_path (NM_CONNECTION (self)),
+ NM_CONNECTION (self));
info = g_malloc0 (sizeof (*info));
info->context = context;
diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c
index fc9ba2ea39..71bcf67494 100644
--- a/src/settings/nm-settings.c
+++ b/src/settings/nm-settings.c
@@ -1173,7 +1173,10 @@ send_agent_owned_secrets (NMSettings *self,
nm_connection_clear_secrets_with_flags (for_agent,
secrets_filter_cb,
GUINT_TO_POINTER (NM_SETTING_SECRET_FLAG_AGENT_OWNED));
- nm_agent_manager_save_secrets (priv->agent_mgr, for_agent, subject);
+ nm_agent_manager_save_secrets (priv->agent_mgr,
+ nm_connection_get_path (NM_CONNECTION (for_agent)),
+ for_agent,
+ subject);
g_object_unref (for_agent);
}