Все планы по разработке будут зафиксированы в этом документе.
- Формат записей следует виду [rdpm000] где:
- [] литерал
- rdpm приставка, сокращённое имя проекта
- 000 номер записи
-
[rdpm000] Испечь печеньки. Требования: n/a Создана: [2024-03-21] Начата: [n/a] Завершена: [n/a]
-
[rdpm000] [ОШИБКА] Сломалась фича.
Описание:
- Шаг 1
- Шаг 2 Ожидается: Что-то. Фактически: То-то.
Причина:
Указать.
Исправление:
Описать.
Создана: [2024-03-21] Начата: [n/a] Завершена: [n/a]
-
Следущий: [rdpm030]
-
[rdpm016] Подстраивать заголовок окна под тему оформления. Требования:
- Заменить стандартный заголовок окна на кастомный.
- Заголовок должен быть стилизован согласно теме оформления.
- Гайд https://engy.us/blog/2020/01/01/implementing-a-custom-window-title-bar-in-wpf/ Создана: [2023-11-20] Начата: [n/a] Завершена: [n/a]
-
[rdpm017] Смена темы через аргументы командной строки. Требования:
- Добавить возможность передать программе при старте настройку темы оформления:
NZ.RdpMaid.App --theme PinkLoliСоздана: [2023-11-21] Начата: [n/a] Завершена: [n/a]
- Добавить возможность передать программе при старте настройку темы оформления:
-
[rdpm028] Добавить логи.
Требования:
- Интересующие события от приложения фиксируются в лог.
- Лог пишется в файл в домашней директории в подпапку "logs".
- Имя файла соответствует номеру дня месяца "01.log", "02.log" ... "31.log" таким образом оставляя возможность поднять старые логи, но и обеспечивая ротацию не захламлять папку большим объемом данных
- По умолчанию уровень вывода "WARNING"
- Пользователь может переопределить его в настройках без перезапуска
- Лог должен писать события в буфер в памяти, периодически скидывая их на диск
- Завершение работы должно форсировать процесс очистки буфера и записи на диск
- Факт записи логов на диск не следует записывать в логи (1)
- В лог фиксировать следующие события
- Запуск
- Начало запуска приложения
- Завершение инициализации приложения
- Завершение загрузки главного окна
- Закрытие
- Начало закрытия приложения
- Начало освобождения мютекса
- Окончание освобождения мютекса
- Начало освобождения именованного канала
- Окончание освобождения именованного канала
- Окончание закрытия приложения
- Фоновая работа
- Переход в фоновый режим
- Активация из фонового режима
- Активация из фонового режима через именованный канал
- Ввод/вывод
- Начало чтения данных на диск
- Окончание чтения данных на диск
- Начало записи данных на диск (1)
- Окончание записи данных на диск (1)
- Начало чтения данных в сеть
- Окончание чтения данных в сеть
- Ошибки
- Ошибка запуска: неверная конфигурация
- Ошибка запуска: процесс уже запущен
- Неожиданная ошибка
- Запуск
Примечания:
-
Поступила жалоба пользователя на необычно долгое закрытие программы в конце рабочего дня.
-
Логирование этапов процесса завершения работы позволит определить причины задержки операции.
-
Прочие логи добавлены на всякий случай, авось пригодятся.
Создана: [2024-03-21] Начата: [n/a] Завершена: [n/a]
-
[rdpm029] [ОПТИМИЗАЦИЯ] Работа в фоновом режиме.
Требования:
- Определять уход окна программы в фон.
- Останавливать генерацию OTP.
- Останавливать иные процессы если таковые имеются.
- Определять активацию окна.
- Запускать генерацию OTP.
- Запускать иные процессы если таковые требуются.
Примечания:
-
Поступила жалоба пользователя на необычно долгое закрытие программы в конце рабочего дня.
-
Есть подозрение, что в течение дня программа занимает ресурсы, которые при завершении приходится массово освобождать.
-
Следует максимально снизить деятельность программы в фоновом режиме, поидее можно остановить генерацию OTP, может выгрузить из памяти какие-нибудь объекты.
Создана: [2024-03-21] Начата: [n/a] Завершена: [n/a]
-
[rdpm027] Обновление III - Распаковка и Установка. Требования:
- После завершения скачивания, не открывать каталог с дистрибутивом
- На экране статуса обновления, если есть новое обновление в загрузках, и его версия выше версии приложения, программа предлагает установить его, отображая кнопку "установить"
- После того как пользователь нажимает кнопку, начинается установка
- Сначала дистрибутив распаковывается во временный каталог
- После этого запускается специально приложение NZ.RdpMaid.Updater
- NZ.RdpMaid.Updater посылает основному приложению сигнал на выключение И ждёт пока оно не выключится
- Основное приложение принимает сигнал и выключается
- NZ.RdpMaid.Updater дождавшись выключения основного приложения, делает резервную копию файлов основного приложения, потом резервную копию настроек приложения, потом заменяет файлы приложения файлами из временного каталога
- NZ.RdpMaid.Updater запускает основное приложение и выключается
- NZ.RdpMaid.Updater должен иметь графический интерфейс:
- текстовый статус
- полоска прогресса
- Скрипт публикации должен включать программу обновления в установочный пакет Создана: [2024-02-15] Начата: [2024-02-17] Завершена: [2024-02-27]
-
[rdpm026] Обновление II - Скачка. Требования:
- На экране статуса обновления, если нашлось новое обновление, программа сообщает об этом пользователю и предлагает скачать его, отображая кнопку "скачать"
- После того как пользователь нажимает кнопку, начинается скачивание
- Во время скачивания экран отображает прогресс
- Скачивание происходит асинхронно
- Экран можно закрыть и продолжить пользоваться программой
- После завершения скачивания, открывать каталог с дистрибутивом, для ручной установки Создана: [2024-02-15] Начата: [2024-02-16] Завершена: [2024-02-17]
-
[rdpm025] Обновление I - Проверка. Требования:
- Добавлена кнопка, запускающая процесс проверки обновления.
- Добавлено окно, отображающее статус проверки.
- Проверка обновления происходит через страницу релизов github.
- При наличии обновления, ссылка на скачивание должна быть кликабельной.
- По нажатии на ссылку, открывается браузер со страницей релиза. Создана: [2024-02-15] Начата: [2024-02-15] Завершена: [2024-02-16]
-
[rdpm024] Запуск в единственном экземпляре. Требования:
- При запуске приложения проверять, а не запущен ли уже другой экземпляр этого приложения
- Если запущен, то отменить запуск второго экземпляра, а окно первого экземпляра сделать активным Создана: [2024-02-14] Начата: [2024-02-14] Завершена: [2024-02-14]
-
[rdpm023] Тема оформления "Неко Арк" Требования:
- Персонаж: "Неко Арк"
- Главный цвет: желтый
- Тона: серые ближе к светлому Создана: [2024-02-13] Начата: [2024-02-13] Завершена: [2024-02-13]
-
[rdpm022] Очищать пароль из буфера обмена через 10 секунд Требования:
- После того как пароль скопирован в буфер обмена запускать таймер на 10 сек
- По прошествии таймера заменять содержимое буфера пустой строкой
- Если пока таймер работает пароль был отправлен в бефер еще раз, то откладывать таймер на еще 10 сек
- Если на момент срабатывания таймера содержимое буфера отличается от пароля, то не трогать содержимое буфера Создана: [2024-02-13] Начата: [2024-02-13] Завершена: [2024-02-13]
-
[rdpm021] Подготовка у публикации на github. Требования:
- Удалены небезопасные форматы хранилища.
- Удалены все ссылки на внутреннюю инфраструктуру.
- Код-ревью.
- Пересоздан репозиторий. Создана: [2024-01-14] Начата: [2024-01-14] Завершена: [2024-01-14]
-
[rdpm020] Сделать кнопку для открытия каталога настроек в проводнике. Требования:
- Навигация в венде к appdata / roaming / blahblahblah слишком геморная, потому нужна кнопка, которая сразу откроет этот каталог. Создана: [2024-01-14] Начата: [2024-01-14] Завершена: [2024-01-14]
-
[rdpm019] Предоставить возможность отредактировать шаблон RDP-файла. Требования:
- Шаблон RDP-файла лежит в каталоге установки программы.
- Шаблон можно отредактировать вручную, чтобы повлиять на настройки RDP.
- Бонус:
- При обновлении программы, файл-шаблона перетрётся и пользователь потеряет свои изменения, это печально. Потому стоит также проверять на наличие кастомного шаблона в пользовательском каталоге, и порекомендовать пользователям переопределять настройки скопировав файл туда из каталога установки. Создана: [2024-01-14] Начата: [2024-01-14] Завершена: [2024-01-14]
-
[rdpm018] [ОШИБКА] Не сохраняется секретный ключ генератора пин-кодов.
Описание:
- Нажать кнопку [Исток]
- В диалоге задать новый секретный код
- Нажать кнопку [Сохранить] Ожидается: Секретный код поменялся - пин-коды генерятся от нового источника. Фактически: Секретный код остался как есть, пин-коды генерятся от старого источника.
Причина:
При рефакторинге
PublishEventCommandбыла заменена наPublishNotificationCommand. Место использования - диалог сохранения секретного кода TOTP, кнопка [Сохранить], не было обновлено.Исправление:
Заменить
PublishEventCommandнаPublishNotificationCommand.Рекоменации:
- Дополнительно пройтись всем файлам и поискать идентификатор
PublishEventCommand. - Попробовать сделать
RuntimeContextзаранее известным ресурсом, и обращаться к нему черезStaticResourceа неBinding, тогда данные ошибки будут отлавливаться на этапе компиляцииXAML. - Альтернативно попробовать сделать так, чтобы ошибка в
Bindingприводила к аварийному завершению программы.
Появилась в версии: [0.6.2] Коммит: [a1373acf046f1faf2b0e3625b4f6f40b1aa23dfc] Создана: [2023-11-21] Начата: [2023-11-21] Завершена: [2023-11-21]
-
[rdpm015] Безопасное хранилище. Требования:
- в файле настроек добавлена опция "использовать безопасное хранилище"
- при старте программа генерирует [секретный ключ] и кладёт его пользовательский каталог
- сохранение данных
- сериализуем данные в json
- читаем [секретный ключ]
- инициализируем AES алгоритм
- генерируем случайный IV
- шифруем сериализованные данные с помошью IV и [секретного ключа]
- сохраняем данные в формате хранилища в пользовательский каталог
- загрузка данных
- загружаем данные в формате хранилища в пользовательский каталог
- проверяем метку формата
- проверяем IV
- читаем IV
- проверяем метку данных
- читаем данные
- читаем [секретный ключ]
- инициализируем AES алгоритм
- инициализируем прочитанный IV
- расшифруем данные с помошью IV и [секретного ключа]
- десериализуем расшифрованные данные из json
- формат файл хранилища
- метка формата 4 байта
- метка IV 1 байт
- длинна IV 4 байта
- тело IV X байт
- метка зашифрованных данных 1 байт
- длинна зашифрованных данных 4 байта
- тело зашифрованных данных X байт
- если опция "использовать безопасное хранилище" включена
- то хранение "какого-то текста" и "источника пин-кодов" переносится в безопасное хранилище
- иначе работает по старой схеме Создана: [2023-11-19] Начата: [2023-11-19] Завершена: [2023-11-19]
-
[rdpm014] Переключатель тем оформления. Требования:
- интерфейс
- добавить выпадающий список с темами оформления
- при выборе значения применять тему оформления без перезапуска программы
- запоминать выбранную тему
- загружать запомненную тему при старте программы Создана: [2023-11-18] Начата: [2023-11-19] Завершена: [2023-11-20]
- интерфейс
-
[rdpm013] Темы оформления. Требования:
- опция в файле настроек переключающая тему оформления
- сделать параметры стилизации интерфейса
- сделать настраивать параметры через файл стилей
- сделать два файла стилей "Розовая лоли" и "Хозяйка ночи"
- при старте брать тему из настроек и грузить соответствующий файл стилей Создана: [2023-11-18] Начата: [2023-11-18] Завершена: [2023-11-18]
-
[rdpm012] Подключить автогенерацию временных кодов. Требования:
- опция в файле настроек включающая генерацию, по умолчанию (вкл)
- интерфейс (при включённой настройке)
- табло с обратным отсчетом времени жизни кода
- полоска жизни кода
- актуальный код сам подставляется в поле ввода
- кнопка вызова диалога установки источника кодов
- диалог установки источника кодов
- импорт из формата Google Authenticator
- адаптировать Ромину реализацию генератора кодов
- библиотека Otp.NET
- генератор
- таймер
- обновление интерфейса по таймеру
- безопасное хранение и доступ к источнику кодов Создана: [2023-11-18] Начата: [2023-11-18] Завершена: [2023-11-18]
-
[rdpm011] [ОШИБКА] Не работает копирование "текста" в буфер обмена.
Описание:
Сценарий 1 "Псс!"
- Нажать "Тсс!"
- Ввести текст "123"
- Нажать "Сохранить"
- Нажать "Псс!"
- Вставить содержимое буфера обмена в блокнот Ожидается: Из буфера обмена скопировался текст "123". Фактически: Из буфера обмена скопировалась пустота.
Сценарий 2 "Погнали вжобывать!"
- Нажать "Тсс!"
- Ввести текст "123"
- Нажать "Сохранить"
- Нажать "Погнали вжобывать!"
- Вставить содержимое буфера обмена в блокнот Ожидается: Из буфера обмена скопировался текст "123". Фактически: Из буфера обмена скопировалась пустота.
Причина:
Ошибка появилась в ветке [rdpm007] коммите [085df01ded7678b2abc78989430d54c4e71d2c24]. При проверке файла с текстом на существование путь не был отрезолвлен.
Исправление:
Добавлена резолюция пути к файлу с текстом.
Создана: [2023-04-05] Начата: [2023-04-05] Завершена: [2023-04-05]
-
[rdpm010] Сделать скрипт создания портабельного пакета с ПО. Требования:
- сборка всех файлов в zip-архив
- добавление файлов README.md, и CHANGELOG.md
- добавление файла ИНСТРУКЦИЯ.txt
- исключение файла appsettings.json Создана: [2023-04-03] Начата: [2023-04-05] Завершена: [2023-04-05]
-
[rdpm009] Подготовка к дистрибуции. Требования:
- убрать захардкоженные значения Login/Address из исходников appsettings.json
- переименовать appsettings.json в appsettings.example.json
- добавить файл ИНСТРУКЦИЯ.txt
- в ИНСТРУКЦИЯ.txt вписать шаг копирования appsettings.example.json в appsettings.json Создана: [2023-04-12] Начата: [2023-04-12] Завершена: [2023-04-12]
-
[rdpm008] [ОШИБКА] После старта программы фокус на поле ввода пин-кода не ставится.
Описание:
- Запустить программу
- Начать вводить пинкод Ожидается: Фокус ввода на поле "пин-код", пин-код вводится успешно. Фактически: Фокус ввода пёс знает где, пин-код не вводится.
Если нажать или <ЛКМ> на поле "пин-код", то пин-код вводится, из этого следует, что проблема именно в первоначальной установке фокуса.
Возможно она возникло в рамках [rdpm006] когда менялась разметка главного окна.
Не воспроизводится на коммите [a3a9a0056df624281038f6a14c5612a9e59e1a18] ( master до мёржа [rdpm006] ). Воспроизводится на коммите [0e4f8a62b8abde68ce051d15171a5cc5bd459db0] ( master после мёржа [rdpm006] ).
Следовательно ошибка была привнесена в рамках [rdpm006] когда менялась разметка главного окна.
Причина:
Изменения в разметке, которые прячут поле-ввода вместе с главным контентом на старте приложения не дают фокус-менеджеру зафокусировать поле ввода пин-кода.
Исправление:
- Добавлен триггер на состояние видимости основного контента, который устанавливает фокус-менеджер на фокусировку на поле-ввода пин-кода.
- Убран более не нужный код в главном окне, инициализирующий фокус-менеджер, т.к. его теперь заместил код в вышеупомянутом триггере.
Создана: [2023-04-12] Начата: [2023-04-12] Завершена: [2023-04-12]
-
[rdpm007] Опционально: RDP-файл в AppData Требования:
- Добавить опцию в настройки: запись RDP-файла в AppData
- Значения: true | false
- По умолчанию: false
- Если true: при попытке записать в RDP-файл
- Создавать (если нет) каталог C:\users\username\AppData\RdpMaid
- Писать RDP-файл туда
- При запуске RDP читать файл оттуда
- Аналогично при работе ПСС/ТСС
- Обеспечить обратную совместимость:
- appsettings.json от старой версии программы должен фолбечить на false Создана: [2023-04-12] Начата: [2023-04-12] Завершена: [2023-04-12]
- Добавить опцию в настройки: запись RDP-файла в AppData
-
[rdpm006] Проверка на запись RDP-файла. Требования:
- При запуске проверить, есть ли доступ на запись в RDP-файл.
- Если есть - то всё ок, ничего не делаем.
- Если нет - ругаемся и просим юзера решить проблему.
- Предложить варианты решения
- Дать права на запись в RDP-файл или каталог программы.
- Предложить скопировать программу в пользовательский каталог. Создана: [2023-04-12] Начата: [2023-04-12] Завершена: [2023-04-12]
- Предложить варианты решения
-
[rdpm005] При фокусе на поле ввода и нажатии на переключаться на кнопку
-
[rdpm004] При активации окна автофокус на поле ввода пин-кода
-
[rdpm003] При запуске сессии копировать пароль в буфер обмена, чтобы потом руками не вводить
-
[rdpm002] При нажатии / запускать сессию, чтобы кнопку не жамкать
-
[rdpm001] Запилить иконку