mirror of https://github.com/jumpserver/jumpserver
				
				
				
			
		
			
				
	
	
		
			180 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
| from django.utils.translation import ugettext_lazy as _
 | |
| from rest_framework import serializers
 | |
| 
 | |
| from assets.models import Asset, Gateway, Domain, CommandFilterRule, Account, Platform
 | |
| from authentication.models import ConnectionToken
 | |
| from common.utils import pretty_string
 | |
| from common.utils.random import random_string
 | |
| from orgs.mixins.serializers import OrgResourceModelSerializerMixin
 | |
| from perms.serializers.permission import ActionChoicesField
 | |
| from users.models import User
 | |
| 
 | |
| __all__ = [
 | |
|     'ConnectionTokenSerializer', 'ConnectionTokenSecretSerializer',
 | |
|     'SuperConnectionTokenSerializer', 'ConnectionTokenDisplaySerializer'
 | |
| ]
 | |
| 
 | |
| 
 | |
| class ConnectionTokenSerializer(OrgResourceModelSerializerMixin):
 | |
|     is_valid = serializers.BooleanField(read_only=True, label=_('Validity'))
 | |
|     expire_time = serializers.IntegerField(read_only=True, label=_('Expired time'))
 | |
| 
 | |
|     class Meta:
 | |
|         model = ConnectionToken
 | |
|         fields_mini = ['id']
 | |
|         fields_small = fields_mini + [
 | |
|             'secret', 'account_username', 'date_expired',
 | |
|             'date_created', 'date_updated',
 | |
|             'created_by', 'updated_by', 'org_id', 'org_name',
 | |
|         ]
 | |
|         fields_fk = [
 | |
|             'user', 'asset',
 | |
|         ]
 | |
|         read_only_fields = [
 | |
|             # 普通 Token 不支持指定 user
 | |
|             'user', 'is_valid', 'expire_time',
 | |
|             'user_display', 'asset_display',
 | |
|         ]
 | |
|         fields = fields_small + fields_fk + read_only_fields
 | |
| 
 | |
|     def get_request_user(self):
 | |
|         request = self.context.get('request')
 | |
|         user = request.user if request else None
 | |
|         return user
 | |
| 
 | |
|     def get_user(self, attrs):
 | |
|         return self.get_request_user()
 | |
| 
 | |
|     def validate(self, attrs):
 | |
|         fields_attrs = self.construct_internal_fields_attrs(attrs)
 | |
|         attrs.update(fields_attrs)
 | |
|         return attrs
 | |
| 
 | |
|     def construct_internal_fields_attrs(self, attrs):
 | |
|         asset = attrs.get('asset') or ''
 | |
|         asset_display = pretty_string(str(asset), max_length=128)
 | |
|         user = self.get_user(attrs)
 | |
|         user_display = pretty_string(str(user), max_length=128)
 | |
|         secret = attrs.get('secret') or random_string(16)
 | |
|         date_expired = attrs.get('date_expired') or ConnectionToken.get_default_date_expired()
 | |
|         org_id = asset.org_id
 | |
|         if not isinstance(asset, Asset):
 | |
|             error = ''
 | |
|             raise serializers.ValidationError(error)
 | |
|         attrs = {
 | |
|             'user': user,
 | |
|             'secret': secret,
 | |
|             'user_display': user_display,
 | |
|             'asset_display': asset_display,
 | |
|             'date_expired': date_expired,
 | |
|             'org_id': org_id,
 | |
|         }
 | |
|         return attrs
 | |
| 
 | |
| 
 | |
| class ConnectionTokenDisplaySerializer(ConnectionTokenSerializer):
 | |
|     class Meta(ConnectionTokenSerializer.Meta):
 | |
|         extra_kwargs = {
 | |
|             'secret': {'write_only': True},
 | |
|         }
 | |
| 
 | |
| 
 | |
| #
 | |
| # SuperConnectionTokenSerializer
 | |
| #
 | |
| 
 | |
| 
 | |
