1 /* -*- Mode: C; indent-tabs-mode: nil; tab-width: 4 -*- */
13 static gchar *greeter_id;
14 static GMainLoop *loop;
15 static LightDMGreeter *greeter;
16 static xcb_connection_t *connection = NULL;
17 static GKeyFile *config;
20 show_message_cb (LightDMGreeter *greeter, const gchar *text, LightDMMessageType type)
22 status_notify ("%s SHOW-MESSAGE TEXT=\"%s\"", greeter_id, text);
26 show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type)
28 status_notify ("%s SHOW-PROMPT TEXT=\"%s\"", greeter_id, text);
32 authentication_complete_cb (LightDMGreeter *greeter)
34 if (lightdm_greeter_get_authentication_user (greeter))
35 status_notify ("%s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s",
37 lightdm_greeter_get_authentication_user (greeter),
38 lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
40 status_notify ("%s AUTHENTICATION-COMPLETE AUTHENTICATED=%s",
42 lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
46 autologin_timer_expired_cb (LightDMGreeter *greeter)
48 status_notify ("%s AUTOLOGIN-TIMER-EXPIRED", greeter_id);
52 sigint_cb (gpointer user_data)
54 status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, SIGINT);
55 g_main_loop_quit (loop);
60 sigterm_cb (gpointer user_data)
62 status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, SIGTERM);
63 g_main_loop_quit (loop);
68 user_changed_cb (LightDMUser *user)
70 status_notify ("%s USER-CHANGED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
74 request_cb (const gchar *request)
76 const gchar *c, *start;
78 gchar *id, *name = NULL;
84 g_main_loop_quit (loop);
91 while (*c && !isspace (*c))
96 id = g_strdup_printf ("%.*s", l, start);
97 id_matches = strcmp (id, greeter_id) == 0;
106 while (*c && !isspace (*c))
111 name = g_strdup_printf ("%.*s", l, start);
113 params = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
117 gchar *param_name, *param_value;
122 while (*c && !isspace (*c) && *c != '=')
127 param_name = g_strdup_printf ("%.*s", (int) (c - start), start);
136 gboolean escaped = FALSE;
140 value = g_string_new ("");
147 g_string_append_c (value, '\\');
153 else if (!escaped && *c == '\"')
156 g_string_append_c (value, *c);
159 param_value = value->str;
160 g_string_free (value, FALSE);
167 while (*c && !isspace (*c))
169 param_value = g_strdup_printf ("%.*s", (int) (c - start), start);
173 param_value = g_strdup ("");
175 g_hash_table_insert (params, param_name, param_value);
178 if (strcmp (name, "AUTHENTICATE") == 0)
179 lightdm_greeter_authenticate (greeter, g_hash_table_lookup (params, "USERNAME"));
181 if (strcmp (name, "AUTHENTICATE-GUEST") == 0)
182 lightdm_greeter_authenticate_as_guest (greeter);
184 if (strcmp (name, "AUTHENTICATE-AUTOLOGIN") == 0)
185 lightdm_greeter_authenticate_autologin (greeter);
187 if (strcmp (name, "AUTHENTICATE-REMOTE") == 0)
188 lightdm_greeter_authenticate_remote (greeter, g_hash_table_lookup (params, "SESSION"), NULL);
190 if (strcmp (name, "RESPOND") == 0)
191 lightdm_greeter_respond (greeter, g_hash_table_lookup (params, "TEXT"));
193 if (strcmp (name, "CANCEL-AUTHENTICATION") == 0)
194 lightdm_greeter_cancel_authentication (greeter);
196 if (strcmp (name, "START-SESSION") == 0)
197 if (!lightdm_greeter_start_session_sync (greeter, g_hash_table_lookup (params, "SESSION"), NULL))
198 status_notify ("%s SESSION-FAILED", greeter_id);
200 if (strcmp (name, "LOG-DEFAULT-SESSION") == 0)
201 status_notify ("%s LOG-DEFAULT-SESSION SESSION=%s", greeter_id, lightdm_greeter_get_default_session_hint (greeter));
203 if (strcmp (name, "LOG-USER-LIST-LENGTH") == 0)
204 status_notify ("%s LOG-USER-LIST-LENGTH N=%d", greeter_id, lightdm_user_list_get_length (lightdm_user_list_get_instance ()));
206 if (strcmp (name, "WRITE-SHARED-DATA") == 0)
210 dir = lightdm_greeter_ensure_shared_data_dir_sync (greeter, g_hash_table_lookup (params, "USERNAME"));
216 g_printerr ("dir='%s'\n", dir);
218 path = g_build_filename (dir, "data", NULL);
219 if (!(f = fopen (path, "w")) || fprintf (f, "%s", (const gchar *) g_hash_table_lookup (params, "DATA")) < 0)
220 status_notify ("%s WRITE-SHARED-DATA ERROR=%s", greeter_id, strerror (errno));
222 status_notify ("%s WRITE-SHARED-DATA RESULT=TRUE", greeter_id);
230 status_notify ("%s WRITE-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id);
233 if (strcmp (name, "READ-SHARED-DATA") == 0)
237 dir = lightdm_greeter_ensure_shared_data_dir_sync (greeter, g_hash_table_lookup (params, "USERNAME"));
241 gchar *contents = NULL;
242 GError *error = NULL;
244 g_printerr ("dir='%s'\n", dir);
246 path = g_build_filename (dir, "data", NULL);
247 if (g_file_get_contents (path, &contents, NULL, &error))
248 status_notify ("%s READ-SHARED-DATA DATA=%s", greeter_id, contents);
250 status_notify ("%s READ-SHARED-DATA ERROR=%s", greeter_id, error->message);
253 g_clear_error (&error);
256 status_notify ("%s READ-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id);
259 if (strcmp (name, "WATCH-USER") == 0)
262 const gchar *username;
264 username = g_hash_table_lookup (params, "USERNAME");
265 user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
267 g_signal_connect (user, "changed", G_CALLBACK (user_changed_cb), NULL);
268 status_notify ("%s WATCH-USER USERNAME=%s", greeter_id, username);
271 if (strcmp (name, "LOG-USER") == 0)
274 const gchar *username, *image, *background, *language, *layout, *session;
275 const gchar * const * layouts;
276 gchar **fields = NULL;
278 GString *status_text;
281 username = g_hash_table_lookup (params, "USERNAME");
282 if (g_hash_table_lookup (params, "FIELDS"))
283 fields = g_strsplit (g_hash_table_lookup (params, "FIELDS"), ",", -1);
286 fields = g_malloc (sizeof (gchar *) * 1);
290 user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
291 image = lightdm_user_get_image (user);
292 background = lightdm_user_get_background (user);
293 language = lightdm_user_get_language (user);
294 layout = lightdm_user_get_layout (user);
295 layouts = lightdm_user_get_layouts (user);
296 layouts_text = g_strjoinv (";", (gchar **) layouts);
297 session = lightdm_user_get_session (user);
299 status_text = g_string_new ("");
300 g_string_append_printf (status_text, "%s LOG-USER USERNAME=%s", greeter_id, username);
301 for (i = 0; fields[i]; i++)
303 if (strcmp (fields[i], "REAL-NAME") == 0)
304 g_string_append_printf (status_text, " REAL-NAME=%s", lightdm_user_get_real_name (user));
305 else if (strcmp (fields[i], "DISPLAY-NAME") == 0)
306 g_string_append_printf (status_text, " DISPLAY-NAME=%s", lightdm_user_get_display_name (user));
307 else if (strcmp (fields[i], "IMAGE") == 0)
308 g_string_append_printf (status_text, " IMAGE=%s", image ? image : "");
309 else if (strcmp (fields[i], "BACKGROUND") == 0)
310 g_string_append_printf (status_text, " BACKGROUND=%s", background ? background : "");
311 else if (strcmp (fields[i], "LANGUAGE") == 0)
312 g_string_append_printf (status_text, " LANGUAGE=%s", language ? language : "");
313 else if (strcmp (fields[i], "LAYOUT") == 0)
314 g_string_append_printf (status_text, " LAYOUT=%s", layout ? layout : "");
315 else if (strcmp (fields[i], "LAYOUTS") == 0)
316 g_string_append_printf (status_text, " LAYOUTS=%s", layouts_text);
317 else if (strcmp (fields[i], "SESSION") == 0)
318 g_string_append_printf (status_text, " SESSION=%s", session ? session : "");
319 else if (strcmp (fields[i], "LOGGED-IN") == 0)
320 g_string_append_printf (status_text, " LOGGED-IN=%s", lightdm_user_get_logged_in (user) ? "TRUE" : "FALSE");
321 else if (strcmp (fields[i], "HAS-MESSAGES") == 0)
322 g_string_append_printf (status_text, " HAS-MESSAGES=%s", lightdm_user_get_has_messages (user) ? "TRUE" : "FALSE");
325 g_free (layouts_text);
327 status_notify (status_text->str);
328 g_string_free (status_text, TRUE);
331 if (strcmp (name, "LOG-USER-LIST") == 0)
335 users = lightdm_user_list_get_users (lightdm_user_list_get_instance ());
336 for (link = users; link; link = link->next)
338 LightDMUser *user = link->data;
339 status_notify ("%s LOG-USER USERNAME=%s", greeter_id, lightdm_user_get_name (user));
343 if (strcmp (name, "GET-CAN-SUSPEND") == 0)
345 gboolean can_suspend = lightdm_get_can_suspend ();
346 status_notify ("%s CAN-SUSPEND ALLOWED=%s", greeter_id, can_suspend ? "TRUE" : "FALSE");
349 if (strcmp (name, "SUSPEND") == 0)
351 GError *error = NULL;
352 if (!lightdm_suspend (&error))
353 status_notify ("%s FAIL-SUSPEND", greeter_id);
354 g_clear_error (&error);
357 if (strcmp (name, "GET-CAN-HIBERNATE") == 0)
359 gboolean can_hibernate = lightdm_get_can_hibernate ();
360 status_notify ("%s CAN-HIBERNATE ALLOWED=%s", greeter_id, can_hibernate ? "TRUE" : "FALSE");
363 if (strcmp (name, "HIBERNATE") == 0)
365 GError *error = NULL;
366 if (!lightdm_hibernate (&error))
367 status_notify ("%s FAIL-HIBERNATE", greeter_id);
368 g_clear_error (&error);
371 if (strcmp (name, "GET-CAN-RESTART") == 0)
373 gboolean can_restart = lightdm_get_can_restart ();
374 status_notify ("%s CAN-RESTART ALLOWED=%s", greeter_id, can_restart ? "TRUE" : "FALSE");
377 if (strcmp (name, "RESTART") == 0)
379 GError *error = NULL;
380 if (!lightdm_restart (&error))
381 status_notify ("%s FAIL-RESTART", greeter_id);
382 g_clear_error (&error);
385 if (strcmp (name, "GET-CAN-SHUTDOWN") == 0)
387 gboolean can_shutdown = lightdm_get_can_shutdown ();
388 status_notify ("%s CAN-SHUTDOWN ALLOWED=%s", greeter_id, can_shutdown ? "TRUE" : "FALSE");
391 if (strcmp (name, "SHUTDOWN") == 0)
393 GError *error = NULL;
394 if (!lightdm_shutdown (&error))
395 status_notify ("%s FAIL-SHUTDOWN", greeter_id);
396 g_clear_error (&error);
400 g_hash_table_unref (params);
404 user_added_cb (LightDMUserList *user_list, LightDMUser *user)
406 status_notify ("%s USER-ADDED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
410 user_removed_cb (LightDMUserList *user_list, LightDMUser *user)
412 status_notify ("%s USER-REMOVED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
416 main (int argc, char **argv)
418 gchar *display, *xdg_seat, *xdg_vtnr, *xdg_session_cookie, *xdg_session_class, *mir_socket, *mir_vt, *mir_id;
419 GString *status_text;
421 #if !defined(GLIB_VERSION_2_36)
425 display = getenv ("DISPLAY");
426 xdg_seat = getenv ("XDG_SEAT");
427 xdg_vtnr = getenv ("XDG_VTNR");
428 xdg_session_cookie = getenv ("XDG_SESSION_COOKIE");
429 xdg_session_class = getenv ("XDG_SESSION_CLASS");
430 mir_socket = getenv ("MIR_SOCKET");
431 mir_vt = getenv ("MIR_SERVER_VT");
432 mir_id = getenv ("MIR_SERVER_NAME");
435 if (display[0] == ':')
436 greeter_id = g_strdup_printf ("GREETER-X-%s", display + 1);
438 greeter_id = g_strdup_printf ("GREETER-X-%s", display);
441 greeter_id = g_strdup_printf ("GREETER-MIR-%s", mir_id);
442 else if (mir_socket || mir_vt)
443 greeter_id = g_strdup ("GREETER-MIR");
445 greeter_id = g_strdup ("GREETER-?");
447 loop = g_main_loop_new (NULL, FALSE);
449 g_unix_signal_add (SIGINT, sigint_cb, NULL);
450 g_unix_signal_add (SIGTERM, sigterm_cb, NULL);
452 status_connect (request_cb);
454 status_text = g_string_new ("");
455 g_string_printf (status_text, "%s START", greeter_id);
457 g_string_append_printf (status_text, " XDG_SEAT=%s", xdg_seat);
459 g_string_append_printf (status_text, " XDG_VTNR=%s", xdg_vtnr);
460 if (xdg_session_cookie)
461 g_string_append_printf (status_text, " XDG_SESSION_COOKIE=%s", xdg_session_cookie);
462 if (xdg_session_class)
463 g_string_append_printf (status_text, " XDG_SESSION_CLASS=%s", xdg_session_class);
465 g_string_append_printf (status_text, " MIR_SERVER_VT=%s", mir_vt);
466 status_notify (status_text->str);
467 g_string_free (status_text, TRUE);
469 config = g_key_file_new ();
470 g_key_file_load_from_file (config, g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), G_KEY_FILE_NONE, NULL);
472 if (g_key_file_has_key (config, "test-greeter-config", "return-value", NULL))
474 int return_value = g_key_file_get_integer (config, "test-greeter-config", "return-value", NULL);
475 status_notify ("%s EXIT CODE=%d", greeter_id, return_value);
481 connection = xcb_connect (NULL, NULL);
482 if (xcb_connection_has_error (connection))
484 status_notify ("%s FAIL-CONNECT-XSERVER", greeter_id);
487 status_notify ("%s CONNECT-XSERVER", greeter_id);
490 greeter = lightdm_greeter_new ();
491 g_signal_connect (greeter, "show-message", G_CALLBACK (show_message_cb), NULL);
492 g_signal_connect (greeter, "show-prompt", G_CALLBACK (show_prompt_cb), NULL);
493 g_signal_connect (greeter, "authentication-complete", G_CALLBACK (authentication_complete_cb), NULL);
494 g_signal_connect (greeter, "autologin-timer-expired", G_CALLBACK (autologin_timer_expired_cb), NULL);
496 if (g_key_file_get_boolean (config, "test-greeter-config", "log-user-changes", NULL))
498 g_signal_connect (lightdm_user_list_get_instance (), "user-added", G_CALLBACK (user_added_cb), NULL);
499 g_signal_connect (lightdm_user_list_get_instance (), "user-removed", G_CALLBACK (user_removed_cb), NULL);
502 status_notify ("%s CONNECT-TO-DAEMON", greeter_id);
503 if (!lightdm_greeter_connect_sync (greeter, NULL))
505 status_notify ("%s FAIL-CONNECT-DAEMON", greeter_id);
509 status_notify ("%s CONNECTED-TO-DAEMON", greeter_id);
511 if (lightdm_greeter_get_select_user_hint (greeter))
512 status_notify ("%s SELECT-USER-HINT USERNAME=%s", greeter_id, lightdm_greeter_get_select_user_hint (greeter));
513 if (lightdm_greeter_get_select_guest_hint (greeter))
514 status_notify ("%s SELECT-GUEST-HINT", greeter_id);
515 if (lightdm_greeter_get_lock_hint (greeter))
516 status_notify ("%s LOCK-HINT", greeter_id);
517 if (!lightdm_greeter_get_has_guest_account_hint (greeter))
518 status_notify ("%s HAS-GUEST-ACCOUNT-HINT=FALSE", greeter_id);
519 if (lightdm_greeter_get_hide_users_hint (greeter))
520 status_notify ("%s HIDE-USERS-HINT", greeter_id);
521 if (lightdm_greeter_get_show_manual_login_hint (greeter))
522 status_notify ("%s SHOW-MANUAL-LOGIN-HINT", greeter_id);
523 if (!lightdm_greeter_get_show_remote_login_hint (greeter))
524 status_notify ("%s SHOW-REMOTE-LOGIN-HINT=FALSE", greeter_id);
526 g_main_loop_run (loop);