5 #include <glib-object.h>
7 #include <QLightDM/Greeter>
8 #include <QLightDM/Power>
9 #include <QLightDM/UsersModel>
10 #include <QtCore/QSettings>
11 #include <QtCore/QDebug>
12 #include <QtCore/QCoreApplication>
14 #include "test-qt-greeter.h"
17 static gchar *greeter_id;
18 static QCoreApplication *app = NULL;
19 static QSettings *config = NULL;
20 static QLightDM::PowerInterface *power = NULL;
21 static TestGreeter *greeter = NULL;
22 static QLightDM::UsersModel *users_model = NULL;
24 TestGreeter::TestGreeter ()
26 connect (this, SIGNAL(showMessage(QString, QLightDM::Greeter::MessageType)), SLOT(showMessage(QString, QLightDM::Greeter::MessageType)));
27 connect (this, SIGNAL(showPrompt(QString, QLightDM::Greeter::PromptType)), SLOT(showPrompt(QString, QLightDM::Greeter::PromptType)));
28 connect (this, SIGNAL(authenticationComplete()), SLOT(authenticationComplete()));
29 connect (this, SIGNAL(autologinTimerExpired()), SLOT(autologinTimerExpired()));
32 void TestGreeter::showMessage (QString text, QLightDM::Greeter::MessageType type)
34 status_notify ("%s SHOW-MESSAGE TEXT=\"%s\"", greeter_id, text.toAscii ().constData ());
37 void TestGreeter::showPrompt (QString text, QLightDM::Greeter::PromptType type)
39 status_notify ("%s SHOW-PROMPT TEXT=\"%s\"", greeter_id, text.toAscii ().constData ());
42 void TestGreeter::authenticationComplete ()
44 if (authenticationUser () != "")
45 status_notify ("%s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s",
47 authenticationUser ().toAscii ().constData (), isAuthenticated () ? "TRUE" : "FALSE");
49 status_notify ("%s AUTHENTICATION-COMPLETE AUTHENTICATED=%s", greeter_id, isAuthenticated () ? "TRUE" : "FALSE");
52 void TestGreeter::autologinTimerExpired ()
56 void TestGreeter::printHints ()
58 if (selectUserHint() != "")
59 status_notify ("%s SELECT-USER-HINT USERNAME=%s", greeter_id, greeter->selectUserHint ().toAscii ().constData ());
60 if (selectGuestHint())
61 status_notify ("%s SELECT-GUEST-HINT", greeter_id);
63 status_notify ("%s LOCK-HINT", greeter_id);
64 if (!hasGuestAccountHint ())
65 status_notify ("%s HAS-GUEST-ACCOUNT-HINT=FALSE", greeter_id);
67 status_notify ("%s HIDE-USERS-HINT", greeter_id);
68 if (showManualLoginHint ())
69 status_notify ("%s SHOW-MANUAL-LOGIN-HINT", greeter_id);
70 if (!showRemoteLoginHint ())
71 status_notify ("%s SHOW-REMOTE-LOGIN-HINT=FALSE", greeter_id);
72 int timeout = autologinTimeoutHint ();
73 if (autologinUserHint () != "")
76 status_notify ("%s AUTOLOGIN-USER USERNAME=%s TIMEOUT=%d", greeter_id, greeter->autologinUserHint ().toAscii ().constData (), timeout);
78 status_notify ("%s AUTOLOGIN-USER USERNAME=%s", greeter_id, greeter->autologinUserHint ().toAscii ().constData ());
80 else if (autologinGuestHint ())
83 status_notify ("%s AUTOLOGIN-GUEST TIMEOUT=%d", greeter_id, timeout);
85 status_notify ("%s AUTOLOGIN-GUEST", greeter_id);
89 void TestGreeter::idle ()
91 status_notify ("%s IDLE", greeter_id);
94 void TestGreeter::reset ()
96 status_notify ("%s RESET", greeter_id);
100 void TestGreeter::userRowsInserted (const QModelIndex & parent, int start, int end)
102 for (int i = start; i <= end; i++)
104 QString name = users_model->data (users_model->index (i, 0), QLightDM::UsersModel::NameRole).toString ();
105 status_notify ("%s USER-ADDED USERNAME=%s", greeter_id, qPrintable (name));
109 void TestGreeter::userRowsRemoved (const QModelIndex & parent, int start, int end)
111 for (int i = start; i <= end; i++)
113 QString name = users_model->data (users_model->index (i, 0), QLightDM::UsersModel::NameRole).toString ();
114 status_notify ("%s USER-REMOVED USERNAME=%s", greeter_id, qPrintable (name));
119 signal_cb (int signum)
121 status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, signum);
122 _exit (EXIT_SUCCESS);
126 request_cb (const gchar *name, GHashTable *params)
136 if (strcmp (name, "AUTHENTICATE") == 0)
138 if (g_hash_table_lookup (params, "USERNAME"))
139 greeter->authenticate ((const gchar *) g_hash_table_lookup (params, "USERNAME"));
141 greeter->authenticate ();
144 else if (strcmp (name, "AUTHENTICATE-GUEST") == 0)
145 greeter->authenticateAsGuest ();
147 else if (strcmp (name, "AUTHENTICATE-AUTOLOGIN") == 0)
148 greeter->authenticateAutologin ();
150 else if (strcmp (name, "AUTHENTICATE-REMOTE") == 0)
151 greeter->authenticateRemote ((const gchar *) g_hash_table_lookup (params, "SESSION"), NULL);
153 else if (strcmp (name, "RESPOND") == 0)
154 greeter->respond ((const gchar *) g_hash_table_lookup (params, "TEXT"));
156 else if (strcmp (name, "CANCEL-AUTHENTICATION") == 0)
157 greeter->cancelAuthentication ();
159 else if (strcmp (name, "START-SESSION") == 0)
161 if (g_hash_table_lookup (params, "SESSION"))
163 if (!greeter->startSessionSync ((const gchar *) g_hash_table_lookup (params, "SESSION")))
164 status_notify ("%s SESSION-FAILED", greeter_id);
168 if (!greeter->startSessionSync ())
169 status_notify ("%s SESSION-FAILED", greeter_id);
173 else if (strcmp (name, "LOG-USER-LIST-LENGTH") == 0)
174 status_notify ("%s LOG-USER-LIST-LENGTH N=%d", greeter_id, users_model->rowCount (QModelIndex ()));
176 else if (strcmp (name, "LOG-USER") == 0)
178 const gchar *username = (const gchar *) g_hash_table_lookup (params, "USERNAME");
179 for (int i = 0; i < users_model->rowCount (QModelIndex ()); i++)
181 QString name = users_model->data (users_model->index (i, 0), QLightDM::UsersModel::NameRole).toString ();
182 if (name == username)
183 status_notify ("%s LOG-USER USERNAME=%s", greeter_id, qPrintable (name));
187 else if (strcmp (name, "LOG-USER-LIST") == 0)
189 for (int i = 0; i < users_model->rowCount (QModelIndex ()); i++)
191 QString name = users_model->data (users_model->index (i, 0), QLightDM::UsersModel::NameRole).toString ();
192 status_notify ("%s LOG-USER USERNAME=%s", greeter_id, qPrintable (name));
196 else if (strcmp (name, "GET-CAN-SUSPEND") == 0)
198 gboolean can_suspend = power->canSuspend ();
199 status_notify ("%s CAN-SUSPEND ALLOWED=%s", greeter_id, can_suspend ? "TRUE" : "FALSE");
202 else if (strcmp (name, "SUSPEND") == 0)
204 if (!power->suspend ())
205 status_notify ("%s FAIL-SUSPEND", greeter_id);
208 else if (strcmp (name, "GET-CAN-HIBERNATE") == 0)
210 gboolean can_hibernate = power->canHibernate ();
211 status_notify ("%s CAN-HIBERNATE ALLOWED=%s", greeter_id, can_hibernate ? "TRUE" : "FALSE");
214 else if (strcmp (name, "HIBERNATE") == 0)
216 if (!power->hibernate ())
217 status_notify ("%s FAIL-HIBERNATE", greeter_id);
220 else if (strcmp (name, "GET-CAN-RESTART") == 0)
222 gboolean can_restart = power->canRestart ();
223 status_notify ("%s CAN-RESTART ALLOWED=%s", greeter_id, can_restart ? "TRUE" : "FALSE");
226 else if (strcmp (name, "RESTART") == 0)
228 if (!power->restart ())
229 status_notify ("%s FAIL-RESTART", greeter_id);
232 else if (strcmp (name, "GET-CAN-SHUTDOWN") == 0)
234 gboolean can_shutdown = power->canShutdown ();
235 status_notify ("%s CAN-SHUTDOWN ALLOWED=%s", greeter_id, can_shutdown ? "TRUE" : "FALSE");
238 else if (strcmp (name, "SHUTDOWN") == 0)
240 if (!power->shutdown ())
241 status_notify ("%s FAIL-SHUTDOWN", greeter_id);
246 main(int argc, char *argv[])
248 gchar *display, *xdg_seat, *xdg_vtnr, *xdg_session_cookie, *xdg_session_class;
249 GString *status_text;
251 #if !defined(GLIB_VERSION_2_36)
255 display = getenv ("DISPLAY");
256 xdg_seat = getenv ("XDG_SEAT");
257 xdg_vtnr = getenv ("XDG_VTNR");
258 xdg_session_cookie = getenv ("XDG_SESSION_COOKIE");
259 xdg_session_class = getenv ("XDG_SESSION_CLASS");
262 if (display[0] == ':')
263 greeter_id = g_strdup_printf ("GREETER-X-%s", display + 1);
265 greeter_id = g_strdup_printf ("GREETER-X-%s", display);
268 greeter_id = g_strdup ("GREETER-?");
270 status_connect (request_cb, greeter_id);
272 /* Workaround for Qt being confused by libsystem */
273 #if QT_VERSION >= QT_VERSION_CHECK (5, 3, 0)
274 QCoreApplication::setSetuidAllowed (true);
277 app = new QCoreApplication (argc, argv);
279 signal (SIGINT, signal_cb);
280 signal (SIGTERM, signal_cb);
282 status_text = g_string_new ("");
283 g_string_printf (status_text, "%s START", greeter_id);
285 g_string_append_printf (status_text, " XDG_SEAT=%s", xdg_seat);
287 g_string_append_printf (status_text, " XDG_VTNR=%s", xdg_vtnr);
288 if (xdg_session_cookie)
289 g_string_append_printf (status_text, " XDG_SESSION_COOKIE=%s", xdg_session_cookie);
290 if (xdg_session_class)
291 g_string_append_printf (status_text, " XDG_SESSION_CLASS=%s", xdg_session_class);
292 status_notify ("%s", status_text->str);
293 g_string_free (status_text, TRUE);
295 config = new QSettings (g_build_filename (getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), QSettings::IniFormat);
299 xcb_connection_t *connection = xcb_connect (NULL, NULL);
300 if (xcb_connection_has_error (connection))
302 status_notify ("%s FAIL-CONNECT-XSERVER", greeter_id);
305 status_notify ("%s CONNECT-XSERVER", greeter_id);
308 power = new QLightDM::PowerInterface();
310 greeter = new TestGreeter();
311 if (config->value ("test-greeter-config/resettable", "false") == "true")
313 greeter->setResettable (true);
314 QObject::connect (greeter, SIGNAL(idle()), greeter, SLOT(idle()));
315 QObject::connect (greeter, SIGNAL(reset()), greeter, SLOT(reset()));
318 users_model = new QLightDM::UsersModel();
319 if (config->value ("test-greeter-config/log-user-changes", "false") == "true")
321 QObject::connect (users_model, SIGNAL(rowsInserted(const QModelIndex&, int, int)), greeter, SLOT(userRowsInserted(const QModelIndex&, int, int)));
322 QObject::connect (users_model, SIGNAL(rowsAboutToBeRemoved(const QModelIndex&, int, int)), greeter, SLOT(userRowsRemoved(const QModelIndex&, int, int)));
325 status_notify ("%s CONNECT-TO-DAEMON", greeter_id);
326 if (!greeter->connectSync())
328 status_notify ("%s FAIL-CONNECT-DAEMON", greeter_id);
332 status_notify ("%s CONNECTED-TO-DAEMON", greeter_id);
334 greeter->printHints();