Verify normalized task approval facts and preserve signed source types
Assistant: codex Assistant-Model: gpt-6-astra Assistant-Session: 01a140c4-354a-7823-8f0d-8f717397f786
This commit is contained in:
parent
5a2099f400
commit
4dd004a225
18 changed files with 756 additions and 60 deletions
|
|
@ -133,7 +133,7 @@ def test_closed_schema_refuses(mutation):
|
|||
|
||||
@pytest.mark.parametrize('action', ['apply','rotate','exec','execute-ccr'])
|
||||
def test_invalid_action_or_absent_contract_refuses_before_claim(tmp_path,action):
|
||||
e=entry(); cfg=_Cfg(_token(tmp_path)); calls=[]
|
||||
e=entry(); cfg=_Cfg(_token(tmp_path),authorization_subject_id='secrets-engine',authorization_subject_type='service'); calls=[]
|
||||
def fetch(*args,**kwargs): calls.append('claim'); raise AssertionError
|
||||
contract=None if action=='execute-ccr' else ExecutionContract.parse(descriptor(e))
|
||||
with pytest.raises(DecisionError):
|
||||
|
|
@ -143,7 +143,7 @@ def test_invalid_action_or_absent_contract_refuses_before_claim(tmp_path,action)
|
|||
|
||||
def test_catalog_mismatch_and_unserved_execution_refuse(tmp_path):
|
||||
e=entry(); typed=ExecutionContract.parse(descriptor(e)); e=replace(e,path='changed/path')
|
||||
cfg=_Cfg(_token(tmp_path)); calls=[]
|
||||
cfg=_Cfg(_token(tmp_path),authorization_subject_id='secrets-engine',authorization_subject_type='service'); calls=[]
|
||||
with pytest.raises(DecisionError,match='catalog'):
|
||||
resolve_approval_observation(cfg,e,'execute-ccr',None,execution_contract=typed,opener=lambda *a,**k:calls.append('claim'))
|
||||
assert not calls
|
||||
|
|
@ -154,7 +154,7 @@ def test_catalog_mismatch_and_unserved_execution_refuse(tmp_path):
|
|||
|
||||
def test_expired_contract_refuses_before_claim(tmp_path):
|
||||
e=entry(); raw=descriptor(e); raw['operation_deadline']=(datetime.now(timezone.utc)-timedelta(seconds=1)).isoformat()
|
||||
cfg=_Cfg(_token(tmp_path)); calls=[]
|
||||
cfg=_Cfg(_token(tmp_path),authorization_subject_id='secrets-engine',authorization_subject_type='service'); calls=[]
|
||||
with pytest.raises(DecisionError,match='expired'):
|
||||
authorize_action(cfg,e,'execute-ccr',execution_contract=ExecutionContract.parse(raw),opener=lambda *a,**k:calls.append('claim'))
|
||||
assert not calls
|
||||
|
|
@ -200,3 +200,22 @@ def test_deadline_beyond_claim_refuses_before_pdp(tmp_path):
|
|||
from tests.test_consume_binding_join import admitted_native_signer
|
||||
|
||||
from tests.signature_support import signature_tools
|
||||
|
||||
|
||||
def test_execution_service_declaration_is_fixed_before_issue():
|
||||
e=entry();contract=ExecutionContract.parse(descriptor(e))
|
||||
built=request(e,contract)
|
||||
assert built['context']['service_actor_binding']=={
|
||||
'version':'proposed-service-task-caller/v1',
|
||||
'transport_principal':'system:serviceaccount:secrets-engine:secrets-engine',
|
||||
'subject_id':'secrets-engine','subject_type':'service','tenant':'tenant:platform'}
|
||||
assert built['subject']=={'id':'secrets-engine','type':'service','tenant':'tenant:platform'}
|
||||
assert built['resource']['tenant']=='tenant:platform'
|
||||
assert 'service_actor_binding' not in build_action_request(e,'apply',subject_id='secrets-engine',subject_type='service',purpose='metadata-test')['context']
|
||||
|
||||
|
||||
@pytest.mark.parametrize('subject_id,subject_type',[('other','service'),('secrets-engine','Human'),('user:alice','Human')])
|
||||
def test_execution_declaration_cannot_assert_foreign_service(subject_id,subject_type):
|
||||
e=entry();contract=ExecutionContract.parse(descriptor(e))
|
||||
with pytest.raises(DecisionError,match='service subject'):
|
||||
build_action_request(e,'execute-ccr',subject_id=subject_id,subject_type=subject_type,purpose='metadata-test',execution_contract=contract)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue