From 92d8008c1564de3a83053ce66259cddc3f3bef27 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Thu, 6 Apr 2017 19:05:14 +0300 Subject: [PATCH 01/22] Introduce BaseController for registrar area --- .../account_activities_controller.rb | 46 +-- app/controllers/registrar/base_controller.rb | 41 +++ .../registrar/contacts_controller.rb | 240 ++++++------ .../registrar/dashboard_controller.rb | 16 +- .../registrar/deposits_controller.rb | 42 ++- app/controllers/registrar/depp_controller.rb | 63 ++-- .../registrar/domains_controller.rb | 345 +++++++++--------- .../registrar/invoices_controller.rb | 129 +++---- .../registrar/keyrelays_controller.rb | 28 +- .../registrar/payments_controller.rb | 80 ++-- app/controllers/registrar/polls_controller.rb | 107 +++--- .../registrar/sessions_controller.rb | 319 ++++++++-------- .../registrar/xml_consoles_controller.rb | 38 +- app/controllers/registrar_controller.rb | 37 -- 14 files changed, 785 insertions(+), 746 deletions(-) create mode 100644 app/controllers/registrar/base_controller.rb delete mode 100644 app/controllers/registrar_controller.rb diff --git a/app/controllers/registrar/account_activities_controller.rb b/app/controllers/registrar/account_activities_controller.rb index 2b3fc7951..17ac16e6c 100644 --- a/app/controllers/registrar/account_activities_controller.rb +++ b/app/controllers/registrar/account_activities_controller.rb @@ -1,28 +1,30 @@ -class Registrar::AccountActivitiesController < RegistrarController - load_and_authorize_resource +class Registrar + class AccountActivitiesController < BaseController + load_and_authorize_resource - def index # rubocop: disable Metrics/AbcSize - params[:q] ||= {} - account = current_user.registrar.cash_account + def index # rubocop: disable Metrics/AbcSize + params[:q] ||= {} + account = current_user.registrar.cash_account - ca_cache = params[:q][:created_at_lteq] - begin - end_time = params[:q][:created_at_lteq].try(:to_date) - params[:q][:created_at_lteq] = end_time.try(:end_of_day) - rescue - logger.warn('Invalid date') - end - - @q = account.activities.includes(:invoice).search(params[:q]) - @q.sorts = 'id desc' if @q.sorts.empty? - - respond_to do |format| - format.html { @account_activities = @q.result.page(params[:page]) } - format.csv do - send_data @q.result.to_csv, filename: "account_activities_#{Time.zone.now.to_formatted_s(:number)}.csv" + ca_cache = params[:q][:created_at_lteq] + begin + end_time = params[:q][:created_at_lteq].try(:to_date) + params[:q][:created_at_lteq] = end_time.try(:end_of_day) + rescue + logger.warn('Invalid date') end - end - params[:q][:created_at_lteq] = ca_cache + @q = account.activities.includes(:invoice).search(params[:q]) + @q.sorts = 'id desc' if @q.sorts.empty? + + respond_to do |format| + format.html { @account_activities = @q.result.page(params[:page]) } + format.csv do + send_data @q.result.to_csv, filename: "account_activities_#{Time.zone.now.to_formatted_s(:number)}.csv" + end + end + + params[:q][:created_at_lteq] = ca_cache + end end end diff --git a/app/controllers/registrar/base_controller.rb b/app/controllers/registrar/base_controller.rb new file mode 100644 index 000000000..0203304c2 --- /dev/null +++ b/app/controllers/registrar/base_controller.rb @@ -0,0 +1,41 @@ +class Registrar + class BaseController < ApplicationController + before_action :authenticate_user!, :check_ip + layout 'registrar/application' + + include Registrar::ApplicationHelper + + helper_method :depp_controller? + + def depp_controller? + false + end + + def check_ip + return unless current_user + unless current_user.is_a? ApiUser + sign_out(current_user) + return + end + return if Rails.env.development? + registrar_ip_whitelisted = current_user.registrar.registrar_ip_white?(request.ip) + + return if registrar_ip_whitelisted + flash[:alert] = t('ip_is_not_whitelisted') + sign_out(current_user) + redirect_to registrar_login_path and return + end + + helper_method :head_title_sufix + + def head_title_sufix + t(:registrar_head_title_sufix) + end + + protected + + def current_ability + @current_ability ||= Ability.new(current_user, request.remote_ip) + end + end +end diff --git a/app/controllers/registrar/contacts_controller.rb b/app/controllers/registrar/contacts_controller.rb index 3b3f1b293..b927df1a8 100644 --- a/app/controllers/registrar/contacts_controller.rb +++ b/app/controllers/registrar/contacts_controller.rb @@ -1,142 +1,144 @@ -class Registrar::ContactsController < Registrar::DeppController # EPP controller - before_action :init_epp_contact - helper_method :address_processing? +class Registrar + class ContactsController < DeppController + before_action :init_epp_contact + helper_method :address_processing? - def index - authorize! :view, Depp::Contact + def index + authorize! :view, Depp::Contact - params[:q] ||= {} - params[:q].delete_if { |_k, v| v.blank? } + params[:q] ||= {} + params[:q].delete_if { |_k, v| v.blank? } - search_params = params[:q].deep_dup + search_params = params[:q].deep_dup - if search_params[:domain_contacts_type_in].is_a?(Array) && search_params[:domain_contacts_type_in].delete('registrant') - search_params[:registrant_domains_id_not_null] = 1 - end + if search_params[:domain_contacts_type_in].is_a?(Array) && search_params[:domain_contacts_type_in].delete('registrant') + search_params[:registrant_domains_id_not_null] = 1 + end - if search_params.length == 1 && search_params[:name_matches].present? - @contacts = Contact.find_by(name: search_params[:name_matches]) - end + if search_params.length == 1 && search_params[:name_matches].present? + @contacts = Contact.find_by(name: search_params[:name_matches]) + end - if params[:statuses_contains] - contacts = current_user.registrar.contacts.includes(:registrar).where( + if params[:statuses_contains] + contacts = current_user.registrar.contacts.includes(:registrar).where( "contacts.statuses @> ?::varchar[]", "{#{params[:statuses_contains].join(',')}}" - ) - else + ) + else + contacts = current_user.registrar.contacts.includes(:registrar) + end + + normalize_search_parameters do + @q = contacts.search(search_params) + @contacts = @q.result(distinct: :true).page(params[:page]) + end + + @contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 + end + + def download_list + authorize! :view, Depp::Contact + + params[:q] ||= {} + params[:q].delete_if { |_k, v| v.blank? } + if params[:q].length == 1 && params[:q][:name_matches].present? + @contacts = Contact.find_by(name: params[:q][:name_matches]) + end + contacts = current_user.registrar.contacts.includes(:registrar) - end + contacts = contacts.filter_by_states(params[:statuses_contains]) if params[:statuses_contains] - normalize_search_parameters do - @q = contacts.search(search_params) - @contacts = @q.result(distinct: :true).page(params[:page]) - end + normalize_search_parameters do + @q = contacts.search(params[:q]) + @contacts = @q.result.page(params[:page]) + end - @contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 - end + @contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 - def download_list - authorize! :view, Depp::Contact - - params[:q] ||= {} - params[:q].delete_if { |_k, v| v.blank? } - if params[:q].length == 1 && params[:q][:name_matches].present? - @contacts = Contact.find_by(name: params[:q][:name_matches]) - end - - contacts = current_user.registrar.contacts.includes(:registrar) - contacts = contacts.filter_by_states(params[:statuses_contains]) if params[:statuses_contains] - - normalize_search_parameters do - @q = contacts.search(params[:q]) - @contacts = @q.result.page(params[:page]) - end - - @contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 - - respond_to do |format| + respond_to do |format| format.csv { render text: @contacts.to_csv } format.pdf do - pdf = @contacts.pdf(render_to_string('registrar/contacts/download_list', layout: false)) - send_data pdf, filename: 'contacts.pdf' + pdf = @contacts.pdf(render_to_string('registrar/contacts/download_list', layout: false)) + send_data pdf, filename: 'contacts.pdf' + end + end + + end + + def new + authorize! :create, Depp::Contact + @contact = Depp::Contact.new + end + + def show + authorize! :view, Depp::Contact + @contact = Depp::Contact.find_by_id(params[:id]) + end + + def edit + authorize! :edit, Depp::Contact + @contact = Depp::Contact.find_by_id(params[:id]) + end + + def create + authorize! :create, Depp::Contact + @contact = Depp::Contact.new(params[:depp_contact]) + + if @contact.save + redirect_to registrar_contact_url(@contact.id) + else + render 'new' end end - end + def update + authorize! :edit, Depp::Contact + @contact = Depp::Contact.new(params[:depp_contact]) - def new - authorize! :create, Depp::Contact - @contact = Depp::Contact.new - end - - def show - authorize! :view, Depp::Contact - @contact = Depp::Contact.find_by_id(params[:id]) - end - - def edit - authorize! :edit, Depp::Contact - @contact = Depp::Contact.find_by_id(params[:id]) - end - - def create - authorize! :create, Depp::Contact - @contact = Depp::Contact.new(params[:depp_contact]) - - if @contact.save - redirect_to registrar_contact_url(@contact.id) - else - render 'new' - end - end - - def update - authorize! :edit, Depp::Contact - @contact = Depp::Contact.new(params[:depp_contact]) - - if @contact.update_attributes(params[:depp_contact]) - redirect_to registrar_contact_url(@contact.id) - else - render 'edit' - end - end - - def delete - authorize! :delete, Depp::Contact - @contact = Depp::Contact.find_by_id(params[:id]) - end - - def destroy - authorize! :delete, Depp::Contact - @contact = Depp::Contact.new(params[:depp_contact]) - - if @contact.delete - redirect_to registrar_contacts_url, notice: t(:destroyed) - else - render 'delete' - end - end - - private - - def init_epp_contact - Depp::Contact.user = depp_current_user - end - - def normalize_search_parameters - ca_cache = params[:q][:valid_to_lteq] - begin - end_time = params[:q][:valid_to_lteq].try(:to_date) - params[:q][:valid_to_lteq] = end_time.try(:end_of_day) - rescue - logger.warn('Invalid date') + if @contact.update_attributes(params[:depp_contact]) + redirect_to registrar_contact_url(@contact.id) + else + render 'edit' + end end - yield + def delete + authorize! :delete, Depp::Contact + @contact = Depp::Contact.find_by_id(params[:id]) + end - params[:q][:valid_to_lteq] = ca_cache - end + def destroy + authorize! :delete, Depp::Contact + @contact = Depp::Contact.new(params[:depp_contact]) - def address_processing? - Contact.address_processing? + if @contact.delete + redirect_to registrar_contacts_url, notice: t(:destroyed) + else + render 'delete' + end + end + + private + + def init_epp_contact + Depp::Contact.user = depp_current_user + end + + def normalize_search_parameters + ca_cache = params[:q][:valid_to_lteq] + begin + end_time = params[:q][:valid_to_lteq].try(:to_date) + params[:q][:valid_to_lteq] = end_time.try(:end_of_day) + rescue + logger.warn('Invalid date') + end + + yield + + params[:q][:valid_to_lteq] = ca_cache + end + + def address_processing? + Contact.address_processing? + end end end diff --git a/app/controllers/registrar/dashboard_controller.rb b/app/controllers/registrar/dashboard_controller.rb index cdbc70b0c..80b3f530b 100644 --- a/app/controllers/registrar/dashboard_controller.rb +++ b/app/controllers/registrar/dashboard_controller.rb @@ -1,11 +1,13 @@ -class Registrar::DashboardController < RegistrarController - authorize_resource class: false +class Registrar + class DashboardController < BaseController + authorize_resource class: false - def show - if can?(:show, :poll) - redirect_to registrar_poll_url and return - elsif can?(:show, Invoice) - redirect_to registrar_invoices_url and return + def show + if can?(:show, :poll) + redirect_to registrar_poll_url and return + elsif can?(:show, Invoice) + redirect_to registrar_invoices_url and return + end end end end diff --git a/app/controllers/registrar/deposits_controller.rb b/app/controllers/registrar/deposits_controller.rb index 4b7d0db97..856b22553 100644 --- a/app/controllers/registrar/deposits_controller.rb +++ b/app/controllers/registrar/deposits_controller.rb @@ -1,26 +1,28 @@ -class Registrar::DepositsController < RegistrarController - authorize_resource class: false +class Registrar + class DepositsController < BaseController + authorize_resource class: false - def new - @deposit = Deposit.new - end + def new + @deposit = Deposit.new + end - def create - @deposit = Deposit.new(deposit_params.merge(registrar: current_user.registrar)) - @invoice = @deposit.issue_prepayment_invoice + def create + @deposit = Deposit.new(deposit_params.merge(registrar: current_user.registrar)) + @invoice = @deposit.issue_prepayment_invoice - if @invoice && @invoice.persisted? - flash[:notice] = t(:please_pay_the_following_invoice) - redirect_to [:registrar, @invoice] - else - flash.now[:alert] = t(:failed_to_create_record) - render 'new' + if @invoice && @invoice.persisted? + flash[:notice] = t(:please_pay_the_following_invoice) + redirect_to [:registrar, @invoice] + else + flash.now[:alert] = t(:failed_to_create_record) + render 'new' + end + end + + private + + def deposit_params + params.require(:deposit).permit(:amount, :description) end end - - private - - def deposit_params - params.require(:deposit).permit(:amount, :description) - end end diff --git a/app/controllers/registrar/depp_controller.rb b/app/controllers/registrar/depp_controller.rb index 73e13fdae..234ab40b7 100644 --- a/app/controllers/registrar/depp_controller.rb +++ b/app/controllers/registrar/depp_controller.rb @@ -1,34 +1,37 @@ -class Registrar::DeppController < RegistrarController # EPP controller - helper_method :depp_current_user +class Registrar + class DeppController < BaseController + helper_method :depp_current_user - rescue_from(Errno::ECONNRESET, Errno::ECONNREFUSED) do |exception| - logger.error 'COULD NOT CONNECT TO REGISTRY' - logger.error exception.backtrace.join("\n") - redirect_to registrar_login_url, alert: t(:no_connection_to_registry) - end - - before_action :authenticate_user - def authenticate_user - redirect_to registrar_login_url and return unless depp_current_user - end - - def depp_controller? - true - end - - def depp_current_user - return nil unless current_user - @depp_current_user ||= Depp::User.new( - tag: current_user.username, - password: current_user.password - ) - end - - def response_ok? - @data.css('result').each do |x| - success_codes = %(1000, 1001, 1300, 1301) - return false unless success_codes.include?(x['code']) + rescue_from(Errno::ECONNRESET, Errno::ECONNREFUSED) do |exception| + logger.error 'COULD NOT CONNECT TO REGISTRY' + logger.error exception.backtrace.join("\n") + redirect_to registrar_login_url, alert: t(:no_connection_to_registry) + end + + before_action :authenticate_user + + def authenticate_user + redirect_to registrar_login_url and return unless depp_current_user + end + + def depp_controller? + true + end + + def depp_current_user + return nil unless current_user + @depp_current_user ||= Depp::User.new( + tag: current_user.username, + password: current_user.password + ) + end + + def response_ok? + @data.css('result').each do |x| + success_codes = %(1000, 1001, 1300, 1301) + return false unless success_codes.include?(x['code']) + end + true end - true end end diff --git a/app/controllers/registrar/domains_controller.rb b/app/controllers/registrar/domains_controller.rb index 560a965f3..a75469de3 100644 --- a/app/controllers/registrar/domains_controller.rb +++ b/app/controllers/registrar/domains_controller.rb @@ -1,191 +1,194 @@ -class Registrar::DomainsController < Registrar::DeppController # EPP controller - before_action :init_domain, except: :new - helper_method :contacts +class Registrar + class DomainsController < DeppController + before_action :init_domain, except: :new + helper_method :contacts - # rubocop: disable Metrics/PerceivedComplexity - # rubocop: disable Metrics/CyclomaticComplexity - # rubocop: disable Metrics/AbcSize - # rubocop: disable Metrics/MethodLength - def index - authorize! :view, Depp::Domain + # rubocop: disable Metrics/PerceivedComplexity + # rubocop: disable Metrics/CyclomaticComplexity + # rubocop: disable Metrics/AbcSize + # rubocop: disable Metrics/MethodLength + def index + authorize! :view, Depp::Domain - params[:q] ||= {} - params[:q].delete_if { |_k, v| v.blank? } - if params[:q].length == 1 && params[:q][:name_matches].present? - @domain = Domain.find_by(name: params[:q][:name_matches]) - if @domain - redirect_to info_registrar_domains_url(domain_name: @domain.name) and return + params[:q] ||= {} + params[:q].delete_if { |_k, v| v.blank? } + if params[:q].length == 1 && params[:q][:name_matches].present? + @domain = Domain.find_by(name: params[:q][:name_matches]) + if @domain + redirect_to info_registrar_domains_url(domain_name: @domain.name) and return + end end - end - if params[:statuses_contains] - domains = current_user.registrar.domains.includes(:registrar, :registrant).where( - "statuses @> ?::varchar[]", "{#{params[:statuses_contains].join(',')}}" - ) - else - domains = current_user.registrar.domains.includes(:registrar, :registrant) - end + if params[:statuses_contains] + domains = current_user.registrar.domains.includes(:registrar, :registrant).where( + "statuses @> ?::varchar[]", "{#{params[:statuses_contains].join(',')}}" + ) + else + domains = current_user.registrar.domains.includes(:registrar, :registrant) + end - normalize_search_parameters do - @q = domains.search(params[:q]) - @domains = @q.result.page(params[:page]) - if @domains.count == 0 && params[:q][:name_matches] !~ /^%.+%$/ - # if we do not get any results, add wildcards to the name field and search again - n_cache = params[:q][:name_matches] - params[:q][:name_matches] = "%#{params[:q][:name_matches]}%" + normalize_search_parameters do @q = domains.search(params[:q]) @domains = @q.result.page(params[:page]) - params[:q][:name_matches] = n_cache # we don't want to show wildcards in search form - end - end - - @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 - - respond_to do |format| - format.html - format.csv do - domain_presenters = [] - - @domains.find_each do |domain| - domain_presenters << ::DomainPresenter.new(domain: domain, view: view_context) + if @domains.count == 0 && params[:q][:name_matches] !~ /^%.+%$/ + # if we do not get any results, add wildcards to the name field and search again + n_cache = params[:q][:name_matches] + params[:q][:name_matches] = "%#{params[:q][:name_matches]}%" + @q = domains.search(params[:q]) + @domains = @q.result.page(params[:page]) + params[:q][:name_matches] = n_cache # we don't want to show wildcards in search form end + end - csv = Registrar::DomainListCSVPresenter.new(domains: domain_presenters, view: view_context).to_s - send_data(csv) + @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 + + respond_to do |format| + format.html + format.csv do + domain_presenters = [] + + @domains.find_each do |domain| + domain_presenters << ::DomainPresenter.new(domain: domain, view: view_context) + end + + csv = Registrar::DomainListCSVPresenter.new(domains: domain_presenters, view: view_context).to_s + send_data(csv) + end end end - end - # rubocop: enable Metrics/PerceivedComplexity - # rubocop: enable Metrics/CyclomaticComplexity - # rubocop: enable Metrics/AbcSize - def info - authorize! :info, Depp::Domain - @data = @domain.info(params[:domain_name]) if params[:domain_name] - if response_ok? - render 'info' - else - flash[:alert] = @data.css('msg').text - redirect_to registrar_domains_url and return - end - end + # rubocop: enable Metrics/PerceivedComplexity + # rubocop: enable Metrics/CyclomaticComplexity + # rubocop: enable Metrics/AbcSize - def check - authorize! :check, Depp::Domain - if params[:domain_name] - @data = @domain.check(params[:domain_name]) - render 'check_index' and return unless response_ok? - else - render 'check_index' - end - end - - def new - authorize! :create, Depp::Domain - @domain_params = Depp::Domain.default_params - end - - def create - authorize! :create, Depp::Domain - @domain_params = params[:domain] - @data = @domain.create(@domain_params) - - if response_ok? - redirect_to info_registrar_domains_url(domain_name: @domain_params[:name]) - else - render 'new' - end - end - - def edit - authorize! :update, Depp::Domain - @data = @domain.info(params[:domain_name]) - @domain_params = Depp::Domain.construct_params_from_server_data(@data) - end - - def update - authorize! :update, Depp::Domain - @domain_params = params[:domain] - @data = @domain.update(@domain_params) - - if response_ok? - redirect_to info_registrar_domains_url(domain_name: @domain_params[:name]) - else - params[:domain_name] = @domain_params[:name] - render 'new' - end - end - - def delete - authorize! :delete, Depp::Domain - end - - def destroy - authorize! :delete, Depp::Domain - @data = @domain.delete(params[:domain]) - @results = @data.css('result') - if response_ok? - redirect_to info_registrar_domains_url(domain_name: params[:domain][:name]) - else - params[:domain_name] = params[:domain][:name] - render 'delete' - end - end - - def renew - authorize! :renew, Depp::Domain - if params[:domain_name] && params[:cur_exp_date] - @data = @domain.renew(params) - render 'renew_index' and return unless response_ok? - else - render 'renew_index' - end - end - - def transfer - authorize! :transfer, Depp::Domain - if request.post? && params[:domain_name] - @data = @domain.transfer(params) - render 'transfer_index' and return unless response_ok? - else - render 'transfer_index' - end - end - - def search_contacts - authorize! :create, Depp::Domain - - scope = current_user.registrar.contacts.limit(10) - if params[:query].present? - escaped_str = ActiveRecord::Base.connection.quote_string params[:query] - scope = scope.where("name ilike '%#{escaped_str}%' OR code ilike '%#{escaped_str}%' ") + def info + authorize! :info, Depp::Domain + @data = @domain.info(params[:domain_name]) if params[:domain_name] + if response_ok? + render 'info' + else + flash[:alert] = @data.css('msg').text + redirect_to registrar_domains_url and return + end end - render json: scope.pluck(:name, :code).map { |c| {display_key: "#{c.second} #{c.first}", value: c.second} } - end - - private - - def init_domain - @domain = Depp::Domain.new(current_user: depp_current_user) - end - - - def contacts - current_user.registrar.contacts - end - - def normalize_search_parameters - ca_cache = params[:q][:valid_to_lteq] - begin - end_time = params[:q][:valid_to_lteq].try(:to_date) - params[:q][:valid_to_lteq] = end_time.try(:end_of_day) - rescue - logger.warn('Invalid date') + def check + authorize! :check, Depp::Domain + if params[:domain_name] + @data = @domain.check(params[:domain_name]) + render 'check_index' and return unless response_ok? + else + render 'check_index' + end end - yield + def new + authorize! :create, Depp::Domain + @domain_params = Depp::Domain.default_params + end - params[:q][:valid_to_lteq] = ca_cache + def create + authorize! :create, Depp::Domain + @domain_params = params[:domain] + @data = @domain.create(@domain_params) + + if response_ok? + redirect_to info_registrar_domains_url(domain_name: @domain_params[:name]) + else + render 'new' + end + end + + def edit + authorize! :update, Depp::Domain + @data = @domain.info(params[:domain_name]) + @domain_params = Depp::Domain.construct_params_from_server_data(@data) + end + + def update + authorize! :update, Depp::Domain + @domain_params = params[:domain] + @data = @domain.update(@domain_params) + + if response_ok? + redirect_to info_registrar_domains_url(domain_name: @domain_params[:name]) + else + params[:domain_name] = @domain_params[:name] + render 'new' + end + end + + def delete + authorize! :delete, Depp::Domain + end + + def destroy + authorize! :delete, Depp::Domain + @data = @domain.delete(params[:domain]) + @results = @data.css('result') + if response_ok? + redirect_to info_registrar_domains_url(domain_name: params[:domain][:name]) + else + params[:domain_name] = params[:domain][:name] + render 'delete' + end + end + + def renew + authorize! :renew, Depp::Domain + if params[:domain_name] && params[:cur_exp_date] + @data = @domain.renew(params) + render 'renew_index' and return unless response_ok? + else + render 'renew_index' + end + end + + def transfer + authorize! :transfer, Depp::Domain + if request.post? && params[:domain_name] + @data = @domain.transfer(params) + render 'transfer_index' and return unless response_ok? + else + render 'transfer_index' + end + end + + def search_contacts + authorize! :create, Depp::Domain + + scope = current_user.registrar.contacts.limit(10) + if params[:query].present? + escaped_str = ActiveRecord::Base.connection.quote_string params[:query] + scope = scope.where("name ilike '%#{escaped_str}%' OR code ilike '%#{escaped_str}%' ") + end + + render json: scope.pluck(:name, :code).map { |c| { display_key: "#{c.second} #{c.first}", value: c.second } } + end + + private + + def init_domain + @domain = Depp::Domain.new(current_user: depp_current_user) + end + + + def contacts + current_user.registrar.contacts + end + + def normalize_search_parameters + ca_cache = params[:q][:valid_to_lteq] + begin + end_time = params[:q][:valid_to_lteq].try(:to_date) + params[:q][:valid_to_lteq] = end_time.try(:end_of_day) + rescue + logger.warn('Invalid date') + end + + yield + + params[:q][:valid_to_lteq] = ca_cache + end end end diff --git a/app/controllers/registrar/invoices_controller.rb b/app/controllers/registrar/invoices_controller.rb index 543c4623d..ac762e712 100644 --- a/app/controllers/registrar/invoices_controller.rb +++ b/app/controllers/registrar/invoices_controller.rb @@ -1,71 +1,74 @@ -class Registrar::InvoicesController < RegistrarController - load_and_authorize_resource +class Registrar + class InvoicesController < BaseController + load_and_authorize_resource - before_action :set_invoice, only: [:show, :forward, :download_pdf] + before_action :set_invoice, only: [:show, :forward, :download_pdf] - def index - params[:q] ||= {} - invoices = current_user.registrar.invoices.includes(:invoice_items, :account_activity) + def index + params[:q] ||= {} + invoices = current_user.registrar.invoices.includes(:invoice_items, :account_activity) - normalize_search_parameters do - @q = invoices.search(params[:q]) - @q.sorts = 'id desc' if @q.sorts.empty? - @invoices = @q.result.page(params[:page]) - end - end - - def show; end - - def forward - @invoice.billing_email = @invoice.buyer.billing_email - - return unless request.post? - - @invoice.billing_email = params[:invoice][:billing_email] - - if @invoice.forward(render_to_string('pdf', layout: false)) - flash[:notice] = t(:invoice_forwared) - redirect_to([:registrar, @invoice]) - else - flash.now[:alert] = t(:failed_to_forward_invoice) - end - end - - def cancel - if @invoice.cancel - flash[:notice] = t(:record_updated) - redirect_to([:registrar, @invoice]) - else - flash.now[:alert] = t(:failed_to_update_record) - render :show - end - end - - def download_pdf - pdf = @invoice.pdf(render_to_string('pdf', layout: false)) - send_data pdf, filename: @invoice.pdf_name - end - - private - - def set_invoice - @invoice = Invoice.find(params[:id]) - end - - def normalize_search_parameters - params[:q][:sum_cache_gteq].gsub!(',', '.') if params[:q][:sum_cache_gteq] - params[:q][:sum_cache_lteq].gsub!(',', '.') if params[:q][:sum_cache_lteq] - - ca_cache = params[:q][:due_date_lteq] - begin - end_time = params[:q][:due_date_lteq].try(:to_date) - params[:q][:due_date_lteq] = end_time.try(:end_of_day) - rescue - logger.warn('Invalid date') + normalize_search_parameters do + @q = invoices.search(params[:q]) + @q.sorts = 'id desc' if @q.sorts.empty? + @invoices = @q.result.page(params[:page]) + end end - yield + def show; + end - params[:q][:due_date_lteq] = ca_cache + def forward + @invoice.billing_email = @invoice.buyer.billing_email + + return unless request.post? + + @invoice.billing_email = params[:invoice][:billing_email] + + if @invoice.forward(render_to_string('pdf', layout: false)) + flash[:notice] = t(:invoice_forwared) + redirect_to([:registrar, @invoice]) + else + flash.now[:alert] = t(:failed_to_forward_invoice) + end + end + + def cancel + if @invoice.cancel + flash[:notice] = t(:record_updated) + redirect_to([:registrar, @invoice]) + else + flash.now[:alert] = t(:failed_to_update_record) + render :show + end + end + + def download_pdf + pdf = @invoice.pdf(render_to_string('pdf', layout: false)) + send_data pdf, filename: @invoice.pdf_name + end + + private + + def set_invoice + @invoice = Invoice.find(params[:id]) + end + + def normalize_search_parameters + params[:q][:sum_cache_gteq].gsub!(',', '.') if params[:q][:sum_cache_gteq] + params[:q][:sum_cache_lteq].gsub!(',', '.') if params[:q][:sum_cache_lteq] + + ca_cache = params[:q][:due_date_lteq] + begin + end_time = params[:q][:due_date_lteq].try(:to_date) + params[:q][:due_date_lteq] = end_time.try(:end_of_day) + rescue + logger.warn('Invalid date') + end + + yield + + params[:q][:due_date_lteq] = ca_cache + end end end diff --git a/app/controllers/registrar/keyrelays_controller.rb b/app/controllers/registrar/keyrelays_controller.rb index 13c480524..8436bb679 100644 --- a/app/controllers/registrar/keyrelays_controller.rb +++ b/app/controllers/registrar/keyrelays_controller.rb @@ -1,18 +1,20 @@ -class Registrar::KeyrelaysController < Registrar::DeppController # EPP controller - def show - authorize! :view, Depp::Keyrelay - end +class Registrar + class KeyrelaysController < DeppController + def show + authorize! :view, Depp::Keyrelay + end - def create - authorize! :create, Depp::Keyrelay - keyrelay = Depp::Keyrelay.new(current_user: depp_current_user) - @data = keyrelay.keyrelay(params) + def create + authorize! :create, Depp::Keyrelay + keyrelay = Depp::Keyrelay.new(current_user: depp_current_user) + @data = keyrelay.keyrelay(params) - if response_ok? - flash[:epp_results] = [{ 'code' => '1000', 'msg' => 'Command completed successfully', 'show' => true }] - redirect_to registrar_keyrelay_path - else - render 'show' + if response_ok? + flash[:epp_results] = [{ 'code' => '1000', 'msg' => 'Command completed successfully', 'show' => true }] + redirect_to registrar_keyrelay_path + else + render 'show' + end end end end diff --git a/app/controllers/registrar/payments_controller.rb b/app/controllers/registrar/payments_controller.rb index 931dffcf2..696dbbc7e 100644 --- a/app/controllers/registrar/payments_controller.rb +++ b/app/controllers/registrar/payments_controller.rb @@ -1,46 +1,48 @@ -class Registrar::PaymentsController < RegistrarController - protect_from_forgery except: :back +class Registrar + class PaymentsController < BaseController + protect_from_forgery except: :back - skip_authorization_check # actually anyone can pay, no problems at all - skip_before_action :authenticate_user!, :check_ip, only: [:back] - before_action :check_bank + skip_authorization_check # actually anyone can pay, no problems at all + skip_before_action :authenticate_user!, :check_ip, only: [:back] + before_action :check_bank - # to handle existing model we should - # get invoice_id and then get number - # build BankTransaction without connection with right reference number - # do not connect transaction and invoice - def pay - invoice = Invoice.find(params[:invoice_id]) - @bank_link = BankLink::Request.new(params[:bank], invoice, self) - @bank_link.make_transaction - end - - - # connect invoice and transaction - # both back and IPN - def back - @bank_link = BankLink::Response.new(params[:bank], params) - if @bank_link.valid? && @bank_link.ok? - @bank_link.complete_payment - - if @bank_link.invoice.binded? - flash[:notice] = t(:pending_applied) - else - flash[:alert] = t(:something_wrong) - end - else - flash[:alert] = t(:something_wrong) + # to handle existing model we should + # get invoice_id and then get number + # build BankTransaction without connection with right reference number + # do not connect transaction and invoice + def pay + invoice = Invoice.find(params[:invoice_id]) + @bank_link = BankLink::Request.new(params[:bank], invoice, self) + @bank_link.make_transaction end - redirect_to registrar_invoice_path(@bank_link.invoice) - end - private - def banks - ENV['payments_banks'].split(",").map(&:strip) - end - def check_bank - raise StandardError.new("Not Implemented bank") unless banks.include?(params[:bank]) - end + # connect invoice and transaction + # both back and IPN + def back + @bank_link = BankLink::Response.new(params[:bank], params) + if @bank_link.valid? && @bank_link.ok? + @bank_link.complete_payment + if @bank_link.invoice.binded? + flash[:notice] = t(:pending_applied) + else + flash[:alert] = t(:something_wrong) + end + else + flash[:alert] = t(:something_wrong) + end + redirect_to registrar_invoice_path(@bank_link.invoice) + end + + private + + def banks + ENV['payments_banks'].split(",").map(&:strip) + end + + def check_bank + raise StandardError.new("Not Implemented bank") unless banks.include?(params[:bank]) + end + end end diff --git a/app/controllers/registrar/polls_controller.rb b/app/controllers/registrar/polls_controller.rb index 5f893e3c3..ab0d5e1a6 100644 --- a/app/controllers/registrar/polls_controller.rb +++ b/app/controllers/registrar/polls_controller.rb @@ -1,56 +1,61 @@ -class Registrar::PollsController < Registrar::DeppController # EPP controller - authorize_resource class: false - before_action :init_epp_xml +class Registrar + class PollsController < DeppController + authorize_resource class: false + before_action :init_epp_xml + + def show + if Rails.env.test? # Stub for depp server request + @data = Object.new + + def @data.css(key) + ; []; + end + else + @data = depp_current_user.request(@ex.poll) + end + end + + def destroy + @data = depp_current_user.request(@ex.poll(poll: { + value: '', attrs: { op: 'ack', msgID: params[:id] } + })) + + @results = @data.css('result') - def show - if Rails.env.test? # Stub for depp server request - @data = Object.new - def @data.css(key); []; end - else @data = depp_current_user.request(@ex.poll) + render 'show' + end + + # TODO: Keyrelay is disabled for now + # def confirm_keyrelay + # authorize! :confirm, :keyrelay + # domain_params = params[:domain] + # @data = @domain.confirm_keyrelay(domain_params) + + # if response_ok? + # redirect_to info_registrar_domains_url(domain_name: domain_params[:name]) + # else + # @results = @data.css('result') + # @data = depp_current_user.request(@ex.poll) + # render 'show' + # end + # end + + def confirm_transfer + domain_params = params[:domain] + @data = @domain.confirm_transfer(domain_params) + + @results = @data.css('result') + @data = depp_current_user.request(@ex.poll) + + render 'show' + end + + private + + def init_epp_xml + @ex = EppXml::Session.new(cl_trid_prefix: depp_current_user.tag) + @domain = Depp::Domain.new(current_user: depp_current_user) end end - - def destroy - @data = depp_current_user.request(@ex.poll(poll: { - value: '', attrs: { op: 'ack', msgID: params[:id] } - })) - - @results = @data.css('result') - - @data = depp_current_user.request(@ex.poll) - render 'show' - end - - # TODO: Keyrelay is disabled for now - # def confirm_keyrelay - # authorize! :confirm, :keyrelay - # domain_params = params[:domain] - # @data = @domain.confirm_keyrelay(domain_params) - - # if response_ok? - # redirect_to info_registrar_domains_url(domain_name: domain_params[:name]) - # else - # @results = @data.css('result') - # @data = depp_current_user.request(@ex.poll) - # render 'show' - # end - # end - - def confirm_transfer - domain_params = params[:domain] - @data = @domain.confirm_transfer(domain_params) - - @results = @data.css('result') - @data = depp_current_user.request(@ex.poll) - - render 'show' - end - - private - - def init_epp_xml - @ex = EppXml::Session.new(cl_trid_prefix: depp_current_user.tag) - @domain = Depp::Domain.new(current_user: depp_current_user) - end end diff --git a/app/controllers/registrar/sessions_controller.rb b/app/controllers/registrar/sessions_controller.rb index 2d04c6fdd..f7fab5ac4 100644 --- a/app/controllers/registrar/sessions_controller.rb +++ b/app/controllers/registrar/sessions_controller.rb @@ -1,186 +1,193 @@ -class Registrar::SessionsController < Devise::SessionsController - layout 'registrar/application' - helper_method :depp_controller? - def depp_controller? - false - end +class Registrar + class SessionsController < Devise::SessionsController + layout 'registrar/application' + helper_method :depp_controller? - before_action :check_ip - - def login - @depp_user = Depp::User.new - end - - # rubocop:disable Metrics/PerceivedComplexity - # rubocop:disable Metrics/CyclomaticComplexity - # rubocop:disable Metrics/MethodLength - # rubocop:disable Metrics/AbcSize - def create - @depp_user = Depp::User.new(params[:depp_user].merge(pki: !(Rails.env.development? || Rails.env.test?))) - - if @depp_user.pki && request.env['HTTP_SSL_CLIENT_S_DN_CN'].blank? - @depp_user.errors.add(:base, :webserver_missing_user_name_directive) + def depp_controller? + false end - if @depp_user.pki && request.env['HTTP_SSL_CLIENT_CERT'].blank? - @depp_user.errors.add(:base, :webserver_missing_client_cert_directive) + before_action :check_ip + + def login + @depp_user = Depp::User.new end - if @depp_user.pki && request.env['HTTP_SSL_CLIENT_S_DN_CN'] == '(null)' - @depp_user.errors.add(:base, :webserver_user_name_directive_should_be_required) - end + # rubocop:disable Metrics/PerceivedComplexity + # rubocop:disable Metrics/CyclomaticComplexity + # rubocop:disable Metrics/MethodLength + # rubocop:disable Metrics/AbcSize + def create + @depp_user = Depp::User.new(params[:depp_user].merge(pki: !(Rails.env.development? || Rails.env.test?))) - if @depp_user.pki && request.env['HTTP_SSL_CLIENT_CERT'] == '(null)' - @depp_user.errors.add(:base, :webserver_client_cert_directive_should_be_required) - end - - @api_user = ApiUser.find_by(username: params[:depp_user][:tag], password: params[:depp_user][:password]) - - unless @api_user - @depp_user.errors.add(:base, t(:no_such_user)) - render 'login' and return - end - - if @depp_user.pki - unless @api_user.registrar_pki_ok?(request.env['HTTP_SSL_CLIENT_CERT'], request.env['HTTP_SSL_CLIENT_S_DN_CN']) - @depp_user.errors.add(:base, :invalid_cert) + if @depp_user.pki && request.env['HTTP_SSL_CLIENT_S_DN_CN'].blank? + @depp_user.errors.add(:base, :webserver_missing_user_name_directive) end - end - if @depp_user.errors.none? - if @api_user.active? - sign_in @api_user - redirect_to registrar_root_url + if @depp_user.pki && request.env['HTTP_SSL_CLIENT_CERT'].blank? + @depp_user.errors.add(:base, :webserver_missing_client_cert_directive) + end + + if @depp_user.pki && request.env['HTTP_SSL_CLIENT_S_DN_CN'] == '(null)' + @depp_user.errors.add(:base, :webserver_user_name_directive_should_be_required) + end + + if @depp_user.pki && request.env['HTTP_SSL_CLIENT_CERT'] == '(null)' + @depp_user.errors.add(:base, :webserver_client_cert_directive_should_be_required) + end + + @api_user = ApiUser.find_by(username: params[:depp_user][:tag], password: params[:depp_user][:password]) + + unless @api_user + @depp_user.errors.add(:base, t(:no_such_user)) + render 'login' and return + end + + if @depp_user.pki + unless @api_user.registrar_pki_ok?(request.env['HTTP_SSL_CLIENT_CERT'], request.env['HTTP_SSL_CLIENT_S_DN_CN']) + @depp_user.errors.add(:base, :invalid_cert) + end + end + + if @depp_user.errors.none? + if @api_user.active? + sign_in @api_user + redirect_to registrar_root_url + else + @depp_user.errors.add(:base, :not_active) + render 'login' + end else - @depp_user.errors.add(:base, :not_active) render 'login' end - else - render 'login' end - end - # rubocop:enable Metrics/MethodLength - # rubocop:enable Metrics/AbcSize - def switch_user - @api_user = ApiUser.find(params[:id]) + # rubocop:enable Metrics/MethodLength + # rubocop:enable Metrics/AbcSize - unless Rails.env.development? - unless @api_user.registrar.registrar_ip_white?(request.ip) - flash[:alert] = I18n.t(:ip_is_not_whitelisted) - redirect_to :back and return + def switch_user + @api_user = ApiUser.find(params[:id]) + + unless Rails.env.development? + unless @api_user.registrar.registrar_ip_white?(request.ip) + flash[:alert] = I18n.t(:ip_is_not_whitelisted) + redirect_to :back and return + end + end + + sign_in @api_user if @api_user.identity_code == current_user.identity_code + + redirect_to registrar_root_url + end + + # rubocop:enable Metrics/CyclomaticComplexity + # rubocop:enable Metrics/PerceivedComplexity + + def id + @user = ApiUser.find_by_idc_data(request.env['SSL_CLIENT_S_DN']) + + if @user + sign_in(@user, event: :authentication) + redirect_to registrar_root_url + else + flash[:alert] = t('no_such_user') + redirect_to registrar_login_url end end - sign_in @api_user if @api_user.identity_code == current_user.identity_code - - redirect_to registrar_root_url - end - # rubocop:enable Metrics/CyclomaticComplexity - # rubocop:enable Metrics/PerceivedComplexity - - def id - @user = ApiUser.find_by_idc_data(request.env['SSL_CLIENT_S_DN']) - - if @user - sign_in(@user, event: :authentication) - redirect_to registrar_root_url - else - flash[:alert] = t('no_such_user') - redirect_to registrar_login_url - end - end - - def login_mid - @user = User.new - end - - # rubocop:disable Metrics/MethodLength - def mid - phone = params[:user][:phone] - endpoint = "#{ENV['sk_digi_doc_service_endpoint']}" - client = Digidoc::Client.new(endpoint) - - # country_codes = {'+372' => 'EST'} - phone.gsub!('+372', '') - response = client.authenticate( - phone: "+372#{phone}", - message_to_display: 'Authenticating', - service_name: ENV['sk_digi_doc_service_name'] || 'Testing' - ) - - if response.faultcode - render json: { message: response.detail.message }, status: :unauthorized - return + def login_mid + @user = User.new end - @user = find_user_by_idc(response.user_id_code) + # rubocop:disable Metrics/MethodLength + def mid + phone = params[:user][:phone] + endpoint = "#{ENV['sk_digi_doc_service_endpoint']}" + client = Digidoc::Client.new(endpoint) - if @user.persisted? - session[:user_id_code] = response.user_id_code - session[:mid_session_code] = client.session_code + # country_codes = {'+372' => 'EST'} + phone.gsub!('+372', '') + response = client.authenticate( + phone: "+372#{phone}", + message_to_display: 'Authenticating', + service_name: ENV['sk_digi_doc_service_name'] || 'Testing' + ) - render json: { - message: t(:confirmation_sms_was_sent_to_your_phone_verification_code_is, { code: response.challenge_id }) - }, status: :ok - else - render json: { message: t(:no_such_user) }, status: :unauthorized + if response.faultcode + render json: { message: response.detail.message }, status: :unauthorized + return + end + + @user = find_user_by_idc(response.user_id_code) + + if @user.persisted? + session[:user_id_code] = response.user_id_code + session[:mid_session_code] = client.session_code + + render json: { + message: t(:confirmation_sms_was_sent_to_your_phone_verification_code_is, { code: response.challenge_id }) + }, status: :ok + else + render json: { message: t(:no_such_user) }, status: :unauthorized + end end - end - # rubocop:enable Metrics/MethodLength - # rubocop: disable Metrics/AbcSize - # rubocop: disable Metrics/CyclomaticComplexity - # rubocop: disable Metrics/MethodLength - def mid_status - endpoint = "#{ENV['sk_digi_doc_service_endpoint']}" - client = Digidoc::Client.new(endpoint) - client.session_code = session[:mid_session_code] - auth_status = client.authentication_status + # rubocop:enable Metrics/MethodLength - case auth_status.status - when 'OUTSTANDING_TRANSACTION' - render json: { message: t(:check_your_phone_for_confirmation_code) }, status: :ok - when 'USER_AUTHENTICATED' - @user = find_user_by_idc(session[:user_id_code]) - sign_in @user - flash[:notice] = t(:welcome) - flash.keep(:notice) - render js: "window.location = '#{registrar_root_url}'" - when 'NOT_VALID' - render json: { message: t(:user_signature_is_invalid) }, status: :bad_request - when 'EXPIRED_TRANSACTION' - render json: { message: t(:session_timeout) }, status: :bad_request - when 'USER_CANCEL' - render json: { message: t(:user_cancelled) }, status: :bad_request - when 'MID_NOT_READY' - render json: { message: t(:mid_not_ready) }, status: :bad_request - when 'PHONE_ABSENT' - render json: { message: t(:phone_absent) }, status: :bad_request - when 'SENDING_ERROR' - render json: { message: t(:sending_error) }, status: :bad_request - when 'SIM_ERROR' - render json: { message: t(:sim_error) }, status: :bad_request - when 'INTERNAL_ERROR' - render json: { message: t(:internal_error) }, status: :bad_request - else - render json: { message: t(:internal_error) }, status: :bad_request + # rubocop: disable Metrics/AbcSize + # rubocop: disable Metrics/CyclomaticComplexity + # rubocop: disable Metrics/MethodLength + def mid_status + endpoint = "#{ENV['sk_digi_doc_service_endpoint']}" + client = Digidoc::Client.new(endpoint) + client.session_code = session[:mid_session_code] + auth_status = client.authentication_status + + case auth_status.status + when 'OUTSTANDING_TRANSACTION' + render json: { message: t(:check_your_phone_for_confirmation_code) }, status: :ok + when 'USER_AUTHENTICATED' + @user = find_user_by_idc(session[:user_id_code]) + sign_in @user + flash[:notice] = t(:welcome) + flash.keep(:notice) + render js: "window.location = '#{registrar_root_url}'" + when 'NOT_VALID' + render json: { message: t(:user_signature_is_invalid) }, status: :bad_request + when 'EXPIRED_TRANSACTION' + render json: { message: t(:session_timeout) }, status: :bad_request + when 'USER_CANCEL' + render json: { message: t(:user_cancelled) }, status: :bad_request + when 'MID_NOT_READY' + render json: { message: t(:mid_not_ready) }, status: :bad_request + when 'PHONE_ABSENT' + render json: { message: t(:phone_absent) }, status: :bad_request + when 'SENDING_ERROR' + render json: { message: t(:sending_error) }, status: :bad_request + when 'SIM_ERROR' + render json: { message: t(:sim_error) }, status: :bad_request + when 'INTERNAL_ERROR' + render json: { message: t(:internal_error) }, status: :bad_request + else + render json: { message: t(:internal_error) }, status: :bad_request + end end - end - # rubocop: enable Metrics/AbcSize - # rubocop: enable Metrics/CyclomaticComplexity - # rubocop: enable Metrics/MethodLength - def find_user_by_idc(idc) - return User.new unless idc - ApiUser.find_by(identity_code: idc) || User.new - end + # rubocop: enable Metrics/AbcSize + # rubocop: enable Metrics/CyclomaticComplexity + # rubocop: enable Metrics/MethodLength - private + def find_user_by_idc(idc) + return User.new unless idc + ApiUser.find_by(identity_code: idc) || User.new + end - def check_ip - return if Rails.env.development? - return if WhiteIp.registrar_ip_white?(request.ip) - render text: t('access_denied') and return + private + + def check_ip + return if Rails.env.development? + return if WhiteIp.registrar_ip_white?(request.ip) + render text: t('access_denied') and return + end end end diff --git a/app/controllers/registrar/xml_consoles_controller.rb b/app/controllers/registrar/xml_consoles_controller.rb index 31ec3eafc..083dec532 100644 --- a/app/controllers/registrar/xml_consoles_controller.rb +++ b/app/controllers/registrar/xml_consoles_controller.rb @@ -1,23 +1,25 @@ -class Registrar::XmlConsolesController < Registrar::DeppController # EPP controller - authorize_resource class: false +class Registrar + class XmlConsolesController < DeppController + authorize_resource class: false - def show - end - - def create - begin - @result = depp_current_user.server.request(params[:payload]) - rescue - @result = 'CONNECTION ERROR - Is the EPP server running?' + def show end - render :show - end - def load_xml - cl_trid = "#{depp_current_user.tag}-#{Time.zone.now.to_i}" - xml_dir_path = Rails.root + 'app/views/registrar/xml_consoles/epp_requests' - xml = File.read("#{xml_dir_path}/#{params[:obj]}/#{params[:epp_action]}.xml") - xml.gsub!('ABC-12345', "#{cl_trid}") - render text: xml + def create + begin + @result = depp_current_user.server.request(params[:payload]) + rescue + @result = 'CONNECTION ERROR - Is the EPP server running?' + end + render :show + end + + def load_xml + cl_trid = "#{depp_current_user.tag}-#{Time.zone.now.to_i}" + xml_dir_path = Rails.root + 'app/views/registrar/xml_consoles/epp_requests' + xml = File.read("#{xml_dir_path}/#{params[:obj]}/#{params[:epp_action]}.xml") + xml.gsub!('ABC-12345', "#{cl_trid}") + render text: xml + end end end diff --git a/app/controllers/registrar_controller.rb b/app/controllers/registrar_controller.rb deleted file mode 100644 index 47d596fd3..000000000 --- a/app/controllers/registrar_controller.rb +++ /dev/null @@ -1,37 +0,0 @@ -class RegistrarController < ApplicationController - before_action :authenticate_user!, :check_ip - layout 'registrar/application' - - include Registrar::ApplicationHelper - - helper_method :depp_controller? - def depp_controller? - false - end - - def check_ip - return unless current_user - unless current_user.is_a? ApiUser - sign_out(current_user) - return - end - return if Rails.env.development? - registrar_ip_whitelisted = current_user.registrar.registrar_ip_white?(request.ip) - - return if registrar_ip_whitelisted - flash[:alert] = t('ip_is_not_whitelisted') - sign_out(current_user) - redirect_to registrar_login_path and return - end - - helper_method :head_title_sufix - def head_title_sufix - t(:registrar_head_title_sufix) - end - - private - - def current_ability - @current_ability ||= Ability.new(current_user, request.remote_ip) - end -end From fbe3bf979d4538d0e7c6284965b6b7e37a708c5e Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Thu, 6 Apr 2017 20:58:36 +0300 Subject: [PATCH 02/22] Use layout inheritance in registrar area --- app/controllers/registrar/base_controller.rb | 1 - app/controllers/registrar/sessions_controller.rb | 1 - app/views/layouts/registrar/{application.haml => base.haml} | 0 3 files changed, 2 deletions(-) rename app/views/layouts/registrar/{application.haml => base.haml} (100%) diff --git a/app/controllers/registrar/base_controller.rb b/app/controllers/registrar/base_controller.rb index 0203304c2..c91f2e075 100644 --- a/app/controllers/registrar/base_controller.rb +++ b/app/controllers/registrar/base_controller.rb @@ -1,7 +1,6 @@ class Registrar class BaseController < ApplicationController before_action :authenticate_user!, :check_ip - layout 'registrar/application' include Registrar::ApplicationHelper diff --git a/app/controllers/registrar/sessions_controller.rb b/app/controllers/registrar/sessions_controller.rb index f7fab5ac4..20cde12b7 100644 --- a/app/controllers/registrar/sessions_controller.rb +++ b/app/controllers/registrar/sessions_controller.rb @@ -1,6 +1,5 @@ class Registrar class SessionsController < Devise::SessionsController - layout 'registrar/application' helper_method :depp_controller? def depp_controller? diff --git a/app/views/layouts/registrar/application.haml b/app/views/layouts/registrar/base.haml similarity index 100% rename from app/views/layouts/registrar/application.haml rename to app/views/layouts/registrar/base.haml From 8e8bf882d83b9617fc330b570a7ca5fed87ff97f Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Thu, 6 Apr 2017 23:41:28 +0300 Subject: [PATCH 03/22] Extract navbar partial from registrar area layout --- app/views/layouts/registrar/base.haml | 29 +-------------------------- app/views/registrar/base/_navbar.haml | 28 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 28 deletions(-) create mode 100644 app/views/registrar/base/_navbar.haml diff --git a/app/views/layouts/registrar/base.haml b/app/views/layouts/registrar/base.haml index df936bbee..a2add9f20 100644 --- a/app/views/layouts/registrar/base.haml +++ b/app/views/layouts/registrar/base.haml @@ -30,34 +30,7 @@ .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(registrar/domains registrar/check registrar/renew registrar/tranfer registrar/keyrelays).include?(params[:controller]) ? 'active' :nil - %li{class: active_class}= link_to t(:domains), registrar_domains_path - - - if can? :view, Depp::Contact - - active_class = ['registrar/contacts'].include?(params[:controller]) ? 'active' :nil - %li{class: active_class}= link_to t(:contacts), registrar_contacts_path - - - if can? :show, Invoice - - active_class = ['registrar/invoices'].include?(params[:controller]) ? 'active' :nil - %li{class: active_class}= link_to t(:billing), registrar_invoices_path - - - if !Rails.env.production? && can?(:manage, :xml_console) - - active_class = ['registrar/xml_consoles'].include?(params[:controller]) ? 'active' :nil - %li{class: active_class}= link_to t(:xml_console), registrar_xml_console_path - - %ul.nav.navbar-nav.navbar-right - %li.dropdown - %a.dropdown-toggle{"data-toggle" => "dropdown", href: "#"} - = "#{current_user} (#{current_user.roles.first}) - #{current_user.registrar}" - %span.caret - %ul.dropdown-menu{role: "menu"} - - ApiUser.all_by_identity_code(current_user.identity_code).each do |x| - %li= link_to "#{x} (#{x.roles.first}) - #{x.registrar}", "/registrar/switch_user/#{x.id}" - - if user_signed_in? - %li= link_to t(:log_out_), '/registrar/logout' + = render 'navbar' .container = render 'shared/flash' diff --git a/app/views/registrar/base/_navbar.haml b/app/views/registrar/base/_navbar.haml new file mode 100644 index 000000000..608fb9cb4 --- /dev/null +++ b/app/views/registrar/base/_navbar.haml @@ -0,0 +1,28 @@ +.navbar-collapse.collapse + %ul.nav.navbar-nav.public-nav + - if can? :view, Depp::Domain + - active_class = %w(registrar/domains registrar/check registrar/renew registrar/tranfer registrar/keyrelays).include?(params[:controller]) ? 'active' :nil + %li{class: active_class}= link_to t(:domains), registrar_domains_path + + - if can? :view, Depp::Contact + - active_class = ['registrar/contacts'].include?(params[:controller]) ? 'active' :nil + %li{class: active_class}= link_to t(:contacts), registrar_contacts_path + + - if can? :show, Invoice + - active_class = ['registrar/invoices'].include?(params[:controller]) ? 'active' :nil + %li{class: active_class}= link_to t(:billing), registrar_invoices_path + + - if !Rails.env.production? && can?(:manage, :xml_console) + - active_class = ['registrar/xml_consoles'].include?(params[:controller]) ? 'active' :nil + %li{class: active_class}= link_to t(:xml_console), registrar_xml_console_path + + %ul.nav.navbar-nav.navbar-right + %li.dropdown + %a.dropdown-toggle{"data-toggle" => "dropdown", href: "#"} + = "#{current_user} (#{current_user.roles.first}) - #{current_user.registrar}" + %span.caret + %ul.dropdown-menu{role: "menu"} + - ApiUser.all_by_identity_code(current_user.identity_code).each do |x| + %li= link_to "#{x} (#{x.roles.first}) - #{x.registrar}", "/registrar/switch_user/#{x.id}" + - if user_signed_in? + %li= link_to t(:log_out_), '/registrar/logout' From 5a542d3c67093f79fdd7af0c9393b49eacb10ffa Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Thu, 13 Apr 2017 18:42:50 +0300 Subject: [PATCH 04/22] Add registrar area form errors --- app/views/registrar/base/_form_errors.html.erb | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 app/views/registrar/base/_form_errors.html.erb diff --git a/app/views/registrar/base/_form_errors.html.erb b/app/views/registrar/base/_form_errors.html.erb new file mode 100644 index 000000000..0f898c81d --- /dev/null +++ b/app/views/registrar/base/_form_errors.html.erb @@ -0,0 +1,11 @@ +<% if target.errors.any? %> +
+

