40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
|
from core.classes.otp import BaseOTPProvider
|
||
|
from smsotp.models import OTPToken
|
||
|
from core.modules.sms import get_default_sms_provider
|
||
|
|
||
|
from dbsettings.functions import getValue
|
||
|
|
||
|
from django.utils import timezone
|
||
|
|
||
|
class SMSOTP(BaseOTPProvider):
|
||
|
@property
|
||
|
def get_name(self):
|
||
|
return "SMS OTP"
|
||
|
|
||
|
def create_token(self, user):
|
||
|
token = OTPToken.objects.create(user=user)
|
||
|
try:
|
||
|
token.send_sms()
|
||
|
return True
|
||
|
except:
|
||
|
return False
|
||
|
|
||
|
@property
|
||
|
def is_active(self):
|
||
|
return bool(get_default_sms_provider())
|
||
|
|
||
|
def start_authentication(self, user):
|
||
|
if self.create_token(user):
|
||
|
return "We have sent you an SMS containing your authentication token."
|
||
|
else:
|
||
|
return "An error has occurred, please try again later or contact the administrator."
|
||
|
|
||
|
def validate_token(self, user, token):
|
||
|
try:
|
||
|
max_age = timezone.now() - timezone.timedelta(seconds=int(getValue("smsotp.max_age", "300")))
|
||
|
OTPToken.objects.get(user=user, token=token, creation__gte=max_age).delete()
|
||
|
return True
|
||
|
except OTPToken.DoesNotExist:
|
||
|
return False
|
||
|
|
||
|
OTPPROVIDERS = [SMSOTP]
|