diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 00000000..13566b81
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/PyEveryday.iml b/.idea/PyEveryday.iml
new file mode 100644
index 00000000..8d31fc3f
--- /dev/null
+++ b/.idea/PyEveryday.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 00000000..80da1c82
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 00000000..105ce2da
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/material_theme_project_new.xml b/.idea/material_theme_project_new.xml
new file mode 100644
index 00000000..bf3d4287
--- /dev/null
+++ b/.idea/material_theme_project_new.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 00000000..4d36ce69
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 00000000..52519752
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 00000000..35eb1ddf
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/backend/scripts/security/file_encrypt_decrypt.py b/backend/scripts/security/file_encrypt_decrypt.py
new file mode 100644
index 00000000..11f2cf7f
--- /dev/null
+++ b/backend/scripts/security/file_encrypt_decrypt.py
@@ -0,0 +1,97 @@
+import tkinter as tk
+from tkinter import filedialog
+import re
+import getpass
+from cryptography.fernet import Fernet
+import base64
+import hashlib
+import os
+
+
+def select_file():
+ root = tk.Tk()
+ root.withdraw()
+ file_path = filedialog.askopenfilename(
+ title="Select file to encrypt/decrypt"
+ )
+ return file_path
+
+
+def get_password_type():
+ print("Choose password type:")
+ print("1. Alphabetic")
+ print("2. Numeric")
+ print("3. Alphanumeric")
+ while True:
+ option = input("Enter option (1/2/3): ").strip()
+ if option in ["1", "2", "3"]:
+ return option
+ print("Invalid option. Try again.")
+
+
+def get_password(option):
+ while True:
+ pwd = getpass.getpass("Enter password: ")
+ if option == "1" and re.fullmatch(r"[A-Za-z]+", pwd):
+ return pwd
+ elif option == "2" and re.fullmatch(r"\d+", pwd):
+ return pwd
+ elif option == "3" and re.fullmatch(r"[A-Za-z0-9]+", pwd):
+ return pwd
+ print("Invalid password format. Try again.")
+
+
+def derive_key(password):
+ key = hashlib.sha256(password.encode()).digest()
+ return base64.urlsafe_b64encode(key)
+
+
+def encrypt_file(file_path, key):
+ with open(file_path, "rb") as f:
+ data = f.read()
+ fernet = Fernet(key)
+ encrypted = fernet.encrypt(data)
+ out_path = file_path + ".enc"
+ with open(out_path, "wb") as f:
+ f.write(encrypted)
+ print(f"File encrypted: {out_path}")
+
+
+def decrypt_file(file_path, key):
+ with open(file_path, "rb") as f:
+ data = f.read()
+ fernet = Fernet(key)
+ try:
+ decrypted = fernet.decrypt(data)
+ except Exception:
+ print("Decryption failed. Wrong password or corrupted file.")
+ return
+ out_path = file_path.replace(".enc", ".dec")
+ with open(out_path, "wb") as f:
+ f.write(decrypted)
+ print(f"File decrypted: {out_path}")
+
+
+def main():
+ print("Choose action:")
+ print("1. Encrypt")
+ print("2. Decrypt")
+ action = input("Enter option (1/2): ").strip()
+ if action not in ["1", "2"]:
+ print("Invalid action.")
+ return
+ file_path = select_file()
+ if not file_path:
+ print("No file selected.")
+ return
+ pwd_type = get_password_type()
+ password = get_password(pwd_type)
+ key = derive_key(password)
+ if action == "1":
+ encrypt_file(file_path, key)
+ else:
+ decrypt_file(file_path, key)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ui/package-lock.json b/ui/package-lock.json
index da668482..8b05ea22 100644
--- a/ui/package-lock.json
+++ b/ui/package-lock.json
@@ -8,7 +8,7 @@
"name": "ui",
"version": "0.1.0",
"dependencies": {
- "next": "15.4.5",
+ "next": "^15.5.2",
"react": "19.1.0",
"react-dom": "19.1.0"
},
@@ -775,9 +775,9 @@
}
},
"node_modules/@next/env": {
- "version": "15.4.5",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-15.4.5.tgz",
- "integrity": "sha512-ruM+q2SCOVCepUiERoxOmZY9ZVoecR3gcXNwCYZRvQQWRjhOiPJGmQ2fAiLR6YKWXcSAh7G79KEFxN3rwhs4LQ==",
+ "version": "15.5.2",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.2.tgz",
+ "integrity": "sha512-Qe06ew4zt12LeO6N7j8/nULSOe3fMXE4dM6xgpBQNvdzyK1sv5y4oAP3bq4LamrvGCZtmRYnW8URFCeX5nFgGg==",
"license": "MIT"
},
"node_modules/@next/eslint-plugin-next": {
@@ -791,9 +791,9 @@
}
},
"node_modules/@next/swc-darwin-arm64": {
- "version": "15.4.5",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.4.5.tgz",
- "integrity": "sha512-84dAN4fkfdC7nX6udDLz9GzQlMUwEMKD7zsseXrl7FTeIItF8vpk1lhLEnsotiiDt+QFu3O1FVWnqwcRD2U3KA==",
+ "version": "15.5.2",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.2.tgz",
+ "integrity": "sha512-8bGt577BXGSd4iqFygmzIfTYizHb0LGWqH+qgIF/2EDxS5JsSdERJKA8WgwDyNBZgTIIA4D8qUtoQHmxIIquoQ==",
"cpu": [
"arm64"
],
@@ -807,9 +807,9 @@
}
},
"node_modules/@next/swc-darwin-x64": {
- "version": "15.4.5",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.4.5.tgz",
- "integrity": "sha512-CL6mfGsKuFSyQjx36p2ftwMNSb8PQog8y0HO/ONLdQqDql7x3aJb/wB+LA651r4we2pp/Ck+qoRVUeZZEvSurA==",
+ "version": "15.5.2",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.2.tgz",
+ "integrity": "sha512-2DjnmR6JHK4X+dgTXt5/sOCu/7yPtqpYt8s8hLkHFK3MGkka2snTv3yRMdHvuRtJVkPwCGsvBSwmoQCHatauFQ==",
"cpu": [
"x64"
],
@@ -823,9 +823,9 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
- "version": "15.4.5",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.4.5.tgz",
- "integrity": "sha512-1hTVd9n6jpM/thnDc5kYHD1OjjWYpUJrJxY4DlEacT7L5SEOXIifIdTye6SQNNn8JDZrcN+n8AWOmeJ8u3KlvQ==",
+ "version": "15.5.2",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.2.tgz",
+ "integrity": "sha512-3j7SWDBS2Wov/L9q0mFJtEvQ5miIqfO4l7d2m9Mo06ddsgUK8gWfHGgbjdFlCp2Ek7MmMQZSxpGFqcC8zGh2AA==",
"cpu": [
"arm64"
],
@@ -839,9 +839,9 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
- "version": "15.4.5",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.4.5.tgz",
- "integrity": "sha512-4W+D/nw3RpIwGrqpFi7greZ0hjrCaioGErI7XHgkcTeWdZd146NNu1s4HnaHonLeNTguKnL2Urqvj28UJj6Gqw==",
+ "version": "15.5.2",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.2.tgz",
+ "integrity": "sha512-s6N8k8dF9YGc5T01UPQ08yxsK6fUow5gG1/axWc1HVVBYQBgOjca4oUZF7s4p+kwhkB1bDSGR8QznWrFZ/Rt5g==",
"cpu": [
"arm64"
],
@@ -855,9 +855,9 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
- "version": "15.4.5",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.4.5.tgz",
- "integrity": "sha512-N6Mgdxe/Cn2K1yMHge6pclffkxzbSGOydXVKYOjYqQXZYjLCfN/CuFkaYDeDHY2VBwSHyM2fUjYBiQCIlxIKDA==",
+ "version": "15.5.2",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.2.tgz",
+ "integrity": "sha512-o1RV/KOODQh6dM6ZRJGZbc+MOAHww33Vbs5JC9Mp1gDk8cpEO+cYC/l7rweiEalkSm5/1WGa4zY7xrNwObN4+Q==",
"cpu": [
"x64"
],
@@ -871,9 +871,9 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
- "version": "15.4.5",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.4.5.tgz",
- "integrity": "sha512-YZ3bNDrS8v5KiqgWE0xZQgtXgCTUacgFtnEgI4ccotAASwSvcMPDLua7BWLuTfucoRv6mPidXkITJLd8IdJplQ==",
+ "version": "15.5.2",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.2.tgz",
+ "integrity": "sha512-/VUnh7w8RElYZ0IV83nUcP/J4KJ6LLYliiBIri3p3aW2giF+PAVgZb6mk8jbQSB3WlTai8gEmCAr7kptFa1H6g==",
"cpu": [
"x64"
],
@@ -887,9 +887,9 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
- "version": "15.4.5",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.4.5.tgz",
- "integrity": "sha512-9Wr4t9GkZmMNcTVvSloFtjzbH4vtT4a8+UHqDoVnxA5QyfWe6c5flTH1BIWPGNWSUlofc8dVJAE7j84FQgskvQ==",
+ "version": "15.5.2",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.2.tgz",
+ "integrity": "sha512-sMPyTvRcNKXseNQ/7qRfVRLa0VhR0esmQ29DD6pqvG71+JdVnESJaHPA8t7bc67KD5spP3+DOCNLhqlEI2ZgQg==",
"cpu": [
"arm64"
],
@@ -903,9 +903,9 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
- "version": "15.4.5",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.4.5.tgz",
- "integrity": "sha512-voWk7XtGvlsP+w8VBz7lqp8Y+dYw/MTI4KeS0gTVtfdhdJ5QwhXLmNrndFOin/MDoCvUaLWMkYKATaCoUkt2/A==",
+ "version": "15.5.2",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.2.tgz",
+ "integrity": "sha512-W5VvyZHnxG/2ukhZF/9Ikdra5fdNftxI6ybeVKYvBPDtyx7x4jPPSNduUkfH5fo3zG0JQ0bPxgy41af2JX5D4Q==",
"cpu": [
"x64"
],
@@ -4647,12 +4647,12 @@
"license": "MIT"
},
"node_modules/next": {
- "version": "15.4.5",
- "resolved": "https://registry.npmjs.org/next/-/next-15.4.5.tgz",
- "integrity": "sha512-nJ4v+IO9CPmbmcvsPebIoX3Q+S7f6Fu08/dEWu0Ttfa+wVwQRh9epcmsyCPjmL2b8MxC+CkBR97jgDhUUztI3g==",
+ "version": "15.5.2",
+ "resolved": "https://registry.npmjs.org/next/-/next-15.5.2.tgz",
+ "integrity": "sha512-H8Otr7abj1glFhbGnvUt3gz++0AF1+QoCXEBmd/6aKbfdFwrn0LpA836Ed5+00va/7HQSDD+mOoVhn3tNy3e/Q==",
"license": "MIT",
"dependencies": {
- "@next/env": "15.4.5",
+ "@next/env": "15.5.2",
"@swc/helpers": "0.5.15",
"caniuse-lite": "^1.0.30001579",
"postcss": "8.4.31",
@@ -4665,14 +4665,14 @@
"node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
},
"optionalDependencies": {
- "@next/swc-darwin-arm64": "15.4.5",
- "@next/swc-darwin-x64": "15.4.5",
- "@next/swc-linux-arm64-gnu": "15.4.5",
- "@next/swc-linux-arm64-musl": "15.4.5",
- "@next/swc-linux-x64-gnu": "15.4.5",
- "@next/swc-linux-x64-musl": "15.4.5",
- "@next/swc-win32-arm64-msvc": "15.4.5",
- "@next/swc-win32-x64-msvc": "15.4.5",
+ "@next/swc-darwin-arm64": "15.5.2",
+ "@next/swc-darwin-x64": "15.5.2",
+ "@next/swc-linux-arm64-gnu": "15.5.2",
+ "@next/swc-linux-arm64-musl": "15.5.2",
+ "@next/swc-linux-x64-gnu": "15.5.2",
+ "@next/swc-linux-x64-musl": "15.5.2",
+ "@next/swc-win32-arm64-msvc": "15.5.2",
+ "@next/swc-win32-x64-msvc": "15.5.2",
"sharp": "^0.34.3"
},
"peerDependencies": {
diff --git a/ui/package.json b/ui/package.json
index c7cf9c9d..3b7e88da 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -9,19 +9,19 @@
"lint": "next lint"
},
"dependencies": {
+ "next": "^15.5.2",
"react": "19.1.0",
- "react-dom": "19.1.0",
- "next": "15.4.5"
+ "react-dom": "19.1.0"
},
"devDependencies": {
- "typescript": "^5",
+ "@eslint/eslintrc": "^3",
+ "@tailwindcss/postcss": "^4",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
- "@tailwindcss/postcss": "^4",
- "tailwindcss": "^4",
"eslint": "^9",
"eslint-config-next": "15.4.5",
- "@eslint/eslintrc": "^3"
+ "tailwindcss": "^4",
+ "typescript": "^5"
}
}