* Make custom emoji domains case sensitive #9351 * Fixup style in downcase_domain to comply with codeclimate. * switch if! to unless * Don't use transactions, operate in batches. Also revert spurious schema change.
This commit is contained in:
		
							parent
							
								
									dbb1ee269f
								
							
						
					
					
						commit
						7d00e4edbd
					
				| 
						 | 
					@ -31,6 +31,8 @@ class CustomEmoji < ApplicationRecord
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  has_attached_file :image, styles: { static: { format: 'png', convert_options: '-coalesce -strip' } }
 | 
					  has_attached_file :image, styles: { static: { format: 'png', convert_options: '-coalesce -strip' } }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  before_validation :downcase_domain
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  validates_attachment :image, content_type: { content_type: 'image/png' }, presence: true, size: { less_than: LIMIT }
 | 
					  validates_attachment :image, content_type: { content_type: 'image/png' }, presence: true, size: { less_than: LIMIT }
 | 
				
			||||||
  validates :shortcode, uniqueness: { scope: :domain }, format: { with: /\A#{SHORTCODE_RE_FRAGMENT}\z/ }, length: { minimum: 2 }
 | 
					  validates :shortcode, uniqueness: { scope: :domain }, format: { with: /\A#{SHORTCODE_RE_FRAGMENT}\z/ }, length: { minimum: 2 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,4 +75,8 @@ class CustomEmoji < ApplicationRecord
 | 
				
			||||||
  def remove_entity_cache
 | 
					  def remove_entity_cache
 | 
				
			||||||
    Rails.cache.delete(EntityCache.instance.to_key(:emoji, shortcode, domain))
 | 
					    Rails.cache.delete(EntityCache.instance.to_key(:emoji, shortcode, domain))
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def downcase_domain
 | 
				
			||||||
 | 
					    self.domain = domain.downcase unless domain.nil?
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,7 @@ class CustomEmojiFilter
 | 
				
			||||||
    when 'remote'
 | 
					    when 'remote'
 | 
				
			||||||
      CustomEmoji.remote
 | 
					      CustomEmoji.remote
 | 
				
			||||||
    when 'by_domain'
 | 
					    when 'by_domain'
 | 
				
			||||||
      CustomEmoji.where(domain: value)
 | 
					      CustomEmoji.where(domain: value.downcase)
 | 
				
			||||||
    when 'shortcode'
 | 
					    when 'shortcode'
 | 
				
			||||||
      CustomEmoji.search(value)
 | 
					      CustomEmoji.search(value)
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,7 @@
 | 
				
			||||||
 | 
					class DowncaseCustomEmojiDomains < ActiveRecord::Migration[5.2]
 | 
				
			||||||
 | 
					  disable_ddl_transaction!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def change
 | 
				
			||||||
 | 
					    CustomEmoji.in_batches.update_all('domain = lower(domain)')
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -10,7 +10,7 @@
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# It's strongly recommended that you check this file into your version control system.
 | 
					# It's strongly recommended that you check this file into your version control system.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ActiveRecord::Schema.define(version: 2018_12_04_215309) do
 | 
					ActiveRecord::Schema.define(version: 2018_12_07_011115) do
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # These are extensions that must be enabled in order to support this database
 | 
					  # These are extensions that must be enabled in order to support this database
 | 
				
			||||||
  enable_extension "plpgsql"
 | 
					  enable_extension "plpgsql"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -75,4 +75,13 @@ RSpec.describe CustomEmoji, type: :model do
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'pre_validation' do
 | 
				
			||||||
 | 
					    let(:custom_emoji) { Fabricate(:custom_emoji, domain: 'wWw.MaStOdOn.CoM') }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it 'should downcase' do
 | 
				
			||||||
 | 
					      custom_emoji.valid?
 | 
				
			||||||
 | 
					      expect(custom_emoji.domain).to eq('www.mastodon.com')
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue