settings: return username of agent providing secrets
Mainly for VPN connections to grab the default username from, like 0.8 did when the applet provided the username to NM for user connections.
This commit is contained in:
@@ -106,6 +106,7 @@ typedef struct {
|
|||||||
static void
|
static void
|
||||||
get_secrets_cb (NMSettingsConnection *connection,
|
get_secrets_cb (NMSettingsConnection *connection,
|
||||||
guint32 call_id,
|
guint32 call_id,
|
||||||
|
const char *agent_username,
|
||||||
const char *setting_name,
|
const char *setting_name,
|
||||||
GError *error,
|
GError *error,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
|
@@ -21,6 +21,7 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <dbus/dbus-glib.h>
|
#include <dbus/dbus-glib.h>
|
||||||
@@ -328,6 +329,7 @@ done:
|
|||||||
typedef void (*RequestCompleteFunc) (Request *req,
|
typedef void (*RequestCompleteFunc) (Request *req,
|
||||||
GHashTable *secrets,
|
GHashTable *secrets,
|
||||||
const char *agent_dbus_owner,
|
const char *agent_dbus_owner,
|
||||||
|
const char *agent_username,
|
||||||
gboolean agent_has_modify,
|
gboolean agent_has_modify,
|
||||||
GError *error,
|
GError *error,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
@@ -466,6 +468,28 @@ request_free (Request *req)
|
|||||||
g_free (req);
|
g_free (req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
req_complete_success (Request *req,
|
||||||
|
GHashTable *secrets,
|
||||||
|
const char *agent_dbus_owner,
|
||||||
|
const char *agent_uname,
|
||||||
|
gboolean agent_has_modify)
|
||||||
|
{
|
||||||
|
req->complete_callback (req,
|
||||||
|
secrets,
|
||||||
|
agent_dbus_owner,
|
||||||
|
agent_uname,
|
||||||
|
agent_has_modify,
|
||||||
|
NULL,
|
||||||
|
req->complete_callback_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
req_complete_error (Request *req, GError *error)
|
||||||
|
{
|
||||||
|
req->complete_callback (req, NULL, NULL, NULL, FALSE, error, req->complete_callback_data);
|
||||||
|
}
|
||||||
|
|
||||||
static gint
|
static gint
|
||||||
agent_compare_func (NMSecretAgent *a, NMSecretAgent *b, gpointer user_data)
|
agent_compare_func (NMSecretAgent *a, NMSecretAgent *b, gpointer user_data)
|
||||||
{
|
{
|
||||||
@@ -600,7 +624,7 @@ next_generic (Request *req, const char *detail)
|
|||||||
error = g_error_new_literal (NM_AGENT_MANAGER_ERROR,
|
error = g_error_new_literal (NM_AGENT_MANAGER_ERROR,
|
||||||
NM_AGENT_MANAGER_ERROR_NO_SECRETS,
|
NM_AGENT_MANAGER_ERROR_NO_SECRETS,
|
||||||
"No agents were available for this request.");
|
"No agents were available for this request.");
|
||||||
req->complete_callback (req, NULL, NULL, FALSE, error, req->complete_callback_data);
|
req_complete_error (req, error);
|
||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
} else {
|
} else {
|
||||||
/* Send a secrets request to the next agent */
|
/* Send a secrets request to the next agent */
|
||||||
@@ -641,6 +665,8 @@ get_done_cb (NMSecretAgent *agent,
|
|||||||
GHashTable *setting_secrets;
|
GHashTable *setting_secrets;
|
||||||
const char *agent_dbus_owner;
|
const char *agent_dbus_owner;
|
||||||
gboolean agent_has_modify;
|
gboolean agent_has_modify;
|
||||||
|
struct passwd *pw;
|
||||||
|
char *agent_uname = NULL;
|
||||||
|
|
||||||
g_return_if_fail (call_id == req->current_call_id);
|
g_return_if_fail (call_id == req->current_call_id);
|
||||||
|
|
||||||
@@ -677,8 +703,17 @@ get_done_cb (NMSecretAgent *agent,
|
|||||||
nm_secret_agent_get_description (agent),
|
nm_secret_agent_get_description (agent),
|
||||||
req, req->setting_name);
|
req, req->setting_name);
|
||||||
|
|
||||||
|
/* Get the agent's username */
|
||||||
|
pw = getpwuid (nm_secret_agent_get_owner_uid (agent));
|
||||||
|
if (pw && strlen (pw->pw_name)) {
|
||||||
|
/* Needs to be UTF-8 valid since it may be pushed through D-Bus */
|
||||||
|
if (g_utf8_validate (pw->pw_name, -1, NULL))
|
||||||
|
agent_uname = g_strdup (pw->pw_name);
|
||||||
|
}
|
||||||
|
|
||||||
agent_dbus_owner = nm_secret_agent_get_dbus_owner (agent);
|
agent_dbus_owner = nm_secret_agent_get_dbus_owner (agent);
|
||||||
req->complete_callback (req, secrets, agent_dbus_owner, agent_has_modify, NULL, req->complete_callback_data);
|
req_complete_success (req, secrets, agent_dbus_owner, agent_uname, agent_has_modify);
|
||||||
|
g_free (agent_uname);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -914,7 +949,7 @@ get_start (gpointer user_data)
|
|||||||
g_assert (tmp);
|
g_assert (tmp);
|
||||||
|
|
||||||
if (!nm_connection_update_secrets (tmp, req->setting_name, req->existing_secrets, &error)) {
|
if (!nm_connection_update_secrets (tmp, req->setting_name, req->existing_secrets, &error)) {
|
||||||
req->complete_callback (req, NULL, NULL, FALSE, error, req->complete_callback_data);
|
req_complete_error (req, error);
|
||||||
g_clear_error (&error);
|
g_clear_error (&error);
|
||||||
} else {
|
} else {
|
||||||
/* Do we have everything we need? */
|
/* Do we have everything we need? */
|
||||||
@@ -924,7 +959,7 @@ get_start (gpointer user_data)
|
|||||||
req, req->setting_name);
|
req, req->setting_name);
|
||||||
|
|
||||||
/* Got everything, we're done */
|
/* Got everything, we're done */
|
||||||
req->complete_callback (req, req->existing_secrets, NULL, FALSE, NULL, req->complete_callback_data);
|
req_complete_success (req, req->existing_secrets, NULL, NULL, FALSE);
|
||||||
} else {
|
} else {
|
||||||
nm_log_dbg (LOGD_AGENTS, "(%p/%s) system settings secrets insufficient, asking agents",
|
nm_log_dbg (LOGD_AGENTS, "(%p/%s) system settings secrets insufficient, asking agents",
|
||||||
req, req->setting_name);
|
req, req->setting_name);
|
||||||
@@ -949,6 +984,7 @@ static void
|
|||||||
get_complete_cb (Request *req,
|
get_complete_cb (Request *req,
|
||||||
GHashTable *secrets,
|
GHashTable *secrets,
|
||||||
const char *agent_dbus_owner,
|
const char *agent_dbus_owner,
|
||||||
|
const char *agent_username,
|
||||||
gboolean agent_has_modify,
|
gboolean agent_has_modify,
|
||||||
GError *error,
|
GError *error,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
@@ -960,6 +996,7 @@ get_complete_cb (Request *req,
|
|||||||
req->callback (self,
|
req->callback (self,
|
||||||
req->reqid,
|
req->reqid,
|
||||||
agent_dbus_owner,
|
agent_dbus_owner,
|
||||||
|
agent_username,
|
||||||
agent_has_modify,
|
agent_has_modify,
|
||||||
req->setting_name,
|
req->setting_name,
|
||||||
req->flags,
|
req->flags,
|
||||||
@@ -1082,7 +1119,7 @@ save_done_cb (NMSecretAgent *agent,
|
|||||||
req, req->setting_name);
|
req, req->setting_name);
|
||||||
|
|
||||||
agent_dbus_owner = nm_secret_agent_get_dbus_owner (agent);
|
agent_dbus_owner = nm_secret_agent_get_dbus_owner (agent);
|
||||||
req->complete_callback (req, NULL, agent_dbus_owner, FALSE, NULL, req->complete_callback_data);
|
req_complete_success (req, NULL, NULL, agent_dbus_owner, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1107,6 +1144,7 @@ static void
|
|||||||
save_complete_cb (Request *req,
|
save_complete_cb (Request *req,
|
||||||
GHashTable *secrets,
|
GHashTable *secrets,
|
||||||
const char *agent_dbus_owner,
|
const char *agent_dbus_owner,
|
||||||
|
const char *agent_username,
|
||||||
gboolean agent_has_modify,
|
gboolean agent_has_modify,
|
||||||
GError *error,
|
GError *error,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
@@ -1203,6 +1241,7 @@ static void
|
|||||||
delete_complete_cb (Request *req,
|
delete_complete_cb (Request *req,
|
||||||
GHashTable *secrets,
|
GHashTable *secrets,
|
||||||
const char *agent_dbus_owner,
|
const char *agent_dbus_owner,
|
||||||
|
const char *agent_username,
|
||||||
gboolean agent_has_modify,
|
gboolean agent_has_modify,
|
||||||
GError *error,
|
GError *error,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
|
@@ -49,6 +49,7 @@ NMAgentManager *nm_agent_manager_get (void);
|
|||||||
typedef void (*NMAgentSecretsResultFunc) (NMAgentManager *manager,
|
typedef void (*NMAgentSecretsResultFunc) (NMAgentManager *manager,
|
||||||
guint32 call_id,
|
guint32 call_id,
|
||||||
const char *agent_dbus_owner,
|
const char *agent_dbus_owner,
|
||||||
|
const char *agent_uname,
|
||||||
gboolean agent_has_modify,
|
gboolean agent_has_modify,
|
||||||
const char *setting_name,
|
const char *setting_name,
|
||||||
NMSettingsGetSecretsFlags flags,
|
NMSettingsGetSecretsFlags flags,
|
||||||
|
@@ -486,6 +486,7 @@ static void
|
|||||||
agent_secrets_done_cb (NMAgentManager *manager,
|
agent_secrets_done_cb (NMAgentManager *manager,
|
||||||
guint32 call_id,
|
guint32 call_id,
|
||||||
const char *agent_dbus_owner,
|
const char *agent_dbus_owner,
|
||||||
|
const char *agent_username,
|
||||||
gboolean agent_has_modify,
|
gboolean agent_has_modify,
|
||||||
const char *setting_name,
|
const char *setting_name,
|
||||||
NMSettingsGetSecretsFlags flags,
|
NMSettingsGetSecretsFlags flags,
|
||||||
@@ -511,7 +512,7 @@ agent_secrets_done_cb (NMAgentManager *manager,
|
|||||||
error->code,
|
error->code,
|
||||||
error->message ? error->message : "(unknown)");
|
error->message ? error->message : "(unknown)");
|
||||||
|
|
||||||
callback (self, call_id, setting_name, error, callback_data);
|
callback (self, call_id, NULL, setting_name, error, callback_data);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -519,7 +520,7 @@ agent_secrets_done_cb (NMAgentManager *manager,
|
|||||||
local = g_error_new (NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_SETTING,
|
local = g_error_new (NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_SETTING,
|
||||||
"%s.%d - Connection didn't have requested setting '%s'.",
|
"%s.%d - Connection didn't have requested setting '%s'.",
|
||||||
__FILE__, __LINE__, setting_name);
|
__FILE__, __LINE__, setting_name);
|
||||||
callback (self, call_id, setting_name, local, callback_data);
|
callback (self, call_id, NULL, setting_name, local, callback_data);
|
||||||
g_clear_error (&local);
|
g_clear_error (&local);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -631,7 +632,7 @@ agent_secrets_done_cb (NMAgentManager *manager,
|
|||||||
(local && local->message) ? local->message : "(unknown)");
|
(local && local->message) ? local->message : "(unknown)");
|
||||||
}
|
}
|
||||||
|
|
||||||
callback (self, call_id, setting_name, local, callback_data);
|
callback (self, call_id, agent_username, setting_name, local, callback_data);
|
||||||
g_clear_error (&local);
|
g_clear_error (&local);
|
||||||
if (hash)
|
if (hash)
|
||||||
g_hash_table_destroy (hash);
|
g_hash_table_destroy (hash);
|
||||||
@@ -1167,6 +1168,7 @@ impl_settings_connection_delete (NMSettingsConnection *self,
|
|||||||
static void
|
static void
|
||||||
dbus_get_agent_secrets_cb (NMSettingsConnection *self,
|
dbus_get_agent_secrets_cb (NMSettingsConnection *self,
|
||||||
guint32 call_id,
|
guint32 call_id,
|
||||||
|
const char *agent_username,
|
||||||
const char *setting_name,
|
const char *setting_name,
|
||||||
GError *error,
|
GError *error,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
|
@@ -94,6 +94,7 @@ void nm_settings_connection_delete (NMSettingsConnection *connection,
|
|||||||
|
|
||||||
typedef void (*NMSettingsConnectionSecretsFunc) (NMSettingsConnection *connection,
|
typedef void (*NMSettingsConnectionSecretsFunc) (NMSettingsConnection *connection,
|
||||||
guint32 call_id,
|
guint32 call_id,
|
||||||
|
const char *agent_username,
|
||||||
const char *setting_name,
|
const char *setting_name,
|
||||||
GError *error,
|
GError *error,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
|
@@ -765,6 +765,7 @@ nm_vpn_connection_disconnect (NMVPNConnection *connection,
|
|||||||
static void
|
static void
|
||||||
vpn_secrets_cb (NMSettingsConnection *connection,
|
vpn_secrets_cb (NMSettingsConnection *connection,
|
||||||
guint32 call_id,
|
guint32 call_id,
|
||||||
|
const char *agent_username,
|
||||||
const char *setting_name,
|
const char *setting_name,
|
||||||
GError *error,
|
GError *error,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
@@ -836,6 +837,7 @@ connection_need_secrets_cb (DBusGProxy *proxy,
|
|||||||
static void
|
static void
|
||||||
existing_secrets_cb (NMSettingsConnection *connection,
|
existing_secrets_cb (NMSettingsConnection *connection,
|
||||||
guint32 call_id,
|
guint32 call_id,
|
||||||
|
const char *agent_username,
|
||||||
const char *setting_name,
|
const char *setting_name,
|
||||||
GError *error,
|
GError *error,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
|
Reference in New Issue
Block a user