diff --git a/server/.settings/org.eclipse.core.resources.prefs b/server/.settings/org.eclipse.core.resources.prefs index aaba9399..2d68760c 100644 --- a/server/.settings/org.eclipse.core.resources.prefs +++ b/server/.settings/org.eclipse.core.resources.prefs @@ -160,6 +160,7 @@ encoding//src/uds/transports/RDP/web.py=utf-8 encoding//src/uds/transports/RGS-enterprise/RGSTransport.py=utf-8 encoding//src/uds/transports/RGS-enterprise/TRGSTransport.py=utf-8 encoding//src/uds/transports/RGS-enterprise/__init__.py=utf-8 +encoding//src/uds/transports/RGS-enterprise/web.py=utf-8 encoding//src/uds/transports/RGS/RGSTransport.py=utf-8 encoding//src/uds/transports/RGS/TRGSTransport.py=utf-8 encoding//src/uds/transports/RGS/__init__.py=utf-8 diff --git a/server/src/uds/core/transports/BaseTransport.py b/server/src/uds/core/transports/BaseTransport.py index 6d26f8f2..6d9c95e4 100644 --- a/server/src/uds/core/transports/BaseTransport.py +++ b/server/src/uds/core/transports/BaseTransport.py @@ -134,11 +134,12 @@ class Transport(Module): ''' return {'protocol': protocols.NONE, 'username': '', 'password': '', 'domain': ''} - def renderForHtml(self, userService, id, ip, os, user, password): + def renderForHtml(self, userService, idUserService, idTransport, ip, os, user, password): ''' Requests the html rendering of connector for the destination ip, (dbUser) and password @param: userService: DeployedUserService for witch we are rendering the connection (db model) - @param id: id of the transport + @param idUserService: id of the user service ((scrambled). You will need this to "notify" anythig to broker (such as log, hostname of client, ip, ...) + @param idTransport: id of the transport (scrambled) @param ip: ip of the destination @param user: user (dbUser) logged in @param pass: password used in authentication diff --git a/server/src/uds/core/util/log.py b/server/src/uds/core/util/log.py index 2372a46b..a287091d 100644 --- a/server/src/uds/core/util/log.py +++ b/server/src/uds/core/util/log.py @@ -30,7 +30,6 @@ ''' @author: Adolfo Gómez, dkmaster at dkmon dot com ''' -from uds.models import UserService, State import logging logger = logging.getLogger(__name__) @@ -55,11 +54,11 @@ __nameLevels = { # Reverse dict of names __valueLevels = dict((v,k) for k, v in __nameLevels.iteritems()) -def logLevelFromStr(str): +def logLevelFromStr(str_): ''' Gets the numeric log level from an string. ''' - return __nameLevels.get(str, OTHER) + return __nameLevels.get(str_.upper(), OTHER) def logStrFromLevel(level): return __valueLevels.get(level, 'OTHER') diff --git a/server/src/uds/transports/NX/NXTransport.py b/server/src/uds/transports/NX/NXTransport.py index 06cd6323..d086405b 100644 --- a/server/src/uds/transports/NX/NXTransport.py +++ b/server/src/uds/transports/NX/NXTransport.py @@ -148,7 +148,7 @@ class NXTransport(Transport): self.cache().put(ip, 'N', READY_CACHE_TIMEOUT) return ready == 'Y' - def renderForHtml(self, userService, theId, ip, os, user, password): + def renderForHtml(self, userService, idUserService, idTransport, ip, os, user, password): prefs = user.prefs('nx') @@ -175,7 +175,7 @@ class NXTransport(Transport): # Fix username/password acording to os manager username, password = userService.processUserPassword(username, password) - return generateHtmlForNX(self, theId, ip, username, password, extra) + return generateHtmlForNX(self, idUserService, idTransport, ip, username, password, extra) def getHtmlComponent(self, theId, os, componentId): # We use helper to keep this clean diff --git a/server/src/uds/transports/NX/web.py b/server/src/uds/transports/NX/web.py index fc7c7f22..790a43e6 100644 --- a/server/src/uds/transports/NX/web.py +++ b/server/src/uds/transports/NX/web.py @@ -53,8 +53,8 @@ def simpleScrambler(data): -def generateHtmlForNX(transport, id, ip, user, password, extra): - applet = reverse('uds.web.views.transcomp', kwargs = { 'idTransport' : id, 'componentId' : '1' }) +def generateHtmlForNX(transport, idUserService, idTransport, ip, user, password, extra): + applet = reverse('uds.web.views.transcomp', kwargs = { 'idTransport' : idTransport, 'componentId' : '1' }) # Gets the codebase, simply remove last char from applet codebase = applet[:-1] # We generate the "data" parameter @@ -68,9 +68,10 @@ def generateHtmlForNX(transport, id, ip, user, password, extra): 'cacheDisk:' + extra['cacheDisk'], 'cacheMem:' + extra['cacheMem'], 'width:' + str(extra['width']), - 'height:' + str(extra['height']) + 'height:' + str(extra['height']), + 'is:' + idUserService ])) - res = '
' % (codebase, '1', data ) + res = '
' % (codebase, '1', data ) res += '

