From f7888468c0abbc637ec0d3f391e00c08e9a686ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Mon, 12 Sep 2022 14:21:55 +0200 Subject: [PATCH] Refactorizing gui variables --- server/src/tests/core/ui/__init__.py | 30 ++++++++++ server/src/uds/REST/dispatcher.py | 6 +- server/src/uds/REST/methods/authenticators.py | 2 +- server/src/uds/REST/methods/meta_pools.py | 10 ++-- server/src/uds/REST/methods/transports.py | 4 +- server/src/uds/REST/model.py | 4 +- server/src/uds/auths/IP/authenticator.py | 4 +- .../src/uds/auths/InternalDB/authenticator.py | 6 +- server/src/uds/auths/Radius/authenticator.py | 8 +-- .../src/uds/auths/RegexLdap/authenticator.py | 6 +- server/src/uds/auths/SAML/saml.py | 4 +- .../src/uds/auths/SimpleLDAP/authenticator.py | 4 +- server/src/uds/core/auths/authfactory.py | 1 - server/src/uds/core/ui/user_interface.py | 53 +++++++++++++---- server/src/uds/core/util/decorators.py | 57 ++++++++++++++----- server/src/uds/mfas/Sample/mfa.py | 2 +- .../LinuxOsManager/linux_osmanager.py | 2 +- .../osmanagers/WindowsOsManager/windows.py | 2 +- server/src/uds/services/OVirt/provider.py | 8 +-- server/src/uds/services/OpenGnsys/provider.py | 8 +-- server/src/uds/services/OpenGnsys/service.py | 2 +- .../src/uds/services/OpenNebula/provider.py | 6 +- server/src/uds/services/OpenStack/provider.py | 14 ++--- .../uds/services/OpenStack/provider_legacy.py | 8 +-- .../uds/services/PhysicalMachines/provider.py | 2 +- .../PhysicalMachines/service_multi.py | 8 +-- server/src/uds/services/Proxmox/provider.py | 8 +-- server/src/uds/services/Xen/provider.py | 10 ++-- .../src/uds/transports/HTML5RDP/html5rdp.py | 42 +++++++------- .../src/uds/transports/HTML5VNC/html5vnc.py | 20 +++---- server/src/uds/transports/RDP/rdp_base.py | 46 +++++++-------- server/src/uds/transports/RDP/rdptunnel.py | 6 +- server/src/uds/transports/SPICE/spice_base.py | 14 ++--- .../src/uds/transports/SPICE/spicetunnel.py | 6 +- server/src/uds/transports/Test/transport.py | 2 +- server/src/uds/transports/URL/url_custom.py | 2 +- server/src/uds/transports/X2GO/x2go_base.py | 22 +++---- server/src/uds/transports/X2GO/x2gotunnel.py | 6 +- 38 files changed, 267 insertions(+), 178 deletions(-) create mode 100644 server/src/tests/core/ui/__init__.py diff --git a/server/src/tests/core/ui/__init__.py b/server/src/tests/core/ui/__init__.py new file mode 100644 index 00000000..bf4da903 --- /dev/null +++ b/server/src/tests/core/ui/__init__.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2022 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 +""" diff --git a/server/src/uds/REST/dispatcher.py b/server/src/uds/REST/dispatcher.py index daf48caf..8cea2a9c 100644 --- a/server/src/uds/REST/dispatcher.py +++ b/server/src/uds/REST/dispatcher.py @@ -91,7 +91,7 @@ class Dispatcher(View): service = Dispatcher.services full_path_lst: typing.List[str] = [] # Guess content type from content type header (post) or ".xxx" to method - content_type: str = request.META.get('CONTENT_TYPE', 'json') + content_type: str = request.META.get('CONTENT_TYPE', 'application/json').split(';')[0] while path: clean_path = path[0] @@ -111,13 +111,13 @@ class Dispatcher(View): logger.debug("REST request: %s (%s)", full_path, content_type) # Here, service points to the path and the value of '' is the handler - cls: typing.Optional[typing.Type[Handler]] = service[''] + cls: typing.Optional[typing.Type[Handler]] = service[''] # Get "root" class, that is stored on if not cls: return http.HttpResponseNotFound( 'Method not found', content_type="text/plain" ) - processor = processors.available_processors_ext_dict.get( + processor = processors.available_processors_mime_dict .get( content_type, processors.default_processor )(request) diff --git a/server/src/uds/REST/methods/authenticators.py b/server/src/uds/REST/methods/authenticators.py index 3e22e7f2..d2438959 100644 --- a/server/src/uds/REST/methods/authenticators.py +++ b/server/src/uds/REST/methods/authenticators.py @@ -139,7 +139,7 @@ class Authenticators(ModelHandler): ), 'type': gui.InputField.CHOICE_TYPE, 'order': 108, - 'tab': gui.MFA_TAB, + 'tab': gui.Tab.MFA, }, ) return field diff --git a/server/src/uds/REST/methods/meta_pools.py b/server/src/uds/REST/methods/meta_pools.py index 9a7e90c6..5e662e21 100644 --- a/server/src/uds/REST/methods/meta_pools.py +++ b/server/src/uds/REST/methods/meta_pools.py @@ -181,7 +181,7 @@ class MetaPools(ModelHandler): 'tooltip': gettext('Image assocciated with this service'), 'type': gui.InputField.IMAGECHOICE_TYPE, 'order': 120, - 'tab': gui.DISPLAY_TAB, + 'tab': gui.Tab.DISPLAY, }, { 'name': 'servicesPoolGroup_id', @@ -198,7 +198,7 @@ class MetaPools(ModelHandler): ), 'type': gui.InputField.IMAGECHOICE_TYPE, 'order': 121, - 'tab': gui.DISPLAY_TAB, + 'tab': gui.Tab.DISPLAY, }, { 'name': 'visible', @@ -207,7 +207,7 @@ class MetaPools(ModelHandler): 'tooltip': gettext('If active, metapool will be visible for users'), 'type': gui.InputField.CHECKBOX_TYPE, 'order': 123, - 'tab': gui.DISPLAY_TAB, + 'tab': gui.Tab.DISPLAY, }, { 'name': 'calendar_message', @@ -218,7 +218,7 @@ class MetaPools(ModelHandler): ), 'type': gui.InputField.TEXT_TYPE, 'order': 124, - 'tab': gui.DISPLAY_TAB, + 'tab': gui.Tab.DISPLAY, }, { 'name': 'transport_grouping', @@ -230,7 +230,7 @@ class MetaPools(ModelHandler): 'tooltip': gettext('Transport selection policy'), 'type': gui.InputField.CHOICE_TYPE, 'order': 125, - 'tab': gui.DISPLAY_TAB, + 'tab': gui.Tab.DISPLAY, }, ]: self.addField(localGUI, field) diff --git a/server/src/uds/REST/methods/transports.py b/server/src/uds/REST/methods/transports.py index 437fa0f6..fc7ebf17 100644 --- a/server/src/uds/REST/methods/transports.py +++ b/server/src/uds/REST/methods/transports.py @@ -106,7 +106,7 @@ class Transports(ModelHandler): 'If empty, any kind of device compatible with this transport will be allowed. Else, only devices compatible with selected values will be allowed' ), 'type': 'multichoice', - 'tab': gui.ADVANCED_TAB, + 'tab': gui.Tab.ADVANCED, 'order': 102, }, ) @@ -138,7 +138,7 @@ class Transports(ModelHandler): ), 'type': 'text', 'order': 201, - 'tab': gettext(gui.ADVANCED_TAB), + 'tab': gettext(gui.Tab.ADVANCED), }, ) diff --git a/server/src/uds/REST/model.py b/server/src/uds/REST/model.py index 49bac112..da7e1bc7 100644 --- a/server/src/uds/REST/model.py +++ b/server/src/uds/REST/model.py @@ -222,7 +222,7 @@ class BaseModelHandler(Handler): ), 'type': 'choice', 'order': 100, # At end - 'tab': uiGui.ADVANCED_TAB, + 'tab': uiGui.Tab.ADVANCED, }, ) self.addField( @@ -240,7 +240,7 @@ class BaseModelHandler(Handler): ), 'type': 'multichoice', 'order': 101, - 'tab': uiGui.ADVANCED_TAB, + 'tab': uiGui.Tab.ADVANCED, }, ) diff --git a/server/src/uds/auths/IP/authenticator.py b/server/src/uds/auths/IP/authenticator.py index 88f0f20d..2b270763 100644 --- a/server/src/uds/auths/IP/authenticator.py +++ b/server/src/uds/auths/IP/authenticator.py @@ -54,7 +54,7 @@ class IPAuth(auths.Authenticator): 'If checked, requests via proxy will get FORWARDED ip address' ' (take care with this bein checked, can take internal IP addresses from internet)' ), - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) visibleFromNets = gui.TextField( @@ -64,7 +64,7 @@ class IPAuth(auths.Authenticator): tooltip=_( 'This authenticator will be visible only from these networks. Leave empty to allow all networks' ), - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) typeName = _('IP Authenticator') diff --git a/server/src/uds/auths/InternalDB/authenticator.py b/server/src/uds/auths/InternalDB/authenticator.py index c8cc92f1..2ca00123 100644 --- a/server/src/uds/auths/InternalDB/authenticator.py +++ b/server/src/uds/auths/InternalDB/authenticator.py @@ -73,7 +73,7 @@ class InternalDBAuth(auths.Authenticator): tooltip=_('If checked, each host will have a different user name'), defvalue='false', rdonly=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) reverseDns = gui.CheckBoxField( label=_('Reverse DNS'), @@ -81,7 +81,7 @@ class InternalDBAuth(auths.Authenticator): tooltip=_('If checked, the host will be reversed dns'), defvalue='false', rdonly=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) acceptProxy = gui.CheckBoxField( label=_('Accept proxy'), @@ -90,7 +90,7 @@ class InternalDBAuth(auths.Authenticator): tooltip=_( 'If checked, requests via proxy will get FORWARDED ip address (take care with this bein checked, can take internal IP addresses from internet)' ), - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) def getIp(self, request: 'ExtendedHttpRequest') -> str: diff --git a/server/src/uds/auths/Radius/authenticator.py b/server/src/uds/auths/Radius/authenticator.py index fa3b2e64..8d28fc89 100644 --- a/server/src/uds/auths/Radius/authenticator.py +++ b/server/src/uds/auths/Radius/authenticator.py @@ -91,7 +91,7 @@ class RadiusAuth(auths.Authenticator): order=10, tooltip=_('NAS Identifier for Radius Server'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) appClassPrefix = gui.TextField( @@ -100,7 +100,7 @@ class RadiusAuth(auths.Authenticator): defvalue='', order=11, tooltip=_('Application prefix for filtering groups from "Class" attribute'), - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) globalGroup = gui.TextField( @@ -109,7 +109,7 @@ class RadiusAuth(auths.Authenticator): defvalue='', order=12, tooltip=_('If set, this value will be added as group for all radius users'), - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) mfaAttr = gui.TextField( length=2048, @@ -118,7 +118,7 @@ class RadiusAuth(auths.Authenticator): order=13, tooltip=_('Attribute from where to extract the MFA code'), required=False, - tab=gui.MFA_TAB, + tab=gui.Tab.MFA, ) def initialize(self, values: typing.Optional[typing.Dict[str, typing.Any]]) -> None: diff --git a/server/src/uds/auths/RegexLdap/authenticator.py b/server/src/uds/auths/RegexLdap/authenticator.py index 9708d162..10f5849d 100644 --- a/server/src/uds/auths/RegexLdap/authenticator.py +++ b/server/src/uds/auths/RegexLdap/authenticator.py @@ -91,7 +91,7 @@ class RegexLdap(auths.Authenticator): order=4, tooltip=_('Username with read privileges on the base selected'), required=True, - tab=gui.CREDENTIALS_TAB, + tab=gui.Tab.CREDENTIALS, ) password = gui.PasswordField( lenth=32, @@ -99,7 +99,7 @@ class RegexLdap(auths.Authenticator): order=5, tooltip=_('Password of the ldap user'), required=True, - tab=gui.CREDENTIALS_TAB, + tab=gui.Tab.CREDENTIALS, ) timeout = gui.NumericField( length=3, @@ -182,7 +182,7 @@ class RegexLdap(auths.Authenticator): order=13, tooltip=_('Attribute from where to extract the MFA code'), required=False, - tab=gui.MFA_TAB, + tab=gui.Tab.MFA, ) typeName = _('Regex LDAP Authenticator') diff --git a/server/src/uds/auths/SAML/saml.py b/server/src/uds/auths/SAML/saml.py index 054e3144..e64079b2 100644 --- a/server/src/uds/auths/SAML/saml.py +++ b/server/src/uds/auths/SAML/saml.py @@ -193,7 +193,7 @@ class SAMLAuthenticator(auths.Authenticator): defvalue=False, order=10, tooltip=_('If set, logout from UDS will trigger SAML logout'), - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) adFS = gui.CheckBoxField( @@ -201,7 +201,7 @@ class SAMLAuthenticator(auths.Authenticator): defvalue=False, order=11, tooltip=_('If set, enable lowercase url encoding so ADFS can work correctly'), - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) checkSSLCertificate = gui.CheckBoxField( diff --git a/server/src/uds/auths/SimpleLDAP/authenticator.py b/server/src/uds/auths/SimpleLDAP/authenticator.py index ab0ee071..3cf2e19d 100644 --- a/server/src/uds/auths/SimpleLDAP/authenticator.py +++ b/server/src/uds/auths/SimpleLDAP/authenticator.py @@ -82,7 +82,7 @@ class SimpleLDAPAuthenticator(auths.Authenticator): order=4, tooltip=_('Username with read privileges on the base selected'), required=True, - tab=gui.CREDENTIALS_TAB, + tab=gui.Tab.CREDENTIALS, ) password = gui.PasswordField( lenth=32, @@ -90,7 +90,7 @@ class SimpleLDAPAuthenticator(auths.Authenticator): order=5, tooltip=_('Password of the ldap user'), required=True, - tab=gui.CREDENTIALS_TAB, + tab=gui.Tab.CREDENTIALS, ) timeout = gui.NumericField( length=3, diff --git a/server/src/uds/core/auths/authfactory.py b/server/src/uds/core/auths/authfactory.py index 41237c2f..70e56c17 100644 --- a/server/src/uds/core/auths/authfactory.py +++ b/server/src/uds/core/auths/authfactory.py @@ -30,7 +30,6 @@ """ @author: Adolfo Gómez, dkmaster at dkmon dot com """ -import imp import typing from uds.core.util import factory diff --git a/server/src/uds/core/ui/user_interface.py b/server/src/uds/core/ui/user_interface.py index 2f8d2691..620d119b 100644 --- a/server/src/uds/core/ui/user_interface.py +++ b/server/src/uds/core/ui/user_interface.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (c) 2012-2021 Virtual Cable S.L.U. +# Copyright (c) 2012-2022 Virtual Cable S.L.U. # All rights reserved. # # Redistribution and use in source and binary forms, with or without modification, @@ -33,16 +33,18 @@ import codecs import datetime import time -import pickle +import pickle # nosec: safe usage import copy import typing import logging +import enum from collections import abc from django.utils.translation import get_language, gettext as _, gettext_noop from django.conf import settings from uds.core.managers import cryptoManager +from uds.core.util.decorators import deprecatedClassValue logger = logging.getLogger(__name__) @@ -101,18 +103,45 @@ class gui: ] ChoiceType = typing.Dict[str, str] + # : True string value TRUE: typing.ClassVar[str] = 'true' # : False string value FALSE: typing.ClassVar[str] = 'false' - # : String for advanced tabs - ADVANCED_TAB: typing.ClassVar[str] = gettext_noop('Advanced') - PARAMETERS_TAB: typing.ClassVar[str] = gettext_noop('Parameters') - CREDENTIALS_TAB: typing.ClassVar[str] = gettext_noop('Credentials') - TUNNEL_TAB: typing.ClassVar[str] = gettext_noop('Tunnel') - DISPLAY_TAB: typing.ClassVar[str] = gettext_noop('Display') - MFA_TAB: typing.ClassVar[str] = gettext_noop('MFA') + + class Tab(enum.Enum): + ADVANCED = gettext_noop('Advanced') + PARAMETERS = gettext_noop('Parameters') + CREDENTIALS = gettext_noop('Credentials') + TUNNEL = gettext_noop('Tunnel') + DISPLAY = gettext_noop('Display') + MFA = gettext_noop('MFA') + + def __str__(self) -> str: + return str(self.value) + + + # : For backward compatibility, will be removed in future versions + # For now, will log an warning if used + @deprecatedClassValue('gui.Tab.ADVANCED') + def ADVANCED_TAB(cls) -> str: + return str(gui.Tab.ADVANCED) + @deprecatedClassValue('gui.Tab.PARAMETERS') + def PARAMETERS_TAB(cls) -> str: + return str(gui.Tab.PARAMETERS) + @deprecatedClassValue('gui.Tab.CREDENTIALS') + def CREDENTIALS_TAB(cls) -> str: + return str(gui.Tab.CREDENTIALS) + @deprecatedClassValue('gui.Tab.TUNNEL') + def TUNNEL_TAB(cls) -> str: + return str(gui.Tab.TUNNEL) + @deprecatedClassValue('gui.Tab.DISPLAY') + def DISPLAY_TAB(cls) -> str: + return str(gui.Tab.DISPLAY) + @deprecatedClassValue('gui.Tab.MFA') + def MFA_TAB(cls) -> str: + return str(gui.Tab.MFA) # : Static Callbacks simple registry callbacks: typing.Dict[ @@ -296,7 +325,7 @@ class gui: 'value': options.get('value', ''), } if 'tab' in options: - self._data['tab'] = options.get('tab') + self._data['tab'] = str(options.get('tab')) # Ensure it's a string def _type(self, type_: str) -> None: """ @@ -360,7 +389,7 @@ class gui: data['label'] = _(data['label']) if data['label'] else '' data['tooltip'] = _(data['tooltip']) if data['tooltip'] else '' if 'tab' in data: - data['tab'] = _(data['tab']) + data['tab'] = _(data['tab']) # Translates tab name return data @property @@ -1142,7 +1171,7 @@ class UserInterface(metaclass=UserInterfaceType): if k in self._gui: try: if v.startswith(MULTIVALUE_FIELD): - val = pickle.loads(v[1:]) + val = pickle.loads(v[1:]) # nosec: secure pickled by us for sure elif v.startswith(OLD_PASSWORD_FIELD): val = cryptoManager().AESDecrypt(v[1:], UDSB, True).decode() elif v.startswith(PASSWORD_FIELD): diff --git a/server/src/uds/core/util/decorators.py b/server/src/uds/core/util/decorators.py index ace1a8ff..8ec7de2e 100644 --- a/server/src/uds/core/util/decorators.py +++ b/server/src/uds/core/util/decorators.py @@ -30,38 +30,42 @@ """ @author: Adolfo Gómez, dkmaster at dkmon dot com """ -from functools import wraps +import functools import logging import inspect import typing import threading -from uds.core.util.html import checkBrowser -from uds.core.util.cache import Cache -from uds.web.util import errors +if typing.TYPE_CHECKING: + from uds.core.util.cache import Cache logger = logging.getLogger(__name__) RT = typing.TypeVar('RT') +def _defaultDenyView(request) -> typing.Any: + from uds.web.util import errors + return errors.errorView( + request, errors.BROWSER_NOT_SUPPORTED + ) + # Decorator that protects pages that needs at least a browser version # Default is to deny IE < 9 def denyBrowsers( browsers: typing.Optional[typing.List[str]] = None, - errorResponse: typing.Callable = lambda request: errors.errorView( - request, errors.BROWSER_NOT_SUPPORTED - ), + errorResponse: typing.Callable = _defaultDenyView, ) -> typing.Callable[[typing.Callable[..., RT]], typing.Callable[..., RT]]: """ Decorator to set protection to access page Look for samples at uds.core.web.views """ + from uds.core.util.html import checkBrowser denied: typing.List[str] = browsers or ['ie<9'] def wrap(view_func: typing.Callable[..., RT]) -> typing.Callable[..., RT]: - @wraps(view_func) + @functools.wraps(view_func) def _wrapped_view(request, *args, **kwargs) -> RT: """ Wrapped function for decorator @@ -82,7 +86,7 @@ def deprecated(func: typing.Callable[..., RT]) -> typing.Callable[..., RT]: as deprecated. It will result in a warning being emitted when the function is used.""" - @wraps(func) + @functools.wraps(func) def new_func(*args, **kwargs) -> RT: try: caller = inspect.stack()[1] @@ -99,11 +103,37 @@ def deprecated(func: typing.Callable[..., RT]) -> typing.Callable[..., RT]: return new_func +def deprecatedClassValue(newVarName: str) -> typing.Callable: + class innerDeprecated: + fget: typing.Callable + new_var_name: str + + def __init__(self, method: typing.Callable, newVarName: str) -> None: + self.new_var_name = newVarName + self.fget = method # type: ignore + + def __get__(self, instance, cls=None): + try: + caller = inspect.stack()[1] + logger.warning( + 'Use of deprecated class value %s from %s:%s. Use %s instead.', + self.fget.__name__, + caller[1], + caller[2], + self.new_var_name, + ) + except Exception: + logger.info('No stack info on deprecated value use %s', self.fget.__name__) + + return self.fget(cls) + + return functools.partial(innerDeprecated, newVarName=newVarName) + def ensureConected(func: typing.Callable[..., RT]) -> typing.Callable[..., RT]: """This decorator calls "connect" method of the class of the wrapped object""" - @wraps(func) + @functools.wraps(func) def new_func(*args, **kwargs) -> RT: args[0].connect() return func(*args, **kwargs) @@ -117,7 +147,7 @@ def ensureConected(func: typing.Callable[..., RT]) -> typing.Callable[..., RT]: # Decorator that tries to get from cache before executing def allowCache( cachePrefix: str, - cacheTimeout: typing.Union[typing.Callable[[], int], int] = Cache.DEFAULT_VALIDITY, + cacheTimeout: typing.Union[typing.Callable[[], int], int] = -1, cachingArgs: typing.Optional[ typing.Union[typing.List[int], typing.Tuple[int], int] ] = None, @@ -136,10 +166,11 @@ def allowCache( :param cachingKWArgs: The caching kwargs. Can be a single string or a list. :param cachingKeyFnc: A function that receives the args and kwargs and returns the key """ + cacheTimeout = Cache.DEFAULT_VALIDITY if cacheTimeout == -1 else cacheTimeout keyFnc = cachingKeyFnc or (lambda x: '') def allowCacheDecorator(fnc: typing.Callable[..., RT]) -> typing.Callable[..., RT]: - @wraps(fnc) + @functools.wraps(fnc) def wrapper(*args, **kwargs) -> RT: argList: typing.List[str] = [] if cachingArgs: @@ -202,7 +233,7 @@ def allowCache( def threaded(func: typing.Callable[..., None]) -> typing.Callable[..., None]: """Decorator to execute method in a thread""" - @wraps(func) + @functools.wraps(func) def wrapper(*args, **kwargs) -> None: thread = threading.Thread(target=func, args=args, kwargs=kwargs) thread.start() diff --git a/server/src/uds/mfas/Sample/mfa.py b/server/src/uds/mfas/Sample/mfa.py index 9e932402..2843684c 100644 --- a/server/src/uds/mfas/Sample/mfa.py +++ b/server/src/uds/mfas/Sample/mfa.py @@ -55,7 +55,7 @@ class SampleMFA(mfas.MFA): tooltip=_( 'This is a useless field, for sample and testing pourposes' ), - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, defvalue=gui.TRUE, ) diff --git a/server/src/uds/osmanagers/LinuxOsManager/linux_osmanager.py b/server/src/uds/osmanagers/LinuxOsManager/linux_osmanager.py index 2a72e214..c7dc0b04 100644 --- a/server/src/uds/osmanagers/LinuxOsManager/linux_osmanager.py +++ b/server/src/uds/osmanagers/LinuxOsManager/linux_osmanager.py @@ -91,7 +91,7 @@ class LinuxOsManager(osmanagers.OSManager): tooltip=_( 'If checked, UDS will try to logout user when the calendar for his current access expires' ), - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, defvalue=gui.TRUE, ) diff --git a/server/src/uds/osmanagers/WindowsOsManager/windows.py b/server/src/uds/osmanagers/WindowsOsManager/windows.py index 5193f5ca..7acc71fb 100644 --- a/server/src/uds/osmanagers/WindowsOsManager/windows.py +++ b/server/src/uds/osmanagers/WindowsOsManager/windows.py @@ -82,7 +82,7 @@ class WindowsOsManager(osmanagers.OSManager): tooltip=_( 'If checked, UDS will try to logout user when the calendar for his current access expires' ), - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, defvalue=gui.TRUE, ) diff --git a/server/src/uds/services/OVirt/provider.py b/server/src/uds/services/OVirt/provider.py index 886e8b1e..8dd6d3b9 100644 --- a/server/src/uds/services/OVirt/provider.py +++ b/server/src/uds/services/OVirt/provider.py @@ -141,7 +141,7 @@ class OVirtProvider( order=50, tooltip=_('Maximum number of concurrently creating VMs'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) maxRemovingServices = gui.NumericField( length=3, @@ -152,7 +152,7 @@ class OVirtProvider( order=51, tooltip=_('Maximum number of concurrently removing VMs'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) timeout = gui.NumericField( @@ -162,7 +162,7 @@ class OVirtProvider( order=90, tooltip=_('Timeout in seconds of connection to oVirt'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) macsRange = gui.TextField( length=36, @@ -172,7 +172,7 @@ class OVirtProvider( rdonly=True, tooltip=_('Range of valid macs for UDS managed machines'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) # Own variables diff --git a/server/src/uds/services/OpenGnsys/provider.py b/server/src/uds/services/OpenGnsys/provider.py index d6c2d084..42504367 100644 --- a/server/src/uds/services/OpenGnsys/provider.py +++ b/server/src/uds/services/OpenGnsys/provider.py @@ -136,7 +136,7 @@ class OGProvider(ServiceProvider): order=6, tooltip=_('URL used by OpenGnsys to access UDS. If empty, UDS will guess it.'), required=False, - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) maxPreparingServices = gui.NumericField( @@ -148,7 +148,7 @@ class OGProvider(ServiceProvider): order=50, tooltip=_('Maximum number of concurrently creating VMs'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) maxRemovingServices = gui.NumericField( length=3, @@ -159,7 +159,7 @@ class OGProvider(ServiceProvider): order=51, tooltip=_('Maximum number of concurrently removing VMs'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) timeout = gui.NumericField( @@ -169,7 +169,7 @@ class OGProvider(ServiceProvider): order=90, tooltip=_('Timeout in seconds of connection to OpenGnsys'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) # Own variables diff --git a/server/src/uds/services/OpenGnsys/service.py b/server/src/uds/services/OpenGnsys/service.py index ab832e8f..1ba78fe8 100644 --- a/server/src/uds/services/OpenGnsys/service.py +++ b/server/src/uds/services/OpenGnsys/service.py @@ -154,7 +154,7 @@ class OGService(Service): rdonly=False, tooltip=_('Maximum number of allowed services (0 or less means no limit)'), required=True, - tab=gui.ADVANCED_TAB + tab=gui.Tab.ADVANCED ) ov = gui.HiddenField(value=None) diff --git a/server/src/uds/services/OpenNebula/provider.py b/server/src/uds/services/OpenNebula/provider.py index 893436d2..f1adbb19 100644 --- a/server/src/uds/services/OpenNebula/provider.py +++ b/server/src/uds/services/OpenNebula/provider.py @@ -119,7 +119,7 @@ class OpenNebulaProvider(ServiceProvider): # pylint: disable=too-many-public-me order=50, tooltip=_('Maximum number of concurrently creating VMs'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) maxRemovingServices = gui.NumericField( length=3, @@ -130,7 +130,7 @@ class OpenNebulaProvider(ServiceProvider): # pylint: disable=too-many-public-me order=51, tooltip=_('Maximum number of concurrently removing VMs'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) timeout = gui.NumericField( @@ -140,7 +140,7 @@ class OpenNebulaProvider(ServiceProvider): # pylint: disable=too-many-public-me order=90, tooltip=_('Timeout in seconds of connection to OpenNebula'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) # Own variables diff --git a/server/src/uds/services/OpenStack/provider.py b/server/src/uds/services/OpenStack/provider.py index 345d4387..cedd1ea9 100644 --- a/server/src/uds/services/OpenStack/provider.py +++ b/server/src/uds/services/OpenStack/provider.py @@ -149,7 +149,7 @@ class OpenStackProvider(ServiceProvider): order=50, tooltip=_('Maximum number of concurrently creating VMs'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) maxRemovingServices = gui.NumericField( length=3, @@ -160,7 +160,7 @@ class OpenStackProvider(ServiceProvider): order=51, tooltip=_('Maximum number of concurrently removing VMs'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) timeout = gui.NumericField( @@ -172,7 +172,7 @@ class OpenStackProvider(ServiceProvider): order=99, tooltip=_('Timeout in seconds of connection to OpenStack'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) tenant = gui.TextField( @@ -184,7 +184,7 @@ class OpenStackProvider(ServiceProvider): ), required=False, defvalue='', - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) region = gui.TextField( length=64, @@ -193,7 +193,7 @@ class OpenStackProvider(ServiceProvider): tooltip=_('Region for this provider. Set only if required by server.'), required=False, defvalue='', - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) useSubnetsName = gui.CheckBoxField( @@ -203,7 +203,7 @@ class OpenStackProvider(ServiceProvider): 'If checked, the name of the subnets will be used instead of the names of networks' ), defvalue=gui.FALSE, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) httpsProxy = gui.TextField( @@ -214,7 +214,7 @@ class OpenStackProvider(ServiceProvider): 'Proxy used on server connections for HTTPS connections (use PROTOCOL://host:port, i.e. http://10.10.0.1:8080)' ), required=False, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) legacy = False diff --git a/server/src/uds/services/OpenStack/provider_legacy.py b/server/src/uds/services/OpenStack/provider_legacy.py index 21dce732..f77ed1f7 100644 --- a/server/src/uds/services/OpenStack/provider_legacy.py +++ b/server/src/uds/services/OpenStack/provider_legacy.py @@ -165,7 +165,7 @@ class ProviderLegacy(ServiceProvider): order=50, tooltip=_('Maximum number of concurrently creating VMs'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) maxRemovingServices = gui.NumericField( length=3, @@ -176,7 +176,7 @@ class ProviderLegacy(ServiceProvider): order=51, tooltip=_('Maximum number of concurrently removing VMs'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) timeout = gui.NumericField( @@ -188,7 +188,7 @@ class ProviderLegacy(ServiceProvider): order=99, tooltip=_('Timeout in seconds of connection to OpenStack'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) httpsProxy = gui.TextField( @@ -199,7 +199,7 @@ class ProviderLegacy(ServiceProvider): 'Proxy used for connection to azure for HTTPS connections (use PROTOCOL://host:port, i.e. http://10.10.0.1:8080)' ), required=False, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) # tenant = gui.TextField(length=64, label=_('Project'), order=6, tooltip=_('Project (tenant) for this provider'), required=True, defvalue='') diff --git a/server/src/uds/services/PhysicalMachines/provider.py b/server/src/uds/services/PhysicalMachines/provider.py index ffa13ef3..02f1b90f 100644 --- a/server/src/uds/services/PhysicalMachines/provider.py +++ b/server/src/uds/services/PhysicalMachines/provider.py @@ -60,7 +60,7 @@ class PhysicalMachinesProvider(services.ServiceProvider): order=3, tooltip=_('Advanced configuration data for the provider'), required=False, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) def initialize(self, values: 'Module.ValuesType') -> None: diff --git a/server/src/uds/services/PhysicalMachines/service_multi.py b/server/src/uds/services/PhysicalMachines/service_multi.py index 438abe84..a54fd663 100644 --- a/server/src/uds/services/PhysicalMachines/service_multi.py +++ b/server/src/uds/services/PhysicalMachines/service_multi.py @@ -82,7 +82,7 @@ class IPMachinesService(IPServiceBase): 'If non zero, only hosts responding to connection on that port will be served.' ), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) skipTimeOnFailure = gui.NumericField( length=6, @@ -92,7 +92,7 @@ class IPMachinesService(IPServiceBase): tooltip=_('If a host fails to check, skip it for this time (in minutes).'), minValue=0, required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) maxSessionForMachine = gui.NumericField( @@ -105,14 +105,14 @@ class IPMachinesService(IPServiceBase): ), minValue=0, required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) lockByExternalAccess = gui.CheckBoxField( label=_('Lock machine by external access'), tooltip=_('If checked, UDS will lock the machine if it is accesed from outside UDS.'), defvalue=False, order=4, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) # Description of service diff --git a/server/src/uds/services/Proxmox/provider.py b/server/src/uds/services/Proxmox/provider.py index 47c70502..cce2ce3d 100644 --- a/server/src/uds/services/Proxmox/provider.py +++ b/server/src/uds/services/Proxmox/provider.py @@ -106,7 +106,7 @@ class ProxmoxProvider( order=50, tooltip=_('Maximum number of concurrently creating VMs'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) maxRemovingServices = gui.NumericField( length=3, @@ -117,7 +117,7 @@ class ProxmoxProvider( order=51, tooltip=_('Maximum number of concurrently removing VMs'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) timeout = gui.NumericField( @@ -127,7 +127,7 @@ class ProxmoxProvider( order=90, tooltip=_('Timeout in seconds of connection to Proxmox'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) startVmId = gui.NumericField( @@ -140,7 +140,7 @@ class ProxmoxProvider( tooltip=_('Starting machine id on proxmox'), required=True, rdonly=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) # Own variables diff --git a/server/src/uds/services/Xen/provider.py b/server/src/uds/services/Xen/provider.py index 4f6b81f3..eeefb38b 100644 --- a/server/src/uds/services/Xen/provider.py +++ b/server/src/uds/services/Xen/provider.py @@ -129,7 +129,7 @@ class XenProvider(ServiceProvider): # pylint: disable=too-many-public-methods order=50, tooltip=_('Maximum number of concurrently creating VMs'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) maxRemovingServices = gui.NumericField( length=3, @@ -140,7 +140,7 @@ class XenProvider(ServiceProvider): # pylint: disable=too-many-public-methods order=51, tooltip=_('Maximum number of concurrently removing VMs'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) macsRange = gui.TextField( @@ -151,7 +151,7 @@ class XenProvider(ServiceProvider): # pylint: disable=too-many-public-methods rdonly=True, tooltip=_('Range of valid macs for created machines'), required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) verifySSL = gui.CheckBoxField( label=_('Verify Certificate'), @@ -159,7 +159,7 @@ class XenProvider(ServiceProvider): # pylint: disable=too-many-public-methods tooltip=_( 'If selected, certificate will be checked against system valid certificate providers' ), - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, defvalue=gui.FALSE, ) @@ -170,7 +170,7 @@ class XenProvider(ServiceProvider): # pylint: disable=too-many-public-methods tooltip=_( 'XenServer BACKUP IP or Hostname (used on connection failure to main server)' ), - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, required=False, ) diff --git a/server/src/uds/transports/HTML5RDP/html5rdp.py b/server/src/uds/transports/HTML5RDP/html5rdp.py index a2a8c025..ad8f2bbd 100644 --- a/server/src/uds/transports/HTML5RDP/html5rdp.py +++ b/server/src/uds/transports/HTML5RDP/html5rdp.py @@ -80,7 +80,7 @@ class HTML5RDPTransport(transports.Transport): defvalue='https://', length=64, required=True, - tab=gui.TUNNEL_TAB, + tab=gui.Tab.TUNNEL, ) useGlyptodonTunnel = gui.CheckBoxField( @@ -89,26 +89,26 @@ class HTML5RDPTransport(transports.Transport): tooltip=_( 'If checked, UDS will use Glyptodon Enterprise Tunnel for HTML tunneling instead of UDS Tunnel' ), - tab=gui.TUNNEL_TAB, + tab=gui.Tab.TUNNEL, ) useEmptyCreds = gui.CheckBoxField( label=_('Empty creds'), order=3, tooltip=_('If checked, the credentials used to connect will be emtpy'), - tab=gui.CREDENTIALS_TAB, + tab=gui.Tab.CREDENTIALS, ) fixedName = gui.TextField( label=_('Username'), order=4, tooltip=_('If not empty, this username will be always used as credential'), - tab=gui.CREDENTIALS_TAB, + tab=gui.Tab.CREDENTIALS, ) fixedPassword = gui.PasswordField( label=_('Password'), order=5, tooltip=_('If not empty, this password will be always used as credential'), - tab=gui.CREDENTIALS_TAB, + tab=gui.Tab.CREDENTIALS, ) withoutDomain = gui.CheckBoxField( label=_('Without Domain'), @@ -116,7 +116,7 @@ class HTML5RDPTransport(transports.Transport): tooltip=_( 'If checked, the domain part will always be emptied (to connecto to xrdp for example is needed)' ), - tab=gui.CREDENTIALS_TAB, + tab=gui.Tab.CREDENTIALS, ) fixedDomain = gui.TextField( label=_('Domain'), @@ -124,7 +124,7 @@ class HTML5RDPTransport(transports.Transport): tooltip=_( 'If not empty, this domain will be always used as credential (used as DOMAIN\\user)' ), - tab=gui.CREDENTIALS_TAB, + tab=gui.Tab.CREDENTIALS, ) wallpaper = gui.CheckBoxField( label=_('Show wallpaper'), @@ -132,19 +132,19 @@ class HTML5RDPTransport(transports.Transport): tooltip=_( 'If checked, the wallpaper and themes will be shown on machine (better user experience, more bandwidth)' ), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) desktopComp = gui.CheckBoxField( label=_('Allow Desk.Comp.'), order=19, tooltip=_('If checked, desktop composition will be allowed'), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) smooth = gui.CheckBoxField( label=_('Font Smoothing'), order=20, tooltip=_('If checked, fonts smoothing will be allowed (windows clients only)'), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) enableAudio = gui.CheckBoxField( label=_('Enable Audio'), @@ -152,7 +152,7 @@ class HTML5RDPTransport(transports.Transport): tooltip=_( 'If checked, the audio will be redirected to remote session (if client browser supports it)' ), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, defvalue=gui.TRUE, ) enableAudioInput = gui.CheckBoxField( @@ -161,7 +161,7 @@ class HTML5RDPTransport(transports.Transport): tooltip=_( 'If checked, the microphone will be redirected to remote session (if client browser supports it)' ), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) enablePrinting = gui.CheckBoxField( label=_('Enable Printing'), @@ -169,7 +169,7 @@ class HTML5RDPTransport(transports.Transport): tooltip=_( 'If checked, the printing will be redirected to remote session (if client browser supports it)' ), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) enableFileSharing = gui.ChoiceField( label=_('File Sharing'), @@ -182,7 +182,7 @@ class HTML5RDPTransport(transports.Transport): {'id': 'up', 'text': _('Allow upload only')}, {'id': 'true', 'text': _('Enable file sharing')}, ], - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) enableClipboard = gui.ChoiceField( label=_('Clipboard'), @@ -195,7 +195,7 @@ class HTML5RDPTransport(transports.Transport): {'id': 'dis-paste', 'text': _('Disable paste to remote')}, {'id': 'enabled', 'text': _('Enable clipboard')}, ], - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) serverLayout = gui.ChoiceField( @@ -225,7 +225,7 @@ class HTML5RDPTransport(transports.Transport): gui.choiceItem('failsafe', _('Failsafe')), ], defvalue='-', - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) ticketValidity = gui.NumericField( @@ -238,7 +238,7 @@ class HTML5RDPTransport(transports.Transport): ), required=True, minValue=60, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) forceNewWindow = gui.ChoiceField( @@ -260,7 +260,7 @@ class HTML5RDPTransport(transports.Transport): ), ], defvalue=gui.FALSE, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) security = gui.ChoiceField( order=92, @@ -290,7 +290,7 @@ class HTML5RDPTransport(transports.Transport): gui.choiceItem('tls', _('TLS (Transport Security Layer encryption)')), ], defvalue='any', - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) rdpPort = gui.NumericField( @@ -300,7 +300,7 @@ class HTML5RDPTransport(transports.Transport): tooltip=_('Use this port as RDP port. Defaults to 3389.'), required=True, #: Numeric fields have always a value, so this not really needed defvalue='3389', - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) customGEPath = gui.TextField( @@ -312,7 +312,7 @@ class HTML5RDPTransport(transports.Transport): defvalue='/', length=128, required=False, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) def initialize(self, values: 'Module.ValuesType'): diff --git a/server/src/uds/transports/HTML5VNC/html5vnc.py b/server/src/uds/transports/HTML5VNC/html5vnc.py index 07b53e20..b509edcf 100644 --- a/server/src/uds/transports/HTML5VNC/html5vnc.py +++ b/server/src/uds/transports/HTML5VNC/html5vnc.py @@ -79,20 +79,20 @@ class HTML5VNCTransport(transports.Transport): defvalue='https://', length=64, required=True, - tab=gui.TUNNEL_TAB, + tab=gui.Tab.TUNNEL, ) username = gui.TextField( label=_('Username'), order=20, tooltip=_('Username for VNC connection authentication.'), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) password = gui.PasswordField( label=_('Password'), order=21, tooltip=_('Password for VNC connection authentication'), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) vncPort = gui.NumericField( @@ -102,7 +102,7 @@ class HTML5VNCTransport(transports.Transport): order=2, tooltip=_('Port of the VNC server.'), required=True, - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) colorDepth = gui.ChoiceField( @@ -118,7 +118,7 @@ class HTML5VNCTransport(transports.Transport): gui.choiceItem('32', '33 bits'), ], defvalue='-', - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) swapRedBlue = gui.CheckBoxField( label=_('Swap red/blue'), @@ -126,19 +126,19 @@ class HTML5VNCTransport(transports.Transport): tooltip=_( 'Use this if your colours seems incorrect (blue appears red, ..) to swap them.' ), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) cursor = gui.CheckBoxField( label=_('Remote cursor'), order=28, tooltip=_('If set, force to show remote cursor'), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) readOnly = gui.CheckBoxField( label=_('Read only'), order=29, tooltip=_('If set, the connection will be read only'), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) ticketValidity = gui.NumericField( @@ -151,7 +151,7 @@ class HTML5VNCTransport(transports.Transport): ), required=True, minValue=60, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) forceNewWindow = gui.ChoiceField( order=91, @@ -172,7 +172,7 @@ class HTML5VNCTransport(transports.Transport): ), ], defvalue=gui.FALSE, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) def initialize(self, values: 'Module.ValuesType'): diff --git a/server/src/uds/transports/RDP/rdp_base.py b/server/src/uds/transports/RDP/rdp_base.py index 227088c9..e993d19c 100644 --- a/server/src/uds/transports/RDP/rdp_base.py +++ b/server/src/uds/transports/RDP/rdp_base.py @@ -71,19 +71,19 @@ class BaseRDPTransport(transports.Transport): label=_('Empty creds'), order=11, tooltip=_('If checked, the credentials used to connect will be emtpy'), - tab=gui.CREDENTIALS_TAB, + tab=gui.Tab.CREDENTIALS, ) fixedName = gui.TextField( label=_('Username'), order=12, tooltip=_('If not empty, this username will be always used as credential'), - tab=gui.CREDENTIALS_TAB, + tab=gui.Tab.CREDENTIALS, ) fixedPassword = gui.PasswordField( label=_('Password'), order=13, tooltip=_('If not empty, this password will be always used as credential'), - tab=gui.CREDENTIALS_TAB, + tab=gui.Tab.CREDENTIALS, ) withoutDomain = gui.CheckBoxField( label=_('Without Domain'), @@ -91,7 +91,7 @@ class BaseRDPTransport(transports.Transport): tooltip=_( 'If checked, the domain part will always be emptied (to connect to xrdp for example is needed)' ), - tab=gui.CREDENTIALS_TAB, + tab=gui.Tab.CREDENTIALS, ) fixedDomain = gui.TextField( label=_('Domain'), @@ -99,20 +99,20 @@ class BaseRDPTransport(transports.Transport): tooltip=_( 'If not empty, this domain will be always used as credential (used as DOMAIN\\user)' ), - tab=gui.CREDENTIALS_TAB, + tab=gui.Tab.CREDENTIALS, ) allowSmartcards = gui.CheckBoxField( label=_('Allow Smartcards'), order=20, tooltip=_('If checked, this transport will allow the use of smartcards'), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) allowPrinters = gui.CheckBoxField( label=_('Allow Printers'), order=21, tooltip=_('If checked, this transport will allow the use of user printers'), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) allowDrives = gui.ChoiceField( label=_('Local drives policy'), @@ -124,7 +124,7 @@ class BaseRDPTransport(transports.Transport): {'id': 'dynamic', 'text': 'Allow PnP drives'}, {'id': 'true', 'text': 'Allow any drive'}, ], - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) enforceDrives = gui.TextField( label=_('Force drives'), @@ -132,34 +132,34 @@ class BaseRDPTransport(transports.Transport): tooltip=_( 'Use comma separated values, for example "C:,D:". If drives policy is disallowed, this will be ignored' ), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) allowSerials = gui.CheckBoxField( label=_('Allow Serials'), order=24, tooltip=_('If checked, this transport will allow the use of user serial ports'), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) allowClipboard = gui.CheckBoxField( label=_('Enable clipboard'), order=25, tooltip=_('If checked, copy-paste functions will be allowed'), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, defvalue=gui.TRUE, ) allowAudio = gui.CheckBoxField( label=_('Enable sound'), order=26, tooltip=_('If checked, sound will be redirected.'), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, defvalue=gui.TRUE, ) allowWebcam = gui.CheckBoxField( label=_('Enable webcam'), order=27, tooltip=_('If checked, webcam will be redirected (ONLY Windows).'), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, defvalue=gui.FALSE, ) usbRedirection = gui.ChoiceField( @@ -176,14 +176,14 @@ class BaseRDPTransport(transports.Transport): {'id': '{50dd5230-ba8a-11d1-bf5d-0000f805f530}', 'text': 'Smartcards'}, {'id': '{745a17a0-74d3-11d0-b6fe-00a0c90f57da}', 'text': 'HIDs'}, ], - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) credssp = gui.CheckBoxField( label=_('Credssp Support'), order=29, tooltip=_('If checked, will enable Credentials Provider Support)'), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, defvalue=gui.TRUE, ) rdpPort = gui.NumericField( @@ -191,7 +191,7 @@ class BaseRDPTransport(transports.Transport): length=5, # That is, max allowed value is 65535 label=_('RDP Port'), tooltip=_('Use this port as RDP port. Defaults to 3389.'), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, required=True, #: Numeric fields have always a value, so this not really needed defvalue='3389', ) @@ -217,7 +217,7 @@ class BaseRDPTransport(transports.Transport): {'id': '5120x2880', 'text': '5120x2880'}, {'id': '-1x-1', 'text': 'Full screen'}, ], - tab=gui.DISPLAY_TAB, + tab=gui.Tab.DISPLAY, ) colorDepth = gui.ChoiceField( @@ -231,7 +231,7 @@ class BaseRDPTransport(transports.Transport): {'id': '24', 'text': '24'}, {'id': '32', 'text': '32'}, ], - tab=gui.DISPLAY_TAB, + tab=gui.Tab.DISPLAY, ) wallpaper = gui.CheckBoxField( @@ -240,7 +240,7 @@ class BaseRDPTransport(transports.Transport): tooltip=_( 'If checked, the wallpaper and themes will be shown on machine (better user experience, more bandwidth)' ), - tab=gui.DISPLAY_TAB, + tab=gui.Tab.DISPLAY, ) multimon = gui.CheckBoxField( label=_('Multiple monitors'), @@ -248,26 +248,26 @@ class BaseRDPTransport(transports.Transport): tooltip=_( 'If checked, all client monitors will be used for displaying (only works on windows clients)' ), - tab=gui.DISPLAY_TAB, + tab=gui.Tab.DISPLAY, ) aero = gui.CheckBoxField( label=_('Allow Desk.Comp.'), order=35, tooltip=_('If checked, desktop composition will be allowed'), - tab=gui.DISPLAY_TAB, + tab=gui.Tab.DISPLAY, ) smooth = gui.CheckBoxField( label=_('Font Smoothing'), defvalue=gui.TRUE, order=36, tooltip=_('If checked, fonts smoothing will be allowed'), - tab=gui.DISPLAY_TAB, + tab=gui.Tab.DISPLAY, ) showConnectionBar = gui.CheckBoxField( label=_('Connection Bar'), order=37, tooltip=_('If checked, connection bar will be shown (only on Windows clients)'), - tab=gui.DISPLAY_TAB, + tab=gui.Tab.DISPLAY, defvalue=gui.TRUE, ) diff --git a/server/src/uds/transports/RDP/rdptunnel.py b/server/src/uds/transports/RDP/rdptunnel.py index 585cbc7f..4c878f01 100644 --- a/server/src/uds/transports/RDP/rdptunnel.py +++ b/server/src/uds/transports/RDP/rdptunnel.py @@ -73,7 +73,7 @@ class TRDPTransport(BaseRDPTransport): tooltip=_( 'IP or Hostname of tunnel server sent to client device ("public" ip) and port. (use HOST:PORT format)' ), - tab=gui.TUNNEL_TAB, + tab=gui.Tab.TUNNEL, ) tunnelWait = gui.NumericField( @@ -85,7 +85,7 @@ class TRDPTransport(BaseRDPTransport): order=2, tooltip=_('Maximum time to wait before closing the tunnel listener'), required=True, - tab=gui.TUNNEL_TAB, + tab=gui.Tab.TUNNEL, ) verifyCertificate = gui.CheckBoxField( @@ -95,7 +95,7 @@ class TRDPTransport(BaseRDPTransport): 'If enabled, the certificate of tunnel server will be verified (recommended).' ), defvalue=gui.FALSE, - tab=gui.TUNNEL_TAB, + tab=gui.Tab.TUNNEL, ) useEmptyCreds = BaseRDPTransport.useEmptyCreds diff --git a/server/src/uds/transports/SPICE/spice_base.py b/server/src/uds/transports/SPICE/spice_base.py index b5b0f8f2..40a07a72 100644 --- a/server/src/uds/transports/SPICE/spice_base.py +++ b/server/src/uds/transports/SPICE/spice_base.py @@ -63,19 +63,19 @@ class BaseSpiceTransport(transports.Transport): order=1, label=_('Empty credentials'), tooltip=_('If checked, the credentials used to connect will be emtpy'), - tab=gui.CREDENTIALS_TAB, + tab=gui.Tab.CREDENTIALS, ) fixedName = gui.TextField( order=2, label=_('Username'), tooltip=_('If not empty, this username will be always used as credential'), - tab=gui.CREDENTIALS_TAB, + tab=gui.Tab.CREDENTIALS, ) fixedPassword = gui.PasswordField( order=3, label=_('Password'), tooltip=_('If not empty, this password will be always used as credential'), - tab=gui.CREDENTIALS_TAB, + tab=gui.Tab.CREDENTIALS, ) serverCertificate = gui.TextField( order=4, @@ -91,28 +91,28 @@ class BaseSpiceTransport(transports.Transport): order=5, label=_('Fullscreen Mode'), tooltip=_('If checked, viewer will be shown on fullscreen mode-'), - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) smartCardRedirect = gui.CheckBoxField( order=6, label=_('Smartcard Redirect'), tooltip=_('If checked, SPICE protocol will allow smartcard redirection.'), defvalue=gui.FALSE, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) usbShare = gui.CheckBoxField( order=7, label=_('Enable USB'), tooltip=_('If checked, USB redirection will be allowed.'), defvalue=gui.FALSE, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) autoNewUsbShare = gui.CheckBoxField( order=8, label=_('New USB Auto Sharing'), tooltip=_('Auto-redirect USB devices when plugged in.'), defvalue=gui.FALSE, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) def isAvailableFor(self, userService: 'models.UserService', ip: str) -> bool: diff --git a/server/src/uds/transports/SPICE/spicetunnel.py b/server/src/uds/transports/SPICE/spicetunnel.py index a435be18..856c6cfb 100644 --- a/server/src/uds/transports/SPICE/spicetunnel.py +++ b/server/src/uds/transports/SPICE/spicetunnel.py @@ -71,7 +71,7 @@ class TSPICETransport(BaseSpiceTransport): tooltip=_( 'IP or Hostname of tunnel server sent to client device ("public" ip) and port. (use HOST:PORT format)' ), - tab=gui.TUNNEL_TAB, + tab=gui.Tab.TUNNEL, ) tunnelWait = gui.NumericField( @@ -83,7 +83,7 @@ class TSPICETransport(BaseSpiceTransport): order=2, tooltip=_('Maximum time to wait before closing the tunnel listener'), required=True, - tab=gui.TUNNEL_TAB, + tab=gui.Tab.TUNNEL, ) verifyCertificate = gui.CheckBoxField( @@ -93,7 +93,7 @@ class TSPICETransport(BaseSpiceTransport): 'If enabled, the certificate of tunnel server will be verified (recommended).' ), defvalue=gui.FALSE, - tab=gui.TUNNEL_TAB, + tab=gui.Tab.TUNNEL, ) serverCertificate = BaseSpiceTransport.serverCertificate diff --git a/server/src/uds/transports/Test/transport.py b/server/src/uds/transports/Test/transport.py index dd3adbbb..bd58afc2 100644 --- a/server/src/uds/transports/Test/transport.py +++ b/server/src/uds/transports/Test/transport.py @@ -83,7 +83,7 @@ class TestTransport(transports.Transport): 'If checked, every connection will try to open its own window instead of reusing the "global" one.' ), defvalue=gui.FALSE, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) def initialize(self, values: 'Module.ValuesType'): diff --git a/server/src/uds/transports/URL/url_custom.py b/server/src/uds/transports/URL/url_custom.py index 50650a5b..1decc615 100644 --- a/server/src/uds/transports/URL/url_custom.py +++ b/server/src/uds/transports/URL/url_custom.py @@ -82,7 +82,7 @@ class URLCustomTransport(transports.Transport): 'If checked, every connection will try to open its own window instead of reusing the "global" one.' ), defvalue=gui.FALSE, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) def initialize(self, values: 'Module.ValuesType'): diff --git a/server/src/uds/transports/X2GO/x2go_base.py b/server/src/uds/transports/X2GO/x2go_base.py index ef4cae54..ce6c33b5 100644 --- a/server/src/uds/transports/X2GO/x2go_base.py +++ b/server/src/uds/transports/X2GO/x2go_base.py @@ -71,7 +71,7 @@ class BaseX2GOTransport(transports.Transport): order=2, label=_('Username'), tooltip=_('If not empty, this username will be always used as credential'), - tab=gui.CREDENTIALS_TAB, + tab=gui.Tab.CREDENTIALS, ) screenSize = gui.ChoiceField( @@ -87,7 +87,7 @@ class BaseX2GOTransport(transports.Transport): {'id': CommonPrefs.SZ_1920x1080, 'text': '1920x1080'}, {'id': CommonPrefs.SZ_FULLSCREEN, 'text': gettext_lazy('Full Screen')}, ], - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) desktopType = gui.ChoiceField( @@ -105,7 +105,7 @@ class BaseX2GOTransport(transports.Transport): {'id': 'gnome-session-cinnamon2d', 'text': 'Cinnamon 2.2 (see docs)'}, {'id': 'UDSVAPP', 'text': 'UDS vAPP'}, ], - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) customCmd = gui.TextField( @@ -114,7 +114,7 @@ class BaseX2GOTransport(transports.Transport): tooltip=_( 'If UDS vAPP is selected as "Desktop", the FULL PATH of the app to be executed. If UDS vAPP is not selected, this field will be ignored.' ), - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) sound = gui.CheckBoxField( @@ -122,7 +122,7 @@ class BaseX2GOTransport(transports.Transport): label=_('Enable sound'), tooltip=_('If checked, sound will be available'), defvalue=gui.TRUE, - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) exports = gui.CheckBoxField( @@ -132,7 +132,7 @@ class BaseX2GOTransport(transports.Transport): 'If checked, user home folder will be redirected. (On linux, also redirects /media)' ), defvalue=gui.FALSE, - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) speed = gui.ChoiceField( @@ -147,7 +147,7 @@ class BaseX2GOTransport(transports.Transport): {'id': '3', 'text': 'WAN'}, {'id': '4', 'text': 'LAN'}, ], - tab=gui.PARAMETERS_TAB, + tab=gui.Tab.PARAMETERS, ) soundType = gui.ChoiceField( @@ -159,7 +159,7 @@ class BaseX2GOTransport(transports.Transport): {'id': 'pulse', 'text': 'Pulse'}, {'id': 'esd', 'text': 'ESD'}, ], - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) keyboardLayout = gui.TextField( @@ -167,7 +167,7 @@ class BaseX2GOTransport(transports.Transport): order=31, tooltip=_('Keyboard layout (es, us, fr, ...). Empty value means autodetect.'), defvalue='', - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) # 'nopack', '8', '64', '256', '512', '4k', '32k', '64k', '256k', '2m', '16m' # '256-rdp', '256-rdp-compressed', '32k-rdp', '32k-rdp-compressed', '64k-rdp' @@ -187,7 +187,7 @@ class BaseX2GOTransport(transports.Transport): order=32, tooltip=_('Pack format. Change with care!'), defvalue='16m-jpeg', - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) quality = gui.NumericField( @@ -199,7 +199,7 @@ class BaseX2GOTransport(transports.Transport): minValue=1, maxValue=9, required=True, - tab=gui.ADVANCED_TAB, + tab=gui.Tab.ADVANCED, ) def isAvailableFor(self, userService: 'models.UserService', ip: str) -> bool: diff --git a/server/src/uds/transports/X2GO/x2gotunnel.py b/server/src/uds/transports/X2GO/x2gotunnel.py index 83a1915f..3090da8a 100644 --- a/server/src/uds/transports/X2GO/x2gotunnel.py +++ b/server/src/uds/transports/X2GO/x2gotunnel.py @@ -71,7 +71,7 @@ class TX2GOTransport(BaseX2GOTransport): tooltip=_( 'IP or Hostname of tunnel server sent to client device ("public" ip) and port. (use HOST:PORT format)' ), - tab=gui.TUNNEL_TAB, + tab=gui.Tab.TUNNEL, ) tunnelWait = gui.NumericField( @@ -83,7 +83,7 @@ class TX2GOTransport(BaseX2GOTransport): order=2, tooltip=_('Maximum time to wait before closing the tunnel listener'), required=True, - tab=gui.TUNNEL_TAB, + tab=gui.Tab.TUNNEL, ) verifyCertificate = gui.CheckBoxField( @@ -93,7 +93,7 @@ class TX2GOTransport(BaseX2GOTransport): 'If enabled, the certificate of tunnel server will be verified (recommended).' ), defvalue=gui.FALSE, - tab=gui.TUNNEL_TAB, + tab=gui.Tab.TUNNEL, ) fixedName = BaseX2GOTransport.fixedName