diff --git a/docs/api.md b/docs/api.md index e91d628..9bc34ff 100644 --- a/docs/api.md +++ b/docs/api.md @@ -307,7 +307,9 @@ ignored. Without a `mode` the call is a **dry run**: the parsed presets and the report come back for the preview (nothing is stored). With `mode: "merge"` / `"replace"` the same parse runs and the presets are imported through the -store (`replace` wipes the store first, like `/api/presets/import`). +store (`replace` wipes the store first, like `/api/presets/import`); any other +`mode` value is refused with `400` — a typo must not silently turn an import +into a preview. ```json {"text": "…", "name": "Batch 0002", "algorithm16": "3des2", @@ -322,7 +324,9 @@ store (`replace` wipes the store first, like `/api/presets/import`). - `name` — one common name applied to every imported card; empty falls back to the card's ICCID. - `algorithm16` — the algorithm nibble for a **16-byte** key: `"3des2"` - (default, KIc/KID nibble `5`) or `"aes"` (nibble `2`). The key size alone + (default, KIc/KID nibble `5`) or `"aes"` (nibble `2`); any other value is + refused with `400` (a misspelled algorithm must never silently pick one — + the nibble decides whether the card accepts the packet). The key size alone decides the others: 8 bytes → DES (`1`), 24 bytes → 3DES3 (`9`); any other size skips that keyset with a report line. - `tars` — the TAR table every imported card gets (defaults to the three role diff --git a/frontend/index.html b/frontend/index.html index d93d63b..cc080d0 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -14731,8 +14731,14 @@ function cardsOutfileRender() { const o = _cardsOutfile; if (!panel || !o) return; const keysets = cardsOutfileKeysets(); - const selected = keysets.includes(o.tarKeyset) ? o.tarKeyset : (keysets[0] || null); - o.tarKeyset = selected; + // An empty or failed preview must not drop a chosen keyset: the value is + // only re-selected against a list that has keysets, and the option list is + // the preview's keysets plus a remembered value (so it stays visible). + if (keysets.length && !keysets.includes(o.tarKeyset)) o.tarKeyset = keysets[0]; + const options = keysets.slice(); + if (o.tarKeyset && !options.includes(o.tarKeyset)) options.push(o.tarKeyset); + options.sort((a, b) => a - b); + const selected = o.tarKeyset; let html = '
'; html += '' + esc(t('outfile import')) + ': ' + esc(o.file || '') + ''; @@ -14747,7 +14753,7 @@ function cardsOutfileRender() { ''; html += ''; html += '