Безопасность установки

Что проверяется перед заменой приложения и чего DuoUpdater намеренно никогда не делает

← Вся документация

Возможность выполнять установку самостоятельно и делает эти проверки возможными. Каждая из них — это то, что может пойти не так, когда одна программа заменяет на вашем Mac другую.

Он никогда не завершает работающее приложение принудительно

Установщик никогда ничего не закрывает. Перезапуск обновлённого приложения — отдельный шаг, включённый по умолчанию и отключаемый в «Настройках»; а когда он выполняется, закрытие — это обычная команда terminate(). Приложение само показывает свои запросы на сохранение и может отказаться закрыться. То, что отказалось, остаётся работать и сохраняет кнопку «Перезапустить», так что несохранённая работа никогда не оказывается под угрозой из-за принудительного закрытия.

Стоит знать: перезапуск происходит после того, как новая версия уже оказалась на диске. Поэтому если вы отклонили закрытие, рядом с обновлённым bundle остаётся работать процесс со старым кодом — пока вы сами не перезапустите приложение. Именно это и означает кнопка «Перезапустить» в строке.

Пять проверок перед любой заменой

EdDSA — там, где само приложение публикует открытый ключ. Некоторые поставщики публикуют неподписанную ленту; таким не отказывают сразу — им просто нужно самостоятельно пройти оставшиеся проверки. Приложение, которое действительно публикует ключ, обязано выдать действительную подпись — с одним намеренным исключением, о котором ниже.

Затем, независимо от источника, — четыре проверки загруженного bundle:

  • Подпись Developer ID, проверяемая строго и до конца — для каждой архитектуры, включая вложенный код, а не только внешний bundle.
  • Team ID, который должен совпадать с Team ID заменяемого приложения.
  • Bundle identifier, взятый из самой подписи, а не из Info.plist, поэтому переписанный plist не может обмануть эту проверку.
  • Запускаемая архитектура, считанная из настоящих срезов Mach-O. Сборка, которую этот Mac не может запустить, отклоняется, а не устанавливается в нерабочем виде.

Загрузка, которая указывает на другого разработчика, отклоняется, а не устанавливается.

Исключение: когда поставщик меняет ключ подписи, не выпустив переходную сборку, старый ключ перестаёт годиться для проверки чего-либо нового от него. Вместо того чтобы навсегда оставить приложение без обновлений, недействительная подпись EdDSA не отклоняет установку сразу, а удерживается, и установка всё же может продолжиться, если пройдены остальные четыре проверки и загруженный bundle несёт новый ключ, которым проверяется лента. В этом случае доверие обеспечивают именно проверки Developer ID и Team ID.

Переход на новую основную версию требует подтверждения

Переход на новую основную версию скрыт за предупреждением, а не за кнопкой в один клик, потому что для коммерческого приложения он может потребовать новую лицензию. Решаете вы; DuoUpdater не решает это за вас, делая это слишком простым.

Всё перепроверяется непосредственно перед установкой

Список, который был открыт целый час, — уже устаревшие данные. Перед заменой проверка выполняется заново, поэтому избыточная установка никогда не запускается для приложения, которое тем временем уже обновил кто-то другой.

Резервные копии для отката

Заменяемый bundle сохраняется, и его можно вернуть на место. duo backups выводит список точек отката из командной строки; приложение показывает то же самое.

Обнаружение необходимости перезапуска

Если приложение обновлено на диске, но всё ещё работает со старой сборкой — это сравнивается через LaunchServices, а не угадывается, — оно отображается с действием «Перезапустить», а не отмечается как актуальное. Версия на диске и версия, которая выполняется, — это два разных факта, и строка показывает, какой из них устарел.