]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - tests/src/test-gobject-greeter.c
Use asynchronous methods in gobject greeter
[sojka/lightdm.git] / tests / src / test-gobject-greeter.c
1 /* -*- Mode: C; indent-tabs-mode: nil; tab-width: 4 -*- */
2
3 #include <stdlib.h>
4 #include <stdio.h>
5 #include <string.h>
6 #include <xcb/xcb.h>
7 #include <lightdm.h>
8 #include <glib-unix.h>
9 #include <ctype.h>
10
11 #include "status.h"
12
13 static int exit_code = EXIT_SUCCESS;
14 static gchar *greeter_id;
15 static GMainLoop *loop;
16 static LightDMGreeter *greeter;
17 static xcb_connection_t *connection = NULL;
18 static GKeyFile *config;
19
20 static void
21 show_message_cb (LightDMGreeter *greeter, const gchar *text, LightDMMessageType type)
22 {
23     status_notify ("%s SHOW-MESSAGE TEXT=\"%s\"", greeter_id, text);
24 }
25
26 static void
27 show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type)
28 {
29     status_notify ("%s SHOW-PROMPT TEXT=\"%s\"", greeter_id, text);
30 }
31
32 static void
33 authentication_complete_cb (LightDMGreeter *greeter)
34 {
35     if (lightdm_greeter_get_authentication_user (greeter))
36         status_notify ("%s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s",
37                        greeter_id,
38                        lightdm_greeter_get_authentication_user (greeter),
39                        lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
40     else
41         status_notify ("%s AUTHENTICATION-COMPLETE AUTHENTICATED=%s",
42                        greeter_id,
43                        lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
44 }
45
46 static void
47 autologin_timer_expired_cb (LightDMGreeter *greeter)
48 {
49     status_notify ("%s AUTOLOGIN-TIMER-EXPIRED", greeter_id);
50 }
51
52 static gboolean
53 sigint_cb (gpointer user_data)
54 {
55     status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, SIGINT);
56     g_main_loop_quit (loop);
57     return TRUE;
58 }
59
60 static gboolean
61 sigterm_cb (gpointer user_data)
62 {
63     status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, SIGTERM);
64     g_main_loop_quit (loop);
65     return TRUE;
66 }
67
68 static void
69 user_changed_cb (LightDMUser *user)
70 {
71     status_notify ("%s USER-CHANGED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
72 }
73
74 static void
75 start_session_finished (GObject *object, GAsyncResult *result, gpointer data)
76 {
77     LightDMGreeter *greeter = LIGHTDM_GREETER (object);
78     GError *error = NULL;
79
80     if (!lightdm_greeter_start_session_finish (greeter, result, &error))
81         status_notify ("%s SESSION-FAILED", greeter_id);
82     g_clear_error (&error);
83 }
84
85 static void
86 write_shared_data_finished (GObject *object, GAsyncResult *result, gpointer data)
87 {
88     LightDMGreeter *greeter = LIGHTDM_GREETER (object);
89     gchar *dir, *path, *test_data;
90     FILE *f;
91
92     dir = lightdm_greeter_ensure_shared_data_dir_finish (greeter, result);
93     if (!dir)
94     {
95         status_notify ("%s WRITE-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id);
96         return;
97     }
98
99     path = g_build_filename (dir, "data", NULL);
100     test_data = data;
101     if (!(f = fopen (path, "w")) || fprintf (f, "%s", test_data) < 0)
102         status_notify ("%s WRITE-SHARED-DATA ERROR=%s", greeter_id, strerror (errno));
103     else
104         status_notify ("%s WRITE-SHARED-DATA RESULT=TRUE", greeter_id);
105     g_free (test_data);
106
107     if (f)
108         fclose (f);
109     g_free (path);
110     g_free (dir);
111 }
112
113 static void
114 read_shared_data_finished (GObject *object, GAsyncResult *result, gpointer data)
115 {
116     LightDMGreeter *greeter = LIGHTDM_GREETER (object);
117     gchar *dir, *path;
118     gchar *contents = NULL;
119     GError *error = NULL;
120
121     dir = lightdm_greeter_ensure_shared_data_dir_finish (greeter, result);
122     if (!dir)
123     {
124         status_notify ("%s READ-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id);
125         return;
126     }
127
128     path = g_build_filename (dir, "data", NULL);
129     if (g_file_get_contents (path, &contents, NULL, &error))
130         status_notify ("%s READ-SHARED-DATA DATA=%s", greeter_id, contents);
131     else
132         status_notify ("%s READ-SHARED-DATA ERROR=%s", greeter_id, error->message);
133     g_free (path);
134     g_free (contents);
135     g_clear_error (&error);
136 }
137
138 static void
139 request_cb (const gchar *name, GHashTable *params)
140 {
141     if (!name)
142     {
143         g_main_loop_quit (loop);
144         return;
145     }
146
147     if (strcmp (name, "CRASH") == 0)
148         kill (getpid (), SIGSEGV);
149
150     else if (strcmp (name, "AUTHENTICATE") == 0)
151         lightdm_greeter_authenticate (greeter, g_hash_table_lookup (params, "USERNAME"));
152
153     else if (strcmp (name, "AUTHENTICATE-GUEST") == 0)
154         lightdm_greeter_authenticate_as_guest (greeter);
155
156     else if (strcmp (name, "AUTHENTICATE-AUTOLOGIN") == 0)
157         lightdm_greeter_authenticate_autologin (greeter);
158
159     else if (strcmp (name, "AUTHENTICATE-REMOTE") == 0)
160         lightdm_greeter_authenticate_remote (greeter, g_hash_table_lookup (params, "SESSION"), NULL);
161
162     else if (strcmp (name, "RESPOND") == 0)
163         lightdm_greeter_respond (greeter, g_hash_table_lookup (params, "TEXT"));
164
165     else if (strcmp (name, "CANCEL-AUTHENTICATION") == 0)
166         lightdm_greeter_cancel_authentication (greeter);
167
168     else if (strcmp (name, "START-SESSION") == 0)
169         lightdm_greeter_start_session (greeter, g_hash_table_lookup (params, "SESSION"), NULL, start_session_finished, NULL);
170
171     else if (strcmp (name, "LOG-DEFAULT-SESSION") == 0)
172         status_notify ("%s LOG-DEFAULT-SESSION SESSION=%s", greeter_id, lightdm_greeter_get_default_session_hint (greeter));
173
174     else if (strcmp (name, "LOG-USER-LIST-LENGTH") == 0)
175         status_notify ("%s LOG-USER-LIST-LENGTH N=%d", greeter_id, lightdm_user_list_get_length (lightdm_user_list_get_instance ()));
176
177     else if (strcmp (name, "WRITE-SHARED-DATA") == 0)
178     {
179         const gchar *data = g_hash_table_lookup (params, "DATA");
180         lightdm_greeter_ensure_shared_data_dir (greeter, g_hash_table_lookup (params, "USERNAME"), NULL, write_shared_data_finished, g_strdup (data));
181     }
182
183     else if (strcmp (name, "READ-SHARED-DATA") == 0)
184         lightdm_greeter_ensure_shared_data_dir (greeter, g_hash_table_lookup (params, "USERNAME"), NULL, read_shared_data_finished, NULL);
185
186     else if (strcmp (name, "WATCH-USER") == 0)
187     {
188         LightDMUser *user;
189         const gchar *username;
190
191         username = g_hash_table_lookup (params, "USERNAME");
192         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
193         if (user)
194             g_signal_connect (user, "changed", G_CALLBACK (user_changed_cb), NULL);
195         status_notify ("%s WATCH-USER USERNAME=%s", greeter_id, username);
196     }
197
198     else if (strcmp (name, "LOG-USER") == 0)
199     {
200         LightDMUser *user;
201         const gchar *username, *image, *background, *language, *layout, *session;
202         const gchar * const * layouts;
203         gchar **fields = NULL;
204         gchar *layouts_text;
205         GString *status_text;
206         int i;
207
208         username = g_hash_table_lookup (params, "USERNAME");
209         if (g_hash_table_lookup (params, "FIELDS"))
210             fields = g_strsplit (g_hash_table_lookup (params, "FIELDS"), ",", -1);
211         if (!fields)
212         {
213             fields = g_malloc (sizeof (gchar *) * 1);
214             fields[0] = NULL;
215         }
216
217         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
218         image = lightdm_user_get_image (user);
219         background = lightdm_user_get_background (user);
220         language = lightdm_user_get_language (user);
221         layout = lightdm_user_get_layout (user);
222         layouts = lightdm_user_get_layouts (user);
223         layouts_text = g_strjoinv (";", (gchar **) layouts);
224         session = lightdm_user_get_session (user);
225
226         status_text = g_string_new ("");
227         g_string_append_printf (status_text, "%s LOG-USER USERNAME=%s", greeter_id, username);
228         for (i = 0; fields[i]; i++)
229         {
230             if (strcmp (fields[i], "REAL-NAME") == 0)
231                 g_string_append_printf (status_text, " REAL-NAME=%s", lightdm_user_get_real_name (user));
232             else if (strcmp (fields[i], "DISPLAY-NAME") == 0)
233                 g_string_append_printf (status_text, " DISPLAY-NAME=%s", lightdm_user_get_display_name (user));
234             else if (strcmp (fields[i], "IMAGE") == 0)
235                 g_string_append_printf (status_text, " IMAGE=%s", image ? image : "");
236             else if (strcmp (fields[i], "BACKGROUND") == 0)
237                 g_string_append_printf (status_text, " BACKGROUND=%s", background ? background : "");
238             else if (strcmp (fields[i], "LANGUAGE") == 0)
239                 g_string_append_printf (status_text, " LANGUAGE=%s", language ? language : "");
240             else if (strcmp (fields[i], "LAYOUT") == 0)
241                 g_string_append_printf (status_text, " LAYOUT=%s", layout ? layout : "");
242             else if (strcmp (fields[i], "LAYOUTS") == 0)
243                 g_string_append_printf (status_text, " LAYOUTS=%s", layouts_text);
244             else if (strcmp (fields[i], "SESSION") == 0)
245                 g_string_append_printf (status_text, " SESSION=%s", session ? session : "");
246             else if (strcmp (fields[i], "LOGGED-IN") == 0)
247                 g_string_append_printf (status_text, " LOGGED-IN=%s", lightdm_user_get_logged_in (user) ? "TRUE" : "FALSE");
248             else if (strcmp (fields[i], "HAS-MESSAGES") == 0)
249                 g_string_append_printf (status_text, " HAS-MESSAGES=%s", lightdm_user_get_has_messages (user) ? "TRUE" : "FALSE");
250         }
251         g_strfreev (fields);
252         g_free (layouts_text);
253
254         status_notify (status_text->str);
255         g_string_free (status_text, TRUE);
256     }
257
258     else if (strcmp (name, "LOG-USER-LIST") == 0)
259     {
260         GList *users, *link;
261
262         users = lightdm_user_list_get_users (lightdm_user_list_get_instance ());
263         for (link = users; link; link = link->next)
264         {
265             LightDMUser *user = link->data;
266             status_notify ("%s LOG-USER USERNAME=%s", greeter_id, lightdm_user_get_name (user));
267         }
268     }
269
270     else if (strcmp (name, "GET-CAN-SUSPEND") == 0)
271     {
272         gboolean can_suspend = lightdm_get_can_suspend ();
273         status_notify ("%s CAN-SUSPEND ALLOWED=%s", greeter_id, can_suspend ? "TRUE" : "FALSE");
274     }
275
276     else if (strcmp (name, "SUSPEND") == 0)
277     {
278         GError *error = NULL;
279         if (!lightdm_suspend (&error))
280             status_notify ("%s FAIL-SUSPEND", greeter_id);
281         g_clear_error (&error);
282     }
283
284     else if (strcmp (name, "GET-CAN-HIBERNATE") == 0)
285     {
286         gboolean can_hibernate = lightdm_get_can_hibernate ();
287         status_notify ("%s CAN-HIBERNATE ALLOWED=%s", greeter_id, can_hibernate ? "TRUE" : "FALSE");
288     }
289
290     else if (strcmp (name, "HIBERNATE") == 0)
291     {
292         GError *error = NULL;
293         if (!lightdm_hibernate (&error))
294             status_notify ("%s FAIL-HIBERNATE", greeter_id);
295         g_clear_error (&error);
296     }
297
298     else if (strcmp (name, "GET-CAN-RESTART") == 0)
299     {
300         gboolean can_restart = lightdm_get_can_restart ();
301         status_notify ("%s CAN-RESTART ALLOWED=%s", greeter_id, can_restart ? "TRUE" : "FALSE");
302     }
303
304     else if (strcmp (name, "RESTART") == 0)
305     {
306         GError *error = NULL;
307         if (!lightdm_restart (&error))
308             status_notify ("%s FAIL-RESTART", greeter_id);
309         g_clear_error (&error);
310     }
311
312     else if (strcmp (name, "GET-CAN-SHUTDOWN") == 0)
313     {
314         gboolean can_shutdown = lightdm_get_can_shutdown ();
315         status_notify ("%s CAN-SHUTDOWN ALLOWED=%s", greeter_id, can_shutdown ? "TRUE" : "FALSE");
316     }
317
318     else if (strcmp (name, "SHUTDOWN") == 0)
319     {
320         GError *error = NULL;
321         if (!lightdm_shutdown (&error))
322             status_notify ("%s FAIL-SHUTDOWN", greeter_id);
323         g_clear_error (&error);
324     }
325 }
326
327 static void
328 user_added_cb (LightDMUserList *user_list, LightDMUser *user)
329 {
330     status_notify ("%s USER-ADDED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
331 }
332
333 static void
334 user_removed_cb (LightDMUserList *user_list, LightDMUser *user)
335 {
336     status_notify ("%s USER-REMOVED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
337 }
338
339 static void
340 connect_finished (GObject *object, GAsyncResult *result, gpointer data)
341 {
342     LightDMGreeter *greeter = LIGHTDM_GREETER (object);
343     GError *error = NULL;
344
345     if (!lightdm_greeter_connect_finish (greeter, result, &error))
346     {
347         status_notify ("%s FAIL-CONNECT-DAEMON", greeter_id);
348         exit_code = EXIT_FAILURE;
349         g_main_loop_quit (loop);
350         return;
351     }
352
353     status_notify ("%s CONNECTED-TO-DAEMON", greeter_id);
354
355     if (lightdm_greeter_get_select_user_hint (greeter))
356         status_notify ("%s SELECT-USER-HINT USERNAME=%s", greeter_id, lightdm_greeter_get_select_user_hint (greeter));
357     if (lightdm_greeter_get_select_guest_hint (greeter))
358         status_notify ("%s SELECT-GUEST-HINT", greeter_id);
359     if (lightdm_greeter_get_lock_hint (greeter))
360         status_notify ("%s LOCK-HINT", greeter_id);
361     if (!lightdm_greeter_get_has_guest_account_hint (greeter))
362         status_notify ("%s HAS-GUEST-ACCOUNT-HINT=FALSE", greeter_id);
363     if (lightdm_greeter_get_hide_users_hint (greeter))
364         status_notify ("%s HIDE-USERS-HINT", greeter_id);
365     if (lightdm_greeter_get_show_manual_login_hint (greeter))
366         status_notify ("%s SHOW-MANUAL-LOGIN-HINT", greeter_id);
367     if (!lightdm_greeter_get_show_remote_login_hint (greeter))
368         status_notify ("%s SHOW-REMOTE-LOGIN-HINT=FALSE", greeter_id);
369 }
370
371 int
372 main (int argc, char **argv)
373 {
374     gchar *display, *xdg_seat, *xdg_vtnr, *xdg_session_cookie, *xdg_session_class, *mir_socket, *mir_vt, *mir_id;
375     GString *status_text;
376
377 #if !defined(GLIB_VERSION_2_36)
378     g_type_init ();
379 #endif
380
381     display = getenv ("DISPLAY");
382     xdg_seat = getenv ("XDG_SEAT");
383     xdg_vtnr = getenv ("XDG_VTNR");
384     xdg_session_cookie = getenv ("XDG_SESSION_COOKIE");
385     xdg_session_class = getenv ("XDG_SESSION_CLASS");
386     mir_socket = getenv ("MIR_SOCKET");
387     mir_vt = getenv ("MIR_SERVER_VT");
388     mir_id = getenv ("MIR_SERVER_NAME");
389     if (display)
390     {
391         if (display[0] == ':')
392             greeter_id = g_strdup_printf ("GREETER-X-%s", display + 1);
393         else
394             greeter_id = g_strdup_printf ("GREETER-X-%s", display);
395     }
396     else if (mir_id)
397         greeter_id = g_strdup_printf ("GREETER-MIR-%s", mir_id);
398     else if (mir_socket || mir_vt)
399         greeter_id = g_strdup ("GREETER-MIR");
400     else
401         greeter_id = g_strdup ("GREETER-?");
402
403     loop = g_main_loop_new (NULL, FALSE);
404
405     g_unix_signal_add (SIGINT, sigint_cb, NULL);
406     g_unix_signal_add (SIGTERM, sigterm_cb, NULL);
407
408     status_connect (request_cb, greeter_id);
409
410     status_text = g_string_new ("");
411     g_string_printf (status_text, "%s START", greeter_id);
412     if (xdg_seat)
413         g_string_append_printf (status_text, " XDG_SEAT=%s", xdg_seat);
414     if (xdg_vtnr)
415         g_string_append_printf (status_text, " XDG_VTNR=%s", xdg_vtnr);
416     if (xdg_session_cookie)
417         g_string_append_printf (status_text, " XDG_SESSION_COOKIE=%s", xdg_session_cookie);
418     if (xdg_session_class)
419         g_string_append_printf (status_text, " XDG_SESSION_CLASS=%s", xdg_session_class);
420     if (mir_vt > 0)
421         g_string_append_printf (status_text, " MIR_SERVER_VT=%s", mir_vt);
422     status_notify (status_text->str);
423     g_string_free (status_text, TRUE);
424
425     config = g_key_file_new ();
426     g_key_file_load_from_file (config, g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), G_KEY_FILE_NONE, NULL);
427
428     if (g_key_file_has_key (config, "test-greeter-config", "return-value", NULL))
429     {
430         int return_value = g_key_file_get_integer (config, "test-greeter-config", "return-value", NULL);
431         status_notify ("%s EXIT CODE=%d", greeter_id, return_value);
432         return return_value;
433     }
434
435     if (display)
436     {
437         connection = xcb_connect (NULL, NULL);
438         if (xcb_connection_has_error (connection))
439         {
440             status_notify ("%s FAIL-CONNECT-XSERVER", greeter_id);
441             return EXIT_FAILURE;
442         }
443         status_notify ("%s CONNECT-XSERVER", greeter_id);
444     }
445
446     greeter = lightdm_greeter_new ();
447     g_signal_connect (greeter, "show-message", G_CALLBACK (show_message_cb), NULL);
448     g_signal_connect (greeter, "show-prompt", G_CALLBACK (show_prompt_cb), NULL);
449     g_signal_connect (greeter, "authentication-complete", G_CALLBACK (authentication_complete_cb), NULL);
450     g_signal_connect (greeter, "autologin-timer-expired", G_CALLBACK (autologin_timer_expired_cb), NULL);
451
452     if (g_key_file_get_boolean (config, "test-greeter-config", "log-user-changes", NULL))
453     {
454         g_signal_connect (lightdm_user_list_get_instance (), "user-added", G_CALLBACK (user_added_cb), NULL);
455         g_signal_connect (lightdm_user_list_get_instance (), "user-removed", G_CALLBACK (user_removed_cb), NULL);
456     }
457
458     status_notify ("%s CONNECT-TO-DAEMON", greeter_id);
459     lightdm_greeter_connect (greeter, NULL, connect_finished, NULL);
460
461     g_main_loop_run (loop);
462
463     return exit_code;
464 }