Add a pytest suite covering the pure logic of the DeDRM and Obok plugins.
Because the plugins normally run inside calibre and use intra-package
imports, tests/dedrm_test_utils.py sets up an import shim (plugin dirs on
sys.path, a minimal calibre stub, and a synthetic `dedrm` package) so the
modules can be imported and exercised standalone.
Coverage:
- alfcrypto: PC1 and Topaz cipher round-trips, PBKDF2 vs hashlib.
- kgenpids / kindlepid: PID encoding, bit-field extraction, device-PID
and serial-PID known vectors, CRC32.
- mobidedrm: PC1 round-trip, trailing-data sizing, bad-key handling.
- ineptpdf / ineptepub: nunpack and PKCS7 unpad.
- topazextract: encoded number/string parsing, plus a regression test
that a malicious header tag ("../../evil") cannot escape the output
directory (covers the path-traversal fix).
- obok: unpad, hash-key table, SafeUnbuffered str/bytes handling.
- utilities / argv_utils: uStrCmp normalisation, unicode_argv.
- erdr2pml: deXOR/sanitiseFileName, skipped on Python 3.13+ where the
module's `cgi` import is unavailable.
Run with `poetry install` then `poetry run pytest`. 36 pass, 2 skip on
Python 3.13+.
Note: this surfaced two dead-code modules that are broken on Python 3
(aescbc's pure-Python AES and kgenpids.decode, neither on a live path,
since the real crypto goes through pycryptodome); left as-is here.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
47 lines
1.8 KiB
TOML
47 lines
1.8 KiB
TOML
# Poetry-managed development environment for DeDRM_tools.
|
|
#
|
|
# Note: the DeDRM and Obok plugins are distributed as calibre plugin zips and
|
|
# run inside calibre's bundled Python interpreter -- they are NOT pip-installed.
|
|
# This manifest therefore manages the *development* / standalone-CLI environment
|
|
# (running the scripts outside calibre, testing, etc.) and documents the real
|
|
# third-party dependency set, rather than producing a distributable package.
|
|
# Hence `package-mode = false`.
|
|
#
|
|
# Dependencies provided by the calibre runtime (do not pip-install them here):
|
|
# calibre, calibre_plugins, calibre_lzma, PyQt5 / PyQt4
|
|
#
|
|
# Crypto: the code imports the `Cryptodome` namespace first (pycryptodomex,
|
|
# actively maintained) and only falls back to the `Crypto` namespace if it is
|
|
# missing. The legacy `Crypto` namespace is satisfied by the maintained
|
|
# pycryptodome package as well, so the abandoned `pycrypto` package (unmaintained
|
|
# since 2014, CVE-2013-7459) is not required and is intentionally not declared.
|
|
|
|
[tool.poetry]
|
|
package-mode = false
|
|
|
|
[tool.poetry.dependencies]
|
|
python = ">=3.8,<4.0"
|
|
|
|
# Actively-maintained crypto library, exposes the `Cryptodome` namespace that
|
|
# all crypto imports prefer. Replaces the abandoned `pycrypto`.
|
|
pycryptodomex = ">=3.20"
|
|
|
|
# XML handling for Adobe ADEPT / EPUB / PDF DRM (ineptepub, ineptpdf,
|
|
# epubfontdecrypt, epubwatermark, ignoblekey*).
|
|
lxml = ">=5.0"
|
|
|
|
# SQLite access for Nook (Barnes & Noble) Windows Store key extraction is only
|
|
# needed by DeDRM_plugin/ignoblekeyWindowsStore.py. Kept in an optional group so
|
|
# the base environment installs cleanly on platforms where it is not required.
|
|
[tool.poetry.group.nook]
|
|
optional = true
|
|
|
|
[tool.poetry.group.nook.dependencies]
|
|
apsw = ">=3.46"
|
|
|
|
[tool.poetry.group.dev.dependencies]
|
|
pytest = ">=8.0"
|
|
|
|
[tool.pytest.ini_options]
|
|
testpaths = ["tests"]
|