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.
60 lines
2.1 KiB
60 lines
2.1 KiB
import copy |
|
|
|
from django.utils.translation import gettext_lazy as _ |
|
from rest_framework import serializers |
|
|
|
from accounts.const import SecretType, DEFAULT_PASSWORD_RULES |
|
from common.utils import ssh_key_gen, random_string |
|
from common.utils import validate_ssh_private_key, parse_ssh_private_key_str |
|
|
|
|
|
class SecretGenerator: |
|
def __init__(self, secret_strategy, secret_type, password_rules=None): |
|
self.secret_strategy = secret_strategy |
|
self.secret_type = secret_type |
|
self.password_rules = password_rules |
|
|
|
@staticmethod |
|
def generate_ssh_key(): |
|
private_key, __ = ssh_key_gen() |
|
return private_key |
|
|
|
def generate_password(self): |
|
password_rules = self.password_rules |
|
if not password_rules or not isinstance(password_rules, dict): |
|
password_rules = {} |
|
rules = copy.deepcopy(DEFAULT_PASSWORD_RULES) |
|
rules.update(password_rules) |
|
rules = { |
|
'length': rules['length'], |
|
'lower': rules['lowercase'], |
|
'upper': rules['uppercase'], |
|
'digit': rules['digit'], |
|
'special_char': rules['symbol'], |
|
'exclude_chars': rules.get('exclude_symbols', ''), |
|
} |
|
return random_string(**rules) |
|
|
|
def get_secret(self): |
|
if self.secret_type == SecretType.SSH_KEY: |
|
secret = self.generate_ssh_key() |
|
elif self.secret_type == SecretType.PASSWORD: |
|
secret = self.generate_password() |
|
else: |
|
raise ValueError("Secret must be set") |
|
return secret |
|
|
|
|
|
def validate_password_for_ansible(password): |
|
""" 校验 Ansible 不支持的特殊字符 """ |
|
if password.startswith('{{') and password.endswith('}}'): |
|
raise serializers.ValidationError( |
|
_('If the password starts with {{` and ends with }} `, then the password is not allowed.') |
|
) |
|
|
|
|
|
def validate_ssh_key(ssh_key, passphrase=None): |
|
valid = validate_ssh_private_key(ssh_key, password=passphrase) |
|
if not valid: |
|
raise serializers.ValidationError(_("private key invalid or passphrase error")) |
|
return parse_ssh_private_key_str(ssh_key, passphrase)
|
|
|