mirror of https://github.com/jumpserver/jumpserver
92 lines
3.4 KiB
Python
92 lines
3.4 KiB
Python
from rest_framework import serializers
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from orgs.mixins.serializers import BulkOrgResourceModelSerializer
|
|
from orgs.models import Organization
|
|
from assets.const import Protocol
|
|
from acls import models
|
|
|
|
|
|
__all__ = ['LoginAssetACLSerializer']
|
|
|
|
|
|
common_help_text = _('Format for comma-delimited string, with * indicating a match all. ')
|
|
|
|
|
|
class LoginAssetACLUsersSerializer(serializers.Serializer):
|
|
username_group = serializers.ListField(
|
|
default=['*'], child=serializers.CharField(max_length=128), label=_('Username'),
|
|
help_text=common_help_text
|
|
)
|
|
|
|
|
|
class LoginAssetACLAssestsSerializer(serializers.Serializer):
|
|
ip_group_help_text = _(
|
|
'Format for comma-delimited string, with * indicating a match all. '
|
|
'Such as: '
|
|
'192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 '
|
|
'(Domain name support)'
|
|
)
|
|
|
|
ip_group = serializers.ListField(
|
|
default=['*'], child=serializers.CharField(max_length=1024), label=_('IP'),
|
|
help_text=ip_group_help_text
|
|
)
|
|
hostname_group = serializers.ListField(
|
|
default=['*'], child=serializers.CharField(max_length=128), label=_('Hostname'),
|
|
help_text=common_help_text
|
|
)
|
|
|
|
|
|
class LoginAssetACLAccountsSerializer(serializers.Serializer):
|
|
protocol_group_help_text = _(
|
|
'Format for comma-delimited string, with * indicating a match all. '
|
|
'Protocol options: {}'
|
|
)
|
|
|
|
name_group = serializers.ListField(
|
|
default=['*'], child=serializers.CharField(max_length=128), label=_('Name'),
|
|
help_text=common_help_text
|
|
)
|
|
username_group = serializers.ListField(
|
|
default=['*'], child=serializers.CharField(max_length=128), label=_('Username'),
|
|
help_text=common_help_text
|
|
)
|
|
|
|
|
|
class LoginAssetACLSerializer(BulkOrgResourceModelSerializer):
|
|
users = LoginAssetACLUsersSerializer()
|
|
assets = LoginAssetACLAssestsSerializer()
|
|
accounts = LoginAssetACLAccountsSerializer()
|
|
reviewers_amount = serializers.IntegerField(read_only=True, source='reviewers.count')
|
|
action_display = serializers.ReadOnlyField(source='get_action_display', label=_('Action'))
|
|
|
|
class Meta:
|
|
model = models.LoginAssetACL
|
|
fields_mini = ['id', 'name']
|
|
fields_small = fields_mini + [
|
|
'users', 'accounts', 'assets',
|
|
'is_active', 'date_created', 'date_updated',
|
|
'priority', 'action', 'action_display', 'comment', 'created_by', 'org_id'
|
|
]
|
|
fields_m2m = ['reviewers', 'reviewers_amount']
|
|
fields = fields_small + fields_m2m
|
|
extra_kwargs = {
|
|
"reviewers": {'allow_null': False, 'required': True},
|
|
'priority': {'default': 50},
|
|
'is_active': {'default': True},
|
|
}
|
|
|
|
def validate_reviewers(self, reviewers):
|
|
org_id = self.fields['org_id'].default()
|
|
org = Organization.get_instance(org_id)
|
|
if not org:
|
|
error = _('The organization `{}` does not exist'.format(org_id))
|
|
raise serializers.ValidationError(error)
|
|
users = org.get_members()
|
|
valid_reviewers = list(set(reviewers) & set(users))
|
|
if not valid_reviewers:
|
|
error = _('None of the reviewers belong to Organization `{}`'.format(org.name))
|
|
raise serializers.ValidationError(error)
|
|
return valid_reviewers
|