mirror of
https://github.com/dkmstr/openuds.git
synced 2024-12-22 13:34:04 +03:00
Fixed so now UDSClient can run with python 2 or python 3
This commit is contained in:
parent
26e429019e
commit
142f7122fc
@ -30,21 +30,22 @@
|
|||||||
'''
|
'''
|
||||||
@author: Adolfo Gómez, dkmaster at dkmon dot com
|
@author: Adolfo Gómez, dkmaster at dkmon dot com
|
||||||
'''
|
'''
|
||||||
|
# pylint: disable=c-extension-no-member
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
import webbrowser
|
||||||
|
import json
|
||||||
|
|
||||||
from PyQt4 import QtCore, QtGui # @UnresolvedImport
|
from PyQt4 import QtCore, QtGui # @UnresolvedImport
|
||||||
import six
|
import six
|
||||||
|
|
||||||
from uds.rest import RestRequest
|
from uds.rest import RestRequest
|
||||||
from uds.forward import forward
|
from uds.forward import forward # pylint: disable=unused-import
|
||||||
from uds.log import logger
|
from uds.log import logger
|
||||||
from uds import tools
|
from uds import tools
|
||||||
from uds import VERSION
|
from uds import VERSION
|
||||||
|
|
||||||
import webbrowser
|
|
||||||
import json
|
|
||||||
|
|
||||||
from UDSWindow import Ui_MainWindow
|
from UDSWindow import Ui_MainWindow
|
||||||
|
|
||||||
# Server before this version uses "unsigned" scripts
|
# Server before this version uses "unsigned" scripts
|
||||||
@ -62,6 +63,7 @@ class UDSClient(QtGui.QMainWindow):
|
|||||||
anim = 0
|
anim = 0
|
||||||
animInverted = False
|
animInverted = False
|
||||||
serverVersion = 'X.Y.Z' # Will be overwriten on getVersion
|
serverVersion = 'X.Y.Z' # Will be overwriten on getVersion
|
||||||
|
req = None
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
QtGui.QMainWindow.__init__(self)
|
QtGui.QMainWindow.__init__(self)
|
||||||
@ -103,8 +105,8 @@ class UDSClient(QtGui.QMainWindow):
|
|||||||
# self.closeWindow()
|
# self.closeWindow()
|
||||||
# return
|
# return
|
||||||
|
|
||||||
def showError(self, e):
|
def showError(self, error):
|
||||||
logger.error('got error: {}'.format(e))
|
logger.error('got error: %s', error)
|
||||||
self.stopAnim()
|
self.stopAnim()
|
||||||
self.ui.info.setText('UDS Plugin Error') # In fact, main window is hidden, so this is not visible... :)
|
self.ui.info.setText('UDS Plugin Error') # In fact, main window is hidden, so this is not visible... :)
|
||||||
self.closeWindow()
|
self.closeWindow()
|
||||||
@ -169,7 +171,7 @@ class UDSClient(QtGui.QMainWindow):
|
|||||||
self.req = RestRequest('/{}/{}'.format(self.ticket, self.scrambler), self, self.transportDataReceived, params={'hostname': tools.getHostName(), 'version': VERSION})
|
self.req = RestRequest('/{}/{}'.format(self.ticket, self.scrambler), self, self.transportDataReceived, params={'hostname': tools.getHostName(), 'version': VERSION})
|
||||||
self.req.get()
|
self.req.get()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception('Got exception: {}'.format(e))
|
logger.exception('Got exception on getTransportData')
|
||||||
raise e
|
raise e
|
||||||
|
|
||||||
|
|
||||||
@ -254,17 +256,17 @@ def done(data):
|
|||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
# Ask user to approve endpoint
|
# Ask user to approve endpoint
|
||||||
def approveHost(host, parentWindow=None):
|
def approveHost(hostName, parentWindow=None):
|
||||||
settings = QtCore.QSettings()
|
settings = QtCore.QSettings()
|
||||||
settings.beginGroup('endpoints')
|
settings.beginGroup('endpoints')
|
||||||
|
|
||||||
approved = settings.value(host, False).toBool()
|
approved = settings.value(hostName, False).toBool()
|
||||||
|
|
||||||
errorString = '<p>The server <b>{}</b> must be approved:</p>'.format(host)
|
errorString = '<p>The server <b>{}</b> must be approved:</p>'.format(hostName)
|
||||||
errorString += '<p>Only approve UDS servers that you trust to avoid security issues.</p>'
|
errorString += '<p>Only approve UDS servers that you trust to avoid security issues.</p>'
|
||||||
|
|
||||||
if approved or QtGui.QMessageBox.warning(parentWindow, 'ACCESS Warning', errorString, QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
|
if approved or QtGui.QMessageBox.warning(parentWindow, 'ACCESS Warning', errorString, QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
|
||||||
settings.setValue(host, True)
|
settings.setValue(hostName, True)
|
||||||
approved = True
|
approved = True
|
||||||
|
|
||||||
settings.endGroup()
|
settings.endGroup()
|
||||||
@ -286,7 +288,7 @@ if __name__ == "__main__":
|
|||||||
if six.PY3 is False:
|
if six.PY3 is False:
|
||||||
logger.debug('Fixing threaded execution of commands')
|
logger.debug('Fixing threaded execution of commands')
|
||||||
import threading
|
import threading
|
||||||
threading._DummyThread._Thread__stop = lambda x: 42
|
threading._DummyThread._Thread__stop = lambda x: 42 # type: ignore, pylint: disable=protected-access
|
||||||
|
|
||||||
# First parameter must be url
|
# First parameter must be url
|
||||||
try:
|
try:
|
||||||
@ -295,14 +297,13 @@ if __name__ == "__main__":
|
|||||||
if uri == '--test':
|
if uri == '--test':
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
logger.debug('URI: {}'.format(uri))
|
logger.debug('URI: %s', uri)
|
||||||
if uri[:6] != 'uds://' and uri[:7] != 'udss://':
|
if uri[:6] != 'uds://' and uri[:7] != 'udss://':
|
||||||
raise Exception()
|
raise Exception()
|
||||||
|
|
||||||
ssl = uri[3] == 's'
|
ssl = uri[3] == 's'
|
||||||
host, UDSClient.ticket, UDSClient.scrambler = uri.split('//')[1].split('/')
|
host, UDSClient.ticket, UDSClient.scrambler = uri.split('//')[1].split('/') # type: ignore
|
||||||
logger.debug('ssl: {}, host:{}, ticket:{}, scrambler:{}'.format(ssl, host, UDSClient.ticket, UDSClient.scrambler))
|
logger.debug('ssl:%s, host:%s, ticket:%s, scrambler:%s', ssl, host, UDSClient.ticket, UDSClient.scrambler)
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.debug('Detected execution without valid URI, exiting')
|
logger.debug('Detected execution without valid URI, exiting')
|
||||||
QtGui.QMessageBox.critical(None, 'Notice', 'UDS Client Version {}'.format(VERSION), QtGui.QMessageBox.Ok)
|
QtGui.QMessageBox.critical(None, 'Notice', 'UDS Client Version {}'.format(VERSION), QtGui.QMessageBox.Ok)
|
||||||
@ -310,7 +311,7 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
# Setup REST api endpoint
|
# Setup REST api endpoint
|
||||||
RestRequest.restApiUrl = '{}://{}/rest/client'.format(['http', 'https'][ssl], host)
|
RestRequest.restApiUrl = '{}://{}/rest/client'.format(['http', 'https'][ssl], host)
|
||||||
logger.debug('Setting request URL to {}'.format(RestRequest.restApiUrl))
|
logger.debug('Setting request URL to %s', RestRequest.restApiUrl)
|
||||||
# RestRequest.restApiUrl = 'https://172.27.0.1/rest/client'
|
# RestRequest.restApiUrl = 'https://172.27.0.1/rest/client'
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -323,7 +324,6 @@ if __name__ == "__main__":
|
|||||||
win = UDSClient()
|
win = UDSClient()
|
||||||
win.show()
|
win.show()
|
||||||
|
|
||||||
|
|
||||||
win.start()
|
win.start()
|
||||||
|
|
||||||
exitVal = app.exec_()
|
exitVal = app.exec_()
|
||||||
@ -336,4 +336,3 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
logger.debug('Exiting')
|
logger.debug('Exiting')
|
||||||
sys.exit(exitVal)
|
sys.exit(exitVal)
|
||||||
|
|
||||||
|
@ -31,9 +31,6 @@
|
|||||||
'''
|
'''
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
# On centos, old six release does not includes byte2int, nor six.PY2
|
|
||||||
import six
|
|
||||||
|
|
||||||
VERSION = '3.0.0'
|
VERSION = '3.0.0'
|
||||||
|
|
||||||
__title__ = 'udclient'
|
__title__ = 'udclient'
|
||||||
|
@ -4,22 +4,28 @@
|
|||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import select
|
|
||||||
import SocketServer
|
|
||||||
|
|
||||||
import paramiko
|
|
||||||
import threading
|
import threading
|
||||||
import random
|
import random
|
||||||
import time
|
import time
|
||||||
|
import select
|
||||||
|
|
||||||
|
import paramiko
|
||||||
|
import six
|
||||||
|
|
||||||
from .log import logger
|
from .log import logger
|
||||||
|
|
||||||
class ForwardServer(SocketServer.ThreadingTCPServer):
|
if six.PY2:
|
||||||
|
import SocketServer as socketserver # pylint: disable=import-error
|
||||||
|
else:
|
||||||
|
import socketserver
|
||||||
|
|
||||||
|
|
||||||
|
class ForwardServer(socketserver.ThreadingTCPServer):
|
||||||
daemon_threads = True
|
daemon_threads = True
|
||||||
allow_reuse_address = True
|
allow_reuse_address = True
|
||||||
|
|
||||||
|
|
||||||
class Handler(SocketServer.BaseRequestHandler):
|
class Handler(socketserver.BaseRequestHandler):
|
||||||
|
|
||||||
def handle(self):
|
def handle(self):
|
||||||
self.thread.currentConnections += 1
|
self.thread.currentConnections += 1
|
||||||
@ -29,29 +35,25 @@ class Handler(SocketServer.BaseRequestHandler):
|
|||||||
(self.chain_host, self.chain_port),
|
(self.chain_host, self.chain_port),
|
||||||
self.request.getpeername())
|
self.request.getpeername())
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception('Incoming request to %s:%d failed: %s' % (self.chain_host,
|
logger.exception('Incoming request to %s:%d failed: %s', self.chain_host, self.chain_port, repr(e))
|
||||||
self.chain_port,
|
|
||||||
repr(e)))
|
|
||||||
return
|
return
|
||||||
if chan is None:
|
if chan is None:
|
||||||
logger.error('Incoming request to %s:%d was rejected by the SSH server.' %
|
logger.error('Incoming request to %s:%d was rejected by the SSH server.', self.chain_host, self.chain_port)
|
||||||
(self.chain_host, self.chain_port))
|
|
||||||
return
|
return
|
||||||
|
|
||||||
logger.debug('Connected! Tunnel open %r -> %r -> %r' % (self.request.getpeername(),
|
logger.debug('Connected! Tunnel open %r -> %r -> %r', self.request.getpeername(), chan.getpeername(), (self.chain_host, self.chain_port))
|
||||||
chan.getpeername(), (self.chain_host, self.chain_port)))
|
|
||||||
try:
|
try:
|
||||||
while self.event.is_set() is False:
|
while self.event.is_set() is False:
|
||||||
r, _w, _x = select.select([self.request, chan], [], [], 1)
|
r, _w, _x = select.select([self.request, chan], [], [], 1) # pylint: disable=unused-variable
|
||||||
|
|
||||||
if self.request in r:
|
if self.request in r:
|
||||||
data = self.request.recv(1024)
|
data = self.request.recv(1024)
|
||||||
if len(data) == 0:
|
if not data:
|
||||||
break
|
break
|
||||||
chan.send(data)
|
chan.send(data)
|
||||||
if chan in r:
|
if chan in r:
|
||||||
data = chan.recv(1024)
|
data = chan.recv(1024)
|
||||||
if len(data) == 0:
|
if not data:
|
||||||
break
|
break
|
||||||
self.request.send(data)
|
self.request.send(data)
|
||||||
except Exception:
|
except Exception:
|
||||||
@ -61,7 +63,7 @@ class Handler(SocketServer.BaseRequestHandler):
|
|||||||
peername = self.request.getpeername()
|
peername = self.request.getpeername()
|
||||||
chan.close()
|
chan.close()
|
||||||
self.request.close()
|
self.request.close()
|
||||||
logger.debug('Tunnel closed from %r' % (peername,))
|
logger.debug('Tunnel closed from %r', peername,)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -114,7 +116,7 @@ class ForwardThread(threading.Thread):
|
|||||||
|
|
||||||
def _timerFnc(self):
|
def _timerFnc(self):
|
||||||
self.timer = None
|
self.timer = None
|
||||||
logger.debug('Timer fnc: {}'.format(self.currentConnections))
|
logger.debug('Timer fnc: %s', self.currentConnections)
|
||||||
self.stoppable = True
|
self.stoppable = True
|
||||||
if self.currentConnections <= 0:
|
if self.currentConnections <= 0:
|
||||||
self.stop()
|
self.stop()
|
||||||
@ -126,11 +128,11 @@ class ForwardThread(threading.Thread):
|
|||||||
self.client.load_system_host_keys()
|
self.client.load_system_host_keys()
|
||||||
self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||||
|
|
||||||
logger.debug('Connecting to ssh host %s:%d ...' % (self.server, self.port))
|
logger.debug('Connecting to ssh host %s:%d ...', self.server, self.port)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.client.connect(self.server, self.port, username=self.username, password=self.password, timeout=5)
|
self.client.connect(self.server, self.port, username=self.username, password=self.password, timeout=5)
|
||||||
except Exception as e:
|
except Exception:
|
||||||
logger.exception('Exception connecting: ')
|
logger.exception('Exception connecting: ')
|
||||||
self.status = 2 # Error
|
self.status = 2 # Error
|
||||||
return
|
return
|
||||||
@ -142,7 +144,7 @@ class ForwardThread(threading.Thread):
|
|||||||
event = self.stopEvent
|
event = self.stopEvent
|
||||||
thread = self
|
thread = self
|
||||||
|
|
||||||
logger.debug('Wait Time: {}'.format(self.waitTime))
|
logger.debug('Wait Time: %s', self.waitTime)
|
||||||
self.timer = threading.Timer(self.waitTime, self._timerFnc)
|
self.timer = threading.Timer(self.waitTime, self._timerFnc)
|
||||||
self.timer.start()
|
self.timer.start()
|
||||||
|
|
||||||
@ -166,7 +168,6 @@ class ForwardThread(threading.Thread):
|
|||||||
self.client = None # Clean up
|
self.client = None # Clean up
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.exception('Exception stopping')
|
logger.exception('Exception stopping')
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def forward(server, port, username, password, redirectHost, redirectPort, localPort=None, waitTime=10):
|
def forward(server, port, username, password, redirectHost, redirectPort, localPort=None, waitTime=10):
|
||||||
@ -179,8 +180,8 @@ def forward(server, port, username, password, redirectHost, redirectPort, localP
|
|||||||
if localPort is None:
|
if localPort is None:
|
||||||
localPort = random.randrange(40000, 50000)
|
localPort = random.randrange(40000, 50000)
|
||||||
|
|
||||||
logger.debug('Connecting to {}:{} using {}/{} redirecting to {}:{}, listening on 127.0.0.1:{}'.format(
|
logger.debug('Connecting to %s:%s using %s/%s redirecting to %s:%s, listening on 127.0.0.1:%s',
|
||||||
server, port, username, password, redirectHost, redirectPort, localPort))
|
server, port, username, password, redirectHost, redirectPort, localPort)
|
||||||
|
|
||||||
ft = ForwardThread(server, port, username, password, localPort, redirectHost, redirectPort, waitTime)
|
ft = ForwardThread(server, port, username, password, localPort, redirectHost, redirectPort, waitTime)
|
||||||
|
|
||||||
@ -190,4 +191,3 @@ def forward(server, port, username, password, redirectHost, redirectPort, localP
|
|||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
|
|
||||||
return (ft, localPort)
|
return (ft, localPort)
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ import sys
|
|||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
if sys.platform.startswith('linux'):
|
if sys.platform.startswith('linux'):
|
||||||
from os.path import expanduser
|
from os.path import expanduser # pylint: disable=ungrouped-imports
|
||||||
logFile = expanduser('~/udsclient.log')
|
logFile = expanduser('~/udsclient.log')
|
||||||
else:
|
else:
|
||||||
logFile = os.path.join(tempfile.gettempdir(), b'udsclient.log')
|
logFile = os.path.join(tempfile.gettempdir(), b'udsclient.log')
|
||||||
|
@ -34,16 +34,15 @@ from __future__ import unicode_literals
|
|||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
|
||||||
LINUX = 'Linux'
|
LINUX = 'Linux'
|
||||||
WINDOWS = 'Windows'
|
WINDOWS = 'Windows'
|
||||||
MAC_OS_X = 'Mac os x'
|
MAC_OS_X = 'Mac os x'
|
||||||
|
|
||||||
|
|
||||||
def getOs():
|
def getOs():
|
||||||
if sys.platform.startswith('linux'):
|
if sys.platform.startswith('linux'):
|
||||||
return LINUX
|
return LINUX
|
||||||
elif sys.platform.startswith('win'):
|
if sys.platform.startswith('win'):
|
||||||
return WINDOWS
|
return WINDOWS
|
||||||
elif sys.platform.startswith('darwin'):
|
if sys.platform.startswith('darwin'):
|
||||||
return MAC_OS_X
|
return MAC_OS_X
|
||||||
|
return 'other'
|
||||||
|
@ -30,19 +30,24 @@
|
|||||||
'''
|
'''
|
||||||
@author: Adolfo Gómez, dkmaster at dkmon dot com
|
@author: Adolfo Gómez, dkmaster at dkmon dot com
|
||||||
'''
|
'''
|
||||||
|
# pylint: disable=c-extension-no-member,no-name-in-module
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import json
|
||||||
|
import urllib
|
||||||
|
|
||||||
|
import six
|
||||||
|
|
||||||
from PyQt4.QtCore import pyqtSignal, pyqtSlot
|
from PyQt4.QtCore import pyqtSignal, pyqtSlot
|
||||||
from PyQt4.QtCore import QObject, QUrl, QSettings
|
from PyQt4.QtCore import QObject, QUrl, QSettings
|
||||||
from PyQt4.QtCore import Qt
|
from PyQt4.QtCore import Qt
|
||||||
from PyQt4.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply, QSslCertificate
|
from PyQt4.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply, QSslCertificate
|
||||||
from PyQt4.QtGui import QMessageBox
|
from PyQt4.QtGui import QMessageBox
|
||||||
|
|
||||||
|
from . import osDetector
|
||||||
|
|
||||||
from . import VERSION
|
from . import VERSION
|
||||||
|
|
||||||
import json
|
|
||||||
import osDetector
|
|
||||||
import six
|
|
||||||
import urllib
|
|
||||||
|
|
||||||
|
|
||||||
class RestRequest(QObject):
|
class RestRequest(QObject):
|
||||||
|
@ -40,11 +40,12 @@ import random
|
|||||||
import os
|
import os
|
||||||
import socket
|
import socket
|
||||||
import stat
|
import stat
|
||||||
import six
|
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from log import logger
|
import six
|
||||||
|
|
||||||
|
from .log import logger
|
||||||
|
|
||||||
_unlinkFiles = []
|
_unlinkFiles = []
|
||||||
_tasksToWait = []
|
_tasksToWait = []
|
||||||
@ -132,7 +133,7 @@ def getHostName():
|
|||||||
hostname = hostname.decode(sys_fs_enc)
|
hostname = hostname.decode(sys_fs_enc)
|
||||||
|
|
||||||
hostname = six.text_type(hostname)
|
hostname = six.text_type(hostname)
|
||||||
logger.info('Hostname: {}'.format(hostname))
|
logger.info('Hostname: %s', hostname)
|
||||||
return hostname
|
return hostname
|
||||||
|
|
||||||
# Queing operations (to be executed before exit)
|
# Queing operations (to be executed before exit)
|
||||||
@ -149,8 +150,9 @@ def unlinkFiles():
|
|||||||
'''
|
'''
|
||||||
Removes all wait-and-unlink files
|
Removes all wait-and-unlink files
|
||||||
'''
|
'''
|
||||||
if len(_unlinkFiles) > 0:
|
if _unlinkFiles:
|
||||||
time.sleep(5) # Wait 5 seconds before deleting anything
|
time.sleep(5) # Wait 5 seconds before deleting anything
|
||||||
|
|
||||||
for f in _unlinkFiles:
|
for f in _unlinkFiles:
|
||||||
try:
|
try:
|
||||||
os.unlink(f)
|
os.unlink(f)
|
||||||
|
Loading…
Reference in New Issue
Block a user