| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- """Build a nonsecret target-side authorization support package, without altering r2."""
- import hashlib
- import io
- import json
- from pathlib import Path
- import subprocess
- import sys
- import zipfile
- sys.dont_write_bytecode = True
- ROOT = Path(__file__).resolve().parents[1]
- OUT = ROOT / 'docs/ksf-enterprise-auth-support-20261110-r1'
- NAME = OUT.name
- sha = lambda b: hashlib.sha256(b).hexdigest()
- encode = lambda v: (json.dumps(v, ensure_ascii=False, indent=2) + '\n').encode()
- def main():
- if OUT.exists():
- raise ValueError('NEW_RELEASE_DIRECTORY_REQUIRED')
- validation = json.loads((ROOT / 'work/enterprise-workshop-20261110/validation-auth-r1.json').read_bytes())
- assert validation['ok'] and validation['testsRun'] == 50
- names = ['common.mjs', 'export-recipient.mjs', 'install.mjs', 'decrypt-envelope.mjs', 'README.md']
- files = {n: (ROOT / 'scripts/enterprise-auth' / n).read_bytes() for n in names}
- for n in names:
- if n.endswith('.mjs'):
- result = subprocess.run(['node', '--check', str(ROOT / 'scripts/enterprise-auth' / n)], capture_output=True)
- assert result.returncode == 0, 'JAVASCRIPT_CHECK_FAILED'
- files['validation.json'] = encode(validation)
- files['source-info.json'] = encode({
- 'schema': 'ksf.enterprise-workshop-auth-support-source.v1',
- 'targetContainer': 'agent-node-kangshifu', 'targetHost': '6f03725e5dc8',
- 'companyObjectId': 'FKieRbIoGt', 'appId': 'FKieRbIoGt_main',
- 'configurationRepositoryCommitPreserved': '262151d448482f940938ae234505276a60f4c58b',
- 'wrapperSha256': sha((ROOT / 'skills/ksf-workshop-runtime/scripts/ksf-secure.mjs').read_bytes()),
- 'adminIssuerIncluded': False, 'credentialsIncluded': False,
- 'credentialIssuedInProduction': False, 'productionBindingInstalled': False,
- })
- files['FILES.sha256'] = ''.join(sha(raw) + ' ' + n + '\n' for n, raw in sorted(files.items())).encode()
- for n, raw in files.items():
- dest = OUT / 'package' / n
- dest.parent.mkdir(parents=True, exist_ok=True)
- dest.write_bytes(raw)
- stream = io.BytesIO()
- with zipfile.ZipFile(stream, 'w', zipfile.ZIP_DEFLATED) as z:
- for name, raw in sorted(files.items()):
- entry = zipfile.ZipInfo(name, (2026, 11, 10, 0, 0, 0))
- entry.external_attr = 0o100644 << 16
- z.writestr(entry, raw, compress_type=zipfile.ZIP_DEFLATED)
- archive = stream.getvalue()
- (OUT / (NAME + '.zip')).write_bytes(archive)
- release = {'release': NAME, 'archive': NAME + '.zip', 'bytes': len(archive), 'sha256': sha(archive),
- 'files': len(files), 'manifestEntries': len(files) - 1, 'credentialsIncluded': False,
- 'skillModified': False, 'productionCredentialIssued': False, 'businessWrites': 0}
- (OUT / 'release.json').write_bytes(encode(release))
- print(json.dumps(release, ensure_ascii=False, indent=2))
- if __name__ == '__main__':
- main()
|