v3.31.2: the SCP81 TLS-PSK Python floor, documented and guarded
release / release (push) Has been cancelled

ssl's TLS-PSK callbacks (PskTlsServer) exist only since Python 3.13 - the
first CI run on 3.12 errored in all 20 PSK tests, and the docs confirm
"Added in version 3.13".

- PskTlsServer._make_context raises a clear RuntimeError naming the
  requirement instead of AttributeError; a source pin keeps the guard.
- tests/test_scp81.py skips PskTlsServerTest where the callbacks are
  missing (it runs on 3.13+), so contributors on 3.9-3.12 no longer see
  20 failures.
- The READMEs state the requirement, and the Windows notes now strongly
  recommend Python 3.13: pyscard has wheels up to 3.13, and on 3.14
  pyscard and some pysim dependency wheels are unavailable and build
  from source (MSVC).  setup.bat and setup.sh print the same guidance.
- Version strings + the PWA cache bumped together (simple-v457).

998 Python + 953 frontend green.
This commit is contained in:
2026-10-20 23:47:10 +03:00
parent bccca45486
commit 2237a35db5
10 changed files with 43 additions and 13 deletions
+13
View File
@@ -5,6 +5,7 @@ terminal's Data available notification (TS 102 223 7.5.10).
Synthetic PSK only; no live card data.
"""
import inspect
import socket
import ssl
import sys
@@ -80,6 +81,18 @@ class HttpParseTest(unittest.TestCase):
self.assertTrue(body.startswith(b'64\r\n'))
class PskGuardTest(unittest.TestCase):
"""On Python < 3.13 the listener must explain the requirement, not raise
AttributeError (the PSK tests themselves are skipped there)."""
def test_the_context_names_the_python_requirement(self):
src = inspect.getsource(scp81.PskTlsServer._make_context)
self.assertIn("hasattr(ctx, 'set_psk_server_callback')", src)
self.assertIn('Python 3.13+', src)
@unittest.skipUnless(hasattr(ssl.SSLContext, 'set_psk_server_callback'),
'TLS-PSK requires Python 3.13+')
class PskTlsServerTest(unittest.TestCase):
def _client_ctx(self, identity=IDENT, psk=PSK):
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)