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