Throttling TOTP

This commit is contained in:
Mohamed El-Kalioby
2021-06-23 20:43:31 +03:00
parent 6d59258393
commit 0b83758625
2 changed files with 18 additions and 2 deletions

View File

@@ -30,3 +30,14 @@ class UserKey(models.Model):
class Meta: class Meta:
app_label = "mfa" app_label = "mfa"
class OTPTracker(models.Model):
username = models.CharField(max_length=50)
value = models.CharField(max_length = 6)
success = models.BooleanField(blank=True)
done_on = models.DateTimeField(auto_now=True)
class Meta:
app_label = 'mfa'
indexes = [models.Index(fields=['username'])]

View File

@@ -11,7 +11,7 @@ from django.utils import timezone
from django.views.decorators.cache import never_cache from django.views.decorators.cache import never_cache
from .Common import get_redirect_url from .Common import get_redirect_url
from .models import UserKey from .models import UserKey, OTPTracker
from .views import login from .views import login
@@ -19,10 +19,14 @@ def verify_login(request, username, token):
for key in UserKey.objects.filter(username=username, key_type="TOTP"): for key in UserKey.objects.filter(username=username, key_type="TOTP"):
totp = pyotp.TOTP(key.properties["secret_key"]) totp = pyotp.TOTP(key.properties["secret_key"])
if totp.verify(token, valid_window=30): if totp.verify(token, valid_window=30):
if OTPTracker.objects.filter(username=username, value=token).exists():
return [False, "Used Before, please generate another token"]
TOTP_Tracker.objects.create(username=username,value=token, success=True)
key.last_used = timezone.now() key.last_used = timezone.now()
key.save() key.save()
return [True, key.id] return [True, key.id]
return [False] TOTP_Tracker.objects.create(username = username, value = token, success = False)
return [False,"Invalid Token"]
def recheck(request): def recheck(request):
@@ -60,6 +64,7 @@ def auth(request):
request.session["mfa"] = mfa request.session["mfa"] = mfa
return login(request) return login(request)
context["invalid"] = True context["invalid"] = True
context["invalid_msg"] = res[1]
return render(request, "TOTP/Auth.html", context) return render(request, "TOTP/Auth.html", context)