shomei-migrations-0.2.0.1: migrations/shomei/0039-enforce-new-field-budgets.sql
-- Bound new/changed values without rechecking unchanged legacy identity fields.
SET LOCAL search_path = pg_catalog, pg_temp;
CREATE OR REPLACE FUNCTION shomei.enforce_field_budgets() RETURNS trigger
LANGUAGE plpgsql SET search_path = pg_catalog, pg_temp AS $$
DECLARE
incoming jsonb := to_jsonb(NEW);
previous jsonb := '{}'::jsonb;
field text;
budget integer;
BEGIN
IF TG_OP = 'UPDATE' THEN previous := to_jsonb(OLD); END IF;
FOREACH field IN ARRAY ARRAY['login_id', 'email', 'display_name', 'label', 'role'] LOOP
IF incoming ? field AND incoming->field IS DISTINCT FROM previous->field THEN
budget := CASE field WHEN 'login_id' THEN 256 WHEN 'email' THEN 254
WHEN 'display_name' THEN 256 ELSE 128 END;
IF (CASE WHEN field = 'email' THEN octet_length(incoming->>field)
ELSE char_length(incoming->>field) END) > budget THEN
RAISE EXCEPTION 'field size exceeds new-write budget' USING ERRCODE = '22001';
END IF;
END IF;
END LOOP;
IF incoming ? 'allowed_scopes' AND incoming->'allowed_scopes' IS DISTINCT FROM previous->'allowed_scopes' THEN
IF EXISTS (SELECT 1 FROM jsonb_array_elements_text(incoming->'allowed_scopes') AS s(value)
WHERE char_length(value) > 128) THEN
RAISE EXCEPTION 'scope size exceeds new-write budget' USING ERRCODE = '22001';
END IF;
END IF;
RETURN NEW;
END;
$$;
CREATE TRIGGER enforce_field_budgets BEFORE INSERT OR UPDATE ON shomei.shomei_users
FOR EACH ROW EXECUTE FUNCTION shomei.enforce_field_budgets();
CREATE TRIGGER enforce_field_budgets BEFORE INSERT OR UPDATE ON shomei.shomei_password_credentials
FOR EACH ROW EXECUTE FUNCTION shomei.enforce_field_budgets();
CREATE TRIGGER enforce_field_budgets BEFORE INSERT OR UPDATE ON shomei.shomei_webauthn_credentials
FOR EACH ROW EXECUTE FUNCTION shomei.enforce_field_budgets();
CREATE TRIGGER enforce_field_budgets BEFORE INSERT OR UPDATE ON shomei.shomei_roles
FOR EACH ROW EXECUTE FUNCTION shomei.enforce_field_budgets();
CREATE TRIGGER enforce_field_budgets BEFORE INSERT OR UPDATE ON shomei.shomei_role_grants
FOR EACH ROW EXECUTE FUNCTION shomei.enforce_field_budgets();
CREATE TRIGGER enforce_field_budgets BEFORE INSERT OR UPDATE ON shomei.shomei_oauth_clients
FOR EACH ROW EXECUTE FUNCTION shomei.enforce_field_budgets();
CREATE TRIGGER enforce_field_budgets BEFORE INSERT OR UPDATE ON shomei.shomei_service_accounts
FOR EACH ROW EXECUTE FUNCTION shomei.enforce_field_budgets();