about summary refs log tree commit diff
path: root/src/settings/nm-secret-agent.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/settings/nm-secret-agent.c')
-rw-r--r--src/settings/nm-secret-agent.c141
1 files changed, 78 insertions, 63 deletions
diff --git a/src/settings/nm-secret-agent.c b/src/settings/nm-secret-agent.c
index 4594ca88..bf0bba12 100644
--- a/src/settings/nm-secret-agent.c
+++ b/src/settings/nm-secret-agent.c
@@ -29,7 +29,9 @@
 
 #include "NetworkManager.h"
 #include "nm-secret-agent.h"
+#include "nm-dbus-manager.h"
 #include "nm-dbus-glib-types.h"
+#include "nm-glib-compat.h"
 #include "nm-logging.h"
 
 G_DEFINE_TYPE (NMSecretAgent, nm_secret_agent, G_TYPE_OBJECT)
@@ -39,18 +41,15 @@ G_DEFINE_TYPE (NMSecretAgent, nm_secret_agent, G_TYPE_OBJECT)
                                         NMSecretAgentPrivate))
 
 typedef struct {
-	gboolean disposed;
-
 	char *description;
-	char *owner;
+	NMAuthSubject *subject;
 	char *identifier;
-	uid_t owner_uid;
 	char *owner_username;
+	NMSecretAgentCapabilities capabilities;
 	guint32 hash;
 
 	GSList *permissions;
 
-	NMDBusManager *dbus_mgr;
 	DBusGProxy *proxy;
 	guint proxy_destroy_id;
 
@@ -101,15 +100,14 @@ nm_secret_agent_get_description (NMSecretAgent *agent)
 {
 	NMSecretAgentPrivate *priv;
 
-	g_return_val_if_fail (agent != NULL, NULL);
 	g_return_val_if_fail (NM_IS_SECRET_AGENT (agent), NULL);
 
 	priv = NM_SECRET_AGENT_GET_PRIVATE (agent);
 	if (!priv->description) {
-		priv->description = g_strdup_printf ("%s/%s/%u",
-		                                     priv->owner,
+		priv->description = g_strdup_printf ("%s/%s/%lu",
+		                                     nm_auth_subject_get_dbus_sender (priv->subject),
 		                                     priv->identifier,
-		                                     priv->owner_uid);
+		                                     nm_auth_subject_get_uid (priv->subject));
 	}
 
 	return priv->description;
@@ -118,48 +116,67 @@ nm_secret_agent_get_description (NMSecretAgent *agent)
 const char *
 nm_secret_agent_get_dbus_owner (NMSecretAgent *agent)
 {
-	g_return_val_if_fail (agent != NULL, NULL);
 	g_return_val_if_fail (NM_IS_SECRET_AGENT (agent), NULL);
 
-	return NM_SECRET_AGENT_GET_PRIVATE (agent)->owner;
+	return nm_auth_subject_get_dbus_sender (NM_SECRET_AGENT_GET_PRIVATE (agent)->subject);
 }
 
 const char *
 nm_secret_agent_get_identifier (NMSecretAgent *agent)
 {
-	g_return_val_if_fail (agent != NULL, NULL);
 	g_return_val_if_fail (NM_IS_SECRET_AGENT (agent), NULL);
 
 	return NM_SECRET_AGENT_GET_PRIVATE (agent)->identifier;
 }
 
-uid_t
+gulong
 nm_secret_agent_get_owner_uid  (NMSecretAgent *agent)
 {
-	g_return_val_if_fail (agent != NULL, G_MAXUINT);
-	g_return_val_if_fail (NM_IS_SECRET_AGENT (agent), G_MAXUINT);
+	g_return_val_if_fail (NM_IS_SECRET_AGENT (agent), G_MAXULONG);
 
-	return NM_SECRET_AGENT_GET_PRIVATE (agent)->owner_uid;
+	return nm_auth_subject_get_uid (NM_SECRET_AGENT_GET_PRIVATE (agent)->subject);
 }
 
 const char *
-nm_secret_agent_get_owner_username(NMSecretAgent *agent)
+nm_secret_agent_get_owner_username (NMSecretAgent *agent)
 {
-	g_return_val_if_fail (agent != NULL, NULL);
 	g_return_val_if_fail (NM_IS_SECRET_AGENT (agent), NULL);
 
 	return NM_SECRET_AGENT_GET_PRIVATE (agent)->owner_username;
 }
 
+gulong
+nm_secret_agent_get_pid (NMSecretAgent *agent)
+{
+	g_return_val_if_fail (NM_IS_SECRET_AGENT (agent), G_MAXULONG);
+
+	return nm_auth_subject_get_pid (NM_SECRET_AGENT_GET_PRIVATE (agent)->subject);
+}
+
+NMSecretAgentCapabilities
+nm_secret_agent_get_capabilities (NMSecretAgent *agent)
+{
+	g_return_val_if_fail (NM_IS_SECRET_AGENT (agent), NM_SECRET_AGENT_CAPABILITY_NONE);
+
+	return NM_SECRET_AGENT_GET_PRIVATE (agent)->capabilities;
+}
+
 guint32
-nm_secret_agent_get_hash  (NMSecretAgent *agent)
+nm_secret_agent_get_hash (NMSecretAgent *agent)
 {
-	g_return_val_if_fail (agent != NULL, 0);
 	g_return_val_if_fail (NM_IS_SECRET_AGENT (agent), 0);
 
 	return NM_SECRET_AGENT_GET_PRIVATE (agent)->hash;
 }
 
+NMAuthSubject *
+nm_secret_agent_get_subject (NMSecretAgent *agent)
+{
+	g_return_val_if_fail (NM_IS_SECRET_AGENT (agent), NULL);
+
+	return NM_SECRET_AGENT_GET_PRIVATE (agent)->subject;
+}
+
 /**
  * nm_secret_agent_add_permission:
  * @agent: A #NMSecretAgent.
@@ -258,14 +275,13 @@ gconstpointer
 nm_secret_agent_get_secrets (NMSecretAgent *self,
                              NMConnection *connection,
                              const char *setting_name,
-                             const char *hint,
+                             const char **hints,
                              NMSettingsGetSecretsFlags flags,
                              NMSecretAgentCallback callback,
                              gpointer callback_data)
 {
 	NMSecretAgentPrivate *priv;
 	GHashTable *hash;
-	const char *hints[2] = { hint, NULL };
 	Request *r;
 
 	g_return_val_if_fail (self != NULL, NULL);
@@ -440,48 +456,45 @@ proxy_cleanup (NMSecretAgent *self)
 /*************************************************************/
 
 NMSecretAgent *
-nm_secret_agent_new (NMDBusManager *dbus_mgr,
-                     const char *owner,
+nm_secret_agent_new (DBusGMethodInvocation *context,
+                     NMAuthSubject *subject,
                      const char *identifier,
-                     uid_t owner_uid)
+                     NMSecretAgentCapabilities capabilities)
 {
 	NMSecretAgent *self;
 	NMSecretAgentPrivate *priv;
-	DBusGConnection *bus;
 	char *hash_str, *username;
 	struct passwd *pw;
 
-	g_return_val_if_fail (owner != NULL, NULL);
+	g_return_val_if_fail (context != NULL, NULL);
+	g_return_val_if_fail (NM_IS_AUTH_SUBJECT (subject), NULL);
 	g_return_val_if_fail (identifier != NULL, NULL);
 
-	pw = getpwuid (owner_uid);
+	pw = getpwuid (nm_auth_subject_get_uid (subject));
 	g_return_val_if_fail (pw != NULL, NULL);
 	g_return_val_if_fail (pw->pw_name[0] != '\0', NULL);
 	username = g_strdup (pw->pw_name);
 
 	self = (NMSecretAgent *) g_object_new (NM_TYPE_SECRET_AGENT, NULL);
-	if (self) {
-		priv = NM_SECRET_AGENT_GET_PRIVATE (self);
-
-		priv->owner = g_strdup (owner);
-		priv->identifier = g_strdup (identifier);
-		priv->owner_uid = owner_uid;
-		priv->owner_username = g_strdup (username);
-
-		hash_str = g_strdup_printf ("%08u%s", owner_uid, identifier);
-		priv->hash = g_str_hash (hash_str);
-		g_free (hash_str);
-
-		priv->dbus_mgr = g_object_ref (dbus_mgr);
-		bus = nm_dbus_manager_get_connection (priv->dbus_mgr);
-		priv->proxy = dbus_g_proxy_new_for_name (bus,
-	                                             owner,
-	                                             NM_DBUS_PATH_SECRET_AGENT,
-	                                             NM_DBUS_INTERFACE_SECRET_AGENT);
-		g_assert (priv->proxy);
-		priv->proxy_destroy_id = g_signal_connect_swapped (priv->proxy, "destroy",
-		                                                   G_CALLBACK (proxy_cleanup), self);
-	}
+	priv = NM_SECRET_AGENT_GET_PRIVATE (self);
+
+	priv->identifier = g_strdup (identifier);
+	priv->owner_username = g_strdup (username);
+	priv->capabilities = capabilities;
+	priv->subject = g_object_ref (subject);
+
+	hash_str = g_strdup_printf ("%16lu%s", nm_auth_subject_get_uid (subject), identifier);
+	priv->hash = g_str_hash (hash_str);
+	g_free (hash_str);
+
+	priv->proxy = nm_dbus_manager_new_proxy (nm_dbus_manager_get (),
+	                                         context,
+	                                         nm_auth_subject_get_dbus_sender (subject),
+	                                         NM_DBUS_PATH_SECRET_AGENT,
+	                                         NM_DBUS_INTERFACE_SECRET_AGENT);
+	g_assert (priv->proxy);
+	priv->proxy_destroy_id = g_signal_connect_swapped (priv->proxy, "destroy",
+	                                                   G_CALLBACK (proxy_cleanup), self);
 
 	g_free (username);
 	return self;
@@ -501,24 +514,25 @@ dispose (GObject *object)
 {
 	NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (object);
 
-	if (!priv->disposed) {
-		priv->disposed = TRUE;
+	proxy_cleanup (NM_SECRET_AGENT (object));
+	g_clear_object (&priv->subject);
 
-		g_free (priv->description);
-		g_free (priv->owner);
-		g_free (priv->identifier);
-		g_free (priv->owner_username);
+	G_OBJECT_CLASS (nm_secret_agent_parent_class)->dispose (object);
+}
 
-		g_slist_foreach (priv->permissions, (GFunc) g_free, NULL);
-		g_slist_free (priv->permissions);
+static void
+finalize (GObject *object)
+{
+	NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (object);
 
-		g_hash_table_destroy (priv->requests);
+	g_free (priv->description);
+	g_free (priv->identifier);
+	g_free (priv->owner_username);
 
-		proxy_cleanup (NM_SECRET_AGENT (object));
-		g_object_unref (priv->dbus_mgr);
-	}
+	g_slist_free_full (priv->permissions, g_free);
+	g_hash_table_destroy (priv->requests);
 
-	G_OBJECT_CLASS (nm_secret_agent_parent_class)->dispose (object);
+	G_OBJECT_CLASS (nm_secret_agent_parent_class)->finalize (object);
 }
 
 static void
@@ -530,5 +544,6 @@ nm_secret_agent_class_init (NMSecretAgentClass *config_class)
 
 	/* virtual methods */
 	object_class->dispose = dispose;
+	object_class->finalize = finalize;
 }