forked from shaba/openuds
Advancing on transports & client fixes
This commit is contained in:
parent
c3316a4745
commit
6b19e75ce7
@ -36,6 +36,7 @@ import tempfile
|
||||
import string
|
||||
import random
|
||||
import os
|
||||
import sys
|
||||
import stat
|
||||
|
||||
_unlinkFiles = []
|
||||
@ -54,8 +55,12 @@ def saveTempFile(content, filename=None):
|
||||
return filename
|
||||
|
||||
|
||||
def findApp(appName):
|
||||
for path in os.environ['PATH'].split(os.pathsep):
|
||||
def findApp(appName, extraPath=None):
|
||||
searchPath = os.environ['PATH'].split(os.pathsep)
|
||||
if extraPath is not None:
|
||||
searchPath += extraPath
|
||||
|
||||
for path in searchPath:
|
||||
fileName = os.path.join(path, appName)
|
||||
if os.path.isfile(fileName) and (os.stat(fileName).st_mode & stat.S_IXUSR) != 0:
|
||||
return fileName
|
||||
|
@ -163,7 +163,14 @@ class Transport(Module):
|
||||
If this is an uds transport, this will return the tranport script needed for executing
|
||||
this on client
|
||||
'''
|
||||
return ''
|
||||
return '''
|
||||
from __future__ import unicode_literals
|
||||
|
||||
# pylint: disable=import-error, no-name-in-module, too-many-format-args, undefined-variable, invalid-sequence-index
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
QtGui.QMessageBox.critical(parent, 'Not supported', 'The transport {transport.name} is not supported on your platform.', QtGui.QMessageBox.Ok)
|
||||
'''.format(service=userService, transport=transport)
|
||||
|
||||
def getLink(self, userService, transport, ip, os, user, password, request):
|
||||
'''
|
||||
@ -172,41 +179,5 @@ class Transport(Module):
|
||||
'''
|
||||
return None
|
||||
|
||||
def renderAsHtml(self, userService, transport, ip, request):
|
||||
os, user, password = OsDetector.getOsFromRequest(request), request.user, webPassword(request)
|
||||
info = self.getUDSTransportInfo(userService, transport, ip, os, user, password, request)
|
||||
if info is not None:
|
||||
ticket = Ticket(data=info)
|
||||
template = loader.get_template('uds/transport/udslink.html')
|
||||
if request.is_secure():
|
||||
uri = 'udss://'
|
||||
else:
|
||||
uri = 'uds://'
|
||||
uri += request.build_absolute_uri('/').split('//')[1] # Remove http or https
|
||||
uri += ticket.key
|
||||
return template.render(context=Context({'ticket': ticket, 'request': request, 'uri': uri}))
|
||||
|
||||
return self.renderForHtml(userService, transport, ip, os, user, password)
|
||||
|
||||
def renderForHtml(self, userService, transport, ip, os, user, password):
|
||||
'''
|
||||
Requests the html rendering of connector for the destination ip, (dbUser) and password
|
||||
@param: userService: UserService for witch we are rendering the connection (db model)
|
||||
@param transport: Transport (self db model)
|
||||
@param ip: ip of the destination
|
||||
@param user: user (dbUser) logged in
|
||||
@param pass: password used in authentication
|
||||
'''
|
||||
return _('Transport empty')
|
||||
|
||||
def getHtmlComponent(self, id, os, componentId): # @ReservedAssignment
|
||||
'''
|
||||
This is a method to let the transport add own components (images, applets, or whatever) to the rendered html
|
||||
The reference to object will be the access to the uds.web.views.transcomp, with parameters transportId = ourTransportId and
|
||||
componentId = one id recognized by this method
|
||||
We expect an return array, with first parameter as mime/type and second the content to return
|
||||
'''
|
||||
return ['text/plain', '']
|
||||
|
||||
def __str__(self):
|
||||
return "Base OS Manager"
|
||||
|
@ -39,7 +39,6 @@ from .BaseRDPTransport import BaseRDPTransport
|
||||
from .RDPFile import RDPFile
|
||||
|
||||
import logging
|
||||
import os
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@ -140,7 +139,7 @@ class RDPTransport(BaseRDPTransport):
|
||||
|
||||
}.get(m.os)
|
||||
|
||||
if os == '':
|
||||
return '' # In fact, should return an error, but this will be fine right now
|
||||
if os is None:
|
||||
return super(RDPTransport, self).getUDSTransportScript(self, userService, transport, ip, os, user, password, request)
|
||||
|
||||
return self.getScript('scripts/{}/direct.py'.format(os)).format(m=m)
|
||||
|
@ -165,7 +165,7 @@ class TSRDPTransport(BaseRDPTransport):
|
||||
|
||||
}.get(m.os)
|
||||
|
||||
if os == '':
|
||||
return '' # In fact, should return an error, but this will be fine right now
|
||||
if os is None:
|
||||
return super(TSRDPTransport, self).getUDSTransportScript(self, userService, transport, ip, os, user, password, request)
|
||||
|
||||
return self.getScript('scripts/{}/tunnel.py'.format(os)).format(m=m)
|
||||
|
@ -18,6 +18,6 @@ theFile = '''{m.r.as_file}'''.format(password=win32crypt.CryptProtectData(six.bi
|
||||
filename = tools.saveTempFile(theFile)
|
||||
executable = tools.findApp('mstsc.exe')
|
||||
subprocess.call([executable, filename])
|
||||
# tools.addFileToUnlink(filename)
|
||||
tools.addFileToUnlink(filename)
|
||||
|
||||
# QtGui.QMessageBox.critical(parent, 'Notice', filename + ", " + executable, QtGui.QMessageBox.Ok)
|
||||
|
@ -1,121 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
#
|
||||
# Copyright (c) 2012 Virtual Cable S.L.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without modification,
|
||||
# are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of Virtual Cable S.L. nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
'''
|
||||
@author: Adolfo Gómez, dkmaster at dkmon dot com
|
||||
'''
|
||||
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.core.urlresolvers import reverse
|
||||
from uds.core.util import OsDetector
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def scramble(data):
|
||||
'''
|
||||
Simple scrambler so password are not seen at source page
|
||||
'''
|
||||
res = []
|
||||
n = 0x32
|
||||
for c in data[::-1]:
|
||||
res.append(chr(ord(c) ^ n))
|
||||
n = (n + ord(c)) & 0xFF
|
||||
return "".join(res).encode('hex')
|
||||
|
||||
|
||||
def generateHtmlForRdp(transport, idUserService, idTransport, os, ip, port, user, password, domain, extra):
|
||||
isMac = os['OS'] == OsDetector.Macintosh
|
||||
applet = reverse('uds.web.views.transcomp', kwargs={'idTransport': idTransport, 'componentId': '1'})
|
||||
logger.debug('Applet: {0}'.format(applet))
|
||||
# Gets the codebase, simply remove last char from applet
|
||||
codebase = applet[:-1]
|
||||
# We generate the "data" parameter
|
||||
data = [
|
||||
'u:' + user,
|
||||
'p:' + password,
|
||||
'd:' + domain,
|
||||
's:' + ip,
|
||||
'po:' + port,
|
||||
'sc:' + (extra['smartcards'] and '1' or '0'),
|
||||
'pr:' + (extra['printers'] and '1' or '0'),
|
||||
'se:' + (extra['serials'] and '1' or '0'),
|
||||
'dr:' + (extra['drives'] and '1' or '0'),
|
||||
'au:' + '1', # Audio, 0 do not play, 1 play
|
||||
'w:' + str(extra['width']),
|
||||
'h:' + str(extra['height']),
|
||||
'c:' + str(extra['depth']),
|
||||
'cr:' + (extra['compression'] and '1' or '0'),
|
||||
'is:' + idUserService,
|
||||
'sw:' + (extra['wallpaper'] and '1' or '0'),
|
||||
'mm:' + (extra['multimon'] and '1' or '0'),
|
||||
]
|
||||
|
||||
logger.debug('Data: {0}'.format(data))
|
||||
|
||||
if 'tun' in extra:
|
||||
data.append('tun:' + extra['tun'])
|
||||
|
||||
data = scramble('\t'.join(data))
|
||||
res = '<div id="applet"><applet code="RdpApplet.class" codebase="%s" archive="%s" width="200" height="22"><param name="data" value="%s"/><param name="permissions" value="all-permissions"/></applet></div>' % (codebase, '1', data)
|
||||
if isMac is True:
|
||||
res += ('<div><p>' + _('In order to use this service, you should first install CoRD.') + '</p>'
|
||||
'<p><a href="/static/other/CoRD.pkg">' + _('Download CoRD') + '</a></p>'
|
||||
'</div>'
|
||||
'<div>'
|
||||
'<p>' + _('Attention Safari Users:') + '<br/>'
|
||||
'<p>' + _('In order to access theese services, you will need to enable this in order to access to service:') + '</p>'
|
||||
'<p>' + _('Go to Safari > Preferences > Security > Manage Website Settings') + '</p>'
|
||||
'<p>' + _('Click Java in left hand panel, and select site to allow UDS Rdp, and set it to Allow Always (also mark "Unsecure mode").') + '</p>'
|
||||
'<p>' + _('Users of Firefox or Chrome:') + '</p>'
|
||||
'<p>' + _('If any warning is shown when launching RDP Applet, press "ignore" and continue') + '</p>'
|
||||
'</div>'
|
||||
)
|
||||
return res
|
||||
|
||||
|
||||
def getHtmlComponent(module, componentId):
|
||||
filesDict = {
|
||||
'1': ['rdp.jar', 'application/java-archive'],
|
||||
'2': ['rdppass.dll', 'application/x-msdos-program'],
|
||||
'3': ['launcher.jar', 'application/java-archive']
|
||||
}
|
||||
|
||||
if componentId not in filesDict:
|
||||
return ['text/plain', 'no component']
|
||||
fname = os.path.dirname(sys.modules[module].__file__) + '/applet/' + filesDict[componentId][0]
|
||||
logger.debug('Loading component {0} from {1}'.format(componentId, fname))
|
||||
|
||||
with open(fname, 'rb') as f:
|
||||
data = f.read()
|
||||
|
||||
return [filesDict[componentId][1], data]
|
Loading…
Reference in New Issue
Block a user