From 85a4dc2abc11699eb602f2b9863a9e5445ea6e3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=B9i=20Nguy=E1=BB=85n=20T=E1=BA=A5n=20Sang?= Date: Sun, 11 Feb 2024 20:30:22 +0700 Subject: [PATCH] Added Email Verify --- account/database.py | 3 +- account/main.py | 86 +++++++++++++++++++++++++++++++------- database/users-account.db | Bin 8192 -> 12288 bytes requirements.txt | 1 + 4 files changed, 73 insertions(+), 17 deletions(-) diff --git a/account/database.py b/account/database.py index 18c6bf3..90ec3cf 100644 --- a/account/database.py +++ b/account/database.py @@ -9,7 +9,8 @@ def create_users_database(): email TEXT, username TEXT, password TEXT, - reliability INTGER DEFAULT 0 + reliability INTGER DEFAULT -1, + confirm INTGER DEFAULT 0 )''') conn.commit() conn.close() diff --git a/account/main.py b/account/main.py index 9b71c07..e18a222 100644 --- a/account/main.py +++ b/account/main.py @@ -1,6 +1,10 @@ import re +import os import time +import random import streamlit as st +from sendgrid import SendGridAPIClient +from sendgrid.helpers.mail import Mail from account.loader import account_database_loader from account.reliability import get_user_reliability from account.userid import get_user_id @@ -10,8 +14,24 @@ conn = account_database_loader() cursor = conn.cursor() -def add_user(email, username, password): - cursor.execute('''INSERT INTO users (email, username, password) VALUES (?, ?, ?)''', (email, username, password)) +def send_email(subject, from_email, to_email, content): + message = Mail( + from_email=from_email, + to_emails=to_email, + subject=subject, + html_content=content) + + try: + sg = SendGridAPIClient('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') + response = sg.send(message) + print(response.status_code) + print(response.body) + print(response.headers) + except Exception as e: + print("Error sending email:", str(e)) + +def add_user(email, username, password, confirm): + cursor.execute('''INSERT INTO users (email, username, password, confirm) VALUES (?, ?, ?, ?)''', (email, username, password, confirm)) sys_log("Created User Account", "Username: " + username + " Email: " + email + " Password: " + password) conn.commit() @@ -40,11 +60,30 @@ def check_existing_username(username): cursor.execute("SELECT * FROM users WHERE username=?", (username,)) return cursor.fetchone() is not None +def verification(user_id, confirmation_code, confirm_value): + if int(confirmation_code) == confirm_value: + cursor.execute("UPDATE users SET confirm = 0 WHERE id = ?", (user_id,)) + cursor.execute("UPDATE users SET reliability = 0 WHERE id = ?", (user_id,)) + conn.commit() + st.success('Your account has been successfully created.') + + st.session_state.email_input = False + st.session_state.username_input = False + st.session_state.password_input = False + st.session_state.confirm_code_input = True + st.session_state.create_state = True + else: + st.error('The verification code is incorrect, please check again.') + st.title('Account Manager') st.session_state.setdefault('form_state', True) +st.session_state.setdefault('create_state', True) AForm = st.session_state.form_state +st.session_state.setdefault('confirm_value', 0) +st.session_state.setdefault('confirmation_code', 0) + with st.form(key = 'Account_Form'): col1, col2, col3 = st.columns([0.1, 0.1, 0.1]) @@ -60,19 +99,34 @@ def check_existing_username(username): email = st.text_input('Email:') username = st.text_input('Username:') password = st.text_input('Password:', type='password') + confirm_code = st.text_input('Confirmation code:') + st.session_state.confirmation_code = confirm_code if email and username and password: - if check_existing_email(email): - st.error('This email is already registered. Please use a different email.') - elif verify_email(email): - st.error('This email is invalid, please check again.') - elif check_existing_username(username): - st.error('This user name already in use. Please use another username.') + if st.session_state.create_state: + if check_existing_email(email): + st.error('This email is already registered. Please use a different email.') + elif verify_email(email): + st.error('This email is invalid, please check again.') + elif check_existing_username(username): + st.error('This user name already in use. Please use another username.') + else: + with st.spinner('Creating account...'): + st.session_state.confirm_value = random.randint(1000, 9999) + add_user(email, username, password, st.session_state.confirm_value) + send_email('Verification', 'lithicsoft@gmail.com', email, 'Hello ' + username + ', Your Neutron confirmation code is: ' + str(st.session_state.confirm_value)) + time.sleep(1) + st.success('An email containing a confirmation code has been sent to your account.') + + st.session_state.create_state = False else: - with st.spinner('Checking the given information...'): - add_user(email, username, password) - time.sleep(1) - st.success('Your account has been successfully created.') + user_id = get_user_id(cursor, username) + verification(user_id, st.session_state.confirmation_code, st.session_state.confirm_value) + + close_button = st.form_submit_button('Close') + + if close_button: + st.session_state.form_state = False if submitted2: email = st.text_input('Email: ') @@ -83,8 +137,8 @@ def check_existing_username(username): if get_user_reliability(cursor, username, password) is not None: user_id = get_user_id(cursor, username) - new_username = st.text_input('New Username: ') - new_password = st.text_input('New Password: ', type='password') + new_username = st.text_input('New Username:') + new_password = st.text_input('New Password:', type='password') if new_username: update_username(user_id, email, new_username) st.success('Your account username has been successfully updated.') @@ -108,9 +162,9 @@ def check_existing_username(username): st.markdown('---') if username and not user_id: - st.write("User ID: " + str(get_user_id(cursor, username))) + st.write("User ID:" + str(get_user_id(cursor, username))) elif user_id and not username: - st.write("Username: " + get_username(cursor, user_id)) + st.write("Username:" + get_username(cursor, user_id)) else: open_button = st.form_submit_button('Open Form') diff --git a/database/users-account.db b/database/users-account.db index d639e6f074b1287f8d53a4839f167760e866a59e..4916b6ad1a616db6b8901a8da389ad56f32f34c3 100644 GIT binary patch delta 392 zcmZp0Xh@hKE!fGxz`zW|OhC*C#B39FjDdoBWu3er5x!##e8+g3HWmu;S~WQ{v5U*g zGq!}5BqrsgmKLWL6~~w47Qh+I&Oxq@A+8D`j!r(V3JGxWgvo;ZH<)w{Cr{)T@zPOH zO3u$q%Ph)OQtzG%Pk)KytoS2txWME)v%E-=ODsIZik)sV}DKc_Qz9g^A$N~WFRALJN delta 152 zcmZojXmFSyEy&Ekz`z8=Fu*ub$C#g)K`(D7FHne)?