]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - tests/src/test-python-greeter
Set GError values on greeter method failures
[sojka/lightdm.git] / tests / src / test-python-greeter
1 #!/usr/bin/python
2
3 import sys
4 import os
5 import struct
6 import socket
7 import subprocess
8 import signal
9 from gi.repository import GLib
10 from gi.repository import LightDM
11
12 display = os.getenv ('DISPLAY');
13 xdg_seat = os.getenv ('XDG_SEAT');
14 xdg_vtnr = os.getenv ('XDG_VTNR');
15 xdg_session_cookie = os.getenv ('XDG_SESSION_COOKIE');
16 xdg_session_class = os.getenv ('XDG_SESSION_CLASS');
17 if display is not None:
18     if display.startswith (':'):
19         greeter_id = 'GREETER-X-%s' % display[1:]
20     else:
21         greeter_id = 'GREETER-X-%s' % display
22 else:
23     greeter_id = 'GREETER-?'
24
25 loop = GLib.MainLoop ()
26
27 def sigterm_cb (data):
28     status_notify ('%s TERMINATE SIGNAL=%d' % (greeter_id, signal.SIGTERM))
29     loop.quit ()
30 GLib.unix_signal_add (GLib.PRIORITY_DEFAULT, signal.SIGTERM, sigterm_cb, None)
31
32 status_socket = None
33
34 def status_notify (message):
35     if status_socket is not None:
36         status_socket.send (struct.pack ('i', len (message)) + message)
37     else:
38         sys.stderr.write ('%s\n' % message)
39
40 def request_cb (channel, condition):
41     length = status_socket.recv (4)
42     if len (length) == 0:
43         loop.quit ();
44         return False
45     if len (length) > 0:
46         (l,) = struct.unpack ('i', length)
47         request = status_socket.recv (l)
48
49     r = '%s AUTHENTICATE' % greeter_id
50     if request == r:
51         greeter.authenticate (None)
52
53     r = '%s AUTHENTICATE USERNAME=' % greeter_id
54     if request.startswith (r):
55         greeter.authenticate (request[len(r):])
56
57     r = '%s AUTHENTICATE-GUEST' % greeter_id
58     if request == r:
59         greeter.authenticate_as_guest ()
60
61     r = '%s AUTHENTICATE-AUTOLOGIN' % greeter_id
62     if request == r:
63         greeter.authenticate_autologin ()
64
65     r = '%s AUTHENTICATE-REMOTE SESSION=' % greeter_id
66     if request.startswith (r):
67         greeter.authenticate_remote (request[len(r):], None)
68
69     r = '%s RESPOND TEXT=\"' % greeter_id
70     if request.startswith (r):
71         greeter.respond (request[len (r):-1])
72
73     r = '%s CANCEL-AUTHENTICATION' % greeter_id
74     if request == r:
75         greeter.cancel_authentication ()
76
77     r = '%s START-SESSION' % greeter_id
78     if request == r:
79         try:
80             greeter.start_session_sync (None)
81         except:
82             status_notify ('%s SESSION-FAILED' % greeter_id)
83
84     r = '%s START-SESSION SESSION=' % greeter_id
85     if request.startswith (r):
86         try:
87             greeter.start_session_sync (request[len(r):])
88         except:
89             status_notify ('%s SESSION-FAILED' % greeter_id)
90
91     r = '%s LOG-USER-LIST-LENGTH' % greeter_id
92     if request == r:
93         status_notify ('%s LOG-USER-LIST-LENGTH N=%d' % (greeter_id, LightDM.UserList.get_instance ().get_length ()))
94
95     r = '%s LOG-USER USERNAME=' % greeter_id
96     if request.startswith (r):
97         username = request[len(r):]
98         user = LightDM.UserList.get_instance ().get_user_by_name (username)
99         status_notify ('%s LOG-USER USERNAME=%s' % (greeter_id, user.get_name ()))
100
101     r = '%s LOG-USER-LIST' % greeter_id
102     if request == r:
103         users = LightDM.UserList.get_instance ().get_users ();
104         for user in users:
105             status_notify ('%s LOG-USER USERNAME=%s' % (greeter_id, user.get_name ()))
106
107     r = '%s LOG-LAYOUT' % greeter_id
108     if request == r:
109         layout = LightDM.get_layout ().get_name ()
110         status_notify ('%s LOG-LAYOUT LAYOUT=%s' % (greeter_id, layout))
111
112     r = '%s LOG-LAYOUT USERNAME=' % greeter_id
113     if request.startswith (r):
114         username = request[len(r):]
115         user = LightDM.UserList.get_instance ().get_user_by_name (username)
116         layout = user.get_layout ()
117         if layout is None:
118             layout = ''
119         status_notify ('%s LOG-LAYOUT USERNAME=%s LAYOUT=%s' % (greeter_id, username, layout))
120
121     r = '%s LOG-LANGUAGE USERNAME=' % greeter_id
122     if request.startswith (r):
123         username = request[len(r):]
124         user = LightDM.UserList.get_instance ().get_user_by_name (username)
125         language = user.get_language ()
126         if language is None:
127             language = ''
128         status_notify ('%s LOG-LANGUAGE USERNAME=%s LANGUAGE=%s' % (greeter_id, username, language))
129
130     r = '%s GET-CAN-SUSPEND' % greeter_id
131     if request == r:
132         if LightDM.get_can_suspend ():
133             allowed = "TRUE"
134         else:
135             allowed = "FALSE"
136         status_notify ('%s CAN-SUSPEND ALLOWED=%s' % (greeter_id, allowed))
137
138     r = '%s SUSPEND' % greeter_id
139     if request == r:
140         try:
141             LightDM.suspend ()
142         except:
143             status_notify ('%s FAIL-SUSPEND' % greeter_id)
144
145     r = '%s GET-CAN-HIBERNATE' % greeter_id
146     if request == r:
147         if LightDM.get_can_hibernate ():
148             allowed = "TRUE"
149         else:
150             allowed = "FALSE"
151         status_notify ('%s CAN-HIBERNATE ALLOWED=%s' % (greeter_id, allowed))
152
153     r = '%s HIBERNATE' % greeter_id
154     if request == r:
155         try:
156             LightDM.hibernate ()
157         except:
158             status_notify ('%s FAIL-HIBERNATE' % greeter_id)
159
160     r = '%s GET-CAN-RESTART' % greeter_id
161     if request == r:
162         if LightDM.get_can_restart ():
163             allowed = "TRUE"
164         else:
165             allowed = "FALSE"
166         status_notify ('%s CAN-RESTART ALLOWED=%s' % (greeter_id, allowed))
167
168     r = '%s RESTART' % greeter_id
169     if request == r:
170         try:
171             LightDM.restart ()
172         except:
173             status_notify ('%s FAIL-RESTART' % greeter_id)
174
175     r = '%s GET-CAN-SHUTDOWN' % greeter_id
176     if request == r:
177         if LightDM.get_can_shutdown ():
178             allowed = "TRUE"
179         else:
180             allowed = "FALSE"
181         status_notify ('%s CAN-SHUTDOWN ALLOWED=%s' % (greeter_id, allowed))
182
183     r = '%s SHUTDOWN' % greeter_id
184     if request == r:
185         try:
186             LightDM.shutdown ()
187         except:
188             status_notify ('%s FAIL-SHUTDOWN' % greeter_id)
189
190     return True
191
192 def notify_hints (greeter):
193     if greeter.get_select_user_hint () is not None:
194         status_notify ('%s SELECT-USER-HINT USERNAME=%s' % (greeter_id, greeter.get_select_user_hint ()))
195     if greeter.get_select_guest_hint ():
196         status_notify ('%s SELECT-GUEST-HINT' % greeter_id)
197     if greeter.get_lock_hint ():
198         status_notify ('%s LOCK-HINT' % greeter_id)
199     if not greeter.get_has_guest_account_hint ():
200         status_notify ('%s HAS-GUEST-ACCOUNT-HINT=FALSE' % greeter_id)
201     if greeter.get_hide_users_hint ():
202         status_notify ('%s HIDE-USERS-HINT' % greeter_id)
203     if greeter.get_show_manual_login_hint ():
204         status_notify ('%s SHOW-MANUAL-LOGIN-HINT' % greeter_id)
205     if not greeter.get_show_remote_login_hint ():
206         status_notify ('%s SHOW-REMOTE-LOGIN-HINT=FALSE' % greeter_id)
207     timeout = greeter.get_autologin_timeout_hint ()
208     if greeter.get_autologin_user_hint () is not None:
209         if timeout != 0:
210             status_notify ('%s AUTOLOGIN-USER USERNAME=%s TIMEOUT=%d' % (greeter_id, greeter.get_autologin_user_hint (), timeout))
211         else:
212             status_notify ('%s AUTOLOGIN-USER USERNAME=%s' % (greeter_id, greeter.get_autologin_user_hint ()))
213     elif greeter.get_autologin_guest_hint ():
214         if timeout != 0:
215             status_notify ('%s AUTOLOGIN-GUEST TIMEOUT=%d' % (greeter_id, timeout))
216         else:
217             status_notify ('%s AUTOLOGIN-GUEST' % greeter_id)
218
219 path = os.getenv ('LIGHTDM_TEST_ROOT') + '/.s'
220 status_socket = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
221 status_socket.connect (path)
222 GLib.io_add_watch (status_socket.fileno (), GLib.IO_IN | GLib.IO_HUP, request_cb)
223
224 status_text = '%s START' % greeter_id
225 if xdg_seat is not None:
226     status_text += ' XDG_SEAT=%s' % xdg_seat
227 if xdg_vtnr is not None:
228     status_text += ' XDG_VTNR=%s' % xdg_vtnr
229 if xdg_session_cookie is not None:
230     status_text += ' XDG_SESSION_COOKIE=%s' % xdg_session_cookie
231 if xdg_session_class is not None:
232     status_text += ' XDG_SESSION_CLASS=%s' % xdg_session_class
233 status_notify (status_text)
234
235 config = GLib.KeyFile ()
236 config.load_from_file (os.getenv ('LIGHTDM_TEST_ROOT') + '/script', GLib.KeyFileFlags.NONE)
237
238 # NOTE: There don't seem to be any good X bindings so we have to mock up our own...
239 if display is not None:
240     (host, display_number) = display.split (':')
241     if host == '':
242         x_socket = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
243         x_socket.connect (os.getenv ('LIGHTDM_TEST_ROOT') + '/.x' + display)
244     else:
245         x_socket = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
246         x_socket.connect ((host, 6000 + int (display_number)))
247
248     status_notify ('%s CONNECT-XSERVER' % (greeter_id))
249
250 def show_message_cb (greeter, text, type):
251     status_notify ('%s SHOW-MESSAGE TEXT=\"%s\"' % (greeter_id, text))
252
253 def show_prompt_cb (greeter, text, type):
254     status_notify ('%s SHOW-PROMPT TEXT=\"%s\"' % (greeter_id, text))
255
256 def authentication_complete_cb (greeter):
257     if greeter.get_is_authenticated ():
258         is_authenticated = 'TRUE'
259     else:
260         is_authenticated = 'FALSE'
261     if greeter.get_authentication_user () is not None:
262         status_notify ('%s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s' % (greeter_id, greeter.get_authentication_user (), is_authenticated))
263     else:
264         status_notify ('%s AUTHENTICATION-COMPLETE AUTHENTICATED=%s' % (greeter_id, is_authenticated))
265
266 def autologin_timer_expired_cb (greeter):
267     pass
268
269 greeter = LightDM.Greeter ()
270 greeter.connect ('show-message', show_message_cb)
271 greeter.connect ('show-prompt', show_prompt_cb)
272 greeter.connect ('authentication-complete', authentication_complete_cb)
273 greeter.connect ('autologin-timer-expired', autologin_timer_expired_cb)
274 resettable = False
275 try:
276     resettable = config.get_boolean ('test-greeter-config', 'resettable')
277 except:
278     pass
279 if resettable:
280     LightDM.Greeter.get_instance ().set_resettable (True)
281     LightDM.Greeter.get_instance ().connect ('idle', idle_cb)
282     LightDM.Greeter.get_instance ().connect ('reset', reset_cb)
283
284 def user_added_cb (user_list, user):
285     status_notify ('%s USER-ADDED USERNAME=%s' % (greeter_id, user.get_name ()))
286 def user_removed_cb (user_list, user):
287     status_notify ('%s USER-REMOVED USERNAME=%s' % (greeter_id, user.get_name ()))
288 log_user_changes = False
289 try:
290     log_user_changes = config.get_boolean ('test-greeter-config', 'log-user-changes')
291 except:
292     pass
293 if log_user_changes:
294     LightDM.UserList.get_instance ().connect ('user-added', user_added_cb)
295     LightDM.UserList.get_instance ().connect ('user-removed', user_removed_cb)
296
297 status_notify ('%s CONNECT-TO-DAEMON' % greeter_id)
298 try:
299     greeter.connect_to_daemon_sync ()
300 except:
301     status_notify ('%s FAIL-CONNECT-DAEMON' % greeter_id)
302     exit (1)
303
304 status_notify ('%s CONNECTED-TO-DAEMON' % greeter_id)
305
306 def idle_cb (greeter):
307     status_notify ('%s IDLE' % (greeter_id))
308 def reset_cb (greeter):
309     status_notify ('%s RESET' % (greeter_id))
310     notify_hints (greeter)
311
312 notify_hints (greeter)
313
314 loop.run ()