[verified] Enforce delegation adoption at runtime consumers
This commit is contained in:
@@ -33,6 +33,25 @@ def fail(message):
|
||||
raise ValidationError(message)
|
||||
|
||||
|
||||
def require_adoption(declaration, revision):
|
||||
if declaration is None:
|
||||
fail('delegation adoption declaration required')
|
||||
try:
|
||||
repo_root = Path(__file__).resolve().parents[6]
|
||||
import sys
|
||||
if str(repo_root) not in sys.path:
|
||||
sys.path.insert(0, str(repo_root))
|
||||
from harness.lib.delegation_adoption import AdoptionError, require_adoption as adopt
|
||||
except Exception:
|
||||
fail('delegation adoption unavailable')
|
||||
try:
|
||||
return adopt(declaration, expected_source={'kind': 'git_tree', 'revision': revision}, expected_stage='code-review')
|
||||
except AdoptionError as exc:
|
||||
fail(str(exc))
|
||||
except Exception:
|
||||
fail('delegation adoption unavailable')
|
||||
|
||||
|
||||
def positive_id(value):
|
||||
if type(value) is not int or value < 1:
|
||||
fail('invalid positive identity')
|
||||
@@ -455,10 +474,11 @@ def check_lease(lease, plan):
|
||||
fail('unsupported lease check result')
|
||||
|
||||
|
||||
def publish(plan, baseline, api, lease, journal_directory):
|
||||
def publish(plan, baseline, api, lease, journal_directory, *, declaration=None):
|
||||
"""Use one trusted role transport and an already-held Issue lease; never retry POST."""
|
||||
import copy
|
||||
validate_snapshot(plan, baseline)
|
||||
require_adoption(declaration, plan['target']['head'])
|
||||
payload = build_payload(plan)
|
||||
if any(not callable(getattr(api, k, None)) for k in ['identity', 'snapshot', 'create_review', 'read_review']):
|
||||
fail('unsupported adapter capabilities')
|
||||
@@ -519,6 +539,7 @@ def publish(plan, baseline, api, lease, journal_directory):
|
||||
'head': plan['target']['head'], 'event': payload['event'],
|
||||
'body_sha256': hashlib.sha256(payload['body'].encode()).hexdigest()})
|
||||
check_lease(lease, plan)
|
||||
require_adoption(declaration, plan['target']['head'])
|
||||
uncertain = False
|
||||
response_id = None
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user