EasyUniversal / DocsДокументация · SDK 0.3Подписка Universal ↗
Easy Universal / Справочник SDK

Cloud scripts: скачивание и подписи

AngelScript · native runtime · локальная сборка

Cloud scripts: загрузка и проверка скриптов

Сайт: https://easyinstall.help/easy-universal/cloud-scripts.
Кнопка Cloud scripts открывает каталог с одним актуальным выпуском каждого скрипта.
Refresh получает подписанный онлайн-каталог; Cached читает действующий кэш и
не позволяет скачивать офлайн. Download latest заново получает каталог и
автоматически выбирает актуальную числовую версию, а не версию старого списка.
Ранее скачанные ID сохраняются, общий каталог обновляется до текущих выпусков.
Зависимости остаются точными и подписанными; конфликт версий не меняет active.
Open installed открывает проверенный снимок в каталоге клиента; после этого
отдельно просмотрите Details/Source и разрешения перед Load script.
Local scripts возвращает исходный локальный каталог. Архивные версии и Rollback
в пользовательском меню отсутствуют. Скачивание недоступно во время сессии.
На сайте ZIP включает исходники и точные зависимости; распакуйте папки пакетов
в scripts. ZIP не запускает код. Launcher получает только актуальную серверную
поставку приложения отдельно от каталога скриптов.

Транспорт: https://easyinstall.help/easy-universal/cloud-scripts/fee….
Ниже описаны формат подписей и низкоуровневые инструменты разработчика;
исторические точные установки/rollback в CLI не являются меню Launcher.

Сеть, проверка файлов и установка выполняются в фоновом потоке. Cancel/закрытие
отменяет операцию между этапами; сетевой вызов имеет ограниченный таймаут.
Если замена active.json уже завершена, отмена не обращает commit задним числом.
Пакеты установленного снимка доступны в редакторе только для чтения: Save,
Save + Reload, Add и Remove отключены. Для изменений создайте отдельную локальную
копию. Перед Refresh и запуском проверяется активный снимок и его файлы;
смена снимка другим процессом требует повторного Open installed.

Нативный клиент использует WinHTTP и Windows CNG с встроенным открытым ключом,
PowerShell ему не нужен. Данные GUI находятся в
%LOCALAPPDATA%/EasyUniversal/repositories/official. Developer CLI по умолчанию
использует отдельный repositories/official рядом с комплектом; параметром Root
можно явно указать другое расположение. Для обоих действует repository.lock.

pwsh -NoProfile -File scripts/repository.ps1 -Action list
pwsh -NoProfile -File scripts/repository.ps1 -Action list -Offline
# После публикации выбранного пакета и проверки его автора/исходников:
pwsh -NoProfile -File scripts/repository.ps1 -Action install -Id chosen-id -Version 1.0.0
pwsh -NoProfile -File scripts/repository.ps1 -Action current
pwsh -NoProfile -File scripts/repository.ps1 -Action rollback

chosen-id — условный пример, не доступный пакет. Установка возвращает catalog:
путь к проверенному снимку. Его можно явно открыть через
bin/EasyUniversal.exe client <catalog>. Запуск скрипта и согласия на PID,
хранение, ввод, HTTP и запись остаются отдельными действиями пользователя.
Зависимости устанавливаются как отдельные полные пакеты в том же снимке.
Это не новая система import/include AngelScript и не объединение разрешений.

Доверие и формат

Индекс — envelope с Base64 payload и signature. Подписываются точные UTF-8
bytes payload, RSA-3072 / PKCS#1 v1.5 / SHA-256. Публичный ключ поставляется в
sdk/repository-key.pem; SHA-256 SPKI DER:
5a16f0ffcc8c62672d20de680655c04b3cb0a25b22528e858df77155b1e3c7d6.
Корневой приватный ключ остаётся у оператора. Корневое доверие не берётся
из сетевого ответа. Смена закреплённого корня требует обновления клиента;
делегированные ключи издателей и авторов ротируются подписанной политикой ниже.

Payload: format=2 (format=1 — legacy), repository=easy-official, возрастающий serial,
issued_at/expires_at в Unix seconds, packages. Срок индекса не превышает 31 день.
Пакет задаёт id, точную числовую version major.minor.patch, author, files
(path, size, sha256) и dependencies (id, version). Индекс не хранит
произвольные URL: файлы получают по blobs/<sha256> на фиксированном HTTPS
источнике; редиректы и сетевые credentials не используются.

Подпись подтверждает публикацию этого набора файлов репозиторием Easy.
В format 2 каждая запись содержит отдельную author_signature: RSA-3072
подписывает точные id/version/author/files/dependencies с purpose easy-package-v1.
Ключ автора зарегистрирован корневой политикой и связан с author; это
криптографическая связь с зарегистрированным ключом, не проверка личности человека. Подпись и native inspect не доказывают безопасность скрипта.
Индекс/установка не компилируют и не исполняют скрипты. Native inspect проверяет
manifest, SDK permissions, пути, файлы и лимиты без AngelScript engine.

Установка, отказ и откат

Один процесс владеет repository.lock. Все точные зависимости разрешаются до
загрузки; циклы, отсутствующая версия и конфликт версий запрещены. Проверенные
файлы пишутся в новый уникальный снимок, затем native inspect сверяет manifest
и полный объявленный набор файлов. Только после этого один атомарно заменяемый
active.json активирует целый снимок. Текущий клиент, открытый на прежнем пути,
продолжает использовать прежний снимок: обновление не делает горячий Reload.

