mirror of https://github.com/jumpserver/jumpserver
				
				
				
			perf: Check the validity of the connection token
							parent
							
								
									addd2e7d1c
								
							
						
					
					
						commit
						b882b12d04
					
				| 
						 | 
				
			
			@ -472,6 +472,7 @@ class SuperConnectionTokenViewSet(ConnectionTokenViewSet):
 | 
			
		|||
    rbac_perms = {
 | 
			
		||||
        'create': 'authentication.add_superconnectiontoken',
 | 
			
		||||
        'renewal': 'authentication.add_superconnectiontoken',
 | 
			
		||||
        'check': 'authentication.view_superconnectiontoken',
 | 
			
		||||
        'get_secret_detail': 'authentication.view_superconnectiontokensecret',
 | 
			
		||||
        'get_applet_info': 'authentication.view_superconnectiontoken',
 | 
			
		||||
        'release_applet_account': 'authentication.view_superconnectiontoken',
 | 
			
		||||
| 
						 | 
				
			
			@ -484,6 +485,28 @@ class SuperConnectionTokenViewSet(ConnectionTokenViewSet):
 | 
			
		|||
    def get_user(self, serializer):
 | 
			
		||||
        return serializer.validated_data.get('user')
 | 
			
		||||
 | 
			
		||||
    @action(methods=['GET'], detail=True, url_path='check')
 | 
			
		||||
    def check(self, request, *args, **kwargs):
 | 
			
		||||
        instance = self.get_object()
 | 
			
		||||
        data = {
 | 
			
		||||
            "detail": "OK",
 | 
			
		||||
            "code": "perm_ok",
 | 
			
		||||
            "expired": instance.is_expired
 | 
			
		||||
        }
 | 
			
		||||
        try:
 | 
			
		||||
            self._validate_perm(
 | 
			
		||||
                instance.user,
 | 
			
		||||
                instance.asset,
 | 
			
		||||
                instance.account,
 | 
			
		||||
                instance.protocol
 | 
			
		||||
            )
 | 
			
		||||
        except JMSException as e:
 | 
			
		||||
            data['code'] = e.detail.code
 | 
			
		||||
            data['detail'] = str(e.detail)
 | 
			
		||||
            return Response(data=data, status=status.HTTP_400_BAD_REQUEST)
 | 
			
		||||
 | 
			
		||||
        return Response(data=data, status=status.HTTP_200_OK)
 | 
			
		||||
 | 
			
		||||
    @action(methods=['PATCH'], detail=False)
 | 
			
		||||
    def renewal(self, request, *args, **kwargs):
 | 
			
		||||
        from common.utils.timezone import as_current_tz
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,12 @@
 | 
			
		|||
from django.utils.translation import gettext_lazy as _
 | 
			
		||||
from rest_framework import serializers
 | 
			
		||||
 | 
			
		||||
from assets.models import Asset
 | 
			
		||||
from common.serializers.fields import LabeledChoiceField
 | 
			
		||||
from common.utils import pretty_string
 | 
			
		||||
from orgs.mixins.serializers import BulkOrgResourceModelSerializer
 | 
			
		||||
from terminal.session_lifecycle import lifecycle_events_map
 | 
			
		||||
from users.models import User
 | 
			
		||||
from .terminal import TerminalSmallSerializer
 | 
			
		||||
from ..const import SessionType, SessionErrorReason
 | 
			
		||||
from ..models import Session
 | 
			
		||||
| 
						 | 
				
			
			@ -73,6 +75,38 @@ class SessionSerializer(BulkOrgResourceModelSerializer):
 | 
			
		|||
        value = pretty_string(value, max_length=max_length)
 | 
			
		||||
        return value
 | 
			
		||||
 | 
			
		||||
    @staticmethod
 | 
			
		||||
    def get_valid_instance(model_cls, instance_id, field_name, error_message, validation_attr='is_active'):
 | 
			
		||||
        if instance_id is None:
 | 
			
		||||
            raise serializers.ValidationError({field_name: _('This field is required.')})
 | 
			
		||||
        instance = model_cls.objects.filter(id=instance_id).first()
 | 
			
		||||
        if not instance or not getattr(instance, validation_attr, False):
 | 
			
		||||
            raise serializers.ValidationError({field_name: error_message})
 | 
			
		||||
        return instance
 | 
			
		||||
 | 
			
		||||
    def create(self, validated_data):
 | 
			
		||||
        user_id = validated_data.get('user_id')
 | 
			
		||||
        asset_id = validated_data.get('asset_id')
 | 
			
		||||
 | 
			
		||||
        user = self.get_valid_instance(
 | 
			
		||||
            User,
 | 
			
		||||
            user_id,
 | 
			
		||||
            'user_id',
 | 
			
		||||
            _('No user or invalid user'),
 | 
			
		||||
            validation_attr='is_valid'
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        asset = self.get_valid_instance(
 | 
			
		||||
            Asset,
 | 
			
		||||
            asset_id,
 | 
			
		||||
            'asset_id',
 | 
			
		||||
            _('No asset or invalid asset')
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        validated_data['user'] = str(user)
 | 
			
		||||
        validated_data['asset'] = str(asset)
 | 
			
		||||
        return super().create(validated_data)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SessionDisplaySerializer(SessionSerializer):
 | 
			
		||||
    command_amount = serializers.IntegerField(read_only=True, label=_('Command amount'))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue