9 from gi.repository import GLib
10 from gi.repository import LightDM
12 display = os.getenv ('DISPLAY');
13 xdg_seat = os.getenv ('XDG_SEAT');
14 xdg_vtnr = os.getenv ('XDG_VTNR');
15 xdg_session_class = os.getenv ('XDG_SESSION_CLASS');
16 if display is not None:
17 if display.startswith (':'):
18 greeter_id = 'GREETER-X-%s' % display[1:]
20 greeter_id = 'GREETER-X-%s' % display
22 greeter_id = 'GREETER-?'
24 loop = GLib.MainLoop ()
26 def sigterm_cb (data):
27 status_notify ('%s TERMINATE SIGNAL=%d' % (greeter_id, signal.SIGTERM))
29 GLib.unix_signal_add (GLib.PRIORITY_DEFAULT, signal.SIGTERM, sigterm_cb, None)
33 def status_notify (message):
34 if status_socket is not None:
35 status_socket.send (struct.pack ('i', len (message)) + message)
37 sys.stderr.write ('%s\n' % message)
39 def request_cb (channel, condition):
40 length = status_socket.recv (4)
45 (l,) = struct.unpack ('i', length)
46 request = status_socket.recv (l)
48 r = '%s AUTHENTICATE' % greeter_id
50 greeter.authenticate (None)
52 r = '%s AUTHENTICATE USERNAME=' % greeter_id
53 if request.startswith (r):
54 greeter.authenticate (request[len(r):])
56 r = '%s AUTHENTICATE-GUEST' % greeter_id
58 greeter.authenticate_as_guest ()
60 r = '%s AUTHENTICATE-AUTOLOGIN' % greeter_id
62 greeter.authenticate_autologin ()
64 r = '%s AUTHENTICATE-REMOTE SESSION=' % greeter_id
65 if request.startswith (r):
66 greeter.authenticate_remote (request[len(r):], None)
68 r = '%s RESPOND TEXT=\"' % greeter_id
69 if request.startswith (r):
70 greeter.respond (request[len (r):-1])
72 r = '%s CANCEL-AUTHENTICATION' % greeter_id
74 greeter.cancel_authentication ()
76 r = '%s START-SESSION' % greeter_id
78 if not greeter.start_session_sync (None):
79 status_notify ('%s SESSION-FAILED' % greeter_id)
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)
86 r = '%s LOG-USER-LIST-LENGTH' % greeter_id
88 status_notify ('%s LOG-USER-LIST-LENGTH N=%d' % (greeter_id, LightDM.UserList.get_instance ().get_length ()))
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 ()))
96 r = '%s LOG-USER-LIST' % greeter_id
98 users = LightDM.UserList.get_instance ().get_users ();
100 status_notify ('%s LOG-USER USERNAME=%s' % (greeter_id, user.get_name ()))
102 r = '%s LOG-LAYOUT' % greeter_id
104 layout = LightDM.get_layout ().get_name ()
105 status_notify ('%s LOG-LAYOUT LAYOUT=%s' % (greeter_id, layout))
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 ()
114 status_notify ('%s LOG-LAYOUT USERNAME=%s LAYOUT=%s' % (greeter_id, username, layout))
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 ()
123 status_notify ('%s LOG-LANGUAGE USERNAME=%s LANGUAGE=%s' % (greeter_id, username, language))
125 r = '%s GET-CAN-SUSPEND' % greeter_id
127 if LightDM.get_can_suspend ():
131 status_notify ('%s CAN-SUSPEND ALLOWED=%s' % (greeter_id, allowed))
133 r = '%s SUSPEND' % greeter_id
138 status_notify ('%s FAIL-SUSPEND' % greeter_id)
140 r = '%s GET-CAN-HIBERNATE' % greeter_id
142 if LightDM.get_can_hibernate ():
146 status_notify ('%s CAN-HIBERNATE ALLOWED=%s' % (greeter_id, allowed))
148 r = '%s HIBERNATE' % greeter_id
153 status_notify ('%s FAIL-HIBERNATE' % greeter_id)
155 r = '%s GET-CAN-RESTART' % greeter_id
157 if LightDM.get_can_restart ():
161 status_notify ('%s CAN-RESTART ALLOWED=%s' % (greeter_id, allowed))
163 r = '%s RESTART' % greeter_id
168 status_notify ('%s FAIL-RESTART' % greeter_id)
170 r = '%s GET-CAN-SHUTDOWN' % greeter_id
172 if LightDM.get_can_shutdown ():
176 status_notify ('%s CAN-SHUTDOWN ALLOWED=%s' % (greeter_id, allowed))
178 r = '%s SHUTDOWN' % greeter_id
183 status_notify ('%s FAIL-SHUTDOWN' % greeter_id)
187 def notify_hints (greeter):
188 if greeter.get_select_user_hint () is not None:
189 status_notify ('%s SELECT-USER-HINT USERNAME=%s' % (greeter_id, greeter.get_select_user_hint ()))
190 if greeter.get_select_guest_hint ():
191 status_notify ('%s SELECT-GUEST-HINT' % greeter_id)
192 if greeter.get_lock_hint ():
193 status_notify ('%s LOCK-HINT' % greeter_id)
194 if not greeter.get_has_guest_account_hint ():
195 status_notify ('%s HAS-GUEST-ACCOUNT-HINT=FALSE' % greeter_id)
196 if greeter.get_hide_users_hint ():
197 status_notify ('%s HIDE-USERS-HINT' % greeter_id)
198 if greeter.get_show_manual_login_hint ():
199 status_notify ('%s SHOW-MANUAL-LOGIN-HINT' % greeter_id)
200 if not greeter.get_show_remote_login_hint ():
201 status_notify ('%s SHOW-REMOTE-LOGIN-HINT=FALSE' % greeter_id)
202 timeout = greeter.get_autologin_timeout_hint ()
203 if greeter.get_autologin_user_hint () is not None:
205 status_notify ('%s AUTOLOGIN-USER USERNAME=%s TIMEOUT=%d' % (greeter_id, greeter.get_autologin_user_hint (), timeout))
207 status_notify ('%s AUTOLOGIN-USER USERNAME=%s' % (greeter_id, greeter.get_autologin_user_hint ()))
208 elif greeter.get_autologin_guest_hint ():
210 status_notify ('%s AUTOLOGIN-GUEST TIMEOUT=%d' % (greeter_id, timeout))
212 status_notify ('%s AUTOLOGIN-GUEST' % greeter_id)
214 path = os.getenv ('LIGHTDM_TEST_ROOT') + '/.s'
215 status_socket = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
216 status_socket.connect (path)
217 GLib.io_add_watch (status_socket.fileno (), GLib.IO_IN | GLib.IO_HUP, request_cb)
219 status_text = '%s START' % greeter_id
220 if xdg_seat is not None:
221 status_text += ' XDG_SEAT=%s' % xdg_seat
222 if xdg_vtnr is not None:
223 status_text += ' XDG_VTNR=%s' % xdg_vtnr
224 if xdg_session_class is not None:
225 status_text += ' XDG_SESSION_CLASS=%s' % xdg_session_class
226 status_notify (status_text)
228 config = GLib.KeyFile ()
229 config.load_from_file (os.getenv ('LIGHTDM_TEST_ROOT') + '/script', GLib.KeyFileFlags.NONE)
231 # NOTE: There don't seem to be any good X bindings so we have to mock up our own...
232 if display is not None:
233 (host, display_number) = display.split (':')
235 x_socket = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
236 x_socket.connect (os.getenv ('LIGHTDM_TEST_ROOT') + '/.x' + display)
238 x_socket = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
239 x_socket.connect ((host, 6000 + int (display_number)))
241 status_notify ('%s CONNECT-XSERVER' % (greeter_id))
243 def show_message_cb (greeter, text, type):
244 status_notify ('%s SHOW-MESSAGE TEXT=\"%s\"' % (greeter_id, text))
246 def show_prompt_cb (greeter, text, type):
247 status_notify ('%s SHOW-PROMPT TEXT=\"%s\"' % (greeter_id, text))
249 def authentication_complete_cb (greeter):
250 if greeter.get_is_authenticated ():
251 is_authenticated = 'TRUE'
253 is_authenticated = 'FALSE'
254 if greeter.get_authentication_user () is not None:
255 status_notify ('%s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s' % (greeter_id, greeter.get_authentication_user (), is_authenticated))
257 status_notify ('%s AUTHENTICATION-COMPLETE AUTHENTICATED=%s' % (greeter_id, is_authenticated))
259 def autologin_timer_expired_cb (greeter):
262 greeter = LightDM.Greeter ()
263 greeter.connect ('show-message', show_message_cb)
264 greeter.connect ('show-prompt', show_prompt_cb)
265 greeter.connect ('authentication-complete', authentication_complete_cb)
266 greeter.connect ('autologin-timer-expired', autologin_timer_expired_cb)
269 resettable = config.get_boolean ('test-greeter-config', 'resettable')
273 LightDM.Greeter.get_instance ().set_resettable (True)
274 LightDM.Greeter.get_instance ().connect ('idle', idle_cb)
275 LightDM.Greeter.get_instance ().connect ('reset', reset_cb)
277 def user_added_cb (user_list, user):
278 status_notify ('%s USER-ADDED USERNAME=%s' % (greeter_id, user.get_name ()))
279 def user_removed_cb (user_list, user):
280 status_notify ('%s USER-REMOVED USERNAME=%s' % (greeter_id, user.get_name ()))
281 log_user_changes = False
283 log_user_changes = config.get_boolean ('test-greeter-config', 'log-user-changes')
287 LightDM.UserList.get_instance ().connect ('user-added', user_added_cb)
288 LightDM.UserList.get_instance ().connect ('user-removed', user_removed_cb)
290 status_notify ('%s CONNECT-TO-DAEMON' % greeter_id)
291 if not greeter.connect_to_daemon_sync ():
292 status_notify ('%s FAIL-CONNECT-DAEMON' % greeter_id)
295 status_notify ('%s CONNECTED-TO-DAEMON' % greeter_id)
297 def idle_cb (greeter):
298 status_notify ('%s IDLE' % (greeter_id))
299 def reset_cb (greeter):
300 status_notify ('%s RESET' % (greeter_id))
301 notify_hints (greeter)
303 notify_hints (greeter)