diff --git a/.gitignore b/.gitignore index e43b0f988953ae3a84b00331d0ccf5f7d51cb3cf..cb10762d1f8f5f0399fb0d08151b12ff9f273396 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ .DS_Store +__pycache__ +.idea diff --git a/Backend/main.py b/Backend/main.py index d24ab73938db166e5032fdc0c93331ebc9307689..70c42cdaf7dd071f8ecabf2b8e71a287135dd300 100644 --- a/Backend/main.py +++ b/Backend/main.py @@ -1,41 +1,35 @@ -from flask import Flask, jsonify -from flask_mysqldb import MySQL -from routes.category import get_category -from routes.order import get_order -from routes.home import get_home -from routes.cart import get_cart -from routes.login import post_login - -# Initialize APP -app = Flask(__name__) -app.config['MYSQL_HOST'] = 'localhost' -app.config['MYSQL_USER'] = 'root' -app.config['MYSQL_PASSWORD'] = '' -app.config['MYSQL_DB'] = 'ElectroMart' -app.config['MYSQL_UNIX_SOCKET'] = '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock' -mysql = MySQL(app) +from utils.application import app +#from routes.category import get_category +#from routes.order import get_order +#from routes.home import get_home +#from routes.cart import get_cart +from routes.login import post_login, post_register # Routing -@app.route('/', methods=['GET']) -def home(): - return get_home() +#@app.route('/', methods=['GET']) +#def home(): +# return get_home() -@app.route('/order/<int:order_id>', methods=['GET']) -def order(order_id): - return get_order(order_id) +#@app.route('/order/<int:order_id>', methods=['GET']) +#def order(order_id): +# return get_order(order_id) -@app.route('/category', methods=['GET']) -@app.route('/category/<string:category_name>', methods=['GET']) -def category(category_name): - return get_category(category_name) +#@app.route('/category', methods=['GET']) +#@app.route('/category/<string:category_name>', methods=['GET']) +#def category(category_name): +# return routes.category.get_category(category_name) -@app.route('/cart', methods=['GET']) -def cart(): - return get_cart() +#@app.route('/cart', methods=['GET']) +#def cart(): +# return get_cart() @app.route('/login', methods=['POST']) def login(): return post_login() +@app.route('/register', methods=['POST']) +def register(): + return post_register() + if __name__ == '__main__': app.run(debug=True, port=8080) \ No newline at end of file diff --git a/Backend/routes/category.py b/Backend/routes/category.py index fa16d8177549de957f0429aa20f13e1b91faf245..db9e1b3fc4c3c2a90256375d0403434c4b0e67b7 100644 --- a/Backend/routes/category.py +++ b/Backend/routes/category.py @@ -1,7 +1,8 @@ -from main import mysql, jsonify +from main import mysql +from flask import jsonify -def category(category_name=None): +def get_category(category_name=None): if category_name is None: cur = mysql.connection.cursor() cur.execute('''SELECT category.name FROM category''') diff --git a/Backend/routes/login.py b/Backend/routes/login.py index 38d429bd05677a49758fcfd7b688d1bbe998849b..f37cf1a9b0b5ae0f60dba83433ca615b2a15b9c2 100644 --- a/Backend/routes/login.py +++ b/Backend/routes/login.py @@ -1,5 +1,72 @@ -from main import mysql, jsonify +from utils.application import mysql +from flask import request, jsonify, make_response +import bcrypt def post_login(): - # TODO Add authentication logic here - return "Login successful" + + # Get data from request + data = request.json + email = data["email"] + password = data["password"] + + # Check if user exists and/or password exists + cur = mysql.connection.cursor() + cur.execute('''SELECT user.email, user.hash, user.salt FROM user WHERE user.email = %s''', (email,)) + dbData = cur.fetchall() + cur.close() + + # Check if user exists + if len(dbData) <= 0: + return jsonify({"message": "Incorrect login information."}), 400 + + salt = dbData[0][2].encode("utf-8") + hash = hash_function(password, salt) + + # Password check + if hash.decode("utf-8") != dbData[0][1]: + return jsonify({"message": "Incorrect login information."}), 400 + + # Set cookie + response = make_response(jsonify({"message": "Login successful"})) + + # Cookie lasts 24 hours + response.set_cookie('logged_in', email, max_age=60*60*24) + return response, 200 + +def post_register(): + # Get data from request + data = request.json + email = data['email'] + password = data['password'] + firstname = data['firstname'] + lastname = data['lastname'] + address = data['address'] + + # Hash and salt password + salt = bcrypt.gensalt() + password = hash_function(password, salt) + + # Check if email already exists + cur = mysql.connection.cursor() + cur.execute('''SELECT user.email FROM user WHERE user.email = %s''', (email,)) + data = cur.fetchall() + cur.close() + + # If email already exists, return error + if len(data) > 0: + return jsonify({"message": "Email already exists"}), 400 + + cur = mysql.connection.cursor() + cur.execute('''INSERT INTO user_details (email, first_name, last_name, address) VALUES (%s, %s, %s, %s)''', (email, firstname, lastname, address)) + cur.execute('''INSERT INTO user (email, hash, salt) VALUES (%s, %s, %s)''', (email, password, salt)) + mysql.connection.commit() + cur.close() + + return "", 201 + + +def hash_function(password, salt): + password = password.encode("utf-8") + hashed = bcrypt.hashpw(password, salt) + return hashed + diff --git a/Backend/tempCodeRunnerFile.py b/Backend/tempCodeRunnerFile.py new file mode 100644 index 0000000000000000000000000000000000000000..0d46ca321428166727a635344185ce7526c3b101 --- /dev/null +++ b/Backend/tempCodeRunnerFile.py @@ -0,0 +1 @@ +mysql \ No newline at end of file diff --git a/Backend/utils/application.py b/Backend/utils/application.py new file mode 100644 index 0000000000000000000000000000000000000000..fa71ac7b86956e7b089b599e19967ef7ae00e87b --- /dev/null +++ b/Backend/utils/application.py @@ -0,0 +1,11 @@ +from flask import Flask +from flask_mysqldb import MySQL + +app = Flask(__name__) +app.config['MYSQL_HOST'] = 'localhost' +app.config['MYSQL_USER'] = 'root' +app.config['MYSQL_PASSWORD'] = '' +app.config['MYSQL_DB'] = 'ElectroMart' +app.config['MYSQL_UNIX_SOCKET'] = '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock' +mysql = MySQL(app) + diff --git a/Database/project_db.sql b/Database/project_db.sql index 437655a042079dfe0c54a1eab8458b2bdcb7e629..0ac35a4436cbd1568105dfa93050a565958998f8 100644 --- a/Database/project_db.sql +++ b/Database/project_db.sql @@ -168,7 +168,8 @@ INSERT INTO `sub_category_in_category` (`parent_category_id`, `sub_category_id`) CREATE TABLE `user` ( `user_id` int(11) NOT NULL, - `password` varchar(255) DEFAULT NULL, + `hash` varchar(255) DEFAULT NULL, + `salt` varchar(255) DEFAULT NULL, `email` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_danish_ci; @@ -176,11 +177,11 @@ CREATE TABLE `user` ( -- Dataark for tabell `user` -- -INSERT INTO `user` (`user_id`, `password`, `email`) VALUES -(1, 'password1', 'user1@example.com'), -(2, 'password2', 'user2@example.com'), -(3, 'password3', 'user3@example.com'), -(4, 'password4', 'user4@example.com'); +INSERT INTO `user` (`user_id`, `hash`, `salt`, `email`) VALUES +(1, 'password1', '123', 'user1@example.com'), +(2, 'password2', '124', 'user2@example.com'), +(3, 'password3', '125', 'user3@example.com'), +(4, 'password4', '126', 'user4@example.com'); -- -------------------------------------------------------- @@ -277,6 +278,7 @@ ALTER TABLE `sub_category_in_category` -- Indexes for table `user` -- ALTER TABLE `user` + MODIFY `user_id` int(11) NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (`user_id`), ADD KEY `email` (`email`);