feat: added login to project

This commit is contained in:
iritmaximus
2023-02-20 17:11:34 +02:00
parent 581bc54077
commit e13b5a072f
5 changed files with 127 additions and 24 deletions
+1 -1
View File
@@ -11,4 +11,4 @@
<input type="submit" name="login">
</form>
<p><a href="/createuser">Create new user</a></p>
<p><a href="/signup">Create new user</a></p>
+14
View File
@@ -0,0 +1,14 @@
<title>Sign Up</title>
<h1>Sign Up page</h1>
<form action="/signup" method="POST">
<label for="username">Username:</label>
<input type="text" name="username">
<br>
<label for="password">Password:</label>
<input type="text" name="password">
<br>
<input type="submit" name="signup">
</form>
<p><a href="/login">Already have an account?</a></p>
+63 -5
View File
@@ -1,10 +1,68 @@
# import bcrypt
from flask import session
from flaskr.database import db
def generate_token():
pass
from werkzeug.security import check_password_hash, generate_password_hash
def generate_session(name: str):
print("session name", session.get("name"))
session["name"] = name
def check_session() -> bool:
if session.get("name") is not None and len(session["name"]) > 0:
return True
else:
return False
def check_user_login(name: str, password: str) -> bool:
# query sql
# 1. check if username exists
# 2. check if passwords match
print("checking if username exists")
sql = "SELECT password FROM users as u where u.username=:username"
result = db.session.execute(sql, {"username": name}).fetchone()
print("password:", result)
if result is None:
return False
print("found username, checking password")
if check_password_hash(result[0], password):
print("password matches")
return True
def check_user_exists(name: str, pass_hash: str):
return False
def hash_password(password: str):
pass
def check_username_exists(username: str) -> bool:
sql = "SELECT COUNT(*) FROM users as u WHERE u.username=:username"
result = db.session.execute(sql, {"username": username}).fetchone()
print("result:", result)
if result is not None:
if result[0] == 0:
return False
return True
def create_new_user(name: str, text_password: str):
# insert into sql
# 1. username
# 2. hashed password
username = str(name)
if check_username_exists(username):
raise ValueError("Username exists")
password = hash_password(text_password)
print("inserting to db")
sql = "INSERT INTO users (username, password) VALUES (:username, :password)"
db.session.execute(sql, {"username": username, "password": password})
db.session.commit()
print("success")
def hash_password(password: str) -> str:
return generate_password_hash(password)
+47 -16
View File
@@ -1,16 +1,19 @@
from flask import render_template, request, redirect, url_for, flash
from flask import render_template, request, redirect, url_for
from flaskr import app
from flaskr.database import db, test_db, create_db
from flaskr.user import check_user_exists, generate_token
from flaskr.database import test_db, create_db, reset_db
from flaskr.user import (
check_user_login,
generate_session,
check_session,
create_new_user,
)
@app.route("/")
def navigate():
sessionid = ""
if not sessionid:
redirect(url_for("login"))
if not check_session():
return redirect(url_for("login"))
return render_template("home.html")
@@ -35,33 +38,61 @@ def get_times():
@app.route("/login", methods=["GET", "POST"])
def login():
if request.method == "GET":
if check_session():
# already logged in
return redirect(url_for("navigate"))
return render_template("login.html")
elif request.method == "POST":
username = request.form["username"]
password = request.form["password"]
if check_user_exists(username, password):
generate_token()
# TODO generate error messsage for incorrect login
if check_user_login(username, password):
generate_session(username)
return redirect(url_for("navigate"))
else:
flash("Incorrect login", "error")
print("send notification: incorrect login")
print("*** incorrect login ***")
return redirect(url_for("login"))
else:
return "Incorrect http method"
@app.route("/signup", methods=["GET", "POST"])
def signup():
if request.method == "GET":
return render_template("signup.html")
return f"Todo POST request {username} {password}"
elif request.method == "POST":
username = request.form["username"]
password = request.form["password"]
print("creating new user...")
try:
create_new_user(username, password)
except ValueError as e:
print("Error:", e)
return redirect(url_for("signup"))
@app.route("/createuser")
def createuser():
return "new user created"
return redirect(url_for("navigate"))
@app.route("/init")
else:
print("incorrect method")
return "Error: Incorrect method"
@app.route("/db/init")
def initialize_db():
return create_db()
@app.route("/db/reset")
def reset_database():
reset_db()
return "Initialization successful"
@app.route("/db")
def test_db_route():
return test_db()
+2 -2
View File
@@ -1,7 +1,7 @@
CREATE TABLE IF NOT EXISTS users (
id serial primary key,
name varchar(80) not null,
password varchar(80) not null
username varchar(80) not null,
password varchar(150) not null
);
CREATE TABLE IF NOT EXISTS games (