mirror of https://github.com/jumpserver/jumpserver
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
2.3 KiB
64 lines
2.3 KiB
# -*- coding: utf-8 -*- |
|
# |
|
from django.db.models import TextChoices |
|
from django.utils.translation import gettext_lazy as _ |
|
from rest_framework import serializers |
|
|
|
from common.serializers.fields import ReadableHiddenField, LabeledChoiceField |
|
|
|
from ..models import SSHKey |
|
from common.utils import validate_ssh_public_key |
|
from users.exceptions import CreateSSHKeyExceedLimit |
|
|
|
__all__ = ['SSHKeySerializer', 'GenerateKeyType'] |
|
|
|
|
|
class GenerateKeyType(TextChoices): |
|
auto = 'auto', _('Automatically Generate Key Pair') |
|
# 目前只支持sftp方式 |
|
load = 'load', _('Import Existing Key Pair') |
|
|
|
|
|
class SSHKeySerializer(serializers.ModelSerializer): |
|
user = ReadableHiddenField(default=serializers.CurrentUserDefault()) |
|
public_key_comment = serializers.CharField( |
|
source='get_public_key_comment', required=False, read_only=True, max_length=128 |
|
) |
|
public_key_hash_md5 = serializers.CharField( |
|
source='get_public_key_hash_md5', required=False, read_only=True, max_length=128 |
|
) |
|
generate_key_type = LabeledChoiceField( |
|
choices=GenerateKeyType.choices, label=_('Create Type'), default=GenerateKeyType.auto.value, required=False, |
|
help_text=_( |
|
'Please download the private key after creation. Each private key can only be downloaded once' |
|
) |
|
) |
|
|
|
class Meta: |
|
model = SSHKey |
|
fields_mini = ['name'] |
|
fields_small = fields_mini + [ |
|
'public_key', 'is_active', 'comment' |
|
] |
|
read_only_fields = [ |
|
'id', 'user', 'public_key_comment', 'public_key_hash_md5', |
|
'date_last_used', 'date_created', 'date_updated', 'generate_key_type', |
|
] |
|
fields = fields_small + read_only_fields |
|
|
|
def to_representation(self, instance): |
|
data = super().to_representation(instance) |
|
data.pop('public_key', None) |
|
return data |
|
|
|
@staticmethod |
|
def validate_public_key(value): |
|
if not validate_ssh_public_key(value): |
|
raise serializers.ValidationError(_('Not a valid ssh public key')) |
|
return value |
|
|
|
def create(self, validated_data): |
|
if not self.context["request"].user.can_create_ssh_key(): |
|
raise CreateSSHKeyExceedLimit() |
|
validated_data.pop('generate_key_type', None) |
|
return super().create(validated_data)
|
|
|