mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-09-26 01:12:43 -05:00
Enhancement: require totp code for obtain auth token (#8936)
This commit is contained in:
@@ -1,11 +1,14 @@
|
||||
import logging
|
||||
|
||||
from allauth.mfa.adapter import get_adapter as get_mfa_adapter
|
||||
from allauth.mfa.models import Authenticator
|
||||
from allauth.mfa.totp.internal.auth import TOTP
|
||||
from allauth.socialaccount.models import SocialAccount
|
||||
from django.contrib.auth.models import Group
|
||||
from django.contrib.auth.models import Permission
|
||||
from django.contrib.auth.models import User
|
||||
from rest_framework import serializers
|
||||
from rest_framework.authtoken.serializers import AuthTokenSerializer
|
||||
|
||||
from paperless.models import ApplicationConfiguration
|
||||
|
||||
@@ -24,6 +27,36 @@ class ObfuscatedUserPasswordField(serializers.Field):
|
||||
return data
|
||||
|
||||
|
||||
class PaperlessAuthTokenSerializer(AuthTokenSerializer):
|
||||
code = serializers.CharField(
|
||||
label="MFA Code",
|
||||
write_only=True,
|
||||
required=False,
|
||||
)
|
||||
|
||||
def validate(self, attrs):
|
||||
attrs = super().validate(attrs)
|
||||
user = attrs.get("user")
|
||||
code = attrs.get("code")
|
||||
mfa_adapter = get_mfa_adapter()
|
||||
if mfa_adapter.is_mfa_enabled(user):
|
||||
if not code:
|
||||
raise serializers.ValidationError(
|
||||
"MFA code is required",
|
||||
)
|
||||
authenticator = Authenticator.objects.get(
|
||||
user=user,
|
||||
type=Authenticator.Type.TOTP,
|
||||
)
|
||||
if not TOTP(instance=authenticator).validate_code(
|
||||
code,
|
||||
):
|
||||
raise serializers.ValidationError(
|
||||
"Invalid MFA code",
|
||||
)
|
||||
return attrs
|
||||
|
||||
|
||||
class UserSerializer(serializers.ModelSerializer):
|
||||
password = ObfuscatedUserPasswordField(required=False)
|
||||
user_permissions = serializers.SlugRelatedField(
|
||||
|
Reference in New Issue
Block a user