#!/opt/thinlinc/libexec/python3
# -*-mode: python; coding: utf-8 -*-
#
# Copyright 2002-2014 Cendio AB.
# For more information, see http://www.cendio.com
if 82 - 82: Iii1i
import sys
import locale
import os
import email
import shlex
import socket
import time
import xmlrpc . client
if 87 - 87: Ii % i1i1i1111I . Oo / OooOoo * I1Ii1I1 - I1I
from thinlinc import hiveconf
if 81 - 81: i1 + ooOOO / oOo0O00 * i1iiIII111 * IiIIii11Ii
from thinlinc . xmlrpcutil import unsigned2signed32
from thinlinc . version import TL_VERSION
from thinlinc import prefix
if 84 - 84: ooo000 - Ooo0Ooo + iI1iII1I1I1i . IIiIIiIi11I1
if 98 - 98: I11iiIi11i1I % oOO
if 31 - 31: i1I
if 9 - 9: IiI11Ii111 / oOo0O00 / IiIIii11Ii - I11iiIi11i1I - iI1iII1I1I1i
if 16 - 16: i1i1i1111I / i1iiIII111
if 3 - 3: i1 % i1 % i1i1i1111I . Ii * i1
if 9 - 9: i1iiIII111
i1Ii1i = "THINLINC-LOGIN"
if 93 - 93: IIiIIiIi11I1 % IIiIIiIi11I1 / I1I - Oo . Ooo0Ooo
if 46 - 46: iI1iII1I1I1i - Ii * Oo * Ii
def Ooo ( ) :
 IIiI = shlex . split ( sys . argv [ 2 ] )
 if 60 - 60: iI1iII1I1I1i . oOO
 if len ( IIiI ) >= 1 and ( IIiI [ 0 ] . endswith ( "thinlinc-login" ) or IIiI [ 0 ] == os . path . join ( prefix . get_tl_prefix ( ) , "etc" , "xsession" ) ) :
  if 13 - 13: oOO
  if 2 - 2: i1
  os . execvp ( IIiI [ 0 ] , IIiI )
  if 22 - 22: IIiIIiIi11I1 - ooo000 / I1Ii1I1 . ooo000
 sys . stderr . write ( "Shell access has been prohibited\n" )
 if 1 - 1: iI1iII1I1I1i + Ooo0Ooo + oOO * IIiIIiIi11I1
 sys . stderr . flush ( )
 time . sleep ( 2 )
 sys . exit ( 1 )
 if 20 - 20: I1I + Ii
def Iio0 ( fd ) :
 i1i = b""
 if 87 - 87: Oo - i1I
 while True :
  iiI1111IIi1 = os . read ( fd , 8192 )
  if iiI1111IIi1 == b"" :
   return None
  i1i += iiI1111IIi1
  if oOo00O ( i1i ) :
   break
 return i1i
 if 59 - 59: Iii1i . IiI11Ii111 - i1I
 if 13 - 13: oOO
def oOo00O ( data ) :
 if b"\n\n" not in data and b"\r\n\r\n" not in data :
  if 28 - 28: OooOoo + i1i1i1111I + IiIIii11Ii / I1Ii1I1 + iI1iII1I1I1i
  return 0
  if 70 - 70: IiI11Ii111 + I11iiIi11i1I * oOO . Oo + ooOOO / Oo
  if 14 - 14: OooOoo % oOo0O00 + I1I % i1iiIII111 * ooOOO / I11iiIi11i1I
 OoOo = data . index ( b"\n" )
 data = data [ OoOo + 1 : ]
 if 43 - 43: ooOOO * I1Ii1I1
 if 95 - 95: Ooo0Ooo % Iii1i % i1i1i1111I . OooOoo
 if 70 - 70: IiIIii11Ii
 IiII = email . message_from_bytes ( data )
 I1i1i = IiII [ "Content-length" ]
 if I1i1i is None :
  if len ( IiII . get_payload ( ) ) > 0 :
   sys . stderr . write ( i1Ii1i + ": ERROR: HTTP message without Content-length\n" )
   sys . exit ( 2 )
  else :
   return 0
 try :
  O0ooooOoo0O = int ( I1i1i )
 except ValueError :
  sys . stderr . write ( i1Ii1i + ": ERROR: Invalid Content-length: %s\n" % I1i1i )
  sys . exit ( 2 )
  if 53 - 53: i1 * I1Ii1I1 + Oo * Ii - i1 - I1I
  if 59 - 59: i1 + Iii1i / I1I
 return O0ooooOoo0O <= len ( IiII . get_payload ( ) )
 if 52 - 52: i1i1i1111I + IiIIii11Ii + I11iiIi11i1I
 if 52 - 52: i1iiIII111 % Oo . I1Ii1I1 + ooOOO % Oo . IiI11Ii111
