diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9b0ee44 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.gitignore +/.idea/ +testing.py +/databases/ diff --git a/frontend/app.py b/frontend/app.py new file mode 100644 index 0000000..31a73c2 --- /dev/null +++ b/frontend/app.py @@ -0,0 +1,79 @@ +from flask import Flask, render_template, request, redirect, url_for, flash + +import hashlib + +def hash_password(password): + return hashlib.sha512(password.strip().encode('utf-8')).hexdigest() + +app = Flask(__name__) +app.secret_key = 'your_secret_key' + +@app.route('/') +def home(): + return redirect(url_for('login')) + +@app.route('/register', methods=['GET', 'POST']) +def register(): + import standard.getter as st_getter + import sqlLite.set as setter + + if request.method == 'POST': + username = request.form['username'] + email = request.form.get('email') + password = request.form.get('password') + pwd_confirm = request.form.get('confirm_password') + + if not email or not password or not pwd_confirm or not username: + flash('Please fill out all fields', 'error') + return redirect(url_for('register')) + + if password != pwd_confirm: + flash('Passwords do not match', 'error') + return redirect(url_for('register')) + + try: + if st_getter.get_validate_email(email): + setter.set_login(username, email, password) + flash('Registration successful! Please log in.', 'success') + return redirect(url_for('login')) + else: + flash('Invalid email format', 'error') + return redirect(url_for('register')) + except Exception as e: + flash(f'Error: {str(e)}', 'error') + return redirect(url_for('register')) + # For GET-requests: + return render_template('register.html') + + +@app.route('/login', methods=['GET', 'POST']) +def login(): + if request.method == 'POST': + enter_email = request.form.get('email') + enter_password = request.form.get('password') + import hashlib + import sqlLite.get as getter + import standard.getter as st_getter + + stored_hash = getter.get_password_by_email(enter_email) # use email here + + if stored_hash is None: + flash("User not found!") + return redirect(url_for("login")) + + hash_entered = st_getter.get_password_hash(enter_password) + + if hash_entered == stored_hash: + return redirect(url_for('dashboard')) + else: + flash('Invalid email or password', 'error') + print("Stored hash:", stored_hash) + print("Entered hash:", hash_entered) + return redirect(url_for('login')) + + return render_template('login.html') + +@app.route('/dashboard') +def dashboard(): + #return "Welcome to the dashboard! Login successful." + return render_template('dashboard.html') diff --git a/frontend/templates/dashboard.html b/frontend/templates/dashboard.html new file mode 100644 index 0000000..5244e39 --- /dev/null +++ b/frontend/templates/dashboard.html @@ -0,0 +1,119 @@ + + + + + + Register + + + + + diff --git a/frontend/templates/login.html b/frontend/templates/login.html new file mode 100644 index 0000000..82d8a0c --- /dev/null +++ b/frontend/templates/login.html @@ -0,0 +1,141 @@ + + + + + + Login + + + +
+

Login to Your Account

+ {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} +
+ {% for category, message in messages %} + {{ message }} + {% endfor %} +
+ {% endif %} + {% endwith %} +
+
+ + +
+
+ + +
+ +
+
+ + diff --git a/frontend/templates/register.html b/frontend/templates/register.html new file mode 100644 index 0000000..8563531 --- /dev/null +++ b/frontend/templates/register.html @@ -0,0 +1,152 @@ + + + + + + Register + + + +
+

Create an Account

+ {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} +
+ {% for category, message in messages %} + {{ message }} + {% endfor %} +
+ {% endif %} + {% endwith %} +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +

Already have an account? Log in here.

