diff --git a/app/models/domain.rb b/app/models/domain.rb index d5133b8f1..2d43881d5 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -5,6 +5,8 @@ class Domain < ActiveRecord::Base belongs_to :technical_contact, class_name: 'Contact' belongs_to :admin_contact, class_name: 'Contact' + validates :name, domain_name: true + class << self def check_availability(domains) res = [] diff --git a/app/validators/domain_name_validator.rb b/app/validators/domain_name_validator.rb new file mode 100644 index 000000000..95ebe56c1 --- /dev/null +++ b/app/validators/domain_name_validator.rb @@ -0,0 +1,10 @@ +class DomainNameValidator < ActiveModel::EachValidator + def validate_each(record, attribute, value) + ok = value =~ /\A[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]\.ee\z/ + ok &&= !(value[2] == '-' && value[3] == '-') + + unless ok + record.errors[attribute] << (options[:message] || 'invalid format') + end + end +end diff --git a/config/initializers/load_validators.rb b/config/initializers/load_validators.rb new file mode 100644 index 000000000..fc1b433dc --- /dev/null +++ b/config/initializers/load_validators.rb @@ -0,0 +1 @@ +Dir[File.join(Rails.root, "app", "validators", "*.rb")].each {|x| require x } diff --git a/spec/models/domain_spec.rb b/spec/models/domain_spec.rb index 0030db26b..62f0246dc 100644 --- a/spec/models/domain_spec.rb +++ b/spec/models/domain_spec.rb @@ -10,5 +10,17 @@ describe Domain do it 'creates a resource' do d = Fabricate(:domain) expect(d.name).to_not be_nil + + invalid = ['a.ee', "#{'a' * 64}.ee", 'ab.eu', 'test.ab.ee', '-test.ee', '-test-.ee', 'test-.ee', 'te--st.ee'] + + invalid.each do |x| + expect(Fabricate.build(:domain, name: x).valid?).to be false + end + + valid = ['ab.ee', "#{'a' * 63}.ee", 'te-s-t.ee'] + + valid.each do |x| + expect(Fabricate.build(:domain, name: x).valid?).to be true + end end end