#!/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()