File size: 3,127 Bytes
eb796ce
0d2208a
8e8453e
0d2208a
0a96fb2
 
0d2208a
 
d9fbe52
 
5f00f06
0d2208a
 
d9fbe52
0d2208a
5f00f06
 
ab04db2
d9fbe52
0d2208a
ab04db2
0d2208a
 
 
 
d9fbe52
91bc074
0d2208a
d9fbe52
0d2208a
d9fbe52
 
ab04db2
0d2208a
ab04db2
 
 
239b62a
0d2208a
 
 
 
91bc074
0d2208a
 
 
91bc074
 
 
 
 
 
0d2208a
 
 
ab04db2
0d2208a
 
 
 
239b62a
0d2208a
d9fbe52
0d2208a
d9fbe52
91bc074
 
 
 
 
0d2208a
d9fbe52
0d2208a
 
 
 
 
91bc074
0d2208a
 
8e8453e
0d2208a
91bc074
 
 
 
0d2208a
 
d9fbe52
 
 
0d2208a
91bc074
d9fbe52
91bc074
ab04db2
d9fbe52
0d2208a
d9fbe52
 
 
0d2208a
 
33cfdd9
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import os
import secrets
from datetime import datetime, timedelta
from flask import Flask, render_template, request, redirect, url_for, session, flash
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
from dotenv import load_dotenv
import pandas as pd
from huggingface_hub import HfApi, HfFolder
from datasets import Dataset as HFDataset

# Load environment variables
load_dotenv()

# --- Config ---
ADMIN_USER = os.getenv("ADMIN_USER", "admin")
ADMIN_PASS = os.getenv("ADMIN_PASS", "Welcome123")
HF_TOKEN = os.getenv("HF_TOKEN")
REPO_ID = "0vergeared/otp-logs"
OTP_EXPIRY_MINUTES = 5

# --- Flask App ---
app = Flask(__name__)
app.secret_key = os.getenv("FLASK_SECRET", "changeme123")
limiter = Limiter(get_remote_address, app=app)

# --- Memory store for OTPs
otp_store = {}

# ---------------- ROUTES ---------------- #

@app.route("/")
def index():
    return redirect(url_for("admin"))

@app.route("/admin", methods=["GET", "POST"])
def admin():
    if request.method == "POST":
        user = request.form.get("username")
        pwd = request.form.get("password")
        if user == ADMIN_USER and pwd == ADMIN_PASS:
            session["logged_in"] = True
            return redirect(url_for("dashboard"))
        flash("Invalid credentials", "error")
    return render_template("login.html")

@app.route("/dashboard")
def dashboard():
    if not session.get("logged_in"):
        return redirect(url_for("admin"))
    return render_template("dashboard.html")

@app.route("/generate_otp")
def generate_otp():
    if not session.get("logged_in"):
        return redirect(url_for("admin"))
    
    otp = secrets.token_urlsafe(6)[:6].upper()
    expiry = datetime.utcnow() + timedelta(minutes=OTP_EXPIRY_MINUTES)
    otp_store[otp] = {"expiry": expiry, "used": False}

    save_otp_to_dataset(otp, expiry.strftime("%Y-%m-%d %H:%M:%S UTC"))

    return render_template("otp_result.html", otp=otp, expiry=expiry.strftime("%Y-%m-%d %H:%M UTC"))

@app.route("/logout")
def logout():
    session.clear()
    return redirect(url_for("admin"))

# ---------------- HELPERS ---------------- #

def save_otp_to_dataset(otp: str, expiry: str):
    try:
        if not HF_TOKEN:
            print("❌ HF_TOKEN not set.")
            return

        HfFolder.save_token(HF_TOKEN)
        api = HfApi()

        local_file = "otp_temp.csv"
        if not os.path.exists(local_file):
            pd.DataFrame(columns=["otp", "expiry"]).to_csv(local_file, index=False)

        df = pd.read_csv(local_file)
        df = pd.concat([df, pd.DataFrame([{"otp": otp, "expiry": expiry}])], ignore_index=True)
        df.to_csv(local_file, index=False)

        dataset = HFDataset.from_pandas(df)
        dataset.push_to_hub(REPO_ID, token=HF_TOKEN)

        print(f"✅ OTP {otp} pushed to dataset.")
    except Exception as e:
        print("❌ Dataset push failed:", e)

@app.after_request
def allow_iframe(response):
    response.headers["X-Frame-Options"] = "SAMEORIGIN"
    return response

# ---------------- MAIN ---------------- #

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=7860)