ungleich-otp/ungleichotp/otpauth/serializer.py

70 lines
2.3 KiB
Python
Raw Normal View History

2018-11-17 16:46:16 +00:00
from rest_framework import serializers, exceptions
2018-11-17 10:21:35 +00:00
from otpauth.models import OTPSeed
import pyotp
2018-11-17 16:46:16 +00:00
import otpauth
2018-11-17 10:21:35 +00:00
2018-11-17 16:46:16 +00:00
# class OTPSerializer(serializers.ModelSerializer):
# class Meta:
# model = OTPSeed
# fields = ('name', 'realm')
2018-11-17 10:21:35 +00:00
2018-11-17 16:46:16 +00:00
# token = serializers.CharField(max_length=128)
2018-11-17 10:21:35 +00:00
2018-11-17 16:46:16 +00:00
# verifyname = serializers.CharField(max_length=128)
# verifytoken = serializers.CharField(max_length=128)
# verifyrealm = serializers.CharField(max_length=128)
2018-11-17 10:21:35 +00:00
2018-11-17 16:46:16 +00:00
# class VerifySerializer(serializers.ModelSerializer):
# class Meta:
# model = OTPSeed
# fields = ('name', 'realm', 'token', 'verifyname', 'verifytoken', 'verifyrealm')
2018-11-17 10:21:35 +00:00
2018-11-17 16:46:16 +00:00
class VerifySerializer(serializers.Serializer):
name = serializers.CharField(max_length=128)
2018-11-17 10:21:35 +00:00
token = serializers.CharField(max_length=128)
2018-11-17 16:46:16 +00:00
realm = serializers.CharField(max_length=128)
2018-11-17 10:21:35 +00:00
verifyname = serializers.CharField(max_length=128)
verifytoken = serializers.CharField(max_length=128)
verifyrealm = serializers.CharField(max_length=128)
2018-11-17 16:46:16 +00:00
def create(self, validated_data):
2018-11-17 10:21:35 +00:00
token_in = validated_data.get('token')
name_in = validated_data.get('name')
realm_in = validated_data.get('realm')
2018-11-17 17:48:12 +00:00
verifytoken = validated_data.get('verifytoken')
verifyname = validated_data.get('verifyname')
verifyrealm = validated_data.get('verifyrealm')
# 1. Verify that the connection might authenticate
2018-11-17 10:21:35 +00:00
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):
2018-11-17 17:48:12 +00:00
raise exceptions.AuthenticationFailed()
print("serializer found object")
2018-11-17 10:21:35 +00:00
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 17:48:12 +00:00
if not totp.verify(token_in, valid_window=3):
raise exceptions.AuthenticationFailed()
# 2. Verify the requested data
try:
verifyinstance = otpauth.models.OTPSeed.objects.get(name=verifyname, realm=verifyrealm)
except (OTPSeed.MultipleObjectsReturned, OTPSeed.DoesNotExist):
raise exceptions.PermissionDenied()
totp = pyotp.TOTP(verifyinstance.seed)
if not totp.verify(verifytoken, valid_window=3):
raise exceptions.PermissionDenied()
print("All verified!")
return verifyinstance