From 870dd1435f361e8e83350be8a24df2e4ba7aeaed Mon Sep 17 00:00:00 2001 From: Lucas Mathews Date: Tue, 28 May 2024 17:49:31 +0200 Subject: [PATCH] Beginning adding OTP verification to client shange screen --- __pycache__/class_account.cpython-312.pyc | Bin 0 -> 1989 bytes __pycache__/class_base.cpython-312.pyc | Bin 0 -> 221 bytes __pycache__/class_client.cpython-312.pyc | Bin 0 -> 2102 bytes __pycache__/class_transaction.cpython-312.pyc | Bin 0 -> 1725 bytes __pycache__/config.cpython-312.pyc | Bin 0 -> 292 bytes __pycache__/database.cpython-312.pyc | Bin 0 -> 1054 bytes __pycache__/emailer.cpython-312.pyc | Bin 0 -> 1801 bytes __pycache__/manager.cpython-312.pyc | Bin 0 -> 31805 bytes api.yml | 15 ++++- .../__pycache__/config.cpython-312.pyc | Bin 0 -> 316 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 10286 bytes application/connection.py | 17 +++++- application/dashboard.py | 54 +++++++++++------- application/login.py | 9 ++- application/session_data.json | 2 +- .../0f8e743989515f4aaf958d76f346210f | Bin 0 -> 57 bytes .../1c0bd59593392e52337d73665704d133 | Bin 0 -> 57 bytes .../2029240f6d1128be89ddc32729463129 | Bin 0 -> 9 bytes .../2892d6f928e4706b8b53976f24e16df9 | Bin 0 -> 57 bytes .../2aeb459d854ed6b531157b1f07263701 | Bin 0 -> 57 bytes .../4d439b134cc69940f885e01fb69fa2af | Bin 0 -> 57 bytes .../543f6931cd6b44c3c94cadb682baadb6 | Bin 0 -> 57 bytes .../5bd955d64e05f26ba5ef180a04500110 | Bin 0 -> 57 bytes .../5d5c04d15f0f8cbf4721083899098bc5 | Bin 0 -> 57 bytes .../6dbbe99eb2379d46adb417f7cb73998a | Bin 0 -> 57 bytes .../93cd60fca3662b3b62fa48162b37f0fc | Bin 0 -> 57 bytes .../b374a533064d4f726057d2daf5465b06 | Bin 0 -> 57 bytes .../c2ca2782adffe80ef938353324e18126 | Bin 0 -> 57 bytes .../d1a91b81953dba7179a749524fd7b5d8 | Bin 0 -> 57 bytes .../e80c3442482b04dffebe9de33c2adace | Bin 0 -> 57 bytes .../e9087f19cb0516ef0a65e6899b4121b2 | Bin 0 -> 57 bytes manager.py | 4 +- test_database.db | Bin 753664 -> 753664 bytes 33 files changed, 72 insertions(+), 29 deletions(-) create mode 100644 __pycache__/class_account.cpython-312.pyc create mode 100644 __pycache__/class_base.cpython-312.pyc create mode 100644 __pycache__/class_client.cpython-312.pyc create mode 100644 __pycache__/class_transaction.cpython-312.pyc create mode 100644 __pycache__/config.cpython-312.pyc create mode 100644 __pycache__/database.cpython-312.pyc create mode 100644 __pycache__/emailer.cpython-312.pyc create mode 100644 __pycache__/manager.cpython-312.pyc create mode 100644 application/__pycache__/config.cpython-312.pyc create mode 100644 application/__pycache__/connection.cpython-312.pyc create mode 100644 flask_session/0f8e743989515f4aaf958d76f346210f create mode 100644 flask_session/1c0bd59593392e52337d73665704d133 create mode 100644 flask_session/2029240f6d1128be89ddc32729463129 create mode 100644 flask_session/2892d6f928e4706b8b53976f24e16df9 create mode 100644 flask_session/2aeb459d854ed6b531157b1f07263701 create mode 100644 flask_session/4d439b134cc69940f885e01fb69fa2af create mode 100644 flask_session/543f6931cd6b44c3c94cadb682baadb6 create mode 100644 flask_session/5bd955d64e05f26ba5ef180a04500110 create mode 100644 flask_session/5d5c04d15f0f8cbf4721083899098bc5 create mode 100644 flask_session/6dbbe99eb2379d46adb417f7cb73998a create mode 100644 flask_session/93cd60fca3662b3b62fa48162b37f0fc create mode 100644 flask_session/b374a533064d4f726057d2daf5465b06 create mode 100644 flask_session/c2ca2782adffe80ef938353324e18126 create mode 100644 flask_session/d1a91b81953dba7179a749524fd7b5d8 create mode 100644 flask_session/e80c3442482b04dffebe9de33c2adace create mode 100644 flask_session/e9087f19cb0516ef0a65e6899b4121b2 diff --git a/__pycache__/class_account.cpython-312.pyc b/__pycache__/class_account.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98737b1e84232628a07c474b5146bec610363018 GIT binary patch literal 1989 zcmah~&1)M+6rYuLwbJUtl4Zvqa%3e9aa7wfK9rV{I^?4XZX83K^w1@AS?`YRjrT*D zT^D3@P{9X7a&RxT4Tboako*BX^baWHVpk591`37JLvLx_Qpl-qcBQplO1t3q-tRXv z&-32z4SJbQO9;M4-+j9HGKSF440J!C6CBM$u!VG_b0)GlnX@8t#EQyMiA%sV>%n%z=e6{O{-oa9ao? znbVOR(K$I9L73MgSkR*{`0zS0#$o}is0+`z;PCTE;N`e~CWeKON%)L-f{}bCeu7E* zOaiCEQ)!=(a3*AWd?tC~R2G<=p3>8L=0#6jVp=)X$_qRmuVF)Ztw^3!B%mC`9f>t67xf?fg&uYx~_j1kkp!ZZ*Stp_S^>l zDn9f*oCkLVNs$(634m$fEB_b*P#!%1|IZKDQ1Rn6U_-4>v7ySR*ihS3?8zzYEa==f zvAYQLzVHe5R*8LDYt=2OCEf6+A0AreS?quGItOXX92o)UvdT;3ELbXfj>6Kc^>o|c zA=rL*222CJj-kTnlc}Al*3j7}#hqfSFnU-R-!F`}isuiD)BDBg)=24aWO9FGvNcfH zs()4gEiGoH*GNoAWE4`&m;0H}wrXKTp^~Clj=pNLIHf2LS5>pKl2#Otz3~7N)>gt^ zPEZ=t=U?ZMH98n+Cgbs36V_{gJV}v7=fONf{*CgQG&4*h8^E%3L++T6T-QZrK>p!BgUr^x>{v0Q5=zk(` HeulpR{GQBG literal 0 HcmV?d00001 diff --git a/__pycache__/class_base.cpython-312.pyc b/__pycache__/class_base.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..462fd028ada8369397b4632fae2f2d3eb867007d GIT binary patch literal 221 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 Dg5MM& literal 0 HcmV?d00001 diff --git a/__pycache__/emailer.cpython-312.pyc b/__pycache__/emailer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..208fc962443201776c12e30e9be09d9f8ded05c7 GIT binary patch literal 1801 zcmZuxQEU`N7@oP^+uhr}yHX0L2jn=VR;zKLMnw^bhSG}CVrVt?BwV())Ao+tyK`pF za+hL`#KaOvgoK0=CFvukK0v|)COi;*G4bV2YN#7Xn#hZ9RUSzCVEkwAmNu!gcmI6< z|IhsM|Nnfuzs6!Zf^q)N#}luI5&Bao!2sPKk1xP<1=+~P4$8DZ>^%6qVfZZ{o z6N5w-q}B$Es1Ts(6QlxBZGjnp(8_wN6BdpI41B=#o_s~MR{$zW4acf zBGc?$#w#`{a&w|owFO ziKcMhD1?oZLWYDqBk`wuf>O`O8`er*dot!`uk$g=m1*<_%ToqKXYx!?(tReLpP!&|86uQ=81ZYNreudX)!?y+=yJJT5eA6{)T}PC{ zGl73?4mtvq?iA13nbpo+s1Gqb9l~e~VR)*Yr=>A8je9rO_KuLE4HPQ2=#%E9G;lA? z$|RSc$P+tFNsi>dAhhkbY?~6sOiyMmFMCl2+X>D3-1CgKR~@_w2`6FkFp~pN2$0FWFV9i5RL2eXu5pC;MqDkTtZ42|A}+ zWA(Y*z7x5UO-_tk#Z!>atE|d6aZmW&BGfEbJzb>GI)!$_)(-fye?ipIqpsv!&!vO& zX0xlWe)Lg%`}tCR@Ii9tymB>lJ=RRV*?4yE4SJ{NZsJGtmsE4#r;WGA8e^G8;|%WG%SOt)ZZ+b2 z7PUUH!Z>GKh&_ow$R{H1-$Jai7_{K0?e8TI9gu!L5bjr0Ps?WEs*2fcZwD3p_aw#~ zPXXFY6zz-{tNV L3CY{231R;O;o-HB literal 0 HcmV?d00001 diff --git a/__pycache__/manager.cpython-312.pyc b/__pycache__/manager.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b56aeaf6a1a87da875225ae67b910b2836aa925f GIT binary patch literal 31805 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 literal 0 HcmV?d00001 diff --git a/application/__pycache__/connection.cpython-312.pyc b/application/__pycache__/connection.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e78b922faa65c635df65fc84dc4da0e0f9ddb8f5 GIT binary patch literal 10286 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 DRCr$* literal 0 HcmV?d00001 diff --git a/application/connection.py b/application/connection.py index d9b5f72..155a70e 100644 --- a/application/connection.py +++ b/application/connection.py @@ -53,12 +53,12 @@ def get_client(client_id): print(f"RequestException: {e}") return {'success': False, 'message': "Could not connect to the server. Please try again later."} -def update_client(client_id, email=None, phone_number=None, address=None): +def update_client(client_id, otp_code, email=None, phone_number=None, address=None): """Updates the client details for the given client_id.""" try: with open('application\\session_data.json', 'r') as f: session_data = json.load(f) - params = {'client_id': client_id} + params = {'client_id': client_id, 'otp_code': otp_code} if email is not None: params['email'] = email if phone_number is not None: @@ -147,3 +147,16 @@ def new_transaction(account): except requests.exceptions.RequestException as e: print(f"RequestException: {e}") return {'success': False, 'message': "Could not connect to the server. Please try again later."} + +def generate_otp(): + """Generates a new OTP for the current client, which is sent by Email.""" + try: + with open('application\\session_data.json', 'r') as f: + session_data = json.load(f) + client_id = session_data['client_id'] + response = requests.post(CONFIG["server"]["url"] + "/OTP/Generate", cookies=session_data['session_cookie'], params={'client_id': client_id}) + response.raise_for_status() + return response.json() + except requests.exceptions.RequestException as e: + print(f"RequestException: {e}") + return {'success': False, 'message': "Could not connect to the server. Please try again later."} \ No newline at end of file diff --git a/application/dashboard.py b/application/dashboard.py index 7d1217f..3bce439 100644 --- a/application/dashboard.py +++ b/application/dashboard.py @@ -3,12 +3,13 @@ import customtkinter import json import os from config import CONFIG -from connection import logout_client, get_client, update_client, get_accounts, format_balance +from connection import logout_client, get_client, update_client, get_accounts, format_balance, generate_otp # Global variables email_entry = None phone_entry = None address_entry = None +otp_entry = None frame = None ################# @@ -66,10 +67,11 @@ def display_client_info(): def edit_details(): """Opens a new window for editing client details.""" - global edit_window, email_entry, phone_entry, address_entry + global edit_window, email_entry, phone_entry, address_entry, otp_entry edit_window = customtkinter.CTkToplevel(root) edit_window.title("Edit Details") - edit_window.geometry("300x200") + edit_window.geometry("300x300") + edit_window.iconbitmap("application/luxbank.ico") edit_window.attributes('-topmost', True) email_label = customtkinter.CTkLabel(edit_window, text="Email: ") @@ -87,31 +89,38 @@ def edit_details(): address_label.pack() address_entry.pack() - save_button = customtkinter.CTkButton(edit_window, text="Save", command=save_details) + # Add MFA verify button and text box + mfa_button = customtkinter.CTkButton(edit_window, text="Get OTP Code", command=generate_otp) + mfa_button.pack() + + mfa_label = customtkinter.CTkLabel(edit_window, text="OTP Code: ") + otp_entry = customtkinter.CTkEntry(edit_window) + mfa_label.pack() + otp_entry.pack() + + save_button = customtkinter.CTkButton(edit_window, text="Verify MFA and Save", command=save_details) save_button.pack() edit_window.lift() def save_details(): """Saves the updated client details.""" - global edit_window, email_entry, phone_entry, address_entry + global edit_window, otp_entry, email_entry, phone_entry, address_entry new_email = email_entry.get() if email_entry.get() != '' else None new_phone = phone_entry.get() if phone_entry.get() != '' else None new_address = address_entry.get() if address_entry.get() != '' else None - try: - with open('application\\session_data.json', 'r') as f: - session_data = json.load(f) - client_id = session_data['client_id'] - if not messagebox.askyesno("Confirmation", "Are you sure you want to update the details?"): - return - result = update_client(client_id, new_email, new_phone, new_address) - if result['success']: - display_client_info() - else: - messagebox.showerror("Update Failed", result.get('message', 'Unknown error')) - edit_window.destroy() - except Exception as e: - messagebox.showerror("Error", f"Could not update details: {e}") - + otp_code = otp_entry.get() + with open('application\\session_data.json', 'r') as f: + session_data = json.load(f) + client_id = session_data['client_id'] + if not messagebox.askyesno("Confirmation", "Are you sure you want to update the details?"): + return + result = update_client(client_id, otp_code, new_email, new_phone, new_address) + if result['success']: + display_client_info() + else: + messagebox.showerror("Update Failed", result.get('message', 'Unknown error')) + edit_window.destroy() + def populate_table(): """Populates the accounts table with client accounts.""" try: @@ -160,9 +169,14 @@ welcome_label.pack(pady=20) display_client_info() +# Create a logout button logout_button = customtkinter.CTkButton(root, text="Logout", command=logout) logout_button.pack(pady=15) +# Create the MFA button +mfa_button = customtkinter.CTkButton(root, text="MFA", command=generate_otp) +mfa_button.pack(pady=15, side='left') + # Create a frame for the table table_frame = ttk.Frame(root) table_frame.pack(side='right', fill='both', expand=True) diff --git a/application/login.py b/application/login.py index a9ad6db..4a02854 100644 --- a/application/login.py +++ b/application/login.py @@ -53,10 +53,13 @@ def change_dark_theme(): ############## # Set appearance mode based on configuration -if CONFIG["preferences"]["dark_theme"] == "dark": - customtkinter.set_appearance_mode("dark") +if "preferences" in CONFIG and "dark_theme" in CONFIG["preferences"]: + if CONFIG["preferences"]["dark_theme"] == "dark": + customtkinter.set_appearance_mode("dark") + else: + customtkinter.set_appearance_mode("light") else: - customtkinter.set_appearance_mode("light") + customtkinter.set_appearance_mode("dark") # Initialize the main window root = customtkinter.CTk() diff --git a/application/session_data.json b/application/session_data.json index 9087467..084acf3 100644 --- a/application/session_data.json +++ b/application/session_data.json @@ -1 +1 @@ -{"session_cookie": {"session": "UHtXXDwzE9iVXmMpFHD9BYA-ztYORiBP-xfRImGQDJQ"}, "client_id": "31d90aad"} \ No newline at end of file +{"session_cookie": {"session": "mMTYW-c_n0BE-l7MENT8A1h2Rg4UUrNRJYl7NvXTcS4"}, "client_id": "31d90aad"} \ No newline at end of file diff --git a/flask_session/0f8e743989515f4aaf958d76f346210f b/flask_session/0f8e743989515f4aaf958d76f346210f new file mode 100644 index 0000000000000000000000000000000000000000..dfe006c5f083e74f9769c088e04878507fb36d54 GIT binary patch literal 57 zcmYe@QUzqBqpXz HDb)i27NrwZ literal 0 HcmV?d00001 diff --git a/flask_session/1c0bd59593392e52337d73665704d133 b/flask_session/1c0bd59593392e52337d73665704d133 new file mode 100644 index 0000000000000000000000000000000000000000..96d29358cd067f7602bd334e8311ec2130ba1e16 GIT binary patch literal 57 zcmeBQUYFLuI#r7S0&1sd^l-%&q!#5S=B4J9OzG(1OwP#!vf?vSru1+a8>UzqBqpXz HDb)i28)p+~ literal 0 HcmV?d00001 diff --git a/flask_session/2029240f6d1128be89ddc32729463129 b/flask_session/2029240f6d1128be89ddc32729463129 new file mode 100644 index 0000000000000000000000000000000000000000..5e692b020c49fdd8afdaa875a81b8ca3c51fa93d GIT binary patch literal 9 QcmZQzU|?uq_2$UzqBqpXz HDb)i23JMb& literal 0 HcmV?d00001 diff --git a/flask_session/543f6931cd6b44c3c94cadb682baadb6 b/flask_session/543f6931cd6b44c3c94cadb682baadb6 new file mode 100644 index 0000000000000000000000000000000000000000..9739f27f793f2d68bbe88ba71ba68bc3df1e3b46 GIT binary patch literal 57 zcmWgJR+rYmI#r7S0&1sd^l-%&q!#5S=B4J9OzG(1OwP#!vf?vSru1+a8>UzqBqpXz HDb)i21HKaf literal 0 HcmV?d00001 diff --git a/flask_session/5bd955d64e05f26ba5ef180a04500110 b/flask_session/5bd955d64e05f26ba5ef180a04500110 new file mode 100644 index 0000000000000000000000000000000000000000..3f74cccd5297104b8b29db9555e778d289956a5c GIT binary patch literal 57 zcmWIATbI_rI#r7S0&1sd^l-%&q!#5S=B4J9OzG(1OwP#!vf?vSru1+a8>UzqBqpXz HDb)i25~34A literal 0 HcmV?d00001 diff --git a/flask_session/5d5c04d15f0f8cbf4721083899098bc5 b/flask_session/5d5c04d15f0f8cbf4721083899098bc5 new file mode 100644 index 0000000000000000000000000000000000000000..745db080fb9c4e5d107dd77287d7b4224474ddc2 GIT binary patch literal 57 zcmYdVUYFLuI#r7S0&1sd^l-%&q!#5S=B4J9OzG(1OwP#!vf?vSru1+a8>UzqBqpXz HDb)i25n>ZO literal 0 HcmV?d00001 diff --git a/flask_session/6dbbe99eb2379d46adb417f7cb73998a b/flask_session/6dbbe99eb2379d46adb417f7cb73998a new file mode 100644 index 0000000000000000000000000000000000000000..beb9d029410883b5b5676de31c88148556a48e80 GIT binary patch literal 57 zcmZ3ty)LbRb*dHv1k_H^=;4YlNG-}u%uCHHnbOh2nVgdeWW{HuOzGh;HcYWJNK8zb HQmO|4CC(F= literal 0 HcmV?d00001 diff --git a/flask_session/93cd60fca3662b3b62fa48162b37f0fc b/flask_session/93cd60fca3662b3b62fa48162b37f0fc new file mode 100644 index 0000000000000000000000000000000000000000..ba18594b20b9a8fcfb9174f81a266da7b22ea6e9 GIT binary patch literal 57 zcmWewUYFLuI#r7S0&1sd^l-%&q!#5S=B4J9OzG(1OwP#!vf?vSru1+a8>UzqBqpXz HDb)i2{}B@E literal 0 HcmV?d00001 diff --git a/flask_session/b374a533064d4f726057d2daf5465b06 b/flask_session/b374a533064d4f726057d2daf5465b06 new file mode 100644 index 0000000000000000000000000000000000000000..bd95bf99ea75d6a17c404140b1eedb9bbbd62d74 GIT binary patch literal 57 zcmbQevo5WHb*dHv1k_H^=;4YlNG-}u%uCHHnbOh2nVgdeWW{HuOzGh;HcYWJNK8zb HQmO|4A_EhL literal 0 HcmV?d00001 diff --git a/flask_session/c2ca2782adffe80ef938353324e18126 b/flask_session/c2ca2782adffe80ef938353324e18126 new file mode 100644 index 0000000000000000000000000000000000000000..9c4b9c4b2350fa4ca93cdf06b84417860f603ee8 GIT binary patch literal 57 zcmZ3#q%N(2b*dHv1k_H^=;4YlNG-}u%uCHHnbOh2nVgdeWW{HuOzGh;HcYWJNK8zb HQmO|4A>R{* literal 0 HcmV?d00001 diff --git a/flask_session/d1a91b81953dba7179a749524fd7b5d8 b/flask_session/d1a91b81953dba7179a749524fd7b5d8 new file mode 100644 index 0000000000000000000000000000000000000000..b266ccf34b52b256fae9498a152d9cde97878a49 GIT binary patch literal 57 zcmeykvM#NGb*dHv1k_H^=;4YlNG-}u%uCHHnbOh2nVgdeWW{HuOzGh;HcYWJNK8zb HQmO|4F{u;H literal 0 HcmV?d00001 diff --git a/flask_session/e80c3442482b04dffebe9de33c2adace b/flask_session/e80c3442482b04dffebe9de33c2adace new file mode 100644 index 0000000000000000000000000000000000000000..bd7b030027069f271402d0998ba90e44d7e61c84 GIT binary patch literal 57 zcmbUzqBqpXz HDb)i27P}Kv literal 0 HcmV?d00001 diff --git a/flask_session/e9087f19cb0516ef0a65e6899b4121b2 b/flask_session/e9087f19cb0516ef0a65e6899b4121b2 new file mode 100644 index 0000000000000000000000000000000000000000..8bee529e76de19a26b74234f545f0770697d4a11 GIT binary patch literal 57 zcmZ2@q%N(2b*dHv1k_H^=;4YlNG-}u%uCHHnbOh2nVgdeWW{HuOzGh;HcYWJNK8zb HQmO|4CBYMz literal 0 HcmV?d00001 diff --git a/manager.py b/manager.py index 08f7429..c870691 100644 --- a/manager.py +++ b/manager.py @@ -162,9 +162,11 @@ def get_client(client_id:str): return format_response(False, "Client not found."), 404 @login_required -def update_client(client_id:str, **kwargs): +def update_client(client_id:str, otp_code:int, **kwargs): """Updates a client in the database. If the client is not found, returns an error message.""" current_client_id, is_admin = get_current_client() + if not verify_otp(current_client_id, otp_code): + return format_response(False, "Invalid OTP."), 405 if not is_admin and client_id != current_client_id: return format_response(False, "You can only view your own client information."), 403 for client in session.query(Client).all(): diff --git a/test_database.db b/test_database.db index a9cfd260edb90109a61fedf2e8747505950660dc..4129f7ea283204cbbe62fedb171f5480a6fbf2dc 100644 GIT binary patch delta 103 zcmZo@&}(SWn;^}|J5k1&m6t)UtaD?^qI?!d1_sB;Tm|Nwjm3<-vf|>#(v$59bl4M% tvUAeY(wl1w+G`6KftU%1nSq!Eh*^P{4T#x+m;;D8ftYK1Z2@;PKLBR`A)5dI delta 105 zcmZo@&}(SWn;^}|Gf~Ewm4`vEtb1e1qI?!p1_sl~Tm|NnW#u)6or>~PvorF`QuB&a v%Tv=842{g2YYW