def OOO00oO0oOo0O ( hive ) :
 if 1 - 1: I1I % Ooo0Ooo + i1iiIII111 . i1iiIII111 % Oo
 if 93 - 93: oOo0O00 % Ooo0Ooo * i1iiIII111
 if 52 - 52: oOO + I1I / ooo000 - I1Ii1I1 * i1I % oOo0O00
 oOoO00 = hive . get_integer ( "/vsmserver/listen_port" , 9000 )
 OO0o0O0o0 = xmlrpc . client . Server ( "http://%s:%d" % ( "127.0.0.1" , oOoO00 ) )
 if 11 - 11: IiI11Ii111 % i1i1i1111I + i1
 ooooo = unsigned2signed32 ( os . getuid ( ) )
 if 61 - 61: iI1iII1I1I1i . i1I - ooo000 / ooo000 - i1
 if 19 - 19: Iii1i * Ooo0Ooo . I1Ii1I1 / I11iiIi11i1I * Ii - oOO
 if 32 - 32: iI1iII1I1I1i
 try :
  I111II111I1I = OO0o0O0o0 . create_user_socket ( ooooo )
  IIi1I1I1i = socket . socket ( socket . AF_UNIX , socket . SOCK_STREAM )
  IIi1I1I1i . setsockopt ( socket . SOL_SOCKET , socket . SO_PASSCRED , 1 ) ;
  IIi1I1I1i . connect ( I111II111I1I )
 except xmlrpc . client . Error as O0O :
  if 31 - 31: i1iiIII111 + i1i1i1111I % OooOoo
  if 20 - 20: OooOoo - I1I
  if 9 - 9: i1iiIII111 - iI1iII1I1I1i % Ii - I1I
  if 54 - 54: Iii1i % ooo000 % Iii1i - IiIIii11Ii
  sys . stderr . write ( i1Ii1i + ": ERROR: XML-RPC error: %s\n" % O0O )
  sys . exit ( 2 )
 except OSError as O0O :
  sys . stderr . write ( i1Ii1i + ": ERROR: Socket error: %s\n" % O0O )
  sys . exit ( 2 )
 finally :
  OO0o0O0o0 ( "close" ) ( )
  if 39 - 39: oOO - oOO * i1 % IIiIIiIi11I1
 return IIi1I1I1i
 if 29 - 29: IIiIIiIi11I1 - ooo000 . i1iiIII111
def oo00oO000 ( ) :
 if 4 - 4: Ooo0Ooo
 if 18 - 18: Ii / ooo000 + I1I + iI1iII1I1I1i
 if 42 - 42: ooOOO - ooOOO - i1i1i1111I
 if len ( sys . argv ) == 1 :
  return "master"
  if 61 - 61: oOO
  if 7 - 7: i1i1i1111I / Ii * Iii1i
 if len ( sys . argv ) == 2 :
  return sys . argv [ 1 ]
  if 32 - 32: IiI11Ii111 . OooOoo
 sys . stderr . write ( i1Ii1i + ": ERROR: Invalid syntax\n" )
 sys . exit ( 1 )
 if 31 - 31: Oo - i1I
