feat: add some validation

This commit is contained in:
2025-12-20 21:04:09 +01:00
parent 9565e4008e
commit 887169e7d2

View File

@@ -1,11 +1,48 @@
"""Core configuration module for Skywipe""" """Core configuration module for Skywipe"""
import getpass import getpass
import re
from pathlib import Path from pathlib import Path
import yaml import yaml
from .logger import setup_logger from .logger import setup_logger
def _validate_handle(handle: str) -> tuple[bool, str]:
if not handle:
return False, "Handle cannot be empty"
if len(handle) > 253:
return False, "Handle is too long (max 253 characters)"
if " " in handle:
return False, "Handle cannot contain spaces"
handle_pattern = re.compile(
r"^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$|"
r"^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$|"
r"^did:[a-z]+:[a-zA-Z0-9._-]+$"
)
if not handle_pattern.match(handle):
return False, (
"Invalid handle format. "
"Use a username (e.g., 'alice'), full handle (e.g., 'alice.bsky.social'), "
"or DID (e.g., 'did:plc:...')"
)
return True, ""
def _validate_password(password: str) -> tuple[bool, str]:
if not password:
return False, "Password cannot be empty"
if len(password) < 8:
return False, "Password is too short (minimum 8 characters)"
return True, ""
class Configuration: class Configuration:
def __init__(self): def __init__(self):
self.config_file = Path.home() / ".config" / "skywipe" / "config.yml" self.config_file = Path.home() / ".config" / "skywipe" / "config.yml"
@@ -27,8 +64,27 @@ class Configuration:
print("Skywipe Configuration") print("Skywipe Configuration")
print("=" * 50) print("=" * 50)
handle = input("Bluesky handle: ").strip() print("Note: You should use an app password from Bluesky settings.")
password = getpass.getpass("Bluesky app password: ").strip()
while True:
handle = input("Bluesky handle: ").strip()
is_valid, error_msg = _validate_handle(handle)
if is_valid:
break
logger.error(error_msg)
logger.info("Please enter a valid handle and try again.")
while True:
password = getpass.getpass(
"Bluesky (hopefully app) password: ").strip()
is_valid, error_msg = _validate_password(password)
if is_valid:
break
logger.error(error_msg)
logger.info("Please check your password and try again.")
logger.info(
"Generate an app password at: https://bsky.app/settings/app-passwords")
batch_size = input("Batch size (default: 10): ").strip() or "10" batch_size = input("Batch size (default: 10): ").strip() or "10"
delay = input( delay = input(
"Delay between batches in seconds (default: 1): ").strip() or "1" "Delay between batches in seconds (default: 1): ").strip() or "1"
@@ -38,9 +94,20 @@ class Configuration:
try: try:
batch_size = int(batch_size) batch_size = int(batch_size)
delay = int(delay) if batch_size < 1 or batch_size > 100:
logger.error("batch_size must be between 1 and 100")
return
except ValueError: except ValueError:
logger.error("batch_size and delay must be integers") logger.error("batch_size must be an integer")
return
try:
delay = int(delay)
if delay < 0 or delay > 60:
logger.error("delay must be between 0 and 60 seconds")
return
except ValueError:
logger.error("delay must be an integer")
return return
config_data = { config_data = {