1 #include "e_mod_main.h"
2
3 static Eina_Bool
_auth_cb_exit(void * data,int type EINA_UNUSED,void * event)4 _auth_cb_exit(void *data, int type EINA_UNUSED, void *event)
5 {
6 Polkit_Session *ps = data;
7 Ecore_Exe_Event_Del *ev = event;
8
9 if (ev->pid != ps->auth_pid) return ECORE_CALLBACK_PASS_ON;
10 ps->auth_pid = 0;
11 if (ps->exe_exit_handler) ecore_event_handler_del(ps->exe_exit_handler);
12 ps->exe_exit_handler = NULL;
13 session_reply(ps);
14 return ECORE_CALLBACK_PASS_ON;
15 }
16
17 static void
_cb_del(void * data EINA_UNUSED,Evas * evas EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)18 _cb_del(void *data EINA_UNUSED, Evas *evas EINA_UNUSED, Evas_Object *obj,
19 void *event_info EINA_UNUSED)
20 {
21 Polkit_Session *ps = evas_object_data_get(obj, "session");
22 if (!ps) return;
23 if (ps->exe_exit_handler)
24 {
25 ecore_event_handler_del(ps->exe_exit_handler);
26 ps->exe_exit_handler = NULL;
27 }
28 if (ps->win)
29 {
30 ps->win = NULL;
31 session_reply(ps);
32 }
33 }
34
35 static void
_cb_ok(void * data EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)36 _cb_ok(void *data EINA_UNUSED, Evas_Object *obj,
37 void *event_info EINA_UNUSED)
38 {
39 Polkit_Session *ps = evas_object_data_get(obj, "session");
40 const char *str = elm_object_text_get(obj);
41
42 if (!ps) return;
43 if (ps->exe_exit_handler) return;
44 elm_object_disabled_set(evas_object_data_get(obj, "label"), EINA_TRUE);
45 elm_object_disabled_set(evas_object_data_get(obj, "label2"), EINA_TRUE);
46 elm_object_disabled_set(evas_object_data_get(obj, "entry"), EINA_TRUE);
47 e_dialog_button_disable_num_set(evas_object_data_get(obj, "dia"), 0, 1);
48 e_dialog_button_disable_num_set(evas_object_data_get(obj, "dia"), 1, 1);
49 ps->exe_exit_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
50 _auth_cb_exit, ps);
51 if (str)
52 {
53 char *passwd = elm_entry_markup_to_utf8(str);
54 if (passwd)
55 {
56 ps->auth_pid = e_auth_polkit_begin(passwd, ps->cookie, ps->target_uid);
57 free(passwd);
58 return;
59 }
60 }
61 evas_object_del(ps->win);
62 }
63
64 static void
_cb_cancel(void * data EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)65 _cb_cancel(void *data EINA_UNUSED, Evas_Object *obj,
66 void *event_info EINA_UNUSED)
67 {
68 Polkit_Session *ps = evas_object_data_get(obj, "session");
69 if (!ps) return;
70 if (ps->exe_exit_handler) return;
71 session_reply(ps);
72 }
73
74 static void
_cb_button_ok(void * data,E_Dialog * dia EINA_UNUSED)75 _cb_button_ok(void *data, E_Dialog *dia EINA_UNUSED)
76 {
77 _cb_ok(NULL, data, NULL);
78 }
79
80 static void
_cb_button_cancel(void * data,E_Dialog * dia EINA_UNUSED)81 _cb_button_cancel(void *data, E_Dialog *dia EINA_UNUSED)
82 {
83 _cb_cancel(NULL, data, NULL);
84 }
85
86 void
auth_ui(Polkit_Session * ps)87 auth_ui(Polkit_Session *ps)
88 {
89 E_Dialog *dia;
90 Evas_Object *o, *win, *box, *fr, *lab, *lab2, *ent;
91 char buf[512];
92 struct passwd *pass;
93
94 dia = e_dialog_new(NULL, "E", "_polkit_auth");
95 e_dialog_title_set(dia, _("Please enter password"));
96
97 win = dia->win;
98
99 if ((!ps->icon_name) || (!ps->icon_name[0]))
100 e_dialog_icon_set(dia, "enlightenment", 64);
101 else
102 e_dialog_icon_set(dia, ps->icon_name, 64);
103
104 evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cb_del, NULL);
105 elm_win_autodel_set(win, EINA_TRUE);
106 evas_object_data_set(win, "session", ps);
107
108 box = o = elm_box_add(win);
109 evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
110 evas_object_size_hint_align_set(o, -1.0, -1.0);
111 elm_box_horizontal_set(o, EINA_FALSE);
112 e_dialog_content_set(dia, o, 0, 0);
113 evas_object_show(o);
114
115 /* XXX: lookup action and display something useful for it in future.
116 o = elm_label_add(win);
117 evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
118 evas_object_size_hint_align_set(o, 0.0, 0.0);
119 elm_object_text_set(o, ps->action);
120 elm_box_pack_end(box, o);
121 evas_object_show(o);
122 */
123
124 fr = o = elm_frame_add(win);
125 elm_object_style_set(o, "pad_medium");
126 evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
127 evas_object_size_hint_align_set(o, 0.0, 0.0);
128 elm_box_pack_end(box, o);
129 evas_object_show(o);
130
131 lab = o = elm_label_add(win);
132 evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
133 evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.0);
134 elm_object_text_set(o, ps->message);
135 elm_object_content_set(fr, o);
136 evas_object_show(o);
137 evas_object_data_set(win, "label", o);
138
139 fr = o = elm_frame_add(win);
140 elm_object_style_set(o, "pad_medium");
141 evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
142 evas_object_size_hint_align_set(o, 0.0, 0.0);
143 elm_box_pack_end(box, o);
144 evas_object_show(o);
145
146 pass = getpwuid(ps->target_uid);
147 if ((pass) && (pass->pw_name))
148 snprintf(buf, sizeof(buf), _("Enter password for <b>%s</b>"), pass->pw_name);
149 else
150 snprintf(buf, sizeof(buf), _("Enter passowrd for UID %u"), ps->target_uid);
151 lab2 = o = elm_label_add(win);
152 evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
153 evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.0);
154 elm_object_text_set(o, buf);
155 elm_object_content_set(fr, o);
156 evas_object_show(o);
157 evas_object_data_set(win, "label2", o);
158
159 fr = o = elm_frame_add(win);
160 elm_object_style_set(o, "pad_medium");
161 evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
162 evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 1.0);
163 elm_box_pack_end(box, o);
164 evas_object_show(o);
165
166 ent = o = elm_entry_add(win);
167 evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
168 evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.0);
169 elm_entry_single_line_set(o, EINA_TRUE);
170 elm_entry_scrollable_set(o, EINA_TRUE);
171 elm_entry_password_set(o, EINA_TRUE);
172 elm_object_part_text_set(o, "elm.guide", "Enter Password");
173 evas_object_data_set(o, "session", ps);
174 evas_object_data_set(o, "label", lab);
175 evas_object_data_set(o, "label2", lab2);
176 evas_object_data_set(o, "entry", ent);
177 evas_object_data_set(o, "dia", dia);
178 evas_object_smart_callback_add(o, "activated", _cb_ok, win);
179 evas_object_smart_callback_add(o, "aborted", _cb_cancel, win);
180 elm_object_content_set(fr, o);
181 evas_object_show(o);
182 evas_object_data_set(win, "entry", o);
183
184 e_dialog_button_add(dia, _("OK"), NULL, _cb_button_ok, ent);
185 e_dialog_button_add(dia, _("Cancel"), NULL, _cb_button_cancel, ent);
186 e_dialog_button_focus_num(dia, 0);
187
188 elm_object_focus_set(ent, EINA_TRUE);
189
190 ps->win = win;
191 ps->entry = ent;
192
193 elm_win_center(win, 1, 1);
194 e_dialog_show(dia);
195 elm_win_activate(win);
196 }
197