77 lines
2.1 KiB
Python
77 lines
2.1 KiB
Python
#!/usr/bin/python3
|
|
|
|
import sqlite3
|
|
import re
|
|
from onetimepass import valid_totp
|
|
from secrets import choice
|
|
import segno
|
|
from os import path
|
|
import uuid
|
|
|
|
class Tools():
|
|
|
|
def __init__(self):
|
|
self.username = ''
|
|
|
|
#check code
|
|
def code_is_valid(self, code, db):
|
|
con = sqlite3.connect(db)
|
|
cur = con.cursor()
|
|
|
|
codes=[]
|
|
for row in cur.execute('SELECT * FROM codes WHERE valid = 1'):
|
|
codes.append(row[0])
|
|
return(bool(code in codes))
|
|
|
|
def mark_code_as_used(self, code, db):
|
|
con = sqlite3.connect(db)
|
|
cur = con.cursor()
|
|
|
|
cur.execute('''UPDATE codes SET valid=? WHERE code==?''',(0, code))
|
|
con.commit()
|
|
|
|
#form validation
|
|
|
|
def input_validation(self, e, ws=None):
|
|
if ws:
|
|
#accepts whitespaces
|
|
regex = r'^\w+( \w+)*$'
|
|
else:
|
|
regex = r'^\w+$'
|
|
return(bool(re.fullmatch(regex, e)))
|
|
|
|
def email_validation(self, e):
|
|
regex = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
|
|
return(bool(re.fullmatch(regex, e)))
|
|
|
|
def pwd_validation(self, e):
|
|
regex = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!#%*?&]{8,18}$'
|
|
return(bool(re.fullmatch(regex, e)))
|
|
|
|
# 2FA
|
|
def gen_qr(self, secret):
|
|
if(not path.isfile('static/tmp/'+secret+'.png')):
|
|
qrcode = segno.make(secret, micro=False)
|
|
qrcode.save('static/tmp/'+secret+'.png', scale=10)
|
|
|
|
def gen_secret(self): # Function to return a random string with length 16.
|
|
secret = ''
|
|
while len(secret) < 16:
|
|
secret += choice('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567')
|
|
self.gen_qr(secret)
|
|
return secret
|
|
|
|
def _2fa_validation(self, otp, secret):
|
|
authenticated = valid_totp(otp, secret)
|
|
if authenticated:
|
|
print('Correct otp, Authenticated!')
|
|
return True
|
|
elif not authenticated:
|
|
print('Wrong otp, please try again.')
|
|
return False
|
|
|
|
def key(self):
|
|
return uuid.uuid4().hex
|
|
|
|
tools = Tools()
|