| class SuperConnectionTokenSerializer(ConnectionTokenSerializer):
 | |
|     class Meta(ConnectionTokenSerializer.Meta):
 | |
|         read_only_fields = [
 | |
|             'validity', 'user_display', 'system_user_display',
 | |
|             'asset_display', 'application_display',
 | |
|         ]
 | |
| 
 | |
|     def get_user(self, attrs):
 | |
|         return attrs.get('user') or self.get_request_user()
 | |
| 
 | |
| 
 | |
| #
 | |
| # Connection Token Secret
 | |
| #
 | |
| 
 | |
| 
 | |
| class ConnectionTokenUserSerializer(serializers.ModelSerializer):
 | |
|     """ User """
 | |
| 
 | |
|     class Meta:
 | |
|         model = User
 | |
|         fields = ['id', 'name', 'username', 'email']
 | |
| 
 | |
| 
 | |
| class ConnectionTokenAssetSerializer(serializers.ModelSerializer):
 | |
|     """ Asset """
 | |
| 
 | |
|     class Meta:
 | |
|         model = Asset
 | |
|         fields = ['id', 'name', 'address', 'protocols', 'org_id']
 | |
| 
 | |
| 
 | |
| class ConnectionTokenAccountSerializer(serializers.ModelSerializer):
 | |
|     """ Account """
 | |
| 
 | |
|     class Meta:
 | |
|         model = Account
 | |
|         fields = [
 | |
|             'id', 'name', 'username', 'secret_type', 'secret', 'version'
 | |
|         ]
 | |
| 
 | |
| 
 | |
| class ConnectionTokenGatewaySerializer(serializers.ModelSerializer):
 | |
|     """ Gateway """
 | |
| 
 | |
|     class Meta:
 | |
|         model = Gateway
 | |
|         fields = ['id', 'ip', 'port', 'username', 'password', 'private_key']
 | |
| 
 | |
| 
 | |
| class ConnectionTokenDomainSerializer(serializers.ModelSerializer):
 | |
|     """ Domain """
 | |
|     gateways = ConnectionTokenGatewaySerializer(many=True, read_only=True)
 | |
| 
 | |
|     class Meta:
 | |
|         model = Domain
 | |
|         fields = ['id', 'name', 'gateways']
 | |
| 
 | |
| 
 | |
| class ConnectionTokenCmdFilterRuleSerializer(serializers.ModelSerializer):
 | |
|     """ Command filter rule """
 | |
| 
 | |
|     class Meta:
 | |
|         model = CommandFilterRule
 | |
|         fields = [
 | |
|             'id', 'type', 'content', 'ignore_case', 'pattern',
 | |
|             'priority', 'action', 'date_created',
 | |
|         ]
 | |
| 
 | |
| 
 | |
| class ConnectionTokenPlatform(serializers.ModelSerializer):
 | |
|     class Meta:
 | |
|         model = Platform
 | |
|         fields = ['id', 'name', 'org_id']
 | |
| 
 | |
| 
 | |
| class ConnectionTokenSecretSerializer(OrgResourceModelSerializerMixin):
 | |
|     user = ConnectionTokenUserSerializer(read_only=True)
 | |
|     asset = ConnectionTokenAssetSerializer(read_only=True)
 | |
|     platform = ConnectionTokenPlatform(read_only=True)
 | |
|     account = ConnectionTokenAccountSerializer(read_only=True)
 | |
|     gateway = ConnectionTokenGatewaySerializer(read_only=True)
 | |
|     cmd_filter_rules = ConnectionTokenCmdFilterRuleSerializer(many=True)
 | |
|     actions = ActionChoicesField()
 | |
|     expire_at = serializers.IntegerField()
 | |
| 
 | |
|     class Meta:
 | |
|         model = ConnectionToken
 | |
|         fields = [
 | |
|             'id', 'secret', 'user', 'asset', 'account_username',
 | |
|             'account', 'protocol', 'domain', 'gateway',
 | |
|             'cmd_filter_rules', 'actions', 'expire_at',
 | |
|         ]
 |