diff --git a/apps/common/utils.py b/apps/common/utils.py index 9a998adf9..2aa70507a 100644 --- a/apps/common/utils.py +++ b/apps/common/utils.py @@ -11,6 +11,7 @@ import datetime import paramiko import paramiko +import sshpubkeys from itsdangerous import TimedJSONWebSignatureSerializer, JSONWebSignatureSerializer, \ BadSignature, SignatureExpired from django.shortcuts import reverse as dj_reverse @@ -236,4 +237,15 @@ def validate_ssh_private_key(text): return True +def validate_ssh_public_key(text): + ssh = sshpubkeys.SSHKey(text) + try: + ssh.parse() + except sshpubkeys.InvalidKeyException: + return False + except NotImplementedError as e: + return False + return True + + signer = Signer() \ No newline at end of file diff --git a/apps/static/js/jumpserver.js b/apps/static/js/jumpserver.js index 6f1fff39c..600cfa606 100644 --- a/apps/static/js/jumpserver.js +++ b/apps/static/js/jumpserver.js @@ -191,7 +191,6 @@ function APIUpdateAttr(props) { props = props || {}; var success_message = props.success_message || 'Update Successfully!'; var fail_message = props.fail_message || 'Error occurred while updating.'; - console.log(props.body); $.ajax({ url: props.url, type: props.method || "PATCH", @@ -208,7 +207,7 @@ function APIUpdateAttr(props) { if (typeof props.error === 'function') { return props.error(errorThrown); } else { - toastr.error(fail_message); + toastr.error(textStatue); } }); return true; diff --git a/apps/users/api.py b/apps/users/api.py index 8c945ca53..b074ab2e1 100644 --- a/apps/users/api.py +++ b/apps/users/api.py @@ -29,10 +29,10 @@ class UserViewSet(BulkModelViewSet): permission_classes = (IsSuperUser,) -# class UserAndGroupEditApi(generics.RetrieveUpdateAPIView): -# queryset = User.objects.all() -# serializer_class = serializers.UserAndGroupSerializer -# permission_classes = (IsSuperUser,) +class UserAndGroupEditApi(generics.RetrieveUpdateAPIView): + queryset = User.objects.all() + serializer_class = serializers.UserAndGroupSerializer + permission_classes = (IsSuperUser,) class UserResetPasswordApi(generics.UpdateAPIView): @@ -50,7 +50,7 @@ class UserResetPasswordApi(generics.UpdateAPIView): send_reset_password_mail(user) -class UserResetPubKeyApi(generics.UpdateAPIView): +class UserResetPKApi(generics.UpdateAPIView): queryset = User.objects.all() serializer_class = serializers.UserSerializer @@ -61,16 +61,16 @@ class UserResetPubKeyApi(generics.UpdateAPIView): user.save() send_reset_ssh_key_mail(user) -# -# class UserUpdatePKApi(generics.UpdateAPIView): -# queryset = User.objects.all() -# serializer_class = serializers.UserPKUpdateSerializer -# -# def perform_update(self, serializer): -# user = self.get_object() -# user.private_key = serializer.validated_data['_public_key'] -# user.save() -# + +class UserUpdatePKApi(generics.UpdateAPIView): + queryset = User.objects.all() + serializer_class = serializers.UserPKUpdateSerializer + + def perform_update(self, serializer): + user = self.get_object() + user.public_key = serializer.validated_data['_public_key'] + user.save() + # # class GroupDetailApi(generics.RetrieveUpdateDestroyAPIView): # queryset = UserGroup.objects.all() @@ -87,8 +87,8 @@ class UserResetPubKeyApi(generics.UpdateAPIView): # group.save() # return # serializer.save() -# -# + + # class UserListUpdateApi(BulkDeleteApiMixin, ListBulkCreateUpdateDestroyAPIView): # queryset = User.objects.all() # serializer_class = serializers.UserBulkUpdateSerializer @@ -96,12 +96,12 @@ class UserResetPubKeyApi(generics.UpdateAPIView): # # def get(self, request, *args, **kwargs): # return super(UserListUpdateApi, self).get(request, *args, **kwargs) -# + # # class GroupListUpdateApi(BulkDeleteApiMixin, ListBulkCreateUpdateDestroyAPIView): # queryset = UserGroup.objects.all() # serializer_class = serializers.GroupBulkUpdateSerializer - +# # class DeleteUserFromGroupApi(generics.DestroyAPIView): # queryset = UserGroup.objects.all() diff --git a/apps/users/forms.py b/apps/users/forms.py index 08c14f860..51947372d 100644 --- a/apps/users/forms.py +++ b/apps/users/forms.py @@ -5,6 +5,7 @@ from django.contrib.auth.forms import AuthenticationForm from django.utils.translation import gettext_lazy as _ from captcha.fields import CaptchaField +from common.utils import validate_ssh_public_key from .models import User, UserGroup from .hands import AssetPermission @@ -17,7 +18,7 @@ class UserLoginForm(AuthenticationForm): captcha = CaptchaField() -class UserCreateForm(forms.ModelForm): +class UserCreateUpdateForm(forms.ModelForm): class Meta: model = User @@ -42,22 +43,22 @@ class UserBulkImportForm(forms.ModelForm): fields = ['username', 'email', 'enable_otp', 'role'] -class UserUpdateForm(forms.ModelForm): - - class Meta: - model = User - fields = [ - 'name', 'email', 'groups', 'wechat', - 'phone', 'enable_otp', 'role', 'date_expired', 'comment', - ] - help_texts = { - 'username': '* required', - 'email': '* required', - 'groups': '* required' - } - widgets = { - 'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': _('Join user groups')}), - } +# class UserUpdateForm(forms.ModelForm): +# +# class Meta: +# model = User +# fields = [ +# 'name', 'email', 'groups', 'wechat', +# 'phone', 'enable_otp', 'role', 'date_expired', 'comment', +# ] +# help_texts = { +# 'username': '* required', +# 'email': '* required', +# 'groups': '* required' +# } +# widgets = { +# 'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': _('Join user groups')}), +# } class UserGroupForm(forms.ModelForm): @@ -84,22 +85,14 @@ class UserKeyForm(forms.Form): public_key = forms.CharField( label=_('ssh public key'), max_length=5000, widget=forms.Textarea(attrs={'placeholder': _('ssh-rsa AAAA...')}), - help_text=_('Paste your id_ras.pub here.')) + help_text=_('Paste your id_rsa.pub here.')) def clean_public_key(self): public_key = self.cleaned_data['public_key'] - if self.user._public_key and public_key == self.user.public_key: + if self.user.public_key and public_key == self.user.public_key: raise forms.ValidationError(_('Public key should not be the same as your old one.')) - from sshpubkeys import SSHKey - from sshpubkeys.exceptions import InvalidKeyException - ssh = SSHKey(public_key) - try: - ssh.parse() - except InvalidKeyException as e: - print e - raise forms.ValidationError(_('Not a valid ssh public key')) - except NotImplementedError as e: - print e + + if not validate_ssh_public_key(public_key): raise forms.ValidationError(_('Not a valid ssh public key')) return public_key @@ -126,3 +119,7 @@ class UserPrivateAssetPermissionForm(forms.ModelForm): 'system_users': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': _('Select system users')}), } + + +class FileForm(forms.Form): + excel = forms.FileField() diff --git a/apps/users/serializers.py b/apps/users/serializers.py index 0d02f85d5..9d148aa20 100644 --- a/apps/users/serializers.py +++ b/apps/users/serializers.py @@ -5,7 +5,7 @@ from django.utils.translation import ugettext_lazy as _ from rest_framework import serializers from rest_framework_bulk import BulkListSerializer, BulkSerializerMixin -from common.utils import signer +from common.utils import signer, validate_ssh_public_key from .models import User, UserGroup @@ -47,16 +47,9 @@ class UserPKUpdateSerializer(serializers.ModelSerializer): @staticmethod def validate__public_key(value): - from sshpubkeys import SSHKey - from sshpubkeys.exceptions import InvalidKeyException - ssh = SSHKey(value) - try: - ssh.parse() - except InvalidKeyException as e: - print e - raise serializers.ValidationError(_('Not a valid ssh public key')) - except NotImplementedError as e: - print e + if not validate_ssh_public_key(value): + print('Not a valid key') + print(value) raise serializers.ValidationError(_('Not a valid ssh public key')) return value diff --git a/apps/users/templates/users/_user.html b/apps/users/templates/users/_user.html index dd9f8232b..a9df818d4 100644 --- a/apps/users/templates/users/_user.html +++ b/apps/users/templates/users/_user.html @@ -6,7 +6,7 @@