# Author: Sandeep Belgavi """Offline approval state machine; reviewer identity is injected by trusted code.""" import hashlib import json import sqlite3 import tempfile from pathlib import Path def digest(action): return hashlib.sha256(json.dumps(action, sort_keys=True, separators=(',', ':')).encode()).hexdigest() class ApprovalStore: def __init__(self, path): self.db = sqlite3.connect(path) self.db.execute('CREATE TABLE IF NOT EXISTS approvals(id TEXT PRIMARY KEY, fingerprint TEXT, revision TEXT, reviewer TEXT, expires INTEGER, state TEXT)') def request(self, key, action, revision, reviewer, expires): if not all(isinstance(v, str) and v for v in (key, revision, reviewer)) or type(expires) is not int: raise ValueError('approval contract') with self.db: self.db.execute('INSERT INTO approvals VALUES (?,?,?,?,?,?)', (key, digest(action), revision, reviewer, expires, 'pending')) def decide(self, key, principal, action, revision, now, approve=True): if type(approve) is not bool: raise ValueError('decision must be boolean') with self.db: self.db.execute('BEGIN IMMEDIATE') row = self.db.execute('SELECT fingerprint,revision,reviewer,expires,state FROM approvals WHERE id=?', (key,)).fetchone() if row is None: raise KeyError(key) fp, rev, reviewer, expires, state = row if principal != reviewer: raise PermissionError('wrong reviewer') if digest(action) != fp or revision != rev: raise ValueError('stale or changed proposal') if now >= expires: raise ValueError('approval expired') if state != 'pending': raise ValueError('already decided') state = 'approved' if approve else 'rejected' self.db.execute('UPDATE approvals SET state=? WHERE id=?', (state, key)) return state def consume(self, key, action, revision, now): # Returns a local dispatch marker; does not perform an external action. with self.db: changed = self.db.execute("UPDATE approvals SET state='consumed' WHERE id=? AND fingerprint=? AND revision=? AND expires>? AND state='approved'", (key, digest(action), revision, now)).rowcount if changed != 1: raise PermissionError('no current unconsumed approval') return {'approval': key, 'dispatch': 'local-marker'} def close(self): self.db.close() class ProposalAdapter: """Deterministic proposal seam; it has no approval authority.""" def propose(self): return {'incident': 'inc-42', 'action': 'restart-worker', 'target': 'worker-7'} def demo(): with tempfile.TemporaryDirectory() as folder: store = ApprovalStore(Path(folder) / 'approval.db') action = ProposalAdapter().propose() store.request('approval-1', action, 'v1', 'reviewer-7', 200) decision = store.decide('approval-1', 'reviewer-7', action, 'v1', 100) receipt = store.consume('approval-1', action, 'v1', 101) store.close() return {'decision': decision, **receipt} if __name__ == '__main__': print(json.dumps(demo(), sort_keys=True))