]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - tests/src/test-python-greeter
tests: be more aggressive about closing the test greeter
[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 (signum, frame):
15     sys.stderr.write ("sigterm\n")
16     status_notify ('GREETER %s TERMINATE SIGNAL=%d' % (os.getenv ('DISPLAY'), signum))
17     sys.exit (0);
18 signal.signal (signal.SIGTERM, sigterm_cb)
19
20 status_socket = None
21
22 def status_notify (message):
23     sys.stderr.write ("status_notify\n");
24     if status_socket is not None:
25         status_socket.send (struct.pack ('i', len (message)) + message)
26     else:
27         sys.stderr.write ('%s\n' % message)
28
29 def request_cb (channel, condition):
30     sys.stderr.write ("request_cb\n")
31     length = status_socket.recv (4)
32     sys.stderr.write ("read %d\n" % len (length))
33     if len (length) == 0:
34         return False
35     if len (length) > 0:
36         (l,) = struct.unpack ('i', length)
37         request = status_socket.recv (l)
38         sys.stderr.write ("read '%s' %d\n" % (request, len (request)))
39
40     r = 'GREETER %s AUTHENTICATE' % os.getenv ('DISPLAY')
41     if request == r:
42         greeter.authenticate (None)
43
44     r = 'GREETER %s AUTHENTICATE USERNAME=' % os.getenv ('DISPLAY')
45     if request.startswith (r):
46         greeter.authenticate (request[len(r):])
47
48     r = 'GREETER %s AUTHENTICATE-GUEST' % os.getenv ('DISPLAY')
49     if request == r:
50         greeter.authenticate_as_guest ()
51
52     r = 'GREETER %s AUTHENTICATE-AUTOLOGIN' % os.getenv ('DISPLAY')
53     if request == r:
54         greeter.authenticate_autologin ()
55
56     r = 'GREETER %s AUTHENTICATE-REMOTE SESSION=' % os.getenv ('DISPLAY')
57     if request.startswith (r):
58         greeter.authenticate_remote (request[len(r):], None)
59
60     r = 'GREETER %s RESPOND TEXT=\"' % os.getenv ('DISPLAY')
61     if request.startswith (r):
62         greeter.respond (request[len (r):-1])
63
64     r = 'GREETER %s START-SESSION' % os.getenv ('DISPLAY')
65     if request == r:
66         sys.stderr.write ("start-session\n");
67         if not greeter.start_session_sync (None):
68             sys.stderr.write ("start-session-failed\n");
69             status_notify ('GREETER %s SESSION-FAILED' % os.getenv ('DISPLAY'))
70         sys.stderr.write ("start-session ok\n");
71
72     r = 'GREETER %s START-SESSION SESSION=' % os.getenv ('DISPLAY')
73     if request.startswith (r):
74         if not greeter.start_session_sync (request[len(r):]):
75             status_notify ('GREETER %s SESSION-FAILED' % os.getenv ('DISPLAY'))
76
77     r = 'GREETER %s LOG-LAYOUT' % os.getenv ('DISPLAY')
78     if request == r:
79         layout = LightDM.get_layout ().get_name ()
80         status_notify ('GREETER %s LOG-LAYOUT LAYOUT=%s' % (os.getenv ('DISPLAY'), layout))
81
82     r = 'GREETER %s LOG-LAYOUT USERNAME=' % os.getenv ('DISPLAY')
83     if request.startswith (r):
84         username = request[len(r):]
85         user = LightDM.UserList.get_instance ().get_user_by_name (username)
86         layout = user.get_layout ()
87         if layout is None:
88             layout = ''
89         status_notify ('GREETER %s LOG-LAYOUT USERNAME=%s LAYOUT=%s' % (os.getenv ('DISPLAY'), username, layout))
90
91     r = 'GREETER %s LOG-LANGUAGE USERNAME=' % os.getenv ('DISPLAY')  
92     if request.startswith (r):
93         username = request[len(r):]
94         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username)
95         language = lightdm_user_get_language (user)
96         if language is None:
97             language = ''
98         status_notify ('GREETER %s LOG-LANGUAGE USERNAME=%s LANGUAGE=%s' % (os.getenv ('DISPLAY'), username, language))
99
100     sys.stderr.write ("request_cb end\n")
101     return True
102
103 path = os.getenv ('LIGHTDM_TEST_ROOT') + '/.status-socket'
104 status_socket = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
105 status_socket.connect (path)
106 GLib.io_add_watch (status_socket.fileno (), GLib.IO_IN, request_cb)
107
108 status_notify ('GREETER %s START' % os.getenv ('DISPLAY'))
109
110 # NOTE: There don't seem to be any good X bindings so we have to mock up our own...
111 (host, display) = os.getenv ('DISPLAY').split (':')
112 if host == '':
113     x_socket = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
114     x_socket.connect ('/tmp/.X11-unix/X%s' % display)
115 else:
116     x_socket = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
117     x_socket.connect ((host, 6000 + int (display)))
118 authority = subprocess.check_output(['xauth', 'list']).split ()
119 auth_name = ''
120 auth_data = ''
121 if len (authority) >= 3:
122     auth_name = authority[1]
123     hex = authority[2]
124     while len (hex) >= 2:
125         auth_data += chr (int (hex[:2], 16))
126         hex = hex[2:]
127 def pad (value):
128     if len (value) % 4 != 0:
129         return value + '\x00' * (4 - len (value) % 4)
130     else:
131         return value
132 x_socket.send (struct.pack ('!cxHHHHxx', 'B', 11, 0, len (auth_name), len (auth_data)) + pad (auth_name) + pad (auth_data))
133 data = x_socket.recv (1024)
134 if ord (data[0]) != 1:
135     status_notify ('GREETER %s FAIL-CONNECT-XSERVER' % os.getenv ('DISPLAY'))
136     exit (1)
137
138 status_notify ('GREETER %s CONNECT-XSERVER' % (os.getenv ('DISPLAY')))
139
140 def show_message_cb (greeter, text, type):
141     status_notify ('GREETER %s SHOW-MESSAGE TEXT=\"%s\"' % (os.getenv ('DISPLAY'), text))
142
143 def show_prompt_cb (greeter, text, type):
144     status_notify ('GREETER %s SHOW-PROMPT TEXT=\"%s\"' % (os.getenv ('DISPLAY'), text))
145
146 def authentication_complete_cb (greeter):
147     if greeter.get_is_authenticated ():
148         is_authenticated = 'TRUE'
149     else:
150         is_authenticated = 'FALSE'
151     if greeter.get_authentication_user () is not None:
152         status_notify ('GREETER %s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s' % (os.getenv ('DISPLAY'), greeter.get_authentication_user (), is_authenticated))
153     else:
154         status_notify ('GREETER %s AUTHENTICATION-COMPLETE AUTHENTICATED=%s' % (os.getenv ('DISPLAY'), is_authenticated))
155
156 def autologin_timer_expired_cb (greeter):
157     status_notify ('GREETER %s AUTOLOGIN-TIMER-EXPIRED' % os.getenv ('DISPLAY'))
158
159 greeter = LightDM.Greeter ()
160 greeter.connect ('show-message', show_message_cb)
161 greeter.connect ('show-prompt', show_prompt_cb)
162 greeter.connect ('authentication-complete', authentication_complete_cb)
163 greeter.connect ('autologin-timer-expired', autologin_timer_expired_cb)
164
165 status_notify ('GREETER %s CONNECT-TO-DAEMON' % os.getenv ('DISPLAY'))
166 if not greeter.connect_sync ():
167     status_notify ('GREETER %s FAIL-CONNECT-DAEMON' % os.getenv ('DISPLAY'))
168     exit (1)
169
170 status_notify ('GREETER %s CONNECTED-TO-DAEMON' % os.getenv ('DISPLAY'))
171
172 if greeter.get_select_user_hint () is not None:
173     status_notify ('GREETER %s SELECT-USER-HINT USERNAME=%s' % (os.getenv ('DISPLAY'), greeter.get_select_user_hint ()))
174 if greeter.get_lock_hint ():
175     status_notify ('GREETER %s LOCK-HINT' % os.getenv ('DISPLAY'));
176
177 loop.run ()