]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - tests/src/test-gobject-greeter.c
Merge with trunk
[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
9 #include "status.h"
10
11 static gchar *greeter_id;
12 static GMainLoop *loop;
13 static LightDMGreeter *greeter;
14 static xcb_connection_t *connection = NULL;
15 static GKeyFile *config;
16
17 static void
18 show_message_cb (LightDMGreeter *greeter, const gchar *text, LightDMMessageType type)
19 {
20     status_notify ("%s SHOW-MESSAGE TEXT=\"%s\"", greeter_id, text);
21 }
22
23 static void
24 show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type)
25 {
26     status_notify ("%s SHOW-PROMPT TEXT=\"%s\"", greeter_id, text);
27 }
28
29 static void
30 authentication_complete_cb (LightDMGreeter *greeter)
31 {
32     if (lightdm_greeter_get_authentication_user (greeter))
33         status_notify ("%s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s",
34                        greeter_id,
35                        lightdm_greeter_get_authentication_user (greeter),
36                        lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
37     else
38         status_notify ("%s AUTHENTICATION-COMPLETE AUTHENTICATED=%s",
39                        greeter_id,
40                        lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
41 }
42
43 static void
44 autologin_timer_expired_cb (LightDMGreeter *greeter)
45 {
46     status_notify ("%s AUTOLOGIN-TIMER-EXPIRED", greeter_id);
47 }
48
49 static void
50 signal_cb (int signum)
51 {
52     status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, signum);
53     exit (EXIT_SUCCESS);
54 }
55
56 static void
57 request_cb (const gchar *request)
58 {
59     gchar *r;
60
61     if (!request)
62     {
63         g_main_loop_quit (loop);
64         return;
65     }
66   
67     r = g_strdup_printf ("%s AUTHENTICATE", greeter_id);
68     if (strcmp (request, r) == 0)
69         lightdm_greeter_authenticate (greeter, NULL);
70     g_free (r);
71
72     r = g_strdup_printf ("%s AUTHENTICATE USERNAME=", greeter_id);
73     if (g_str_has_prefix (request, r))
74         lightdm_greeter_authenticate (greeter, request + strlen (r));
75     g_free (r);
76
77     r = g_strdup_printf ("%s AUTHENTICATE-GUEST", greeter_id);
78     if (strcmp (request, r) == 0)
79         lightdm_greeter_authenticate_as_guest (greeter);
80     g_free (r);
81
82     r = g_strdup_printf ("%s AUTHENTICATE-AUTOLOGIN", greeter_id);
83     if (strcmp (request, r) == 0)
84         lightdm_greeter_authenticate_autologin (greeter);
85     g_free (r);
86
87     r = g_strdup_printf ("%s AUTHENTICATE-REMOTE SESSION=", greeter_id);
88     if (g_str_has_prefix (request, r))
89         lightdm_greeter_authenticate_remote (greeter, request + strlen (r), NULL);
90     g_free (r);
91
92     r = g_strdup_printf ("%s RESPOND TEXT=\"", greeter_id);
93     if (g_str_has_prefix (request, r))
94     {
95         gchar *text = g_strdup (request + strlen (r));
96         text[strlen (text) - 1] = '\0';
97         lightdm_greeter_respond (greeter, text);
98         g_free (text);
99     }
100     g_free (r);
101
102     r = g_strdup_printf ("%s CANCEL-AUTHENTICATION", greeter_id);
103     if (strcmp (request, r) == 0)
104         lightdm_greeter_cancel_authentication (greeter);
105     g_free (r);
106
107     r = g_strdup_printf ("%s START-SESSION", greeter_id);
108     if (strcmp (request, r) == 0)
109     {
110         if (!lightdm_greeter_start_session_sync (greeter, NULL, NULL))
111             status_notify ("%s SESSION-FAILED", greeter_id); 
112     }
113     g_free (r);
114
115     r = g_strdup_printf ("%s START-SESSION SESSION=", greeter_id);
116     if (g_str_has_prefix (request, r))
117     {
118         if (!lightdm_greeter_start_session_sync (greeter, request + strlen (r), NULL))
119             status_notify ("%s SESSION-FAILED", greeter_id); 
120     }
121     g_free (r);
122
123     r = g_strdup_printf ("%s LOG-USER-LIST-LENGTH", greeter_id);
124     if (strcmp (request, r) == 0)
125         status_notify ("%s LOG-USER-LIST-LENGTH N=%d", greeter_id, lightdm_user_list_get_length (lightdm_user_list_get_instance ()));
126     g_free (r);
127
128     r = g_strdup_printf ("%s LOG-USER USERNAME=", greeter_id);
129     if (g_str_has_prefix (request, r))
130     {
131         LightDMUser *user;
132         const gchar *username;
133
134         username = request + strlen (r);
135         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
136         status_notify ("%s LOG-USER USERNAME=%s", greeter_id, lightdm_user_get_name (user));
137     }
138     g_free (r);
139
140     r = g_strdup_printf ("%s LOG-USER-LIST", greeter_id);
141     if (strcmp (request, r) == 0)
142     {
143         GList *users, *link;
144
145         users = lightdm_user_list_get_users (lightdm_user_list_get_instance ());
146         for (link = users; link; link = link->next)
147         {
148             LightDMUser *user = link->data;
149             status_notify ("%s LOG-USER USERNAME=%s", greeter_id, lightdm_user_get_name (user));
150         }
151     }
152     g_free (r);
153
154     r = g_strdup_printf ("%s LOG-LAYOUT USERNAME=", greeter_id);
155     if (g_str_has_prefix (request, r))
156     {
157         LightDMUser *user;
158         const gchar *username, *layout;
159
160         username = request + strlen (r);
161         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
162         layout = lightdm_user_get_layout (user);
163
164         status_notify ("%s LOG-LAYOUT USERNAME=%s LAYOUT='%s'", greeter_id, username, layout ? layout : "");
165     }
166     g_free (r);
167
168     r = g_strdup_printf ("%s LOG-LAYOUTS USERNAME=", greeter_id);
169     if (g_str_has_prefix (request, r))
170     {
171         LightDMUser *user;
172         const gchar *username;
173         const gchar * const *layouts;
174         int i;
175
176         username = request + strlen (r);
177         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
178         layouts = lightdm_user_get_layouts (user);
179
180         for (i = 0; layouts[i]; i++)
181             status_notify ("%s LOG-LAYOUTS USERNAME=%s LAYOUT='%s'", greeter_id, username, layouts[i]);
182     }
183     g_free (r);
184
185     r = g_strdup_printf ("%s LOG-LANGUAGE USERNAME=", greeter_id);  
186     if (g_str_has_prefix (request, r))
187     {
188         LightDMUser *user;
189         const gchar *username, *language;
190
191         username = request + strlen (r);
192         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
193         language = lightdm_user_get_language (user);
194
195         status_notify ("%s LOG-LANGUAGE USERNAME=%s LANGUAGE=%s", greeter_id, username, language ? language : "");
196     }
197     g_free (r);
198
199     r = g_strdup_printf ("%s GET-CAN-SUSPEND", greeter_id);
200     if (strcmp (request, r) == 0)
201     {
202         gboolean can_suspend = lightdm_get_can_suspend ();
203         status_notify ("%s CAN-SUSPEND ALLOWED=%s", greeter_id, can_suspend ? "TRUE" : "FALSE");
204     }
205     g_free (r);
206
207     r = g_strdup_printf ("%s SUSPEND", greeter_id);
208     if (strcmp (request, r) == 0)
209     {
210         GError *error = NULL;
211         if (!lightdm_suspend (&error))
212             status_notify ("%s FAIL-SUSPEND", greeter_id);
213         g_clear_error (&error);
214     }
215     g_free (r);
216
217     r = g_strdup_printf ("%s GET-CAN-HIBERNATE", greeter_id);
218     if (strcmp (request, r) == 0)
219     {
220         gboolean can_hibernate = lightdm_get_can_hibernate ();
221         status_notify ("%s CAN-HIBERNATE ALLOWED=%s", greeter_id, can_hibernate ? "TRUE" : "FALSE");
222     }
223     g_free (r);
224
225     r = g_strdup_printf ("%s HIBERNATE", greeter_id);
226     if (strcmp (request, r) == 0)
227     {
228         GError *error = NULL;
229         if (!lightdm_hibernate (&error))
230             status_notify ("%s FAIL-HIBERNATE", greeter_id);
231         g_clear_error (&error);
232     }
233     g_free (r);
234
235     r = g_strdup_printf ("%s GET-CAN-RESTART", greeter_id);
236     if (strcmp (request, r) == 0)
237     {
238         gboolean can_restart = lightdm_get_can_restart ();
239         status_notify ("%s CAN-RESTART ALLOWED=%s", greeter_id, can_restart ? "TRUE" : "FALSE");
240     }
241     g_free (r);
242
243     r = g_strdup_printf ("%s RESTART", greeter_id);
244     if (strcmp (request, r) == 0)
245     {
246         GError *error = NULL;
247         if (!lightdm_restart (&error))
248             status_notify ("%s FAIL-RESTART", greeter_id);
249         g_clear_error (&error);
250     }
251     g_free (r);
252
253     r = g_strdup_printf ("%s GET-CAN-SHUTDOWN", greeter_id);
254     if (strcmp (request, r) == 0)
255     {
256         gboolean can_shutdown = lightdm_get_can_shutdown ();
257         status_notify ("%s CAN-SHUTDOWN ALLOWED=%s", greeter_id, can_shutdown ? "TRUE" : "FALSE");
258     }
259     g_free (r);
260
261     r = g_strdup_printf ("%s SHUTDOWN", greeter_id);
262     if (strcmp (request, r) == 0)
263     {
264         GError *error = NULL;
265         if (!lightdm_shutdown (&error))
266             status_notify ("%s FAIL-SHUTDOWN", greeter_id);
267         g_clear_error (&error);
268     }
269     g_free (r);
270 }
271
272 static void
273 user_added_cb (LightDMUserList *user_list, LightDMUser *user)
274 {
275     status_notify ("%s USER-ADDED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
276 }
277
278 static void
279 user_removed_cb (LightDMUserList *user_list, LightDMUser *user)
280 {
281     status_notify ("%s USER-REMOVED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
282 }
283
284 int
285 main (int argc, char **argv)
286 {
287     gchar *display;
288
289     signal (SIGINT, signal_cb);
290     signal (SIGTERM, signal_cb);
291
292 #if !defined(GLIB_VERSION_2_36)
293     g_type_init ();
294 #endif
295
296     display = getenv ("DISPLAY");
297     if (display == NULL)
298         greeter_id = g_strdup ("GREETER-?");
299     else if (display[0] == ':')
300         greeter_id = g_strdup_printf ("GREETER-X-%s", display + 1);
301     else
302         greeter_id = g_strdup_printf ("GREETER-X-%s", display);
303
304     loop = g_main_loop_new (NULL, FALSE);
305
306     status_connect (request_cb);
307
308     status_notify ("%s START", greeter_id);
309
310     config = g_key_file_new ();
311     g_key_file_load_from_file (config, g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), G_KEY_FILE_NONE, NULL);
312
313     if (g_key_file_has_key (config, "test-greeter-config", "return-value", NULL))
314     {
315         int return_value = g_key_file_get_integer (config, "test-greeter-config", "return-value", NULL);
316         status_notify ("%s EXIT CODE=%d", greeter_id, return_value);
317         return return_value;
318     }
319
320     connection = xcb_connect (NULL, NULL);
321
322     if (xcb_connection_has_error (connection))
323     {
324         status_notify ("%s FAIL-CONNECT-XSERVER", greeter_id);
325         return EXIT_FAILURE;
326     }
327
328     status_notify ("%s CONNECT-XSERVER", greeter_id);
329
330     greeter = lightdm_greeter_new ();
331     g_signal_connect (greeter, "show-message", G_CALLBACK (show_message_cb), NULL);
332     g_signal_connect (greeter, "show-prompt", G_CALLBACK (show_prompt_cb), NULL);
333     g_signal_connect (greeter, "authentication-complete", G_CALLBACK (authentication_complete_cb), NULL);
334     g_signal_connect (greeter, "autologin-timer-expired", G_CALLBACK (autologin_timer_expired_cb), NULL);
335
336     if (g_key_file_get_boolean (config, "test-greeter-config", "log-user-changes", NULL))
337     {
338         g_signal_connect (lightdm_user_list_get_instance (), "user-added", G_CALLBACK (user_added_cb), NULL);
339         g_signal_connect (lightdm_user_list_get_instance (), "user-removed", G_CALLBACK (user_removed_cb), NULL);
340     }
341
342     status_notify ("%s CONNECT-TO-DAEMON", greeter_id);
343     if (!lightdm_greeter_connect_sync (greeter, NULL))
344     {
345         status_notify ("%s FAIL-CONNECT-DAEMON", greeter_id);
346         return EXIT_FAILURE;
347     }
348
349     status_notify ("%s CONNECTED-TO-DAEMON", greeter_id);
350
351     if (lightdm_greeter_get_select_user_hint (greeter))
352         status_notify ("%s SELECT-USER-HINT USERNAME=%s", greeter_id, lightdm_greeter_get_select_user_hint (greeter));
353     if (lightdm_greeter_get_select_guest_hint (greeter))
354         status_notify ("%s SELECT-GUEST-HINT", greeter_id);
355     if (lightdm_greeter_get_lock_hint (greeter))
356         status_notify ("%s LOCK-HINT", greeter_id);
357
358     g_main_loop_run (loop);
359
360     return EXIT_SUCCESS;
361 }