Add length validations for bytes columns to conan packages related tables
🏗️ What does this MR do and why?
Add length validations for conan package format columns to prevent storing arbitrarily large data.
- Add 40 character length limit validations to
reference,revisioncolumns - Supplement existing test cases
Changelog: changed
📝 Database migrations
This MR adds database-level check constraints to three tables:
packages_conan_recipe_revisions
⬆️ Up
> gdk rails db:migrate:up:main VERSION=20260210111821
main: == [advisory_lock_connection] object_id: 134100, pg_backend_pid: 56518
main: == 20260210111821 AddCheckConstraintConanRecipeRevisionsRevisionLength: migrating
main: -- transaction_open?(nil)
main: -> 0.0000s
main: -- transaction_open?(nil)
main: -> 0.0000s
main: -- execute("ALTER TABLE packages_conan_recipe_revisions\nADD CONSTRAINT check_revision_length\nCHECK ( octet_length(revision) <= 20 )\nNOT VALID;\n")
main: -> 0.0032s
main: == 20260210111821 AddCheckConstraintConanRecipeRevisionsRevisionLength: migrated (0.0910s)
main: == [advisory_lock_connection] object_id: 134100, pg_backend_pid: 56518
⬇️ Down
> gdk rails db:migrate:down:main VERSION=20260210111821
main: == [advisory_lock_connection] object_id: 134100, pg_backend_pid: 52416
main: == 20260210111821 AddCheckConstraintConanRecipeRevisionsRevisionLength: reverting
main: -- transaction_open?(nil)
main: -> 0.0000s
main: -- transaction_open?(nil)
main: -> 0.0000s
main: -- execute(" ALTER TABLE packages_conan_recipe_revisions\n DROP CONSTRAINT IF EXISTS check_revision_length\n")
main: -> 0.0020s
main: == 20260210111821 AddCheckConstraintConanRecipeRevisionsRevisionLength: reverted (0.0449s)
main: == [advisory_lock_connection] object_id: 134100, pg_backend_pid: 52416
packages_conan_package_references
⬆️ Up
> gdk rails db:migrate:up:main VERSION=20260210111925
main: == [advisory_lock_connection] object_id: 134100, pg_backend_pid: 60543
main: == 20260210111925 AddCheckConstraintConanPackageReferencesReferenceLength: migrating
main: -- transaction_open?(nil)
main: -> 0.0000s
main: -- transaction_open?(nil)
main: -> 0.0000s
main: -- execute("ALTER TABLE packages_conan_package_references\nADD CONSTRAINT check_reference_length\nCHECK ( octet_length(reference) <= 20 )\nNOT VALID;\n")
main: -> 0.0020s
main: == 20260210111925 AddCheckConstraintConanPackageReferencesReferenceLength: migrated (0.0660s)
main: == [advisory_lock_connection] object_id: 134100, pg_backend_pid: 60543
⬇️ Down
> gdk rails db:migrate:down:main VERSION=20260210111925
main: == [advisory_lock_connection] object_id: 134100, pg_backend_pid: 48357
main: == 20260210111925 AddCheckConstraintConanPackageReferencesReferenceLength: reverting
main: -- transaction_open?(nil)
main: -> 0.0000s
main: -- transaction_open?(nil)
main: -> 0.0000s
main: -- execute(" ALTER TABLE packages_conan_package_references\n DROP CONSTRAINT IF EXISTS check_reference_length\n")
main: -> 0.0012s
main: == 20260210111925 AddCheckConstraintConanPackageReferencesReferenceLength: reverted (0.0231s)
main: == [advisory_lock_connection] object_id: 134100, pg_backend_pid: 48357
packages_conan_package_revisions
⬆️ Up
> gdk rails db:migrate:up:main VERSION=20260210111943
main: == [advisory_lock_connection] object_id: 134100, pg_backend_pid: 64578
main: == 20260210111943 AddCheckConstraintConanPackageRevisionsRevisionLength: migrating
main: -- transaction_open?(nil)
main: -> 0.0000s
main: -- transaction_open?(nil)
main: -> 0.0000s
main: -- execute("ALTER TABLE packages_conan_package_revisions\nADD CONSTRAINT check_revision_length\nCHECK ( octet_length(revision) <= 20 )\nNOT VALID;\n")
main: -> 0.0019s
main: == 20260210111943 AddCheckConstraintConanPackageRevisionsRevisionLength: migrated (0.0586s)
main: == [advisory_lock_connection] object_id: 134100, pg_backend_pid: 64578
⬇️ Down
> gdk rails db:migrate:down:main VERSION=20260210111943
main: == [advisory_lock_connection] object_id: 134080, pg_backend_pid: 44300
main: == 20260210111943 AddCheckConstraintConanPackageRevisionsRevisionLength: reverting
main: -- transaction_open?(nil)
main: -> 0.0000s
main: -- transaction_open?(nil)
main: -> 0.0000s
main: -- execute(" ALTER TABLE packages_conan_package_revisions\n DROP CONSTRAINT IF EXISTS check_revision_length\n")
main: -> 0.0085s
main: == 20260210111943 AddCheckConstraintConanPackageRevisionsRevisionLength: reverted (0.0349s)
main: == [advisory_lock_connection] object_id: 134080, pg_backend_pid: 44300
📚 References
📸 Screenshots or screen recordings
N/A
🧪 How to set up and validate locally
-
Open Rails console:
gdk rails c -
Test
Packages::Conan::PackageReferencevalidation:package_reference = FactoryBot.build(:conan_package_reference) package_reference.valid? # Should be true package_reference.reference = 'A' * 21 package_reference.valid? # Should be false -
Test
Packages::Conan::PackageRevisionvalidation:package_revision = FactoryBot.build(:conan_package_revision) package_revision.valid? # Should be true package_revision.revision = 'B' * 21 package_revision.valid? # Should be false -
Test
Packages::Conan::RecipeRevisionvalidation:recipe_revision = FactoryBot.build(:conan_recipe_revision) recipe_revision.valid? # Should be true recipe_revision.revision = 'C' * 21 recipe_revision.valid? # Should be false
✅ MR acceptance checklist
Evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.
Edited by Sylvia Shen