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