]>
Commit | Line | Data |
---|---|---|
63fc4fee | 1 | Index: gnome-keyring-daemon.c |
2 | =================================================================== | |
3 | RCS file: /cvs/gnome/gnome-keyring/gnome-keyring-daemon.c,v | |
4 | retrieving revision 1.25 | |
5 | diff -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); |