]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - tests/src/test-gobject-greeter.c
Change MIR_ID->MIR_SERVER_NAME in tests
[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
10 #include "status.h"
11
12 static gchar *greeter_id;
13 static GMainLoop *loop;
14 static LightDMGreeter *greeter;
15 static xcb_connection_t *connection = NULL;
16 static GKeyFile *config;
17
18 static void
19 show_message_cb (LightDMGreeter *greeter, const gchar *text, LightDMMessageType type)
20 {
21     status_notify ("%s SHOW-MESSAGE TEXT=\"%s\"", greeter_id, text);
22 }
23
24 static void
25 show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type)
26 {
27     status_notify ("%s SHOW-PROMPT TEXT=\"%s\"", greeter_id, text);
28 }
29
30 static void
31 authentication_complete_cb (LightDMGreeter *greeter)
32 {
33     if (lightdm_greeter_get_authentication_user (greeter))
34         status_notify ("%s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s",
35                        greeter_id,
36                        lightdm_greeter_get_authentication_user (greeter),
37                        lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
38     else
39         status_notify ("%s AUTHENTICATION-COMPLETE AUTHENTICATED=%s",
40                        greeter_id,
41                        lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
42 }
43
44 static void
45 autologin_timer_expired_cb (LightDMGreeter *greeter)
46 {
47     status_notify ("%s AUTOLOGIN-TIMER-EXPIRED", greeter_id);
48 }
49
50 static gboolean
51 sigint_cb (gpointer user_data)
52 {
53     status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, SIGINT);
54     g_main_loop_quit (loop);
55     return TRUE;
56 }
57
58 static gboolean
59 sigterm_cb (gpointer user_data)
60 {
61     status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, SIGTERM);
62     g_main_loop_quit (loop);
63     return TRUE;
64 }
65
66 static void
67 request_cb (const gchar *request)
68 {
69     gchar *r;
70
71     if (!request)
72     {
73         g_main_loop_quit (loop);
74         return;
75     }
76   
77     r = g_strdup_printf ("%s AUTHENTICATE", greeter_id);
78     if (strcmp (request, r) == 0)
79         lightdm_greeter_authenticate (greeter, NULL);
80     g_free (r);
81
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));
85     g_free (r);
86
87     r = g_strdup_printf ("%s AUTHENTICATE-GUEST", greeter_id);
88     if (strcmp (request, r) == 0)
89         lightdm_greeter_authenticate_as_guest (greeter);
90     g_free (r);
91
92     r = g_strdup_printf ("%s AUTHENTICATE-AUTOLOGIN", greeter_id);
93     if (strcmp (request, r) == 0)
94         lightdm_greeter_authenticate_autologin (greeter);
95     g_free (r);
96
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);
100     g_free (r);
101
102     r = g_strdup_printf ("%s RESPOND TEXT=\"", greeter_id);
103     if (g_str_has_prefix (request, r))
104     {
105         gchar *text = g_strdup (request + strlen (r));
106         text[strlen (text) - 1] = '\0';
107         lightdm_greeter_respond (greeter, text);
108         g_free (text);
109     }
110     g_free (r);
111
112     r = g_strdup_printf ("%s CANCEL-AUTHENTICATION", greeter_id);
113     if (strcmp (request, r) == 0)
114         lightdm_greeter_cancel_authentication (greeter);
115     g_free (r);
116
117     r = g_strdup_printf ("%s START-SESSION", greeter_id);
118     if (strcmp (request, r) == 0)
119     {
120         if (!lightdm_greeter_start_session_sync (greeter, NULL, NULL))
121             status_notify ("%s SESSION-FAILED", greeter_id); 
122     }
123     g_free (r);
124
125     r = g_strdup_printf ("%s START-SESSION SESSION=", greeter_id);
126     if (g_str_has_prefix (request, r))
127     {
128         if (!lightdm_greeter_start_session_sync (greeter, request + strlen (r), NULL))
129             status_notify ("%s SESSION-FAILED", greeter_id); 
130     }
131     g_free (r);
132
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));
136     g_free (r);
137
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 ()));
141     g_free (r);
142
143     r = g_strdup_printf ("%s LOG-USER USERNAME=", greeter_id);
144     if (g_str_has_prefix (request, r))
145     {
146         LightDMUser *user;
147         const gchar *username;
148
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));
152     }
153     g_free (r);
154
155     r = g_strdup_printf ("%s LOG-USER-LIST", greeter_id);
156     if (strcmp (request, r) == 0)
157     {
158         GList *users, *link;
159
160         users = lightdm_user_list_get_users (lightdm_user_list_get_instance ());
161         for (link = users; link; link = link->next)
162         {
163             LightDMUser *user = link->data;
164             status_notify ("%s LOG-USER USERNAME=%s", greeter_id, lightdm_user_get_name (user));
165         }
166     }
167     g_free (r);
168
169     r = g_strdup_printf ("%s LOG-LAYOUT USERNAME=", greeter_id);
170     if (g_str_has_prefix (request, r))
171     {
172         LightDMUser *user;
173         const gchar *username, *layout;
174
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);
178
179         status_notify ("%s LOG-LAYOUT USERNAME=%s LAYOUT='%s'", greeter_id, username, layout ? layout : "");
180     }
181     g_free (r);
182
183     r = g_strdup_printf ("%s LOG-LAYOUTS USERNAME=", greeter_id);
184     if (g_str_has_prefix (request, r))
185     {
186         LightDMUser *user;
187         const gchar *username;
188         const gchar * const *layouts;
189         int i;
190
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);
194
195         for (i = 0; layouts[i]; i++)
196             status_notify ("%s LOG-LAYOUTS USERNAME=%s LAYOUT='%s'", greeter_id, username, layouts[i]);
197     }
198     g_free (r);
199
200     r = g_strdup_printf ("%s LOG-LANGUAGE USERNAME=", greeter_id);  
201     if (g_str_has_prefix (request, r))
202     {
203         LightDMUser *user;
204         const gchar *username, *language;
205
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);
209
210         status_notify ("%s LOG-LANGUAGE USERNAME=%s LANGUAGE=%s", greeter_id, username, language ? language : "");
211     }
212     g_free (r);
213
214     r = g_strdup_printf ("%s GET-CAN-SUSPEND", greeter_id);
215     if (strcmp (request, r) == 0)
216     {
217         gboolean can_suspend = lightdm_get_can_suspend ();
218         status_notify ("%s CAN-SUSPEND ALLOWED=%s", greeter_id, can_suspend ? "TRUE" : "FALSE");
219     }
220     g_free (r);
221
222     r = g_strdup_printf ("%s SUSPEND", greeter_id);
223     if (strcmp (request, r) == 0)
224     {
225         GError *error = NULL;
226         if (!lightdm_suspend (&error))
227             status_notify ("%s FAIL-SUSPEND", greeter_id);
228         g_clear_error (&error);
229     }
230     g_free (r);
231
232     r = g_strdup_printf ("%s GET-CAN-HIBERNATE", greeter_id);
233     if (strcmp (request, r) == 0)
234     {
235         gboolean can_hibernate = lightdm_get_can_hibernate ();
236         status_notify ("%s CAN-HIBERNATE ALLOWED=%s", greeter_id, can_hibernate ? "TRUE" : "FALSE");
237     }
238     g_free (r);
239
240     r = g_strdup_printf ("%s HIBERNATE", greeter_id);
241     if (strcmp (request, r) == 0)
242     {
243         GError *error = NULL;
244         if (!lightdm_hibernate (&error))
245             status_notify ("%s FAIL-HIBERNATE", greeter_id);
246         g_clear_error (&error);
247     }
248     g_free (r);
249
250     r = g_strdup_printf ("%s GET-CAN-RESTART", greeter_id);
251     if (strcmp (request, r) == 0)
252     {
253         gboolean can_restart = lightdm_get_can_restart ();
254         status_notify ("%s CAN-RESTART ALLOWED=%s", greeter_id, can_restart ? "TRUE" : "FALSE");
255     }
256     g_free (r);
257
258     r = g_strdup_printf ("%s RESTART", greeter_id);
259     if (strcmp (request, r) == 0)
260     {
261         GError *error = NULL;
262         if (!lightdm_restart (&error))
263             status_notify ("%s FAIL-RESTART", greeter_id);
264         g_clear_error (&error);
265     }
266     g_free (r);
267
268     r = g_strdup_printf ("%s GET-CAN-SHUTDOWN", greeter_id);
269     if (strcmp (request, r) == 0)
270     {
271         gboolean can_shutdown = lightdm_get_can_shutdown ();
272         status_notify ("%s CAN-SHUTDOWN ALLOWED=%s", greeter_id, can_shutdown ? "TRUE" : "FALSE");
273     }
274     g_free (r);
275
276     r = g_strdup_printf ("%s SHUTDOWN", greeter_id);
277     if (strcmp (request, r) == 0)
278     {
279         GError *error = NULL;
280         if (!lightdm_shutdown (&error))
281             status_notify ("%s FAIL-SHUTDOWN", greeter_id);
282         g_clear_error (&error);
283     }
284     g_free (r);
285 }
286
287 static void
288 user_added_cb (LightDMUserList *user_list, LightDMUser *user)
289 {
290     status_notify ("%s USER-ADDED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
291 }
292
293 static void
294 user_removed_cb (LightDMUserList *user_list, LightDMUser *user)
295 {
296     status_notify ("%s USER-REMOVED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
297 }
298
299 int
300 main (int argc, char **argv)
301 {
302     gchar *display, *xdg_seat, *xdg_vtnr, *xdg_session_cookie, *mir_socket, *mir_vt, *mir_id;
303     GString *status_text;
304
305 #if !defined(GLIB_VERSION_2_36)
306     g_type_init ();
307 #endif
308
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");
316     if (display)
317     {
318         if (display[0] == ':')
319             greeter_id = g_strdup_printf ("GREETER-X-%s", display + 1);
320         else
321             greeter_id = g_strdup_printf ("GREETER-X-%s", display);
322     }
323     else if (mir_id)
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");
327     else
328         greeter_id = g_strdup ("GREETER-?");
329
330     loop = g_main_loop_new (NULL, FALSE);
331
332     g_unix_signal_add (SIGINT, sigint_cb, NULL);
333     g_unix_signal_add (SIGTERM, sigterm_cb, NULL);
334
335     status_connect (request_cb);
336
337     status_text = g_string_new ("");
338     g_string_printf (status_text, "%s START", greeter_id);
339     if (xdg_seat)
340         g_string_append_printf (status_text, " XDG_SEAT=%s", xdg_seat);
341     if (xdg_vtnr)
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);
345     if (mir_vt > 0)
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);
349
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);
352
353     if (g_key_file_has_key (config, "test-greeter-config", "return-value", NULL))
354     {
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);
357         return return_value;
358     }
359
360     if (display)
361     {
362         connection = xcb_connect (NULL, NULL);
363         if (xcb_connection_has_error (connection))
364         {
365             status_notify ("%s FAIL-CONNECT-XSERVER", greeter_id);
366             return EXIT_FAILURE;
367         }
368         status_notify ("%s CONNECT-XSERVER", greeter_id);
369     }
370
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);
376
377     if (g_key_file_get_boolean (config, "test-greeter-config", "log-user-changes", NULL))
378     {
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);
381     }
382
383     status_notify ("%s CONNECT-TO-DAEMON", greeter_id);
384     if (!lightdm_greeter_connect_sync (greeter, NULL))
385     {
386         status_notify ("%s FAIL-CONNECT-DAEMON", greeter_id);
387         return EXIT_FAILURE;
388     }
389
390     status_notify ("%s CONNECTED-TO-DAEMON", greeter_id);
391
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);
406
407     g_main_loop_run (loop);
408
409     return EXIT_SUCCESS;
410 }