9 from gi.repository import GLib
10 from gi.repository import LightDM
12 loop = GLib.MainLoop ()
14 def sigterm_cb (signum, frame):
15 sys.stderr.write ("sigterm\n")
16 status_notify ('GREETER %s TERMINATE SIGNAL=%d' % (os.getenv ('DISPLAY'), signum))
18 signal.signal (signal.SIGTERM, sigterm_cb)
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)
27 sys.stderr.write ('%s\n' % message)
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))
36 (l,) = struct.unpack ('i', length)
37 request = status_socket.recv (l)
38 sys.stderr.write ("read '%s' %d\n" % (request, len (request)))
40 r = 'GREETER %s AUTHENTICATE' % os.getenv ('DISPLAY')
42 greeter.authenticate (None)
44 r = 'GREETER %s AUTHENTICATE USERNAME=' % os.getenv ('DISPLAY')
45 if request.startswith (r):
46 greeter.authenticate (request[len(r):])
48 r = 'GREETER %s AUTHENTICATE-GUEST' % os.getenv ('DISPLAY')
50 greeter.authenticate_as_guest ()
52 r = 'GREETER %s RESPOND TEXT=\"' % os.getenv ('DISPLAY')
53 if request.startswith (r):
54 greeter.respond (request[len (r):-1])
56 r = 'GREETER %s START-SESSION' % os.getenv ('DISPLAY')
58 sys.stderr.write ("start-session\n");
59 if not greeter.start_session_sync (None):
60 sys.stderr.write ("start-session-failed\n");
61 status_notify ('GREETER %s SESSION-FAILED' % os.getenv ('DISPLAY'))
62 sys.stderr.write ("start-session ok\n");
64 r = 'GREETER %s START-SESSION SESSION=' % os.getenv ('DISPLAY')
65 if request.startswith (r):
66 if not greeter.start_session_sync (request[len(r):]):
67 status_notify ('GREETER %s SESSION-FAILED' % os.getenv ('DISPLAY'))
69 r = 'GREETER %s LOG-LAYOUT' % os.getenv ('DISPLAY')
71 layout = LightDM.get_layout ().get_name ()
72 status_notify ('GREETER %s LOG-LAYOUT LAYOUT=%s' % (os.getenv ('DISPLAY'), layout))
74 r = 'GREETER %s LOG-LAYOUT USERNAME=' % os.getenv ('DISPLAY')
75 if request.startswith (r):
76 username = request[len(r):]
77 user = LightDM.UserList.get_instance ().get_user_by_name (username)
78 layout = user.get_layout ()
81 status_notify ('GREETER %s LOG-LAYOUT USERNAME=%s LAYOUT=%s' % (os.getenv ('DISPLAY'), username, layout))
83 r = 'GREETER %s LOG-LANGUAGE USERNAME=' % os.getenv ('DISPLAY')
84 if request.startswith (r):
85 username = request[len(r):]
86 user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username)
87 language = lightdm_user_get_language (user)
90 status_notify ('GREETER %s LOG-LANGUAGE USERNAME=%s LANGUAGE=%s' % (os.getenv ('DISPLAY'), username, language))
92 sys.stderr.write ("request_cb end\n")
95 path = os.getenv ('LIGHTDM_TEST_STATUS_SOCKET')
97 sys.stderr.write ('LIGHTDM_TEST_STATUS_SOCKET not defined\n')
99 status_socket = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
100 status_socket.connect (path)
101 GLib.io_add_watch (status_socket.fileno (), GLib.IO_IN, request_cb)
103 status_notify ('GREETER %s START' % os.getenv ('DISPLAY'))
105 # NOTE: There don't seem to be any good X bindings so we have to mock up our own...
106 (host, display) = os.getenv ('DISPLAY').split (':')
108 x_socket = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
109 x_socket.connect ('/tmp/.X11-unix/X%s' % display)
111 x_socket = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
112 x_socket.connect ((host, 6000 + int (display)))
113 authority = subprocess.check_output(['xauth', 'list']).split ()
116 if len (authority) >= 3:
117 auth_name = authority[1]
119 while len (hex) >= 2:
120 auth_data += chr (int (hex[:2], 16))
123 if len (value) % 4 != 0:
124 return value + '\x00' * (4 - len (value) % 4)
127 x_socket.send (struct.pack ('!cxHHHHxx', 'B', 11, 0, len (auth_name), len (auth_data)) + pad (auth_name) + pad (auth_data))
128 data = x_socket.recv (1024)
129 if ord (data[0]) != 1:
130 status_notify ('GREETER %s FAIL-CONNECT-XSERVER' % os.getenv ('DISPLAY'))
133 status_notify ('GREETER %s CONNECT-XSERVER' % (os.getenv ('DISPLAY')))
135 def show_message_cb (greeter, text, type):
136 status_notify ('GREETER %s SHOW-MESSAGE TEXT=\"%s\"' % (os.getenv ('DISPLAY'), text))
138 def show_prompt_cb (greeter, text, type):
139 status_notify ('GREETER %s SHOW-PROMPT TEXT=\"%s\"' % (os.getenv ('DISPLAY'), text))
141 def authentication_complete_cb (greeter):
142 if greeter.get_is_authenticated ():
143 is_authenticated = 'TRUE'
145 is_authenticated = 'FALSE'
146 if greeter.get_authentication_user () is not None:
147 status_notify ('GREETER %s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s' % (os.getenv ('DISPLAY'), greeter.get_authentication_user (), is_authenticated))
149 status_notify ('GREETER %s AUTHENTICATION-COMPLETE AUTHENTICATED=%s' % (os.getenv ('DISPLAY'), is_authenticated))
151 greeter = LightDM.Greeter ()
152 greeter.connect ('show-message', show_message_cb)
153 greeter.connect ('show-prompt', show_prompt_cb)
154 greeter.connect ('authentication-complete', authentication_complete_cb)
156 status_notify ('GREETER %s CONNECT-TO-DAEMON' % os.getenv ('DISPLAY'))
157 if not greeter.connect_sync ():
158 status_notify ('GREETER %s FAIL-CONNECT-DAEMON' % os.getenv ('DISPLAY'))
161 status_notify ('GREETER %s CONNECTED-TO-DAEMON' % os.getenv ('DISPLAY'))
163 if greeter.get_select_user_hint () is not None:
164 status_notify ('GREETER %s SELECT-USER-HINT USERNAME=%s' % (os.getenv ('DISPLAY'), greeter.get_select_user_hint ()))
165 if greeter.get_lock_hint ():
166 status_notify ('GREETER %s LOCK-HINT' % os.getenv ('DISPLAY'));