#!/usr/bin/env python3 """Check immutable texture-release hashes using only Python's standard library.""" import hashlib import json from pathlib import Path import struct import zlib ROOT = Path(__file__).resolve().parents[1] SOURCE = ROOT / 'ressources-pack/sanctuary' properties = dict(line.split('=', 1) for line in (ROOT / 'gradle.properties').read_text().splitlines() if line.strip() and not line.lstrip().startswith('#')) version = properties['resource_pack_version'] release = json.loads((SOURCE / f'releases/{version}.json').read_text()) assert release['version'] == version assert release['minecraft'] == properties['minecraft_version'] assert release['format'] == [97, 1] assert release['builtinId'] == 'sanctuary:textures' and release['activation'] == 'DEFAULT_ENABLED' files = {str(p.relative_to(SOURCE)): p for p in SOURCE.rglob('*') if p.is_file() and (str(p.relative_to(SOURCE)).startswith('assets/') or p.name in ('pack.mcmeta', 'pack.png')) and p.name != '.DS_Store'} assert set(files) == set(release['files']), 'Resource list changed: create a new texture release manifest' for name, path in files.items(): data = path.read_bytes() assert hashlib.sha256(data).hexdigest() == release['files'][name], f'Texture release drift: {name}' if name.endswith(('.json', '.mcmeta')): json.loads(data) if name.endswith('.png'): assert data[:8] == b'\x89PNG\r\n\x1a\n', name offset = 8 kind = None while offset < len(data): length = struct.unpack_from('>I', data, offset)[0] kind = data[offset + 4:offset + 8] chunk = data[offset + 4:offset + 8 + length] assert zlib.crc32(chunk) == struct.unpack_from('>I', data, offset + 8 + length)[0], name offset += 12 + length assert offset == len(data) and kind == b'IEND', name for name, digest in release['import']['files'].items(): if name.startswith('assets/') or name == 'pack.png': assert hashlib.sha256(files[name].read_bytes()).hexdigest() == digest, f'Imported asset altered: {name}' metadata = json.loads(files['pack.mcmeta'].read_text())['pack'] assert metadata['min_format'] == metadata['max_format'] == release['format'] assert metadata['description']['with'] == [version] print(f'Sanctuary textures {version}: {len(files)} files, imported assets, PNG CRCs and format 97.1 verified.')