]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - tests/src/test-gobject-greeter.c
0b67e80f71ad3888b8dd5481307d402613d312a1
[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 }
50
51 static gboolean
52 sigint_cb (gpointer user_data)
53 {
54     status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, SIGINT);
55     g_main_loop_quit (loop);
56     return TRUE;
57 }
58
59 static gboolean
60 sigterm_cb (gpointer user_data)
61 {
62     status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, SIGTERM);
63     g_main_loop_quit (loop);
64     return TRUE;
65 }
66
67 static void
68 notify_hints (LightDMGreeter *greeter)
69 {
70     int timeout = lightdm_greeter_get_autologin_timeout_hint (greeter);
71
72     if (lightdm_greeter_get_select_user_hint (greeter))
73         status_notify ("%s SELECT-USER-HINT USERNAME=%s", greeter_id, lightdm_greeter_get_select_user_hint (greeter));
74     if (lightdm_greeter_get_select_guest_hint (greeter))
75         status_notify ("%s SELECT-GUEST-HINT", greeter_id);
76     if (lightdm_greeter_get_lock_hint (greeter))
77         status_notify ("%s LOCK-HINT", greeter_id);
78     if (!lightdm_greeter_get_has_guest_account_hint (greeter))
79         status_notify ("%s HAS-GUEST-ACCOUNT-HINT=FALSE", greeter_id);
80     if (lightdm_greeter_get_hide_users_hint (greeter))
81         status_notify ("%s HIDE-USERS-HINT", greeter_id);
82     if (lightdm_greeter_get_show_manual_login_hint (greeter))
83         status_notify ("%s SHOW-MANUAL-LOGIN-HINT", greeter_id);
84     if (!lightdm_greeter_get_show_remote_login_hint (greeter))
85         status_notify ("%s SHOW-REMOTE-LOGIN-HINT=FALSE", greeter_id);
86     if (lightdm_greeter_get_autologin_user_hint (greeter))
87     {
88         if (timeout != 0)
89             status_notify ("%s AUTOLOGIN-USER USERNAME=%s TIMEOUT=%d", greeter_id, lightdm_greeter_get_autologin_user_hint (greeter), timeout);
90         else
91             status_notify ("%s AUTOLOGIN-USER USERNAME=%s", greeter_id, lightdm_greeter_get_autologin_user_hint (greeter));
92     }
93     else if (lightdm_greeter_get_autologin_guest_hint (greeter))
94     {
95         if (timeout != 0)
96             status_notify ("%s AUTOLOGIN-GUEST TIMEOUT=%d", greeter_id, timeout);
97         else
98             status_notify ("%s AUTOLOGIN-GUEST", greeter_id);
99     }
100 }
101
102 static void
103 idle_cb (LightDMGreeter *greeter)
104 {
105     status_notify ("%s IDLE", greeter_id);
106 }
107
108 static void
109 reset_cb (LightDMGreeter *greeter)
110 {
111     status_notify ("%s RESET", greeter_id);
112     notify_hints (greeter);
113 }
114
115 static void
116 user_changed_cb (LightDMUser *user)
117 {
118     status_notify ("%s USER-CHANGED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
119 }
120
121 static void
122 start_session_finished (GObject *object, GAsyncResult *result, gpointer data)
123 {
124     LightDMGreeter *greeter = LIGHTDM_GREETER (object);
125     GError *error = NULL;
126
127     if (!lightdm_greeter_start_session_finish (greeter, result, &error))
128         status_notify ("%s SESSION-FAILED", greeter_id);
129     g_clear_error (&error);
130 }
131
132 static void
133 write_shared_data_finished (GObject *object, GAsyncResult *result, gpointer data)
134 {
135     LightDMGreeter *greeter = LIGHTDM_GREETER (object);
136     gchar *dir, *path, *test_data;
137     FILE *f;
138
139     dir = lightdm_greeter_ensure_shared_data_dir_finish (greeter, result);
140     if (!dir)
141     {
142         status_notify ("%s WRITE-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id);
143         return;
144     }
145
146     path = g_build_filename (dir, "data", NULL);
147     test_data = data;
148     if (!(f = fopen (path, "w")) || fprintf (f, "%s", test_data) < 0)
149         status_notify ("%s WRITE-SHARED-DATA ERROR=%s", greeter_id, strerror (errno));
150     else
151         status_notify ("%s WRITE-SHARED-DATA RESULT=TRUE", greeter_id);
152     g_free (test_data);
153
154     if (f)
155         fclose (f);
156     g_free (path);
157     g_free (dir);
158 }
159
160 static void
161 read_shared_data_finished (GObject *object, GAsyncResult *result, gpointer data)
162 {
163     LightDMGreeter *greeter = LIGHTDM_GREETER (object);
164     gchar *dir, *path;
165     gchar *contents = NULL;
166     GError *error = NULL;
167
168     dir = lightdm_greeter_ensure_shared_data_dir_finish (greeter, result);
169     if (!dir)
170     {
171         status_notify ("%s READ-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id);
172         return;
173     }
174
175     path = g_build_filename (dir, "data", NULL);
176     if (g_file_get_contents (path, &contents, NULL, &error))
177         status_notify ("%s READ-SHARED-DATA DATA=%s", greeter_id, contents);
178     else
179         status_notify ("%s READ-SHARED-DATA ERROR=%s", greeter_id, error->message);
180     g_free (path);
181     g_free (contents);
182     g_clear_error (&error);
183 }
184
185 static void
186 request_cb (const gchar *name, GHashTable *params)
187 {
188     if (!name)
189     {
190         g_main_loop_quit (loop);
191         return;
192     }
193
194     if (strcmp (name, "CRASH") == 0)
195         kill (getpid (), SIGSEGV);
196
197     else if (strcmp (name, "AUTHENTICATE") == 0)
198         lightdm_greeter_authenticate (greeter, g_hash_table_lookup (params, "USERNAME"));
199
200     else if (strcmp (name, "AUTHENTICATE-GUEST") == 0)
201         lightdm_greeter_authenticate_as_guest (greeter);
202
203     else if (strcmp (name, "AUTHENTICATE-AUTOLOGIN") == 0)
204         lightdm_greeter_authenticate_autologin (greeter);
205
206     else if (strcmp (name, "AUTHENTICATE-REMOTE") == 0)
207         lightdm_greeter_authenticate_remote (greeter, g_hash_table_lookup (params, "SESSION"), NULL);
208
209     else if (strcmp (name, "RESPOND") == 0)
210         lightdm_greeter_respond (greeter, g_hash_table_lookup (params, "TEXT"));
211
212     else if (strcmp (name, "CANCEL-AUTHENTICATION") == 0)
213         lightdm_greeter_cancel_authentication (greeter);
214
215     else if (strcmp (name, "START-SESSION") == 0)
216         lightdm_greeter_start_session (greeter, g_hash_table_lookup (params, "SESSION"), NULL, start_session_finished, NULL);
217
218     else if (strcmp (name, "LOG-DEFAULT-SESSION") == 0)
219         status_notify ("%s LOG-DEFAULT-SESSION SESSION=%s", greeter_id, lightdm_greeter_get_default_session_hint (greeter));
220
221     else if (strcmp (name, "LOG-USER-LIST-LENGTH") == 0)
222         status_notify ("%s LOG-USER-LIST-LENGTH N=%d", greeter_id, lightdm_user_list_get_length (lightdm_user_list_get_instance ()));
223
224     else if (strcmp (name, "WRITE-SHARED-DATA") == 0)
225     {
226         const gchar *data = g_hash_table_lookup (params, "DATA");
227         lightdm_greeter_ensure_shared_data_dir (greeter, g_hash_table_lookup (params, "USERNAME"), NULL, write_shared_data_finished, g_strdup (data));
228     }
229
230     else if (strcmp (name, "READ-SHARED-DATA") == 0)
231         lightdm_greeter_ensure_shared_data_dir (greeter, g_hash_table_lookup (params, "USERNAME"), NULL, read_shared_data_finished, NULL);
232
233     else if (strcmp (name, "WATCH-USER") == 0)
234     {
235         LightDMUser *user;
236         const gchar *username;
237
238         username = g_hash_table_lookup (params, "USERNAME");
239         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
240         if (user)
241             g_signal_connect (user, LIGHTDM_SIGNAL_USER_CHANGED, G_CALLBACK (user_changed_cb), NULL);
242         status_notify ("%s WATCH-USER USERNAME=%s", greeter_id, username);
243     }
244
245     else if (strcmp (name, "LOG-USER") == 0)
246     {
247         LightDMUser *user;
248         const gchar *username, *image, *background, *language, *layout, *session;
249         const gchar * const * layouts;
250         gchar **fields = NULL;
251         gchar *layouts_text;
252         GString *status_text;
253         int i;
254
255         username = g_hash_table_lookup (params, "USERNAME");
256         if (g_hash_table_lookup (params, "FIELDS"))
257             fields = g_strsplit (g_hash_table_lookup (params, "FIELDS"), ",", -1);
258         if (!fields)
259         {
260             fields = g_malloc (sizeof (gchar *) * 1);
261             fields[0] = NULL;
262         }
263
264         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
265         image = lightdm_user_get_image (user);
266         background = lightdm_user_get_background (user);
267         language = lightdm_user_get_language (user);
268         layout = lightdm_user_get_layout (user);
269         layouts = lightdm_user_get_layouts (user);
270         layouts_text = g_strjoinv (";", (gchar **) layouts);
271         session = lightdm_user_get_session (user);
272
273         status_text = g_string_new ("");
274         g_string_append_printf (status_text, "%s LOG-USER USERNAME=%s", greeter_id, username);
275         for (i = 0; fields[i]; i++)
276         {
277             if (strcmp (fields[i], "REAL-NAME") == 0)
278                 g_string_append_printf (status_text, " REAL-NAME=%s", lightdm_user_get_real_name (user));
279             else if (strcmp (fields[i], "DISPLAY-NAME") == 0)
280                 g_string_append_printf (status_text, " DISPLAY-NAME=%s", lightdm_user_get_display_name (user));
281             else if (strcmp (fields[i], "IMAGE") == 0)
282                 g_string_append_printf (status_text, " IMAGE=%s", image ? image : "");
283             else if (strcmp (fields[i], "BACKGROUND") == 0)
284                 g_string_append_printf (status_text, " BACKGROUND=%s", background ? background : "");
285             else if (strcmp (fields[i], "LANGUAGE") == 0)
286                 g_string_append_printf (status_text, " LANGUAGE=%s", language ? language : "");
287             else if (strcmp (fields[i], "LAYOUT") == 0)
288                 g_string_append_printf (status_text, " LAYOUT=%s", layout ? layout : "");
289             else if (strcmp (fields[i], "LAYOUTS") == 0)
290                 g_string_append_printf (status_text, " LAYOUTS=%s", layouts_text);
291             else if (strcmp (fields[i], "SESSION") == 0)
292                 g_string_append_printf (status_text, " SESSION=%s", session ? session : "");
293             else if (strcmp (fields[i], "LOGGED-IN") == 0)
294                 g_string_append_printf (status_text, " LOGGED-IN=%s", lightdm_user_get_logged_in (user) ? "TRUE" : "FALSE");
295             else if (strcmp (fields[i], "HAS-MESSAGES") == 0)
296                 g_string_append_printf (status_text, " HAS-MESSAGES=%s", lightdm_user_get_has_messages (user) ? "TRUE" : "FALSE");
297             else if (strcmp (fields[i], "UID") == 0)
298                 g_string_append_printf (status_text, " UID=%d", lightdm_user_get_uid (user));
299         }
300         g_strfreev (fields);
301         g_free (layouts_text);
302
303         status_notify ("%s", status_text->str);
304         g_string_free (status_text, TRUE);
305     }
306
307     else if (strcmp (name, "LOG-USER-LIST") == 0)
308     {
309         GList *users, *link;
310
311         users = lightdm_user_list_get_users (lightdm_user_list_get_instance ());
312         for (link = users; link; link = link->next)
313         {
314             LightDMUser *user = link->data;
315             status_notify ("%s LOG-USER USERNAME=%s", greeter_id, lightdm_user_get_name (user));
316         }
317     }
318
319     else if (strcmp (name, "GET-CAN-SUSPEND") == 0)
320     {
321         gboolean can_suspend = lightdm_get_can_suspend ();
322         status_notify ("%s CAN-SUSPEND ALLOWED=%s", greeter_id, can_suspend ? "TRUE" : "FALSE");
323     }
324
325     else if (strcmp (name, "SUSPEND") == 0)
326     {
327         GError *error = NULL;
328         if (!lightdm_suspend (&error))
329             status_notify ("%s FAIL-SUSPEND", greeter_id);
330         g_clear_error (&error);
331     }
332
333     else if (strcmp (name, "GET-CAN-HIBERNATE") == 0)
334     {
335         gboolean can_hibernate = lightdm_get_can_hibernate ();
336         status_notify ("%s CAN-HIBERNATE ALLOWED=%s", greeter_id, can_hibernate ? "TRUE" : "FALSE");
337     }
338
339     else if (strcmp (name, "HIBERNATE") == 0)
340     {
341         GError *error = NULL;
342         if (!lightdm_hibernate (&error))
343             status_notify ("%s FAIL-HIBERNATE", greeter_id);
344         g_clear_error (&error);
345     }
346
347     else if (strcmp (name, "GET-CAN-RESTART") == 0)
348     {
349         gboolean can_restart = lightdm_get_can_restart ();
350         status_notify ("%s CAN-RESTART ALLOWED=%s", greeter_id, can_restart ? "TRUE" : "FALSE");
351     }
352
353     else if (strcmp (name, "RESTART") == 0)
354     {
355         GError *error = NULL;
356         if (!lightdm_restart (&error))
357             status_notify ("%s FAIL-RESTART", greeter_id);
358         g_clear_error (&error);
359     }
360
361     else if (strcmp (name, "GET-CAN-SHUTDOWN") == 0)
362     {
363         gboolean can_shutdown = lightdm_get_can_shutdown ();
364         status_notify ("%s CAN-SHUTDOWN ALLOWED=%s", greeter_id, can_shutdown ? "TRUE" : "FALSE");
365     }
366
367     else if (strcmp (name, "SHUTDOWN") == 0)
368     {
369         GError *error = NULL;
370         if (!lightdm_shutdown (&error))
371             status_notify ("%s FAIL-SHUTDOWN", greeter_id);
372         g_clear_error (&error);
373     }
374 }
375
376 static void
377 user_added_cb (LightDMUserList *user_list, LightDMUser *user)
378 {
379     status_notify ("%s USER-ADDED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
380 }
381
382 static void
383 user_removed_cb (LightDMUserList *user_list, LightDMUser *user)
384 {
385     status_notify ("%s USER-REMOVED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
386 }
387
388 static void
389 connect_finished (GObject *object, GAsyncResult *result, gpointer data)
390 {
391     LightDMGreeter *greeter = LIGHTDM_GREETER (object);
392     GError *error = NULL;
393
394     if (!lightdm_greeter_connect_to_daemon_finish (greeter, result, &error))
395     {
396         status_notify ("%s FAIL-CONNECT-DAEMON ERROR=%s", greeter_id, error->message);
397         g_clear_error (&error);
398         exit_code = EXIT_FAILURE;
399         g_main_loop_quit (loop);
400         return;
401     }
402
403     status_notify ("%s CONNECTED-TO-DAEMON", greeter_id);
404
405     notify_hints (greeter);
406 }
407
408 int
409 main (int argc, char **argv)
410 {
411     gchar *display, *xdg_seat, *xdg_vtnr, *xdg_session_cookie, *xdg_session_class, *xdg_session_type, *mir_server_host_socket, *mir_vt, *mir_id, *path;
412     GString *status_text;
413
414 #if !defined(GLIB_VERSION_2_36)
415     g_type_init ();
416 #endif
417
418     display = getenv ("DISPLAY");
419     xdg_seat = getenv ("XDG_SEAT");
420     xdg_vtnr = getenv ("XDG_VTNR");
421     xdg_session_cookie = getenv ("XDG_SESSION_COOKIE");
422     xdg_session_class = getenv ("XDG_SESSION_CLASS");
423     xdg_session_type = getenv ("XDG_SESSION_TYPE");  
424     mir_server_host_socket = getenv ("MIR_SERVER_HOST_SOCKET");
425     mir_vt = getenv ("MIR_SERVER_VT");
426     mir_id = getenv ("MIR_SERVER_NAME");
427     if (display)
428     {
429         if (display[0] == ':')
430             greeter_id = g_strdup_printf ("GREETER-X-%s", display + 1);
431         else
432             greeter_id = g_strdup_printf ("GREETER-X-%s", display);
433     }
434     else if (mir_id)
435         greeter_id = g_strdup_printf ("GREETER-MIR-%s", mir_id);
436     else if (mir_server_host_socket || mir_vt)
437         greeter_id = g_strdup ("GREETER-MIR");
438     else if (g_strcmp0 (xdg_session_type, "wayland") == 0)
439         greeter_id = g_strdup ("GREETER-WAYLAND");
440     else
441         greeter_id = g_strdup ("GREETER-?");
442
443     loop = g_main_loop_new (NULL, FALSE);
444
445     g_unix_signal_add (SIGINT, sigint_cb, NULL);
446     g_unix_signal_add (SIGTERM, sigterm_cb, NULL);
447
448     status_connect (request_cb, greeter_id);
449
450     status_text = g_string_new ("");
451     g_string_printf (status_text, "%s START", greeter_id);
452     if (xdg_seat)
453         g_string_append_printf (status_text, " XDG_SEAT=%s", xdg_seat);
454     if (xdg_vtnr)
455         g_string_append_printf (status_text, " XDG_VTNR=%s", xdg_vtnr);
456     if (xdg_session_cookie)
457         g_string_append_printf (status_text, " XDG_SESSION_COOKIE=%s", xdg_session_cookie);
458     if (xdg_session_class)
459         g_string_append_printf (status_text, " XDG_SESSION_CLASS=%s", xdg_session_class);
460     if (mir_vt > 0)
461         g_string_append_printf (status_text, " MIR_SERVER_VT=%s", mir_vt);
462     status_notify ("%s", status_text->str);
463     g_string_free (status_text, TRUE);
464
465     config = g_key_file_new ();
466     path = g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "script", NULL);
467     g_key_file_load_from_file (config, path, G_KEY_FILE_NONE, NULL);
468     g_free (path);
469
470     if (g_key_file_has_key (config, "test-greeter-config", "return-value", NULL))
471     {
472         int return_value = g_key_file_get_integer (config, "test-greeter-config", "return-value", NULL);
473         status_notify ("%s EXIT CODE=%d", greeter_id, return_value);
474         return return_value;
475     }
476
477     if (display)
478     {
479         connection = xcb_connect (NULL, NULL);
480         if (xcb_connection_has_error (connection))
481         {
482             status_notify ("%s FAIL-CONNECT-XSERVER", greeter_id);
483             return EXIT_FAILURE;
484         }
485         status_notify ("%s CONNECT-XSERVER", greeter_id);
486     }
487
488     greeter = lightdm_greeter_new ();
489     g_signal_connect (greeter, LIGHTDM_GREETER_SIGNAL_SHOW_MESSAGE, G_CALLBACK (show_message_cb), NULL);
490     g_signal_connect (greeter, LIGHTDM_GREETER_SIGNAL_SHOW_PROMPT, G_CALLBACK (show_prompt_cb), NULL);
491     g_signal_connect (greeter, LIGHTDM_GREETER_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (authentication_complete_cb), NULL);
492     g_signal_connect (greeter, LIGHTDM_GREETER_SIGNAL_AUTOLOGIN_TIMER_EXPIRED, G_CALLBACK (autologin_timer_expired_cb), NULL);
493     if (g_key_file_get_boolean (config, "test-greeter-config", "resettable", NULL))
494     {
495         lightdm_greeter_set_resettable (greeter, TRUE);
496         g_signal_connect (greeter, LIGHTDM_GREETER_SIGNAL_IDLE, G_CALLBACK (idle_cb), NULL);
497         g_signal_connect (greeter, LIGHTDM_GREETER_SIGNAL_RESET, G_CALLBACK (reset_cb), NULL);
498     }
499
500     if (g_key_file_get_boolean (config, "test-greeter-config", "log-user-changes", NULL))
501     {
502         g_signal_connect (lightdm_user_list_get_instance (), LIGHTDM_USER_LIST_SIGNAL_USER_ADDED, G_CALLBACK (user_added_cb), NULL);
503         g_signal_connect (lightdm_user_list_get_instance (), LIGHTDM_USER_LIST_SIGNAL_USER_REMOVED, G_CALLBACK (user_removed_cb), NULL);
504     }
505
506     status_notify ("%s CONNECT-TO-DAEMON", greeter_id);
507     lightdm_greeter_connect_to_daemon (greeter, NULL, connect_finished, NULL);
508
509     g_main_loop_run (loop);
510
511     return exit_code;
512 }