From c70d94e866c615cd7b36d65fbed8148983058b8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Mon, 30 Mar 2015 08:11:29 +0200 Subject: [PATCH] Started client part --- client/src/UDSClient.py | 5 ++ client/src/UDSResources.qrc | 6 ++ client/src/UDSWindow.py | 49 ++++++++++ client/src/UDSWindow.ui | 54 +++++++++++ client/src/images/logo-uds-small.png | Bin 0 -> 2285 bytes client/src/images/logo-uds.png | Bin 0 -> 36492 bytes client/src/uds/forward.py | 123 ++++++++++++++++++++++++++ client/src/udsclient/__init__.py | 0 client/src/update.sh | 15 ++++ server/src/uds/REST/methods/client.py | 47 +++------- 10 files changed, 263 insertions(+), 36 deletions(-) create mode 100644 client/src/UDSResources.qrc create mode 100644 client/src/UDSWindow.py create mode 100644 client/src/UDSWindow.ui create mode 100644 client/src/images/logo-uds-small.png create mode 100644 client/src/images/logo-uds.png create mode 100644 client/src/uds/forward.py delete mode 100644 client/src/udsclient/__init__.py create mode 100755 client/src/update.sh diff --git a/client/src/UDSClient.py b/client/src/UDSClient.py index 4a0086f7..18f46f20 100644 --- a/client/src/UDSClient.py +++ b/client/src/UDSClient.py @@ -37,6 +37,7 @@ from PyQt4 import QtCore, QtGui import six from uds.rest import RestRequest +from uds.forward import forward def done(data): @@ -46,6 +47,10 @@ def done(data): if __name__ == "__main__": app = QtGui.QApplication(sys.argv) + if six.PY3 is False: + import threading + threading._DummyThread._Thread__stop = lambda x: 42 + # First parameter must be url try: uri = sys.argv[1] diff --git a/client/src/UDSResources.qrc b/client/src/UDSResources.qrc new file mode 100644 index 00000000..175cfa76 --- /dev/null +++ b/client/src/UDSResources.qrc @@ -0,0 +1,6 @@ + + + images/logo-uds-small.png + images/logo-uds.png + + diff --git a/client/src/UDSWindow.py b/client/src/UDSWindow.py new file mode 100644 index 00000000..c80bfd4f --- /dev/null +++ b/client/src/UDSWindow.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'UDSWindow.ui' +# +# Created: Fri Mar 27 15:03:01 2015 +# by: PyQt4 UI code generator 4.11.2 +# +# WARNING! All changes made in this file will be lost! + +from PyQt4 import QtCore, QtGui + +try: + _fromUtf8 = QtCore.QString.fromUtf8 +except AttributeError: + def _fromUtf8(s): + return s + +try: + _encoding = QtGui.QApplication.UnicodeUTF8 + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig, _encoding) +except AttributeError: + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig) + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName(_fromUtf8("MainWindow")) + MainWindow.resize(282, 185) + self.centralwidget = QtGui.QWidget(MainWindow) + self.centralwidget.setObjectName(_fromUtf8("centralwidget")) + MainWindow.setCentralWidget(self.centralwidget) + + self.retranslateUi(MainWindow) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + + def retranslateUi(self, MainWindow): + MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) + + +if __name__ == "__main__": + import sys + app = QtGui.QApplication(sys.argv) + MainWindow = QtGui.QMainWindow() + ui = Ui_MainWindow() + ui.setupUi(MainWindow) + MainWindow.show() + sys.exit(app.exec_()) + diff --git a/client/src/UDSWindow.ui b/client/src/UDSWindow.ui new file mode 100644 index 00000000..f577a7cd --- /dev/null +++ b/client/src/UDSWindow.ui @@ -0,0 +1,54 @@ + + + MainWindow + + + + 0 + 0 + 282 + 185 + + + + MainWindow + + + + + + + true + + + + + + :/images/logo-uds-small + + + false + + + Qt::AlignCenter + + + + + + + 24 + + + false + + + + + + + + + + + diff --git a/client/src/images/logo-uds-small.png b/client/src/images/logo-uds-small.png new file mode 100644 index 0000000000000000000000000000000000000000..67841a481d1568e8a6f718a2f4ed948f7e99c45e GIT binary patch literal 2285 zcmV+P)?Hf!bII@z%!-5#lQ`~ zl>wOS!vc2gc3Jlpbf+ruvqr=+j>$23T@W49&g*8^yb~I1CHwzcBiH| ze6#wmTr#~0X;hp9XsBd8mo_iJR}6p)^U`7@PU#_D-ny%Q?ZNiUh#6W|)I;qhFEVZ1 z{_MV^rM&cVQH~u{ZJo}l05Z%oqNmSjx51(NihlirD7wO$*|Tb{ zIm~K~^h_q~tfDw|Cs$q)rgEG%mguhqZndKJaezy2n|q_~e7sumdoFBj$h4et_Pz8h zzNXT;qt(YwP9~&*YhF)Mxs44ieWV8@LX6@x_y+LA;DVXnc1-bmUIO({p^jm6q6^;B z{g$L6g4&`O_~lEn6SIkLPK~t-xi=P%+>)(*#yg5axO0Zck0 zpla)MRz8{VL3~f|eGJ9fJp@>${8w}(=dxpO0?!-KlnZPc3n+Cog)Pl~7T9uUZ}t4X zBE{Wa;~7_jC<)GQAobZKI@d6vB28&Y!7}lJ6}4BKx$vDxaPLVa^Uj})o_i3o_r$Vq ze4YN#-TZ5ZhwJ4f{0qPXW4(N+W5Kee*$@7bsh%&Jgtzy6HS^vq*ZejJBkM4II_d5; z6otB(SgGaqB+mekSy4MV{1S57o~o_Wv)T9)jsZ6+ne~4w>YRn*ybl6AeHw~BiJg1X zi0m6X13UuMSy8)ptboQ;r}7d%cv08ZsgHsGpc}rU)YmUXODw}s+qwDL@kd=xK43-d zRr#)IXB^ZJuPt||ty8{)^dA+Hi+rJ&=T0fwwy>u3{snW7ZXe{&sQ@Z?`yGvpv3TSp zotq!gt8afiv|w{v-*%DHXN$ToWP0=s|-Kn+lDMeS#Exu@mH#>x>6 zZvw?R-_HUrwW9X^9Pmm2{{2`ya=jI`cLhIf2>PnEIl3nBdMq9(wW9XpgWOX%ebI)^ zAbcxo{{mP6)CKF4fO23+Q)fl(G_V-x4GuHZ;F*wNS=J0#v3O*P6}8)A@yO4Br(^L* z3y=Vg0Bu&(-U{p-V0RK1^k9;|p+KdBc1DD0(k!iq-R@8pI zkf*!?r#^9M2K+J3v(5?*&=HGAt^zbGYOfpY6k_p6Q7~qT0*}Vxk+wnpDZ|`<5U^wM z$aMumb0zTpXd#TnBc;GYz^hi&?gP#To*SmuZ$)hz*c^Z_IVlvcHO=AL1=|Q*yc&2C zcqd5rX+cKmR@7dUSFIU6c@xo&o5%B$Wz6olCYdV;Ec7=#Dx%?IkEV4C|ukYysL(z^j~)F4Y8U`?Pm zxb{{~1{=ZWc)%eo(9N|gfe(W<_kTKXudlDq`~PS1sgQpIyPTYyGT39v00000NkvXX Hu0mjf3Qlr? literal 0 HcmV?d00001 diff --git a/client/src/images/logo-uds.png b/client/src/images/logo-uds.png new file mode 100644 index 0000000000000000000000000000000000000000..985d21d47ff815718ce7eece5be44df07863fb8c GIT binary patch literal 36492 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 c1pmQh!hMKOP^ zDt67+Ak^l)8jaxk^zA#d^VoD6jp!YS@YaaF+Qp?f?%daJ%fNBhTD z@E1?lrv0i;S5y;5618Xs(9-<@bTZEM2GP8Jr+VFOtEDI0S)zKt(d77W&|J{280 zrYGGySt`rsd}P2xE_iaNi|c!xXtkEZe(*KL#>5HMBG?(CF<-p?EI}#0%3MyPS@S~h z>A)<`bj_QZ_1U4d+h?I`x1Kb;u**MIGhe@BnYRxmxE1^Wf6y+eNWDO)a-pllOFxND zp@H(6NyDt|hjlt*aLvAr211{fcR-J_1%LfUguaE;Jlt~s$Dq0n1?RV>q(_6>`wiwc zrI^cP6@f~aN!UiRl(r|$qKj&mA4FNL%4e6lQ=9OsGB_6BUX|`Hesv6{Vt-28pZJDr zu0VW%YTD&QQLBFQPpScTp<5xfNy7-#J67CwNnb{?TIS}6!q&Oo^7otYhp zu(aB*1&e9*2HfEa7=iz1g!bh!KKBnx=X67R?&}d%`QLUZ7ZPqE2D1SubIylwiiGOSs&m zN#l|#5_*z8oN^xRV%95bn{q7+6)YGlc5Y@dJ(Uu2ZWdouad|rhE1hu1I5g$+%IGjy z8|-m|HRDe_(#M8<MBT z*Jzmha&wE9+7_eXMF<+S48YmT7xmVv&c7bFC;J|+d_h%|mz$e=nZ5kAKOf_$@}y2x zyI*1M-IMIpgM5dS9qFy3(WXJ(rsXi&GM`YYYi9x_js~GWPh6m-5+) zYg?Asd;R-|x7OrI8;j0(Xp0?NHs2xcViT%chB2AuqdllJ#LxJI+$|UU9E(mG=jVU^ zX};;O486|xl+b|P4)UE3$xr8KC%8O%dl^D#yNF$>#&P|P&ji}8iegtFU-MQ`*>-8= zIA)#fKngSZLn}K&Zen^QbWlACvmDNBz)#$6!eLR{`wPVV3R++B7JlO>%bxr>Qn-V? zXg)vP6zP7+3u})ysqNQV8$UK9!koMr@4aLmiC8^q^1nCzaS_jUqHpJ=ribRfwU9b# zOzhsDu#U>LcbaquLNyv?@`SW*me;okr+Ayy8O5n4gTbAbxdbq_DP9fpzJ}33x1X^t zoloMWOK#BnUiT-ru)@@PwZ;&E$(knyujq;ny`w_**Zr1v+urRzEs z@g0Z7K}KfwRZGtN$C2Xy#4JuIW*`hp)45)!f!u!jHHInF>^vgz; zey;ZJ@=EUkZ$f8MI)fqF@Tfc6;nn8~*Fz5qp)OfW>^D^<4SQk3dMA|Mr#Rou=5L!3 zfKb>^UYOy%Ud!*oo3*BV6y>M0gHJj9!aVt}t2(`6->#R>1L(i@*okSPziHyEIsY_v zadbm--l|ibeww;Oo7PN9MO$ZU#VU~W>Z{rN8OCKPYbNR*{5x2khjp7!l>rBZ`F6rka4=ba-<@+$Bk7FPW#|BGL#-?m)G$qw(;&=!YiJK zKRTTuj(U74obm5$7^QBh$E@KY-A*gD*=8~TK!kpilTL^W>SDO9kzss7F(e!eRPOxG zLiz#a71|h}^Z|bq9YWb5flLNq(eyKb|NP$<#r)4_{6DFn`8W9gpYvb3<^PIAphW6_ jo%sKc=(&>k*B`=?G+(30Hjn|n0g-#9^s?-QVbK2u8Z^dx literal 0 HcmV?d00001 diff --git a/client/src/uds/forward.py b/client/src/uds/forward.py new file mode 100644 index 00000000..9df02fd4 --- /dev/null +++ b/client/src/uds/forward.py @@ -0,0 +1,123 @@ +# Based on forward.py from paramiko +# Copyright (C) 2003-2007 Robey Pointer +# https://github.com/paramiko/paramiko/blob/master/demos/forward.py + +from __future__ import unicode_literals + +import select +import SocketServer + +import sys + +import paramiko +import threading + +g_verbose = True + + +class ForwardServer (SocketServer.ThreadingTCPServer): + daemon_threads = True + allow_reuse_address = True + + +class Handler (SocketServer.BaseRequestHandler): + + def handle(self): + try: + chan = self.ssh_transport.open_channel('direct-tcpip', + (self.chain_host, self.chain_port), + self.request.getpeername()) + except Exception as e: + verbose('Incoming request to %s:%d failed: %s' % (self.chain_host, + self.chain_port, + repr(e))) + return + if chan is None: + verbose('Incoming request to %s:%d was rejected by the SSH server.' % + (self.chain_host, self.chain_port)) + return + + verbose('Connected! Tunnel open %r -> %r -> %r' % (self.request.getpeername(), + chan.getpeername(), (self.chain_host, self.chain_port))) + while self.event.is_set() is False: + r, w, x = select.select([self.request, chan], [], [], 1) + + if self.request in r: + data = self.request.recv(1024) + if len(data) == 0: + break + chan.send(data) + if chan in r: + data = chan.recv(1024) + if len(data) == 0: + break + self.request.send(data) + + peername = self.request.getpeername() + chan.close() + self.request.close() + verbose('Tunnel closed from %r' % (peername,)) + + +def verbose(s): + if g_verbose: + print(s) + + +class ForwardThread(threading.Thread): + def __init__(self, server, port, username, password, localPort, redirectHost, redirectPort): + threading.Thread.__init__(self) + self.client = None + self.fs = None + + self.server = server + self.port = int(port) + self.username = username + self.password = password + + self.localPort = int(localPort) + self.redirectHost = redirectHost + self.redirectPort = redirectPort + + self.stopEvent = threading.Event() + + def run(self): + self.client = paramiko.SSHClient() + self.client.load_system_host_keys() + self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + + verbose('Connecting to ssh host %s:%d ...' % (self.server, self.port)) + + self.client.connect(self.server, self.port, username=self.username, password=self.password) + + class SubHander (Handler): + chain_host = self.redirectHost + chain_port = self.redirectPort + ssh_transport = self.client.get_transport() + event = self.stopEvent + + self.fs = ForwardServer(('', self.redirectPort), SubHander) + self.fs.serve_forever() + + def stop(self): + try: + self.stopEvent.set() + self.fs.shutdown() + + if self.client is not None: + self.client.close() + except Exception: + pass + + +def forward(server, port, username, password, localPort, redirectHost, redirectPort): + port, redirectPort = int(port), int(redirectPort) + + + verbose('Connected') + + ft = ForwardThread(server, port, username, password, localPort, redirectHost, redirectPort) + + ft.start() + + return ft diff --git a/client/src/udsclient/__init__.py b/client/src/udsclient/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/client/src/update.sh b/client/src/update.sh new file mode 100755 index 00000000..1429c873 --- /dev/null +++ b/client/src/update.sh @@ -0,0 +1,15 @@ +#!/bin/bash + + +function process { + for a in *.ui; do + pyuic4 $a -o `basename $a .ui`.py -x + done +} + +pyrcc4 -py3 UDSResources.qrc -o UDSResources_rc.py + + +# process current directory ui's +process + diff --git a/server/src/uds/REST/methods/client.py b/server/src/uds/REST/methods/client.py index b7fd00ee..b1de8d5f 100644 --- a/server/src/uds/REST/methods/client.py +++ b/server/src/uds/REST/methods/client.py @@ -57,6 +57,7 @@ logger = logging.getLogger(__name__) CLIENT_VERSION = '1.7.0' REQUIRED_CLIENT_VERSION = '1.7.0' + # Enclosed methods under /actor path class Client(Handler): ''' @@ -106,44 +107,18 @@ class Client(Handler): except Exception: return Client.result(error=errors.ACCESS_DENIED) - password = cryptoManager().xor(self._args[1], data['password']).decode('utf-8') - user = User.objects.get(uuid=data['user']) - userService = UserService.objects.get(uuid=data['service']) - transport = Transport.objects.get(uuid=data['transport']) + self._request.user = User.objects.get(uuid=data['user']) try: - logger.debug('idService: {}, idTransport: {}, user: {}'.format(data['service'], data['transport'], data['user'])) + res = getService(self._request, data['service'], data['transport']) + if res is not None: + ip, userService, userServiceInstance, transport, transportInstance = res + password = cryptoManager().xor(self._args[1], data['password']).decode('utf-8') - if userService.isInMaintenance(): - return Client.result(error=errors.SERVICE_IN_MAINTENANCE) - - logger.debug('Found service: {0}'.format(userService)) - - # Test if the service is ready - if userService.isReady(): - log.doLog(userService, log.INFO, "User {0} from {1} has initiated access".format(user.name, self._request.ip), log.WEB) - # If ready, show transport for this service, if also ready ofc - userServiceIntance = userService.getInstance() - ip = userServiceIntance.getIp() - events.addEvent(userService.deployed_service, events.ET_ACCESS, username=user.name, srcip=self._request.ip, dstip=ip, uniqueid=userService.unique_id) - if ip is not None: - transportInstance = transport.getInstance() - if transportInstance.isAvailableFor(ip): - userService.setConnectionSource(self._request.ip, 'unknown') - log.doLog(userService, log.INFO, "User service ready, rendering transport", log.WEB) - UserServiceManager.manager().notifyPreconnect(userService, transportInstance.processedUser(userService, user), transportInstance.protocol) - transportInfo = transportInstance.getUDSTransportData(userService, transport, ip, self.request.os, user, password, self._request) - return Client.result(transportInfo) - else: - log.doLog(userService, log.WARN, "User service is not accessible (ip {0})".format(ip), log.TRANSPORT) - logger.debug('Transport is not ready for user service {0}'.format(userService)) - else: - logger.debug('Ip not available from user service {0}'.format(userService)) - else: - log.doLog(userService, log.WARN, "User {0} from {1} tried to access, but machine was not ready".format(user.name, self._request.ip), log.WEB) - # Not ready, show message and return to this page in a while - return Client.result(error=errors.SERVICE_NOT_READY) - except Exception: + transportInfo = transportInstance.getUDSTransportData(userService, transport, ip, self.request.os, self._request.user, password, self._request) + return Client.result(transportInfo) + except Exception as e: logger.exception("Exception") + return Client.result(error=six.text_type(e)) - raise RequestError('Request error') + return Client.result(error=errors.SERVICE_NOT_READY)