diff --git a/.rubocop.yml b/.rubocop.yml index 3d8fd0b90..497e45bbe 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -2,3 +2,6 @@ inherit_from: .rubocop_todo.yml Style/Alias: EnforcedStyle: prefer_alias_method + +Style/FrozenStringLiteralComment: + Enabled: false diff --git a/.ruby-version b/.ruby-version index 5bc1cc43d..00355e29d 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.2.7 +2.3.7 diff --git a/CHANGELOG.md b/CHANGELOG.md index edd7378fc..8fe8f891a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +25.05.2018 +* GDPR: updated whois templates with configurable disclaimer [#795](https://github.com/internetee/registry/issues/795) +* GDPR: email forwarding solution to contact private domain registrants without revealing their email addresses [#824](https://github.com/internetee/registry/issues/824) +* EPP: added support for additional digitally signed doc formats like asice, sce, asics, scs, edoc, adoc [#840](https://github.com/internetee/registry/issues/840) +* Registrar: removed handling of newlines from contact form street field [#836](https://github.com/internetee/registry/issues/836) +* Ruby upgrade to version 2.3.7 [#546](https://github.com/internetee/registry/issues/546) +* Devise upgrade to version 4.4.3 [#847](https://github.com/internetee/registry/pull/847) +* Added extra logging to debug Directo integration [#848](https://github.com/internetee/registry/pull/848) + +30.04.2018 +* Upgrade Ruby on Rails to version 4.2.10 [#826](https://github.com/internetee/registry/issues/826) +* BUG: Admin - fixed internal error in domain_versions and contact_versions views caused by removed db column [#830](https://github.com/internetee/registry/issues/830) + 23.04.2018 * WHOIS: domains with deleteCandidate status do not return registration details as domains waiting to be deleted [#789](https://github.com/internetee/registry/issues/789) * Security: Nokigiri gem update to version 1.8.2 [#823](https://github.com/internetee/registry/pull/823) diff --git a/Dockerfile b/Dockerfile index 0c2c51e25..480231fc2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ruby:2.2 +FROM ruby:2.3 MAINTAINER maciej.szlosarczyk@internet.ee RUN apt-get update > /dev/null && apt-get install -y > /dev/null \ diff --git a/Gemfile b/Gemfile index 54210f794..0af80fddf 100644 --- a/Gemfile +++ b/Gemfile @@ -52,7 +52,7 @@ gem 'liquid', '3.0.6' # for email templates # rights gem 'cancancan', '1.11.0' # autharization -gem 'devise', '3.5.4' # authenitcation +gem 'devise', '4.4.3' # authenitcation # rest api gem 'grape', '0.12.0' diff --git a/Gemfile.lock b/Gemfile.lock index 03193e703..b12b28a2d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -167,12 +167,11 @@ GEM database_cleaner (1.6.1) descendants_tracker (0.0.4) thread_safe (~> 0.3, >= 0.3.1) - devise (3.5.4) + devise (4.4.3) bcrypt (~> 3.0) orm_adapter (~> 0.1) - railties (>= 3.2.6, < 5) + railties (>= 4.1.0, < 6.0) responders - thread_safe (~> 0.1) warden (~> 1.2.3) diff-lcs (1.3) docile (1.1.5) @@ -350,8 +349,9 @@ GEM polyamorous (~> 1.1) rdoc (4.3.0) request_store (1.1.0) - responders (2.3.0) - railties (>= 4.2.0, < 5.1) + responders (2.4.0) + actionpack (>= 4.2.0, < 5.3) + railties (>= 4.2.0, < 5.3) rest-client (2.0.1) http-cookie (>= 1.0.2, < 2.0) mime-types (>= 1.16, < 4.0) @@ -491,7 +491,7 @@ DEPENDENCIES daemons-rails (= 1.2.1) data_migrate! database_cleaner - devise (= 3.5.4) + devise (= 4.4.3) digidoc_client! epp (= 1.5.0)! epp-xml (= 1.1.0)! diff --git a/app/controllers/admin/blocked_domains_controller.rb b/app/controllers/admin/blocked_domains_controller.rb index d9227d773..bf5359b82 100644 --- a/app/controllers/admin/blocked_domains_controller.rb +++ b/app/controllers/admin/blocked_domains_controller.rb @@ -3,13 +3,11 @@ module Admin load_and_authorize_resource def index - params[:q] ||= {} domains = BlockedDomain.all.order(:name) @q = domains.search(params[:q]) @domains = @q.result.page(params[:page]) - @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 - + @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i.positive? end def new diff --git a/app/controllers/admin/contact_versions_controller.rb b/app/controllers/admin/contact_versions_controller.rb index e64a86774..834353cf4 100644 --- a/app/controllers/admin/contact_versions_controller.rb +++ b/app/controllers/admin/contact_versions_controller.rb @@ -26,7 +26,7 @@ module Admin versions = ContactVersion.includes(:item).where(whereS).order(created_at: :desc, id: :desc) @q = versions.search(params[:q]) @versions = @q.result.page(params[:page]) - @versions = @versions.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 + @versions = @versions.per(params[:results_per_page]) if params[:results_per_page].to_i.positive? end diff --git a/app/controllers/admin/contacts_controller.rb b/app/controllers/admin/contacts_controller.rb index 6402d09ae..b53d366ab 100644 --- a/app/controllers/admin/contacts_controller.rb +++ b/app/controllers/admin/contacts_controller.rb @@ -22,7 +22,7 @@ module Admin @contacts = @q.result.uniq.page(params[:page]) end - @contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 + @contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i.positive? end def search diff --git a/app/controllers/admin/domain_versions_controller.rb b/app/controllers/admin/domain_versions_controller.rb index 2585ab894..b6245f6ea 100644 --- a/app/controllers/admin/domain_versions_controller.rb +++ b/app/controllers/admin/domain_versions_controller.rb @@ -43,7 +43,7 @@ module Admin versions = DomainVersion.includes(:item).where(whereS).order(created_at: :desc, id: :desc) @q = versions.search(params[:q]) @versions = @q.result.page(params[:page]) - @versions = @versions.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 + @versions = @versions.per(params[:results_per_page]) if params[:results_per_page].to_i.positive? render "admin/domain_versions/archive" end diff --git a/app/controllers/admin/domains_controller.rb b/app/controllers/admin/domains_controller.rb index 576b5f8e1..71d49a2ab 100644 --- a/app/controllers/admin/domains_controller.rb +++ b/app/controllers/admin/domains_controller.rb @@ -32,7 +32,7 @@ module Admin end end - @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 + @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i.positive? end # rubocop: enable Metrics/PerceivedComplexity diff --git a/app/controllers/admin/invoices_controller.rb b/app/controllers/admin/invoices_controller.rb index 9b97d0903..39bf06152 100644 --- a/app/controllers/admin/invoices_controller.rb +++ b/app/controllers/admin/invoices_controller.rb @@ -13,7 +13,7 @@ module Admin @deposit = Deposit.new(deposit_params.merge(registrar: r)) @invoice = @deposit.issue_prepayment_invoice - if @invoice && @invoice.persisted? + if @invoice&.persisted? flash[:notice] = t(:record_created) redirect_to [:admin, @invoice] else diff --git a/app/controllers/admin/reserved_domains_controller.rb b/app/controllers/admin/reserved_domains_controller.rb index 52a74f345..78d752866 100644 --- a/app/controllers/admin/reserved_domains_controller.rb +++ b/app/controllers/admin/reserved_domains_controller.rb @@ -4,13 +4,11 @@ module Admin before_action :set_domain, only: [:edit, :update] def index - params[:q] ||= {} domains = ReservedDomain.all.order(:name) @q = domains.search(params[:q]) @domains = @q.result.page(params[:page]) - @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 - + @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i.positive? end def new diff --git a/app/controllers/epp_controller.rb b/app/controllers/epp_controller.rb index 36bdcd6cc..3eba05777 100644 --- a/app/controllers/epp_controller.rb +++ b/app/controllers/epp_controller.rb @@ -168,7 +168,7 @@ class EppController < ApplicationController # validate legal document's type here because it may be in most of the requests @prefix = nil - if element_count('extdata > legalDocument') > 0 + if element_count('extdata > legalDocument').positive? requires_attribute('extdata > legalDocument', 'type', values: LegalDocument::TYPES, policy: true) end @@ -279,7 +279,7 @@ class EppController < ApplicationController def optional(selector, *validations) full_selector = [@prefix, selector].compact.join(' ') el = params[:parsed_frame].css(full_selector).first - return unless el && el.text.present? + return unless el&.text.present? value = el.text validations.each do |x| diff --git a/app/controllers/registrant/domains_controller.rb b/app/controllers/registrant/domains_controller.rb index 7cde44a86..0e2f6eeaf 100644 --- a/app/controllers/registrant/domains_controller.rb +++ b/app/controllers/registrant/domains_controller.rb @@ -6,7 +6,7 @@ class Registrant::DomainsController < RegistrantController @q = domains.search(params[:q]) @domains = @q.result.page(params[:page]) end - @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 + @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i.positive? end def show diff --git a/app/controllers/registrant/whois_controller.rb b/app/controllers/registrant/whois_controller.rb index b44a0bb67..2936477eb 100644 --- a/app/controllers/registrant/whois_controller.rb +++ b/app/controllers/registrant/whois_controller.rb @@ -1,3 +1,5 @@ +# As non-GDPR compliant, this controller is deprecated. Needs to be replaced with one that relies +# on the REST WHOIS API. class Registrant::WhoisController < RegistrantController def index authorize! :view, :registrant_whois diff --git a/app/controllers/registrar/contacts_controller.rb b/app/controllers/registrar/contacts_controller.rb index f5f527e1f..cb059641e 100644 --- a/app/controllers/registrar/contacts_controller.rb +++ b/app/controllers/registrar/contacts_controller.rb @@ -33,7 +33,7 @@ class Registrar @contacts = @q.result(distinct: :true).page(params[:page]) end - @contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 + @contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i.positive? end def download_list diff --git a/app/controllers/registrar/deposits_controller.rb b/app/controllers/registrar/deposits_controller.rb index 856b22553..ec6d13977 100644 --- a/app/controllers/registrar/deposits_controller.rb +++ b/app/controllers/registrar/deposits_controller.rb @@ -10,7 +10,7 @@ class Registrar @deposit = Deposit.new(deposit_params.merge(registrar: current_user.registrar)) @invoice = @deposit.issue_prepayment_invoice - if @invoice && @invoice.persisted? + if @invoice&.persisted? flash[:notice] = t(:please_pay_the_following_invoice) redirect_to [:registrar, @invoice] else diff --git a/app/controllers/registrar/domains_controller.rb b/app/controllers/registrar/domains_controller.rb index b85923a02..774ec2e44 100644 --- a/app/controllers/registrar/domains_controller.rb +++ b/app/controllers/registrar/domains_controller.rb @@ -40,7 +40,7 @@ class Registrar end end - @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 + @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i.positive? respond_to do |format| format.html diff --git a/app/helpers/contact_helper.rb b/app/helpers/contact_helper.rb deleted file mode 100644 index 6b15e3da4..000000000 --- a/app/helpers/contact_helper.rb +++ /dev/null @@ -1,5 +0,0 @@ -module ContactHelper - def printable_street(street) - street.to_s.gsub("\n", '
').html_safe - end -end diff --git a/app/jobs/update_whois_record_job.rb b/app/jobs/update_whois_record_job.rb index acfafa3d4..bee0e032c 100644 --- a/app/jobs/update_whois_record_job.rb +++ b/app/jobs/update_whois_record_job.rb @@ -51,4 +51,4 @@ class UpdateWhoisRecordJob < Que::Job def delete_blocked(name) delete_reserved(name) end -end \ No newline at end of file +end diff --git a/app/models/ability.rb b/app/models/ability.rb index 3883bbabf..6083d700f 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -13,9 +13,9 @@ class Ability case @user.class.to_s when 'AdminUser' - @user.roles.each { |role| send(role) } if @user.roles + @user.roles&.each { |role| send(role) } when 'ApiUser' - @user.roles.each { |role| send(role) } if @user.roles + @user.roles&.each { |role| send(role) } when 'RegistrantUser' static_registrant end diff --git a/app/models/directo.rb b/app/models/directo.rb index 9352c9356..3e4e93e2c 100644 --- a/app/models/directo.rb +++ b/app/models/directo.rb @@ -45,8 +45,10 @@ class Directo < ActiveRecord::Base end data = builder.to_xml.gsub("\n",'') - response = RestClient::Request.execute(url: ENV['directo_invoice_url'], method: :post, payload: {put: "1", what: "invoice", xmldata: data}, verify_ssl: false).to_s - dump_result_to_db(mappers, response) + Rails.logger.info("[Directo] XML request: #{data}") + response = RestClient::Request.execute(url: ENV['directo_invoice_url'], method: :post, payload: {put: "1", what: "invoice", xmldata: data}, verify_ssl: false) + Rails.logger.info("[Directo] Directo responded with code: #{response.code}, body: #{response.body}") + dump_result_to_db(mappers, response.to_s) end STDOUT << "#{Time.zone.now.utc} - Directo receipts sending finished. #{counter} of #{total} are sent\n" @@ -165,11 +167,15 @@ class Directo < ActiveRecord::Base end data = builder.to_xml.gsub("\n",'') + Rails.logger.info("[Directo] XML request: #{data}") if debug STDOUT << "#{Time.zone.now.utc} - Directo xml had to be sent #{data}\n" else - response = RestClient::Request.execute(url: ENV['directo_invoice_url'], method: :post, payload: {put: "1", what: "invoice", xmldata: data}, verify_ssl: false).to_s + response = RestClient::Request.execute(url: ENV['directo_invoice_url'], method: :post, payload: {put: "1", what: "invoice", xmldata: data}, verify_ssl: false) + Rails.logger.info("[Directo] Directo responded with code: #{response.code}, body: #{response.body}") + response = response.to_s + Setting.directo_monthly_number_last = directo_next Nokogiri::XML(response).css("Result").each do |res| Directo.create!(request: data, response: res.as_json.to_h, invoice_number: directo_next) @@ -190,4 +196,3 @@ class Directo < ActiveRecord::Base @pricelists[account_activity.price_id] = account_activity.price end end - diff --git a/app/models/epp/contact.rb b/app/models/epp/contact.rb index b280ceea6..699c07ab0 100644 --- a/app/models/epp/contact.rb +++ b/app/models/epp/contact.rb @@ -147,7 +147,7 @@ class Epp::Contact < Contact end if doc = attach_legal_document(Epp::Domain.parse_legal_document_from_frame(frame)) - frame.css("legalDocument").first.content = doc.path if doc && doc.persisted? + frame.css("legalDocument").first.content = doc.path if doc&.persisted? self.legal_document_id = doc.id end @@ -238,7 +238,7 @@ class Epp::Contact < Contact ) self.legal_documents = [doc] - frame.css("legalDocument").first.content = doc.path if doc && doc.persisted? + frame.css("legalDocument").first.content = doc.path if doc&.persisted? self.legal_document_id = doc.id end diff --git a/app/models/epp/domain.rb b/app/models/epp/domain.rb index 4e0e7d44c..dcf61ddcf 100644 --- a/app/models/epp/domain.rb +++ b/app/models/epp/domain.rb @@ -197,7 +197,7 @@ class Epp::Domain < Domain ) self.legal_documents = [doc] - frame.css("legalDocument").first.content = doc.path if doc && doc.persisted? + frame.css("legalDocument").first.content = doc.path if doc&.persisted? self.legal_document_id = doc.id end # rubocop: enable Metrics/PerceivedComplexity @@ -472,7 +472,7 @@ class Epp::Domain < Domain at.deep_merge!(attrs_from(frame.css('rem'), current_user, 'rem')) if doc = attach_legal_document(Epp::Domain.parse_legal_document_from_frame(frame)) - frame.css("legalDocument").first.content = doc.path if doc && doc.persisted? + frame.css("legalDocument").first.content = doc.path if doc&.persisted? self.legal_document_id = doc.id end @@ -547,7 +547,7 @@ class Epp::Domain < Domain check_discarded if doc = attach_legal_document(Epp::Domain.parse_legal_document_from_frame(frame)) - frame.css("legalDocument").first.content = doc.path if doc && doc.persisted? + frame.css("legalDocument").first.content = doc.path if doc&.persisted? end if Setting.request_confirmation_on_domain_deletion_enabled && diff --git a/app/models/legal_document.rb b/app/models/legal_document.rb index c1f9243e3..4d75d272d 100644 --- a/app/models/legal_document.rb +++ b/app/models/legal_document.rb @@ -6,7 +6,8 @@ class LegalDocument < ActiveRecord::Base if ENV['legal_document_types'].present? TYPES = ENV['legal_document_types'].split(',').map(&:strip) else - TYPES = %w(pdf bdoc ddoc zip rar gz tar 7z odt doc docx).freeze + TYPES = %w(pdf asice asics sce scs adoc edoc bdoc ddoc zip rar gz tar 7z odt + doc docx).freeze end attr_accessor :body diff --git a/app/models/whois_record.rb b/app/models/whois_record.rb index 3ff0e9023..e4ccec22f 100644 --- a/app/models/whois_record.rb +++ b/app/models/whois_record.rb @@ -36,6 +36,7 @@ class WhoisRecord < ActiveRecord::Base registrant = domain.registrant @disclosed = [] + h[:disclaimer] = disclaimer_text if disclaimer_text.present? h[:name] = domain.name h[:status] = domain.statuses.map { |x| status_map[x] || x } h[:registered] = domain.registered_at.try(:to_s, :iso8601) @@ -120,4 +121,10 @@ class WhoisRecord < ActiveRecord::Base def destroy_whois_record Whois::Record.where(name: name).delete_all end + + private + + def disclaimer_text + Setting.registry_whois_disclaimer + end end diff --git a/app/validators/domain_name_validator.rb b/app/validators/domain_name_validator.rb index 49939087c..26db4dda9 100644 --- a/app/validators/domain_name_validator.rb +++ b/app/validators/domain_name_validator.rb @@ -37,7 +37,7 @@ class DomainNameValidator < ActiveModel::EachValidator def validate_blocked(value) return true unless value - return false if BlockedDomain.where(name: value).count > 0 + return false if BlockedDomain.where(name: value).count.positive? DNS::Zone.where(origin: value).count.zero? end end diff --git a/app/views/admin/contact_versions/show.haml b/app/views/admin/contact_versions/show.haml index 38139b455..a412b4312 100644 --- a/app/views/admin/contact_versions/show.haml +++ b/app/views/admin/contact_versions/show.haml @@ -62,7 +62,7 @@ - if contact.street.present? %dt= t(:street) - %dd{class: changing_css_class(@version,"street")}= printable_street(contact.street) + %dd{class: changing_css_class(@version,"street")}= contact.street - if contact.city.present? %dt= t(:city) diff --git a/app/views/admin/settings/index.haml b/app/views/admin/settings/index.haml index c41f5cd6b..14e158ec0 100644 --- a/app/views/admin/settings/index.haml +++ b/app/views/admin/settings/index.haml @@ -99,6 +99,7 @@ = render 'setting_row', var: :registry_state = render 'setting_row', var: :registry_zip = render 'setting_row', var: :registry_country_code + = render 'setting_row', var: :registry_whois_disclaimer .row .col-md-12.text-right diff --git a/app/views/epp/domains/info.xml.builder b/app/views/epp/domains/info.xml.builder index 2d10f8baf..850334955 100644 --- a/app/views/epp/domains/info.xml.builder +++ b/app/views/epp/domains/info.xml.builder @@ -22,7 +22,7 @@ xml.epp_head do xml.tag!('domain:contact', ac.code, 'type' => 'admin') end - if @nameservers && @nameservers.any? + if @nameservers&.any? xml.tag!('domain:ns') do @nameservers.each do |x| xml.tag!('domain:hostAttr') do diff --git a/app/views/for_models/whois.erb b/app/views/for_models/whois.erb index 390511031..02b9b1398 100644 --- a/app/views/for_models/whois.erb +++ b/app/views/for_models/whois.erb @@ -1,3 +1,6 @@ +<%- if json['disclaimer'].present? -%> +<%= json['disclaimer'].scan(/\S.{0,72}\S(?=\s|$)|\S+/).join("\n") %> +<%- end -%> Estonia .ee Top Level Domain WHOIS server Domain: @@ -23,18 +26,18 @@ changed: <%= json['registrant_changed'].to_s.tr('T',' ').sub('+', ' +') %> <%- if json['admin_contacts'].present? -%> Administrative contact: <%- for contact in json['admin_contacts'] -%> -name: <%= contact['name'] %> +name: Not Disclosed email: Not Disclosed - Visit www.internet.ee for webbased WHOIS -changed: <%= contact['changed'].to_s.tr('T',' ').sub('+', ' +') %> +changed: Not Disclosed <%- end -%> <%- end -%> <% if json['tech_contacts'].present? %> Technical contact: <%- for contact in json['tech_contacts'] -%> -name: <%= contact['name'] %> +name: Not Disclosed email: Not Disclosed - Visit www.internet.ee for webbased WHOIS -changed: <%= contact['changed'].to_s.tr('T',' ').sub('+', ' +') %> +changed: Not Disclosed <%- end -%> <%- end -%> diff --git a/app/views/layouts/registrant/application.haml b/app/views/layouts/registrant/application.haml deleted file mode 100644 index 12d161c94..000000000 --- a/app/views/layouts/registrant/application.haml +++ /dev/null @@ -1,54 +0,0 @@ -!!! 5 -%html{lang: I18n.locale.to_s} - %head - %meta{charset: "utf-8"}/ - %meta{content: "width=device-width, initial-scale=1", name: "viewport"}/ - - if content_for? :head_title - = yield :head_title - - else - %title= t(:registrant_head_title) - = csrf_meta_tags - = stylesheet_link_tag 'registrant-manifest', media: 'all' - = favicon_link_tag 'favicon.ico' - %body - / Fixed navbar - %nav.navbar.navbar-default.navbar-fixed-top - .container - .navbar-header - %button.navbar-toggle.collapsed{"aria-controls" => "navbar", "aria-expanded" => "false", "data-target" => "#navbar", "data-toggle" => "collapse", :type => "button"} - %span.sr-only Toggle navigation - %span.icon-bar - %span.icon-bar - %span.icon-bar - = link_to registrant_root_path, class: 'navbar-brand' do - = t(:registrant_head_title) - - if unstable_env.present? - .text-center - %small{style: 'color: #0074B3;'}= unstable_env - - if current_user - .navbar-collapse.collapse - %ul.nav.navbar-nav.public-nav - - if can? :view, Depp::Domain - - active_class = %w(registrant/domains registrant/check registrant/renew registrant/tranfer registrant/keyrelays).include?(params[:controller]) ? 'active' :nil - %li{class: active_class}= link_to t(:domains), registrant_domains_path - - - active_class = %w(registrant/whois).include?(params[:controller]) ? 'active' :nil - %li{class: active_class}= link_to t(:whois), registrant_whois_path - - %ul.nav.navbar-nav.navbar-right - - if user_signed_in? - %li= link_to t(:log_out, user: current_user), '/registrant/logout' - - .container - = render 'shared/flash' - = yield - - %footer.footer - .container - .row - .col-md-6 - = image_tag 'eis-logo-et.png' - .col-md-6.text-right - Version - = CURRENT_COMMIT_HASH - = javascript_include_tag 'registrant-manifest', async: true diff --git a/app/views/layouts/registrant/application.html.erb b/app/views/layouts/registrant/application.html.erb new file mode 100644 index 000000000..da081b05a --- /dev/null +++ b/app/views/layouts/registrant/application.html.erb @@ -0,0 +1,84 @@ + + + + + + <% if content_for? :head_title %> + <%= yield :head_title %> + <% else %> + + <%= t(:registrant_head_title) %> + + <% end %> + <%= csrf_meta_tags %> + <%= stylesheet_link_tag 'registrant-manifest', media: 'all' %> + <%= favicon_link_tag 'favicon.ico' %> + + + + +
+ <%= render 'shared/flash' %> + <%= yield %> +
+ + <%= javascript_include_tag 'registrant-manifest', async: true %> + + diff --git a/app/views/registrant/contacts/partials/_address.haml b/app/views/registrant/contacts/partials/_address.haml index fffef581f..fe57bd393 100644 --- a/app/views/registrant/contacts/partials/_address.haml +++ b/app/views/registrant/contacts/partials/_address.haml @@ -8,7 +8,7 @@ %dd= @contact.org_name %dt= t(:street) - %dd= printable_street(@contact.street) + %dd= @contact.street %dt= t(:city) %dd= @contact.city diff --git a/config/application-example.yml b/config/application-example.yml index 8cfd14d7a..7785aafb5 100644 --- a/config/application-example.yml +++ b/config/application-example.yml @@ -67,8 +67,8 @@ contact_org_enabled: 'false' # iptables_server_ip: '127.0.0.1' # Custom legal document types. Changing this requires updating EPP extension schema for allowed legalDocEnumType values. -# System default for legal document types is: pdf,bdoc,ddoc,zip,rar,gz,tar,7z,odt,doc,docx -# legal_document_types: "pdf,bdoc,ddoc,zip,rar,gz,tar,7z,odt,doc,docx" +# System default for legal document types is: pdf,asice,sce,asics,scs,adoc,edoc,bdoc,ddoc,zip,rar,gz,tar,7z,odt,doc,docx +# legal_document_types: "pdf,asice,sce,asics,scs,adoc,edoc,bdoc,ddoc,zip,rar,gz,tar,7z,odt,doc,docx" # diff --git a/config/initializers/initial_settings.rb b/config/initializers/initial_settings.rb index 5ae521bc5..b6efea6eb 100644 --- a/config/initializers/initial_settings.rb +++ b/config/initializers/initial_settings.rb @@ -72,4 +72,5 @@ if con.present? && con.table_exists?('settings') Setting.save_default(:registry_bank_code, '689') Setting.save_default(:registry_swift, 'LHVBEE22') Setting.save_default(:registry_invoice_contact, 'Martti Õigus') + Setting.save_default(:registry_whois_disclaimer, 'Search results may not be used for commercial, advertising, recompilation, repackaging, redistribution, reuse, obscuring or other similar activities.') end diff --git a/config/routes.rb b/config/routes.rb index 6d0153d26..83155d7bb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -145,7 +145,6 @@ Rails.application.routes.draw do end resources :contacts - resources :whois end diff --git a/doc/epp/contact.md b/doc/epp/contact.md index b1f00aedf..633e16cff 100644 --- a/doc/epp/contact.md +++ b/doc/epp/contact.md @@ -8,7 +8,7 @@ More info at http://en.wikipedia.org/wiki/Extensible_Provisioning_Protocol Contact Mapping protocol short version: All values are limited to Unicode Latin characters if stricter limits are not specified. This includes unicode blocks -Basic Latin, Latin-1 Supplement, Latin Extended-A, Latin Extended-B, Latin Extended C, Latin Extended D, +Basic Latin, Latin-1 Supplement, Latin Extended-A, Latin Extended-B, Latin Extended C, Latin Extended D, Latin Extended Additional, Diacritics. More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode @@ -16,9 +16,9 @@ More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode Field name Min-max Field description ----------------------- ------- ----------------- - 1 + 1 1 Attribute: xmlns:contact="https://epp.tld.ee/schema/contact-ee-1.1.xsd" - 0-1 Contact id, optional, + 0-1 Contact id, optional, string: ASCII letters, numbers, ':', '-' characters, no spaces, max 100 characters, generated automatically if missing. @@ -34,7 +34,7 @@ More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode 1 Phone number in format \+ddd.d+ 0 Fax is not supported and must be blank or missing 1 E-mail - 1 + 1 1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd" 1 Identifier Attribute: "type" @@ -43,8 +43,8 @@ More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode "birthday" # Birthday date in format in YYYY-MM-DD Attribute: "cc" "EE" # Country code in ISO_3166-1 aplha 2 - 0-1 Base64 encoded document - Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" + 0-1 Base64 encoded document + Attribute: type="pdf/asice/sce/adoc/asics/scs/edoc/adoc/bdoc/ddoc/zip/rar/gz/tar/7z" 0-1 Client transaction id [EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-contact-with-valid-user-create-command-successfully-creates-a-contact) @@ -53,7 +53,7 @@ More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode Field name Min-max Field description ----------------------- ------- ----------------- - 1 + 1 1 Attribute: xmlns:contact="https://epp.tld.ee/schema/contact-ee-1.1.xsd" 1 Contact id, required 1 Change container @@ -71,7 +71,7 @@ More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode 0-1 E-mail 0-1 Required if registrar is not the owner of the contact. 1 Contact password. Attribute: roid="String" - 0-1 + 0-1 0-1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd" 0-1 Identifier Attribute: "type" @@ -80,8 +80,8 @@ More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode "birthday" # Birthday date in format in YYYY-MM-DD Attribute: "cc" "EE" # Country code in ISO_3166-1 aplha 2 - 0-1 Base64 encoded document. - Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" + 0-1 Base64 encoded document. + Attribute: type="pdf/asice/sce/adoc/asics/scs/edoc/adoc/bdoc/ddoc/zip/rar/gz/tar/7z" 0-1 Client transaction id @@ -91,15 +91,15 @@ More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode Field name Min-max Field description ----------------------- ------- ----------------- - 1 + 1 1 Attribute: xmlns:contact="https://epp.tld.ee/schema/contact-ee-1.1.xsd" 1 Contact id 0-1 Required if registrar is not the owner of the contact. 1 Contact password. Attribute: roid="String" - 0-1 + 0-1 0-1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd" - 0-1 Base64 encoded document. - Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" + 0-1 Base64 encoded document. + Attribute: type="pdf/asice/sce/adoc/asics/scs/edoc/adoc/bdoc/ddoc/zip/rar/gz/tar/7z" 0-1 Client transaction id [EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-contact-with-valid-user-delete-command-deletes-contact) @@ -109,9 +109,9 @@ More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode Field name Min-max Field description ----------------------- ------- ----------------- - 1 + 1 1 Attribute: xmlns:contact="https://epp.tld.ee/schema/contact-ee-1.1.xsd" - 1-n Contact id + 1-n Contact id 0-1 Client transaction id [EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-contact-with-valid-user-check-command-returns-info-about-contact-availability) @@ -121,9 +121,9 @@ More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode Field name Min-max Field description ----------------------- ------- ----------------- - 1 + 1 1 Attribute: xmlns:contact="https://epp.tld.ee/schema/contact-ee-1.1.xsd" - 1-n Contact id + 1-n Contact id 0-1 Required if registrar is not the owner of the contact. 1 Contact password. Attribute: roid="String" 0-1 Client transaction id diff --git a/doc/epp/domain.md b/doc/epp/domain.md index 0933efe4b..2e51be124 100644 --- a/doc/epp/domain.md +++ b/doc/epp/domain.md @@ -12,15 +12,15 @@ Domain name mapping protocol short version: Field name Min-max Field description ------------------------- ------- ----------------- - 1 + 1 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd" 1 Domain name. Can contain unicode characters. - 0-1 Registration period for domain. + 0-1 Registration period for domain. Must add up to 3m, 6m, 9m, 1y, 2y, 3y, 4y, 5y, 6y, 7y, 8y, 9y, 10y. Attribute: unit="y/m/d" Default is 1 year. - 0-1 - 2-11 + 0-1 + 2-11 1 Hostname of the nameserver 0-2 Required if nameserver hostname is under the same domain. Attribute ip="v4 / v6" @@ -30,16 +30,16 @@ Domain name mapping protocol short version: 0-1 1 Transfer code. Attribute: roid="String" - 1 + 1 0-1 Attribute: xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1" - 1-n + 1-n 1 Allowed values: 0, 256, 257 1 Allowed values: 3 1 Allowed values: 3, 5, 6, 7, 8, 10, 13, 14 1 Public key 1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd" - 1 Base64 encoded document. - Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" + 1 Base64 encoded document. + Attribute: type="pdf/asice/sce/adoc/asics/scs/edoc/adoc/bdoc/ddoc/zip/rar/gz/tar/7z" 0-1 0-1 Required if registering a reserved domain 0-1 Client transaction id @@ -50,27 +50,27 @@ Domain name mapping protocol short version: Field name Min-max Field description ------------------------ -------- ----------------- - 1 + 1 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd" 1 Domain name. Can contain unicode characters. 0-1 Objects to add 0-n Contact reference. Attribute: type="admin / tech" - 0-n Status description. - Attribute: s="clientDeleteProhibited / clientHold / - clientRenewProhibited / clientTransferProhibited / + 0-n Status description. + Attribute: s="clientDeleteProhibited / clientHold / + clientRenewProhibited / clientTransferProhibited / clientUpdateProhibited" - 0-1 - 1 + 0-1 + 1 1 Hostname of the nameserver 0-2 Required if nameserver hostname is under the same domain. Attribute ip="v4 / v6" 0-1 Objects to remove 0-n Contact reference. Attribute: type="admin / tech" - 0-n Attribute: s="clientDeleteProhibited / clientHold / - clientRenewProhibited / clientTransferProhibited / + 0-n Attribute: s="clientDeleteProhibited / clientHold / + clientRenewProhibited / clientTransferProhibited / clientUpdateProhibited" - 0-1 - 1 + 0-1 + 1 1 Hostname of the nameserver 0-1 Attributes to change 0-1 Contact reference to the registrant @@ -80,18 +80,18 @@ Domain name mapping protocol short version: 0-1 Required if registrant is changing 0-1 Attribute: xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1" - 0-1 - 1-n + 0-1 + 1-n 1 Public key - 0-1 - 1-n + 0-1 + 1-n 1 Allowed values: 0, 256, 257 1 Allowed values: 3 1 Allowed values: 3, 5, 6, 7, 8, 10, 13, 14 1 Public key 0-1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd" - 0-1 Base64 encoded document. Required if registrant is changing. - Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" + 0-1 Base64 encoded document. Required if registrant is changing. + Attribute: type="pdf/asice/sce/adoc/asics/scs/edoc/adoc/bdoc/ddoc/zip/rar/gz/tar/7z" 0-1 Client transaction id [EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-domain-with-valid-domain-updates-domain-and-adds-objects) @@ -100,14 +100,14 @@ Domain name mapping protocol short version: Field name Min-max Field description ----------------------- ------- ----------------- - 1 + 1 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd" Optional attribute: verified="yes/no" 1 Domain name. Can contain unicode characters. - 1 + 1 1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd" - 1 Base64 encoded document. - Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" + 1 Base64 encoded document. + Attribute: type="pdf/asice/sce/adoc/asics/scs/edoc/adoc/bdoc/ddoc/zip/rar/gz/tar/7z" 0-1 Client transaction id [EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-domain-with-valid-domain-deletes-domain) @@ -116,9 +116,9 @@ Domain name mapping protocol short version: Field name Min-max Field description ----------------------- ------- ----------------- - 1 + 1 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd" - 1 Domain name. Can contain unicode characters. + 1 Domain name. Can contain unicode characters. Attribute: hosts="all / del / sub / none" 0-1 Required if registrar is not the owner of the domain. 1 Domain transfer code. Attribute: roid="String" @@ -130,18 +130,18 @@ Domain name mapping protocol short version: Field name Min-max Field description ----------------------- ------- ----------------- - 1 + 1 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd" - 1 Domain name. Can contain unicode characters. + 1 Domain name. Can contain unicode characters. 1 Current expiry date (ISO8601 format) - 0-1 Registration period for domain. + 0-1 Registration period for domain. Must add up to 3m, 6m, 9m, 1y, 2y, 3y, 4y, 5y, 6y, 7y, 8y, 9y, 10y. Attribute: unit="y/m/d" Default value is 1 year. - 0-1 + 0-1 0-1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd" - 0-1 Base64 encoded document. - Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" + 0-1 Base64 encoded document. + Attribute: type="pdf/asice/sce/adoc/asics/scs/edoc/adoc/bdoc/ddoc/zip/rar/gz/tar/7z" 0-1 Client transaction id [EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-domain-with-valid-domain-renews-a-domain) @@ -152,13 +152,13 @@ Domain name mapping protocol short version: ----------------------- ------- ----------------- 1 Attribute: op="request/query/approve/reject/cancel" 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd" - 1 Domain name. Can contain unicode characters. - 1 + 1 Domain name. Can contain unicode characters. + 1 1 Domain transfer code. Attribute: roid="String" - 0-1 + 0-1 0-1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd" - 0-1 Base64 encoded document. - Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" + 0-1 Base64 encoded document. + Attribute: type="pdf/asice/sce/adoc/asics/scs/edoc/adoc/bdoc/ddoc/zip/rar/gz/tar/7z" 0-1 Client transaction id [EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-domain-with-valid-domain-transfers-a-domain) @@ -167,9 +167,9 @@ Domain name mapping protocol short version: Field name Min-max Field description ----------------------- ------- ----------------- - 1 + 1 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd" - 1 Domain name. Can contain unicode characters. + 1 Domain name. Can contain unicode characters. 0-1 Client transaction id [EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-domain-with-valid-domain-checks-a-domain) diff --git a/lib/schemas/eis-1.0.xsd b/lib/schemas/eis-1.0.xsd index 0b2ad8f89..ddb3602c0 100644 --- a/lib/schemas/eis-1.0.xsd +++ b/lib/schemas/eis-1.0.xsd @@ -63,7 +63,13 @@ + + + + + + diff --git a/spec/features/admin/contacts/list_spec.rb b/spec/features/admin/contacts/list_spec.rb deleted file mode 100644 index 80312fb17..000000000 --- a/spec/features/admin/contacts/list_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require 'rails_helper' - -RSpec.feature 'Contact list', settings: false do - background do - sign_in_to_admin_area - end - - it 'is visible' do - visit admin_contacts_path - expect(page).to have_css('.contacts') - end -end diff --git a/spec/models/whois_record_spec.rb b/spec/models/whois_record_spec.rb deleted file mode 100644 index c1fba57f9..000000000 --- a/spec/models/whois_record_spec.rb +++ /dev/null @@ -1,67 +0,0 @@ -require 'rails_helper' - -RSpec.describe WhoisRecord do - describe '::generate_json', db: false do - let(:registrant) { build_stubbed(:registrant) } - let(:domain) { build_stubbed(:domain, registrant: registrant) } - let(:whois_record) { described_class.new } - subject(:generated_json) { whois_record.generate_json } - - before do - allow(whois_record).to receive(:domain).and_return(domain) - end - - it 'generates registrant kind' do - expect(registrant).to receive(:kind).and_return('test kind') - expect(generated_json[:registrant_kind]).to eq('test kind') - end - - describe 'reg no' do - subject(:reg_no) { generated_json[:registrant_reg_no] } - - before do - allow(registrant).to receive(:reg_no).and_return('test reg no') - end - - context 'when registrant is legal entity' do - let(:registrant) { build_stubbed(:registrant_legal_entity) } - - it 'is present' do - expect(reg_no).to eq('test reg no') - end - end - - context 'when registrant is private entity' do - let(:registrant) { build_stubbed(:registrant_private_entity) } - - it 'is absent' do - expect(reg_no).to be_nil - end - end - end - - describe 'country code' do - subject(:country_code) { generated_json[:registrant_ident_country_code] } - - before do - allow(registrant).to receive(:ident_country_code).and_return('test country code') - end - - context 'when registrant is legal entity' do - let(:registrant) { build_stubbed(:registrant_legal_entity) } - - it 'is present' do - expect(country_code).to eq('test country code') - end - end - - context 'when registrant is private entity' do - let(:registrant) { build_stubbed(:registrant_private_entity) } - - it 'is absent' do - expect(country_code).to be_nil - end - end - end - end -end diff --git a/test/integration/admin/contacts_test.rb b/test/integration/admin/contacts_test.rb new file mode 100644 index 000000000..1f517e8cb --- /dev/null +++ b/test/integration/admin/contacts_test.rb @@ -0,0 +1,25 @@ +require 'test_helper' + +class AdminContactsTest < ActionDispatch::IntegrationTest + def setup + super + + @contact = contacts(:william) + login_as users(:admin) + end + + def test_display_list + visit admin_contacts_path + + assert_text('william-001') + assert_text('william-002') + assert_text('acme-ltd-001') + end + + def test_display_details + visit admin_contact_path(@contact) + + assert_text('Street Main Street City New York Postcode 12345 ' \ + 'State New York Country United States of America') + end +end diff --git a/test/integration/registrant/layout_test.rb b/test/integration/registrant/layout_test.rb new file mode 100644 index 000000000..82b8026b7 --- /dev/null +++ b/test/integration/registrant/layout_test.rb @@ -0,0 +1,17 @@ +require 'test_helper' + +class RegistrantLayoutTest < ActionDispatch::IntegrationTest + def setup + super + login_as(users(:registrant)) + + Setting.days_to_keep_business_registry_cache = 1 + travel_to Time.zone.parse('2010-07-05') + end + + def test_has_link_to_rest_whois + visit registrant_domains_url + assert(has_link?('Internet.ee', href: 'https://internet.ee')) + refute(has_link?('WHOIS', href: 'registrant/whois')) + end +end diff --git a/test/models/whois_record_test.rb b/test/models/whois_record_test.rb new file mode 100644 index 000000000..438ee9cc4 --- /dev/null +++ b/test/models/whois_record_test.rb @@ -0,0 +1,60 @@ +require 'test_helper' + +class WhoisRecordTest < ActiveSupport::TestCase + def setup + super + + @domain = domains(:shop) + @record = WhoisRecord.new(domain: @domain) + @record.populate + end + + def test_generated_json_has_expected_values + expected_disclaimer_text = <<-TEXT.squish + Search results may not be used for commercial, advertising, recompilation, + repackaging, redistribution, reuse, obscuring or other similar activities. + TEXT + + expected_partial_hash = { + disclaimer: expected_disclaimer_text, + name: 'shop.test', + registrant: 'John', + registrant_kind: 'priv', + email: 'john@inbox.test', + expire: '2010-07-05', + nameservers: ['ns1.bestnames.test', 'ns2.bestnames.test'], + registrar_address: 'Main Street, New York, New York, 12345', + dnssec_keys: [], + } + + expected_partial_hash.each do |key, value| + assert_equal(value, @record.generated_json[key]) + end + end + + def test_generated_body_has_justified_disclaimer + expected_disclaimer = begin + 'Search results may not be used for commercial, advertising, recompilation,\n' \ + 'repackaging, redistribution, reuse, obscuring or other similar activities.' + end + expected_technical_contact = begin + 'Technical contact:\n' \ + 'name: Not Disclosed\n' \ + 'email: Not Disclosed - Visit www.internet.ee for webbased WHOIS\n' \ + 'changed: Not Disclosed' + end + + regexp_contact = Regexp.new(expected_technical_contact, Regexp::MULTILINE) + regexp_disclaimer = Regexp.new(expected_disclaimer, Regexp::MULTILINE) + + assert_match(regexp_disclaimer, @record.body) + assert_match(regexp_contact, @record.body) + end + + def test_whois_record_has_no_disclaimer_if_Setting_is_blank + Setting.stubs(:registry_whois_disclaimer, '') do + refute(@record.json['disclaimer']) + refute_match(/Search results may not be used for commercial/, @record.body) + end + end +end