mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-06-26 06:52:53 +00:00
feat: xrdp 远程应用
This commit is contained in:
parent
0afeed0ff1
commit
16fae00e0e
@ -2,9 +2,10 @@
|
|||||||
#
|
#
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
import json
|
import json
|
||||||
import base64
|
|
||||||
from typing import Callable
|
from typing import Callable
|
||||||
import os
|
import os
|
||||||
|
import base64
|
||||||
|
import ctypes
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.cache import cache
|
from django.core.cache import cache
|
||||||
@ -18,10 +19,12 @@ from rest_framework.decorators import action
|
|||||||
from rest_framework.exceptions import PermissionDenied
|
from rest_framework.exceptions import PermissionDenied
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
|
from applications.models import Application
|
||||||
from authentication.signals import post_auth_failed, post_auth_success
|
from authentication.signals import post_auth_failed, post_auth_success
|
||||||
from common.utils import get_logger, random_string
|
from common.utils import get_logger, random_string
|
||||||
from common.mixins.api import SerializerMixin
|
from common.mixins.api import SerializerMixin
|
||||||
from common.permissions import IsSuperUserOrAppUser, IsValidUser, IsSuperUser
|
from common.permissions import IsSuperUserOrAppUser, IsValidUser, IsSuperUser
|
||||||
|
from common.utils.common import get_file_by_arch
|
||||||
from orgs.mixins.api import RootOrgViewMixin
|
from orgs.mixins.api import RootOrgViewMixin
|
||||||
from common.http import is_true
|
from common.http import is_true
|
||||||
from perms.utils.asset.permission import get_asset_system_user_ids_with_actions_by_user
|
from perms.utils.asset.permission import get_asset_system_user_ids_with_actions_by_user
|
||||||
@ -124,17 +127,40 @@ class ClientProtocolMixin:
|
|||||||
options['session bpp:i'] = os.getenv('JUMPSERVER_COLOR_DEPTH', '32')
|
options['session bpp:i'] = os.getenv('JUMPSERVER_COLOR_DEPTH', '32')
|
||||||
options['audiomode:i'] = self.parse_env_bool('JUMPSERVER_DISABLE_AUDIO', 'false', '2', '0')
|
options['audiomode:i'] = self.parse_env_bool('JUMPSERVER_DISABLE_AUDIO', 'false', '2', '0')
|
||||||
|
|
||||||
content = ''
|
|
||||||
for k, v in options.items():
|
|
||||||
content += f'{k}:{v}\n'
|
|
||||||
if asset:
|
if asset:
|
||||||
name = asset.hostname
|
name = asset.hostname
|
||||||
elif application:
|
elif application:
|
||||||
name = application.name
|
name = application.name
|
||||||
|
application.get_rdp_remote_app_setting()
|
||||||
|
|
||||||
|
app = f'||jmservisor'
|
||||||
|
options['remoteapplicationmode:i'] = '1'
|
||||||
|
options['alternate shell:s'] = app
|
||||||
|
options['remoteapplicationprogram:s'] = app
|
||||||
|
options['remoteapplicationname:s'] = name
|
||||||
|
options['remoteapplicationcmdline:s'] = '- ' + self.get_encrypt_cmdline(application)
|
||||||
else:
|
else:
|
||||||
name = '*'
|
name = '*'
|
||||||
|
|
||||||
|
content = ''
|
||||||
|
for k, v in options.items():
|
||||||
|
content += f'{k}:{v}\n'
|
||||||
return name, content
|
return name, content
|
||||||
|
|
||||||
|
def get_encrypt_cmdline(self, app: Application):
|
||||||
|
|
||||||
|
parameters = app.get_rdp_remote_app_setting()['parameters']
|
||||||
|
parameters = parameters.encode('ascii')
|
||||||
|
|
||||||
|
lib_path = get_file_by_arch('xpack/libs', 'librailencrypt.so')
|
||||||
|
lib = ctypes.CDLL(lib_path)
|
||||||
|
lib.encrypt.argtypes = [ctypes.c_char_p, ctypes.c_int]
|
||||||
|
lib.encrypt.restype = ctypes.c_char_p
|
||||||
|
|
||||||
|
rst = lib.encrypt(parameters, len(parameters))
|
||||||
|
rst = rst.decode('ascii')
|
||||||
|
return rst
|
||||||
|
|
||||||
@action(methods=['POST', 'GET'], detail=False, url_path='rdp/file', permission_classes=[IsValidUser])
|
@action(methods=['POST', 'GET'], detail=False, url_path='rdp/file', permission_classes=[IsValidUser])
|
||||||
def get_rdp_file(self, request, *args, **kwargs):
|
def get_rdp_file(self, request, *args, **kwargs):
|
||||||
if self.request.method == 'GET':
|
if self.request.method == 'GET':
|
||||||
|
@ -10,7 +10,10 @@ from functools import wraps
|
|||||||
import time
|
import time
|
||||||
import ipaddress
|
import ipaddress
|
||||||
import psutil
|
import psutil
|
||||||
from typing import Iterable
|
import platform
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
UUID_PATTERN = re.compile(r'\w{8}(-\w{4}){3}-\w{12}')
|
UUID_PATTERN = re.compile(r'\w{8}(-\w{4}){3}-\w{12}')
|
||||||
ipip_db = None
|
ipip_db = None
|
||||||
@ -326,3 +329,13 @@ def unique(objects, key=None):
|
|||||||
if v not in seen:
|
if v not in seen:
|
||||||
seen[v] = obj
|
seen[v] = obj
|
||||||
return list(seen.values())
|
return list(seen.values())
|
||||||
|
|
||||||
|
|
||||||
|
def get_file_by_arch(dir, filename):
|
||||||
|
platform_name = platform.system()
|
||||||
|
arch = platform.machine()
|
||||||
|
|
||||||
|
file_path = os.path.join(
|
||||||
|
settings.BASE_DIR, dir, platform_name, arch, filename
|
||||||
|
)
|
||||||
|
return file_path
|
||||||
|
Loading…
Reference in New Issue
Block a user