From 51ff679b9deb559ddc53cdfa6265b996f6c7fd5e Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Mon, 1 Jun 2020 03:47:20 +0200
Subject: Fix admin page crashing when trying to block an invalid domain name
 (#13884)

* Fix admin page crashing when trying to block an invalid domain name

Fixes #13880

* Fix trailing and leading spaces not being properly stripped for domain blocks
---
 app/models/concerns/domain_normalizable.rb | 2 +-
 app/models/domain_block.rb                 | 4 +++-
 2 files changed, 4 insertions(+), 2 deletions(-)

(limited to 'app/models')

diff --git a/app/models/concerns/domain_normalizable.rb b/app/models/concerns/domain_normalizable.rb
index c00b3142f..fb84058fc 100644
--- a/app/models/concerns/domain_normalizable.rb
+++ b/app/models/concerns/domain_normalizable.rb
@@ -4,7 +4,7 @@ module DomainNormalizable
   extend ActiveSupport::Concern
 
   included do
-    before_save :normalize_domain
+    before_validation :normalize_domain
   end
 
   private
diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb
index f0a5bd296..2b18e01fa 100644
--- a/app/models/domain_block.rb
+++ b/app/models/domain_block.rb
@@ -50,11 +50,13 @@ class DomainBlock < ApplicationRecord
     def rule_for(domain)
       return if domain.blank?
 
-      uri      = Addressable::URI.new.tap { |u| u.host = domain.gsub(/[\/]/, '') }
+      uri      = Addressable::URI.new.tap { |u| u.host = domain.strip.gsub(/[\/]/, '') }
       segments = uri.normalized_host.split('.')
       variants = segments.map.with_index { |_, i| segments[i..-1].join('.') }
 
       where(domain: variants).order(Arel.sql('char_length(domain) desc')).first
+    rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError
+      nil
     end
   end
 
-- 
cgit