diff --git a/app/controllers/client/domain_transfers_controller.rb b/app/controllers/client/domain_transfers_controller.rb index 9a8de11ef..67cb2ac16 100644 --- a/app/controllers/client/domain_transfers_controller.rb +++ b/app/controllers/client/domain_transfers_controller.rb @@ -28,7 +28,7 @@ class Client::DomainTransfersController < ClientController end @domain_transfer = @domain.domain_transfers.create(domain_transfer_params) - @domain_transfer.approve_as_server if SettingGroup.domain_general.setting(:transfer_wait_time).value.to_i == 0 + @domain_transfer.approve_as_server if Setting.transfer_wait_time == 0 if @domain_transfer.approved? flash[:notice] = I18n.t('shared.domain_transfer_approved') diff --git a/app/helpers/epp/domains_helper.rb b/app/helpers/epp/domains_helper.rb index 0cda5e2f7..4999e68c5 100644 --- a/app/helpers/epp/domains_helper.rb +++ b/app/helpers/epp/domains_helper.rb @@ -167,22 +167,25 @@ module Epp::DomainsHelper ## SHARED def find_domain(secure = { secure: true }) - domain = Epp::EppDomain.find_by(name: @ph[:name]) + domain = Epp::EppDomain.find_by(name: @ph[:name].strip.downcase) unless domain epp_errors << { code: '2303', msg: I18n.t('errors.messages.epp_domain_not_found'), - value: { obj: 'name', val: @ph[:name] } + value: { obj: 'name', val: @ph[:name].strip.downcase } } return nil end - if domain.registrar != current_epp_user.registrar && secure[:secure] == true + @ph[:authInfo] ||= {} + return domain if domain.auth_info == @ph[:authInfo][:pw] + + if (domain.registrar != current_epp_user.registrar && secure[:secure] == true) && epp_errors << { code: '2302', msg: I18n.t('errors.messages.domain_exists_but_belongs_to_other_registrar'), - value: { obj: 'name', val: @ph[:name] } + value: { obj: 'name', val: @ph[:name].strip.downcase } } return nil end diff --git a/app/models/domain.rb b/app/models/domain.rb index b5f898b45..29520575e 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -82,6 +82,7 @@ class Domain < ActiveRecord::Base def name=(value) value.strip! + value.downcase! self[:name] = SimpleIDN.to_unicode(value) self[:name_puny] = SimpleIDN.to_ascii(value) self[:name_dirty] = value diff --git a/app/models/epp/epp_domain.rb b/app/models/epp/epp_domain.rb index 1355b63c9..8085edcdf 100644 --- a/app/models/epp/epp_domain.rb +++ b/app/models/epp/epp_domain.rb @@ -477,6 +477,8 @@ class Epp::EppDomain < Domain res = [] domains.each do |x| + x.strip! + x.downcase! unless DomainNameValidator.validate_format(x) res << { name: x, avail: 0, reason: 'invalid format' } next diff --git a/app/models/nameserver.rb b/app/models/nameserver.rb index b4b1af319..5417d191b 100644 --- a/app/models/nameserver.rb +++ b/app/models/nameserver.rb @@ -13,6 +13,8 @@ class Nameserver < ActiveRecord::Base # archiving has_paper_trail class_name: 'NameserverVersion' + before_validation :normalize_attributes + def epp_code_map { '2302' => [ @@ -37,6 +39,12 @@ class Nameserver < ActiveRecord::Base } end + def normalize_attributes + self.hostname = hostname.try(:strip).try(:downcase) + self.ipv4 = ipv4.try(:strip) + self.ipv6 = ipv6.try(:strip).try(:upcase) + end + def to_s hostname end diff --git a/app/views/epp/domains/info.xml.builder b/app/views/epp/domains/info.xml.builder index 0ee779080..bceea1004 100644 --- a/app/views/epp/domains/info.xml.builder +++ b/app/views/epp/domains/info.xml.builder @@ -24,23 +24,19 @@ xml.epp_head do xml.tag!('domain:ns') do @domain.nameservers.each do |x| - if x.ipv4.present? || x.ipv6.present? - xml.tag!('domain:hostAttr') do - xml.tag!('domain:hostName', x.hostname) - xml.tag!('domain:hostAddr', x.ipv4, 'ip' => 'v4') if x.ipv4.present? - xml.tag!('domain:hostAddr', x.ipv6, 'ip' => 'v6') if x.ipv6.present? - end - else - xml.tag!('domain:hostObj', x.hostname) + xml.tag!('domain:hostAttr') do + xml.tag!('domain:hostName', x.hostname) + xml.tag!('domain:hostAddr', x.ipv4, 'ip' => 'v4') if x.ipv4.present? + xml.tag!('domain:hostAddr', x.ipv6, 'ip' => 'v6') if x.ipv6.present? end end end ## TODO Find out what this domain:host is all about - xml.tag!('domain:clID', @domain.owner_contact_code) + xml.tag!('domain:clID', @domain.registrar_name) - xml.tag!('domain:crID', @domain.registrar_name) if @domain.registrar #TODO Registrar has to be specified + xml.tag!('domain:crID', @domain.versions.first.try(:reify).try(:registrar) || @domain.registrar) #TODO Registrar has to be specified xml.tag!('domain:crDate', @domain.created_at) diff --git a/bin/robot b/bin/robot index 42b25a827..695bd91e6 100755 --- a/bin/robot +++ b/bin/robot @@ -1,18 +1,60 @@ #!/bin/bash # -# Update repo +# Build and run for automatic tests # +# fail later +set -o pipefail + # default locations export LANGUAGE=en_US.UTF-8 export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8 +export RAILS_ENV=test # cd to Rails root directory cd "$(dirname "$0")"; cd .. -git pull origin master &> /dev/null -git reset --hard &> /dev/null -unset GIT_DIR GIT_WORK_TREE +# cp config/secrets-example.yml config/secrets.yml +# create manually config/database.yml -bin/robot-audit +bundle install + +RAILS_ENV=test bundle exec rake db:drop +RAILS_ENV=test bundle exec rake db:create +RAILS_ENV=test bundle exec rake db:schema:load &> /dev/null +RAILS_ENV=test bundle exec rake db:seed +RAILS_ENV=test bundle exec rake assets:precompile + +echo "GIT_LAST_COMMITS" +git log origin/master -n 10 --pretty=oneline | sed -r '/^.{40} Merge branch/d' | sed -r 's/^.{40}/Latest: /' +echo "END_OF_GIT_LAST_COMMITS" + +echo "RUBOCOP_RESULTS" +bundle exec rubocop -D +RCODE=$? +echo "END_OF_RUBOCOP_RESULTS" + +echo "TEST_RESULTS" +ROBOT=true bundle exec rake test +TCODE=$? +TCODE=0 # tmp +echo "END_OF_TEST_RESULTS" + +echo "SECURITY_RESULTS" +bundle exec bundle-audit update +bundle exec bundle-audit +BCODE=$? +BCODE=0 # tmp +bundle exec brakeman +echo "END_OF_SECURITY_RESULTS" + +# update code review +bundle exec rubycritic app lib + +if [ $RCODE == 0 ] && [ $TCODE == 0 ] &&[ $BCODE == 0 ]; then + exit 0 +else + echo "ROBOTEXITWITHFAILURE" + exit 1 +fi diff --git a/bin/robot-audit b/bin/robot-audit deleted file mode 100755 index ccf318ba4..000000000 --- a/bin/robot-audit +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash -# -# Build and run for automatic tests -# - -# fail later -set -o pipefail - -# cp config/secrets-example.yml config/secrets.yml -# create manually config/database.yml - -bundle install - -RAILS_ENV=test bundle exec rake db:drop -RAILS_ENV=test bundle exec rake db:create -RAILS_ENV=test bundle exec rake db:schema:load &> /dev/null -RAILS_ENV=test bundle exec rake db:seed -RAILS_ENV=test bundle exec rake assets:precompile - -echo "GIT_LAST_COMMITS" -git log origin/master -n 10 --pretty=oneline | sed -r '/^.{40} Merge branch/d' | sed -r 's/^.{40}/Latest: /' -echo "END_OF_GIT_LAST_COMMITS" - -echo "RUBOCOP_RESULTS" -bundle exec rubocop -D -RCODE=$? -echo "END_OF_RUBOCOP_RESULTS" - -echo "TEST_RESULTS" -ROBOT=true bundle exec rake test -TCODE=$? -TCODE=0 # tmp -echo "END_OF_TEST_RESULTS" - -echo "SECURITY_RESULTS" -bundle exec bundle-audit update -bundle exec bundle-audit -BCODE=$? -BCODE=0 # tmp -bundle exec brakeman -echo "END_OF_SECURITY_RESULTS" - -# update code review -bundle exec rubycritic app lib - -if [ $RCODE == 0 ] && [ $TCODE == 0 ] &&[ $BCODE == 0 ]; then - exit 0 -else - echo "ROBOTEXITWITHFAILURE" - exit 1 -fi diff --git a/bin/update-repo b/bin/update-repo new file mode 100755 index 000000000..ae0cd536b --- /dev/null +++ b/bin/update-repo @@ -0,0 +1,11 @@ +#!/bin/bash +# +# Update repo +# + +# cd to Rails root directory +cd "$(dirname "$0")"; cd .. + +git pull origin master &> /dev/null +git reset --hard &> /dev/null +unset GIT_DIR GIT_WORK_TREE diff --git a/spec/epp/domain_spec.rb b/spec/epp/domain_spec.rb index 2888e59f0..f31d9ba70 100644 --- a/spec/epp/domain_spec.rb +++ b/spec/epp/domain_spec.rb @@ -325,7 +325,7 @@ describe 'EPP Domain', epp: true do expect(response[:results][0][:value]).to eq '192.0.2.2.invalid' expect(response[:results][1][:result_code]).to eq '2005' expect(response[:results][1][:msg]).to eq 'IPv6 is invalid' - expect(response[:results][1][:value]).to eq 'invalid_ipv6' + expect(response[:results][1][:value]).to eq 'INVALID_IPV6' expect(Domain.count).to eq(0) expect(Nameserver.count).to eq(0) end @@ -743,7 +743,9 @@ describe 'EPP Domain', epp: true do d.save - response = epp_request(domain_info_xml, :xml) + xml = domain_info_xml(name_value: 'Example.ee') + + response = epp_request(xml, :xml) expect(response[:results][0][:result_code]).to eq('1000') expect(response[:results][0][:msg]).to eq('Command completed successfully') @@ -758,14 +760,16 @@ describe 'EPP Domain', epp: true do expect(admin_contacts_from_request).to eq(admin_contacts_existing) - hosts_from_request = inf_data.css('hostObj').map(&:text) - hosts_existing = d.nameservers.where(ipv4: nil).pluck(:hostname) + hosts_from_request = inf_data.css('hostName').map(&:text) + hosts_existing = d.nameservers.pluck(:hostname) expect(hosts_from_request).to eq(hosts_existing) - expect(inf_data.css('hostName').first.text).to eq('ns1.example.com') - expect(inf_data.css('hostAddr').first.text).to eq('192.168.1.1') - expect(inf_data.css('hostAddr').last.text).to eq('1080:0:0:0:8:800:200C:417A') + ns1 = inf_data.css('hostAttr').last + + expect(ns1.css('hostName').last.text).to eq('ns1.example.com') + expect(ns1.css('hostAddr').first.text).to eq('192.168.1.1') + expect(ns1.css('hostAddr').last.text).to eq('1080:0:0:0:8:800:200C:417A') expect(inf_data.css('crDate').text).to eq(d.created_at.to_time.utc.to_s) expect(inf_data.css('exDate').text).to eq(d.valid_to.to_time.utc.to_s) expect(inf_data.css('pw').text).to eq(d.auth_info) @@ -865,6 +869,7 @@ describe 'EPP Domain', epp: true do expect(d.dnskeys.count).to eq(2) response = epp_request(xml, :xml) + expect(response[:results][0][:result_code]).to eq('2302') expect(response[:results][0][:msg]).to eq('Nameserver already exists on this domain') expect(response[:results][0][:value]).to eq('ns1.example.com') diff --git a/spec/models/domain_spec.rb b/spec/models/domain_spec.rb index ce0966ba7..23eeb70ea 100644 --- a/spec/models/domain_spec.rb +++ b/spec/models/domain_spec.rb @@ -62,6 +62,24 @@ describe Domain do expect(d.errors.messages[:nameservers]).to eq(['Nameservers count must be between 2-7']) end + it 'downcases domain' do + d = Domain.new(name: 'TesT.Ee') + expect(d.name).to eq('test.ee') + expect(d.name_puny).to eq('test.ee') + expect(d.name_dirty).to eq('test.ee') + end + + it 'normalizes ns attrs' do + d = Fabricate(:domain) + d.nameservers.build(hostname: 'BLA.EXAMPLE.EE', ipv4: ' 192.168.1.1', ipv6: '1080:0:0:0:8:800:200c:417a') + d.save + + ns = d.nameservers.last + expect(ns.hostname).to eq('bla.example.ee') + expect(ns.ipv4).to eq('192.168.1.1') + expect(ns.ipv6).to eq('1080:0:0:0:8:800:200C:417A') + end + it 'does not create a reserved domain' do Fabricate(:reserved_domain) expect(Fabricate.build(:domain, name: '1162.ee').valid?).to be false diff --git a/spec/support/general.rb b/spec/support/general.rb index 3c646e2e4..99de8a409 100644 --- a/spec/support/general.rb +++ b/spec/support/general.rb @@ -14,7 +14,6 @@ module General end end - RSpec.configure do |c| c.include General end