ungleich-otp/ungleichotp/otpauth/serializer.py

46 lines
1.4 KiB
Python
Raw Normal View History

2018-11-17 10:21:35 +00:00
from rest_framework import serializers
from otpauth.models import OTPSeed
import pyotp
class OTPSerializer(serializers.ModelSerializer):
class Meta:
model = OTPSeed
fields = ('name', 'realm')
token = serializers.CharField(max_length=128)
verifyname = serializers.CharField(max_length=128)
verifytoken = serializers.CharField(max_length=128)
verifyrealm = serializers.CharField(max_length=128)
class VerifySerializer(serializers.ModelSerializer):
class Meta:
model = OTPSeed
fields = ('name', 'realm')
token = serializers.CharField(max_length=128)
verifyname = serializers.CharField(max_length=128)
verifytoken = serializers.CharField(max_length=128)
verifyrealm = serializers.CharField(max_length=128)
def update(self, instance, validated_data):
token_in = validated_data.get('token')
name_in = validated_data.get('name')
realm_in = validated_data.get('realm')
try:
2018-11-17 10:39:42 +00:00
db_instance = otpauth.models.OTPSeed.objects.get(name=name_in, realm=realm_in)
except (OTPSeed.MultipleObjectsReturned, OTPSeed.DoesNotExist):
# FIXME: correct return?
2018-11-17 10:21:35 +00:00
return None
# Generate token and compare
2018-11-17 10:39:42 +00:00
totp = pyotp.TOTP(db_instance.seed)
2018-11-17 10:21:35 +00:00
2018-11-17 10:39:42 +00:00
if totp.verify(token_in, valid_window=3):
2018-11-17 10:21:35 +00:00
return "OK"
else:
return "FAIL"