20260811_494_trusted_delivery_provision_lease.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. """Fence provision provider calls behind a durable database-time outbox lease."""
  2. from alembic import op
  3. revision = "20260811_494"
  4. down_revision = "20260811_493"
  5. branch_labels = None
  6. depends_on = None
  7. def upgrade() -> None:
  8. op.execute(r"""
  9. /* Keep every pre-494 operation intact and add a deliberately narrower
  10. provision lifecycle. The restricted runtime role owns no table DML. */
  11. ALTER FUNCTION public.trusted_delivery_runtime_write(text,jsonb)
  12. RENAME TO trusted_delivery_runtime_write_validated493;
  13. REVOKE ALL ON FUNCTION public.trusted_delivery_runtime_write_validated493(text,jsonb)
  14. FROM PUBLIC, dataops_app_runtime;
  15. CREATE OR REPLACE FUNCTION public.trusted_delivery_provision_payload_is_closed(
  16. p_operation text, p_payload jsonb
  17. ) RETURNS boolean LANGUAGE plpgsql IMMUTABLE AS $closed$
  18. DECLARE v_required text[]; v_key text; v_value jsonb;
  19. BEGIN
  20. IF jsonb_typeof(p_payload)<>'object' THEN RETURN false; END IF;
  21. v_required:=CASE p_operation
  22. WHEN 'claim_provision' THEN ARRAY['uid','worker']
  23. WHEN 'fail_provision' THEN ARRAY['uid','worker','fence']
  24. WHEN 'complete_provision' THEN ARRAY['grant_uid','uid','worker','fence','receipt_uid','receipt_code','response_digest','diff_digest']
  25. ELSE NULL
  26. END;
  27. IF v_required IS NULL OR NOT p_payload ?& v_required
  28. OR p_payload-v_required<>'{}'::jsonb THEN RETURN false; END IF;
  29. FOR v_key,v_value IN SELECT key,value FROM jsonb_each(p_payload) LOOP
  30. IF v_key='fence' THEN
  31. IF jsonb_typeof(v_value)<>'number' THEN RETURN false; END IF;
  32. ELSIF jsonb_typeof(v_value)<>'string' OR octet_length(v_value #>> '{}')>512 THEN
  33. RETURN false;
  34. END IF;
  35. END LOOP;
  36. IF EXISTS(SELECT 1 FROM jsonb_each_text(p_payload) e(key,value)
  37. WHERE e.key IN ('uid','grant_uid','receipt_uid')
  38. AND e.value !~* '^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$') THEN RETURN false; END IF;
  39. IF EXISTS(SELECT 1 FROM jsonb_each_text(p_payload) e(key,value)
  40. WHERE e.key IN ('response_digest','diff_digest')
  41. AND e.value !~ '^[0-9a-f]{64}$') THEN RETURN false; END IF;
  42. RETURN true;
  43. END $closed$;
  44. CREATE OR REPLACE FUNCTION public.trusted_delivery_runtime_provision_write(
  45. p_operation text,p_payload jsonb
  46. ) RETURNS jsonb LANGUAGE plpgsql SECURITY DEFINER SET search_path=pg_catalog,public AS $provision$
  47. DECLARE r record; v_receipt record;
  48. BEGIN
  49. IF NOT public.trusted_delivery_provision_payload_is_closed(p_operation,p_payload) THEN
  50. RAISE EXCEPTION 'trusted-delivery runtime write is not permitted';
  51. END IF;
  52. IF p_operation='claim_provision' THEN
  53. SELECT rcp.status,rcp.receipt_code,rcp.response_digest,rcp.diff_digest
  54. INTO v_receipt
  55. FROM public.trusted_delivery_deliveries d
  56. JOIN public.trusted_delivery_receipts rcp ON rcp.delivery_uid=d.uid
  57. WHERE d.uid=(p_payload->>'uid')::uuid AND d.operation='provision';
  58. IF FOUND THEN
  59. RETURN jsonb_build_object('state','completed','receipt',jsonb_build_object(
  60. 'status',v_receipt.status,'receipt_code',v_receipt.receipt_code,
  61. 'response_digest',v_receipt.response_digest,'diff_digest',v_receipt.diff_digest));
  62. END IF;
  63. UPDATE public.trusted_delivery_deliveries SET status='processing',
  64. lease_owner=p_payload->>'worker',lease_fence=lease_fence+1,
  65. lease_expires_at=clock_timestamp()+interval '300 seconds',updated_at=clock_timestamp()
  66. WHERE uid=(p_payload->>'uid')::uuid AND operation='provision' AND (
  67. (status='pending' AND next_attempt_at<=clock_timestamp()) OR
  68. (status='processing' AND lease_expires_at<=clock_timestamp())
  69. ) RETURNING uid::text,grant_uid::text,lease_fence,lease_owner,lease_expires_at INTO r;
  70. IF NOT FOUND THEN RETURN jsonb_build_object('state','leased'); END IF;
  71. RETURN jsonb_build_object('state','claimed','uid',r.uid,'grant_uid',r.grant_uid,
  72. 'lease_fence',r.lease_fence,'lease_owner',r.lease_owner,'lease_expires_at',r.lease_expires_at);
  73. ELSIF p_operation='fail_provision' THEN
  74. UPDATE public.trusted_delivery_deliveries SET status='pending',lease_owner=NULL,
  75. lease_expires_at=NULL,next_attempt_at=clock_timestamp(),updated_at=clock_timestamp()
  76. WHERE uid=(p_payload->>'uid')::uuid AND operation='provision' AND status='processing'
  77. AND lease_owner=p_payload->>'worker' AND lease_fence=(p_payload->>'fence')::bigint
  78. AND lease_expires_at>clock_timestamp() RETURNING uid::text INTO r;
  79. IF NOT FOUND THEN RAISE EXCEPTION 'trusted delivery lease conflict'; END IF;
  80. RETURN jsonb_build_object('uid',r.uid,'status','pending');
  81. ELSIF p_operation='complete_provision' THEN
  82. UPDATE public.trusted_delivery_deliveries SET status='applied',lease_owner=NULL,
  83. lease_expires_at=NULL,updated_at=clock_timestamp()
  84. WHERE uid=(p_payload->>'uid')::uuid AND grant_uid=(p_payload->>'grant_uid')::uuid
  85. AND operation='provision' AND status='processing' AND lease_owner=p_payload->>'worker'
  86. AND lease_fence=(p_payload->>'fence')::bigint AND lease_expires_at>clock_timestamp()
  87. RETURNING uid::text,grant_uid::text,request_digest,status INTO r;
  88. IF NOT FOUND THEN RAISE EXCEPTION 'trusted delivery lease conflict'; END IF;
  89. INSERT INTO public.trusted_delivery_receipts(uid,delivery_uid,grant_uid,status,receipt_code,request_digest,response_digest,diff_digest)
  90. VALUES((p_payload->>'receipt_uid')::uuid,r.uid::uuid,r.grant_uid::uuid,'applied',
  91. p_payload->>'receipt_code',r.request_digest,p_payload->>'response_digest',p_payload->>'diff_digest');
  92. UPDATE public.trusted_delivery_grants SET reason_code='provision_applied',
  93. current_version=current_version+1,updated_at=clock_timestamp()
  94. WHERE uid=r.grant_uid::uuid AND status='active'
  95. RETURNING uid::text,status,reason_code,current_version INTO r;
  96. IF NOT FOUND THEN RAISE EXCEPTION 'trusted delivery grant version conflict'; END IF;
  97. RETURN jsonb_build_object('delivery_uid',p_payload->>'uid','status','applied',
  98. 'grant_uid',r.uid,'grant_status',r.status,'reason_code',r.reason_code,
  99. 'current_version',r.current_version);
  100. END IF;
  101. RAISE EXCEPTION 'trusted-delivery runtime write is not permitted';
  102. END $provision$;
  103. CREATE OR REPLACE FUNCTION public.trusted_delivery_runtime_write(
  104. p_operation text,p_payload jsonb
  105. ) RETURNS jsonb LANGUAGE plpgsql SECURITY DEFINER SET search_path=pg_catalog,public AS $wrapper$
  106. BEGIN
  107. IF p_operation IN ('claim_provision','fail_provision','complete_provision') THEN
  108. RETURN public.trusted_delivery_runtime_provision_write(p_operation,p_payload);
  109. END IF;
  110. RETURN public.trusted_delivery_runtime_write_validated493(p_operation,p_payload);
  111. END $wrapper$;
  112. REVOKE ALL ON FUNCTION public.trusted_delivery_runtime_provision_write(text,jsonb) FROM PUBLIC;
  113. REVOKE ALL ON FUNCTION public.trusted_delivery_runtime_write(text,jsonb) FROM PUBLIC;
  114. GRANT EXECUTE ON FUNCTION public.trusted_delivery_runtime_write(text,jsonb) TO dataops_app_runtime;
  115. ALTER FUNCTION public.trusted_delivery_provision_payload_is_closed(text,jsonb) OWNER TO dataops_trusted_delivery_writer;
  116. ALTER FUNCTION public.trusted_delivery_runtime_provision_write(text,jsonb) OWNER TO dataops_trusted_delivery_writer;
  117. ALTER FUNCTION public.trusted_delivery_runtime_write(text,jsonb) OWNER TO dataops_trusted_delivery_writer;
  118. """)
  119. def downgrade() -> None:
  120. op.execute("""
  121. REVOKE EXECUTE ON FUNCTION public.trusted_delivery_runtime_write(text,jsonb) FROM dataops_app_runtime;
  122. DROP FUNCTION public.trusted_delivery_runtime_write(text,jsonb);
  123. DROP FUNCTION public.trusted_delivery_runtime_provision_write(text,jsonb);
  124. ALTER FUNCTION public.trusted_delivery_runtime_write_validated493(text,jsonb)
  125. RENAME TO trusted_delivery_runtime_write;
  126. GRANT EXECUTE ON FUNCTION public.trusted_delivery_runtime_write(text,jsonb) TO dataops_app_runtime;
  127. DROP FUNCTION public.trusted_delivery_provision_payload_is_closed(text,jsonb);
  128. """)