|
|
|
# -*- 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)
|