Add ability to manage which websites can credit you in link previews (#31819)
This commit is contained in:
		@@ -1,22 +1,29 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class DomainValidator < ActiveModel::EachValidator
 | 
			
		||||
  MAX_DOMAIN_LENGTH = 256
 | 
			
		||||
  MIN_LABEL_LENGTH = 1
 | 
			
		||||
  MAX_LABEL_LENGTH = 63
 | 
			
		||||
  ALLOWED_CHARACTERS_RE = /^[a-z0-9\-]+$/i
 | 
			
		||||
 | 
			
		||||
  def validate_each(record, attribute, value)
 | 
			
		||||
    return if value.blank?
 | 
			
		||||
 | 
			
		||||
    domain = if options[:acct]
 | 
			
		||||
               value.split('@').last
 | 
			
		||||
             else
 | 
			
		||||
               value
 | 
			
		||||
             end
 | 
			
		||||
    (options[:multiline] ? value.split : [value]).each do |domain|
 | 
			
		||||
      _, domain = domain.split('@') if options[:acct]
 | 
			
		||||
 | 
			
		||||
    record.errors.add(attribute, I18n.t('domain_validator.invalid_domain')) unless compliant?(domain)
 | 
			
		||||
      next if domain.blank?
 | 
			
		||||
 | 
			
		||||
      record.errors.add(attribute, options[:multiline] ? :invalid_domain_on_line : :invalid, value: domain) unless compliant?(domain)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def compliant?(value)
 | 
			
		||||
    Addressable::URI.new.tap { |uri| uri.host = value }
 | 
			
		||||
    uri = Addressable::URI.new
 | 
			
		||||
    uri.host = value
 | 
			
		||||
    uri.normalized_host.size < MAX_DOMAIN_LENGTH && uri.normalized_host.split('.').all? { |label| label.size.between?(MIN_LABEL_LENGTH, MAX_LABEL_LENGTH) && label =~ ALLOWED_CHARACTERS_RE }
 | 
			
		||||
  rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError
 | 
			
		||||
    false
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								app/validators/lines_validator.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								app/validators/lines_validator.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class LinesValidator < ActiveModel::EachValidator
 | 
			
		||||
  def validate_each(record, attribute, value)
 | 
			
		||||
    return if value.blank?
 | 
			
		||||
 | 
			
		||||
    record.errors.add(attribute, :too_many_lines, limit: options[:maximum]) if options[:maximum].present? && value.split.size > options[:maximum]
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
		Reference in New Issue
	
	Block a user