fix: 修改 ConnectionToken Serializer 命令过滤器

pull/9152/head
Bai 2022-12-02 17:48:44 +08:00
parent 21f91358cf
commit c8c5aca355
3 changed files with 26 additions and 23 deletions

View File

@ -124,11 +124,9 @@ class CommandFilterACL(OrgModelMixin, BaseACL):
return ticket return ticket
@classmethod @classmethod
def get_queryset( def get_command_groups(cls, user_id=None, user_group_id=None, account=None, asset_id=None, org_id=None):
cls, user_id=None, user_group_id=None, account=None,
asset_id=None, org_id=None from assets.models import Account, Asset
):
from assets.models import Account
user_groups = [] user_groups = []
user = get_object_or_none(User, pk=user_id) user = get_object_or_none(User, pk=user_id)
if user: if user:
@ -152,11 +150,14 @@ class CommandFilterACL(OrgModelMixin, BaseACL):
org_id = asset.org_id org_id = asset.org_id
q |= Q(assets=asset) q |= Q(assets=asset)
if q: if q:
cmd_filters = CommandFilter.objects.filter(q).filter(is_active=True) cmd_filters = cls.objects.filter(q).filter(is_active=True)
if org_id: if org_id:
cmd_filters = cmd_filters.filter(org_id=org_id) cmd_filters = cmd_filters.filter(org_id=org_id)
rule_ids = cmd_filters.values_list('rules', flat=True) filter_ids = cmd_filters.values_list('id', flat=True)
rules = cls.objects.filter(id__in=rule_ids) command_group_ids = cls.commands.through.objects\
.filter(commandfilteracl_id__in=filter_ids)\
.values_list('commandgroup_id', flat=True)
cmd_groups = CommandGroup.objects.filter(id__in=command_group_ids)
else: else:
rules = cls.objects.none() cmd_groups = CommandGroup.objects.none()
return rules return cmd_groups

View File

@ -156,16 +156,16 @@ class ConnectionToken(OrgModelMixin, JMSBaseModel):
return self.domain.random_gateway() return self.domain.random_gateway()
@lazyproperty @lazyproperty
def cmd_filter_rules(self): def acl_command_groups(self):
from assets.models import CommandFilterRule from acls.models import CommandFilterACL
kwargs = { kwargs = {
'user_id': self.user.id, 'user_id': self.user.id,
'account': self.account, 'account': self.account,
} }
if self.asset: if self.asset:
kwargs['asset_id'] = self.asset.id kwargs['asset_id'] = self.asset.id
rules = CommandFilterRule.get_queryset(**kwargs) cmd_groups = CommandFilterACL.get_command_groups(**kwargs)
return rules return cmd_groups
class SuperConnectionToken(ConnectionToken): class SuperConnectionToken(ConnectionToken):

View File

@ -2,6 +2,7 @@ from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers from rest_framework import serializers
from assets.models import Asset, CommandFilterRule, Account, Platform from assets.models import Asset, CommandFilterRule, Account, Platform
from acls.models import CommandGroup
from assets.serializers import PlatformSerializer, AssetProtocolsSerializer from assets.serializers import PlatformSerializer, AssetProtocolsSerializer
from authentication.models import ConnectionToken from authentication.models import ConnectionToken
from orgs.mixins.serializers import OrgResourceModelSerializerMixin from orgs.mixins.serializers import OrgResourceModelSerializerMixin
@ -89,8 +90,9 @@ class ConnectionTokenAssetSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Asset model = Asset
fields = ['id', 'name', 'address', 'protocols', fields = [
'org_id', 'specific'] 'id', 'name', 'address', 'protocols', 'category', 'type', 'org_id', 'specific'
]
class SimpleAccountSerializer(serializers.ModelSerializer): class SimpleAccountSerializer(serializers.ModelSerializer):
@ -123,14 +125,14 @@ class ConnectionTokenGatewaySerializer(serializers.ModelSerializer):
] ]
class ConnectionTokenCmdFilterRuleSerializer(serializers.ModelSerializer): class ConnectionTokenACLCmdGroupSerializer(serializers.ModelSerializer):
""" Command filter rule """ """ ACL command group"""
class Meta: class Meta:
model = CommandFilterRule model = CommandGroup
fields = [ fields = [
'id', 'type', 'content', 'ignore_case', 'pattern', 'id', 'type', 'content', 'ignore_case', 'pattern',
'priority', 'action', 'date_created', 'action', 'date_created',
] ]
@ -145,23 +147,23 @@ class ConnectionTokenPlatform(PlatformSerializer):
class ConnectionTokenSecretSerializer(OrgResourceModelSerializerMixin): class ConnectionTokenSecretSerializer(OrgResourceModelSerializerMixin):
expire_now = serializers.BooleanField(label=_('Expired now'), default=True)
user = ConnectionTokenUserSerializer(read_only=True) user = ConnectionTokenUserSerializer(read_only=True)
asset = ConnectionTokenAssetSerializer(read_only=True) asset = ConnectionTokenAssetSerializer(read_only=True)
account = ConnectionTokenAccountSerializer(read_only=True) account = ConnectionTokenAccountSerializer(read_only=True)
gateway = ConnectionTokenGatewaySerializer(read_only=True) gateway = ConnectionTokenGatewaySerializer(read_only=True)
platform = ConnectionTokenPlatform(read_only=True) platform = ConnectionTokenPlatform(read_only=True)
# cmd_filter_rules = ConnectionTokenCmdFilterRuleSerializer(many=True) acl_command_groups = ConnectionTokenACLCmdGroupSerializer(read_only=True, many=True)
actions = ActionChoicesField() actions = ActionChoicesField()
expire_at = serializers.IntegerField() expire_at = serializers.IntegerField()
expire_now = serializers.BooleanField(label=_('Expired now'), write_only=True, default=True)
class Meta: class Meta:
model = ConnectionToken model = ConnectionToken
fields = [ fields = [
'id', 'value', 'user', 'asset', 'account', 'platform', 'id', 'value', 'user', 'asset', 'account', 'platform',
'acl_command_groups',
'protocol', 'gateway', 'actions', 'expire_at', 'expire_now', 'protocol', 'gateway', 'actions', 'expire_at', 'expire_now',
] ]
extra_kwargs = { extra_kwargs = {
'value': {'read_only': True}, 'value': {'read_only': True},
'expire_now': {'write_only': True},
} }