mirror of https://github.com/jumpserver/jumpserver
[Update] 修改users otp secret key
parent
b90d3306c5
commit
48e8785725
|
@ -2,11 +2,15 @@
|
||||||
#
|
#
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
from django.db import models
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.utils import six
|
from django.utils import six
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
from .utils import get_signer
|
||||||
|
|
||||||
|
signer = get_signer()
|
||||||
|
|
||||||
|
|
||||||
class DictField(forms.Field):
|
class DictField(forms.Field):
|
||||||
|
@ -46,4 +50,27 @@ class StringIDField(serializers.Field):
|
||||||
|
|
||||||
class StringManyToManyField(serializers.RelatedField):
|
class StringManyToManyField(serializers.RelatedField):
|
||||||
def to_representation(self, value):
|
def to_representation(self, value):
|
||||||
return value.__str__()
|
return value.__str__()
|
||||||
|
|
||||||
|
|
||||||
|
class EncryptMixin:
|
||||||
|
def from_db_value(self, value, expression, connection, context):
|
||||||
|
if value is not None:
|
||||||
|
return signer.unsign(value)
|
||||||
|
return super().from_db_value(self, value, expression, connection, context)
|
||||||
|
|
||||||
|
def get_prep_value(self, value):
|
||||||
|
if value is None:
|
||||||
|
return value
|
||||||
|
return signer.sign(value).decode('utf-8')
|
||||||
|
|
||||||
|
|
||||||
|
class EncryptTextField(EncryptMixin, models.TextField):
|
||||||
|
description = _("Encrypt field using Secret Key")
|
||||||
|
|
||||||
|
|
||||||
|
class EncryptCharField(EncryptMixin, models.CharField):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
kwargs['max_length'] = 2048
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ class User(AbstractUser):
|
||||||
wechat = models.CharField(max_length=128, blank=True, verbose_name=_('Wechat'))
|
wechat = models.CharField(max_length=128, blank=True, verbose_name=_('Wechat'))
|
||||||
phone = models.CharField(max_length=20, blank=True, null=True, verbose_name=_('Phone'))
|
phone = models.CharField(max_length=20, blank=True, null=True, verbose_name=_('Phone'))
|
||||||
otp_level = models.SmallIntegerField(default=0, choices=OTP_LEVEL_CHOICES, verbose_name=_('Enable OTP'))
|
otp_level = models.SmallIntegerField(default=0, choices=OTP_LEVEL_CHOICES, verbose_name=_('Enable OTP'))
|
||||||
otp_secret_key = models.CharField(max_length=16, blank=True, null=True)
|
_otp_secret_key = models.CharField(max_length=128, blank=True, null=True)
|
||||||
# Todo: Auto generate key, let user download
|
# Todo: Auto generate key, let user download
|
||||||
_private_key = models.CharField(max_length=5000, blank=True, verbose_name=_('Private key'))
|
_private_key = models.CharField(max_length=5000, blank=True, verbose_name=_('Private key'))
|
||||||
_public_key = models.CharField(max_length=5000, blank=True, verbose_name=_('Public key'))
|
_public_key = models.CharField(max_length=5000, blank=True, verbose_name=_('Public key'))
|
||||||
|
@ -70,6 +70,14 @@ class User(AbstractUser):
|
||||||
def password_raw(self, password_raw_):
|
def password_raw(self, password_raw_):
|
||||||
self.set_password(password_raw_)
|
self.set_password(password_raw_)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def otp_secret_key(self):
|
||||||
|
return signer.unsign(self._otp_secret_key)
|
||||||
|
|
||||||
|
@otp_secret_key.setter
|
||||||
|
def otp_secret_key(self, item):
|
||||||
|
self._otp_secret_key = signer.sign(item).decode('utf-8')
|
||||||
|
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return reverse('users:user-detail', args=(self.id,))
|
return reverse('users:user-detail', args=(self.id,))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue