Spaces:
Runtime error
Runtime error
# Import libraries | |
import os | |
import streamlit as st | |
from PIL import Image | |
from streamlit_extras.switch_page_button import switch_page | |
from baam_functions import * | |
from datetime import datetime | |
from bokeh.models.widgets import Button | |
from bokeh.models import CustomJS | |
from streamlit_bokeh_events import streamlit_bokeh_events | |
# Set direction as current folder | |
sourceFileDir = os.path.dirname(os.path.abspath(__file__)) | |
os.chdir(sourceFileDir) | |
logo = Image.open('img/logo.png') | |
st.set_page_config(page_title = "BAAM", page_icon = logo) | |
# Initialise variables to pass between pages | |
st.session_state['user_dict'] = {} | |
st.session_state['verification'] = False | |
st.session_state['location'] = "" | |
st.session_state['raw_location'] = "" | |
st.session_state['username'] = "" | |
# st.session_state['typing_speed'] = 0 | |
def main(): | |
"""Banking Advanced Authentication System""" | |
# # Note that API key's running out of budget | |
# contact_url = "https://www.linkedin.com/in/linhvuu" | |
# st.write("I am running out of energy. Please contact [my assistant](%s) to wake me up." % contact_url) | |
menu = ["Home", "SignUp", "Login"] | |
choice = st.sidebar.selectbox("Menu", menu) | |
if choice == "Home": | |
st.subheader("Banking Advanced Authentication Module") | |
st.image("img/home.png") | |
st.write("Please select one action from the Menu on the side bar. Thank you.") | |
st.image("img/menu.png") | |
elif choice == "SignUp": | |
st.subheader("Create New Account") | |
new_user = st.text_input("Username") | |
new_password = st.text_input("Password",type='password') | |
if st.button("Signup"): | |
create_user_table() | |
add_user_data(new_user,make_hashes(new_password)) | |
st.success("You have successfully created a valid Account") | |
st.info("Go to Login Menu to login") | |
elif choice == "Login": | |
# Header of the page | |
col1, col2, col3 = st.columns(3) | |
with col1: | |
st.write(' ') | |
# Logo | |
with col2: | |
st.image("img/Standard_Chartered.png", width=175) | |
with col3: | |
st.write(' ') | |
# Login form | |
st.subheader("Login") | |
username = st.text_input("Username") | |
password = st.text_input("Password",type='password') | |
is_tester = st.checkbox('Login to test') | |
login_button = Button(label="Login") | |
# Collect location when login button is clicked | |
login_button.js_on_event("button_click", CustomJS(code=""" | |
navigator.geolocation.getCurrentPosition( | |
(loc) => { | |
document.dispatchEvent(new CustomEvent("GET_LOCATION", {detail: {lat: loc.coords.latitude, lon: loc.coords.longitude}})) | |
} | |
) | |
""")) | |
# Get location | |
location = streamlit_bokeh_events( | |
login_button, | |
events="GET_LOCATION", | |
key="get_location", | |
refresh_on_update=False, | |
override_height=75, | |
debounce_time=0) | |
# If can get location | |
if location: | |
# Hash password & verify password | |
hashed_pswd = make_hashes(password) | |
result = login_user(username,check_hashes(password, hashed_pswd)) | |
# When the username and password are correct | |
if result: | |
# time_start = st.session_state['time_start'] | |
# Stop counting time after the user finished entering username, password and clicked login button | |
login_time = datetime.now() | |
# # *** Calculate the login duration in seconds (the time it takes user to enter username, password and click login button) | |
# login_duration = login_time - time_start | |
# login_duration_seconds = login_duration.total_seconds() | |
# # Calculate typing speed (characters per minute) | |
# typing_speed = (len(username) + len(password)) * 60 / login_duration_seconds | |
# Launch app for end user | |
if not(is_tester): | |
# Collect user's information when logging in | |
#user_dict, st.session_state['location'] = collect_data(username, location, login_time, typing_speed) | |
user_dict, st.session_state['location'] = collect_data(username, location, login_time) | |
# Store user information to pass to other pages | |
st.session_state['user_dict'] = user_dict | |
verification = verify_user(user_dict) | |
# THAO LE CODE: | |
# weight edit in logic_tl | |
weight = {'device_uuid': 40, 'mac_address': 40, 'device_name': 30.0, 'device_model': 20.0, \ | |
'device_vendor': 4.0, 'ip_v4': 30, 'isp_name': 15.0, 'ip_country': 3.0, 'suburd': 30, 'district': 22.5, \ | |
'city': 15.0, 'country': 3.0} | |
# ThaoLe note: | |
# st.write(f"print the user_dict {user_dict}") | |
# st.write(f'type of user_dict {type(user_dict)}') | |
# end not | |
st.session_state['verification'] = verification | |
# Add to the login database after successful verification | |
if verification: | |
add_login_data(user_dict) | |
# Open Transfer Money Page | |
switch_page("Transfer Money 💸") | |
# Launch Testing Tool | |
else: | |
st.session_state['raw_location'] = location | |
st.session_state['username'] = username | |
# st.session_state['typing_speed'] = typing_speed | |
switch_page("SelectUseCase") | |
else: | |
st.warning("Incorrect Username/Password") | |
# Start counting time | |
st.session_state['time_start'] = datetime.now() | |
# #To export database to csv file (can be commented out if not needed) | |
# export_csv() | |
if __name__ == '__main__': | |
main() | |