]> 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 GMainLoop *loop;
12 static LightDMGreeter *greeter;
13 static xcb_connection_t *connection = NULL;
14 static GKeyFile *config;
15
16 static void
17 show_message_cb (LightDMGreeter *greeter, const gchar *text, LightDMMessageType type)
18 {
19     status_notify ("GREETER %s SHOW-MESSAGE TEXT=\"%s\"", getenv ("DISPLAY"), text);
20 }
21
22 static void
23 show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type)
24 {
25     status_notify ("GREETER %s SHOW-PROMPT TEXT=\"%s\"", getenv ("DISPLAY"), text);
26 }
27
28 static void
29 authentication_complete_cb (LightDMGreeter *greeter)
30 {
31     if (lightdm_greeter_get_authentication_user (greeter))
32         status_notify ("GREETER %s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s",
33                        getenv ("DISPLAY"),
34                        lightdm_greeter_get_authentication_user (greeter),
35                        lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
36     else
37         status_notify ("GREETER %s AUTHENTICATION-COMPLETE AUTHENTICATED=%s",
38                        getenv ("DISPLAY"),
39                        lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
40 }
41
42 static void
43 autologin_timer_expired_cb (LightDMGreeter *greeter)
44 {
45     status_notify ("GREETER %s AUTOLOGIN-TIMER-EXPIRED", getenv ("DISPLAY"));
46 }
47
48 static void
49 signal_cb (int signum)
50 {
51     status_notify ("GREETER %s TERMINATE SIGNAL=%d", getenv ("DISPLAY"), signum);
52     exit (EXIT_SUCCESS);
53 }
54
55 static void
56 request_cb (const gchar *request)
57 {
58     gchar *r;
59
60     if (!request)
61     {
62         g_main_loop_quit (loop);
63         return;
64     }
65   
66     r = g_strdup_printf ("GREETER %s AUTHENTICATE", getenv ("DISPLAY"));
67     if (strcmp (request, r) == 0)
68         lightdm_greeter_authenticate (greeter, NULL);
69     g_free (r);
70
71     r = g_strdup_printf ("GREETER %s AUTHENTICATE USERNAME=", getenv ("DISPLAY"));
72     if (g_str_has_prefix (request, r))
73         lightdm_greeter_authenticate (greeter, request + strlen (r));
74     g_free (r);
75
76     r = g_strdup_printf ("GREETER %s AUTHENTICATE-GUEST", getenv ("DISPLAY"));
77     if (strcmp (request, r) == 0)
78         lightdm_greeter_authenticate_as_guest (greeter);
79     g_free (r);
80
81     r = g_strdup_printf ("GREETER %s AUTHENTICATE-AUTOLOGIN", getenv ("DISPLAY"));
82     if (strcmp (request, r) == 0)
83         lightdm_greeter_authenticate_autologin (greeter);
84     g_free (r);
85
86     r = g_strdup_printf ("GREETER %s AUTHENTICATE-REMOTE SESSION=", getenv ("DISPLAY"));
87     if (g_str_has_prefix (request, r))
88         lightdm_greeter_authenticate_remote (greeter, request + strlen (r), NULL);
89     g_free (r);
90
91     r = g_strdup_printf ("GREETER %s RESPOND TEXT=\"", getenv ("DISPLAY"));
92     if (g_str_has_prefix (request, r))
93     {
94         gchar *text = g_strdup (request + strlen (r));
95         text[strlen (text) - 1] = '\0';
96         lightdm_greeter_respond (greeter, text);
97         g_free (text);
98     }
99     g_free (r);
100
101     r = g_strdup_printf ("GREETER %s CANCEL-AUTHENTICATION", getenv ("DISPLAY"));
102     if (strcmp (request, r) == 0)
103         lightdm_greeter_cancel_authentication (greeter);
104     g_free (r);
105
106     r = g_strdup_printf ("GREETER %s START-SESSION", getenv ("DISPLAY"));
107     if (strcmp (request, r) == 0)
108     {
109         if (!lightdm_greeter_start_session_sync (greeter, NULL, NULL))
110             status_notify ("GREETER %s SESSION-FAILED", getenv ("DISPLAY")); 
111     }
112     g_free (r);
113
114     r = g_strdup_printf ("GREETER %s START-SESSION SESSION=", getenv ("DISPLAY"));
115     if (g_str_has_prefix (request, r))
116     {
117         if (!lightdm_greeter_start_session_sync (greeter, request + strlen (r), NULL))
118             status_notify ("GREETER %s SESSION-FAILED", getenv ("DISPLAY")); 
119     }
120     g_free (r);
121
122     r = g_strdup_printf ("GREETER %s LOG-LAYOUT", getenv ("DISPLAY"));
123     if (strcmp (request, r) == 0)
124     {
125         const gchar *layout;
126         layout = lightdm_layout_get_name (lightdm_get_layout ());
127         status_notify ("GREETER %s LOG-LAYOUT LAYOUT='%s'", getenv ("DISPLAY"), layout ? layout : "");
128     }
129
130     r = g_strdup_printf ("GREETER %s LOG-LAYOUT USERNAME=", getenv ("DISPLAY"));
131     if (g_str_has_prefix (request, r))
132     {
133         LightDMUser *user;
134         const gchar *username, *layout;
135
136         username = request + strlen (r);
137         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
138         layout = lightdm_user_get_layout (user);
139
140         status_notify ("GREETER %s LOG-LAYOUT USERNAME=%s LAYOUT='%s'", getenv ("DISPLAY"), username, layout ? layout : "");
141     }
142     g_free (r);
143
144     r = g_strdup_printf ("GREETER %s LOG-LAYOUTS USERNAME=", getenv ("DISPLAY"));
145     if (g_str_has_prefix (request, r))
146     {
147         LightDMUser *user;
148         const gchar *username;
149         const gchar * const *layouts;
150         int i;
151
152         username = request + strlen (r);
153         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
154         layouts = lightdm_user_get_layouts (user);
155
156         for (i = 0; layouts[i]; i++)
157             status_notify ("GREETER %s LOG-LAYOUTS USERNAME=%s LAYOUT='%s'", getenv ("DISPLAY"), username, layouts[i]);
158     }
159     g_free (r);
160
161     r = g_strdup_printf ("GREETER %s LOG-VARIANTS LAYOUT=", getenv ("DISPLAY"));
162     if (g_str_has_prefix (request, r))
163     {
164         GList *layouts, *iter;
165         const gchar *layout_prefix;
166
167         layout_prefix = request + strlen (r);
168         layouts = lightdm_get_layouts ();
169
170         for (iter = layouts; iter; iter = iter->next)
171         {
172             LightDMLayout *layout;
173             const gchar *name;
174
175             layout = (LightDMLayout *) iter->data;
176             name = lightdm_layout_get_name (layout);
177
178             if (g_str_has_prefix (name, layout_prefix))
179                 status_notify ("GREETER %s LOG-VARIANTS LAYOUT='%s'", getenv ("DISPLAY"), name);
180         }
181     }
182     g_free (r);
183
184     r = g_strdup_printf ("GREETER %s LOG-LANGUAGE USERNAME=", getenv ("DISPLAY"));  
185     if (g_str_has_prefix (request, r))
186     {
187         LightDMUser *user;
188         const gchar *username, *language;
189
190         username = request + strlen (r);
191         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
192         language = lightdm_user_get_language (user);
193
194         status_notify ("GREETER %s LOG-LANGUAGE USERNAME=%s LANGUAGE=%s", getenv ("DISPLAY"), username, language ? language : "");
195     }
196     g_free (r);
197 }
198
199 int
200 main (int argc, char **argv)
201 {
202     signal (SIGINT, signal_cb);
203     signal (SIGTERM, signal_cb);
204
205 #if !defined(GLIB_VERSION_2_36)
206     g_type_init ();
207 #endif
208
209     loop = g_main_loop_new (NULL, FALSE);
210
211     status_connect (request_cb);
212
213     status_notify ("GREETER %s START", getenv ("DISPLAY"));
214
215     config = g_key_file_new ();
216     g_key_file_load_from_file (config, g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), G_KEY_FILE_NONE, NULL);
217
218     if (g_key_file_has_key (config, "test-greeter-config", "return-value", NULL))
219     {
220         int return_value = g_key_file_get_integer (config, "test-greeter-config", "return-value", NULL);
221         status_notify ("GREETER %s EXIT CODE=%d", getenv ("DISPLAY"), return_value);
222         return return_value;
223     }
224
225     connection = xcb_connect (NULL, NULL);
226
227     if (xcb_connection_has_error (connection))
228     {
229         status_notify ("GREETER %s FAIL-CONNECT-XSERVER", getenv ("DISPLAY"));
230         return EXIT_FAILURE;
231     }
232
233     status_notify ("GREETER %s CONNECT-XSERVER", getenv ("DISPLAY"));
234
235     greeter = lightdm_greeter_new ();
236     g_signal_connect (greeter, "show-message", G_CALLBACK (show_message_cb), NULL);
237     g_signal_connect (greeter, "show-prompt", G_CALLBACK (show_prompt_cb), NULL);
238     g_signal_connect (greeter, "authentication-complete", G_CALLBACK (authentication_complete_cb), NULL);
239     g_signal_connect (greeter, "autologin-timer-expired", G_CALLBACK (autologin_timer_expired_cb), NULL);
240
241     status_notify ("GREETER %s CONNECT-TO-DAEMON", getenv ("DISPLAY"));
242     if (!lightdm_greeter_connect_sync (greeter, NULL))
243     {
244         status_notify ("GREETER %s FAIL-CONNECT-DAEMON", getenv ("DISPLAY"));
245         return EXIT_FAILURE;
246     }
247
248     status_notify ("GREETER %s CONNECTED-TO-DAEMON", getenv ("DISPLAY"));
249
250     if (lightdm_greeter_get_select_user_hint (greeter))
251         status_notify ("GREETER %s SELECT-USER-HINT USERNAME=%s", getenv ("DISPLAY"), lightdm_greeter_get_select_user_hint (greeter));
252     if (lightdm_greeter_get_lock_hint (greeter))
253         status_notify ("GREETER %s LOCK-HINT", getenv ("DISPLAY"));
254
255     g_main_loop_run (loop);
256
257     return EXIT_SUCCESS;
258 }