' + _('In order to use this transport, you need to install first Nomachine Nx Client version 3.5.x') + '

' res += '

' + _('you can obtain it for your platform from') + '' + _('nochamine web site') + '

' return res diff --git a/server/src/uds/transports/RDP/RDPTransport.py b/server/src/uds/transports/RDP/RDPTransport.py index 38e40295..8228dfe6 100644 --- a/server/src/uds/transports/RDP/RDPTransport.py +++ b/server/src/uds/transports/RDP/RDPTransport.py @@ -130,7 +130,7 @@ class RDPTransport(Transport): return {'protocol': protocols.RDP, 'username': username, 'password': password, 'domain': domain} - def renderForHtml(self, userService, id, ip, os, user, password): + def renderForHtml(self, userService, idUserService, idTransport, ip, os, user, password): # We use helper to keep this clean username = user.getUsernameForAuth() prefs = user.prefs('rdp') @@ -161,7 +161,7 @@ class RDPTransport(Transport): # Fix username/password acording to os manager username, password = userService.processUserPassword(username, password) - return generateHtmlForRdp(self, id, os, ip, '3389', username, password, domain, extra) + return generateHtmlForRdp(self, idUserService, idTransport, os, ip, '3389', username, password, domain, extra) def getHtmlComponent(self, id, os, componentId): # We use helper to keep this clean diff --git a/server/src/uds/transports/RDP/TSRDPTransport.py b/server/src/uds/transports/RDP/TSRDPTransport.py index 8b743f1d..279fa9d9 100644 --- a/server/src/uds/transports/RDP/TSRDPTransport.py +++ b/server/src/uds/transports/RDP/TSRDPTransport.py @@ -116,7 +116,7 @@ class TSRDPTransport(Transport): self.cache().put(ip, 'N', READY_CACHE_TIMEOUT) return ready == 'Y' - def renderForHtml(self, userService, id, ip, os, user, password): + def renderForHtml(self, userService, idUserService, idTransport, ip, os, user, password): # We use helper to keep this clean username = user.getUsernameForAuth() prefs = user.prefs('rdp') @@ -159,7 +159,7 @@ class TSRDPTransport(Transport): # Fix username/password acording to os manager username, password = userService.processUserPassword(username, password) - return generateHtmlForRdp(self, id, os, ip, '-1', username, password, domain, extra) + return generateHtmlForRdp(self, idUserService, idTransport, os, ip, '-1', username, password, domain, extra) def getHtmlComponent(self, id, os, componentId): # We use helper to keep this clean diff --git a/server/src/uds/transports/RDP/applet/rdp.jar b/server/src/uds/transports/RDP/applet/rdp.jar index 751e4be9..33330f7d 100644 Binary files a/server/src/uds/transports/RDP/applet/rdp.jar and b/server/src/uds/transports/RDP/applet/rdp.jar differ diff --git a/server/src/uds/transports/RDP/web.py b/server/src/uds/transports/RDP/web.py index d57e0290..bc48270d 100644 --- a/server/src/uds/transports/RDP/web.py +++ b/server/src/uds/transports/RDP/web.py @@ -52,9 +52,9 @@ def scramble(data): -def generateHtmlForRdp(transport, id, os, ip, port, user, password, domain, extra): +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' : id, 'componentId' : '1' }) + 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] @@ -72,13 +72,14 @@ def generateHtmlForRdp(transport, id, os, ip, port, user, password, domain, extr 'w:' + str(extra['width']), 'h:' + str(extra['height']), 'c:' + str(extra['depth']), - 'cr:' + (extra['compression'] and '1' or '0') + 'cr:' + (extra['compression'] and '1' or '0'), + 'is:' + idUserService ] if extra.has_key('tun'): data.append('tun:' + extra['tun']) data = scramble('\t'.join(data)) - res = '
' % (codebase, '1', data ) + res = '
' % (codebase, '1', data ) if isMac is True: res += ('

