134 lines
5.1 KiB
Python
134 lines
5.1 KiB
Python
import kivy
|
|
from kivy.app import App
|
|
from kivy.uix.screenmanager import ScreenManager, Screen
|
|
import os
|
|
import json
|
|
from kivy.clock import Clock
|
|
from kivy.properties import StringProperty, ListProperty
|
|
from utils import (
|
|
generate_key, load_key, encrypt_data, decrypt_data,
|
|
check_server_settings, save_server_settings,
|
|
test_connection, get_devices_from_server, save_route_to_file, fetch_positions_for_selected_day
|
|
)
|
|
from datetime import date
|
|
from kivy.uix.popup import Popup
|
|
from kivy.uix.gridlayout import GridLayout
|
|
from kivy.uix.button import Button
|
|
from kivy.uix.label import Label
|
|
from kivy.uix.boxlayout import BoxLayout
|
|
from threading import Thread
|
|
from kivy.clock import mainthread
|
|
from kivy.uix.image import Image
|
|
from kivy.uix.behaviors import ButtonBehavior
|
|
from kivy.uix.progressbar import ProgressBar
|
|
import webbrowser
|
|
from selenium import webdriver
|
|
from selenium.webdriver.chrome.options import Options
|
|
from PIL import Image
|
|
import time
|
|
from config import RESOURCES_FOLDER, CREDENTIALS_FILE
|
|
|
|
class SettingsScreen(Screen):
|
|
server_response = "Waiting to test connection..."
|
|
|
|
def on_pre_enter(self):
|
|
settings = check_server_settings()
|
|
if settings:
|
|
self.ids.server_url_input.text = settings.get("server_url", "")
|
|
self.ids.username_input.text = settings.get("username", "")
|
|
self.ids.password_input.text = settings.get("password", "")
|
|
self.ids.token_input.text = settings.get("token", "")
|
|
else:
|
|
self.ids.server_url_input.text = ""
|
|
self.ids.username_input.text = ""
|
|
self.ids.password_input.text = ""
|
|
self.ids.token_input.text = ""
|
|
|
|
def test_connection(self):
|
|
server_url = self.ids.server_url_input.text.strip()
|
|
username = self.ids.username_input.text.strip()
|
|
password = self.ids.password_input.text.strip()
|
|
token = self.ids.token_input.text.strip()
|
|
result = test_connection(server_url, username, password, token)
|
|
self.server_response = result["message"]
|
|
self.ids.result_label.text = self.server_response
|
|
|
|
def save_settings(self):
|
|
server_url = self.ids.server_url_input.text.strip()
|
|
username = self.ids.username_input.text.strip()
|
|
password = self.ids.password_input.text.strip()
|
|
token = self.ids.token_input.text.strip()
|
|
if not server_url or not username or not password or not token:
|
|
self.ids.result_label.text = "Please fill in all fields."
|
|
return
|
|
settings_data = {
|
|
"server_url": server_url,
|
|
"username": username,
|
|
"password": password,
|
|
"token": token,
|
|
}
|
|
try:
|
|
save_server_settings(settings_data)
|
|
self.ids.result_label.text = "Settings saved successfully!"
|
|
self.manager.current = "home"
|
|
except Exception as e:
|
|
self.ids.result_label.text = f"Failed to save settings: {str(e)}"
|
|
# get trip from server screen
|
|
|
|
|
|
|
|
# trhis screen is used to create a new user
|
|
# register screen
|
|
class RegisterScreen(Screen):
|
|
def create_user(self):
|
|
"""Handle user creation."""
|
|
username = self.ids.set_username_input.text.strip()
|
|
password = self.ids.set_password_input.text.strip()
|
|
confirm_password = self.ids.confirm_password_input.text.strip()
|
|
email = self.ids.set_email_input.text.strip()
|
|
|
|
if not username or not password or not confirm_password or not email:
|
|
self.ids.result_label.text = "Please fill in all fields."
|
|
return
|
|
|
|
if password != confirm_password:
|
|
self.ids.result_label.text = "Passwords do not match."
|
|
return
|
|
|
|
# Check if the username or email already exists
|
|
if self.user_exists(username, email):
|
|
self.ids.result_label.text = "User or email already exists."
|
|
return
|
|
|
|
# Save user data (encrypted)
|
|
user_data = {
|
|
"username": username,
|
|
"password": password,
|
|
"email": email,
|
|
}
|
|
encrypted_data = encrypt_data(json.dumps(user_data))
|
|
|
|
try:
|
|
with open(CREDENTIALS_FILE, "ab") as file: # Append encrypted data
|
|
file.write(encrypted_data + b"\n") # Add a newline for separation
|
|
except Exception as e:
|
|
self.ids.result_label.text = f"Failed to save user: {str(e)}"
|
|
return
|
|
|
|
self.ids.result_label.text = "User created successfully!"
|
|
# Navigate back to the login screen
|
|
self.manager.current = "login"
|
|
def user_exists(self, username, email):
|
|
"""Check if a username or email already exists in the credentials.enc file."""
|
|
try:
|
|
with open(CREDENTIALS_FILE, "rb") as file:
|
|
for line in file:
|
|
decrypted_data = decrypt_data(line.strip())
|
|
user = json.loads(decrypted_data)
|
|
if user["username"] == username or user["email"] == email:
|
|
return True
|
|
except FileNotFoundError:
|
|
pass
|
|
except Exception as e:
|
|
self.ids.result_label.text = f"Error checking user: {str(e)}"
|
|
return False |