"""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))