From a9b5a53bdbfce685927b1eadf11fb18e700c9ee8 Mon Sep 17 00:00:00 2001 From: csd4ni3l Date: Wed, 22 Oct 2025 23:16:33 +0200 Subject: [PATCH] Add working register and login with database, add a register page, make a new pattern file for handling it --- .gitignore | 1 + loginween/main.py | 64 +++++++++++++++-- loginween/pattern.py | 22 ++++++ loginween/templates/login.jinja2 | 33 +++++---- loginween/templates/register.jinja2 | 104 +++++++++++++++++++++++++++- 5 files changed, 201 insertions(+), 23 deletions(-) create mode 100644 loginween/pattern.py diff --git a/.gitignore b/.gitignore index 41a0142..39a3fd4 100644 --- a/.gitignore +++ b/.gitignore @@ -181,3 +181,4 @@ logs/ logs settings.json data.json +data.db \ No newline at end of file diff --git a/loginween/main.py b/loginween/main.py index 2b6deb5..6fc854d 100644 --- a/loginween/main.py +++ b/loginween/main.py @@ -1,8 +1,10 @@ -from flask import Flask, render_template, redirect, url_for, g +from flask import Flask, Response, render_template, redirect, url_for, g, request from flask_login import LoginManager, login_required -import sqlite3, os, flask_login, dotenv, secrets +from loginween.pattern import Pattern + +import sqlite3, os, flask_login, dotenv, secrets, json if os.path.exists(".env"): dotenv.load_dotenv(".env") @@ -23,7 +25,7 @@ def get_db(): db.execute(""" CREATE TABLE IF NOT EXISTS Users ( username TEXT PRIMARY KEY, - pumpkin_carving TEXT PRIMARY KEY + pattern TEXT UNIQUE ) """) @@ -53,12 +55,60 @@ def unathorized_handler(): def main(): return render_template("index.jinja2") -@app.route("/login") +@app.route("/login", methods=["GET", "POST"]) def login(): - return render_template("login.jinja2") + if request.method == "GET": + if flask_login.current_user.is_authenticated: + return redirect(url_for("main")) -@app.route("/register") + return render_template("login.jinja2", grid_size=os.getenv("GRID_SIZE", 25)) + + elif request.method == "POST": + username = request.form["username"] + pattern = Pattern.from_str(request.form["pattern"]) + + cur = get_db().cursor() + + cur.execute("SELECT pattern from Users WHERE username = ?", (username, )) + + required_pattern = cur.fetchone() + if not required_pattern: + cur.close() + return Response("An account with this username doesn't exist.", 400) + + if pattern == Pattern.from_json_str(required_pattern[0]): + cur.close() + + user = User() + user.id = username + flask_login.login_user(user, remember=True) + + return redirect(url_for("main")) + +@app.route("/register", methods=["GET", "POST"]) def register(): - return render_template("register.jinja2") + if request.method == "GET": + if flask_login.current_user.is_authenticated: + return redirect(url_for("main")) + + return render_template("register.jinja2", grid_size=os.getenv("GRID_SIZE", 25)) + + elif request.method == "POST": + username = request.form["username"] + pattern = Pattern.from_str(request.form["pattern"]) + + cur = get_db().cursor() + + cur.execute("SELECT username from Users WHERE username = ?", (username, )) + + if cur.fetchone(): + cur.close() + return Response("An account with this username already exists.", 400) + + cur.execute("INSERT INTO Users (username, pattern) VALUES (?, ?)", (username, pattern.to_json_str())) + get_db().commit() + cur.close() + + return redirect(url_for("login")) app.run(host=os.getenv("HOST", "0.0.0.0"), port=os.getenv("PORT", 8080), debug=os.getenv("DEBUG_MODE", False)) \ No newline at end of file diff --git a/loginween/pattern.py b/loginween/pattern.py new file mode 100644 index 0000000..3235f4d --- /dev/null +++ b/loginween/pattern.py @@ -0,0 +1,22 @@ +import json + +class Pattern(): + def __init__(self, data: list[tuple]): + self.data: list[tuple] = data + + @classmethod + def from_str(cls, string): + return cls([tuple(map(int, pos.split(","))) for pos in json.loads(string)]) + + @classmethod + def from_json_str(cls, data): + return cls(list(map(tuple, json.loads(data)))) + + def to_json_str(self): + return json.dumps(self.data) + + def __eq__(self, value): + if not isinstance(value, Pattern): + return False + + return set(self.data) == set(value.data) \ No newline at end of file diff --git a/loginween/templates/login.jinja2 b/loginween/templates/login.jinja2 index f900844..a50c3a7 100644 --- a/loginween/templates/login.jinja2 +++ b/loginween/templates/login.jinja2 @@ -15,14 +15,20 @@ {% endblock %} {% block body %} -
-

LoginWeen: Draw your carving to log in!

- -
- - -
-
+
+
+

Draw a carving to login!

+ + +
+ +
+
+ + +
+
+
{% endblock body %} \ No newline at end of file