feat: xrdp 远程应用

This commit is contained in:
xinwen 2021-09-24 15:31:25 +08:00 committed by 老广
parent 0afeed0ff1
commit 16fae00e0e
2 changed files with 44 additions and 5 deletions

View File

@ -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':

View File

@ -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