9 from gi.repository import GLib
10 from gi.repository import LightDM
12 display = os.getenv ('DISPLAY');
14 greeter_id = 'GREETER-?'
15 elif display.startswith (':'):
16 greeter_id = 'GREETER-X-%s' % display[1:]
18 greeter_id = 'GREETER-X-%s' % display
20 loop = GLib.MainLoop ()
22 def sigterm_cb (data):
23 status_notify ('%s TERMINATE SIGNAL=%d' % (greeter_id, signal.SIGTERM))
25 GLib.unix_signal_add (GLib.PRIORITY_DEFAULT, signal.SIGTERM, sigterm_cb, None)
29 def status_notify (message):
30 if status_socket is not None:
31 status_socket.send (struct.pack ('i', len (message)) + message)
33 sys.stderr.write ('%s\n' % message)
35 def request_cb (channel, condition):
36 length = status_socket.recv (4)
41 (l,) = struct.unpack ('i', length)
42 request = status_socket.recv (l)
44 r = '%s AUTHENTICATE' % greeter_id
46 greeter.authenticate (None)
48 r = '%s AUTHENTICATE USERNAME=' % greeter_id
49 if request.startswith (r):
50 greeter.authenticate (request[len(r):])
52 r = '%s AUTHENTICATE-GUEST' % greeter_id
54 greeter.authenticate_as_guest ()
56 r = '%s AUTHENTICATE-AUTOLOGIN' % greeter_id
58 greeter.authenticate_autologin ()
60 r = '%s AUTHENTICATE-REMOTE SESSION=' % greeter_id
61 if request.startswith (r):
62 greeter.authenticate_remote (request[len(r):], None)
64 r = '%s RESPOND TEXT=\"' % greeter_id
65 if request.startswith (r):
66 greeter.respond (request[len (r):-1])
68 r = '%s CANCEL-AUTHENTICATION' % greeter_id
70 greeter.cancel_authentication ()
72 r = '%s START-SESSION' % greeter_id
74 if not greeter.start_session_sync (None):
75 status_notify ('%s SESSION-FAILED' % greeter_id)
77 r = '%s START-SESSION SESSION=' % greeter_id
78 if request.startswith (r):
79 if not greeter.start_session_sync (request[len(r):]):
80 status_notify ('%s SESSION-FAILED' % greeter_id)
82 r = '%s LOG-LAYOUT' % greeter_id
84 layout = LightDM.get_layout ().get_name ()
85 status_notify ('%s LOG-LAYOUT LAYOUT=%s' % (greeter_id, layout))
87 r = '%s LOG-LAYOUT 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 layout = user.get_layout ()
94 status_notify ('%s LOG-LAYOUT USERNAME=%s LAYOUT=%s' % (greeter_id, username, layout))
96 r = '%s LOG-LANGUAGE USERNAME=' % greeter_id
97 if request.startswith (r):
98 username = request[len(r):]
99 user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username)
100 language = lightdm_user_get_language (user)
103 status_notify ('%s LOG-LANGUAGE USERNAME=%s LANGUAGE=%s' % (greeter_id, username, language))
105 r = 'GREETER %s GET-CAN-SUSPEND' % os.getenv ('DISPLAY')
107 if LightDM.get_can_suspend ():
111 status_notify ('GREETER %s CAN-SUSPEND ALLOWED=%s' % (os.getenv ('DISPLAY'), allowed))
113 r = 'GREETER %s SUSPEND' % os.getenv ('DISPLAY')
118 status_notify ('GREETER %s FAIL-SUSPEND' % os.getenv ('DISPLAY'))
120 r = 'GREETER %s GET-CAN-HIBERNATE' % os.getenv ('DISPLAY')
122 if LightDM.get_can_hibernate ():
126 status_notify ('GREETER %s CAN-HIBERNATE ALLOWED=%s' % (os.getenv ('DISPLAY'), allowed))
128 r = 'GREETER %s HIBERNATE' % os.getenv ('DISPLAY')
133 status_notify ('GREETER %s FAIL-HIBERNATE' % os.getenv ('DISPLAY'))
135 r = 'GREETER %s GET-CAN-RESTART' % os.getenv ('DISPLAY')
137 if LightDM.get_can_restart ():
141 status_notify ('GREETER %s CAN-RESTART ALLOWED=%s' % (os.getenv ('DISPLAY'), allowed))
143 r = 'GREETER %s RESTART' % os.getenv ('DISPLAY')
148 status_notify ('GREETER %s FAIL-RESTART' % os.getenv ('DISPLAY'))
150 r = 'GREETER %s GET-CAN-SHUTDOWN' % os.getenv ('DISPLAY')
152 if LightDM.get_can_shutdown ():
156 status_notify ('GREETER %s CAN-SHUTDOWN ALLOWED=%s' % (os.getenv ('DISPLAY'), allowed))
158 r = 'GREETER %s SHUTDOWN' % os.getenv ('DISPLAY')
163 status_notify ('GREETER %s FAIL-SHUTDOWN' % os.getenv ('DISPLAY'))
167 path = os.getenv ('LIGHTDM_TEST_ROOT') + '/.status-socket'
168 status_socket = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
169 status_socket.connect (path)
170 GLib.io_add_watch (status_socket.fileno (), GLib.IO_IN | GLib.IO_HUP, request_cb)
172 status_notify ('%s START' % greeter_id)
174 # NOTE: There don't seem to be any good X bindings so we have to mock up our own...
175 (host, display_number) = display.split (':')
177 x_socket = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
178 x_socket.connect ('/tmp/.X11-unix/X%s' % display_number)
180 x_socket = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
181 x_socket.connect ((host, 6000 + int (display_number)))
182 authority = subprocess.check_output(['xauth', 'list']).split ()
185 if len (authority) >= 3:
186 auth_name = authority[1]
188 while len (hex) >= 2:
189 auth_data += chr (int (hex[:2], 16))
192 if len (value) % 4 != 0:
193 return value + '\x00' * (4 - len (value) % 4)
196 x_socket.send (struct.pack ('!cxHHHHxx', 'B', 11, 0, len (auth_name), len (auth_data)) + pad (auth_name) + pad (auth_data))
197 data = x_socket.recv (1024)
198 if ord (data[0]) != 1:
199 status_notify ('%s FAIL-CONNECT-XSERVER' % greeter_id)
202 status_notify ('%s CONNECT-XSERVER' % (greeter_id))
204 def show_message_cb (greeter, text, type):
205 status_notify ('%s SHOW-MESSAGE TEXT=\"%s\"' % (greeter_id, text))
207 def show_prompt_cb (greeter, text, type):
208 status_notify ('%s SHOW-PROMPT TEXT=\"%s\"' % (greeter_id, text))
210 def authentication_complete_cb (greeter):
211 if greeter.get_is_authenticated ():
212 is_authenticated = 'TRUE'
214 is_authenticated = 'FALSE'
215 if greeter.get_authentication_user () is not None:
216 status_notify ('%s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s' % (greeter_id, greeter.get_authentication_user (), is_authenticated))
218 status_notify ('%s AUTHENTICATION-COMPLETE AUTHENTICATED=%s' % (greeter_id, is_authenticated))
220 def autologin_timer_expired_cb (greeter):
221 status_notify ('%s AUTOLOGIN-TIMER-EXPIRED' % greeter_id)
223 greeter = LightDM.Greeter ()
224 greeter.connect ('show-message', show_message_cb)
225 greeter.connect ('show-prompt', show_prompt_cb)
226 greeter.connect ('authentication-complete', authentication_complete_cb)
227 greeter.connect ('autologin-timer-expired', autologin_timer_expired_cb)
229 status_notify ('%s CONNECT-TO-DAEMON' % greeter_id)
230 if not greeter.connect_sync ():
231 status_notify ('%s FAIL-CONNECT-DAEMON' % greeter_id)
234 status_notify ('%s CONNECTED-TO-DAEMON' % greeter_id)
236 if greeter.get_select_user_hint () is not None:
237 status_notify ('%s SELECT-USER-HINT USERNAME=%s' % (greeter_id, greeter.get_select_user_hint ()))
238 if greeter.get_lock_hint ():
239 status_notify ('%s LOCK-HINT' % greeter_id);