Reject duplicate source generation references

This commit is contained in:
NINI
2026-10-05 02:40:09 +09:00
parent ceb063dfdc
commit 72232731d1
3 changed files with 11 additions and 1 deletions
+4
View File
@@ -114,10 +114,14 @@ def load_run_inputs(manifest, root):
migrated = [record for record in load_json(migration_path)['runs'] if record['runId'] == run_id]
if migrated and (len(migrated) != 1 or file_hash(run_dir / 'manifest.json') != migrated[0]['originalManifestSha256']):
raise ValueError(f'{run_id}: immutable legacy manifest SHA-256 mismatch')
source_ids = set()
for reference in manifest.get('environment', {}).get('sourceGenerations', []):
source_id = reference['runId']
if not isinstance(source_id, str) or not re.fullmatch(r'[A-Za-z0-9_]+', source_id):
raise ValueError('invalid source generation reference runId')
if source_id in source_ids:
raise ValueError('duplicate source generation reference runId')
source_ids.add(source_id)
if reference['manifest'] != f'generated/{source_id}/manifest.json':
raise ValueError('source generation reference must identify its own run manifest')
source_path = Path(root) / reference['manifest']
+6
View File
@@ -237,6 +237,12 @@ class VoiceHistoryTests(unittest.TestCase):
changed_environment = copy.deepcopy(second)
changed_environment['environment']['sourceGenerations'][0]['environment']['device'] = 'CORRUPTED_DEVICE_RECORD'
self.assertTrue(voice.validate_manifest(changed_environment, self.catalog, self.profile, self.root))
duplicated = copy.deepcopy(second)
duplicated['environment']['sourceGenerations'].append(copy.deepcopy(duplicated['environment']['sourceGenerations'][0]))
self.assertTrue(voice.validate_manifest(duplicated, self.catalog, self.profile, self.root))
changed_path = copy.deepcopy(second)
changed_path['environment']['sourceGenerations'][0]['manifest'] = '../outside/manifest.json'
self.assertTrue(voice.validate_manifest(changed_path, self.catalog, self.profile, self.root))
origin = self.root / 'generated' / first['runId'] / 'manifest.json'
changed = voice.load_json(origin)
changed['environment']['device'] = 'CORRUPTED_DEVICE_RECORD'