import json import os import hashlib class UserProfile: """Объект пользователя системы. Хранит логин, хэш пароля и список сохранённых репозиториев. Используется как логическая модель для диаграммы классов. """ def __init__(self, login, password_hash="", repositories=None): self.login = login self.password_hash = password_hash self.repositories = repositories or [] def to_dict(self): return { "password": self.password_hash, "repositories": self.repositories, } class StorageManager: """Класс локального хранилища. Отвечает за регистрацию, вход, сохранение и удаление ссылок. Данные хранятся в JSON-файле рядом с программой. """ def __init__(self, data_file="users_data.json"): self.data_file = data_file def _load(self): if not os.path.exists(self.data_file): return {"users": {}} try: with open(self.data_file, "r", encoding="utf-8") as f: return json.load(f) except Exception: return {"users": {}} def _save(self, data): with open(self.data_file, "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2) def _hash_password(self, password): return hashlib.sha256(password.encode("utf-8")).hexdigest() def register_user(self, login, password): data = self._load() if login in data["users"]: return False, "Такой пользователь уже существует" user = UserProfile( login=login, password_hash=self._hash_password(password), repositories=[], ) data["users"][login] = user.to_dict() self._save(data) return True, "Профиль создан" def check_user(self, login, password): data = self._load() user = data["users"].get(login) if not user: return False return user.get("password") == self._hash_password(password) def get_repositories(self, login): data = self._load() return data["users"].get(login, {}).get("repositories", []) def add_repository(self, login, link): data = self._load() repos = data["users"].setdefault( login, {"password": "", "repositories": []}, ).setdefault("repositories", []) if link in repos: return False repos.append(link) self._save(data) return True def delete_repository(self, login, link): data = self._load() repos = data["users"].get(login, {}).get("repositories", []) if link in repos: repos.remove(link) self._save(data) return True return False # Обратная совместимость: если старый код где-то импортирует функции, # они всё равно работают через объект StorageManager. _default_storage = StorageManager() def register_user(login, password): return _default_storage.register_user(login, password) def check_user(login, password): return _default_storage.check_user(login, password) def get_repositories(login): return _default_storage.get_repositories(login) def add_repository(login, link): return _default_storage.add_repository(login, link) def delete_repository(login, link): return _default_storage.delete_repository(login, link)