]> 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 START-SESSION", getenv ("DISPLAY"));
102     if (strcmp (request, r) == 0)
103     {
104         if (!lightdm_greeter_start_session_sync (greeter, NULL, NULL))
105             status_notify ("GREETER %s SESSION-FAILED", getenv ("DISPLAY")); 
106     }
107     g_free (r);
108
109     r = g_strdup_printf ("GREETER %s START-SESSION SESSION=", getenv ("DISPLAY"));
110     if (g_str_has_prefix (request, r))
111     {
112         if (!lightdm_greeter_start_session_sync (greeter, request + strlen (r), NULL))
113             status_notify ("GREETER %s SESSION-FAILED", getenv ("DISPLAY")); 
114     }
115     g_free (r);
116
117     r = g_strdup_printf ("GREETER %s LOG-LAYOUT", getenv ("DISPLAY"));
118     if (strcmp (request, r) == 0)
119     {
120         const gchar *layout;
121         layout = lightdm_layout_get_name (lightdm_get_layout ());
122         status_notify ("GREETER %s LOG-LAYOUT LAYOUT='%s'", getenv ("DISPLAY"), layout ? layout : "");
123     }
124
125     r = g_strdup_printf ("GREETER %s LOG-LAYOUT USERNAME=", getenv ("DISPLAY"));
126     if (g_str_has_prefix (request, r))
127     {
128         LightDMUser *user;
129         const gchar *username, *layout;
130
131         username = request + strlen (r);
132         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
133         layout = lightdm_user_get_layout (user);
134
135         status_notify ("GREETER %s LOG-LAYOUT USERNAME=%s LAYOUT='%s'", getenv ("DISPLAY"), username, layout ? layout : "");
136     }
137     g_free (r);
138
139     r = g_strdup_printf ("GREETER %s LOG-LAYOUTS USERNAME=", getenv ("DISPLAY"));
140     if (g_str_has_prefix (request, r))
141     {
142         LightDMUser *user;
143         const gchar *username;
144         const gchar * const *layouts;
145         int i;
146
147         username = request + strlen (r);
148         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
149         layouts = lightdm_user_get_layouts (user);
150
151         for (i = 0; layouts[i]; i++)
152             status_notify ("GREETER %s LOG-LAYOUTS USERNAME=%s LAYOUT='%s'", getenv ("DISPLAY"), username, layouts[i]);
153     }
154     g_free (r);
155
156     r = g_strdup_printf ("GREETER %s LOG-VARIANTS LAYOUT=", getenv ("DISPLAY"));
157     if (g_str_has_prefix (request, r))
158     {
159         GList *layouts, *iter;
160         const gchar *layout_prefix;
161
162         layout_prefix = request + strlen (r);
163         layouts = lightdm_get_layouts ();
164
165         for (iter = layouts; iter; iter = iter->next)
166         {
167             LightDMLayout *layout;
168             const gchar *name;
169
170             layout = (LightDMLayout *) iter->data;
171             name = lightdm_layout_get_name (layout);
172
173             if (g_str_has_prefix (name, layout_prefix))
174                 status_notify ("GREETER %s LOG-VARIANTS LAYOUT='%s'", getenv ("DISPLAY"), name);
175         }
176     }
177     g_free (r);
178
179     r = g_strdup_printf ("GREETER %s LOG-LANGUAGE USERNAME=", getenv ("DISPLAY"));  
180     if (g_str_has_prefix (request, r))
181     {
182         LightDMUser *user;
183         const gchar *username, *language;
184
185         username = request + strlen (r);
186         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
187         language = lightdm_user_get_language (user);
188
189         status_notify ("GREETER %s LOG-LANGUAGE USERNAME=%s LANGUAGE=%s", getenv ("DISPLAY"), username, language ? language : "");
190     }
191     g_free (r);
192 }
193
194 int
195 main (int argc, char **argv)
196 {
197     signal (SIGINT, signal_cb);
198     signal (SIGTERM, signal_cb);
199
200 #if !defined(GLIB_VERSION_2_36)
201     g_type_init ();
202 #endif
203
204     loop = g_main_loop_new (NULL, FALSE);
205
206     status_connect (request_cb);
207
208     status_notify ("GREETER %s START", getenv ("DISPLAY"));
209
210     config = g_key_file_new ();
211     g_key_file_load_from_file (config, g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), G_KEY_FILE_NONE, NULL);
212
213     if (g_key_file_has_key (config, "test-greeter-config", "return-value", NULL))
214     {
215         int return_value = g_key_file_get_integer (config, "test-greeter-config", "return-value", NULL);
216         status_notify ("GREETER %s EXIT CODE=%d", getenv ("DISPLAY"), return_value);
217         return return_value;
218     }
219
220     connection = xcb_connect (NULL, NULL);
221
222     if (xcb_connection_has_error (connection))
223     {
224         status_notify ("GREETER %s FAIL-CONNECT-XSERVER", getenv ("DISPLAY"));
225         return EXIT_FAILURE;
226     }
227
228     status_notify ("GREETER %s CONNECT-XSERVER", getenv ("DISPLAY"));
229
230     greeter = lightdm_greeter_new ();
231     g_signal_connect (greeter, "show-message", G_CALLBACK (show_message_cb), NULL);
232     g_signal_connect (greeter, "show-prompt", G_CALLBACK (show_prompt_cb), NULL);
233     g_signal_connect (greeter, "authentication-complete", G_CALLBACK (authentication_complete_cb), NULL);
234     g_signal_connect (greeter, "autologin-timer-expired", G_CALLBACK (autologin_timer_expired_cb), NULL);
235
236     status_notify ("GREETER %s CONNECT-TO-DAEMON", getenv ("DISPLAY"));
237     if (!lightdm_greeter_connect_sync (greeter, NULL))
238     {
239         status_notify ("GREETER %s FAIL-CONNECT-DAEMON", getenv ("DISPLAY"));
240         return EXIT_FAILURE;
241     }
242
243     status_notify ("GREETER %s CONNECTED-TO-DAEMON", getenv ("DISPLAY"));
244
245     if (lightdm_greeter_get_select_user_hint (greeter))
246         status_notify ("GREETER %s SELECT-USER-HINT USERNAME=%s", getenv ("DISPLAY"), lightdm_greeter_get_select_user_hint (greeter));
247     if (lightdm_greeter_get_lock_hint (greeter))
248         status_notify ("GREETER %s LOCK-HINT", getenv ("DISPLAY"));
249
250     g_main_loop_run (loop);
251
252     return EXIT_SUCCESS;
253 }