' + _('In order to use this service, you should first install CoRD.') + '

' '

' + _('You can obtain it from') + ' ' + _('CoRD Website') + '

' diff --git a/server/src/uds/transports/TSNX/TSNXTransport.py b/server/src/uds/transports/TSNX/TSNXTransport.py index ecfc38e4..a3ca33d8 100644 --- a/server/src/uds/transports/TSNX/TSNXTransport.py +++ b/server/src/uds/transports/TSNX/TSNXTransport.py @@ -158,7 +158,7 @@ class TSNXTransport(Transport): self.cache().put(ip, 'N', READY_CACHE_TIMEOUT) return ready == 'Y' - def renderForHtml(self, userService, theId, ip, os, user, password): + def renderForHtml(self, userService, idUserService, idTransport, ip, os, user, password): prefs = user.prefs('nx') @@ -194,7 +194,7 @@ class TSNXTransport(Transport): # Fix username/password acording to os manager username, password = userService.processUserPassword(username, password) - return generateHtmlForNX(self, theId, username, password, extra) + return generateHtmlForNX(self, idUserService, idTransport, username, password, extra) def getHtmlComponent(self, theId, os, componentId): # We use helper to keep this clean diff --git a/server/src/uds/transports/TSNX/applet/nxtuntransport.jar b/server/src/uds/transports/TSNX/applet/nxtuntransport.jar index 6ec27d4f..88300eff 100644 Binary files a/server/src/uds/transports/TSNX/applet/nxtuntransport.jar and b/server/src/uds/transports/TSNX/applet/nxtuntransport.jar differ diff --git a/server/src/uds/transports/TSNX/web.py b/server/src/uds/transports/TSNX/web.py index e19beaef..d40ede9e 100644 --- a/server/src/uds/transports/TSNX/web.py +++ b/server/src/uds/transports/TSNX/web.py @@ -52,8 +52,8 @@ def simpleScrambler(data): -def generateHtmlForNX(transport, id, user, password, extra): - applet = reverse('uds.web.views.transcomp', kwargs = { 'idTransport' : id, 'componentId' : '1' }) +def generateHtmlForNX(transport, idUserService, idTransport, user, password, extra): + applet = reverse('uds.web.views.transcomp', kwargs = { 'idTransport' : idTransport, 'componentId' : '1' }) # Gets the codebase, simply remove last char from applet codebase = applet[:-1] # We generate the "data" parameter @@ -67,10 +67,11 @@ def generateHtmlForNX(transport, id, user, password, extra): 'cacheMem:' + extra['cacheMem'], 'width:' + str(extra['width']), 'height:' + str(extra['height']), - 'tun:' + extra['tun'] + 'tun:' + extra['tun'], + 'is:' + idUserService ] data = simpleScrambler( '\t'.join(data)) - res = '
' % (codebase, '1', data ) + res = '
' % (codebase, '1', data ) res += '

In order to use this transport, you need to install first nomachine nx client version 3.5.x

' res += '

you can obtain it for your platform from nochamine web site

