Add qr code for mfa
This commit is contained in:
@@ -1,12 +1,15 @@
|
||||
import os
|
||||
import re
|
||||
import sqlite3
|
||||
from base64 import b64encode
|
||||
from io import BytesIO
|
||||
from datetime import datetime, timezone
|
||||
from functools import wraps
|
||||
from pathlib import Path
|
||||
|
||||
from flask import Flask, abort, flash, g, redirect, render_template, request, session, url_for
|
||||
import pyotp
|
||||
import qrcode
|
||||
from werkzeug.security import check_password_hash, generate_password_hash
|
||||
|
||||
BASE_DIR = Path(__file__).resolve().parent
|
||||
@@ -216,6 +219,14 @@ def pending_mfa_user():
|
||||
return get_db().execute("SELECT * FROM users WHERE id = ?", (user_id,)).fetchone()
|
||||
|
||||
|
||||
def mfa_qr_code(secret, username):
|
||||
uri = pyotp.TOTP(secret).provisioning_uri(name=username, issuer_name="Eternity Project")
|
||||
image = qrcode.make(uri)
|
||||
buffer = BytesIO()
|
||||
image.save(buffer, format="PNG")
|
||||
return f"data:image/png;base64,{b64encode(buffer.getvalue()).decode('ascii')}"
|
||||
|
||||
|
||||
@app.route("/mfa/setup", methods=("GET", "POST"))
|
||||
def mfa_setup():
|
||||
user = pending_mfa_user()
|
||||
@@ -232,7 +243,9 @@ def mfa_setup():
|
||||
session["mfa_verified"] = True
|
||||
return redirect(next_url)
|
||||
flash("That verification code was not accepted. Try the current code.", "error")
|
||||
return render_template("mfa.html", mode="setup", secret=secret, username=user["username"])
|
||||
return render_template(
|
||||
"mfa.html", mode="setup", secret=secret, username=user["username"], qr_code=mfa_qr_code(secret, user["username"])
|
||||
)
|
||||
|
||||
|
||||
@app.route("/mfa/verify", methods=("GET", "POST"))
|
||||
|
||||
Reference in New Issue
Block a user