+
+
+ + diff --git a/main.py b/main.py index 4cd5283..430e84f 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,12 @@ -import sqlite3 +import sqlLite -DB_CON = sqlite3.connect("database.db") -DB_CUR = DB_CON.cursor() +from frontend.app import app +sqlLite.set_db_name("databases/test.db") + +import sqlLite.create as create + +create.create_table_t_user() + +if __name__ == '__main__': + app.run(debug=True, host='0.0.0.0', port=8080) diff --git a/sqlLite/__init__.py b/sqlLite/__init__.py new file mode 100644 index 0000000..8c2255d --- /dev/null +++ b/sqlLite/__init__.py @@ -0,0 +1,3 @@ +def set_db_name(name): + global db_name + db_name = name \ No newline at end of file diff --git a/sqlLite/auth.py b/sqlLite/auth.py new file mode 100644 index 0000000..eb862b5 --- /dev/null +++ b/sqlLite/auth.py @@ -0,0 +1,17 @@ + +def login(name_email, password): + import get as getter + password_stored = getter.get_password_by_email(name_email) + if password_stored is None: + return None + elif password_stored != password: + return None + else: + return True + +def register(username, email, password): + import standard.getter as st_getter + if st_getter.get_validate_email(email): + hashed_password = st_getter.get_password_hash(password) + import sqlLite.set as sq_setter + sq_setter.set_login(username, email,hashed_password) \ No newline at end of file diff --git a/sqlLite/create.py b/sqlLite/create.py new file mode 100644 index 0000000..d9d1503 --- /dev/null +++ b/sqlLite/create.py @@ -0,0 +1,15 @@ +import sqlite3 +from . import db_name + +## Create Tables +def create_table_t_user(): + db_con = sqlite3.connect(db_name) + db_cur = db_con.cursor() + db_cur.execute(""" + CREATE TABLE IF NOT EXISTS T_USERS ( + ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + USERNAME TEXT NOT NULL UNIQUE, + EMAIL TEXT NOT NULL UNIQUE, + PASSWORD TEXT NOT NULL + );""") + db_con.commit() \ No newline at end of file diff --git a/sqlLite/get.py b/sqlLite/get.py new file mode 100644 index 0000000..3407f72 --- /dev/null +++ b/sqlLite/get.py @@ -0,0 +1,40 @@ +import sqlite3 +from . import db_name + +def get_all_users(): + conn = sqlite3.connect(db_name) + cursor = conn.cursor() + cursor.execute('select * from T_USERS') + rows = cursor.fetchall() + for row in rows: + print(row) + +def get_userinfo_by_username(username): + conn = sqlite3.connect(db_name) + cursor = conn.cursor() + cursor.execute('select * from T_USERS where username = ?', (username,)) + rows = cursor.fetchall() + for row in rows: + print(row) + +def get_password_by_username(username): + conn = sqlite3.connect(db_name) + cursor = conn.cursor() + cursor.execute('SELECT PASSWORD FROM T_USERS WHERE username = ?', (username,)) + row = cursor.fetchone() + cursor.close() + conn.close() + if row is None: + return None + return row[0] # password string + +def get_password_by_email(email): + conn = sqlite3.connect(db_name) + cursor = conn.cursor() + cursor.execute('SELECT PASSWORD FROM T_USERS WHERE EMAIL = ?', (email,)) + row = cursor.fetchone() + cursor.close() + conn.close() + if row is None: + return None + return row[0] # password string \ No newline at end of file diff --git a/sqlLite/set.py b/sqlLite/set.py new file mode 100644 index 0000000..3ebe9a2 --- /dev/null +++ b/sqlLite/set.py @@ -0,0 +1,17 @@ +from hashlib import sha512 +import sqlite3 +import standard.getter as st_getter +from . import db_name + +def set_login(username, email, password): + db_con = sqlite3.connect(db_name) + db_cur = db_con.cursor() + try: + if st_getter.get_validate_email(email): + db_cur.execute("INSERT INTO T_USERS (USERNAME, EMAIL, PASSWORD) VALUES (?,?,?)", (username ,email , st_getter.get_password_hash(password))) + db_con.commit() + else: + print("Email entered is not valid") + except sqlite3.IntegrityError: + print("Username or Email entered is not unique") + db_con.close() \ No newline at end of file diff --git a/standard/getter.py b/standard/getter.py new file mode 100644 index 0000000..4564e4e --- /dev/null +++ b/standard/getter.py @@ -0,0 +1,12 @@ +def get_password_hash(password): + from hashlib import sha512 + password = password.strip() + return sha512(password.encode('utf-8')).hexdigest() + +def get_validate_email(email): + import re + valid = re.match(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$', email) + if valid: + return True + else: + return False \ No newline at end of file