Files
dotfiles/ClipCascade/cli/login.py
T
2026-07-23 16:48:58 +02:00

215 lines
7.1 KiB
Python
Executable File

import getpass
import os
import re
from core.config import Config
from cli.info import CustomDialog
from core.constants import *
class LoginForm:
def __init__(
self,
config: Config,
on_login_callback=None,
on_quit_callback=None,
):
self.config = config
self.on_login_callback = on_login_callback
self.on_quit_callback = on_quit_callback
@staticmethod
def remove_trailing_slash(entry):
return re.sub(r"/+$", "", entry)
@staticmethod
def is_positive_integer(value):
if value.isdigit() and int(value) > 0:
return True
else:
return False
@staticmethod
def bool_to_str(value):
return "y" if value else "n"
@staticmethod
def str_to_bool(value):
return value.lower().strip() == "y"
@staticmethod
def is_positive_integer(value):
if value.isdigit() and int(value) > 0:
return True
else:
return False
def mainloop(self):
# save data to config
self.config.data["username"] = (
input(f"username [{self.config.data['username']}]: ")
or self.config.data["username"]
)
self.config.data["password"] = getpass.getpass("password: ")
server_url = (
input(f"server url [{self.config.data['server_url']}]: ")
or self.config.data["server_url"]
)
self.config.data["server_url"] = LoginForm.remove_trailing_slash(
server_url.strip()
)
self.config.data["cipher_enabled"] = LoginForm.str_to_bool(
input(
f"enabled encryption(recommended) [{LoginForm.bool_to_str(self.config.data['cipher_enabled'])}]: "
)
or LoginForm.bool_to_str(self.config.data["cipher_enabled"])
)
self.config.data["notification"] = LoginForm.str_to_bool(
input(
f"enabled notification [{LoginForm.bool_to_str(self.config.data['notification'])}]: "
)
or LoginForm.bool_to_str(self.config.data["notification"])
)
# extra fields
show_extra_fields = input(f"show extra fields [n]: ") or "n"
if not LoginForm.str_to_bool(show_extra_fields):
CustomDialog("Logging in...").mainloop()
return
# Validate hash_rounds
while True:
hash_rounds = input(
f"hash rounds [{self.config.data['hash_rounds']}]: "
) or str(
""
if self.config.data["hash_rounds"] is None
else str(self.config.data["hash_rounds"])
)
hash_rounds = hash_rounds.strip()
if not LoginForm.is_positive_integer(hash_rounds):
CustomDialog(
"Invalid Input\nHash Rounds must be a positive integer.",
msg_type="error",
)
continue
self.config.data["hash_rounds"] = int(hash_rounds)
break
self.config.data["salt"] = (
input(f"salt [{self.config.data['salt']}]: ") or self.config.data["salt"]
)
self.config.data["save_password"] = LoginForm.str_to_bool(
input(
f"store password locally(not recommended; only works if encryption is disabled) [{LoginForm.bool_to_str(self.config.data['save_password'])}]: "
)
or LoginForm.bool_to_str(self.config.data["save_password"])
)
# Validate max_clipboard_size_local_limit_bytes
while True:
saved_mcsll = str(
""
if self.config.data["max_clipboard_size_local_limit_bytes"] is None
else str(self.config.data["max_clipboard_size_local_limit_bytes"])
)
max_clipboard_size_local_limit_bytes = (
input(
f"maximum clipboard size local limit (in bytes) [{saved_mcsll}]: "
)
or saved_mcsll
)
max_clipboard_size_local_limit_bytes = (
max_clipboard_size_local_limit_bytes.strip()
)
if max_clipboard_size_local_limit_bytes == "":
self.config.data["max_clipboard_size_local_limit_bytes"] = None
break
if not LoginForm.is_positive_integer(max_clipboard_size_local_limit_bytes):
CustomDialog(
"Invalid Input\nMax Clipboard Size Local Limit must be a positive integer.",
msg_type="error",
)
continue
self.config.data["max_clipboard_size_local_limit_bytes"] = int(
max_clipboard_size_local_limit_bytes
)
break
self.config.data["enable_image_sharing"] = LoginForm.str_to_bool(
input(
f"enable image sharing [{LoginForm.bool_to_str(self.config.data['enable_image_sharing'])}]: "
)
or LoginForm.bool_to_str(self.config.data["enable_image_sharing"])
)
self.config.data["enable_file_sharing"] = LoginForm.str_to_bool(
input(
f"enable file sharing [{LoginForm.bool_to_str(self.config.data['enable_file_sharing'])}]: "
)
or LoginForm.bool_to_str(self.config.data["enable_file_sharing"])
)
# Validate default file download location
while True:
default_file_download_location = (
input(
f"default file download location [{self.config.data['default_file_download_location']}]: "
)
or self.config.data["default_file_download_location"]
)
default_file_download_location = default_file_download_location.strip()
if default_file_download_location == "":
self.config.data["default_file_download_location"] = ""
break
if not os.path.isdir(default_file_download_location):
CustomDialog(
"Invalid directory path.",
msg_type="error",
).mainloop()
continue
self.config.data["default_file_download_location"] = (
default_file_download_location
)
break
while True:
ssl_ca_bundle = (
input(
f"ssl ca bundle path (optional) [{self.config.data.get('ssl_ca_bundle') or ''}]: "
)
or (self.config.data.get("ssl_ca_bundle") or "")
).strip()
if ssl_ca_bundle == "":
self.config.data["ssl_ca_bundle"] = ""
break
if not os.path.isfile(ssl_ca_bundle):
CustomDialog(
"Invalid Input\nSSL CA bundle path is not a file or does not exist.",
msg_type="error",
).mainloop()
continue
self.config.data["ssl_ca_bundle"] = ssl_ca_bundle
break
CustomDialog("Logging in...").mainloop()
def on_quit(self):
pass
def close(self):
pass