|
import streamlit as st |
|
|
|
|
|
import gspread |
|
from oauth2client.service_account import ServiceAccountCredentials |
|
import hmac |
|
|
|
|
|
import pandas as pd |
|
|
|
|
|
import project_config |
|
from menu import menu |
|
|
|
|
|
if "role" not in st.session_state: |
|
st.session_state.role = None |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_keyfile_dict(): |
|
variables_keys = { |
|
|
|
"type": st.secrets['type'], |
|
"project_id": st.secrets['project_id'], |
|
"private_key_id": st.secrets['private_key_id'], |
|
|
|
"private_key": st.secrets['private_key'], |
|
"client_email": st.secrets['client_email'], |
|
"client_id": st.secrets['client_id'], |
|
"auth_uri": st.secrets['auth_uri'], |
|
"token_uri": st.secrets['token_uri'], |
|
"auth_provider_x509_cert_url": st.secrets['auth_provider_x509_cert_url'], |
|
"client_x509_cert_url": st.secrets['client_x509_cert_url'], |
|
"universe_domain": st.secrets['universe_domain'] |
|
} |
|
return variables_keys |
|
|
|
|
|
def check_password(): |
|
"""Returns `True` if the user had a correct password.""" |
|
|
|
def login_form(): |
|
"""Form with widgets to collect user information""" |
|
|
|
col1, col2, col3 = st.columns(3) |
|
with col2: |
|
st.image(str(project_config.MEDIA_DIR / 'gravity_logo.svg'), width=300) |
|
|
|
with st.form("Credentials"): |
|
st.text_input("Username", key="username") |
|
st.text_input("Password", type="password", key="password") |
|
st.form_submit_button("Log In", on_click=password_entered) |
|
|
|
def password_entered(): |
|
"""Checks whether a password entered by the user is correct.""" |
|
|
|
if project_config.VDI or project_config.LOCAL: |
|
|
|
|
|
user_db = pd.read_csv(project_config.AUTH_DIR / "crd_user_db.csv") |
|
|
|
else: |
|
|
|
|
|
scope = [ |
|
'https://spreadsheets.google.com/feeds', |
|
'https://www.googleapis.com/auth/drive' |
|
] |
|
|
|
|
|
creds = ServiceAccountCredentials.from_json_keyfile_dict(create_keyfile_dict(), scope) |
|
|
|
|
|
client = gspread.authorize(creds) |
|
|
|
|
|
sheet = client.open_by_url(st.secrets['spreadsheet']).worksheet("user_db") |
|
data = sheet.get_all_records() |
|
user_db = pd.DataFrame(data) |
|
|
|
|
|
if st.session_state["username"] in user_db.username.values: |
|
|
|
st.session_state["username_correct"] = True |
|
|
|
|
|
if hmac.compare_digest( |
|
st.session_state["password"], |
|
user_db.loc[user_db.username == st.session_state["username"], "password"].values[0], |
|
): |
|
|
|
st.session_state["password_correct"] = True |
|
|
|
|
|
if st.session_state["username"] in user_db[user_db.role == "admin"].username.values: |
|
st.session_state["role"] = "admin" |
|
else: |
|
st.session_state["role"] = "user" |
|
|
|
|
|
st.session_state["name"] = user_db.loc[user_db.username == st.session_state["username"], "name"].values[0] |
|
st.session_state["team"] = user_db.loc[user_db.username == st.session_state["username"], "team"].values[0] |
|
st.session_state["profile_pic"] = st.session_state["username"] |
|
|
|
|
|
del st.session_state["password"] |
|
|
|
else: |
|
st.session_state["password_correct"] = False |
|
|
|
else: |
|
st.session_state["username_correct"] = False |
|
st.session_state["password_correct"] = False |
|
|
|
|
|
if st.session_state.get("password_correct", False): |
|
return True |
|
|
|
|
|
login_form() |
|
if "password_correct" in st.session_state: |
|
|
|
if not st.session_state["username_correct"]: |
|
st.error("User not found.") |
|
elif not st.session_state["password_correct"]: |
|
st.error("The password you entered is incorrect.") |
|
else: |
|
st.error("An unexpected error occurred.") |
|
|
|
return False |
|
|
|
menu() |
|
|
|
if not check_password(): |
|
st.stop() |
|
|
|
st.switch_page("pages/about.py") |