From 28a940c9f5e3a6b0057571d3b2dba825bed4398a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D1=82=D0=BE=D0=BD=20=D0=A2=D1=80=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Tue, 6 Oct 2026 01:52:21 +0300 Subject: [PATCH] v3.22.1 (review follow-ups): the counter comment, the raw fallback, the RU label MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The three nits from the review of the rename/docs commits: - the PWA comment above TEST_ACTION_KINDS still claimed the final SCP80 counter is written back - the server persists every consumed counter into the preset and the snapshot carries the latest values (display only); - test-scripts.md's `por` paragraph regained the RM raw fallback the rewrite dropped: a remote-management reply that cannot be the compact structure (its command count exceeds the command script that was sent, or the data is too short for TS 102 226 5.1.2 Table 5.1) is raw too; - the RU help label reads "Очистка очереди проактивных команд" (the mixed Latin "proactive" is gone; the rest of the RU help says "проактивных команд"). sw cache simple-v405. Docs/comment only - tests unchanged and green: 839 frontend + 804 Python. --- docs/test-scripts.md | 5 ++++- frontend/help-ru.html | 4 ++-- frontend/index.html | 3 ++- frontend/sw.js | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/test-scripts.md b/docs/test-scripts.md index ce7e5b0..2056afa 100644 --- a/docs/test-scripts.md +++ b/docs/test-scripts.md @@ -411,7 +411,10 @@ the decoded response (scripting `AB`/`AF`/compact forms). An applet's **own TAR** answers with its application-defined bytes (the response form follows the command's TAR - see *The three status words*): its secured data is reported as `data` and no `sw` is decoded - assert such a response with -`data` (the action's `por` object follows the same rule). A PoR split over +`data` (the action's `por` object follows the same rule). The same raw +fallback covers a remote-management reply that cannot be the compact +structure - its command count exceeds the command script that was sent, or +the data is too short for Table 5.1 (TS 102 226 §5.1.2). A PoR split over several SMS parts is accumulated across SEND SHORT MESSAGE expectations: put the `por` check on the step that completes the sequence (intermediate steps should use `raw` or no PoR check). diff --git a/frontend/help-ru.html b/frontend/help-ru.html index 5c43c08..1ef8de0 100644 --- a/frontend/help-ru.html +++ b/frontend/help-ru.html @@ -564,12 +564,12 @@

Тест-скрипт — упорядоченный список действий и ожиданий проактивных команд, выполняемый на подключённой карте на стороне сервера. Пока запуск активен, карта принадлежит скрипту: остальные операции с картой отклоняются (HTTP 409), фоновый опрос STATUS приостанавливается; отчёт о запуске хранится в памяти (в том числе после перезагрузки страницы) до нажатия Очистить отчёт. Скрипты хранятся в хранилище на сервере (~/.pysim-simple-server/test_scripts.json, --test-scripts), поэтому все браузеры работают с одним набором; изменения записываются в хранилище по мере правки (кнопки «Сохранить» нет — черновик без валидного шага остаётся локальным); экспорт/импорт JSON остаётся для резервных копий и переноса скриптов между стендами (старый экспорт из localStorage импортируется как есть).

У вкладки четыре представления: список наборов (по умолчанию; Добавить набор / Редактировать / Запустить / Экспорт / Удалить), редактор набора (скрипты набора в порядке выполнения — необязательный setup первым и teardown последним, с пометками ролей; у каждого скрипта Запустить/Редактировать/Переместить/Скопировать/Удалить, политика при ошибке остановить (по умолчанию) / продолжить и Требуется ADM), редактор скрипта (список шагов; кнопка Старт выполняет только этот скрипт и показывает результат под шагами — он не сохраняется) и отчёт набора (после запуска набора: статус каждого скрипта, таблица шагов с ожидаемым/фактическим, примечание об ошибке и выдержка из журнала запуска; сводка с успешно/предупреждения/ошибки/пропущено, время выполнения, счётчики SCP80 до → после по каждому keyset, пресет и предупреждение о смене сессии карты; экспорт в JSON или Markdown). Запуск набора выполняет его скрипты по порядку в одной сессии карты, без сбросов и без продолжения с места остановки; при ошибке решает, остановится ли набор на этом скрипте или запустится следующий, teardown выполняется всегда при остановке или ошибке (пока карта в ридере), чтобы следующий тест начался с чистого состояния, а сброс карты останавливает набор и отмечается в отчёте. Требуется ADM (у набора или скрипта) проверяет ключ ADM из подобранного пресета один раз перед запуском — ошибка отклоняет запуск (проверьте вручную через значок ADM; автоматических повторов нет). Скрипты хранятся в хранилище наборов (~/.pysim-simple-server/test_suites.json, --test-suites); каждый скрипт принадлежит ровно одному набору, и скрипт можно переместить или скопировать в другой набор (экспорт набора — это пакет с набором и его скриптами; старый экспорт только скриптов импортируется в автоматически созданный набор «Imported scripts»).

-

Каждый шаг пишет семантическую строку в журнал сервера под своим номером (TEST-RUN step N: …), запрос перед ответом: отправленный APDU/данные и полученный SW, для SCP80 — открытый C-APDU, собранный защищённый пакет и R-APDU из PoR, для ожидания — тройка FETCH / команда / TERMINAL RESPONSE, очистка очереди proactive — каждый раунд STATUS/FETCH/команда/TR, а очистка в конце запуска — поглощённые команды (отвечаются ok — cancel отправляется только по явному запросу скрипта), а для выбора пункта меню — полный ENVELOPE с определённым пунктом. Запустите сервер с --apdu-trace, чтобы добавить и журнал сырых транспортных APDU.

+

Каждый шаг пишет семантическую строку в журнал сервера под своим номером (TEST-RUN step N: …), запрос перед ответом: отправленный APDU/данные и полученный SW, для SCP80 — открытый C-APDU, собранный защищённый пакет и R-APDU из PoR, для ожидания — тройка FETCH / команда / TERMINAL RESPONSE, очистка очереди проактивных команд — каждый раунд STATUS/FETCH/команда/TR, а очистка в конце запуска — поглощённые команды (отвечаются ok — cancel отправляется только по явному запросу скрипта), а для выбора пункта меню — полный ENVELOPE с определённым пунктом. Запустите сервер с --apdu-trace, чтобы добавить и журнал сырых транспортных APDU.

8.10 BIP-терминал (обычный TCP)

Пилюля BIP запускает терминальную сторону Bearer Independent Protocol для карт, использующих TCP без HTTP OTA (SCP81): апплет или пуш-триггер может открыть канал и обменяться сырыми данными. Одновременно работает только одна BIP-сессия — запуск здесь останавливает слушатель SCP81, а запуск слушателя SCP81 останавливает эту сессию (в обоих случаях сообщается, что было заменено).

diff --git a/frontend/index.html b/frontend/index.html index afc617a..c388bd3 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -6940,7 +6940,8 @@ function decodeResponse() { // run is active (other card endpoints answer 409) and reports the steps // through /api/test/status. This UI edits the script and monitors the run; // SCP80 steps use the card preset matched by the equipped card's ICCID, and -// the final SCP80 counter is written back to it. +// the server persists the counter each send consumed into that preset (the +// run snapshot carries the latest values; this UI only displays them). const TEST_ACTION_KINDS = ['envelope', 'event', 'menu-select', 'file-write', 'file-read', 'apdu', 'scp80', 'status', 'proactive-drain']; let _testScripts = null; // the script store cache (all suites) let _testSuites = null; // the suite store cache diff --git a/frontend/sw.js b/frontend/sw.js index e1aaf86..b546af7 100644 --- a/frontend/sw.js +++ b/frontend/sw.js @@ -1,4 +1,4 @@ -const CACHE = 'simple-v404'; +const CACHE = 'simple-v405'; const URLS = [ 'index.html', 'help.html',