]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - tests/src/test-python-greeter
Add upower tests
[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 loop = GLib.MainLoop ()
13
14 def sigterm_cb (data):
15     status_notify ('GREETER %s TERMINATE SIGNAL=%d' % (os.getenv ('DISPLAY'), signal.SIGTERM))
16     loop.quit ()
17 GLib.unix_signal_add (GLib.PRIORITY_DEFAULT, signal.SIGTERM, sigterm_cb, None)
18
19 status_socket = None
20
21 def status_notify (message):
22     if status_socket is not None:
23         status_socket.send (struct.pack ('i', len (message)) + message)
24     else:
25         sys.stderr.write ('%s\n' % message)
26
27 def request_cb (channel, condition):
28     length = status_socket.recv (4)
29     if len (length) == 0:
30         loop.quit ();
31         return False
32     if len (length) > 0:
33         (l,) = struct.unpack ('i', length)
34         request = status_socket.recv (l)
35
36     r = 'GREETER %s AUTHENTICATE' % os.getenv ('DISPLAY')
37     if request == r:
38         greeter.authenticate (None)
39
40     r = 'GREETER %s AUTHENTICATE USERNAME=' % os.getenv ('DISPLAY')
41     if request.startswith (r):
42         greeter.authenticate (request[len(r):])
43
44     r = 'GREETER %s AUTHENTICATE-GUEST' % os.getenv ('DISPLAY')
45     if request == r:
46         greeter.authenticate_as_guest ()
47
48     r = 'GREETER %s AUTHENTICATE-AUTOLOGIN' % os.getenv ('DISPLAY')
49     if request == r:
50         greeter.authenticate_autologin ()
51
52     r = 'GREETER %s AUTHENTICATE-REMOTE SESSION=' % os.getenv ('DISPLAY')
53     if request.startswith (r):
54         greeter.authenticate_remote (request[len(r):], None)
55
56     r = 'GREETER %s RESPOND TEXT=\"' % os.getenv ('DISPLAY')
57     if request.startswith (r):
58         greeter.respond (request[len (r):-1])
59
60     r = 'GREETER %s CANCEL-AUTHENTICATION' % os.getenv ('DISPLAY')
61     if request == r:
62         greeter.cancel_authentication ()
63
64     r = 'GREETER %s START-SESSION' % os.getenv ('DISPLAY')
65     if request == r:
66         if not greeter.start_session_sync (None):
67             status_notify ('GREETER %s SESSION-FAILED' % os.getenv ('DISPLAY'))
68
69     r = 'GREETER %s START-SESSION SESSION=' % os.getenv ('DISPLAY')
70     if request.startswith (r):
71         if not greeter.start_session_sync (request[len(r):]):
72             status_notify ('GREETER %s SESSION-FAILED' % os.getenv ('DISPLAY'))
73
74     r = 'GREETER %s LOG-LAYOUT' % os.getenv ('DISPLAY')
75     if request == r:
76         layout = LightDM.get_layout ().get_name ()
77         status_notify ('GREETER %s LOG-LAYOUT LAYOUT=%s' % (os.getenv ('DISPLAY'), layout))
78
79     r = 'GREETER %s LOG-LAYOUT USERNAME=' % os.getenv ('DISPLAY')
80     if request.startswith (r):
81         username = request[len(r):]
82         user = LightDM.UserList.get_instance ().get_user_by_name (username)
83         layout = user.get_layout ()
84         if layout is None:
85             layout = ''
86         status_notify ('GREETER %s LOG-LAYOUT USERNAME=%s LAYOUT=%s' % (os.getenv ('DISPLAY'), username, layout))
87
88     r = 'GREETER %s LOG-LANGUAGE USERNAME=' % os.getenv ('DISPLAY')  
89     if request.startswith (r):
90         username = request[len(r):]
91         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username)
92         language = lightdm_user_get_language (user)
93         if language is None:
94             language = ''
95         status_notify ('GREETER %s LOG-LANGUAGE USERNAME=%s LANGUAGE=%s' % (os.getenv ('DISPLAY'), username, language))
96
97     r = 'GREETER %s GET-CAN-SUSPEND' % os.getenv ('DISPLAY')
98     if request == r:
99         if LightDM.get_can_suspend ():
100             allowed = "TRUE"
101         else:
102             allowed = "FALSE"
103         status_notify ('GREETER %s CAN-SUSPEND ALLOWED=%s' % (os.getenv ('DISPLAY'), allowed))
104
105     r = 'GREETER %s SUSPEND' % os.getenv ('DISPLAY')
106     if request == r:
107         try:
108             LightDM.suspend ()
109         except:
110             status_notify ('GREETER %s FAIL-SUSPEND' % os.getenv ('DISPLAY'))
111
112     r = 'GREETER %s GET-CAN-HIBERNATE' % os.getenv ('DISPLAY')
113     if request == r:
114         if LightDM.get_can_hibernate ():
115             allowed = "TRUE"
116         else:
117             allowed = "FALSE"
118         status_notify ('GREETER %s CAN-HIBERNATE ALLOWED=%s' % (os.getenv ('DISPLAY'), allowed))
119
120     r = 'GREETER %s HIBERNATE' % os.getenv ('DISPLAY')
121     if request == r:
122         try:
123             LightDM.hibernate ()
124         except:
125             status_notify ('GREETER %s FAIL-HIBERNATE' % os.getenv ('DISPLAY'))
126
127     r = 'GREETER %s GET-CAN-RESTART' % os.getenv ('DISPLAY')
128     if request == r:
129         if LightDM.get_can_restart ():
130             allowed = "TRUE"
131         else:
132             allowed = "FALSE"
133         status_notify ('GREETER %s CAN-RESTART ALLOWED=%s' % (os.getenv ('DISPLAY'), allowed))
134
135     r = 'GREETER %s RESTART' % os.getenv ('DISPLAY')
136     if request == r:
137         try:
138             LightDM.restart ()
139         except:
140             status_notify ('GREETER %s FAIL-RESTART' % os.getenv ('DISPLAY'))
141
142     r = 'GREETER %s GET-CAN-SHUTDOWN' % os.getenv ('DISPLAY')
143     if request == r:
144         if LightDM.get_can_shutdown ():
145             allowed = "TRUE"
146         else:
147             allowed = "FALSE"
148         status_notify ('GREETER %s CAN-SHUTDOWN ALLOWED=%s' % (os.getenv ('DISPLAY'), allowed))
149
150     r = 'GREETER %s SHUTDOWN' % os.getenv ('DISPLAY')
151     if request == r:
152         try:
153             LightDM.shutdown ()
154         except:
155             status_notify ('GREETER %s FAIL-SHUTDOWN' % os.getenv ('DISPLAY'))
156
157     return True
158
159 path = os.getenv ('LIGHTDM_TEST_ROOT') + '/.status-socket'
160 status_socket = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
161 status_socket.connect (path)
162 GLib.io_add_watch (status_socket.fileno (), GLib.IO_IN | GLib.IO_HUP, request_cb)
163
164 status_notify ('GREETER %s START' % os.getenv ('DISPLAY'))
165
166 # NOTE: There don't seem to be any good X bindings so we have to mock up our own...
167 (host, display) = os.getenv ('DISPLAY').split (':')
168 if host == '':
169     x_socket = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
170     x_socket.connect ('/tmp/.X11-unix/X%s' % display)
171 else:
172     x_socket = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
173     x_socket.connect ((host, 6000 + int (display)))
174 authority = subprocess.check_output(['xauth', 'list']).split ()
175 auth_name = ''
176 auth_data = ''
177 if len (authority) >= 3:
178     auth_name = authority[1]
179     hex = authority[2]
180     while len (hex) >= 2:
181         auth_data += chr (int (hex[:2], 16))
182         hex = hex[2:]
183 def pad (value):
184     if len (value) % 4 != 0:
185         return value + '\x00' * (4 - len (value) % 4)
186     else:
187         return value
188 x_socket.send (struct.pack ('!cxHHHHxx', 'B', 11, 0, len (auth_name), len (auth_data)) + pad (auth_name) + pad (auth_data))
189 data = x_socket.recv (1024)
190 if ord (data[0]) != 1:
191     status_notify ('GREETER %s FAIL-CONNECT-XSERVER' % os.getenv ('DISPLAY'))
192     exit (1)
193
194 status_notify ('GREETER %s CONNECT-XSERVER' % (os.getenv ('DISPLAY')))
195
196 def show_message_cb (greeter, text, type):
197     status_notify ('GREETER %s SHOW-MESSAGE TEXT=\"%s\"' % (os.getenv ('DISPLAY'), text))
198
199 def show_prompt_cb (greeter, text, type):
200     status_notify ('GREETER %s SHOW-PROMPT TEXT=\"%s\"' % (os.getenv ('DISPLAY'), text))
201
202 def authentication_complete_cb (greeter):
203     if greeter.get_is_authenticated ():
204         is_authenticated = 'TRUE'
205     else:
206         is_authenticated = 'FALSE'
207     if greeter.get_authentication_user () is not None:
208         status_notify ('GREETER %s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s' % (os.getenv ('DISPLAY'), greeter.get_authentication_user (), is_authenticated))
209     else:
210         status_notify ('GREETER %s AUTHENTICATION-COMPLETE AUTHENTICATED=%s' % (os.getenv ('DISPLAY'), is_authenticated))
211
212 def autologin_timer_expired_cb (greeter):
213     status_notify ('GREETER %s AUTOLOGIN-TIMER-EXPIRED' % os.getenv ('DISPLAY'))
214
215 greeter = LightDM.Greeter ()
216 greeter.connect ('show-message', show_message_cb)
217 greeter.connect ('show-prompt', show_prompt_cb)
218 greeter.connect ('authentication-complete', authentication_complete_cb)
219 greeter.connect ('autologin-timer-expired', autologin_timer_expired_cb)
220
221 status_notify ('GREETER %s CONNECT-TO-DAEMON' % os.getenv ('DISPLAY'))
222 if not greeter.connect_sync ():
223     status_notify ('GREETER %s FAIL-CONNECT-DAEMON' % os.getenv ('DISPLAY'))
224     exit (1)
225
226 status_notify ('GREETER %s CONNECTED-TO-DAEMON' % os.getenv ('DISPLAY'))
227
228 if greeter.get_select_user_hint () is not None:
229     status_notify ('GREETER %s SELECT-USER-HINT USERNAME=%s' % (os.getenv ('DISPLAY'), greeter.get_select_user_hint ()))
230 if greeter.get_lock_hint ():
231     status_notify ('GREETER %s LOCK-HINT' % os.getenv ('DISPLAY'));
232
233 loop.run ()