1 /* -*- Mode: C; indent-tabs-mode: nil; tab-width: 4 -*- */
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;
21 show_message_cb (LightDMGreeter *greeter, const gchar *text, LightDMMessageType type)
23 status_notify ("%s SHOW-MESSAGE TEXT=\"%s\"", greeter_id, text);
27 show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type)
29 status_notify ("%s SHOW-PROMPT TEXT=\"%s\"", greeter_id, text);
33 authentication_complete_cb (LightDMGreeter *greeter)
35 if (lightdm_greeter_get_authentication_user (greeter))
36 status_notify ("%s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s",
38 lightdm_greeter_get_authentication_user (greeter),
39 lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
41 status_notify ("%s AUTHENTICATION-COMPLETE AUTHENTICATED=%s",
43 lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
47 autologin_timer_expired_cb (LightDMGreeter *greeter)
49 status_notify ("%s AUTOLOGIN-TIMER-EXPIRED", greeter_id);
53 sigint_cb (gpointer user_data)
55 status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, SIGINT);
56 g_main_loop_quit (loop);
61 sigterm_cb (gpointer user_data)
63 status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, SIGTERM);
64 g_main_loop_quit (loop);
69 user_changed_cb (LightDMUser *user)
71 status_notify ("%s USER-CHANGED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
75 start_session_finished (GObject *object, GAsyncResult *result, gpointer data)
77 LightDMGreeter *greeter = LIGHTDM_GREETER (object);
80 if (!lightdm_greeter_start_session_finish (greeter, result, &error))
81 status_notify ("%s SESSION-FAILED", greeter_id);
82 g_clear_error (&error);
86 write_shared_data_finished (GObject *object, GAsyncResult *result, gpointer data)
88 LightDMGreeter *greeter = LIGHTDM_GREETER (object);
89 gchar *dir, *path, *test_data;
92 dir = lightdm_greeter_ensure_shared_data_dir_finish (greeter, result);
95 status_notify ("%s WRITE-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id);
99 path = g_build_filename (dir, "data", NULL);
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));
104 status_notify ("%s WRITE-SHARED-DATA RESULT=TRUE", greeter_id);
114 read_shared_data_finished (GObject *object, GAsyncResult *result, gpointer data)
116 LightDMGreeter *greeter = LIGHTDM_GREETER (object);
118 gchar *contents = NULL;
119 GError *error = NULL;
121 dir = lightdm_greeter_ensure_shared_data_dir_finish (greeter, result);
124 status_notify ("%s READ-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id);
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);
132 status_notify ("%s READ-SHARED-DATA ERROR=%s", greeter_id, error->message);
135 g_clear_error (&error);
139 request_cb (const gchar *name, GHashTable *params)
143 g_main_loop_quit (loop);
147 if (strcmp (name, "CRASH") == 0)
148 kill (getpid (), SIGSEGV);
150 else if (strcmp (name, "AUTHENTICATE") == 0)
151 lightdm_greeter_authenticate (greeter, g_hash_table_lookup (params, "USERNAME"));
153 else if (strcmp (name, "AUTHENTICATE-GUEST") == 0)
154 lightdm_greeter_authenticate_as_guest (greeter);
156 else if (strcmp (name, "AUTHENTICATE-AUTOLOGIN") == 0)
157 lightdm_greeter_authenticate_autologin (greeter);
159 else if (strcmp (name, "AUTHENTICATE-REMOTE") == 0)
160 lightdm_greeter_authenticate_remote (greeter, g_hash_table_lookup (params, "SESSION"), NULL);
162 else if (strcmp (name, "RESPOND") == 0)
163 lightdm_greeter_respond (greeter, g_hash_table_lookup (params, "TEXT"));
165 else if (strcmp (name, "CANCEL-AUTHENTICATION") == 0)
166 lightdm_greeter_cancel_authentication (greeter);
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);
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));
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 ()));
177 else if (strcmp (name, "WRITE-SHARED-DATA") == 0)
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));
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);
186 else if (strcmp (name, "WATCH-USER") == 0)
189 const gchar *username;
191 username = g_hash_table_lookup (params, "USERNAME");
192 user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
194 g_signal_connect (user, "changed", G_CALLBACK (user_changed_cb), NULL);
195 status_notify ("%s WATCH-USER USERNAME=%s", greeter_id, username);
198 else if (strcmp (name, "LOG-USER") == 0)
201 const gchar *username, *image, *background, *language, *layout, *session;
202 const gchar * const * layouts;
203 gchar **fields = NULL;
205 GString *status_text;
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);
213 fields = g_malloc (sizeof (gchar *) * 1);
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);
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++)
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");
252 g_free (layouts_text);
254 status_notify (status_text->str);
255 g_string_free (status_text, TRUE);
258 else if (strcmp (name, "LOG-USER-LIST") == 0)
262 users = lightdm_user_list_get_users (lightdm_user_list_get_instance ());
263 for (link = users; link; link = link->next)
265 LightDMUser *user = link->data;
266 status_notify ("%s LOG-USER USERNAME=%s", greeter_id, lightdm_user_get_name (user));
270 else if (strcmp (name, "GET-CAN-SUSPEND") == 0)
272 gboolean can_suspend = lightdm_get_can_suspend ();
273 status_notify ("%s CAN-SUSPEND ALLOWED=%s", greeter_id, can_suspend ? "TRUE" : "FALSE");
276 else if (strcmp (name, "SUSPEND") == 0)
278 GError *error = NULL;
279 if (!lightdm_suspend (&error))
280 status_notify ("%s FAIL-SUSPEND", greeter_id);
281 g_clear_error (&error);
284 else if (strcmp (name, "GET-CAN-HIBERNATE") == 0)
286 gboolean can_hibernate = lightdm_get_can_hibernate ();
287 status_notify ("%s CAN-HIBERNATE ALLOWED=%s", greeter_id, can_hibernate ? "TRUE" : "FALSE");
290 else if (strcmp (name, "HIBERNATE") == 0)
292 GError *error = NULL;
293 if (!lightdm_hibernate (&error))
294 status_notify ("%s FAIL-HIBERNATE", greeter_id);
295 g_clear_error (&error);
298 else if (strcmp (name, "GET-CAN-RESTART") == 0)
300 gboolean can_restart = lightdm_get_can_restart ();
301 status_notify ("%s CAN-RESTART ALLOWED=%s", greeter_id, can_restart ? "TRUE" : "FALSE");
304 else if (strcmp (name, "RESTART") == 0)
306 GError *error = NULL;
307 if (!lightdm_restart (&error))
308 status_notify ("%s FAIL-RESTART", greeter_id);
309 g_clear_error (&error);
312 else if (strcmp (name, "GET-CAN-SHUTDOWN") == 0)
314 gboolean can_shutdown = lightdm_get_can_shutdown ();
315 status_notify ("%s CAN-SHUTDOWN ALLOWED=%s", greeter_id, can_shutdown ? "TRUE" : "FALSE");
318 else if (strcmp (name, "SHUTDOWN") == 0)
320 GError *error = NULL;
321 if (!lightdm_shutdown (&error))
322 status_notify ("%s FAIL-SHUTDOWN", greeter_id);
323 g_clear_error (&error);
328 user_added_cb (LightDMUserList *user_list, LightDMUser *user)
330 status_notify ("%s USER-ADDED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
334 user_removed_cb (LightDMUserList *user_list, LightDMUser *user)
336 status_notify ("%s USER-REMOVED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
340 connect_finished (GObject *object, GAsyncResult *result, gpointer data)
342 LightDMGreeter *greeter = LIGHTDM_GREETER (object);
343 GError *error = NULL;
345 if (!lightdm_greeter_connect_finish (greeter, result, &error))
347 status_notify ("%s FAIL-CONNECT-DAEMON", greeter_id);
348 exit_code = EXIT_FAILURE;
349 g_main_loop_quit (loop);
353 status_notify ("%s CONNECTED-TO-DAEMON", greeter_id);
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);
372 main (int argc, char **argv)
374 gchar *display, *xdg_seat, *xdg_vtnr, *xdg_session_cookie, *xdg_session_class, *mir_socket, *mir_vt, *mir_id;
375 GString *status_text;
377 #if !defined(GLIB_VERSION_2_36)
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");
391 if (display[0] == ':')
392 greeter_id = g_strdup_printf ("GREETER-X-%s", display + 1);
394 greeter_id = g_strdup_printf ("GREETER-X-%s", display);
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");
401 greeter_id = g_strdup ("GREETER-?");
403 loop = g_main_loop_new (NULL, FALSE);
405 g_unix_signal_add (SIGINT, sigint_cb, NULL);
406 g_unix_signal_add (SIGTERM, sigterm_cb, NULL);
408 status_connect (request_cb, greeter_id);
410 status_text = g_string_new ("");
411 g_string_printf (status_text, "%s START", greeter_id);
413 g_string_append_printf (status_text, " XDG_SEAT=%s", xdg_seat);
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);
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);
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);
428 if (g_key_file_has_key (config, "test-greeter-config", "return-value", NULL))
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);
437 connection = xcb_connect (NULL, NULL);
438 if (xcb_connection_has_error (connection))
440 status_notify ("%s FAIL-CONNECT-XSERVER", greeter_id);
443 status_notify ("%s CONNECT-XSERVER", greeter_id);
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);
452 if (g_key_file_get_boolean (config, "test-greeter-config", "log-user-changes", NULL))
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);
458 status_notify ("%s CONNECT-TO-DAEMON", greeter_id);
459 lightdm_greeter_connect (greeter, NULL, connect_finished, NULL);
461 g_main_loop_run (loop);