Текущий/предыдущий снимки сохраняются. Rollback проверяет подпись архивного
индекса и каждый файл, затем меняет указатель; локальные правки и лишние файлы
блокируют откат. Изменённый активный снимок также блокирует новую установку.
Редактируйте копию пакета в обычном локальном каталоге, чтобы не потерять
проверяемую исходную версию.

Прерывание до замены указателя оставляет старую активную установку и, возможно,
неактивную папку staging. Никакой автоматической рекурсивной очистки нет.
Это проверено симуляцией завершённого staging без commit; реальные power-loss
и чистая Windows остаются отдельной QA. Не более 64 папок снимков, 32 пакетов
в dependency closure и 4 MiB на установку; snapshot limit требует сохранения
и ручного архивирования ненужных папок.

Сетевой отказ не вызывает скрытый переход на кэш. list -Offline явно читает
подписанный ещё действующий индекс; offline install запрещён. Current/rollback
работают без сети с ранее установленными, полностью проверенными файлами;
истечение индекса не удаляет их. Новый индекс не может понизить сохранённый
serial или изменить содержимое при прежнем serial. Это защита в пределах
сохранённого локального состояния; удаление этого состояния владельцем ПК
снимает такую историю.

Официальный индекс и политику ключей продлевает оператор до expires_at.
В поставке 1.0.0 публикация из аккаунта доступна на сайте: «Мои Cloud scripts».
Нужна действующая подписка Universal; author в manifest совпадает с аккаунтом.
Отправляются объявленные UTF-8 файлы, до 512 KiB, и точные зависимости.
Версия заявки неизменяема. Администратор просматривает файлы и одобряет либо
отклоняет её. Отдельная серверная задача подписывает одобренные записи ключом,
привязанным к аккаунту, и обновляет публичный индекс. Ошибка оставляет прежний
индекс доступным; статус заявки показывает необходимость повторной проверки.
Задача запускается каждые пять минут; policy/index продлеваются, когда остаётся
менее семи дней. Закрытые ключи недоступны web-службе. При публикации и установке
код не исполняется. Подпись не является гарантией безопасности скрипта.

Доверие и жизненный цикл ключей

Корневой RSA-3072 ключ закреплён в клиенте. Он подписывает policy format 1:
serial, issued_at/expires_at и не более 64 ключей. Каждый ключ содержит
id (SHA-256 SPKI DER), kind publisher/author, name, state active/revoked и
public PEM. Envelope format 2 содержит payload/signature, key_id издателя
и корневой подписанный trust. Издатель и автор используют отдельные ключи.
Повторный fingerprint, неверная роль, подпись, размер RSA или author запрещены.

Refresh атомарно сохраняет новый подписанный индекс. Serial политики нельзя
понизить или изменить при прежнем serial. Ротация добавляет новый ключ;
старый остаётся active на переходный период, затем оператор отзывает его.
Отозванный ключ запрещает новые установки и current/rollback архивных снимков
после получения политики. Проверка консервативна: она проверяет весь архивный
индекс снимка, поэтому отзыв ключа любой его записи может блокировать снимок.
Новый исправный пакет можно установить взамен отозванного снимка; изменённые
файлы прежнего снимка по-прежнему блокируют замену.

Current/rollback работают без сети, но новая политика должна оставаться
действующей. По окончании срока нужен Refresh. Клиент без сети не узнает
новый отзыв; запущенная сессия не прерывается от изменения политики.
Перед следующим запуском клиент повторяет current и проверяет снимок.
Удаление локального состояния снимает историю serial. Компрометация
закреплённого корня требует отдельного обновления клиента; делегированные
ключи не могут заменить этот корень.

Старый format 1 отображается как legacy publisher-only, без авторского
доверия. После получения format 2 возврат к legacy запрещён, включая rollback.
Native GUI показывает fingerprint проверенного авторского ключа при выборе версии.
Установка не запускает код и не выдаёт permissions.

Инструмент автора: scripts/sign-package.ps1 -Package <folder> -PrivateKey
<local RSA-3072 PEM> -Output <new review folder>. Native inspect не исполняет
скрипт; выход содержит package-record.json и blobs. Ключ в выход не попадает.
Инструмент подписывает самостоятельный пакет с пустыми dependencies.
Для зависимостей автор должен подписать полный проверенный record в том же
purpose-контракте. Оператор принимает только проверенные записи/bytes.

На VDS manage_universal_repository_keys.js поддерживает init, rotate
publisher|author <name>, revoke <key-id>, renew. Это подготовка политики:
затем sign_universal_repository.js публикует индекс и вложенную политику.
Отзыв авторского ключа требует убрать/переподписать соответствующие записи;
издатель не может подделать авторскую подпись. Частные ключи остаются вне web
service. Продление политики также требует публикации нового индекса.

Проверки: tests/repository_trust.ps1 сравнивает native и developer CLI:
подмена metadata, rotation, revoke, отказ установленному/предыдущему снимку,
восстановление новой установкой, downgrade/equivocation и expiry.

Easy Universal — отдельный проект. Easy External не изменён.