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