]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - tests/src/test-qt-greeter.cpp
Correctly implement and test autologin timeouts
[sojka/lightdm.git] / tests / src / test-qt-greeter.cpp
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <signal.h>
4 #include <glib-object.h>
5 #include <xcb/xcb.h>
6 #include <QLightDM/Greeter>
7 #include <QtCore/QSettings>
8 #include <QtCore/QDebug>
9 #include <QtCore/QCoreApplication>
10
11 #include "test-qt-greeter.h"
12 #include "status.h"
13
14 static QSettings *config = NULL;
15 static TestGreeter *greeter = NULL;
16
17 TestGreeter::TestGreeter ()
18 {
19     connect (this, SIGNAL(showMessage(QString, QLightDM::Greeter::MessageType)), SLOT(showMessage(QString, QLightDM::Greeter::MessageType)));
20     connect (this, SIGNAL(showPrompt(QString, QLightDM::Greeter::PromptType)), SLOT(showPrompt(QString, QLightDM::Greeter::PromptType)));
21     connect (this, SIGNAL(authenticationComplete()), SLOT(authenticationComplete()));
22     connect (this, SIGNAL(autologinTimerExpired()), SLOT(autologinTimerExpired()));
23 }
24
25 void TestGreeter::showMessage (QString text, QLightDM::Greeter::MessageType type)
26 {
27     status_notify ("GREETER %s SHOW-MESSAGE TEXT=\"%s\"", getenv ("DISPLAY"), text.toAscii ().constData ());
28 }
29
30 void TestGreeter::showPrompt (QString text, QLightDM::Greeter::PromptType type)
31 {
32     status_notify ("GREETER %s SHOW-PROMPT TEXT=\"%s\"", getenv ("DISPLAY"), text.toAscii ().constData ());
33 }
34
35 void TestGreeter::authenticationComplete ()
36 {
37     if (authenticationUser () != "")
38         status_notify ("GREETER %s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s",
39                        getenv ("DISPLAY"),
40                        authenticationUser ().toAscii ().constData (), isAuthenticated () ? "TRUE" : "FALSE");
41     else
42         status_notify ("GREETER %s AUTHENTICATION-COMPLETE AUTHENTICATED=%s", getenv ("DISPLAY"), isAuthenticated () ? "TRUE" : "FALSE");
43 }
44
45 void TestGreeter::autologinTimerExpired ()
46 {
47     status_notify ("GREETER %s AUTOLOGIN-TIMER-EXPIRED", getenv ("DISPLAY"));
48 }
49
50 static void
51 signal_cb (int signum)
52 {
53     status_notify ("GREETER %s TERMINATE SIGNAL=%d", getenv ("DISPLAY"), signum);
54     exit (EXIT_SUCCESS);
55 }
56
57 static void
58 request_cb (const gchar *request)
59 {
60     gchar *r;
61   
62     r = g_strdup_printf ("GREETER %s AUTHENTICATE", getenv ("DISPLAY"));
63     if (strcmp (request, r) == 0)
64         greeter->authenticate ();
65     g_free (r);
66
67     r = g_strdup_printf ("GREETER %s AUTHENTICATE USERNAME=", getenv ("DISPLAY"));
68     if (g_str_has_prefix (request, r))
69         greeter->authenticate (request + strlen (r));
70     g_free (r);
71
72     r = g_strdup_printf ("GREETER %s AUTHENTICATE-GUEST", getenv ("DISPLAY"));
73     if (strcmp (request, r) == 0)
74         greeter->authenticateAsGuest ();
75     g_free (r);
76
77     r = g_strdup_printf ("GREETER %s AUTHENTICATE-AUTOLOGIN", getenv ("DISPLAY"));
78     if (strcmp (request, r) == 0)
79         greeter->authenticateAutologin ();
80     g_free (r);
81
82     r = g_strdup_printf ("GREETER %s AUTHENTICATE-REMOTE SESSION=", getenv ("DISPLAY"));
83     if (g_str_has_prefix (request, r))
84         greeter->authenticateRemote (request + strlen (r), NULL);
85     g_free (r);
86
87     r = g_strdup_printf ("GREETER %s RESPOND TEXT=\"", getenv ("DISPLAY"));
88     if (g_str_has_prefix (request, r))
89     {
90         gchar *text = g_strdup (request + strlen (r));
91         text[strlen (text) - 1] = '\0';
92         greeter->respond (text);
93         g_free (text);
94     }
95     g_free (r);
96
97     r = g_strdup_printf ("GREETER %s START-SESSION", getenv ("DISPLAY"));
98     if (strcmp (request, r) == 0)
99     {
100         if (!greeter->startSessionSync ())
101             status_notify ("GREETER %s SESSION-FAILED", getenv ("DISPLAY"));
102     }
103     g_free (r);
104
105     r = g_strdup_printf ("GREETER %s START-SESSION SESSION=", getenv ("DISPLAY"));
106     if (g_str_has_prefix (request, r))
107     {
108         if (!greeter->startSessionSync (request + strlen (r)))
109             status_notify ("GREETER %s SESSION-FAILED", getenv ("DISPLAY"));
110     }
111     g_free (r);
112 }
113
114 int
115 main(int argc, char *argv[])
116 {
117     g_type_init ();
118
119     status_connect (request_cb);
120
121     QCoreApplication app(argc, argv);
122
123     signal (SIGINT, signal_cb);
124     signal (SIGTERM, signal_cb);
125
126     status_notify ("GREETER %s START", getenv ("DISPLAY"));
127
128     config = new QSettings (g_build_filename (getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), QSettings::IniFormat);
129
130     xcb_connection_t *connection = xcb_connect (NULL, NULL);
131
132     if (xcb_connection_has_error (connection))
133     {
134         status_notify ("GREETER %s FAIL-CONNECT-XSERVER", getenv ("DISPLAY"));
135         return EXIT_FAILURE;
136     }
137
138     status_notify ("GREETER %s CONNECT-XSERVER", getenv ("DISPLAY"));
139
140     greeter = new TestGreeter();
141   
142     status_notify ("GREETER %s CONNECT-TO-DAEMON", getenv ("DISPLAY"));
143     if (!greeter->connectSync())
144     {
145         status_notify ("GREETER %s FAIL-CONNECT-DAEMON", getenv ("DISPLAY"));
146         return EXIT_FAILURE;
147     }
148
149     status_notify ("GREETER %s CONNECTED-TO-DAEMON", getenv ("DISPLAY"));
150
151     if (greeter->selectUserHint() != "")
152         status_notify ("GREETER %s SELECT-USER-HINT USERNAME=%s", getenv ("DISPLAY"), greeter->selectUserHint ().toAscii ().constData ());
153     if (greeter->lockHint())
154         status_notify ("GREETER %s LOCK-HINT", getenv ("DISPLAY"));
155
156     return app.exec();
157 }