<%= pluralize(target.errors.count, 'error') %> prohibited this <%= target.model_name.human.downcase %> from being saved:

+ +
    + <% target.errors.full_messages.each do |message| %> +
  • <%= message %>
  • + <% end %> +
+
+<% end %> From cff8216d7a400fcd7c2ab072984f607a725210b8 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Thu, 13 Apr 2017 18:44:00 +0300 Subject: [PATCH 05/22] Add missing translation --- app/views/registrar/invoices/partials/_details.haml | 2 +- app/views/registrar/invoices/pdf.haml | 2 +- config/locales/en.yml | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/views/registrar/invoices/partials/_details.haml b/app/views/registrar/invoices/partials/_details.haml index 54ea4764a..1375c76f8 100644 --- a/app/views/registrar/invoices/partials/_details.haml +++ b/app/views/registrar/invoices/partials/_details.haml @@ -25,7 +25,7 @@ %dt= t(:payment_term) %dd= t(@invoice.payment_term) - %dt= t(:"invoice no") + %dt= t(:invoice_number) %dd= @invoice.number - if @invoice.description.present? diff --git a/app/views/registrar/invoices/pdf.haml b/app/views/registrar/invoices/pdf.haml index 3f3aabb6e..a74254a2a 100644 --- a/app/views/registrar/invoices/pdf.haml +++ b/app/views/registrar/invoices/pdf.haml @@ -175,7 +175,7 @@ %dt= t(:payment_term) %dd= t(@invoice.payment_term) - %dt= t(:"invoice no") + %dt= t(:invoice_number) %dd= @invoice.number - if @invoice.description.present? diff --git a/config/locales/en.yml b/config/locales/en.yml index 99b297c5e..581c9e80b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -666,6 +666,7 @@ en: amount: 'Amount' please_pay_the_following_invoice: 'Please pay the following invoice' invoice_no: 'Invoice no. %{no}' + invoice_number: Invoice no. seller: 'Seller' prepayment: 'Prepayment' vat: 'VAT (%{vat_prc}%)' From f363734cda6f8d88bb19e9410be88d1849d535bd Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Thu, 13 Apr 2017 18:44:33 +0300 Subject: [PATCH 06/22] Add default currency format --- config/locales/en.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config/locales/en.yml b/config/locales/en.yml index 581c9e80b..d57fcde60 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -935,3 +935,11 @@ en: cant_match_version: 'Impossible match version with request' user_not_authenticated: "user not authenticated" actions: Actions + + number: + currency: + format: + format: "%n %u" + delimiter: " " + precision: 2 + unit: € From 0f5aad8e8e30315218997ad8b0c4dd50d5a8e4b6 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Thu, 20 Apr 2017 13:23:46 +0300 Subject: [PATCH 07/22] Delete "zonefile:replace_procedure" rake task #475 --- lib/tasks/zonefile.rake | 125 ---------------------------------------- 1 file changed, 125 deletions(-) delete mode 100644 lib/tasks/zonefile.rake diff --git a/lib/tasks/zonefile.rake b/lib/tasks/zonefile.rake deleted file mode 100644 index f402528be..000000000 --- a/lib/tasks/zonefile.rake +++ /dev/null @@ -1,125 +0,0 @@ -namespace :zonefile do - desc 'Replace procedure' - task replace_procedure: :environment do - ActiveRecord::Base.connection.execute <<-SQL - CREATE OR REPLACE FUNCTION generate_zonefile(i_origin varchar) - RETURNS text AS $$ - DECLARE - zone_header text := concat('$ORIGIN ', i_origin, '.'); - serial_num varchar; - include_filter varchar := ''; - exclude_filter varchar := ''; - tmp_var text; - ret text; - BEGIN - -- define filters - include_filter = '%.' || i_origin; - - -- for %.%.% - IF i_origin ~ '\\.' THEN - exclude_filter := ''; - -- for %.% - ELSE - exclude_filter := '%.%.' || i_origin; - END IF; - - SELECT (extract(epoch from now() at time zone 'utc'))::int INTO serial_num; - - -- zonefile header - SELECT concat( - format('%-10s', '$ORIGIN .'), chr(10), - format('%-10s', '$TTL'), zf.ttl, chr(10), chr(10), - format('%-10s', i_origin || '.'), 'IN SOA ', zf.master_nameserver, '. ', zf.email, '. (', chr(10), - format('%-17s', ''), format('%-12s', serial_num), '; serial number', chr(10), - format('%-17s', ''), format('%-12s', zf.refresh), '; refresh, seconds', chr(10), - format('%-17s', ''), format('%-12s', zf.retry), '; retry, seconds', chr(10), - format('%-17s', ''), format('%-12s', zf.expire), '; expire, seconds', chr(10), - format('%-17s', ''), format('%-12s', zf.minimum_ttl), '; minimum TTL, seconds', chr(10), - format('%-17s', ''), ')' - ) FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; - - ret = concat(tmp_var, chr(10), chr(10)); - - -- origin ns records - SELECT ns_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; - ret := concat(ret, '; Zone NS Records', chr(10), tmp_var, chr(10)); - - -- ns records - SELECT array_to_string( - array( - SELECT concat(d.name_puny, '. IN NS ', ns.hostname, '.') - FROM domains d - JOIN nameservers ns ON ns.domain_id = d.id - WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter - AND NOT ('{serverHold,clientHold}' && d.statuses) - ORDER BY d.name - ), - chr(10) - ) INTO tmp_var; - - ret := concat(ret, tmp_var, chr(10), chr(10)); - - -- origin a glue records - SELECT a_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; - ret := concat(ret, '; Zone A Records', chr(10), tmp_var, chr(10)); - - -- a glue records for other nameservers - SELECT array_to_string( - array( - SELECT concat(ns.hostname, '. IN A ', unnest(ns.ipv4)) - FROM nameservers ns - JOIN domains d ON d.id = ns.domain_id - WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter - AND ns.hostname LIKE '%.' || d.name - AND d.name <> i_origin - AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '{}' - AND NOT ('{serverHold,clientHold}' && d.statuses) - ), chr(10) - ) INTO tmp_var; - - ret := concat(ret, tmp_var, chr(10), chr(10)); - - -- origin aaaa glue records - SELECT a4_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; - ret := concat(ret, '; Zone AAAA Records', chr(10), tmp_var, chr(10)); - - -- aaaa glue records for other nameservers - SELECT array_to_string( - array( - SELECT concat(ns.hostname, '. IN AAAA ', unnest(ns.ipv6)) - FROM nameservers ns - JOIN domains d ON d.id = ns.domain_id - WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter - AND ns.hostname LIKE '%.' || d.name - AND d.name <> i_origin - AND ns.ipv6 IS NOT NULL AND ns.ipv6 <> '{}' - AND NOT ('{serverHold,clientHold}' && d.statuses) - ), chr(10) - ) INTO tmp_var; - - ret := concat(ret, tmp_var, chr(10), chr(10)); - - -- ds records - SELECT array_to_string( - array( - SELECT concat( - d.name_puny, '. 3600 IN DS ', dk.ds_key_tag, ' ', - dk.ds_alg, ' ', dk.ds_digest_type, ' ', dk.ds_digest - ) - FROM domains d - JOIN dnskeys dk ON dk.domain_id = d.id - WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter AND dk.flags = 257 - AND NOT ('{serverHold,clientHold}' && d.statuses) - ), - chr(10) - ) INTO tmp_var; - - ret := concat(ret, '; Zone DS Records', chr(10), tmp_var, chr(10)); - - RETURN ret; - END; - $$ - LANGUAGE plpgsql; - SQL - end -end From f1d7e53734c6145f135cee9d3be6cc5fd02d3618 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Thu, 20 Apr 2017 16:08:28 +0300 Subject: [PATCH 08/22] Delete "zonefile:replace_procedure" rake task #475 --- doc/application_build_doc.md | 7 ------- lib/tasks/db.rake | 1 - lib/tasks/import.rake | 1 - 3 files changed, 9 deletions(-) diff --git a/doc/application_build_doc.md b/doc/application_build_doc.md index dcc0190b7..1f565d4d6 100644 --- a/doc/application_build_doc.md +++ b/doc/application_build_doc.md @@ -122,13 +122,6 @@ Crontab can be setup after deploy. Jobs can be viewed [here](/config/schedule.rb mina pr cron:setup # to update the crontab. mina pr cron:clear # to clear crontab. -### Zonefile procedure - -Zonefile procedure must be set up in server after deploy. The same command must be run whenever procedure is updated (see changelog). - - bundle exec rake zonefile:replace_procedure - - ### Application settings Application settings locate at [config/application-example.yml](/config/application-example.yml) diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake index 3d80d0f3b..0a345db44 100644 --- a/lib/tasks/db.rake +++ b/lib/tasks/db.rake @@ -58,7 +58,6 @@ namespace :db do puts "\n---------------------------- Import seed ----------------------------------------\n" Rake::Task['db:seed'].invoke - # Rake::Task['zonefile:replace_procedure'].invoke # not needed any more puts "\n All done!\n\n" end diff --git a/lib/tasks/import.rake b/lib/tasks/import.rake index 28786d278..546543100 100644 --- a/lib/tasks/import.rake +++ b/lib/tasks/import.rake @@ -57,7 +57,6 @@ namespace :import do Rake::Task['import:reserved'].invoke Rake::Task['import:domains'].invoke Rake::Task['import:zones'].invoke - Rake::Task['zonefile:replace_procedure'].invoke end desc 'Import registrars' From bff74372772eec8f480788cac908fef8d463d92d Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Thu, 20 Apr 2017 17:20:36 +0300 Subject: [PATCH 09/22] Refactor zones - Rename "zonefile_setting" to "zone" - Remove version #475 --- app/controllers/admin/dns/zones_controller.rb | 64 +++++++++++++ .../admin/zonefile_settings_controller.rb | 60 ------------ app/controllers/admin/zonefiles_controller.rb | 2 +- app/models/ability.rb | 2 +- app/models/dns.rb | 5 + app/models/dns/zone.rb | 48 ++++++++++ .../version/zonefile_setting_version.rb | 5 - app/models/zonefile_setting.rb | 42 --------- app/validators/domain_name_validator.rb | 4 +- app/views/admin/_menu.haml | 2 +- .../zones}/_form.haml | 7 +- app/views/admin/dns/zones/_zone.html.erb | 9 ++ app/views/admin/dns/zones/edit.html.erb | 20 ++++ app/views/admin/dns/zones/index.html.erb | 28 ++++++ app/views/admin/dns/zones/new.html.erb | 9 ++ app/views/admin/zonefile_settings/edit.haml | 7 -- app/views/admin/zonefile_settings/index.haml | 22 ----- app/views/admin/zonefile_settings/new.haml | 5 - config/locales/admin/dns/zones.en.yml | 33 +++++++ config/locales/admin/menu.en.yml | 1 + config/locales/en.yml | 12 --- config/routes.rb | 2 +- config/schedule.rb | 2 +- ...20048_rename_zonefile_settings_to_zones.rb | 5 + ...0420125200_remove_log_zonefile_settings.rb | 5 + db/schema-read-only.rb | 20 +--- db/seeds.rb | 2 +- db/structure.sql | 91 +++---------------- doc/controllers_brief.svg | 5 - doc/controllers_complete.svg | 14 --- doc/models_brief.svg | 23 ----- doc/models_complete.svg | 48 ---------- lib/tasks/import.rake | 20 ++-- ...tting_fabricator.rb => zone_fabricator.rb} | 2 +- spec/factories/dns/zone.rb | 12 +++ spec/features/admin/dns/zones/delete_spec.rb | 16 ++++ spec/features/admin/dns/zones/edit_spec.rb | 29 ++++++ spec/features/admin/dns/zones/new_spec.rb | 39 ++++++++ spec/models/concerns/domain/expirable_spec.rb | 2 +- .../concerns/domain/force_delete_spec.rb | 2 +- spec/models/contact_spec.rb | 4 +- .../zone_spec.rb} | 6 +- spec/models/dnskey_spec.rb | 2 +- spec/models/domain_cron_spec.rb | 4 +- spec/models/domain_spec.rb | 14 +-- spec/models/domain_transfer_spec.rb | 2 +- spec/models/keyrelay_spec.rb | 2 +- spec/models/legal_document_spec.rb | 10 +- spec/models/nameserver_spec.rb | 2 +- spec/models/registrant_verification_spec.rb | 2 +- .../admin/dns/zones/index.html.erb_spec.rb | 40 ++++++++ 51 files changed, 425 insertions(+), 389 deletions(-) create mode 100644 app/controllers/admin/dns/zones_controller.rb delete mode 100644 app/controllers/admin/zonefile_settings_controller.rb create mode 100644 app/models/dns.rb create mode 100644 app/models/dns/zone.rb delete mode 100644 app/models/version/zonefile_setting_version.rb delete mode 100644 app/models/zonefile_setting.rb rename app/views/admin/{zonefile_settings => dns/zones}/_form.haml (91%) create mode 100644 app/views/admin/dns/zones/_zone.html.erb create mode 100644 app/views/admin/dns/zones/edit.html.erb create mode 100644 app/views/admin/dns/zones/index.html.erb create mode 100644 app/views/admin/dns/zones/new.html.erb delete mode 100644 app/views/admin/zonefile_settings/edit.haml delete mode 100644 app/views/admin/zonefile_settings/index.haml delete mode 100644 app/views/admin/zonefile_settings/new.haml create mode 100644 config/locales/admin/dns/zones.en.yml create mode 100644 db/migrate/20170419120048_rename_zonefile_settings_to_zones.rb create mode 100644 db/migrate/20170420125200_remove_log_zonefile_settings.rb rename spec/fabricators/{zonefile_setting_fabricator.rb => zone_fabricator.rb} (95%) create mode 100644 spec/factories/dns/zone.rb create mode 100644 spec/features/admin/dns/zones/delete_spec.rb create mode 100644 spec/features/admin/dns/zones/edit_spec.rb create mode 100644 spec/features/admin/dns/zones/new_spec.rb rename spec/models/{zonefile_setting_spec.rb => dns/zone_spec.rb} (68%) create mode 100644 spec/views/admin/dns/zones/index.html.erb_spec.rb diff --git a/app/controllers/admin/dns/zones_controller.rb b/app/controllers/admin/dns/zones_controller.rb new file mode 100644 index 000000000..67d1790f5 --- /dev/null +++ b/app/controllers/admin/dns/zones_controller.rb @@ -0,0 +1,64 @@ +module Admin + module DNS + class ZonesController < AdminController + #load_and_authorize_resource(class: DNS::Zone) + skip_authorization_check + before_action :load_zone, only: %i[edit update destroy] + + def index + @zones = ::DNS::Zone.all + end + + def new + @zone = ::DNS::Zone.new + end + + def create + @zone = ::DNS::Zone.new(zone_params) + + if @zone.save + flash[:notice] = t('.created') + redirect_to_index + else + render :new + end + end + + def edit + @zone = ::DNS::Zone.find(params[:id]) + end + + def update + if @zone.update(zone_params) + flash[:notice] = t('.updated') + redirect_to_index + else + render :edit + end + end + + def destroy + @zone.destroy! + flash[:notice] = t('.destroyed') + redirect_to_index + end + + private + + def load_zone + @zone = ::DNS::Zone.find(params[:id]) + end + + def zone_params + params.require(:zone).permit( + :origin, :ttl, :refresh, :retry, :expire, :minimum_ttl, :email, + :master_nameserver, :ns_records, :a_records, :a4_records + ) + end + + def redirect_to_index + redirect_to admin_zones_url + end + end + end +end diff --git a/app/controllers/admin/zonefile_settings_controller.rb b/app/controllers/admin/zonefile_settings_controller.rb deleted file mode 100644 index 34283d872..000000000 --- a/app/controllers/admin/zonefile_settings_controller.rb +++ /dev/null @@ -1,60 +0,0 @@ -class Admin::ZonefileSettingsController < AdminController - load_and_authorize_resource - before_action :set_zonefile_setting, only: [:update, :edit] - def index - @zonefile_settings = ZonefileSetting.all - end - - def new - @zonefile_setting = ZonefileSetting.new - end - - def create - @zonefile_setting = ZonefileSetting.new(zonefile_setting_params) - - if @zonefile_setting.save - flash[:notice] = I18n.t('record_created') - redirect_to admin_zonefile_settings_path - else - flash.now[:alert] = I18n.t('failed_to_create_record') - render 'new' - end - end - - def edit - @zonefile_setting = ZonefileSetting.find(params[:id]) - end - - def update - if @zonefile_setting.update(zonefile_setting_params) - flash[:notice] = I18n.t('record_updated') - redirect_to admin_zonefile_settings_path - else - flash.now[:alert] = I18n.t('failed_to_update_record') - render 'edit' - end - end - - def destroy - if @zonefile_setting.destroy - flash[:notice] = I18n.t('record_deleted') - redirect_to admin_zonefile_settings_path - else - flash.now[:alert] = I18n.t('failed_to_delete_record') - render 'edit' - end - end - - private - - def set_zonefile_setting - @zonefile_setting = ZonefileSetting.find(params[:id]) - end - - def zonefile_setting_params - params.require(:zonefile_setting).permit( - :origin, :ttl, :refresh, :retry, :expire, :minimum_ttl, :email, - :master_nameserver, :ns_records, :a_records, :a4_records - ) - end -end diff --git a/app/controllers/admin/zonefiles_controller.rb b/app/controllers/admin/zonefiles_controller.rb index 1c0fed936..20d57dc90 100644 --- a/app/controllers/admin/zonefiles_controller.rb +++ b/app/controllers/admin/zonefiles_controller.rb @@ -3,7 +3,7 @@ class Admin::ZonefilesController < ApplicationController # TODO: Refactor this def create - if ZonefileSetting.origins.include?(params[:origin]) + if DNS::Zone.origins.include?(params[:origin]) @zonefile = ActiveRecord::Base.connection.execute( "select generate_zonefile('#{params[:origin]}')" diff --git a/app/models/ability.rb b/app/models/ability.rb index 82ffd7c2e..3abe9d860 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -93,7 +93,7 @@ class Ability can :manage, Setting can :manage, BlockedDomain can :manage, ReservedDomain - can :manage, ZonefileSetting + can :manage, DNS::Zone can :manage, DomainVersion can :manage, ContactVersion can :manage, Pricelist diff --git a/app/models/dns.rb b/app/models/dns.rb new file mode 100644 index 000000000..bdc95d4f2 --- /dev/null +++ b/app/models/dns.rb @@ -0,0 +1,5 @@ +module DNS + def self.use_relative_model_naming? + true + end +end diff --git a/app/models/dns/zone.rb b/app/models/dns/zone.rb new file mode 100644 index 000000000..e57c7b712 --- /dev/null +++ b/app/models/dns/zone.rb @@ -0,0 +1,48 @@ +module DNS + class Zone < ActiveRecord::Base + validates :origin, :ttl, :refresh, :retry, :expire, :minimum_ttl, :email, :master_nameserver, presence: true + validates :ttl, :refresh, :retry, :expire, :minimum_ttl, numericality: { only_integer: true } + validates :origin, uniqueness: true + + before_destroy :check_for_dependencies + + def check_for_dependencies + dc = Domain.where("name ILIKE ?", "%.#{origin}").count + return if dc == 0 + errors.add(:base, I18n.t('there_are_count_domains_in_this_zone', count: dc)) + false + end + + def self.generate_zonefiles + pluck(:origin).each do |origin| + generate_zonefile(origin) + end + end + + def self.generate_zonefile(origin) + filename = "#{origin}.zone" + + STDOUT << "#{Time.zone.now.utc} - Generating zonefile #{filename}\n" + + zf = ActiveRecord::Base.connection.execute( + "select generate_zonefile('#{origin}')" + )[0]['generate_zonefile'] + + File.open("#{ENV['zonefile_export_dir']}/#{filename}", 'w') { |f| f.write(zf) } + + STDOUT << "#{Time.zone.now.utc} - Successfully generated zonefile #{filename}\n" + end + + def self.origins + pluck(:origin) + end + + def to_s + origin + end + + def to_partial_path + 'zone' + end + end +end diff --git a/app/models/version/zonefile_setting_version.rb b/app/models/version/zonefile_setting_version.rb deleted file mode 100644 index d8d195d5a..000000000 --- a/app/models/version/zonefile_setting_version.rb +++ /dev/null @@ -1,5 +0,0 @@ -class ZonefileSettingVersion < PaperTrail::Version - include VersionSession - self.table_name = :log_zonefile_settings - self.sequence_name = :log_zonefile_settings_id_seq -end diff --git a/app/models/zonefile_setting.rb b/app/models/zonefile_setting.rb deleted file mode 100644 index 9f2b2b862..000000000 --- a/app/models/zonefile_setting.rb +++ /dev/null @@ -1,42 +0,0 @@ -class ZonefileSetting < ActiveRecord::Base - include Versions # version/zonefile_setting_version.rb - validates :origin, :ttl, :refresh, :retry, :expire, :minimum_ttl, :email, :master_nameserver, presence: true - validates :ttl, :refresh, :retry, :expire, :minimum_ttl, numericality: { only_integer: true } - validates :origin, uniqueness: true - - before_destroy :check_for_dependencies - def check_for_dependencies - dc = Domain.where("name ILIKE ?", "%.#{origin}").count - return if dc == 0 - errors.add(:base, I18n.t('there_are_count_domains_in_this_zone', count: dc)) - false - end - - def self.generate_zonefiles - pluck(:origin).each do |origin| - generate_zonefile(origin) - end - end - - def self.generate_zonefile(origin) - filename = "#{origin}.zone" - - STDOUT << "#{Time.zone.now.utc} - Generating zonefile #{filename}\n" - - zf = ActiveRecord::Base.connection.execute( - "select generate_zonefile('#{origin}')" - )[0]['generate_zonefile'] - - File.open("#{ENV['zonefile_export_dir']}/#{filename}", 'w') { |f| f.write(zf) } - - STDOUT << "#{Time.zone.now.utc} - Successfully generated zonefile #{filename}\n" - end - - def self.origins - pluck(:origin) - end - - def to_s - origin - end -end diff --git a/app/validators/domain_name_validator.rb b/app/validators/domain_name_validator.rb index be8cbb65f..49939087c 100644 --- a/app/validators/domain_name_validator.rb +++ b/app/validators/domain_name_validator.rb @@ -12,7 +12,7 @@ class DomainNameValidator < ActiveModel::EachValidator return true unless value value = value.mb_chars.downcase.strip - origins = ZonefileSetting.origins + origins = DNS::Zone.origins # if someone tries to register an origin domain, let this validation pass # the error will be caught in blocked domains validator return true if origins.include?(value) @@ -38,7 +38,7 @@ class DomainNameValidator < ActiveModel::EachValidator def validate_blocked(value) return true unless value return false if BlockedDomain.where(name: value).count > 0 - ZonefileSetting.where(origin: value).count.zero? + DNS::Zone.where(origin: value).count.zero? end end end diff --git a/app/views/admin/_menu.haml b/app/views/admin/_menu.haml index 8b63b2c25..fbb1728a9 100644 --- a/app/views/admin/_menu.haml +++ b/app/views/admin/_menu.haml @@ -31,7 +31,7 @@ %li.divider %li.dropdown-header= t(:system) %li= link_to t(:settings), admin_settings_path - %li= link_to t(:zonefile), admin_zonefile_settings_path + %li= link_to t('.zones'), admin_zones_path %li= link_to t('.blocked_domains'), admin_blocked_domains_path %li= link_to t('.reserved_domains'), admin_reserved_domains_path %li= link_to t(:mail_templates), admin_mail_templates_path diff --git a/app/views/admin/zonefile_settings/_form.haml b/app/views/admin/dns/zones/_form.haml similarity index 91% rename from app/views/admin/zonefile_settings/_form.haml rename to app/views/admin/dns/zones/_form.haml index 42ef94efa..e935c5d97 100644 --- a/app/views/admin/zonefile_settings/_form.haml +++ b/app/views/admin/dns/zones/_form.haml @@ -1,5 +1,4 @@ - -= form_for [:admin, @zonefile_setting], html: { class: 'form-horizontal' } do |f| += form_for [:admin, zone], html: { class: 'form-horizontal' } do |f| .row .col-md-8 #domain-statuses @@ -9,7 +8,7 @@ .col-md-4.control-label = f.label :origin .col-md-8 - - if @zonefile_setting.persisted? + - if zone.persisted? = f.text_field :origin, class: 'form-control', disabled: true - else = f.text_field :origin, class: 'form-control' @@ -77,4 +76,4 @@ %hr .row .col-md-8.text-right - %button.btn.btn-primary= t(:save) + %button.btn.btn-success= t(".#{zone.new_record? ? 'create' : 'update'}_btn") diff --git a/app/views/admin/dns/zones/_zone.html.erb b/app/views/admin/dns/zones/_zone.html.erb new file mode 100644 index 000000000..3a2d782d4 --- /dev/null +++ b/app/views/admin/dns/zones/_zone.html.erb @@ -0,0 +1,9 @@ + + <%= zone.origin %> + + <%= link_to t('.edit_btn'), edit_admin_zone_path(zone), class: 'btn btn-xs btn-primary' %> + <%= link_to t('.generate_zone_file_btn'), + admin_zonefiles_path(origin: zone.origin), + method: 'post', class: 'btn btn-xs btn-primary' %> + + diff --git a/app/views/admin/dns/zones/edit.html.erb b/app/views/admin/dns/zones/edit.html.erb new file mode 100644 index 000000000..645a77197 --- /dev/null +++ b/app/views/admin/dns/zones/edit.html.erb @@ -0,0 +1,20 @@ + + + + +<%= render 'form', zone: @zone %> diff --git a/app/views/admin/dns/zones/index.html.erb b/app/views/admin/dns/zones/index.html.erb new file mode 100644 index 000000000..eb945873e --- /dev/null +++ b/app/views/admin/dns/zones/index.html.erb @@ -0,0 +1,28 @@ + + +<% if @zones.present? %> + + + + + + + + + + <%= render @zones %> + +
<%= DNS::Zone.human_attribute_name :origin %>
+<% else %> +
<%= t '.not_found' %>
+<% end %> diff --git a/app/views/admin/dns/zones/new.html.erb b/app/views/admin/dns/zones/new.html.erb new file mode 100644 index 000000000..fc37f984b --- /dev/null +++ b/app/views/admin/dns/zones/new.html.erb @@ -0,0 +1,9 @@ + + + + +<%= render 'form', zone: @zone %> diff --git a/app/views/admin/zonefile_settings/edit.haml b/app/views/admin/zonefile_settings/edit.haml deleted file mode 100644 index 93234ed2e..000000000 --- a/app/views/admin/zonefile_settings/edit.haml +++ /dev/null @@ -1,7 +0,0 @@ -- content_for :actions do - = link_to(t(:back), admin_zonefile_settings_path, class: 'btn btn-default') - = link_to(t(:delete), admin_zonefile_setting_path(@zonefile_setting), - method: :delete, data: { confirm: t(:are_you_sure) }, class: 'btn btn-danger') -= render 'shared/title', name: t(:edit_zone) - -= render 'form' diff --git a/app/views/admin/zonefile_settings/index.haml b/app/views/admin/zonefile_settings/index.haml deleted file mode 100644 index a062c0793..000000000 --- a/app/views/admin/zonefile_settings/index.haml +++ /dev/null @@ -1,22 +0,0 @@ -- content_for :actions do - = link_to(t(:new), new_admin_zonefile_setting_path, class: 'btn btn-primary') -= render 'shared/title', name: t(:zonefile_settings) - -.row - .col-md-12 - .table-responsive - %table.table.table-hover.table-bordered.table-condensed - %thead - %tr - %th{class: 'col-xs-10'} - = t(:origin) - %th{class: 'col-xs-2'} - = t(:action) - %tbody - - @zonefile_settings.each do |x| - %tr - %td= link_to(x, edit_admin_zonefile_setting_path(x)) - %td - = link_to(t(:generate_zonefile), - admin_zonefiles_path(origin: x.origin), - method: 'post', class: 'btn btn-xs btn-primary') diff --git a/app/views/admin/zonefile_settings/new.haml b/app/views/admin/zonefile_settings/new.haml deleted file mode 100644 index 211054e03..000000000 --- a/app/views/admin/zonefile_settings/new.haml +++ /dev/null @@ -1,5 +0,0 @@ -- content_for :actions do - = link_to(t(:back), admin_zonefile_settings_path, class: 'btn btn-default') -= render 'shared/title', name: t(:new_zone) - -= render 'form' diff --git a/config/locales/admin/dns/zones.en.yml b/config/locales/admin/dns/zones.en.yml new file mode 100644 index 000000000..c6fd4093b --- /dev/null +++ b/config/locales/admin/dns/zones.en.yml @@ -0,0 +1,33 @@ +en: + admin: + dns: + zones: + index: + title: Zones + new_btn: New zone + not_found: No zone found + + new: + title: New zone + + create: + created: Zone has been created + + edit: + title: Edit zone + delete_btn: Delete + delete_btn_confirm: Are you sure you want to delete zone? + + update: + updated: Zone has been updated + + destroy: + destroyed: Zone has been deleted + + form: + create_btn: Create zone + update_btn: Update zone + + zone: + edit_btn: Edit + generate_zone_file_btn: Generate zone file diff --git a/config/locales/admin/menu.en.yml b/config/locales/admin/menu.en.yml index 2eaab9ed7..30b289797 100644 --- a/config/locales/admin/menu.en.yml +++ b/config/locales/admin/menu.en.yml @@ -7,6 +7,7 @@ en: archive: Archive domain_history: Domain history contact_history: Contact history + zones: Zones blocked_domains: Blocked domains reserved_domains: Reserved domains epp_log: EPP log diff --git a/config/locales/en.yml b/config/locales/en.yml index d57fcde60..14c0d3188 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -232,14 +232,6 @@ en: protocol: 'Protocol' alg: 'Algorithm' public_key: 'Public key' - - zonefile_setting: - ttl: 'TTL' - refresh: 'Refresh' - retry: 'Retry' - expire: 'Expire' - minimum_ttl: 'Minimum TTL' - email: 'E-Mail' registrar: billing_email: 'Billing e-mail' phone: 'Contact phone' @@ -436,7 +428,6 @@ en: transfer_requested: 'Transfer requested.' message_was_not_found: 'Message was not found' host_obj_is_not_allowed: 'hostObj object is not allowed' - generate_zonefile: 'Generate zonefile' zonefile: 'Zonefile' only_one_parameter_allowed: 'Only one parameter allowed: %{param_1} or %{param_2}' exactly_one_parameter_required: 'Exactly one parameter required: %{params}' @@ -450,7 +441,6 @@ en: ds_data_with_key_allowed: 'Allow DS data with key' key_data_allowed: 'Allow key data' ds_digest_type: 'DS digest type' - zonefile_settings: 'Zonefile settings' background_jobs: Background jobs domains_history: Domains history role: 'Role' @@ -895,8 +885,6 @@ en: failed_to_generate_invoice_invoice_number_limit_reached: 'Failed to generate invoice - invoice number limit reached' is_too_small_minimum_deposit_is: 'is too small. Minimum deposit is %{amount} %{currency}' a4_records: 'AAAA records' - new_zone: 'New zone' - edit_zone: 'Edit zone' there_are_count_domains_in_this_zone: 'There are %{count} domains in this zone' poll_pending_update_confirmed_by_registrant: 'Registrant confirmed domain update' poll_pending_update_rejected_by_registrant: 'Registrant rejected domain update' diff --git a/config/routes.rb b/config/routes.rb index 8b52e7091..371ecc066 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -170,7 +170,7 @@ Rails.application.routes.draw do namespace :admin do resources :keyrelays resources :zonefiles - resources :zonefile_settings + resources :zones, controller: 'dns/zones', except: %i[show] resources :legal_documents resources :keyrelays resources :pricelists diff --git a/config/schedule.rb b/config/schedule.rb index b364f59e0..a2676ef65 100644 --- a/config/schedule.rb +++ b/config/schedule.rb @@ -14,7 +14,7 @@ set :output, 'log/cron.log' if @cron_group == 'registry' every 10.minutes do - runner 'ZonefileSetting.generate_zonefiles' + runner 'DNS::Zone.generate_zonefiles' end every 6.months, at: '12:01am' do diff --git a/db/migrate/20170419120048_rename_zonefile_settings_to_zones.rb b/db/migrate/20170419120048_rename_zonefile_settings_to_zones.rb new file mode 100644 index 000000000..6ea53529a --- /dev/null +++ b/db/migrate/20170419120048_rename_zonefile_settings_to_zones.rb @@ -0,0 +1,5 @@ +class RenameZonefileSettingsToZones < ActiveRecord::Migration + def change + rename_table :zonefile_settings, :zones + end +end diff --git a/db/migrate/20170420125200_remove_log_zonefile_settings.rb b/db/migrate/20170420125200_remove_log_zonefile_settings.rb new file mode 100644 index 000000000..1cfed1de6 --- /dev/null +++ b/db/migrate/20170420125200_remove_log_zonefile_settings.rb @@ -0,0 +1,5 @@ +class RemoveLogZonefileSettings < ActiveRecord::Migration + def change + drop_table :log_zonefile_settings + end +end diff --git a/db/schema-read-only.rb b/db/schema-read-only.rb index 7bebdbba9..11fdff432 100644 --- a/db/schema-read-only.rb +++ b/db/schema-read-only.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170221115548) do +ActiveRecord::Schema.define(version: 20170420125200) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -914,22 +914,6 @@ ActiveRecord::Schema.define(version: 20170221115548) do t.string "uuid" end - create_table "log_zonefile_settings", force: :cascade do |t| - t.string "item_type", null: false - t.integer "item_id", null: false - t.string "event", null: false - t.string "whodunnit" - t.json "object" - t.json "object_changes" - t.datetime "created_at" - t.string "session" - t.json "children" - t.string "uuid" - end - - add_index "log_zonefile_settings", ["item_type", "item_id"], name: "index_log_zonefile_settings_on_item_type_and_item_id", using: :btree - add_index "log_zonefile_settings", ["whodunnit"], name: "index_log_zonefile_settings_on_whodunnit", using: :btree - create_table "mail_templates", force: :cascade do |t| t.string "name", null: false t.string "subject" @@ -1141,7 +1125,7 @@ ActiveRecord::Schema.define(version: 20170221115548) do add_index "whois_records", ["domain_id"], name: "index_whois_records_on_domain_id", using: :btree add_index "whois_records", ["registrar_id"], name: "index_whois_records_on_registrar_id", using: :btree - create_table "zonefile_settings", force: :cascade do |t| + create_table "zones", force: :cascade do |t| t.string "origin" t.integer "ttl" t.integer "refresh" diff --git a/db/seeds.rb b/db/seeds.rb index 0ed61cba6..3375a433a 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -34,7 +34,7 @@ ActiveRecord::Base.transaction do roles: ['admin'] ) - ZonefileSetting.create!( + DNS::Zone.create!( origin: 'tld', ttl: 43200, refresh: 3600, diff --git a/db/structure.sql b/db/structure.sql index 373d7239e..37dadaf65 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -2374,44 +2374,6 @@ CREATE SEQUENCE log_white_ips_id_seq ALTER SEQUENCE log_white_ips_id_seq OWNED BY log_white_ips.id; --- --- Name: log_zonefile_settings; Type: TABLE; Schema: public; Owner: -; Tablespace: --- - -CREATE TABLE log_zonefile_settings ( - id integer NOT NULL, - item_type character varying NOT NULL, - item_id integer NOT NULL, - event character varying NOT NULL, - whodunnit character varying, - object json, - object_changes json, - created_at timestamp without time zone, - session character varying, - children json, - uuid character varying -); - - --- --- Name: log_zonefile_settings_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE log_zonefile_settings_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: log_zonefile_settings_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE log_zonefile_settings_id_seq OWNED BY log_zonefile_settings.id; - - -- -- Name: mail_templates; Type: TABLE; Schema: public; Owner: -; Tablespace: -- @@ -2968,10 +2930,10 @@ ALTER SEQUENCE whois_records_id_seq OWNED BY whois_records.id; -- --- Name: zonefile_settings; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: zones; Type: TABLE; Schema: public; Owner: -; Tablespace: -- -CREATE TABLE zonefile_settings ( +CREATE TABLE zones ( id integer NOT NULL, origin character varying, ttl integer, @@ -2992,10 +2954,10 @@ CREATE TABLE zonefile_settings ( -- --- Name: zonefile_settings_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- Name: zones_id_seq; Type: SEQUENCE; Schema: public; Owner: - -- -CREATE SEQUENCE zonefile_settings_id_seq +CREATE SEQUENCE zones_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -3004,10 +2966,10 @@ CREATE SEQUENCE zonefile_settings_id_seq -- --- Name: zonefile_settings_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - +-- Name: zones_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - -- -ALTER SEQUENCE zonefile_settings_id_seq OWNED BY zonefile_settings.id; +ALTER SEQUENCE zones_id_seq OWNED BY zones.id; -- @@ -3381,13 +3343,6 @@ ALTER TABLE ONLY log_users ALTER COLUMN id SET DEFAULT nextval('log_users_id_seq ALTER TABLE ONLY log_white_ips ALTER COLUMN id SET DEFAULT nextval('log_white_ips_id_seq'::regclass); --- --- Name: id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY log_zonefile_settings ALTER COLUMN id SET DEFAULT nextval('log_zonefile_settings_id_seq'::regclass); - - -- -- Name: id; Type: DEFAULT; Schema: public; Owner: - -- @@ -3490,7 +3445,7 @@ ALTER TABLE ONLY whois_records ALTER COLUMN id SET DEFAULT nextval('whois_record -- Name: id; Type: DEFAULT; Schema: public; Owner: - -- -ALTER TABLE ONLY zonefile_settings ALTER COLUMN id SET DEFAULT nextval('zonefile_settings_id_seq'::regclass); +ALTER TABLE ONLY zones ALTER COLUMN id SET DEFAULT nextval('zones_id_seq'::regclass); -- @@ -3917,14 +3872,6 @@ ALTER TABLE ONLY log_white_ips ADD CONSTRAINT log_white_ips_pkey PRIMARY KEY (id); --- --- Name: log_zonefile_settings_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: --- - -ALTER TABLE ONLY log_zonefile_settings - ADD CONSTRAINT log_zonefile_settings_pkey PRIMARY KEY (id); - - -- -- Name: mail_templates_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -4038,11 +3985,11 @@ ALTER TABLE ONLY whois_records -- --- Name: zonefile_settings_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: zones_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- -ALTER TABLE ONLY zonefile_settings - ADD CONSTRAINT zonefile_settings_pkey PRIMARY KEY (id); +ALTER TABLE ONLY zones + ADD CONSTRAINT zones_pkey PRIMARY KEY (id); -- @@ -4675,20 +4622,6 @@ CREATE INDEX index_log_users_on_item_type_and_item_id ON log_users USING btree ( CREATE INDEX index_log_users_on_whodunnit ON log_users USING btree (whodunnit); --- --- Name: index_log_zonefile_settings_on_item_type_and_item_id; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX index_log_zonefile_settings_on_item_type_and_item_id ON log_zonefile_settings USING btree (item_type, item_id); - - --- --- Name: index_log_zonefile_settings_on_whodunnit; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX index_log_zonefile_settings_on_whodunnit ON log_zonefile_settings USING btree (whodunnit); - - -- -- Name: index_messages_on_registrar_id; Type: INDEX; Schema: public; Owner: -; Tablespace: -- @@ -5280,3 +5213,7 @@ INSERT INTO schema_migrations (version) VALUES ('20161227193500'); INSERT INTO schema_migrations (version) VALUES ('20170221115548'); +INSERT INTO schema_migrations (version) VALUES ('20170419120048'); + +INSERT INTO schema_migrations (version) VALUES ('20170420125200'); + diff --git a/doc/controllers_brief.svg b/doc/controllers_brief.svg index a5a1a555a..7c4770d50 100644 --- a/doc/controllers_brief.svg +++ b/doc/controllers_brief.svg @@ -142,11 +142,6 @@ Admin::DashboardsController - -Admin::ZonefileSettingsController - -Admin::ZonefileSettingsController - Admin::RegistrarsController diff --git a/doc/controllers_complete.svg b/doc/controllers_complete.svg index 40c0a2ec1..8f3253a67 100644 --- a/doc/controllers_complete.svg +++ b/doc/controllers_complete.svg @@ -377,20 +377,6 @@ _layout - -Admin::ZonefileSettingsController - -Admin::ZonefileSettingsController - -edit -index -update - - -_layout -set_zonefile_setting -zonefile_setting_params - Admin::RegistrarsController diff --git a/doc/models_brief.svg b/doc/models_brief.svg index 6cd637e1b..8075f6e58 100644 --- a/doc/models_brief.svg +++ b/doc/models_brief.svg @@ -337,17 +337,6 @@ - -ZonefileSettingVersion - -ZonefileSettingVersion - - -ZonefileSettingVersion->VersionAssociation - - - - DomainVersion @@ -1219,18 +1208,6 @@ RegistrantVerification - -ZonefileSetting - -ZonefileSetting - - -ZonefileSetting->ZonefileSettingVersion - - - -versions - TechDomainContact->DomainContactVersion diff --git a/doc/models_complete.svg b/doc/models_complete.svg index 38d17ab3d..a0889d72b 100644 --- a/doc/models_complete.svg +++ b/doc/models_complete.svg @@ -665,28 +665,6 @@ - -ZonefileSettingVersion - -ZonefileSettingVersion - -id :integer -item_type :string -item_id :integer -event :string -whodunnit :string -object :json -object_changes :json -created_at :datetime -session :string -children :json - - -ZonefileSettingVersion->VersionAssociation - - - - DomainVersion @@ -1981,32 +1959,6 @@ domain_id :integer action_type :string - -ZonefileSetting - -ZonefileSetting - -id :integer -origin :string -ttl :integer -refresh :integer -retry :integer -expire :integer -minimum_ttl :integer -email :string -master_nameserver :string -created_at :datetime -updated_at :datetime -creator_str :string -updator_str :string - - -ZonefileSetting->ZonefileSettingVersion - - - -versions - TechDomainContact->DomainContactVersion diff --git a/lib/tasks/import.rake b/lib/tasks/import.rake index 546543100..cb37c0f1d 100644 --- a/lib/tasks/import.rake +++ b/lib/tasks/import.rake @@ -604,7 +604,7 @@ namespace :import do ns_records, a_records, a4_records = parse_zone_ns_data('ee', 1) - ZonefileSetting.create!({ + DNS::Zone.create!({ origin: 'ee', ttl: 43200, refresh: 3600, @@ -621,7 +621,7 @@ namespace :import do # edu.ee ns_records, a_records, a4_records = parse_zone_ns_data('edu.ee', 6) - ZonefileSetting.create!({ + DNS::Zone.create!({ origin: 'edu.ee', ttl: 43200, refresh: 3600, @@ -638,7 +638,7 @@ namespace :import do # aip.ee ns_records, a_records, a4_records = parse_zone_ns_data('aip.ee', 9) - ZonefileSetting.create!({ + DNS::Zone.create!({ origin: 'aip.ee', ttl: 43200, refresh: 3600, @@ -655,7 +655,7 @@ namespace :import do # org.ee ns_records, a_records, a4_records = parse_zone_ns_data('org.ee', 10) - ZonefileSetting.create!({ + DNS::Zone.create!({ origin: 'org.ee', ttl: 43200, refresh: 3600, @@ -672,7 +672,7 @@ namespace :import do # pri.ee ns_records, a_records, a4_records = parse_zone_ns_data('pri.ee', 2) - ZonefileSetting.create!({ + DNS::Zone.create!({ origin: 'pri.ee', ttl: 43200, refresh: 3600, @@ -689,7 +689,7 @@ namespace :import do # med.ee ns_records, a_records, a4_records = parse_zone_ns_data('med.ee', 3) - ZonefileSetting.create!({ + DNS::Zone.create!({ origin: 'med.ee', ttl: 43200, refresh: 3600, @@ -706,7 +706,7 @@ namespace :import do # fie.ee ns_records, a_records, a4_records = parse_zone_ns_data('fie.ee', 4) - ZonefileSetting.create!({ + DNS::Zone.create!({ origin: 'fie.ee', ttl: 43200, refresh: 3600, @@ -723,7 +723,7 @@ namespace :import do # com.ee ns_records, a_records, a4_records = parse_zone_ns_data('com.ee', 5) - ZonefileSetting.create!({ + DNS::Zone.create!({ origin: 'com.ee', ttl: 43200, refresh: 3600, @@ -740,7 +740,7 @@ namespace :import do # gov.ee ns_records, a_records, a4_records = parse_zone_ns_data('gov.ee', 7) - ZonefileSetting.create!({ + DNS::Zone.create!({ origin: 'gov.ee', ttl: 43200, refresh: 3600, @@ -757,7 +757,7 @@ namespace :import do # riik.ee ns_records, a_records, a4_records = parse_zone_ns_data('riik.ee', 8) - ZonefileSetting.create!({ + DNS::Zone.create!({ origin: 'riik.ee', ttl: 43200, refresh: 3600, diff --git a/spec/fabricators/zonefile_setting_fabricator.rb b/spec/fabricators/zone_fabricator.rb similarity index 95% rename from spec/fabricators/zonefile_setting_fabricator.rb rename to spec/fabricators/zone_fabricator.rb index eae2663b3..e7bf81c42 100644 --- a/spec/fabricators/zonefile_setting_fabricator.rb +++ b/spec/fabricators/zone_fabricator.rb @@ -1,4 +1,4 @@ -Fabricator(:zonefile_setting) do +Fabricator(:zone, from: 'DNS::Zone') do origin 'ee' ttl 43200 refresh 3600 diff --git a/spec/factories/dns/zone.rb b/spec/factories/dns/zone.rb new file mode 100644 index 000000000..35a38826d --- /dev/null +++ b/spec/factories/dns/zone.rb @@ -0,0 +1,12 @@ +FactoryGirl.define do + factory :zone, class: DNS::Zone do + origin 'test' + ttl 1 + refresh 1 + add_attribute :retry, 1 + expire 1 + minimum_ttl 1 + email 'test@test.test' + master_nameserver 'test.test' + end +end diff --git a/spec/features/admin/dns/zones/delete_spec.rb b/spec/features/admin/dns/zones/delete_spec.rb new file mode 100644 index 000000000..724ba8680 --- /dev/null +++ b/spec/features/admin/dns/zones/delete_spec.rb @@ -0,0 +1,16 @@ +require 'rails_helper' + +RSpec.feature 'Deleting zone in admin area' do + given!(:zone) { create(:zone) } + + background do + sign_in_to_admin_area + end + + scenario 'deletes zone' do + visit edit_admin_zone_url(zone) + click_link_or_button t('admin.dns.zones.edit.delete_btn') + + expect(page).to have_text(t('admin.dns.zones.destroy.destroyed')) + end +end diff --git a/spec/features/admin/dns/zones/edit_spec.rb b/spec/features/admin/dns/zones/edit_spec.rb new file mode 100644 index 000000000..26019cb3c --- /dev/null +++ b/spec/features/admin/dns/zones/edit_spec.rb @@ -0,0 +1,29 @@ +require 'rails_helper' + +RSpec.feature 'Editing zone in admin area' do + given!(:zone) { create(:zone) } + + background do + sign_in_to_admin_area + end + + scenario 'updates zone' do + open_list + open_form + submit_form + + expect(page).to have_text(t('admin.dns.zones.update.updated')) + end + + def open_list + click_link_or_button t('admin.menu.zones') + end + + def open_form + click_link_or_button t('admin.dns.zones.zone.edit_btn') + end + + def submit_form + click_link_or_button t('admin.dns.zones.form.update_btn') + end +end diff --git a/spec/features/admin/dns/zones/new_spec.rb b/spec/features/admin/dns/zones/new_spec.rb new file mode 100644 index 000000000..95c87f46e --- /dev/null +++ b/spec/features/admin/dns/zones/new_spec.rb @@ -0,0 +1,39 @@ +require 'rails_helper' + +RSpec.feature 'New zone in admin area' do + background do + sign_in_to_admin_area + end + + scenario 'it creates new zone' do + open_list + open_form + fill_form + submit_form + + expect(page).to have_text(t('admin.dns.zones.create.created')) + end + + def open_list + click_link_or_button t('admin.menu.zones') + end + + def open_form + click_link_or_button t('admin.dns.zones.index.new_btn') + end + + def fill_form + fill_in 'zone_origin', with: 'test' + fill_in 'zone_ttl', with: '1' + fill_in 'zone_refresh', with: '1' + fill_in 'zone_retry', with: '1' + fill_in 'zone_expire', with: '1' + fill_in 'zone_minimum_ttl', with: '1' + fill_in 'zone_email', with: 'test@test.com' + fill_in 'zone_master_nameserver', with: 'test.test' + end + + def submit_form + click_link_or_button t('admin.dns.zones.form.create_btn') + end +end diff --git a/spec/models/concerns/domain/expirable_spec.rb b/spec/models/concerns/domain/expirable_spec.rb index 2a2c9b9cf..17c366819 100644 --- a/spec/models/concerns/domain/expirable_spec.rb +++ b/spec/models/concerns/domain/expirable_spec.rb @@ -7,7 +7,7 @@ RSpec.describe Domain, db: false do before :example do travel_to Time.zone.parse('05.07.2010 00:00') - Fabricate(:zonefile_setting, origin: 'ee') + Fabricate(:zone, origin: 'ee') Fabricate.create(:domain, id: 1, expire_time: Time.zone.parse('04.07.2010 23:59')) Fabricate.create(:domain, id: 2, expire_time: Time.zone.parse('05.07.2010 00:00')) diff --git a/spec/models/concerns/domain/force_delete_spec.rb b/spec/models/concerns/domain/force_delete_spec.rb index 3e0563366..b454fb034 100644 --- a/spec/models/concerns/domain/force_delete_spec.rb +++ b/spec/models/concerns/domain/force_delete_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Domain do it { is_expected.to alias_attribute(:force_delete_time, :force_delete_at) } before :example do - Fabricate(:zonefile_setting, origin: 'ee') + Fabricate(:zone, origin: 'ee') end it 'should set force delete time' do diff --git a/spec/models/contact_spec.rb b/spec/models/contact_spec.rb index 44133ede2..8c93d3545 100644 --- a/spec/models/contact_spec.rb +++ b/spec/models/contact_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' RSpec.describe Contact do before :example do - Fabricate(:zonefile_setting, origin: 'ee') + Fabricate(:zone, origin: 'ee') end context 'about class' do @@ -328,7 +328,7 @@ end describe Contact, '.destroy_orphans' do before do - Fabricate(:zonefile_setting, origin: 'ee') + Fabricate(:zone, origin: 'ee') @contact_1 = Fabricate(:contact, code: 'asd12') @contact_2 = Fabricate(:contact, code: 'asd13') end diff --git a/spec/models/zonefile_setting_spec.rb b/spec/models/dns/zone_spec.rb similarity index 68% rename from spec/models/zonefile_setting_spec.rb rename to spec/models/dns/zone_spec.rb index d1cd61119..815ce4aca 100644 --- a/spec/models/zonefile_setting_spec.rb +++ b/spec/models/dns/zone_spec.rb @@ -1,10 +1,6 @@ require 'rails_helper' -RSpec.describe ZonefileSetting, db: false do - it 'has versions' do - expect(described_class.new.versions).to eq([]) - end - +RSpec.describe DNS::Zone do describe '::origins' do before :example do expect(described_class).to receive(:pluck).with(:origin).and_return('origins') diff --git a/spec/models/dnskey_spec.rb b/spec/models/dnskey_spec.rb index 5267f3eac..9987de090 100644 --- a/spec/models/dnskey_spec.rb +++ b/spec/models/dnskey_spec.rb @@ -21,7 +21,7 @@ describe Dnskey do Setting.client_side_status_editing_enabled = true - Fabricate(:zonefile_setting, origin: 'ee') + Fabricate(:zone, origin: 'ee') end context 'with invalid attribute' do diff --git a/spec/models/domain_cron_spec.rb b/spec/models/domain_cron_spec.rb index 50c4ca80a..9b5e68f54 100644 --- a/spec/models/domain_cron_spec.rb +++ b/spec/models/domain_cron_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' RSpec.describe DomainCron do it 'should expire domains' do - Fabricate(:zonefile_setting, origin: 'ee') + Fabricate(:zone, origin: 'ee') @domain = Fabricate(:domain) Setting.expire_warning_period = 1 @@ -25,7 +25,7 @@ RSpec.describe DomainCron do end it 'should start redemption grace period' do - Fabricate(:zonefile_setting, origin: 'ee') + Fabricate(:zone, origin: 'ee') @domain = Fabricate(:domain) old_valid_to = Time.zone.now - 10.days diff --git a/spec/models/domain_spec.rb b/spec/models/domain_spec.rb index 65c96dbe8..d0bad297c 100644 --- a/spec/models/domain_spec.rb +++ b/spec/models/domain_spec.rb @@ -21,11 +21,11 @@ RSpec.describe Domain do Setting.client_side_status_editing_enabled = true - Fabricate(:zonefile_setting, origin: 'ee') - Fabricate(:zonefile_setting, origin: 'pri.ee') - Fabricate(:zonefile_setting, origin: 'med.ee') - Fabricate(:zonefile_setting, origin: 'fie.ee') - Fabricate(:zonefile_setting, origin: 'com.ee') + Fabricate(:zone, origin: 'ee') + Fabricate(:zone, origin: 'pri.ee') + Fabricate(:zone, origin: 'med.ee') + Fabricate(:zone, origin: 'fie.ee') + Fabricate(:zone, origin: 'com.ee') end context 'with invalid attribute' do @@ -809,7 +809,7 @@ RSpec.describe Domain, db: false do before :example do travel_to Time.zone.parse('05.07.2010 00:00') - Fabricate(:zonefile_setting, origin: 'ee') + Fabricate(:zone, origin: 'ee') Fabricate.create(:domain, id: 1, outzone_time: Time.zone.parse('04.07.2010 23:59')) Fabricate.create(:domain, id: 2, outzone_time: Time.zone.parse('05.07.2010 00:00')) @@ -825,7 +825,7 @@ RSpec.describe Domain, db: false do before :example do travel_to Time.zone.parse('05.07.2010 00:00') - Fabricate(:zonefile_setting, origin: 'ee') + Fabricate(:zone, origin: 'ee') Fabricate.create(:domain, id: 1, delete_time: Time.zone.parse('04.07.2010 23:59')) Fabricate.create(:domain, id: 2, delete_time: Time.zone.parse('05.07.2010 00:00')) diff --git a/spec/models/domain_transfer_spec.rb b/spec/models/domain_transfer_spec.rb index 3609b2f7d..d1ff29eee 100644 --- a/spec/models/domain_transfer_spec.rb +++ b/spec/models/domain_transfer_spec.rb @@ -21,7 +21,7 @@ describe DomainTransfer do Setting.client_side_status_editing_enabled = true - Fabricate(:zonefile_setting, origin: 'ee') + Fabricate(:zone, origin: 'ee') end context 'with invalid attribute' do diff --git a/spec/models/keyrelay_spec.rb b/spec/models/keyrelay_spec.rb index 73e26a098..319faf87c 100644 --- a/spec/models/keyrelay_spec.rb +++ b/spec/models/keyrelay_spec.rb @@ -21,7 +21,7 @@ describe Keyrelay do Setting.client_side_status_editing_enabled = true - Fabricate(:zonefile_setting, origin: 'ee') + Fabricate(:zone, origin: 'ee') end context 'with invalid attribute' do diff --git a/spec/models/legal_document_spec.rb b/spec/models/legal_document_spec.rb index 58774df4b..e87a3b77a 100644 --- a/spec/models/legal_document_spec.rb +++ b/spec/models/legal_document_spec.rb @@ -3,11 +3,11 @@ require 'rails_helper' describe LegalDocument do context 'tasks' do it 'make files uniq' do - Fabricate(:zonefile_setting, origin: 'ee') - Fabricate(:zonefile_setting, origin: 'pri.ee') - Fabricate(:zonefile_setting, origin: 'med.ee') - Fabricate(:zonefile_setting, origin: 'fie.ee') - Fabricate(:zonefile_setting, origin: 'com.ee') + Fabricate(:zone, origin: 'ee') + Fabricate(:zone, origin: 'pri.ee') + Fabricate(:zone, origin: 'med.ee') + Fabricate(:zone, origin: 'fie.ee') + Fabricate(:zone, origin: 'com.ee') LegalDocument.explicitly_write_file = true PaperTrail.enabled = true diff --git a/spec/models/nameserver_spec.rb b/spec/models/nameserver_spec.rb index 1844bc0f9..494d5696b 100644 --- a/spec/models/nameserver_spec.rb +++ b/spec/models/nameserver_spec.rb @@ -21,7 +21,7 @@ describe Nameserver do Setting.client_side_status_editing_enabled = true - Fabricate(:zonefile_setting, origin: 'ee') + Fabricate(:zone, origin: 'ee') end context 'with invalid attribute' do diff --git a/spec/models/registrant_verification_spec.rb b/spec/models/registrant_verification_spec.rb index 5997797c7..13036ef21 100644 --- a/spec/models/registrant_verification_spec.rb +++ b/spec/models/registrant_verification_spec.rb @@ -21,7 +21,7 @@ describe RegistrantVerification do Setting.client_side_status_editing_enabled = true - Fabricate(:zonefile_setting, origin: 'ee') + Fabricate(:zone, origin: 'ee') end context 'with invalid attribute' do before :example do diff --git a/spec/views/admin/dns/zones/index.html.erb_spec.rb b/spec/views/admin/dns/zones/index.html.erb_spec.rb new file mode 100644 index 000000000..3ebbc468d --- /dev/null +++ b/spec/views/admin/dns/zones/index.html.erb_spec.rb @@ -0,0 +1,40 @@ +require 'rails_helper' + +RSpec.describe 'admin/dns/zones/index' do + let(:zones) { [] } + + before :example do + assign(:zones, zones) + stub_template '_zone' => 'zone-row' + end + + it 'has title' do + render + expect(rendered).to have_text(t('admin.dns.zones.index.title')) + end + + context 'when zones are present' do + let(:zones) { [build_stubbed(:zone)] } + + it 'has zone row' do + render + expect(rendered).to have_text('zone-row') + end + + it 'has no :not_found message' do + render + expect(rendered).to_not have_text(not_found_message) + end + end + + context 'when zones are absent' do + it 'has :not_found message' do + render + expect(rendered).to have_text(not_found_message) + end + end + + def not_found_message + t('admin.dns.zones.index.not_found') + end +end From 1ed7c7c95bbd5bdb9ad6b72fbb6c54211a0128d2 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Fri, 21 Apr 2017 14:59:54 +0300 Subject: [PATCH 10/22] Add admin zone specs #475 --- spec/requests/admin/dns/zones/create_spec.rb | 36 +++++++++++++++++ spec/requests/admin/dns/zones/destroy_spec.rb | 18 +++++++++ spec/requests/admin/dns/zones/update_spec.rb | 40 +++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 spec/requests/admin/dns/zones/create_spec.rb create mode 100644 spec/requests/admin/dns/zones/destroy_spec.rb create mode 100644 spec/requests/admin/dns/zones/update_spec.rb diff --git a/spec/requests/admin/dns/zones/create_spec.rb b/spec/requests/admin/dns/zones/create_spec.rb new file mode 100644 index 000000000..135326737 --- /dev/null +++ b/spec/requests/admin/dns/zones/create_spec.rb @@ -0,0 +1,36 @@ +require 'rails_helper' + +RSpec.describe 'admin zone create' do + subject(:zone) { DNS::Zone.first } + + before :example do + sign_in_to_admin_area + end + + it 'creates new zone' do + expect { post admin_zones_path, zone: attributes_for(:zone) } + .to change { DNS::Zone.count }.from(0).to(1) + end + + text_attributes = %i[origin email master_nameserver] + integer_attributes = %i[ttl refresh retry expire minimum_ttl] + + text_attributes.each do |attr_name| + it "saves #{attr_name}" do + post admin_zones_path, { zone: attributes_for(:zone, attr_name => 'test') } + expect(zone.send(attr_name)).to eq('test') + end + end + + integer_attributes.each do |attr_name| + it "saves #{attr_name}" do + post admin_zones_path, { zone: attributes_for(:zone, attr_name => '1') } + expect(zone.send(attr_name)).to eq(1) + end + end + + it 'redirects to :index' do + post admin_zones_path, { zone: attributes_for(:zone) } + expect(response).to redirect_to admin_zones_url + end +end diff --git a/spec/requests/admin/dns/zones/destroy_spec.rb b/spec/requests/admin/dns/zones/destroy_spec.rb new file mode 100644 index 000000000..37bf44a21 --- /dev/null +++ b/spec/requests/admin/dns/zones/destroy_spec.rb @@ -0,0 +1,18 @@ +require 'rails_helper' + +RSpec.describe 'admin zone destroy' do + let!(:zone) { create(:zone) } + + before :example do + sign_in_to_admin_area + end + + it 'deletes zone' do + expect { delete admin_zone_path(zone) }.to change { DNS::Zone.count }.from(1).to(0) + end + + it 'redirects to :index' do + delete admin_zone_path(zone) + expect(response).to redirect_to admin_zones_url + end +end diff --git a/spec/requests/admin/dns/zones/update_spec.rb b/spec/requests/admin/dns/zones/update_spec.rb new file mode 100644 index 000000000..5167a4c7d --- /dev/null +++ b/spec/requests/admin/dns/zones/update_spec.rb @@ -0,0 +1,40 @@ +require 'rails_helper' + +RSpec.describe 'admin zone update' do + before :example do + sign_in_to_admin_area + end + + text_attributes = %i[origin email master_nameserver] + integer_attributes = %i[ttl refresh retry expire minimum_ttl] + + text_attributes.each do |attr_name| + it "updates #{attr_name}" do + zone = create(:zone, attr_name => 'test') + + patch admin_zone_path(zone), zone: attributes_for(:zone, attr_name => 'new-test') + zone.reload + + expect(zone.send(attr_name)).to eq('new-test') + end + end + + integer_attributes.each do |attr_name| + it "updates #{attr_name}" do + zone = create(:zone, attr_name => '1') + + patch admin_zone_path(zone), zone: attributes_for(:zone, attr_name => '2') + zone.reload + + expect(zone.send(attr_name)).to eq(2) + end + end + + it 'redirects to :index' do + zone = create(:zone) + + patch admin_zone_path(zone), { zone: attributes_for(:zone) } + + expect(response).to redirect_to admin_zones_url + end +end From 468fe00bc933425f760c7af48c9a6c8d6d5ebd29 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Fri, 21 Apr 2017 17:50:05 +0300 Subject: [PATCH 11/22] Add DNS acronym #475 --- config/initializers/inflections.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb index ac033bf9d..b4eccb451 100644 --- a/config/initializers/inflections.rb +++ b/config/initializers/inflections.rb @@ -10,7 +10,6 @@ # inflect.uncountable %w( fish sheep ) # end -# These inflection rules are supported but not enabled by default: -# ActiveSupport::Inflector.inflections(:en) do |inflect| -# inflect.acronym 'RESTful' -# end +ActiveSupport::Inflector.inflections(:en) do |inflect| + inflect.acronym 'DNS' +end From 90f50935510753f7407c7bea68fbb94684b40641 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Fri, 21 Apr 2017 17:51:09 +0300 Subject: [PATCH 12/22] Use HTML validation in admin zone form #475 --- app/views/admin/dns/zones/_form.haml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/views/admin/dns/zones/_form.haml b/app/views/admin/dns/zones/_form.haml index e935c5d97..b7f413156 100644 --- a/app/views/admin/dns/zones/_form.haml +++ b/app/views/admin/dns/zones/_form.haml @@ -11,49 +11,49 @@ - if zone.persisted? = f.text_field :origin, class: 'form-control', disabled: true - else - = f.text_field :origin, class: 'form-control' + = f.text_field :origin, class: 'form-control', required: true .form-group .col-md-4.control-label = f.label :ttl .col-md-8 - = f.text_field :ttl, class: 'form-control' + = f.number_field :ttl, class: 'form-control', required: true .form-group .col-md-4.control-label = f.label :refresh .col-md-8 - = f.text_field :refresh, class: 'form-control' + = f.number_field :refresh, class: 'form-control', required: true .form-group .col-md-4.control-label = f.label :retry .col-md-8 - = f.text_field :retry, class: 'form-control' + = f.number_field :retry, class: 'form-control', required: true .form-group .col-md-4.control-label = f.label :expire .col-md-8 - = f.text_field :expire, class: 'form-control' + = f.number_field :expire, class: 'form-control', required: true .form-group .col-md-4.control-label = f.label :minimum_ttl .col-md-8 - = f.text_field :minimum_ttl, class: 'form-control' + = f.number_field :minimum_ttl, class: 'form-control', required: true .form-group .col-md-4.control-label = f.label :email .col-md-8 - = f.text_field :email, class: 'form-control' + = f.email_field :email, class: 'form-control', required: true .form-group .col-md-4.control-label = f.label :master_nameserver .col-md-8 - = f.text_field :master_nameserver, class: 'form-control' + = f.text_field :master_nameserver, class: 'form-control', required: true .form-group .col-md-4.control-label From 8dd3f6e8af9f390f965615522d1ec9073db66e90 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Fri, 21 Apr 2017 17:51:56 +0300 Subject: [PATCH 13/22] Run zone specs without settings #475 --- spec/features/admin/dns/zones/delete_spec.rb | 2 +- spec/features/admin/dns/zones/edit_spec.rb | 2 +- spec/features/admin/dns/zones/new_spec.rb | 2 +- spec/requests/admin/dns/zones/create_spec.rb | 2 +- spec/requests/admin/dns/zones/destroy_spec.rb | 2 +- spec/requests/admin/dns/zones/update_spec.rb | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/spec/features/admin/dns/zones/delete_spec.rb b/spec/features/admin/dns/zones/delete_spec.rb index 724ba8680..4cf0e5f28 100644 --- a/spec/features/admin/dns/zones/delete_spec.rb +++ b/spec/features/admin/dns/zones/delete_spec.rb @@ -1,6 +1,6 @@ require 'rails_helper' -RSpec.feature 'Deleting zone in admin area' do +RSpec.feature 'Deleting zone in admin area', settings: false do given!(:zone) { create(:zone) } background do diff --git a/spec/features/admin/dns/zones/edit_spec.rb b/spec/features/admin/dns/zones/edit_spec.rb index 26019cb3c..caf3fcfc2 100644 --- a/spec/features/admin/dns/zones/edit_spec.rb +++ b/spec/features/admin/dns/zones/edit_spec.rb @@ -1,6 +1,6 @@ require 'rails_helper' -RSpec.feature 'Editing zone in admin area' do +RSpec.feature 'Editing zone in admin area', settings: false do given!(:zone) { create(:zone) } background do diff --git a/spec/features/admin/dns/zones/new_spec.rb b/spec/features/admin/dns/zones/new_spec.rb index 95c87f46e..7fd3ef49c 100644 --- a/spec/features/admin/dns/zones/new_spec.rb +++ b/spec/features/admin/dns/zones/new_spec.rb @@ -1,6 +1,6 @@ require 'rails_helper' -RSpec.feature 'New zone in admin area' do +RSpec.feature 'New zone in admin area', settings: false do background do sign_in_to_admin_area end diff --git a/spec/requests/admin/dns/zones/create_spec.rb b/spec/requests/admin/dns/zones/create_spec.rb index 135326737..172e656dc 100644 --- a/spec/requests/admin/dns/zones/create_spec.rb +++ b/spec/requests/admin/dns/zones/create_spec.rb @@ -1,6 +1,6 @@ require 'rails_helper' -RSpec.describe 'admin zone create' do +RSpec.describe 'admin zone create', settings: false do subject(:zone) { DNS::Zone.first } before :example do diff --git a/spec/requests/admin/dns/zones/destroy_spec.rb b/spec/requests/admin/dns/zones/destroy_spec.rb index 37bf44a21..4d2c714bc 100644 --- a/spec/requests/admin/dns/zones/destroy_spec.rb +++ b/spec/requests/admin/dns/zones/destroy_spec.rb @@ -1,6 +1,6 @@ require 'rails_helper' -RSpec.describe 'admin zone destroy' do +RSpec.describe 'admin zone destroy', settings: false do let!(:zone) { create(:zone) } before :example do diff --git a/spec/requests/admin/dns/zones/update_spec.rb b/spec/requests/admin/dns/zones/update_spec.rb index 5167a4c7d..1e238e0cb 100644 --- a/spec/requests/admin/dns/zones/update_spec.rb +++ b/spec/requests/admin/dns/zones/update_spec.rb @@ -1,6 +1,6 @@ require 'rails_helper' -RSpec.describe 'admin zone update' do +RSpec.describe 'admin zone update', settings: false do before :example do sign_in_to_admin_area end From 48fcf1f042c568d614c213b070a6ff974882415b Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Fri, 21 Apr 2017 17:53:56 +0300 Subject: [PATCH 14/22] Allow ignoring settings in specs --- spec/support/settings.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/support/settings.rb b/spec/support/settings.rb index f5d0f934d..b87e94a56 100644 --- a/spec/support/settings.rb +++ b/spec/support/settings.rb @@ -1,6 +1,6 @@ RSpec.configure do |config| config.before :example do |example| - if example.metadata[:db] + if example.metadata[:db] && (example.metadata[:settings] != false) Fabricate(:zonefile_setting, origin: 'com') Setting.ds_algorithm = 2 From bf3dfd0303433e4a9fd7e321f55d29269ce30df3 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Fri, 21 Apr 2017 19:01:38 +0300 Subject: [PATCH 15/22] Disable spin button for input[type=number] --- app/assets/stylesheets/admin-manifest.sass | 2 +- app/assets/stylesheets/forms.scss | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 app/assets/stylesheets/forms.scss diff --git a/app/assets/stylesheets/admin-manifest.sass b/app/assets/stylesheets/admin-manifest.sass index 0b7e9d8f7..8975faf71 100644 --- a/app/assets/stylesheets/admin-manifest.sass +++ b/app/assets/stylesheets/admin-manifest.sass @@ -5,10 +5,10 @@ //= require 'select2-bootstrap' @import shared/fonts @import shared/general +@import forms @import typeaheadjs @import selectize @import selectize.bootstrap3 // @import bootstrap-datepicker3 @import admin/admin @import admin/bootstrap-dialog-fix - diff --git a/app/assets/stylesheets/forms.scss b/app/assets/stylesheets/forms.scss new file mode 100644 index 000000000..c59a5e951 --- /dev/null +++ b/app/assets/stylesheets/forms.scss @@ -0,0 +1,7 @@ +input[type=number]::-webkit-inner-spin-button { + display: none; +} + +input[type=number] { + -moz-appearance: textfield; +} From 6361d52be90b6647204d62be65f54c84839d4ca9 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Fri, 21 Apr 2017 19:03:02 +0300 Subject: [PATCH 16/22] Refactor zones - Rename "zonefile_setting" to "zone" - Remove version #475 --- spec/support/settings.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/support/settings.rb b/spec/support/settings.rb index b87e94a56..ff1aa50a4 100644 --- a/spec/support/settings.rb +++ b/spec/support/settings.rb @@ -1,7 +1,7 @@ RSpec.configure do |config| config.before :example do |example| if example.metadata[:db] && (example.metadata[:settings] != false) - Fabricate(:zonefile_setting, origin: 'com') + Fabricate(:zone, origin: 'com') Setting.ds_algorithm = 2 Setting.ds_data_allowed = true From 5814376259f54c55d3f1d1a2133be9121db98a46 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Fri, 21 Apr 2017 19:32:08 +0300 Subject: [PATCH 17/22] Refactor zones - Rename "zonefile_setting" to "zone" - Remove version #475 --- app/controllers/admin/dns/zones_controller.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/controllers/admin/dns/zones_controller.rb b/app/controllers/admin/dns/zones_controller.rb index 67d1790f5..b38976283 100644 --- a/app/controllers/admin/dns/zones_controller.rb +++ b/app/controllers/admin/dns/zones_controller.rb @@ -1,8 +1,7 @@ module Admin module DNS class ZonesController < AdminController - #load_and_authorize_resource(class: DNS::Zone) - skip_authorization_check + load_and_authorize_resource(class: DNS::Zone) before_action :load_zone, only: %i[edit update destroy] def index From 4c9deea1fb94c9e77a6c50ec580ae064a672d676 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sat, 22 Apr 2017 16:13:58 +0300 Subject: [PATCH 18/22] Update "generate_zonefile" SQL function - Taken from staging --- ...0422130054_update_generate_zonefile_sql.rb | 124 ++++++++++++++++++ db/schema-read-only.rb | 2 +- db/structure.sql | 10 +- 3 files changed, 131 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20170422130054_update_generate_zonefile_sql.rb diff --git a/db/migrate/20170422130054_update_generate_zonefile_sql.rb b/db/migrate/20170422130054_update_generate_zonefile_sql.rb new file mode 100644 index 000000000..d20257f31 --- /dev/null +++ b/db/migrate/20170422130054_update_generate_zonefile_sql.rb @@ -0,0 +1,124 @@ +class UpdateGenerateZonefileSql < ActiveRecord::Migration + def change + execute <<-SQL + CREATE OR REPLACE FUNCTION generate_zonefile(i_origin character varying) RETURNS text + LANGUAGE plpgsql + AS $_$ + DECLARE + zone_header text := concat('$ORIGIN ', i_origin, '.'); + serial_num varchar; + include_filter varchar := ''; + exclude_filter varchar := ''; + tmp_var text; + ret text; + BEGIN + -- define filters + include_filter = '%.' || i_origin; + + -- for %.%.% + IF i_origin ~ '.' THEN + exclude_filter := ''; + -- for %.% + ELSE + exclude_filter := '%.%.' || i_origin; + END IF; + + SELECT ROUND(extract(epoch from now() at time zone 'utc')) INTO serial_num; + + -- zonefile header + SELECT concat( + format('%-10s', '$ORIGIN .'), chr(10), + format('%-10s', '$TTL'), zf.ttl, chr(10), chr(10), + format('%-10s', i_origin || '.'), 'IN SOA ', zf.master_nameserver, '. ', zf.email, '. (', chr(10), + format('%-17s', ''), format('%-12s', serial_num), '; serial number', chr(10), + format('%-17s', ''), format('%-12s', zf.refresh), '; refresh, seconds', chr(10), + format('%-17s', ''), format('%-12s', zf.retry), '; retry, seconds', chr(10), + format('%-17s', ''), format('%-12s', zf.expire), '; expire, seconds', chr(10), + format('%-17s', ''), format('%-12s', zf.minimum_ttl), '; minimum TTL, seconds', chr(10), + format('%-17s', ''), ')' + ) FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; + + ret = concat(tmp_var, chr(10), chr(10)); + + -- origin ns records + SELECT ns_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; + ret := concat(ret, '; Zone NS Records', chr(10), tmp_var, chr(10)); + + -- ns records + SELECT array_to_string( + array( + SELECT concat(d.name_puny, '. IN NS ', coalesce(ns.hostname_puny, ns.hostname), '.') + FROM domains d + JOIN nameservers ns ON ns.domain_id = d.id + WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter + AND NOT ('{serverHold,clientHold,inactive}' && d.statuses) + ORDER BY d.name + ), + chr(10) + ) INTO tmp_var; + + ret := concat(ret, tmp_var, chr(10), chr(10)); + + -- origin a glue records + SELECT a_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; + ret := concat(ret, '; Zone A Records', chr(10), tmp_var, chr(10)); + + -- a glue records for other nameservers + SELECT array_to_string( + array( + SELECT concat(coalesce(ns.hostname_puny, ns.hostname), '. IN A ', unnest(ns.ipv4)) + FROM nameservers ns + JOIN domains d ON d.id = ns.domain_id + WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter + AND ns.hostname LIKE '%.' || d.name + AND d.name <> i_origin + AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '{}' + AND NOT ('{serverHold,clientHold,inactive}' && d.statuses) + ), chr(10) + ) INTO tmp_var; + + ret := concat(ret, tmp_var, chr(10), chr(10)); + + -- origin aaaa glue records + SELECT a4_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; + ret := concat(ret, '; Zone AAAA Records', chr(10), tmp_var, chr(10)); + + -- aaaa glue records for other nameservers + SELECT array_to_string( + array( + SELECT concat(coalesce(ns.hostname_puny, ns.hostname), '. IN AAAA ', unnest(ns.ipv6)) + FROM nameservers ns + JOIN domains d ON d.id = ns.domain_id + WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter + AND ns.hostname LIKE '%.' || d.name + AND d.name <> i_origin + AND ns.ipv6 IS NOT NULL AND ns.ipv6 <> '{}' + AND NOT ('{serverHold,clientHold,inactive}' && d.statuses) + ), chr(10) + ) INTO tmp_var; + + ret := concat(ret, tmp_var, chr(10), chr(10)); + + -- ds records + SELECT array_to_string( + array( + SELECT concat( + d.name_puny, '. 3600 IN DS ', dk.ds_key_tag, ' ', + dk.ds_alg, ' ', dk.ds_digest_type, ' ', dk.ds_digest + ) + FROM domains d + JOIN dnskeys dk ON dk.domain_id = d.id + WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter AND dk.flags = 257 + AND NOT ('{serverHold,clientHold,inactive}' && d.statuses) + ), + chr(10) + ) INTO tmp_var; + + ret := concat(ret, '; Zone DS Records', chr(10), tmp_var, chr(10)); + + RETURN ret; + END; + $_$; + SQL + end +end diff --git a/db/schema-read-only.rb b/db/schema-read-only.rb index 7bebdbba9..f16c4855e 100644 --- a/db/schema-read-only.rb +++ b/db/schema-read-only.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170221115548) do +ActiveRecord::Schema.define(version: 20170422130054) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" diff --git a/db/structure.sql b/db/structure.sql index 373d7239e..3abedd9f8 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -167,7 +167,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text exclude_filter varchar := ''; tmp_var text; ret text; - BEGIN + BEGIN -- define filters include_filter = '%.' || i_origin; @@ -203,7 +203,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text -- ns records SELECT array_to_string( array( - SELECT concat(d.name_puny, '. IN NS ', ns.hostname, '.') + SELECT concat(d.name_puny, '. IN NS ', coalesce(ns.hostname_puny, ns.hostname), '.') FROM domains d JOIN nameservers ns ON ns.domain_id = d.id WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter @@ -222,7 +222,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text -- a glue records for other nameservers SELECT array_to_string( array( - SELECT concat(ns.hostname, '. IN A ', unnest(ns.ipv4)) + SELECT concat(coalesce(ns.hostname_puny, ns.hostname), '. IN A ', unnest(ns.ipv4)) FROM nameservers ns JOIN domains d ON d.id = ns.domain_id WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter @@ -242,7 +242,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text -- aaaa glue records for other nameservers SELECT array_to_string( array( - SELECT concat(ns.hostname, '. IN AAAA ', unnest(ns.ipv6)) + SELECT concat(coalesce(ns.hostname_puny, ns.hostname), '. IN AAAA ', unnest(ns.ipv6)) FROM nameservers ns JOIN domains d ON d.id = ns.domain_id WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter @@ -5280,3 +5280,5 @@ INSERT INTO schema_migrations (version) VALUES ('20161227193500'); INSERT INTO schema_migrations (version) VALUES ('20170221115548'); +INSERT INTO schema_migrations (version) VALUES ('20170422130054'); + From 5016f50d8ce614f6f2d9439f08087ca5b7f2108f Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sat, 22 Apr 2017 17:07:28 +0300 Subject: [PATCH 19/22] Refactor zones - Rename "zonefile_setting" to "zone" - Remove version #475 --- db/structure.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/db/structure.sql b/db/structure.sql index 49656326c..2945e2859 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -192,12 +192,12 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text format('%-17s', ''), format('%-12s', zf.expire), '; expire, seconds', chr(10), format('%-17s', ''), format('%-12s', zf.minimum_ttl), '; minimum TTL, seconds', chr(10), format('%-17s', ''), ')' - ) FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; + ) FROM zones zf WHERE i_origin = zf.origin INTO tmp_var; ret = concat(tmp_var, chr(10), chr(10)); -- origin ns records - SELECT ns_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; + SELECT ns_records FROM zones zf WHERE i_origin = zf.origin INTO tmp_var; ret := concat(ret, '; Zone NS Records', chr(10), tmp_var, chr(10)); -- ns records @@ -216,7 +216,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text ret := concat(ret, tmp_var, chr(10), chr(10)); -- origin a glue records - SELECT a_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; + SELECT a_records FROM zones zf WHERE i_origin = zf.origin INTO tmp_var; ret := concat(ret, '; Zone A Records', chr(10), tmp_var, chr(10)); -- a glue records for other nameservers @@ -236,7 +236,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text ret := concat(ret, tmp_var, chr(10), chr(10)); -- origin aaaa glue records - SELECT a4_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; + SELECT a4_records FROM zones zf WHERE i_origin = zf.origin INTO tmp_var; ret := concat(ret, '; Zone AAAA Records', chr(10), tmp_var, chr(10)); -- aaaa glue records for other nameservers From ad0b25ae889d7e2dce2ef1239bbd64a702f5b07d Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sat, 22 Apr 2017 17:20:07 +0300 Subject: [PATCH 20/22] Revert "Refactor zones" This reverts commit 5016f50d8ce614f6f2d9439f08087ca5b7f2108f. --- db/structure.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/db/structure.sql b/db/structure.sql index 2945e2859..49656326c 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -192,12 +192,12 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text format('%-17s', ''), format('%-12s', zf.expire), '; expire, seconds', chr(10), format('%-17s', ''), format('%-12s', zf.minimum_ttl), '; minimum TTL, seconds', chr(10), format('%-17s', ''), ')' - ) FROM zones zf WHERE i_origin = zf.origin INTO tmp_var; + ) FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; ret = concat(tmp_var, chr(10), chr(10)); -- origin ns records - SELECT ns_records FROM zones zf WHERE i_origin = zf.origin INTO tmp_var; + SELECT ns_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; ret := concat(ret, '; Zone NS Records', chr(10), tmp_var, chr(10)); -- ns records @@ -216,7 +216,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text ret := concat(ret, tmp_var, chr(10), chr(10)); -- origin a glue records - SELECT a_records FROM zones zf WHERE i_origin = zf.origin INTO tmp_var; + SELECT a_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; ret := concat(ret, '; Zone A Records', chr(10), tmp_var, chr(10)); -- a glue records for other nameservers @@ -236,7 +236,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text ret := concat(ret, tmp_var, chr(10), chr(10)); -- origin aaaa glue records - SELECT a4_records FROM zones zf WHERE i_origin = zf.origin INTO tmp_var; + SELECT a4_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; ret := concat(ret, '; Zone AAAA Records', chr(10), tmp_var, chr(10)); -- aaaa glue records for other nameservers From 7b6c4d005ac8cc0a7bb7a1eb9498dfe1b6cc3014 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sat, 22 Apr 2017 17:22:52 +0300 Subject: [PATCH 21/22] Refactor zones - Rename "zonefile_setting" to "zone" - Remove version #475 --- ..._zonefile_settings_in_generate_zonefile.rb | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 db/migrate/20170422142116_rename_zonefile_settings_in_generate_zonefile.rb diff --git a/db/migrate/20170422142116_rename_zonefile_settings_in_generate_zonefile.rb b/db/migrate/20170422142116_rename_zonefile_settings_in_generate_zonefile.rb new file mode 100644 index 000000000..905ebe0fa --- /dev/null +++ b/db/migrate/20170422142116_rename_zonefile_settings_in_generate_zonefile.rb @@ -0,0 +1,124 @@ +class RenameZonefileSettingsInGenerateZonefile < ActiveRecord::Migration + def change + execute <<-SQL + CREATE OR REPLACE FUNCTION generate_zonefile(i_origin character varying) RETURNS text + LANGUAGE plpgsql + AS $_$ + DECLARE + zone_header text := concat('$ORIGIN ', i_origin, '.'); + serial_num varchar; + include_filter varchar := ''; + exclude_filter varchar := ''; + tmp_var text; + ret text; + BEGIN + -- define filters + include_filter = '%.' || i_origin; + + -- for %.%.% + IF i_origin ~ '.' THEN + exclude_filter := ''; + -- for %.% + ELSE + exclude_filter := '%.%.' || i_origin; + END IF; + + SELECT ROUND(extract(epoch from now() at time zone 'utc')) INTO serial_num; + + -- zonefile header + SELECT concat( + format('%-10s', '$ORIGIN .'), chr(10), + format('%-10s', '$TTL'), zf.ttl, chr(10), chr(10), + format('%-10s', i_origin || '.'), 'IN SOA ', zf.master_nameserver, '. ', zf.email, '. (', chr(10), + format('%-17s', ''), format('%-12s', serial_num), '; serial number', chr(10), + format('%-17s', ''), format('%-12s', zf.refresh), '; refresh, seconds', chr(10), + format('%-17s', ''), format('%-12s', zf.retry), '; retry, seconds', chr(10), + format('%-17s', ''), format('%-12s', zf.expire), '; expire, seconds', chr(10), + format('%-17s', ''), format('%-12s', zf.minimum_ttl), '; minimum TTL, seconds', chr(10), + format('%-17s', ''), ')' + ) FROM zones zf WHERE i_origin = zf.origin INTO tmp_var; + + ret = concat(tmp_var, chr(10), chr(10)); + + -- origin ns records + SELECT ns_records FROM zones zf WHERE i_origin = zf.origin INTO tmp_var; + ret := concat(ret, '; Zone NS Records', chr(10), tmp_var, chr(10)); + + -- ns records + SELECT array_to_string( + array( + SELECT concat(d.name_puny, '. IN NS ', coalesce(ns.hostname_puny, ns.hostname), '.') + FROM domains d + JOIN nameservers ns ON ns.domain_id = d.id + WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter + AND NOT ('{serverHold,clientHold,inactive}' && d.statuses) + ORDER BY d.name + ), + chr(10) + ) INTO tmp_var; + + ret := concat(ret, tmp_var, chr(10), chr(10)); + + -- origin a glue records + SELECT a_records FROM zones zf WHERE i_origin = zf.origin INTO tmp_var; + ret := concat(ret, '; Zone A Records', chr(10), tmp_var, chr(10)); + + -- a glue records for other nameservers + SELECT array_to_string( + array( + SELECT concat(coalesce(ns.hostname_puny, ns.hostname), '. IN A ', unnest(ns.ipv4)) + FROM nameservers ns + JOIN domains d ON d.id = ns.domain_id + WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter + AND ns.hostname LIKE '%.' || d.name + AND d.name <> i_origin + AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '{}' + AND NOT ('{serverHold,clientHold,inactive}' && d.statuses) + ), chr(10) + ) INTO tmp_var; + + ret := concat(ret, tmp_var, chr(10), chr(10)); + + -- origin aaaa glue records + SELECT a4_records FROM zones zf WHERE i_origin = zf.origin INTO tmp_var; + ret := concat(ret, '; Zone AAAA Records', chr(10), tmp_var, chr(10)); + + -- aaaa glue records for other nameservers + SELECT array_to_string( + array( + SELECT concat(coalesce(ns.hostname_puny, ns.hostname), '. IN AAAA ', unnest(ns.ipv6)) + FROM nameservers ns + JOIN domains d ON d.id = ns.domain_id + WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter + AND ns.hostname LIKE '%.' || d.name + AND d.name <> i_origin + AND ns.ipv6 IS NOT NULL AND ns.ipv6 <> '{}' + AND NOT ('{serverHold,clientHold,inactive}' && d.statuses) + ), chr(10) + ) INTO tmp_var; + + ret := concat(ret, tmp_var, chr(10), chr(10)); + + -- ds records + SELECT array_to_string( + array( + SELECT concat( + d.name_puny, '. 3600 IN DS ', dk.ds_key_tag, ' ', + dk.ds_alg, ' ', dk.ds_digest_type, ' ', dk.ds_digest + ) + FROM domains d + JOIN dnskeys dk ON dk.domain_id = d.id + WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter AND dk.flags = 257 + AND NOT ('{serverHold,clientHold,inactive}' && d.statuses) + ), + chr(10) + ) INTO tmp_var; + + ret := concat(ret, '; Zone DS Records', chr(10), tmp_var, chr(10)); + + RETURN ret; + END; + $_$; + SQL + end +end From 4b466d4acd524310ba650db8bbc89f14851715d6 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sat, 22 Apr 2017 17:24:03 +0300 Subject: [PATCH 22/22] Refactor zones - Rename "zonefile_setting" to "zone" - Remove version #475 --- db/schema-read-only.rb | 2 +- db/structure.sql | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/db/schema-read-only.rb b/db/schema-read-only.rb index 3e4245111..5fa683be4 100644 --- a/db/schema-read-only.rb +++ b/db/schema-read-only.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170422130054) do +ActiveRecord::Schema.define(version: 20170422142116) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" diff --git a/db/structure.sql b/db/structure.sql index 49656326c..c59d01b1c 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -192,12 +192,12 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text format('%-17s', ''), format('%-12s', zf.expire), '; expire, seconds', chr(10), format('%-17s', ''), format('%-12s', zf.minimum_ttl), '; minimum TTL, seconds', chr(10), format('%-17s', ''), ')' - ) FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; + ) FROM zones zf WHERE i_origin = zf.origin INTO tmp_var; ret = concat(tmp_var, chr(10), chr(10)); -- origin ns records - SELECT ns_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; + SELECT ns_records FROM zones zf WHERE i_origin = zf.origin INTO tmp_var; ret := concat(ret, '; Zone NS Records', chr(10), tmp_var, chr(10)); -- ns records @@ -216,7 +216,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text ret := concat(ret, tmp_var, chr(10), chr(10)); -- origin a glue records - SELECT a_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; + SELECT a_records FROM zones zf WHERE i_origin = zf.origin INTO tmp_var; ret := concat(ret, '; Zone A Records', chr(10), tmp_var, chr(10)); -- a glue records for other nameservers @@ -236,7 +236,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text ret := concat(ret, tmp_var, chr(10), chr(10)); -- origin aaaa glue records - SELECT a4_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; + SELECT a4_records FROM zones zf WHERE i_origin = zf.origin INTO tmp_var; ret := concat(ret, '; Zone AAAA Records', chr(10), tmp_var, chr(10)); -- aaaa glue records for other nameservers @@ -2930,7 +2930,7 @@ ALTER SEQUENCE whois_records_id_seq OWNED BY whois_records.id; -- --- Name: zones; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: zones; Type: TABLE; Schema: public; Owner: -; Tablespace: -- CREATE TABLE zones ( @@ -3985,7 +3985,7 @@ ALTER TABLE ONLY whois_records -- --- Name: zones_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: zones_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- ALTER TABLE ONLY zones @@ -5219,3 +5219,5 @@ INSERT INTO schema_migrations (version) VALUES ('20170420125200'); INSERT INTO schema_migrations (version) VALUES ('20170422130054'); +INSERT INTO schema_migrations (version) VALUES ('20170422142116'); +