' return res diff --git a/server/src/uds/urls.py b/server/src/uds/urls.py index ac4b0307..578cd704 100644 --- a/server/src/uds/urls.py +++ b/server/src/uds/urls.py @@ -45,6 +45,8 @@ urlpatterns = patterns('uds', (r'^error/(?P.+)$', 'web.views.error'), # Transport component url (r'^transcomp/(?P.+)/(?P.+)$', 'web.views.transcomp'), + # Service notification url + (r'^sernotify/(?P.+)/(?P.+)$', 'web.views.sernotify'), # Authenticators custom html (r'^customAuth/(?P.*)$', 'web.views.customAuth'), # Preferences diff --git a/server/src/uds/web/views.py b/server/src/uds/web/views.py index 8ef20f41..444e1c28 100644 --- a/server/src/uds/web/views.py +++ b/server/src/uds/web/views.py @@ -222,7 +222,7 @@ def service(request, idService, idTransport): if ip is not None: itrans = trans.getInstance() if itrans.isAvailableFor(ip): - transport = itrans.renderForHtml(ads, scrambleId(request, trans.id), ip, request.session['OS'], request.user, webPassword(request)) + transport = itrans.renderForHtml(ads, scrambleId(request, ads.id), scrambleId(request, trans.id), ip, request.session['OS'], request.user, webPassword(request)) return render_to_response('uds/show_transport.html', {'transport' : transport, 'nolang' : True }, context_instance=RequestContext(request)) else: logger.debug('Transport is not ready for user service {0}'.format(ads)) @@ -247,6 +247,32 @@ def transcomp(request, idTransport, componentId): return response except Exception, e: return errors.exceptionView(request, e) + +@webLoginRequired +@transformId +def sernotify(request, idUserService, notification): + try: + if notification == 'hostname': + hostname = request.GET.get('hostname', None) + ip = request.GET.get('ip', None) + if ip is not None and hostname is not None: + us = UserService.objects.get(pk=idUserService) + us.setConnectionSource(ip, hostname) + else: + return HttpResponse('Invalid request!', 'text/plain') + elif notification == "log": + message = request.GET.get('message', None) + level = request.GET.get('level', None) + if message is not None and level is not None: + from uds.core.util import log + us = UserService.objects.get(pk=idUserService) + us.doLog(level, message, log.TRANSPORT) + else: + return HttpResponse('Invalid request!', 'text/plain') + except Exception as e: + logger.exception("Exception") + return errors.errorView(request, e) + return HttpResponse('ok', mimetype='text/plain') @transformId diff --git a/server/src/uds/xmlrpc/auths/AdminAuth.py b/server/src/uds/xmlrpc/auths/AdminAuth.py index 90e6f44d..44a44787 100644 --- a/server/src/uds/xmlrpc/auths/AdminAuth.py +++ b/server/src/uds/xmlrpc/auths/AdminAuth.py @@ -45,7 +45,7 @@ logger = logging.getLogger(__name__) ADMIN_AUTH = '#' -CLIENT_VERSION_REQUIRED = '1.0.8' +CLIENT_VERSION_REQUIRED = '1.1.0' class Credentials(object): ''' diff --git a/server/src/uds/xmlrpc/services/UserDeployedServices.py b/server/src/uds/xmlrpc/services/UserDeployedServices.py index f242772e..b8d5e199 100644 --- a/server/src/uds/xmlrpc/services/UserDeployedServices.py +++ b/server/src/uds/xmlrpc/services/UserDeployedServices.py @@ -41,8 +41,13 @@ import logging logger = logging.getLogger(__name__) def dictFromCachedDeployedService(cs): + if cs.publication is not None: + revision = str(cs.publication.revision) + else: + revision = '' + res = { 'idParent' : str(cs.deployed_service_id), 'id' : str(cs.id), 'uniqueId' : cs.unique_id, 'friendlyName' : cs.friendly_name, 'state' : cs.state, 'osState': cs.os_state, 'stateDate' : cs.state_date, - 'creationDate' : cs.creation_date, 'cacheLevel' : str(cs.cache_level), 'revision' : str(cs.publication.revision) } + 'creationDate' : cs.creation_date, 'cacheLevel' : str(cs.cache_level), 'revision' : revision } return res def dictFromAssignedDeployedService(ads): @@ -52,7 +57,8 @@ def dictFromAssignedDeployedService(ads): revision = '' res = { 'idParent' : str(ads.deployed_service_id), 'id' : str(ads.id), 'uniqueId' : ads.unique_id, 'friendlyName' : ads.friendly_name, 'state' : ads.state, 'osState': ads.os_state, 'stateDate' : ads.state_date, - 'creationDate' : ads.creation_date, 'revision' : revision, 'user': ads.user.manager.name + "-" + ads.user.name, 'inUse': ads.in_use, 'inUseDate': ads.in_use_date } + 'creationDate' : ads.creation_date, 'revision' : revision, 'user': ads.user.manager.name + "-" + ads.user.name, 'inUse': ads.in_use, 'inUseDate': ads.in_use_date, + 'sourceHost' : ads.src_hostname, 'sourceIp': ads.src_ip } return res @needs_credentials