]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - tests/src/test-gobject-greeter.c
connect_to_server -> connect_sync, start_session -> start_session_sync
[sojka/lightdm.git] / tests / src / test-gobject-greeter.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <xcb/xcb.h>
5 #include <lightdm/greeter.h>
6
7 #include "status.h"
8
9 static xcb_connection_t *connection = NULL;
10 static GKeyFile *config;
11
12 static void
13 show_message_cb (LightDMGreeter *greeter, const gchar *text, LightDMMessageType type)
14 {
15     notify_status ("GREETER SHOW-MESSAGE TEXT=\"%s\"", text);
16 }
17
18 static void
19 show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type)
20 {
21     gchar *username, *password, *response = NULL;
22
23     notify_status ("GREETER SHOW-PROMPT TEXT=\"%s\"", text);
24
25     username = g_key_file_get_string (config, "test-greeter-config", "username", NULL);
26     password = g_key_file_get_string (config, "test-greeter-config", "password", NULL);
27
28     if (g_key_file_get_boolean (config, "test-greeter-config", "prompt-username", NULL))
29     {
30         g_key_file_set_boolean (config, "test-greeter-config", "prompt-username", FALSE);
31         response = username;
32     }
33     else if (password)
34         response = password;
35
36     if (response)
37     {
38         notify_status ("GREETER RESPOND TEXT=\"%s\"", response);
39         lightdm_greeter_respond (greeter, response);
40     }
41
42     g_free (username);
43     g_free (password);
44 }
45
46 static void
47 authentication_complete_cb (LightDMGreeter *greeter)
48 {
49     notify_status ("GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=%s", lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
50     if (!lightdm_greeter_get_is_authenticated (greeter))
51         return;
52
53     if (lightdm_greeter_start_session_sync (greeter, NULL))
54     {
55         notify_status ("GREETER QUIT");
56         exit (EXIT_SUCCESS);
57     }
58     else
59         notify_status ("GREETER SESSION-FAILED");
60 }
61
62 static void
63 signal_cb (int signum)
64 {
65     notify_status ("GREETER TERMINATE SIGNAL=%d", signum);
66     exit (EXIT_SUCCESS);
67 }
68
69 int
70 main (int argc, char **argv)
71 {
72     GMainLoop *main_loop;
73     LightDMGreeter *greeter;
74
75     signal (SIGINT, signal_cb);
76     signal (SIGTERM, signal_cb);
77
78     notify_status ("GREETER START");
79
80     config = g_key_file_new ();
81     if (g_getenv ("LIGHTDM_TEST_CONFIG"))
82         g_key_file_load_from_file (config, g_getenv ("LIGHTDM_TEST_CONFIG"), G_KEY_FILE_NONE, NULL);
83
84     g_type_init ();
85     main_loop = g_main_loop_new (NULL, FALSE);
86
87     connection = xcb_connect (NULL, NULL);
88
89     if (xcb_connection_has_error (connection))
90     {
91         fprintf (stderr, "Error connecting to X server\n");
92         return EXIT_FAILURE;
93     }
94
95     notify_status ("GREETER CONNECT-XSERVER %s", getenv ("DISPLAY"));
96
97     greeter = lightdm_greeter_new ();
98     g_signal_connect (greeter, "show-message", G_CALLBACK (show_message_cb), NULL);
99     g_signal_connect (greeter, "show-prompt", G_CALLBACK (show_prompt_cb), NULL);
100     g_signal_connect (greeter, "authentication-complete", G_CALLBACK (authentication_complete_cb), NULL);
101
102     notify_status ("GREETER CONNECT-TO-DAEMON");
103     if (!lightdm_greeter_connect_sync (greeter))
104         return EXIT_FAILURE;
105
106     notify_status ("GREETER CONNECTED-TO-DAEMON");
107
108     if (g_key_file_get_boolean (config, "test-greeter-config", "crash-xserver", NULL))
109     {
110         const gchar *name = "SIGSEGV";
111         notify_status ("GREETER CRASH-XSERVER");
112         xcb_intern_atom (connection, FALSE, strlen (name), name);
113         xcb_flush (connection);
114     }
115
116     /* Automatically log in as requested user */
117     if (lightdm_greeter_get_select_user_hint (greeter))
118     {
119         notify_status ("GREETER AUTHENTICATE-SELECTED USERNAME=%s", lightdm_greeter_get_select_user_hint (greeter));
120         lightdm_greeter_authenticate (greeter, lightdm_greeter_get_select_user_hint (greeter));
121     }
122     else
123     {
124         gchar *login_lock;
125         FILE *f;
126
127         login_lock = g_build_filename (g_getenv ("LIGHTDM_TEST_HOME_DIR"), ".greeter-logged-in", NULL);
128         f = fopen (login_lock, "r");
129         if (f == NULL)
130         {
131             if (g_key_file_get_boolean (config, "test-greeter-config", "login-guest", NULL))
132             {
133                 notify_status ("GREETER AUTHENTICATE-GUEST");
134                 lightdm_greeter_authenticate_as_guest (greeter);
135             }
136             else if (g_key_file_get_boolean (config, "test-greeter-config", "prompt-username", NULL))
137             {
138                 notify_status ("GREETER AUTHENTICATE");
139                 lightdm_greeter_authenticate (greeter, NULL);
140             }
141             else
142             {
143                 gchar *username;
144
145                 username = g_key_file_get_string (config, "test-greeter-config", "username", NULL);
146                 if (username)
147                 {
148                     notify_status ("GREETER AUTHENTICATE USERNAME=%s", username);
149                     lightdm_greeter_authenticate (greeter, username);
150                     g_free (username);
151                 }
152             }
153
154             /* Write lock to stop repeatedly logging in */
155             f = fopen (login_lock, "w");
156             fclose (f);
157         }
158         else
159         {
160             g_debug ("Not logging in, lock file detected %s", login_lock);
161             fclose (f);
162         }
163     }
164
165     g_main_loop_run (main_loop);
166
167     return EXIT_SUCCESS;
168 }