10 #include <glib-object.h>
12 #include <glib-unix.h>
13 #include <glib/gstdio.h>
14 #include <lightdm/greeter.h>
18 static gchar *session_id;
20 static GMainLoop *loop;
22 static GString *open_fds;
24 static GKeyFile *config;
26 static xcb_connection_t *connection;
28 static LightDMGreeter *greeter = NULL;
31 sigint_cb (gpointer user_data)
33 status_notify ("%s TERMINATE SIGNAL=%d", session_id, SIGINT);
34 g_main_loop_quit (loop);
39 sigterm_cb (gpointer user_data)
41 status_notify ("%s TERMINATE SIGNAL=%d", session_id, SIGTERM);
42 g_main_loop_quit (loop);
47 show_message_cb (LightDMGreeter *greeter, const gchar *text, LightDMMessageType type)
49 status_notify ("%s GREETER-SHOW-MESSAGE TEXT=\"%s\"", session_id, text);
53 show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type)
55 status_notify ("%s GREETER-SHOW-PROMPT TEXT=\"%s\"", session_id, text);
59 authentication_complete_cb (LightDMGreeter *greeter)
61 if (lightdm_greeter_get_authentication_user (greeter))
62 status_notify ("%s GREETER-AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s",
64 lightdm_greeter_get_authentication_user (greeter),
65 lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
67 status_notify ("%s GREETER-AUTHENTICATION-COMPLETE AUTHENTICATED=%s",
69 lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
73 request_cb (const gchar *name, GHashTable *params)
79 g_main_loop_quit (loop);
83 if (strcmp (name, "LOGOUT") == 0)
86 else if (strcmp (name, "CRASH") == 0)
87 kill (getpid (), SIGSEGV);
89 else if (strcmp (name, "LOCK-SEAT") == 0)
91 status_notify ("%s LOCK-SEAT", session_id);
92 g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
93 "org.freedesktop.DisplayManager",
94 getenv ("XDG_SEAT_PATH"),
95 "org.freedesktop.DisplayManager.Seat",
98 G_VARIANT_TYPE ("()"),
99 G_DBUS_CALL_FLAGS_NONE,
105 else if (strcmp (name, "LOCK-SESSION") == 0)
107 status_notify ("%s LOCK-SESSION", session_id);
108 g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
109 "org.freedesktop.DisplayManager",
110 getenv ("XDG_SESSION_PATH"),
111 "org.freedesktop.DisplayManager.Session",
113 g_variant_new ("()"),
114 G_VARIANT_TYPE ("()"),
115 G_DBUS_CALL_FLAGS_NONE,
121 else if (strcmp (name, "LIST-GROUPS") == 0)
127 n_groups = getgroups (0, NULL);
130 g_printerr ("Failed to get groups: %s", strerror (errno));
133 groups = malloc (sizeof (gid_t) * n_groups);
134 n_groups = getgroups (n_groups, groups);
135 group_list = g_string_new ("");
136 for (i = 0; i < n_groups; i++)
141 g_string_append (group_list, ",");
142 group = getgrgid (groups[i]);
144 g_string_append (group_list, group->gr_name);
146 g_string_append_printf (group_list, "%d", groups[i]);
148 status_notify ("%s LIST-GROUPS GROUPS=%s", session_id, group_list->str);
149 g_string_free (group_list, TRUE);
153 else if (strcmp (name, "READ-ENV") == 0)
155 const gchar *name = g_hash_table_lookup (params, "NAME");
156 const gchar *value = g_getenv (name);
157 status_notify ("%s READ-ENV NAME=%s VALUE=%s", session_id, name, value ? value : "");
160 else if (strcmp (name, "WRITE-STDOUT") == 0)
161 g_print ("%s", (const gchar *) g_hash_table_lookup (params, "TEXT"));
163 else if (strcmp (name, "WRITE-STDERR") == 0)
164 g_printerr ("%s", (const gchar *) g_hash_table_lookup (params, "TEXT"));
166 else if (strcmp (name, "READ") == 0)
168 const gchar *name = g_hash_table_lookup (params, "FILE");
169 gchar *contents = NULL;
170 GError *error = NULL;
172 if (g_file_get_contents (name, &contents, NULL, &error))
173 status_notify ("%s READ FILE=%s TEXT=%s", session_id, name, contents);
175 status_notify ("%s READ FILE=%s ERROR=%s", session_id, name, error->message);
177 g_clear_error (&error);
180 else if (strcmp (name, "LIST-UNKNOWN-FILE-DESCRIPTORS") == 0)
181 status_notify ("%s LIST-UNKNOWN-FILE-DESCRIPTORS FDS=%s", session_id, open_fds->str);
183 else if (strcmp (name, "CHECK-X-AUTHORITY") == 0)
187 GString *mode_string;
189 xauthority = g_strdup (g_getenv ("XAUTHORITY"));
191 xauthority = g_build_filename (g_get_home_dir (), ".Xauthority", NULL);
193 g_stat (xauthority, &file_info);
196 mode_string = g_string_new ("");
197 g_string_append_c (mode_string, file_info.st_mode & S_IRUSR ? 'r' : '-');
198 g_string_append_c (mode_string, file_info.st_mode & S_IWUSR ? 'w' : '-');
199 g_string_append_c (mode_string, file_info.st_mode & S_IXUSR ? 'x' : '-');
200 g_string_append_c (mode_string, file_info.st_mode & S_IRGRP ? 'r' : '-');
201 g_string_append_c (mode_string, file_info.st_mode & S_IWGRP ? 'w' : '-');
202 g_string_append_c (mode_string, file_info.st_mode & S_IXGRP ? 'x' : '-');
203 g_string_append_c (mode_string, file_info.st_mode & S_IROTH ? 'r' : '-');
204 g_string_append_c (mode_string, file_info.st_mode & S_IWOTH ? 'w' : '-');
205 g_string_append_c (mode_string, file_info.st_mode & S_IXOTH ? 'x' : '-');
206 status_notify ("%s CHECK-X-AUTHORITY MODE=%s", session_id, mode_string->str);
207 g_string_free (mode_string, TRUE);
210 else if (strcmp (name, "WRITE-SHARED-DATA") == 0)
212 const gchar *data = g_hash_table_lookup (params, "DATA");
215 dir = getenv ("XDG_GREETER_DATA_DIR");
221 path = g_build_filename (dir, "data", NULL);
222 if (!(f = fopen (path, "w")) || fprintf (f, "%s", data) < 0)
223 status_notify ("%s WRITE-SHARED-DATA ERROR=%s", session_id, strerror (errno));
225 status_notify ("%s WRITE-SHARED-DATA RESULT=TRUE", session_id);
232 status_notify ("%s WRITE-SHARED-DATA ERROR=NO_XDG_GREETER_DATA_DIR", session_id);
235 else if (strcmp (name, "READ-SHARED-DATA") == 0)
239 dir = getenv ("XDG_GREETER_DATA_DIR");
243 gchar *contents = NULL;
244 GError *error = NULL;
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", session_id, contents);
250 status_notify ("%s WRITE-SHARED-DATA ERROR=%s", session_id, error->message);
253 g_clear_error (&error);
256 status_notify ("%s WRITE-SHARED-DATA ERROR=NO_XDG_GREETER_DATA_DIR", session_id);
259 else if (strcmp (name, "GREETER-START") == 0)
261 GError *error = NULL;
263 g_assert (greeter == NULL);
264 greeter = lightdm_greeter_new ();
265 g_signal_connect (greeter, LIGHTDM_GREETER_SIGNAL_SHOW_MESSAGE, G_CALLBACK (show_message_cb), NULL);
266 g_signal_connect (greeter, LIGHTDM_GREETER_SIGNAL_SHOW_PROMPT, G_CALLBACK (show_prompt_cb), NULL);
267 g_signal_connect (greeter, LIGHTDM_GREETER_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (authentication_complete_cb), NULL);
268 if (lightdm_greeter_connect_to_daemon_sync (greeter, &error))
269 status_notify ("%s GREETER-STARTED", session_id);
272 status_notify ("%s GREETER-FAILED ERROR=%s", session_id, error->message);
273 g_clear_error (&error);
277 else if (strcmp (name, "GREETER-AUTHENTICATE") == 0)
279 if (!lightdm_greeter_authenticate (greeter, g_hash_table_lookup (params, "USERNAME"), &error))
281 status_notify ("%s FAIL-AUTHENTICATE ERROR=%s", session_id, error->message);
282 g_clear_error (&error);
286 else if (strcmp (name, "GREETER-RESPOND") == 0)
288 if (!lightdm_greeter_respond (greeter, g_hash_table_lookup (params, "TEXT"), &error))
290 status_notify ("%s FAIL-RESPOND ERROR=%s", session_id, error->message);
291 g_clear_error (&error);
295 else if (strcmp (name, "GREETER-START-SESSION") == 0)
297 if (!lightdm_greeter_start_session_sync (greeter, g_hash_table_lookup (params, "SESSION"), &error))
299 status_notify ("%s FAIL-START-SESSION ERROR=%s", session_id, error->message);
300 g_clear_error (&error);
306 main (int argc, char **argv)
308 gchar *display, *xdg_seat, *xdg_vtnr, *xdg_current_desktop, *xdg_greeter_data_dir, *xdg_session_cookie, *xdg_session_class, *xdg_session_type, *xdg_session_desktop, *mir_server_host_socket, *mir_vt, *mir_id;
309 GString *status_text;
312 display = getenv ("DISPLAY");
313 xdg_seat = getenv ("XDG_SEAT");
314 xdg_vtnr = getenv ("XDG_VTNR");
315 xdg_current_desktop = getenv ("XDG_CURRENT_DESKTOP");
316 xdg_greeter_data_dir = getenv ("XDG_GREETER_DATA_DIR");
317 xdg_session_cookie = getenv ("XDG_SESSION_COOKIE");
318 xdg_session_class = getenv ("XDG_SESSION_CLASS");
319 xdg_session_type = getenv ("XDG_SESSION_TYPE");
320 xdg_session_desktop = getenv ("XDG_SESSION_DESKTOP");
321 mir_server_host_socket = getenv ("MIR_SERVER_HOST_SOCKET");
322 mir_vt = getenv ("MIR_SERVER_VT");
323 mir_id = getenv ("MIR_SERVER_NAME");
326 if (display[0] == ':')
327 session_id = g_strdup_printf ("SESSION-X-%s", display + 1);
329 session_id = g_strdup_printf ("SESSION-X-%s", display);
332 session_id = g_strdup_printf ("SESSION-MIR-%s", mir_id);
333 else if (mir_server_host_socket || mir_vt)
334 session_id = g_strdup ("SESSION-MIR");
335 else if (g_strcmp0 (xdg_session_type, "wayland") == 0)
336 session_id = g_strdup ("SESSION-WAYLAND");
338 session_id = g_strdup ("SESSION-UNKNOWN");
340 open_fds = g_string_new ("");
341 open_max = sysconf (_SC_OPEN_MAX);
342 for (fd = STDERR_FILENO + 1; fd < open_max; fd++)
344 if (fcntl (fd, F_GETFD) >= 0)
345 g_string_append_printf (open_fds, "%d,", fd);
347 if (g_str_has_suffix (open_fds->str, ","))
348 open_fds->str[strlen (open_fds->str) - 1] = '\0';
350 #if !defined(GLIB_VERSION_2_36)
354 loop = g_main_loop_new (NULL, FALSE);
356 g_unix_signal_add (SIGINT, sigint_cb, NULL);
357 g_unix_signal_add (SIGTERM, sigterm_cb, NULL);
359 status_connect (request_cb, session_id);
361 status_text = g_string_new ("");
362 g_string_printf (status_text, "%s START", session_id);
364 g_string_append_printf (status_text, " XDG_SEAT=%s", xdg_seat);
366 g_string_append_printf (status_text, " XDG_VTNR=%s", xdg_vtnr);
367 if (xdg_current_desktop)
368 g_string_append_printf (status_text, " XDG_CURRENT_DESKTOP=%s", xdg_current_desktop);
369 if (xdg_greeter_data_dir)
370 g_string_append_printf (status_text, " XDG_GREETER_DATA_DIR=%s", xdg_greeter_data_dir);
371 if (xdg_session_cookie)
372 g_string_append_printf (status_text, " XDG_SESSION_COOKIE=%s", xdg_session_cookie);
373 if (xdg_session_class)
374 g_string_append_printf (status_text, " XDG_SESSION_CLASS=%s", xdg_session_class);
375 if (xdg_session_type)
376 g_string_append_printf (status_text, " XDG_SESSION_TYPE=%s", xdg_session_type);
377 if (xdg_session_desktop)
378 g_string_append_printf (status_text, " XDG_SESSION_DESKTOP=%s", xdg_session_desktop);
380 g_string_append_printf (status_text, " MIR_SERVER_VT=%s", mir_vt);
382 g_string_append_printf (status_text, " NAME=%s", argv[1]);
383 g_string_append_printf (status_text, " USER=%s", getenv ("USER"));
384 status_notify ("%s", status_text->str);
385 g_string_free (status_text, TRUE);
387 config = g_key_file_new ();
388 g_key_file_load_from_file (config, g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), G_KEY_FILE_NONE, NULL);
392 connection = xcb_connect (NULL, NULL);
393 if (xcb_connection_has_error (connection))
395 status_notify ("%s CONNECT-XSERVER-ERROR", session_id);
398 status_notify ("%s CONNECT-XSERVER", session_id);
401 g_main_loop_run (loop);