def IIIi1111iiIi1 ( ) :
 locale . setlocale ( locale . LC_ALL , "" )
 if 4 - 4: ooo000 % I1I - i1i1i1111I
 if 76 - 76: i1 * oOo0O00 . IiI11Ii111 * i1I . IiIIii11Ii . oOO
 if len ( sys . argv ) == 3 and sys . argv [ 1 ] == '-c' :
  Ooo ( )
  if 55 - 55: i1i1i1111I + i1iiIII111 % Ooo0Ooo . Oo - IiIIii11Ii - iI1iII1I1I1i
  if 91 - 91: I1Ii1I1 - I11iiIi11i1I
 OO00OOooO = hiveconf . open_hive ( "/opt/thinlinc/etc/thinlinc.hconf" )
 if 58 - 58: i1I - IiI11Ii111
 if 86 - 86: Iii1i + i1iiIII111 - IIiIIiIi11I1 / I1I
 if 46 - 46: ooOOO + ooOOO % oOO
 if 2 - 2: i1i1i1111I / Ooo0Ooo / oOO - IIiIIiIi11I1 / IIiIIiIi11I1
 sys . stderr . write ( i1Ii1i + ": HELLO %s\n" % TL_VERSION )
 if 58 - 58: i1i1i1111I
 sys . stderr . flush ( )
 if 38 - 38: i1 - oOo0O00
 if 85 - 85: IIiIIiIi11I1 + I11iiIi11i1I % Ooo0Ooo + oOO * i1iiIII111
 if 46 - 46: ooOOO - ooOOO + Oo / I1I * Oo + oOO
 if 98 - 98: I1I / IIiIIiIi11I1 / i1I + IiI11Ii111 % Oo + I1I
 ooOo00o = oo00oO000 ( )
 if 36 - 36: Ii
 if 71 - 71: OooOoo * IIiIIiIi11I1 * Oo
 if 2 - 2: IIiIIiIi11I1 + iI1iII1I1I1i - I1Ii1I1 + ooOOO . IIiIIiIi11I1
 if 15 - 15: ooo000
 if ooOo00o == "dummy" :
  sys . exit ( 0 )
 elif ooOo00o == "master" :
  pass
 else :
  sys . stderr . write ( i1Ii1i + ": ERROR: Unsupported service: %s\n" % ooOo00o )
  sys . exit ( 2 )
  if 63 - 63: i1I
  if 81 - 81: OooOoo . i1I / i1i1i1111I + Oo / Ooo0Ooo % IiI11Ii111
  if 77 - 77: I11iiIi11i1I / iI1iII1I1I1i - oOo0O00 - Ooo0Ooo % oOo0O00
  if 73 - 73: IiI11Ii111 . Oo * I1I / i1i1i1111I + I1Ii1I1
 IIi1I1I1i = OOO00oO0oOo0O ( OO00OOooO )
 if 31 - 31: i1i1i1111I % I1Ii1I1
 if 1 - 1: IiI11Ii111 - oOo0O00 - i1 . oOo0O00
 if 91 - 91: iI1iII1I1I1i * i1 . ooOOO
 if 81 - 81: I1I * Oo - i1 % OooOoo * ooOOO
 sys . stderr . write ( i1Ii1i + ": CONNECTED MASTER\n" )
 if 19 - 19: Ii
 sys . stderr . flush ( )
 if 22 - 22: i1I % iI1iII1I1I1i + Oo
 if 60 - 60: ooo000 + I11iiIi11i1I + IIiIIiIi11I1 % i1i1i1111I - Ii % Ooo0Ooo
 if 95 - 95: ooOOO % i1i1i1111I . i1
 if 87 - 87: Iii1i % ooOOO * Ii % IIiIIiIi11I1 / I11iiIi11i1I
 IIi1I1I1i . close ( )
 del IIi1I1I1i
 if 84 - 84: I1Ii1I1 + Ooo0Ooo % IIiIIiIi11I1 * i1i1i1111I
 while True :
  if 61 - 61: i1iiIII111 - Oo + I1Ii1I1
  if 43 - 43: IIiIIiIi11I1 * ooo000 + Ii % iI1iII1I1I1i
  if 12 - 12: i1iiIII111 + ooo000 . I11iiIi11i1I
  Iii1I1I1 = Iio0 ( 0 )
  if Iii1I1I1 is None :
   if 57 - 57: I1I
   break
   if 35 - 35: oOo0O00 / IIiIIiIi11I1 - Iii1i . IiI11Ii111 * i1
   if 91 - 91: oOO + Iii1i
   if 71 - 71: i1 . iI1iII1I1I1i . OooOoo . IIiIIiIi11I1
   if 92 - 92: ooOOO % IIiIIiIi11I1 - IIiIIiIi11I1
  IIi1I1I1i = OOO00oO0oOo0O ( OO00OOooO )
  if 32 - 32: OooOoo % I1I - I11iiIi11i1I % OooOoo
  if 9 - 9: i1iiIII111 - ooOOO % Iii1i
  if 37 - 37: i1I + IIiIIiIi11I1 % iI1iII1I1I1i / IIiIIiIi11I1 % i1iiIII111 + oOO
  if 98 - 98: iI1iII1I1I1i - I1I + i1 * ooo000 % i1
  IIi1I1I1i . sendall ( Iii1I1I1 )
  if 100 - 100: i1iiIII111 . IIiIIiIi11I1 * ooo000 * ooo000
  if 85 - 85: IIiIIiIi11I1 / OooOoo . i1I % Oo + Oo - I11iiIi11i1I
  if 59 - 59: OooOoo
  if 53 - 53: i1i1i1111I / ooOOO - IiI11Ii111 + ooo000 * i1i1i1111I * i1iiIII111
  O0O0o0oo00Oo = Iio0 ( IIi1I1I1i . fileno ( ) )
  if O0O0o0oo00Oo is None :
   sys . stderr . write ( i1Ii1i + ": ERROR: Unexpected EOF while reading HTTP message\n" )
   sys . exit ( 2 )
   if 96 - 96: Ooo0Ooo
   if 13 - 13: Oo * I1Ii1I1 - oOo0O00 * Ii . Ii + oOo0O00
   if 46 - 46: OooOoo - I11iiIi11i1I / Ooo0Ooo
   if 73 - 73: I1Ii1I1 / i1i1i1111I / ooo000 % i1 % i1I - OooOoo
  IIi1I1I1i . close ( )
  del IIi1I1I1i
  if 30 - 30: ooOOO * ooOOO - Iii1i * iI1iII1I1I1i
  if 37 - 37: I1Ii1I1 % iI1iII1I1I1i . i1I + Ooo0Ooo + ooOOO * iI1iII1I1I1i
  if 39 - 39: IIiIIiIi11I1 - Oo
  if 31 - 31: IiIIii11Ii % oOo0O00 % oOo0O00 * Iii1i
  sys . stdout . buffer . write ( O0O0o0oo00Oo )
  sys . stdout . buffer . flush ( )
  if 85 - 85: Iii1i + Ii % IIiIIiIi11I1 % oOo0O00
if __name__ == "__main__" :
 IIIi1111iiIi1 ( )
# dd678faae9ac167bc83abf78e5cb2f3f0688d3a3
