File size: 3,346 Bytes
a6ed8b8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
"""Validate the generated source binding against the mounted Cosmos payload."""
import hashlib
import json
import os
import re
from pathlib import Path, PurePosixPath


def mounted_files(root, declared):
    """Inventory payload; allow only CPython caches for declared Python modules."""
    result = set()
    def fail(error):
        raise error
    for directory, directories, filenames in os.walk(root, followlinks=False, onerror=fail):
        for name in directories + filenames:
            target = Path(directory) / name
            if target.is_symlink() or getattr(target, 'is_junction', lambda: False)():
                raise ValueError('mounted link')
        for name in filenames:
            target = Path(directory) / name
            if not target.is_file():
                raise ValueError('nonregular mounted entry')
            relative = target.relative_to(root)
            if relative.as_posix() == 'COSMOS_SOURCE_BINDING.json':
                continue
            if relative.parent.name == '__pycache__':
                match = re.fullmatch(r'(.+)\.cpython-[0-9]+(?:\.opt-[012])?\.pyc', name)
                source = relative.parent.parent / ((match[1] if match else '') + '.py')
                if match and source.as_posix() in declared:
                    continue
            result.add(relative.as_posix())
    return result


def bound_source(directory):
    root = Path(directory).resolve()
    try:
        binding = json.loads((root / 'COSMOS_SOURCE_BINDING.json').read_text(encoding='utf-8'))
        if not isinstance(binding, dict):
            raise ValueError('binding object required')
        if binding['schema'] != 'szl.cosmos-source/v1' or binding['repository'] != 'szl-holdings/anatomy' or binding['source_path'] != 'spaces/cosmos' or binding['destination'] != 'betterwithage/cosmos':
            raise ValueError('binding identity')
        if not re.fullmatch('[0-9a-f]{40}', binding['commit']):
            raise ValueError('source commit')
        files = binding['files']
        if not isinstance(files, dict) or not {'server.py', 'catalog.py', 'source_binding.py', 'index.html', 'vendor/three.module.min.js'}.issubset(files):
            raise ValueError('incomplete binding')
        if mounted_files(root, files) != set(files):
            raise ValueError('mounted file set mismatch')
        for name, digest in files.items():
            path = PurePosixPath(name)
            if not name or path.as_posix() != name or path.is_absolute() or '..' in path.parts or ':' in name or '\\' in name or not re.fullmatch('[0-9a-f]{64}', digest):
                raise ValueError('invalid file entry')
            target = root.joinpath(*path.parts)
            if target.is_symlink() or not target.resolve().is_relative_to(root) or hashlib.sha256(target.read_bytes()).hexdigest() != digest:
                raise ValueError('payload mismatch')
        return {'repository': binding['repository'], 'commit': binding['commit'], 'path': binding['source_path'], 'relation': 'mounted-files-match-publisher-binding', 'state': 'SOURCE_BOUND', 'evidence_url': 'https://github.com/' + binding['repository'] + '/tree/' + binding['commit'] + '/' + binding['source_path']}, 'SOURCE_BOUND_LOCAL_BYTES'
    except (OSError, ValueError, TypeError, KeyError):
        return None, 'UNKNOWN_SOURCE_RELATION'