diff options
Diffstat (limited to 'src/settings/nm-secret-agent.c')
| -rw-r--r-- | src/settings/nm-secret-agent.c | 141 |
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; } |