46 lines
2.4 KiB
Python
46 lines
2.4 KiB
Python
#!/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.')
|