fix: refuse multi-md5 additions in RetroBat

This commit is contained in:
Abdessamad Derraz committed 2026-10-18 14:29:46 +02:00
1 parent 1e2f4e810b
commit 6458a927d4
4 files changed
+28 -8

No files matched your search

+9
View File
@@ -16,6 +16,10 @@ from .baseline import NativeFile, NativeSystem, Report
class BaseExporter(ABC):
"""Base class for writing a platform's own BIOS file, corrected."""
# A hash field the checker compares to one value: an addition the
# truth accepts under several cannot be written whole.
SINGLE_HASH_FIELD: str | None = None
@staticmethod
@abstractmethod
def platform_name() -> str:
@@ -145,6 +149,11 @@ class BaseExporter(ABC):
return True
if not cls.can_add() or (cls.keys_by_system() and fe.foreign_system):
return False
single = cls.SINGLE_HASH_FIELD
if single and len(set(fe.hashes(single))) > 1:
# One value checked: written with the first, the addition
# refuses every other dump the core accepts.
return False
require = require or cls.requires()
return not require or bool(fe.hash(require))
+6 -8
View File
@@ -25,6 +25,11 @@ _INDENT = " " * 4
class Exporter(BaseExporter):
"""Write Batocera's batocera-systems, corrected."""
# checkBios compares one md5 for a plain file; altmd5 is read only for
# a zippedFile: retrodream's boot.bin written with the first of four
# md5 refused the three other dumps the core accepts.
SINGLE_HASH_FIELD = "md5"
# checkBios reads emulator names from es_systems, and Batocera's
# standalone_cores are those names. ROCKNIX's list holds package names
# (duckstation-sa), which its checker does not know.
@@ -58,14 +63,7 @@ class Exporter(BaseExporter):
@classmethod
def writable(cls, fe: NativeFile, require: str = "") -> bool:
"""An addition the format can state whole.
checkBios compares one md5 for a plain file (altmd5 is read only for
a zippedFile): written with the first of four, retrodream's boot.bin
refused the three other dumps the core accepts.
"""
if fe.platform is None and len(set(fe.hashes("md5"))) > 1:
return False
"""An addition the format can state whole."""
if fe.platform is None and not cls._usable_runners(fe):
# Written without its core's emulator and core, checkBios asks
# every build for it (the defect _runner_keys repairs for the
+3
View File
@@ -21,6 +21,9 @@ SOURCE_URL = (
class Exporter(BaseExporter):
"""Write RetroBat's batocera-systems.json, corrected."""
# One md5 per entry, compared as Batocera's checkBios does.
SINGLE_HASH_FIELD = "md5"
@staticmethod
def platform_name() -> str:
return "retrobat"
+10
View File
@@ -336,6 +336,16 @@ class OneMd5FormatsAddWhole(unittest.TestCase):
self.assertFalse(Batocera.writable(several))
self.assertTrue(Batocera.writable(single))
def test_retrobat_refuses_it_too(self):
# RetroBat's batocera-systems.json holds one md5 per entry: the
# addition was written with the first and counted added.
from exporter.retrobat_exporter import Exporter as RetroBat # noqa: PLC0415
several = NativeFile("boot.bin", "boot.bin", "dc", truth={"md5": [A, B, C]})
single = NativeFile("boot2.bin", "boot2.bin", "dc", truth={"md5": A})
self.assertFalse(RetroBat.writable(several))
self.assertTrue(RetroBat.writable(single))
class BizHawkKeepsItsOwnHashes(unittest.TestCase):
def test_a_declared_sha1_is_not_replaced(self):