FIX: Reject invalid Category slugs (#9473)

Previously it would sanitize given slug and then save the resulting empty slug.
This commit is contained in:
Jarek Radosz 2020-04-21 03:50:50 +02:00 committed by GitHub
parent 17cf300b71
commit a781ef7662
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 11 additions and 10 deletions

View File

@ -343,7 +343,12 @@ class Category < ActiveRecord::Base
slug = SiteSetting.slug_generation_method == 'encoded' ? CGI.unescape(self.slug) : self.slug
# sanitize the custom slug
self.slug = Slug.sanitize(slug)
errors.add(:slug, 'is already in use') if duplicate_slug?
if self.slug.blank?
errors.add(:slug, :invalid)
elsif duplicate_slug?
errors.add(:slug, 'is already in use')
end
else
# auto slug
self.slug = Slug.for(name, '')

View File

@ -481,8 +481,9 @@ describe CategoriesController do
end
it 'rejects invalid custom slug' do
put "/category/#{category.id}/slug.json", params: { slug: ' ' }
put "/category/#{category.id}/slug.json", params: { slug: '.' }
expect(response.status).to eq(422)
expect(response.parsed_body["errors"]).to eq(["Slug is invalid"])
end
end
end

View File

@ -376,14 +376,9 @@ RSpec.describe ListController do
# One category has another category's id at the beginning of its name
let!(:other_category) {
# Our validations don't allow this to happen now, but did historically
Fabricate(:category_with_definition, name: "#{category.id} name", slug: '-').tap { |c|
DB.exec <<~SQL
UPDATE categories
SET slug = '#{category.id}-name'
WHERE id = #{c.id}
SQL
c.reload
}
Fabricate(:category_with_definition, name: "#{category.id} name", slug: 'will-be-changed').tap do |category|
category.update_column(:slug, "#{category.id}-name")
end
}
it 'uses the correct category' do