diff --git a/Lab_4/Twidder/database.db b/Lab_4/Twidder/database.db index f0687480e0791cb203fd555a0773043605dcf1fc..39de255a9d2417fa8f3b100a73afdef1901f3fe2 100644 Binary files a/Lab_4/Twidder/database.db and b/Lab_4/Twidder/database.db differ diff --git a/Lab_4/Twidder/server.py b/Lab_4/Twidder/server.py index b9644c0bfe86ceeca239a561297f1a0ff88cc83c..02988a22703d99fd4b1a125ab3266790b6854c40 100644 --- a/Lab_4/Twidder/server.py +++ b/Lab_4/Twidder/server.py @@ -11,6 +11,7 @@ import json from flask_sock import Sock from flask_bcrypt import Bcrypt from gevent import monkey +import threading monkey.patch_all() @@ -25,6 +26,7 @@ monkey.patch_all() app = Flask(__name__, static_url_path = '/static') #in case flask does not recognize folder sock = Sock(app) bcrypt = Bcrypt(app) +lock = threading.Lock() app.debug = True session = {'token': ("email", "wsObj")} @@ -91,17 +93,23 @@ def echo(socket): return # Sign out if I am logged in somewhere else - for token in list(session.keys()): - if session[token][0] == myEmail and token != myToken: - if session[token][1] != "": - session[token][1].send(json.dumps({"action" : "signOut"})) - session[token][1].close() - session.pop(token) - - # Put socket in global dict so server knows my connection is open - session[myToken] = (myEmail, socket) - socket.send(json.dumps({"action" : "signIn"})) - + lock.acquire() + if myToken in session: + for token in list(session.keys()): + if session[token][0] == myEmail and token != myToken: + if session[token][1] != "": + session[token][1].send(json.dumps({"action" : "signOut"})) + session[token][1].close() + print("You got kicked out") + session.pop(token) + + # Put socket in global dict so server knows my connection is open + session[myToken] = (myEmail, socket) + socket.send(json.dumps({"action" : "signIn"})) + else: + socket.send(json.dumps({"action" : "signOut"})) + socket.close() + lock.release() @app.route("/myServer/sign_in", methods=['POST']) @@ -131,7 +139,9 @@ def sign_in(): # Generate a random token token = str(uuid.uuid4()) + lock.acquire() session[token] = (email, "") + lock.release() # return the token in the Authorization header response = make_response(jsonify({})) #"Server inserted user data into database" @@ -204,15 +214,18 @@ def sign_out(): token = validate_token(hashedToken, "") if token == "": return jsonify({}), 401 - + # Close my socket + lock.acquire() try: session[token][1].close() except: pass # samma sak som ingenting - - # set user to not logged in - session.pop(token) + try: + session.pop(token) + except: + pass + lock.release() return jsonify({}), 204 # "Successfully signed out") diff --git a/Lab_4/Twidder/static/client.js b/Lab_4/Twidder/static/client.js index ab59cbbee430c73a9eace5538b6ce57a7e02a885..ab604180cb62d4c98e0799a7df5982a372f984d2 100644 --- a/Lab_4/Twidder/static/client.js +++ b/Lab_4/Twidder/static/client.js @@ -73,7 +73,6 @@ async function connectWithSocket() { let myEmail = localStorage.getItem("homeEmail"); // Make hash out of socket and message - // Todo - myEmail instead of token? let hashedToken = await hashMe(token, token); // let hashedToken = crypto.createHmac('sha1', token).update("my data").digest().toString('base64'); @@ -90,9 +89,6 @@ async function connectWithSocket() { switch (response["action"]) { case "signOut": - // If old socket open, close it. - socket.close(); - // Reset token in the localStorage localStorage.setItem("currentUser", ""); localStorage.setItem("homeEmail", ""); @@ -103,6 +99,9 @@ async function connectWithSocket() { document.getElementById("error").innerHTML = "Signed Out, you signed in elsewhere"; break; case "signIn": + + displayView(); + setUserDetails("home") break; } }