]> git.pld-linux.org Git - packages/gnome-keyring.git/blame - gnome-keyring-single-unlock-dialog.patch
- 0.6.0
[packages/gnome-keyring.git] / gnome-keyring-single-unlock-dialog.patch
CommitLineData
63fc4fee 1Index: gnome-keyring-daemon.c
2===================================================================
3RCS file: /cvs/gnome/gnome-keyring/gnome-keyring-daemon.c,v
4retrieving revision 1.25
5diff -u -p -u -r1.25 gnome-keyring-daemon.c
6--- gnome-keyring-daemon.c 26 Oct 2005 07:50:14 -0000 1.25
7+++ gnome-keyring-daemon.c 9 May 2006 20:41:02 -0000
8@@ -2227,6 +2227,98 @@ launch_ask_helper (GnomeKeyringAsk *ask,
9 return res;
10 }
11
12+typedef struct {
13+ GnomeKeyringAsk *ask;
14+ GnomeKeyringAsk *other_ask;
15+ enum AskType ask_type;
16+} GnomeKeyringPendingAsk;
17+
18+static gboolean
19+check_pending_ask (gpointer user_data)
20+{
21+ GnomeKeyringPendingAsk *pending_ask = user_data;
22+ gboolean ready_to_check = FALSE;
23+ GnomeKeyring *keyring;
24+
25+ if (g_list_find (outstanding_asks, pending_ask->other_ask) != NULL) {
26+ if (pending_ask->other_ask->ask_pid == 0)
27+ ready_to_check = TRUE;
28+
29+ if (pending_ask->other_ask->current_ask_type != pending_ask->ask_type)
30+ ready_to_check = TRUE;
31+ } else {
32+ ready_to_check = TRUE;
33+ }
34+
35+ if (!ready_to_check)
36+ return TRUE;
37+
38+ if (pending_ask->ask->current_request->keyring != NULL)
39+ keyring = pending_ask->ask->current_request->keyring;
40+ else
41+ keyring = pending_ask->ask->current_request->item->keyring;
42+
43+ if (keyring->locked) {
44+ launch_ask_helper (pending_ask->ask, pending_ask->ask_type);
45+ } else {
46+ /* keyring is unlocked, no need to do any asking */
47+ }
48+
49+ gnome_keyring_ask_iterate (pending_ask->ask);
50+
51+ g_free (pending_ask);
52+ return FALSE;
53+}
54+
55+static gboolean
56+maybe_launch_ask_helper (GnomeKeyringAsk *ask, enum AskType ask_type)
57+{
58+ GnomeKeyring *keyring;
59+ gboolean already_asking;
60+ GList *l;
61+
62+ if (ask->current_request->keyring != NULL)
63+ keyring = ask->current_request->keyring;
64+ else
65+ keyring = ask->current_request->item->keyring;
66+
67+ already_asking = FALSE;
68+
69+ for (l = outstanding_asks; l != NULL; l = l->next) {
70+ GnomeKeyringAsk *other_ask = l->data;
71+ GnomeKeyring *other_keyring;
72+
73+ if (other_ask == ask)
74+ continue;
75+
76+ if (other_ask->current_ask_type != ask_type)
77+ continue;
78+
79+ if (other_ask->current_request->keyring != NULL)
80+ other_keyring = other_ask->current_request->keyring;
81+ else
82+ other_keyring = other_ask->current_request->item->keyring;
83+
84+ if (keyring != other_keyring)
85+ continue;
86+
87+ if (other_ask->ask_pid != 0) {
88+ GnomeKeyringPendingAsk *pending_ask = g_new0 (GnomeKeyringPendingAsk, 1);
89+
90+ printf ("Another ask helper is already running: pid %d\n", other_ask->ask_pid);
91+
92+ pending_ask->ask = ask;
93+ pending_ask->other_ask = other_ask;
94+ pending_ask->ask_type = ask_type;
95+ g_timeout_add (200, check_pending_ask, pending_ask);
96+
97+ return TRUE;
98+ }
99+ }
100+
101+ return launch_ask_helper (ask, ask_type);
102+}
103+
104 static void
105 schedule_ask (GnomeKeyringAsk *ask)
106 {
107@@ -2235,7 +2327,7 @@ schedule_ask (GnomeKeyringAsk *ask)
108 request = ask->current_request;
109 switch (request->request_type) {
110 case GNOME_KEYRING_ACCESS_REQUEST_KEYRING:
111- if (!launch_ask_helper (ask, ASK_KEYRING_PASSWORD)) {
112+ if (!maybe_launch_ask_helper (ask, ASK_KEYRING_PASSWORD)) {
113 /* no way to allow request, denying */
114 ask->access_requests = g_list_remove (ask->access_requests, request);
115 gnome_keyring_access_request_free (request);
116@@ -2245,7 +2337,7 @@ schedule_ask (GnomeKeyringAsk *ask)
117 break;
118 case GNOME_KEYRING_ACCESS_REQUEST_ITEM:
119 if (request->item->keyring->locked) {
120- if (!launch_ask_helper (ask, ASK_KEYRING_PASSWORD)) {
121+ if (!maybe_launch_ask_helper (ask, ASK_KEYRING_PASSWORD)) {
122 /* no way to allow request, denying */
123 ask->access_requests = g_list_remove (ask->access_requests, request);
124 gnome_keyring_access_request_free (request);
This page took 0.085844 seconds and 4 git commands to generate.