165 lines
13 KiB
Markdown
165 lines
13 KiB
Markdown
# Project Tasks: Кроссплатформенный Менеджер Паролей
|
||
|
||
> [!NOTE]
|
||
> Каждый тикет — одна атомарная единица работы: её можно взять, выполнить и смержить независимо от других.
|
||
> Архитектурные решения описаны в [ARCHITECTURE.md](file:///Users/aleksandrebaklakov/Documents/Code/utils/abdristus/docs/ARCHITECTURE.md).
|
||
|
||
---
|
||
|
||
## `[INFRA]` — Инициализация и Инфраструктура
|
||
|
||
- [x] **INFRA-01** Создать Tauri-проект (`tauri init`) с базовой конфигурацией `tauri.conf.json`
|
||
- [x] **INFRA-02** Создать Angular-проект с флагом `--standalone` (без NgModules)
|
||
- [x] **INFRA-03** Настроить Rust-зависимости в `Cargo.toml`: `argon2`, `chacha20poly1305`, `sqlx`, `keyring`, `uuid`
|
||
- [x] **INFRA-04** Настроить npm-зависимости: `@tauri-apps/api`, `rxjs`, установить ESLint + строгий TypeScript
|
||
- [x] **INFRA-05** Настроить `tauri-plugin-global-shortcut` в `main.rs`
|
||
- [ ] **INFRA-06** Настроить глобальные CSS-переменные и тему (цвета, типографику из `DESIGN.md`)
|
||
|
||
---
|
||
|
||
## `[CRYPTO]` — Криптография (Rust · `core/crypto.rs`)
|
||
|
||
- [ ] **CRYPTO-01** Реализовать генерацию случайной соли (`rand`) для Argon2id
|
||
- [ ] **CRYPTO-02** Реализовать деривацию ключа DEK из Мастер-пароля через Argon2id (параметры: 2 прохода, ≥64 МБ)
|
||
- [ ] **CRYPTO-03** Реализовать шифрование данных через XChaCha20-Poly1305 (возвращает `nonce` + `ciphertext`)
|
||
- [ ] **CRYPTO-04** Реализовать дешифрование данных через XChaCha20-Poly1305 (принимает `nonce` + `ciphertext`)
|
||
- [ ] **CRYPTO-05** Написать unit-тесты: шифрование → дешифрование возвращает исходные данные
|
||
- [ ] **CRYPTO-06** Написать unit-тест: неверный nonce вызывает ошибку аутентификации
|
||
|
||
---
|
||
|
||
## `[PASSGEN]` — Генератор Паролей (Rust · `core/password_gen.rs`)
|
||
|
||
- [ ] **PASSGEN-01** Реализовать генерацию пароля заданной длины из набора символов (буквы, цифры)
|
||
- [ ] **PASSGEN-02** Добавить поддержку флага включения специальных символов
|
||
- [ ] **PASSGEN-03** Написать unit-тест: результат соответствует заданным параметрам (длина, набор символов)
|
||
|
||
---
|
||
|
||
## `[DB]` — База Данных (Rust · `database/`)
|
||
|
||
- [ ] **DB-01** Написать SQL-схему для таблицы `accounts` (`database/schema.sql`): поля `id`, `service_name`, `encrypted_data`, `nonce`, `updated_at`, `is_deleted`
|
||
- [ ] **DB-02** Реализовать функцию создания/открытия изолированного файла БД `vault_<uuid>.sqlite` (`database/repository.rs`)
|
||
- [ ] **DB-03** Определить Rust-структуры для маппинга таблиц БД (`database/models.rs`)
|
||
- [ ] **DB-04** Реализовать `INSERT` — добавление новой зашифрованной записи (`repository.rs`)
|
||
- [ ] **DB-05** Реализовать `SELECT` — получение всех записей по `vault_id` (с фильтром `is_deleted = false`)
|
||
- [ ] **DB-06** Реализовать `UPDATE` — обновление записи и её поля `updated_at`
|
||
- [ ] **DB-07** Реализовать `UPDATE` — Soft-delete записи (установка `is_deleted = true`)
|
||
- [ ] **DB-08** Написать integration-тест для каждой операции репозитория (CRUD)
|
||
|
||
---
|
||
|
||
## `[AUTH]` — Аутентификация (Rust · `commands/auth.rs`)
|
||
|
||
- [ ] **AUTH-01** Реализовать IPC-команду `unlock_vault`: принимает Мастер-пароль, возвращает успех/ошибку
|
||
- [ ] **AUTH-02** Реализовать сохранение DEK в системный Keyring после успешного ввода Мастер-пароля (macOS Keychain)
|
||
- [ ] **AUTH-03** Реализовать сохранение DEK в системный Keyring (Windows Credential Manager)
|
||
- [ ] **AUTH-04** Реализовать IPC-команду `unlock_vault_biometric`: вытащить DEK из Keyring через biometric prompt (macOS Touch ID)
|
||
- [ ] **AUTH-05** Реализовать IPC-команду `unlock_vault_biometric`: вытащить DEK из Keyring через biometric prompt (Windows Hello)
|
||
- [ ] **AUTH-06** Реализовать IPC-команду `lock_vault`: сбросить сессионный DEK из памяти
|
||
- [ ] **AUTH-07** Написать integration-тест для команды `unlock_vault` с корректным и некорректным паролем
|
||
|
||
---
|
||
|
||
## `[VAULT]` — Управление Записями (Rust · `commands/vault.rs`)
|
||
|
||
- [ ] **VAULT-01** Реализовать IPC-команду `get_accounts`: расшифровать и вернуть все записи для текущей сессии
|
||
- [ ] **VAULT-02** Реализовать IPC-команду `create_account`: принять данные от фронтенда, зашифровать через DEK, сохранить в БД
|
||
- [ ] **VAULT-03** Реализовать IPC-команду `update_account`: обновить запись, выставить `updated_at`
|
||
- [ ] **VAULT-04** Реализовать IPC-команду `delete_account`: выполнить soft-delete (`is_deleted = true`)
|
||
- [ ] **VAULT-05** Написать integration-тест для каждой IPC-команды vault
|
||
|
||
---
|
||
|
||
## `[EVENTS]` — Push-события (Rust · `events/emitter.rs`)
|
||
|
||
- [ ] **EVENTS-01** Реализовать эмиттер события `vault-updated` (отправляется после create/update/delete)
|
||
- [ ] **EVENTS-02** Реализовать эмиттер события `system-locked` (отправляется при блокировке ОС или по таймеру)
|
||
|
||
---
|
||
|
||
## `[FE-CORE]` — Frontend: Сервисы и Ядро (Angular · `app/core/`)
|
||
|
||
- [ ] **FE-CORE-01** Реализовать `TauriIpcService`: типизированная обертка над `window.__TAURI__.invoke`
|
||
- [ ] **FE-CORE-02** Реализовать `TauriEventBusService`: RxJS-адаптер, слушающий события `vault-updated` и `system-locked`
|
||
- [ ] **FE-CORE-03** Реализовать `VaultService`: `BehaviorSubject<Account[]>` для хранения сессионного стейта
|
||
- [ ] **FE-CORE-04** В `VaultService`: реализовать метод `clear()` — сброс данных из памяти при блокировке
|
||
- [ ] **FE-CORE-05** Реализовать `CryptoStrategyService`: интерфейс `AuthStrategy` с двумя реализациями — `MasterPasswordStrategy` и `BiometricStrategy`
|
||
|
||
---
|
||
|
||
## `[FE-MODELS]` — Frontend: Модели данных (Angular · `app/models/`)
|
||
|
||
- [ ] **FE-MODELS-01** Определить интерфейс `AccountDTO` (raw данные от Rust)
|
||
- [ ] **FE-MODELS-02** Реализовать класс `Account` с геттерами, валидацией и методом `accept(visitor)` для паттерна Visitor
|
||
- [ ] **FE-MODELS-03** Реализовать класс `User` с полями профиля
|
||
- [ ] **FE-MODELS-04** Реализовать `CsvExportVisitor` — экспорт аккаунтов в CSV через паттерн Visitor
|
||
|
||
---
|
||
|
||
## `[FE-SHARED]` — Frontend: UI-кит (Angular · `app/shared/`)
|
||
|
||
- [ ] **FE-SHARED-01** Создать компонент `ButtonComponent` (primary / secondary / tertiary варианты из `DESIGN.md`)
|
||
- [ ] **FE-SHARED-02** Создать компонент `PasswordInputComponent`: поле ввода + иконка показать/скрыть
|
||
- [ ] **FE-SHARED-03** В `PasswordInputComponent`: добавить визуальный индикатор сложности пароля (weak / fair / strong)
|
||
- [ ] **FE-SHARED-04** Создать компонент `AccountCardComponent`: отображение одной записи (сервис, логин, кнопки действий)
|
||
- [ ] **FE-SHARED-05** Создать компонент `NotificationComponent`: toast-уведомления об ошибках и успехе
|
||
|
||
---
|
||
|
||
## `[FE-AUTH]` — Frontend: Экран Авторизации (Angular · `app/features/auth/`)
|
||
|
||
- [ ] **FE-AUTH-01** Создать экран ввода Мастер-пароля: форма с `PasswordInputComponent`, кнопка «Войти»
|
||
- [ ] **FE-AUTH-02** Подключить экран к `CryptoStrategyService` (`MasterPasswordStrategy`)
|
||
- [ ] **FE-AUTH-03** Создать экран Биометрии: кнопка «Войти по биометрии», fallback на Мастер-пароль
|
||
- [ ] **FE-AUTH-04** Подключить экран биометрии к `CryptoStrategyService` (`BiometricStrategy`)
|
||
- [ ] **FE-AUTH-05** Реализовать навигацию: успешная авторизация → главное окно; ошибка → сообщение об ошибке
|
||
|
||
---
|
||
|
||
## `[FE-MAIN]` — Frontend: Главное Окно (Angular · `app/features/main-window/`)
|
||
|
||
- [ ] **FE-MAIN-01** Создать layout главного окна: сайдбар + основной контент
|
||
- [ ] **FE-MAIN-02** Реализовать список аккаунтов, подписанный на `VaultService` (реактивное обновление)
|
||
- [ ] **FE-MAIN-03** Добавить строку поиска/фильтрации по названию сервиса
|
||
- [ ] **FE-MAIN-04** Добавить фильтрацию по тегам
|
||
- [ ] **FE-MAIN-05** Создать форму добавления записи: поля (сервис, логин, пароль, заметки, теги) + кнопка «Сгенерировать пароль»
|
||
- [ ] **FE-MAIN-06** Подключить форму добавления к IPC-команде `create_account`
|
||
- [ ] **FE-MAIN-07** Создать форму редактирования записи (переиспользует форму добавления, предзаполнена данными)
|
||
- [ ] **FE-MAIN-08** Подключить форму редактирования к IPC-команде `update_account`
|
||
- [ ] **FE-MAIN-09** Реализовать удаление записи с confirm-диалогом, использовать `delete_account`
|
||
- [ ] **FE-MAIN-10** Создать экран Настроек: поле «таймер автоблокировки» (минуты), параметры генератора паролей
|
||
|
||
---
|
||
|
||
## `[FE-SPOTLIGHT]` — Frontend: Окно Spotlight (Angular · `app/features/spotlight/`)
|
||
|
||
- [ ] **FE-SPOTLIGHT-01** Создать изолированный компонент Spotlight-окна (отдельный `BrowserWindow` в Tauri)
|
||
- [ ] **FE-SPOTLIGHT-02** Реализовать строку быстрого поиска по аккаунтам (live-filter из `VaultService`)
|
||
- [ ] **FE-SPOTLIGHT-03** Реализовать быстрое добавление аккаунта прямо из Spotlight-окна
|
||
- [ ] **FE-SPOTLIGHT-04** Реализовать закрытие Spotlight-окна при потере фокуса (blur event)
|
||
|
||
---
|
||
|
||
## `[SYSUX]` — Системные UX-функции (Rust + Angular)
|
||
|
||
- [ ] **SYSUX-01** Зарегистрировать глобальный шорткат (`Cmd/Ctrl+Shift+Space`) для открытия Spotlight (`main.rs`)
|
||
- [ ] **SYSUX-02** Реализовать таймер бездействия на стороне Rust: по истечении отправлять событие `system-locked`
|
||
- [ ] **SYSUX-03** Подписать Angular (`TauriEventBusService`) на событие `system-locked` → вызвать `VaultService.clear()` и перейти на экран авторизации
|
||
- [ ] **SYSUX-04** Реализовать обработку события блокировки ОС (Rust) → отправлять `system-locked`
|
||
|
||
---
|
||
|
||
## `[TEST]` — Тестирование
|
||
|
||
- [ ] **TEST-01** Unit-тесты криптографии (покрыты в тикетах CRYPTO-05, CRYPTO-06)
|
||
- [ ] **TEST-02** Unit-тесты генератора паролей (покрыт в PASSGEN-03)
|
||
- [ ] **TEST-03** Integration-тесты репозитория БД (покрыты в DB-08)
|
||
- [ ] **TEST-04** Integration-тесты IPC-команд auth (покрыты в AUTH-07)
|
||
- [ ] **TEST-05** Integration-тесты IPC-команд vault (покрыты в VAULT-05)
|
||
- [ ] **TEST-06** Unit-тесты Angular сервисов (`VaultService`, `TauriIpcService`, `CryptoStrategyService`)
|
||
- [ ] **TEST-07** E2E: создание нового сейфа и первый вход (Мастер-пароль)
|
||
- [ ] **TEST-08** E2E: добавление и поиск записи в главном окне
|
||
- [ ] **TEST-09** E2E: автоблокировка по таймеру — данные очищаются из памяти
|
||
- [ ] **TEST-10** E2E: открытие Spotlight по глобальному шорткату
|