1 /* -*- Mode: C; indent-tabs-mode: nil; tab-width: 4 -*- */
12 static gchar *greeter_id;
13 static GMainLoop *loop;
14 static LightDMGreeter *greeter;
15 static xcb_connection_t *connection = NULL;
16 static GKeyFile *config;
19 show_message_cb (LightDMGreeter *greeter, const gchar *text, LightDMMessageType type)
21 status_notify ("%s SHOW-MESSAGE TEXT=\"%s\"", greeter_id, text);
25 show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type)
27 status_notify ("%s SHOW-PROMPT TEXT=\"%s\"", greeter_id, text);
31 authentication_complete_cb (LightDMGreeter *greeter)
33 if (lightdm_greeter_get_authentication_user (greeter))
34 status_notify ("%s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s",
36 lightdm_greeter_get_authentication_user (greeter),
37 lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
39 status_notify ("%s AUTHENTICATION-COMPLETE AUTHENTICATED=%s",
41 lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
45 autologin_timer_expired_cb (LightDMGreeter *greeter)
47 status_notify ("%s AUTOLOGIN-TIMER-EXPIRED", greeter_id);
51 sigint_cb (gpointer user_data)
53 status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, SIGINT);
54 g_main_loop_quit (loop);
59 sigterm_cb (gpointer user_data)
61 status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, SIGTERM);
62 g_main_loop_quit (loop);
67 request_cb (const gchar *request)
73 g_main_loop_quit (loop);
77 r = g_strdup_printf ("%s AUTHENTICATE", greeter_id);
78 if (strcmp (request, r) == 0)
79 lightdm_greeter_authenticate (greeter, NULL);
82 r = g_strdup_printf ("%s AUTHENTICATE USERNAME=", greeter_id);
83 if (g_str_has_prefix (request, r))
84 lightdm_greeter_authenticate (greeter, request + strlen (r));
87 r = g_strdup_printf ("%s AUTHENTICATE-GUEST", greeter_id);
88 if (strcmp (request, r) == 0)
89 lightdm_greeter_authenticate_as_guest (greeter);
92 r = g_strdup_printf ("%s AUTHENTICATE-AUTOLOGIN", greeter_id);
93 if (strcmp (request, r) == 0)
94 lightdm_greeter_authenticate_autologin (greeter);
97 r = g_strdup_printf ("%s AUTHENTICATE-REMOTE SESSION=", greeter_id);
98 if (g_str_has_prefix (request, r))
99 lightdm_greeter_authenticate_remote (greeter, request + strlen (r), NULL);
102 r = g_strdup_printf ("%s RESPOND TEXT=\"", greeter_id);
103 if (g_str_has_prefix (request, r))
105 gchar *text = g_strdup (request + strlen (r));
106 text[strlen (text) - 1] = '\0';
107 lightdm_greeter_respond (greeter, text);
112 r = g_strdup_printf ("%s CANCEL-AUTHENTICATION", greeter_id);
113 if (strcmp (request, r) == 0)
114 lightdm_greeter_cancel_authentication (greeter);
117 r = g_strdup_printf ("%s START-SESSION", greeter_id);
118 if (strcmp (request, r) == 0)
120 if (!lightdm_greeter_start_session_sync (greeter, NULL, NULL))
121 status_notify ("%s SESSION-FAILED", greeter_id);
125 r = g_strdup_printf ("%s START-SESSION SESSION=", greeter_id);
126 if (g_str_has_prefix (request, r))
128 if (!lightdm_greeter_start_session_sync (greeter, request + strlen (r), NULL))
129 status_notify ("%s SESSION-FAILED", greeter_id);
133 r = g_strdup_printf ("%s LOG-DEFAULT-SESSION", greeter_id);
134 if (strcmp (request, r) == 0)
135 status_notify ("%s LOG-DEFAULT-SESSION SESSION=%s", greeter_id, lightdm_greeter_get_default_session_hint (greeter));
138 r = g_strdup_printf ("%s LOG-USER-LIST-LENGTH", greeter_id);
139 if (strcmp (request, r) == 0)
140 status_notify ("%s LOG-USER-LIST-LENGTH N=%d", greeter_id, lightdm_user_list_get_length (lightdm_user_list_get_instance ()));
143 r = g_strdup_printf ("%s LOG-USER USERNAME=", greeter_id);
144 if (g_str_has_prefix (request, r))
147 const gchar *username;
149 username = request + strlen (r);
150 user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
151 status_notify ("%s LOG-USER USERNAME=%s", greeter_id, lightdm_user_get_name (user));
155 r = g_strdup_printf ("%s LOG-USER-LIST", greeter_id);
156 if (strcmp (request, r) == 0)
160 users = lightdm_user_list_get_users (lightdm_user_list_get_instance ());
161 for (link = users; link; link = link->next)
163 LightDMUser *user = link->data;
164 status_notify ("%s LOG-USER USERNAME=%s", greeter_id, lightdm_user_get_name (user));
169 r = g_strdup_printf ("%s LOG-LAYOUT USERNAME=", greeter_id);
170 if (g_str_has_prefix (request, r))
173 const gchar *username, *layout;
175 username = request + strlen (r);
176 user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
177 layout = lightdm_user_get_layout (user);
179 status_notify ("%s LOG-LAYOUT USERNAME=%s LAYOUT='%s'", greeter_id, username, layout ? layout : "");
183 r = g_strdup_printf ("%s LOG-LAYOUTS USERNAME=", greeter_id);
184 if (g_str_has_prefix (request, r))
187 const gchar *username;
188 const gchar * const *layouts;
191 username = request + strlen (r);
192 user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
193 layouts = lightdm_user_get_layouts (user);
195 for (i = 0; layouts[i]; i++)
196 status_notify ("%s LOG-LAYOUTS USERNAME=%s LAYOUT='%s'", greeter_id, username, layouts[i]);
200 r = g_strdup_printf ("%s LOG-LANGUAGE USERNAME=", greeter_id);
201 if (g_str_has_prefix (request, r))
204 const gchar *username, *language;
206 username = request + strlen (r);
207 user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
208 language = lightdm_user_get_language (user);
210 status_notify ("%s LOG-LANGUAGE USERNAME=%s LANGUAGE=%s", greeter_id, username, language ? language : "");
214 r = g_strdup_printf ("%s GET-CAN-SUSPEND", greeter_id);
215 if (strcmp (request, r) == 0)
217 gboolean can_suspend = lightdm_get_can_suspend ();
218 status_notify ("%s CAN-SUSPEND ALLOWED=%s", greeter_id, can_suspend ? "TRUE" : "FALSE");
222 r = g_strdup_printf ("%s SUSPEND", greeter_id);
223 if (strcmp (request, r) == 0)
225 GError *error = NULL;
226 if (!lightdm_suspend (&error))
227 status_notify ("%s FAIL-SUSPEND", greeter_id);
228 g_clear_error (&error);
232 r = g_strdup_printf ("%s GET-CAN-HIBERNATE", greeter_id);
233 if (strcmp (request, r) == 0)
235 gboolean can_hibernate = lightdm_get_can_hibernate ();
236 status_notify ("%s CAN-HIBERNATE ALLOWED=%s", greeter_id, can_hibernate ? "TRUE" : "FALSE");
240 r = g_strdup_printf ("%s HIBERNATE", greeter_id);
241 if (strcmp (request, r) == 0)
243 GError *error = NULL;
244 if (!lightdm_hibernate (&error))
245 status_notify ("%s FAIL-HIBERNATE", greeter_id);
246 g_clear_error (&error);
250 r = g_strdup_printf ("%s GET-CAN-RESTART", greeter_id);
251 if (strcmp (request, r) == 0)
253 gboolean can_restart = lightdm_get_can_restart ();
254 status_notify ("%s CAN-RESTART ALLOWED=%s", greeter_id, can_restart ? "TRUE" : "FALSE");
258 r = g_strdup_printf ("%s RESTART", greeter_id);
259 if (strcmp (request, r) == 0)
261 GError *error = NULL;
262 if (!lightdm_restart (&error))
263 status_notify ("%s FAIL-RESTART", greeter_id);
264 g_clear_error (&error);
268 r = g_strdup_printf ("%s GET-CAN-SHUTDOWN", greeter_id);
269 if (strcmp (request, r) == 0)
271 gboolean can_shutdown = lightdm_get_can_shutdown ();
272 status_notify ("%s CAN-SHUTDOWN ALLOWED=%s", greeter_id, can_shutdown ? "TRUE" : "FALSE");
276 r = g_strdup_printf ("%s SHUTDOWN", greeter_id);
277 if (strcmp (request, r) == 0)
279 GError *error = NULL;
280 if (!lightdm_shutdown (&error))
281 status_notify ("%s FAIL-SHUTDOWN", greeter_id);
282 g_clear_error (&error);
288 user_added_cb (LightDMUserList *user_list, LightDMUser *user)
290 status_notify ("%s USER-ADDED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
294 user_removed_cb (LightDMUserList *user_list, LightDMUser *user)
296 status_notify ("%s USER-REMOVED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
300 main (int argc, char **argv)
302 gchar *display, *xdg_seat, *xdg_vtnr, *xdg_session_cookie, *mir_socket, *mir_vt, *mir_id;
303 GString *status_text;
305 #if !defined(GLIB_VERSION_2_36)
309 display = getenv ("DISPLAY");
310 xdg_seat = getenv ("XDG_SEAT");
311 xdg_vtnr = getenv ("XDG_VTNR");
312 xdg_session_cookie = getenv ("XDG_SESSION_COOKIE");
313 mir_socket = getenv ("MIR_SOCKET");
314 mir_vt = getenv ("MIR_SERVER_VT");
315 mir_id = getenv ("MIR_SERVER_NAME");
318 if (display[0] == ':')
319 greeter_id = g_strdup_printf ("GREETER-X-%s", display + 1);
321 greeter_id = g_strdup_printf ("GREETER-X-%s", display);
324 greeter_id = g_strdup_printf ("GREETER-MIR-%s", mir_id);
325 else if (mir_socket || mir_vt)
326 greeter_id = g_strdup ("GREETER-MIR");
328 greeter_id = g_strdup ("GREETER-?");
330 loop = g_main_loop_new (NULL, FALSE);
332 g_unix_signal_add (SIGINT, sigint_cb, NULL);
333 g_unix_signal_add (SIGTERM, sigterm_cb, NULL);
335 status_connect (request_cb);
337 status_text = g_string_new ("");
338 g_string_printf (status_text, "%s START", greeter_id);
340 g_string_append_printf (status_text, " XDG_SEAT=%s", xdg_seat);
342 g_string_append_printf (status_text, " XDG_VTNR=%s", xdg_vtnr);
343 if (xdg_session_cookie)
344 g_string_append_printf (status_text, " XDG_SESSION_COOKIE=%s", xdg_session_cookie);
346 g_string_append_printf (status_text, " MIR_SERVER_VT=%s", mir_vt);
347 status_notify (status_text->str);
348 g_string_free (status_text, TRUE);
350 config = g_key_file_new ();
351 g_key_file_load_from_file (config, g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), G_KEY_FILE_NONE, NULL);
353 if (g_key_file_has_key (config, "test-greeter-config", "return-value", NULL))
355 int return_value = g_key_file_get_integer (config, "test-greeter-config", "return-value", NULL);
356 status_notify ("%s EXIT CODE=%d", greeter_id, return_value);
362 connection = xcb_connect (NULL, NULL);
363 if (xcb_connection_has_error (connection))
365 status_notify ("%s FAIL-CONNECT-XSERVER", greeter_id);
368 status_notify ("%s CONNECT-XSERVER", greeter_id);
371 greeter = lightdm_greeter_new ();
372 g_signal_connect (greeter, "show-message", G_CALLBACK (show_message_cb), NULL);
373 g_signal_connect (greeter, "show-prompt", G_CALLBACK (show_prompt_cb), NULL);
374 g_signal_connect (greeter, "authentication-complete", G_CALLBACK (authentication_complete_cb), NULL);
375 g_signal_connect (greeter, "autologin-timer-expired", G_CALLBACK (autologin_timer_expired_cb), NULL);
377 if (g_key_file_get_boolean (config, "test-greeter-config", "log-user-changes", NULL))
379 g_signal_connect (lightdm_user_list_get_instance (), "user-added", G_CALLBACK (user_added_cb), NULL);
380 g_signal_connect (lightdm_user_list_get_instance (), "user-removed", G_CALLBACK (user_removed_cb), NULL);
383 status_notify ("%s CONNECT-TO-DAEMON", greeter_id);
384 if (!lightdm_greeter_connect_sync (greeter, NULL))
386 status_notify ("%s FAIL-CONNECT-DAEMON", greeter_id);
390 status_notify ("%s CONNECTED-TO-DAEMON", greeter_id);
392 if (lightdm_greeter_get_select_user_hint (greeter))
393 status_notify ("%s SELECT-USER-HINT USERNAME=%s", greeter_id, lightdm_greeter_get_select_user_hint (greeter));
394 if (lightdm_greeter_get_select_guest_hint (greeter))
395 status_notify ("%s SELECT-GUEST-HINT", greeter_id);
396 if (lightdm_greeter_get_lock_hint (greeter))
397 status_notify ("%s LOCK-HINT", greeter_id);
398 if (!lightdm_greeter_get_has_guest_account_hint (greeter))
399 status_notify ("%s HAS-GUEST-ACCOUNT-HINT=FALSE", greeter_id);
400 if (lightdm_greeter_get_hide_users_hint (greeter))
401 status_notify ("%s HIDE-USERS-HINT", greeter_id);
402 if (lightdm_greeter_get_show_manual_login_hint (greeter))
403 status_notify ("%s SHOW-MANUAL-LOGIN-HINT", greeter_id);
404 if (!lightdm_greeter_get_show_remote_login_hint (greeter))
405 status_notify ("%s SHOW-REMOTE-LOGIN-HINT=FALSE", greeter_id);
407 g_main_loop_run (loop);