File size: 3,668 Bytes
e1da24d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from flask import Flask, render_template, request, redirect, url_for, flash, session
from werkzeug.security import generate_password_hash, check_password_hash
import json
import os

app = Flask(__name__)
app.secret_key = os.environ.get("FLASK_SECRET", "please-change-this-secret")  # change in production

DB_PATH = os.path.join(os.getcwd(), "arshdb")  # file named exactly "arshdb" in project root

# Ensure DB file exists and is valid JSON array
def ensure_db():
    if not os.path.exists(DB_PATH):
        with open(DB_PATH, "w") as f:
            json.dump([], f)

def load_db():
    ensure_db()
    with open(DB_PATH, "r") as f:
        try:
            data = json.load(f)
            if not isinstance(data, list):
                # Reset to empty list if corrupted
                return []
            return data
        except json.JSONDecodeError:
            return []

def save_db(users):
    # users should be a list
    with open(DB_PATH, "w") as f:
        json.dump(users, f, indent=2)

@app.route("/")
def index():
    # show login page by default
    return redirect(url_for("login"))

@app.route("/login", methods=["GET", "POST"])
def login():
    if request.method == "POST":
        email = request.form.get("email", "").strip().lower()
        password = request.form.get("password", "")

        users = load_db()
        user = next((u for u in users if u.get("email") == email), None)
        if user and check_password_hash(user.get("password_hash", ""), password):
            # login success
            session["user"] = {"username": user.get("username"), "email": user.get("email")}
            flash("Logged in successfully.", "success")
            # Redirect to external page as requested
            return redirect("https://imarshbir.github.io/")
        else:
            flash("Invalid email or password.", "danger")
            return render_template("login.html", email=email)
    else:
        return render_template("login.html")

@app.route("/register", methods=["GET", "POST"])
def register():
    if request.method == "POST":
        username = request.form.get("username", "").strip()
        email = request.form.get("email", "").strip().lower()
        password = request.form.get("password", "")

        if not username or not email or not password:
            flash("Please fill out all fields.", "warning")
            return render_template("register.html", username=username, email=email)

        users = load_db()
        if any(u for u in users if u.get("email") == email):
            flash("Email already registered. Try logging in.", "warning")
            return render_template("register.html", username=username, email=email)

        if any(u for u in users if u.get("username").lower() == username.lower()):
            flash("Username already taken. Choose another.", "warning")
            return render_template("register.html", username=username, email=email)

        password_hash = generate_password_hash(password)
        new_user = {
            "username": username,
            "email": email,
            "password_hash": password_hash
        }
        users.append(new_user)
        save_db(users)
        flash("Registration successful. You can now log in.", "success")
        return redirect(url_for("login"))

    return render_template("register.html")

@app.route("/logout")
def logout():
    session.pop("user", None)
    flash("Logged out.", "info")
    return redirect(url_for("login"))

# Basic health check (optional)
@app.route("/ping")
def ping():
    return "pong", 200

if __name__ == "__main__":
    # for local testing
    app.run(host="0.0.0.0", port=7860, debug=True)