DEV Community на русском
Подписаться
Зашифровано при хранении, если это невозможно, и сам файл указывает, как.
Функция автоответа Notifio записывает ответы пользователей для создания будущих автоматизированных ответов, сохраняя эти данные локально без загрузки куда-либо. Вся граница безопасности для этих конфиденциальных данных — это локальный файл на диске пользователя. safeStorage Electron обеспечивает шифрование, но его доступность не гарантируется во всех средах Linux, что требует плавного резервного механизма.Для управления этим каждый файл, записываемый Notifio, включает поле "enc" в своей структуре "Envelope", явно указывая, был ли он зашифрован или сохранен в виде обычного текста. Это предотвращает неоднозначность между зашифрованными и поврежденными данными, которые в противном случае оба выглядели бы как ошибки парсинга. Функция "writeEnvelope" использует safeStorage, когда это возможно, шифруя данные; в противном случае она сохраняет их как строку JSON в виде обычного текста.Эта конструкция сознательно принимает решение о приоритете доступности над конфиденциальностью в сценариях, где шифрование невозможно, например, на машине Linux без запущенного менеджера ключей. В таких случаях данные сохраняются в виде обычного текста в домашнем каталоге пользователя, обеспечивая работоспособность функции. Функция "readEnvelope" явно проверяет поле "enc", отказываясь угадывать формат файла и выдавая ошибку, если зашифрованные данные не могут быть расшифрованы.Сам "Envelope" имеет номер версии, отдельный от версии содержимого, признавая, что формат контейнера и структура содержимого изменяются независимо. Функция "canEncrypt" плавно обрабатывает потенциальную недоступность safeStorage, возвращая false вместо выдачи ошибок вне сред Electron. Этот подход гарантирует, что модули могут быть загружены и протестированы надежно без зависимостей от платформенных API.Критически важно, что путь чтения явно отказывается угадывать формат файла. Если файл утверждает, что он зашифрован, но safeStorage недоступен, выдается конкретная ошибка, предотвращающая попытки парсинга шифротекста как содержимого. Эта четкая отчетность об ошибках жизненно важна для поддержки и отладки, различая ошибки шифрования и общие повреждения.Хотя чтение поврежденного файла вернет резервный вариант, что потенциально может привести к перезаписи, этот риск снижается благодаря специфическому характеру данных (например, одиночное булево значение или записи, записываемые только при добавлении нового содержимого). Один и тот же формат оболочки используется как для файлов настроек, так и для файлов записей, что упрощает путь шифрования и отладку, если возникают проблемы с сохранением данных.Когда структуры данных развиваются, миграции могут удалять поля, к которым все еще необходимо получить доступ для устаревших целей. В таких случаях специальная функция "legacyMessage" обходит основную миграцию для получения старых данных, признавая, что удаление полей не обходится без затрат. Общее правило заключается в том, что файл должен явно указывать, как он был записан, что облегчает четкую обработку ошибок и позволяет проводить внешний анализ без необходимости выполнения конкретного кода.