v3.28.0 audit: the batch worker's connection check

The v3.26.0-v3.28.0 audit found the worker reading
getattr(server, 'connected', False) - an attribute the server object has
never had.  The connection state is the module global _CARD_CONNECTED
(set by __main__ / _apply_equipped_card / _handle_card_disconnect and
read by /api/status the same way), so the check was always False and a
batch never acted on an equipped card: it would wait forever.  The unit
test hid it - the fake server invented a `connected` attribute the real
object does not have.

- The worker reads _CARD_CONNECTED.  The fake server carries only
  attributes the real object has, the worker test patches
  _CARD_CONNECTED (verified to fail on the old line), and a source pin
  keeps the worker off server.connected.
- The write-only `thread` field of the batch state is gone (nothing read
  it).
- The outfile endpoint refuses a non-list `tars` with 400 instead of
  silently falling back to the role defaults.

915 frontend + 922 Python; sw cache simple-v438 (unchanged).
This commit is contained in:
2026-10-14 15:28:12 +03:00
parent e8190c65f7
commit 80a67fb493
3 changed files with 40 additions and 14 deletions
+5
View File
@@ -955,6 +955,11 @@ class PresetStoreHttpTests(unittest.TestCase):
status, resp = self._post('/api/presets/import-outfile', {
'text': text, 'tar_keyset': 99})
self.assertEqual(status, 400, resp)
# a non-list TAR table is the caller's error, never a silent fallback
status, resp = self._post('/api/presets/import-outfile', {
'text': text, 'tars': 'nope'})
self.assertEqual(status, 400, resp)
self.assertIn('tars', resp['error'])
# a misspelled algorithm or mode is refused, never silently defaulted
status, resp = self._post('/api/presets/import-outfile', {
'text': text, 'algorithm16': 'aes-256'})