def verify_handler(): body = request.get_json() logger.debug("Verify %s", body) user = db.getUserByName(conn, body.get('username')) login_attempt = db.getAuthByStateHash(conn, body.get('hash')) try: if user and login_attempt: requested_datetime = datetime.strptime(login_attempt[2], '%Y-%m-%d %H:%M:%S.%f') max_datetime = requested_datetime + timedelta(minutes=10) if requested_datetime < max_datetime: public_key = base64.b64decode(user[3]) signed_hash = base64.b64decode(login_attempt[4]) original_hash = login_attempt[1] try: bytes_signed_hash = bytes(signed_hash) bytes_original_hash = bytes(original_hash, encoding='utf8') verify_key = nacl.signing.VerifyKey( public_key.hex(), encoder=nacl.encoding.HexEncoder) verify_key.verify(bytes_original_hash, bytes_signed_hash) return Response("Ok") except: return Response("Sinature invalid", status=400) else: return Response("You are too late", status=400) else: return Response("Oops.. user or login attempt not found", status=404) except Exception as e: logger.log("Something went wrong while trying to verify the header %e", e)
def flag_handler(): body = request.get_json() logger.debug("Flag %s", body) login_attempt = None user = db.getUserByName(conn, body.get('doubleName')) try: login_attempt = db.getAuthByStateHash(conn, body.get('hash')) except Exception as e: pass if user: print("user found") try: public_key = base64.b64decode(user[3]) signed_device_id = base64.b64decode(body.get('deviceId')) bytes_signed_device_id = bytes(signed_device_id) verify_key = nacl.signing.VerifyKey( public_key.hex(), encoder=nacl.encoding.HexEncoder) verified_device_id = verify_key.verify(bytes_signed_device_id) if verified_device_id: verified_device_id = verified_device_id.decode("utf-8") update_sql = "UPDATE users SET device_id=? WHERE device_id=?;" db.update_user(conn, update_sql, '', verified_device_id) sio.emit('scannedFlag', {'scanned': True}, room=user[1]) return Response("Ok") except Exception as e: logger.debug("Exception: %s", e) return Response("Sinature invalid", status=400) if login_attempt: print("login attempt found") if verified_device_id: verified_device_id = verified_device_id.decode("utf-8") update_sql = "UPDATE users SET device_id=? WHERE device_id=?;" db.update_user(conn, update_sql, '', verified_device_id) update_sql = "UPDATE auth SET scanned=?, data=? WHERE double_name=?;" db.update_auth(conn, update_sql, 1, '', login_attempt[0]) update_sql = "UPDATE users SET device_id =? WHERE double_name=?;" db.update_user(conn, update_sql, verified_device_id, login_attempt[0]) return Response("Ok") else: print("user not found") return Response('User not found', status=404)
def sign_handler(): body = request.get_json() logger.debug("Sign: %s", body) login_attempt = db.getAuthByStateHash(conn, body.get('hash')) if login_attempt != None: user = db.getUserByName(conn, login_attempt[0]) update_sql = "UPDATE auth SET singed_statehash =?, data=? WHERE state_hash=?;" db.update_auth(conn, update_sql, body.get('signedHash'), json.dumps(body.get('data')), body.get('hash')) sio.emit('signed', { 'signedHash': body.get('signedHash'), 'data': body.get('data'), 'selectedImageId': body.get('selectedImageId') }, room=user[1]) return Response("Ok") else: return Response("Something went wrong", status=500)
def force_refetch_handler(): data = request.args logger.debug("Force refetch %s", data) if (data == None): return Response("Got no data", status=400) logger.debug("Hash %s", data['hash']) loggin_attempt = db.getAuthByStateHash(conn, data['hash']) logger.debug("Login attempt %s", loggin_attempt) if (loggin_attempt != None): # db.deleteAuthByStateHash(conn, data['hash']) # logger.debug("Removing login attempt") data = {"scanned": loggin_attempt[3], "signed": {'signedHash': loggin_attempt[4], 'data': loggin_attempt[5], 'doubleName': loggin_attempt[0]}} response = app.response_class( response=json.dumps(data), mimetype='application/json' ) logger.debug("Data %s", data) return response else: return Response()