user-engine/tools/validate_catalogue_bootstrap_packet.py

35 lines
2.9 KiB
Python
Raw Permalink Normal View History

"""Offline human packet validation; does not authenticate or submit its author."""
import argparse,base64,copy,hashlib,json,sys
from pathlib import Path
def validate(root,infd_root):
sys.path.insert(0,str(infd_root))
import jsonschema
from informed_decision.intake import validate_submission,SubmitterGrant,IntakeRefused
from informed_decision.lifecycle_commands import decode_memo,decode_documents
env=json.loads((root/'intake.json').read_text());commands=json.loads((root/'lifecycle-commands.json').read_text())
schema=json.loads((infd_root/'schemas/memo-intake.schema.json').read_text());jsonschema.validate(env,schema)
grant=SubmitterGrant('state-hub',frozenset({'decision-record'}),frozenset({'net-kingdom-admins'}))
parsed=validate_submission(env,submitter_id='state-hub',grant=grant);memo=decode_memo(commands[0]['register']['memo']);docs=decode_documents(commands[0]['register']['documents'],memo)
assert env['memo']==commands[0]['register']['memo']==json.loads((root/'memo.json').read_text())
assert commands[0]['review']['options']['approval_intent']==env['approval_intent']
assert len(docs)==len(memo.packet)==len(parsed.packet)==20
for item in env['packet']:
source=root/next(x['label'] for x in env['memo']['packet'] if x['item_id']==item['item_id'])
assert item['content'].encode()==source.read_bytes()
assert len(json.dumps(commands[0]['register']).encode())<=256*1024
assert hashlib.sha256((root/'executor.py').read_bytes()).hexdigest()=='b0dbbb9786e927055030acf849a72e9a44e9d3d55c84efdf245e419d381684f3'
assert hashlib.sha256((root/'supervisor-transport.py').read_bytes()).hexdigest()=='3e594e0e8561100ae1eeb34d7208cd5b5e387ae56c29689f155aed94219770f3'
negatives=[]
for label in ['packet-content-tamper','boolean-memo-version','approval-prebound']:
trial=copy.deepcopy(env)
if label=='packet-content-tamper':trial['packet'][0]['content']+='\nchanged'
elif label=='boolean-memo-version':trial['memo']['version']=True
else:trial['memo']['approval_id']='fixture-unapproved'
try:validate_submission(trial,submitter_id='state-hub',grant=grant)
except IntakeRefused:negatives.append(label)
else:raise AssertionError('negative accepted')
return {'offline_only':True,'full_intake_and_schema_valid':True,'typed_lifecycle_memo_valid':True,'lifecycle_document_hashes_valid':len(docs),'source_files_equal_packet':True,'negative_intake_guards':negatives,'register_payload_bytes':len(json.dumps(commands[0]['register']).encode()),'submission_digest':parsed.submission_digest,'submitter_grant_is_offline_shape_assumption_only':True,'native_admission_or_authenticity_proved':False}
if __name__=='__main__':
p=argparse.ArgumentParser(description=__doc__);p.add_argument('packet',type=Path);p.add_argument('--informed-decision-root',type=Path,default=Path('/home/worsch/informed-decision'));a=p.parse_args();print(json.dumps(validate(a.packet,a.informed_decision_root),sort_keys=True))