| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- """Persist P3-WP06 trusted-delivery grants without external credentials or raw data."""
- from alembic import op
- revision = "20260811_481"
- down_revision = "20260811_480"
- branch_labels = None
- depends_on = None
- def upgrade() -> None:
- op.execute(
- """
- CREATE TABLE public.trusted_delivery_policy_versions (
- uid UUID PRIMARY KEY, code VARCHAR(120) NOT NULL, version VARCHAR(30) NOT NULL,
- status VARCHAR(20) NOT NULL CHECK(status IN ('draft','active','retired')),
- selector JSONB NOT NULL, resource_rules JSONB NOT NULL,
- created_by UUID NOT NULL REFERENCES public.users(id), current_version INTEGER NOT NULL DEFAULT 1 CHECK(current_version>0),
- created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(),
- UNIQUE(code,version), CHECK(jsonb_typeof(selector)='object'), CHECK(jsonb_typeof(resource_rules)='object')
- );
- CREATE UNIQUE INDEX uq_trusted_delivery_active_policy ON public.trusted_delivery_policy_versions(code) WHERE status='active';
- CREATE TABLE public.trusted_delivery_grants (
- uid UUID PRIMARY KEY, policy_uid UUID NOT NULL REFERENCES public.trusted_delivery_policy_versions(uid),
- subject_uid UUID NOT NULL REFERENCES public.users(id), asset_uid UUID NOT NULL,
- provider VARCHAR(20) NOT NULL CHECK(provider IN ('database','api','file','iam','kms','dlp','siem')),
- idempotency_key VARCHAR(160) NOT NULL UNIQUE, request_digest CHAR(64) NOT NULL CHECK(request_digest ~ '^[0-9a-f]{64}$'),
- expires_at TIMESTAMPTZ NOT NULL, status VARCHAR(20) NOT NULL CHECK(status IN ('active','revoked','failed','held')),
- reason_code VARCHAR(80) NOT NULL, current_version INTEGER NOT NULL DEFAULT 1 CHECK(current_version>0),
- created_by UUID NOT NULL REFERENCES public.users(id), created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(), updated_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()
- );
- CREATE INDEX ix_trusted_delivery_grants_expiry ON public.trusted_delivery_grants(status,expires_at);
- CREATE TABLE public.trusted_delivery_deliveries (
- uid UUID PRIMARY KEY, grant_uid UUID NOT NULL REFERENCES public.trusted_delivery_grants(uid),
- idempotency_key VARCHAR(160) NOT NULL UNIQUE, request_digest CHAR(64) NOT NULL CHECK(request_digest ~ '^[0-9a-f]{64}$'),
- status VARCHAR(20) NOT NULL CHECK(status IN ('pending','processing','applied','dead_letter')),
- attempt_count INTEGER NOT NULL DEFAULT 0 CHECK(attempt_count BETWEEN 0 AND 3), next_attempt_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(),
- lease_owner VARCHAR(80), lease_fence BIGINT NOT NULL DEFAULT 0 CHECK(lease_fence>=0), lease_expires_at TIMESTAMPTZ,
- created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(), updated_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(),
- CHECK((status='processing')=(lease_owner IS NOT NULL AND lease_expires_at IS NOT NULL))
- );
- CREATE INDEX ix_trusted_delivery_delivery_claim ON public.trusted_delivery_deliveries(status,next_attempt_at);
- CREATE TABLE public.trusted_delivery_receipts (
- uid UUID PRIMARY KEY, delivery_uid UUID NOT NULL UNIQUE REFERENCES public.trusted_delivery_deliveries(uid),
- grant_uid UUID NOT NULL REFERENCES public.trusted_delivery_grants(uid), status VARCHAR(20) NOT NULL CHECK(status IN ('applied','failed')),
- receipt_code VARCHAR(120) NOT NULL, request_digest CHAR(64) NOT NULL CHECK(request_digest ~ '^[0-9a-f]{64}$'),
- response_digest CHAR(64) NOT NULL CHECK(response_digest ~ '^[0-9a-f]{64}$'), diff_digest CHAR(64) NOT NULL CHECK(diff_digest ~ '^[0-9a-f]{64}$'),
- created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()
- );
- CREATE OR REPLACE FUNCTION public.protect_trusted_delivery_receipt() RETURNS trigger LANGUAGE plpgsql AS $$
- BEGIN RAISE EXCEPTION 'trusted delivery receipt is append-only'; END $$;
- CREATE TRIGGER trg_trusted_delivery_receipt_append_only BEFORE UPDATE OR DELETE OR TRUNCATE ON public.trusted_delivery_receipts FOR EACH STATEMENT EXECUTE FUNCTION public.protect_trusted_delivery_receipt();
- CREATE TABLE public.trusted_delivery_legal_holds (
- uid UUID PRIMARY KEY, asset_uid UUID NOT NULL, operation VARCHAR(30) NOT NULL CHECK(operation IN ('freeze','export_review','destruction_review')),
- status VARCHAR(20) NOT NULL CHECK(status IN ('pending','active','released')),
- approver_ref_one VARCHAR(200) NOT NULL, approver_ref_two VARCHAR(200) NOT NULL, evidence_digest CHAR(64) NOT NULL CHECK(evidence_digest ~ '^[0-9a-f]{64}$'),
- created_by UUID NOT NULL REFERENCES public.users(id), current_version INTEGER NOT NULL DEFAULT 1 CHECK(current_version>0), created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(),
- CHECK(approver_ref_one<>approver_ref_two)
- );
- CREATE UNIQUE INDEX uq_trusted_delivery_active_hold ON public.trusted_delivery_legal_holds(asset_uid) WHERE status='active';
- CREATE TABLE public.trusted_delivery_evidence (
- uid UUID PRIMARY KEY, action VARCHAR(80) NOT NULL, actor_uid UUID NOT NULL REFERENCES public.users(id),
- safe_detail JSONB NOT NULL DEFAULT '{}'::jsonb, created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(), CHECK(jsonb_typeof(safe_detail)='object')
- );
- CREATE OR REPLACE FUNCTION public.protect_trusted_delivery_evidence() RETURNS trigger LANGUAGE plpgsql AS $$
- BEGIN RAISE EXCEPTION 'trusted delivery evidence is append-only'; END $$;
- CREATE TRIGGER trg_trusted_delivery_evidence_append_only BEFORE UPDATE OR DELETE OR TRUNCATE ON public.trusted_delivery_evidence FOR EACH STATEMENT EXECUTE FUNCTION public.protect_trusted_delivery_evidence();
- """
- )
- def downgrade() -> None:
- op.execute(
- """DO $$ BEGIN
- IF EXISTS(SELECT 1 FROM public.trusted_delivery_policy_versions) OR EXISTS(SELECT 1 FROM public.trusted_delivery_grants)
- OR EXISTS(SELECT 1 FROM public.trusted_delivery_deliveries) OR EXISTS(SELECT 1 FROM public.trusted_delivery_receipts)
- OR EXISTS(SELECT 1 FROM public.trusted_delivery_legal_holds) OR EXISTS(SELECT 1 FROM public.trusted_delivery_evidence) THEN
- RAISE EXCEPTION 'downgrade requires approved archival migration';
- END IF;
- END $$;
- DROP TABLE public.trusted_delivery_evidence;
- DROP FUNCTION public.protect_trusted_delivery_evidence();
- DROP TABLE public.trusted_delivery_legal_holds;
- DROP TABLE public.trusted_delivery_receipts;
- DROP FUNCTION public.protect_trusted_delivery_receipt();
- DROP TABLE public.trusted_delivery_deliveries;
- DROP TABLE public.trusted_delivery_grants;
- DROP TABLE public.trusted_delivery_policy_versions;"""
- )
|