diff options
author | 2013-08-19 11:59:32 +0200 | |
---|---|---|
committer | 2013-08-19 13:59:46 +0200 | |
commit | 7e503988117d858dbd26624872bd3481030bd3c4 (patch) | |
tree | 129ee365e2772b7b6eb8f8ac00b22c76d472b50d /okupy/accounts | |
parent | Add more docstring on okupy.common and okupy.otp. (diff) | |
download | identity.gentoo.org-7e503988117d858dbd26624872bd3481030bd3c4.tar.gz identity.gentoo.org-7e503988117d858dbd26624872bd3481030bd3c4.tar.bz2 identity.gentoo.org-7e503988117d858dbd26624872bd3481030bd3c4.zip |
Revoke OTP tokens in views rather than backends.
Since we use a single revoked token database, we should also revoke each
input once. When revocation was done in models, the second backend would
always hit the token already revoked. Instead, revoke them in views.
Diffstat (limited to 'okupy/accounts')
-rw-r--r-- | okupy/accounts/views.py | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/okupy/accounts/views.py b/okupy/accounts/views.py index acc0c72..e245d43 100644 --- a/okupy/accounts/views.py +++ b/okupy/accounts/views.py @@ -40,6 +40,7 @@ from ..common.decorators import strong_auth_required from ..common.exceptions import OkupyError from ..common.log import log_extra_data from ..otp import init_otp +from ..otp.models import RevokedToken from ..otp.sotp.models import SOTPDevice from ..otp.totp.models import TOTPDevice @@ -115,6 +116,9 @@ def login(request): else: raise OkupyError('OTP verification failed') + # prevent replay attacks and race conditions + if not RevokedToken.add(request.user, token): + raise OkupyError('OTP verification failed') dev = django_otp.match_token(request.user, token) if not dev: raise OkupyError('OTP verification failed') @@ -384,6 +388,10 @@ def otp_setup(request): if not conf_form.is_valid(): raise OkupyError() token = conf_form.cleaned_data['otp_token'] + + # prevent reusing the same token to login + if not RevokedToken.add(request.user, token): + raise OkupyError() if not dev.verify_token(token, secret): raise OkupyError() except OkupyError: |