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