diff --git a/.github/release-notes.md b/.github/release-notes.md index 99b1a9e..a879a66 100644 --- a/.github/release-notes.md +++ b/.github/release-notes.md @@ -18,3 +18,5 @@ is the runtime tree only (packages, PWA, launchers, docs — no tests, no git): extract it anywhere and run `start.bat` (Windows) or `./start.sh` (Linux/macOS). Python 3 has to be on `PATH`; `pip install pyusb` is only needed for direct SIMtrace2 capture. + +The project is MIT-licensed (see `LICENSE`). diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..80d8465 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Anton Troshin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/MANIFEST.in b/MANIFEST.in index 03102c2..12cb0bf 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,4 @@ graft frontend +include LICENSE include README.md README_RUS.md 70-simtrace2-pysniff.rules include start.sh start.bat sniff-start.sh sniff-start.bat diff --git a/README.md b/README.md index 9f3225f..2ce6ef8 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ Everything is on the **Wheel** (the PWA is inside the package): ```sh -pip install ./simtrace_analyser-2.7.12-py3-none-any.whl +pip install ./simtrace_analyser-2.7.13-py3-none-any.whl # then run (the UI is served at http://127.0.0.1:8081/): simtrace-analyser-server --capture gsmtap @@ -119,7 +119,7 @@ Fedora), install into a virtual environment first: shown there): ```sh -pip install https://github.com/anttro/simtrace-analyser/releases/download/v2.7.12/simtrace_analyser-2.7.12-py3-none-any.whl +pip install https://github.com/anttro/simtrace-analyser/releases/download/v2.7.13/simtrace_analyser-2.7.13-py3-none-any.whl ``` With the GitHub CLI, download the latest wheel without knowing the version: @@ -133,7 +133,7 @@ pip install ./simtrace_analyser-*.whl without the git history: unzip, `cd` into it and use the launchers below (`./start.sh` on Linux/macOS, `start.bat` on Windows). -**Zip (Windows-friendly, no installer)** — `simtrace-analyser-2.7.12.zip` is +**Zip (Windows-friendly, no installer)** — `simtrace-analyser-2.7.13.zip` is the runtime tree only (packages, PWA, launchers, docs; no tests, no git): download it, extract it anywhere and run `start.bat` (Windows) or `./start.sh` (Linux/macOS). Python 3 has to be on `PATH`; `pip install pyusb` @@ -510,3 +510,10 @@ Use `--inactivity-timeout` to also trigger reconnect on silent firmware hangs. - **[sigrok_iso7816_stream](https://github.com/anttro/sigrok_iso7816_stream)** — FX2LP-based passive ISO 7816 sniffer that emits the same GSMTAP-SIM stream on UDP 4729 (accepted by this project's GSMTAP listener). + +## License + +MIT — see [LICENSE](LICENSE). The decoders and the PWA's DES/3DES +implementation are original, written from the ISO 7816, ETSI and 3GPP +specifications; no third-party code is bundled. PyUSB (BSD-3-Clause) is a +runtime dependency for direct hardware capture. diff --git a/README_RUS.md b/README_RUS.md index 7031129..6338cac 100644 --- a/README_RUS.md +++ b/README_RUS.md @@ -111,7 +111,7 @@ git) или склонировать репозиторий для разраб **Wheel** (PWA внутри пакета): ```sh -pip install ./simtrace_analyser-2.7.12-py3-none-any.whl +pip install ./simtrace_analyser-2.7.13-py3-none-any.whl # затем запуск (интерфейс отдаётся на http://127.0.0.1:8081/): simtrace-analyser-server --capture gsmtap @@ -125,7 +125,7 @@ Fedora), сначала создайте виртуальное окружени указанную там): ```sh -pip install https://github.com/anttro/simtrace-analyser/releases/download/v2.7.12/simtrace_analyser-2.7.12-py3-none-any.whl +pip install https://github.com/anttro/simtrace-analyser/releases/download/v2.7.13/simtrace_analyser-2.7.13-py3-none-any.whl ``` С GitHub CLI можно скачать wheel последнего релиза, не зная версии: @@ -139,7 +139,7 @@ pip install ./simtrace_analyser-*.whl дерево без истории git: распакуйте, перейдите в каталог и используйте скрипты запуска ниже (`./start.sh` в Linux/macOS, `start.bat` в Windows). -**Zip (для Windows, без установки)** — `simtrace-analyser-2.7.12.zip` +**Zip (для Windows, без установки)** — `simtrace-analyser-2.7.13.zip` содержит только рабочее дерево (пакеты, PWA, скрипты запуска, документацию; без тестов и git): скачайте, распакуйте в любое место и запустите `start.bat` (Windows) или `./start.sh` (Linux/macOS). Python 3 должен быть в `PATH`; @@ -530,3 +530,10 @@ for msg in session.iter_messages(): - **[sigrok_iso7816_stream](https://github.com/anttro/sigrok_iso7816_stream)** — пассивный ISO 7816 сниффер на базе FX2LP, выдающий такой же поток GSMTAP-SIM на UDP 4729 (принимается GSMTAP-листенером этого проекта). + +## Лицензия + +MIT — см. [LICENSE](LICENSE). Декодеры и реализация DES/3DES в PWA написаны +самостоятельно по спецификациям ISO 7816, ETSI и 3GPP; сторонний код в проект +не включён. PyUSB (BSD-3-Clause) — зависимость для прямого захвата с +оборудования. diff --git a/frontend/index.html b/frontend/index.html index d2abf88..83a2718 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -3389,7 +3389,7 @@ function onSearchChange() { } // ──────────────────── Versioning ──────────────────── -const PWA_VERSION = '2.7.12'; +const PWA_VERSION = '2.7.13'; const MIN_SERVER_VERSION = '2.3.0'; function parseVersion(v) { diff --git a/frontend/sw.js b/frontend/sw.js index 847c88a..4e68b5d 100644 --- a/frontend/sw.js +++ b/frontend/sw.js @@ -1,4 +1,4 @@ -const CACHE = 'simtrace-analyser-v94'; +const CACHE = 'simtrace-analyser-v95'; const PRECACHE = [ 'index.html', diff --git a/pyproject.toml b/pyproject.toml index 4fbee5e..2e07a6d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,13 +1,14 @@ [build-system] -requires = ["setuptools>=64"] +requires = ["setuptools>=77"] build-backend = "setuptools.build_meta" [project] name = "simtrace-analyser" -version = "2.7.12" +version = "2.7.13" description = "SIMtrace Analyser — APDU trace analyser for GSMTAP/PCAP captures (bundles the simtrace2-pysniff utility)" readme = {file = "README.md", content-type = "text/markdown"} -license = {text = "GPL-2.0-or-later"} +license = "MIT" +license-files = ["LICENSE"] requires-python = ">=3.9" dependencies = [ "pyusb>=1.2", diff --git a/simtrace_analyser/version.py b/simtrace_analyser/version.py index e809820..06c51a7 100644 --- a/simtrace_analyser/version.py +++ b/simtrace_analyser/version.py @@ -1,3 +1,3 @@ """Single source of truth for the SIMtrace Analyser version.""" -__version__ = '2.7.12' +__version__ = '2.7.13' diff --git a/tests/test_packaging.py b/tests/test_packaging.py index 6aaca17..ba610e0 100644 --- a/tests/test_packaging.py +++ b/tests/test_packaging.py @@ -70,6 +70,15 @@ class TestDistributionMetadata(unittest.TestCase): # The sdist carries frontend/, so a wheel built from it has the PWA. self.assertIn('graft frontend', self._read('MANIFEST.in')) + def test_license_is_mit(self): + # The project is MIT; the metadata and the file must not drift apart. + pyproject = self._read('pyproject.toml') + self.assertIn('license = "MIT"', pyproject) + self.assertIn('license-files = ["LICENSE"]', pyproject) + license_text = self._read('LICENSE') + self.assertTrue(license_text.startswith('MIT License\n')) + self.assertIn('Permission is hereby granted, free of charge', license_text) + def test_setup_py_bundles_the_pwa(self): setup_py = self._read('setup.py') self.assertIn('frontend', setup_py) diff --git a/tests/test_pcap_import.py b/tests/test_pcap_import.py index 07aedd9..c826c4b 100644 --- a/tests/test_pcap_import.py +++ b/tests/test_pcap_import.py @@ -224,7 +224,7 @@ class TestImportEndpoint(unittest.TestCase): class TestVersion(unittest.TestCase): def test_package_version(self): from simtrace2_pysniff import __version__ - self.assertEqual(__version__, '2.7.12') + self.assertEqual(__version__, '2.7.13') def test_status_includes_version(self): import os diff --git a/tests/test_release_zip.py b/tests/test_release_zip.py index 978aa5a..c617e08 100644 --- a/tests/test_release_zip.py +++ b/tests/test_release_zip.py @@ -51,6 +51,7 @@ class TestReleaseZip(unittest.TestCase): 'sniff-start.sh', 'sniff-start.bat', '70-simtrace2-pysniff.rules', + 'LICENSE', 'README.md'): self.assertIn('%s/%s' % (top, rel), self.names)