diff --git a/src/nm-auth-subject.c b/src/nm-auth-subject.c index 66c0d4e63..e770af49e 100644 --- a/src/nm-auth-subject.c +++ b/src/nm-auth-subject.c @@ -151,6 +151,12 @@ nm_auth_subject_get_uid (NMAuthSubject *subject) return NM_AUTH_SUBJECT_GET_PRIVATE (subject)->uid; } +gulong +nm_auth_subject_get_pid (NMAuthSubject *subject) +{ + return NM_AUTH_SUBJECT_GET_PRIVATE (subject)->pid; +} + const char * nm_auth_subject_get_dbus_sender (NMAuthSubject *subject) { diff --git a/src/nm-auth-subject.h b/src/nm-auth-subject.h index 8f049a840..063598902 100644 --- a/src/nm-auth-subject.h +++ b/src/nm-auth-subject.h @@ -57,6 +57,8 @@ NMAuthSubject *nm_auth_subject_new_internal (void); gulong nm_auth_subject_get_uid (NMAuthSubject *subject); +gulong nm_auth_subject_get_pid (NMAuthSubject *subject); + const char *nm_auth_subject_get_dbus_sender (NMAuthSubject *subject); gboolean nm_auth_subject_get_internal (NMAuthSubject *subject); diff --git a/src/settings/nm-agent-manager.c b/src/settings/nm-agent-manager.c index 23e228330..2d99a6e06 100644 --- a/src/settings/nm-agent-manager.c +++ b/src/settings/nm-agent-manager.c @@ -515,16 +515,27 @@ req_complete_error (Request *req, GError *error) } static gint -agent_compare_func (NMSecretAgent *a, NMSecretAgent *b, gpointer user_data) +agent_compare_func (gconstpointer aa, gconstpointer bb, gpointer user_data) { + NMSecretAgent *a = (NMSecretAgent *)aa; + NMSecretAgent *b = (NMSecretAgent *)bb; + Request *req = user_data; gboolean a_active, b_active; + gulong a_pid, b_pid, requester; - if (a && !b) - return -1; - else if (a == b) - return 0; - else if (!a && b) - return 1; + /* Prefer agents in the process the request came from */ + requester = nm_auth_subject_get_pid (req->subject); + if (requester != G_MAXULONG) { + a_pid = nm_secret_agent_get_pid (a); + b_pid = nm_secret_agent_get_pid (b); + + if (a_pid != b_pid) { + if (a_pid == requester) + return -1; + else if (b_pid == requester) + return 1; + } + } /* Prefer agents in active sessions */ a_active = nm_session_monitor_uid_active (nm_session_monitor_get (), @@ -575,11 +586,11 @@ request_add_agent (Request *req, NMSecretAgent *agent) nm_secret_agent_get_description (agent), req, req->detail); - /* Add this agent to the list, preferring active sessions */ + /* Add this agent to the list, sorted appropriately */ req->pending = g_slist_insert_sorted_with_data (req->pending, g_object_ref (agent), - (GCompareDataFunc) agent_compare_func, - NULL); + agent_compare_func, + req); } static void diff --git a/src/settings/nm-secret-agent.c b/src/settings/nm-secret-agent.c index 66ddc36a2..22391cf94 100644 --- a/src/settings/nm-secret-agent.c +++ b/src/settings/nm-secret-agent.c @@ -145,6 +145,14 @@ nm_secret_agent_get_owner_username (NMSecretAgent *agent) 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) { diff --git a/src/settings/nm-secret-agent.h b/src/settings/nm-secret-agent.h index b75f7177d..69699af1a 100644 --- a/src/settings/nm-secret-agent.h +++ b/src/settings/nm-secret-agent.h @@ -71,6 +71,8 @@ gulong nm_secret_agent_get_owner_uid (NMSecretAgent *agent); const char *nm_secret_agent_get_owner_username (NMSecretAgent *agent); +gulong nm_secret_agent_get_pid (NMSecretAgent *agent); + NMSecretAgentCapabilities nm_secret_agent_get_capabilities (NMSecretAgent *agent); guint32 nm_secret_agent_get_hash (NMSecretAgent *agent);