From e92ef923318b324ec8fb5c9e930d9e8c36b13072 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Fri, 31 Jul 2015 16:48:08 +0300 Subject: [PATCH 01/68] Fix invoice description #2810 --- app/controllers/admin/invoices_controller.rb | 2 +- app/controllers/registrar/deposits_controller.rb | 2 +- app/views/registrar/invoices/partials/_details.haml | 2 +- app/views/registrar/invoices/pdf.haml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/admin/invoices_controller.rb b/app/controllers/admin/invoices_controller.rb index dce34ac2a..5aa6d4438 100644 --- a/app/controllers/admin/invoices_controller.rb +++ b/app/controllers/admin/invoices_controller.rb @@ -16,7 +16,7 @@ class Admin::InvoicesController < AdminController flash[:notice] = t(:record_created) redirect_to [:admin, @invoice] else - flash[:alert] = t(:failed_to_create_record) + flash.now[:alert] = t(:failed_to_create_record) render 'new' end end diff --git a/app/controllers/registrar/deposits_controller.rb b/app/controllers/registrar/deposits_controller.rb index 4bd40eaa6..4b7d0db97 100644 --- a/app/controllers/registrar/deposits_controller.rb +++ b/app/controllers/registrar/deposits_controller.rb @@ -13,7 +13,7 @@ class Registrar::DepositsController < RegistrarController flash[:notice] = t(:please_pay_the_following_invoice) redirect_to [:registrar, @invoice] else - flash[:alert] = t(:failed_to_create_record) + flash.now[:alert] = t(:failed_to_create_record) render 'new' end end diff --git a/app/views/registrar/invoices/partials/_details.haml b/app/views/registrar/invoices/partials/_details.haml index 0b897ce7f..a2677f170 100644 --- a/app/views/registrar/invoices/partials/_details.haml +++ b/app/views/registrar/invoices/partials/_details.haml @@ -27,7 +27,7 @@ %dt= t(:description) - @invoice.description.prepend(' - ') if @invoice.description.present? - %dd= "#{t('invoice_no', no: @invoice.id)}#{@invoice.description}" + %dd= "#{t('invoice_no', no: @invoice.number)}#{@invoice.description}" %dt= t(:reference_no) %dd= @invoice.reference_no diff --git a/app/views/registrar/invoices/pdf.haml b/app/views/registrar/invoices/pdf.haml index 5888f2bc2..ae67ac4e3 100644 --- a/app/views/registrar/invoices/pdf.haml +++ b/app/views/registrar/invoices/pdf.haml @@ -177,7 +177,7 @@ %dt= t(:description) - @invoice.description.prepend(' - ') if @invoice.description.present? - %dd= "#{t('invoice_no', no: @invoice.id)}#{@invoice.description}" + %dd= "#{t('invoice_no', no: @invoice.number)}#{@invoice.description}" %dt= t(:reference_no) %dd= @invoice.reference_no From 1fe8bd3f46e6443ad07aaea2358309aab8faef18 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Fri, 31 Jul 2015 18:09:34 +0300 Subject: [PATCH 02/68] Add configurable minimum deposit #2782 --- app/controllers/admin/settings_controller.rb | 2 +- app/models/deposit.rb | 5 +++++ app/views/admin/settings/index.haml | 1 + config/initializers/initial_settings.rb | 2 ++ config/locales/en.yml | 1 + spec/features/admin/invoice_spec.rb | 21 ++++++++++++++++++++ 6 files changed, 31 insertions(+), 1 deletion(-) diff --git a/app/controllers/admin/settings_controller.rb b/app/controllers/admin/settings_controller.rb index 615ee63ca..6a0c5c033 100644 --- a/app/controllers/admin/settings_controller.rb +++ b/app/controllers/admin/settings_controller.rb @@ -61,7 +61,7 @@ class Admin::SettingsController < AdminController :expire_pending_confirmation ] - floats = [:registry_vat_prc] + floats = [:registry_vat_prc, :minimum_deposit] booleans = [ :ds_data_allowed, diff --git a/app/models/deposit.rb b/app/models/deposit.rb index fae4336cf..f9f887af1 100644 --- a/app/models/deposit.rb +++ b/app/models/deposit.rb @@ -7,6 +7,11 @@ class Deposit attr_accessor :amount, :description, :registrar, :registrar_id validates :amount, :registrar, presence: true + validate :validate_amount + def validate_amount + return if BigDecimal.new(amount) >= Setting.minimum_deposit + errors.add(:amount, I18n.t(:is_too_small_minimum_deposit_is, amount: Setting.minimum_deposit, currency: 'EUR')) + end def initialize(attributes = {}) attributes.each do |name, value| diff --git a/app/views/admin/settings/index.haml b/app/views/admin/settings/index.haml index 2c46c1f2e..94b87fff4 100644 --- a/app/views/admin/settings/index.haml +++ b/app/views/admin/settings/index.haml @@ -69,6 +69,7 @@ = render 'setting_row', var: :invoice_number_max = render 'setting_row', var: :days_to_keep_invoices_active = render 'setting_row', var: :days_to_keep_overdue_invoices_active + = render 'setting_row', var: :minimum_deposit = render 'setting_row', var: :registry_billing_email = render 'setting_row', var: :registry_invoice_contact = render 'setting_row', var: :registry_vat_no diff --git a/config/initializers/initial_settings.rb b/config/initializers/initial_settings.rb index c2d867c26..1325831da 100644 --- a/config/initializers/initial_settings.rb +++ b/config/initializers/initial_settings.rb @@ -31,6 +31,8 @@ if con.present? && con.table_exists?('settings') Setting.save_default(:invoice_number_max, 149999) Setting.save_default(:days_to_keep_invoices_active, 30) Setting.save_default(:days_to_keep_overdue_invoices_active, 30) + Setting.save_default(:minimum_deposit, 0.0) + Setting.save_default(:days_to_renew_domain_before_expire, 90) Setting.save_default(:expire_warning_period, 15) Setting.save_default(:redemption_grace_period, 30) diff --git a/config/locales/en.yml b/config/locales/en.yml index 5d2f0dfff..5dce96914 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -894,3 +894,4 @@ en: nameserver_hostname: 'Nameserver hostname' result_count: '%{count} results' 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}' diff --git a/spec/features/admin/invoice_spec.rb b/spec/features/admin/invoice_spec.rb index 9c787eeb8..e036b5f1c 100644 --- a/spec/features/admin/invoice_spec.rb +++ b/spec/features/admin/invoice_spec.rb @@ -41,6 +41,27 @@ feature 'Invoice', type: :feature do page.should have_content(r.name) end + it 'should not issue and invoice with deposit amount too small' do + Setting.minimum_deposit = 0.0 + r = Fabricate(:registrar) + visit admin_invoices_url + click_link('Add') + select r.name, from: 'Registrar' + fill_in 'Amount', with: '-2.11' + fill_in 'Description', with: 'test issue' + click_button 'Save' + page.should have_content('Amount is too small. Minimum deposit is 0.0 EUR') + Setting.minimum_deposit = 12.43 + fill_in 'Amount', with: '12.42' + click_button 'Save' + + page.should have_content('Amount is too small. Minimum deposit is 12.43 EUR') + fill_in 'Amount', with: '12.44' + click_button 'Save' + page.should have_content('Record created') + Setting.minimum_deposit = 0.0 + end + it 'should forward invoice' do visit '/admin/invoices' click_link @invoice.to_s From 44b2d383b19e6ae7b8e80bec03b079ea9875a050 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Mon, 3 Aug 2015 12:05:31 +0300 Subject: [PATCH 03/68] Add form for adding zone #2806 --- .../admin/zonefile_settings_controller.rb | 20 ++++- app/models/zonefile_setting.rb | 1 + app/views/admin/zonefile_settings/_form.haml | 74 +++++++++++++++++++ app/views/admin/zonefile_settings/edit.haml | 56 +------------- app/views/admin/zonefile_settings/index.haml | 6 +- app/views/admin/zonefile_settings/new.haml | 5 ++ config/locales/en.yml | 3 + .../20150803080914_add_ns_data_to_zones.rb | 7 ++ db/schema-read-only.rb | 13 +++- db/structure.sql | 45 ++++++++--- 10 files changed, 163 insertions(+), 67 deletions(-) create mode 100644 app/views/admin/zonefile_settings/_form.haml create mode 100644 app/views/admin/zonefile_settings/new.haml create mode 100644 db/migrate/20150803080914_add_ns_data_to_zones.rb diff --git a/app/controllers/admin/zonefile_settings_controller.rb b/app/controllers/admin/zonefile_settings_controller.rb index 45f31bb55..d671acba5 100644 --- a/app/controllers/admin/zonefile_settings_controller.rb +++ b/app/controllers/admin/zonefile_settings_controller.rb @@ -5,6 +5,22 @@ class Admin::ZonefileSettingsController < AdminController @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 @@ -26,6 +42,8 @@ class Admin::ZonefileSettingsController < AdminController end def zonefile_setting_params - params.require(:zonefile_setting).permit(:ttl, :refresh, :retry, :expire, :minimum_ttl, :email) + params.require(:zonefile_setting).permit( + :origin, :ttl, :refresh, :retry, :expire, :minimum_ttl, :email, :ns_records, :a_records, :a4_records + ) end end diff --git a/app/models/zonefile_setting.rb b/app/models/zonefile_setting.rb index 8747a11ca..60b9994c1 100644 --- a/app/models/zonefile_setting.rb +++ b/app/models/zonefile_setting.rb @@ -2,6 +2,7 @@ class ZonefileSetting < ActiveRecord::Base include Versions # version/zonefile_setting_version.rb validates :origin, :ttl, :refresh, :retry, :expire, :minimum_ttl, :email, presence: true validates :ttl, :refresh, :retry, :expire, :minimum_ttl, numericality: { only_integer: true } + validates :origin, uniqueness: true def self.generate_zonefiles pluck(:origin).each do |origin| diff --git a/app/views/admin/zonefile_settings/_form.haml b/app/views/admin/zonefile_settings/_form.haml new file mode 100644 index 000000000..f83107508 --- /dev/null +++ b/app/views/admin/zonefile_settings/_form.haml @@ -0,0 +1,74 @@ + += form_for [:admin, @zonefile_setting], html: { class: 'form-horizontal' } do |f| + .row + .col-md-8 + #domain-statuses + = render 'shared/full_errors', object: f.object + + .form-group + .col-md-4.control-label + = f.label :origin + .col-md-8 + - if @zonefile_setting.persisted? + = f.text_field :origin, class: 'form-control', disabled: true + - else + = f.text_field :origin, class: 'form-control' + + .form-group + .col-md-4.control-label + = f.label :ttl + .col-md-8 + = f.text_field :ttl, class: 'form-control' + + .form-group + .col-md-4.control-label + = f.label :refresh + .col-md-8 + = f.text_field :refresh, class: 'form-control' + + .form-group + .col-md-4.control-label + = f.label :retry + .col-md-8 + = f.text_field :retry, class: 'form-control' + + .form-group + .col-md-4.control-label + = f.label :expire + .col-md-8 + = f.text_field :expire, class: 'form-control' + + .form-group + .col-md-4.control-label + = f.label :minimum_ttl + .col-md-8 + = f.text_field :minimum_ttl, class: 'form-control' + + .form-group + .col-md-4.control-label + = f.label :email + .col-md-8 + = f.text_field :email, class: 'form-control' + + .form-group + .col-md-4.control-label + = f.label :ns_records + .col-md-8 + = f.text_area :ns_records, class: 'form-control', rows: 8 + + .form-group + .col-md-4.control-label + = f.label :a_records + .col-md-8 + = f.text_area :a_records, class: 'form-control', rows: 8 + + .form-group + .col-md-4.control-label + = f.label :a4_records, t(:a4_records) + .col-md-8 + = f.text_area :a4_records, class: 'form-control', rows: 8 + + %hr + .row + .col-md-8.text-right + %button.btn.btn-primary= t(:save) diff --git a/app/views/admin/zonefile_settings/edit.haml b/app/views/admin/zonefile_settings/edit.haml index 5f58cb040..f8f9a83c4 100644 --- a/app/views/admin/zonefile_settings/edit.haml +++ b/app/views/admin/zonefile_settings/edit.haml @@ -1,53 +1,5 @@ -= render 'shared/title', name: t(:zonefile_settings) +- content_for :actions do + = link_to(t(:back), admin_zonefile_settings_path, class: 'btn btn-default') += render 'shared/title', name: t(:edit_zone) -= form_for [:admin, @zonefile_setting], html: { class: 'form-horizontal' } do |f| - .row - .col-md-8 - #domain-statuses - = render 'shared/full_errors', object: f.object - - .form-group - .col-md-4.control-label - = f.label :origin - .col-md-8 - = f.text_field :origin, class: 'form-control', disabled: true - - .form-group - .col-md-4.control-label - = f.label :ttl - .col-md-8 - = f.text_field :ttl, class: 'form-control' - - .form-group - .col-md-4.control-label - = f.label :refresh - .col-md-8 - = f.text_field :refresh, class: 'form-control' - - .form-group - .col-md-4.control-label - = f.label :retry - .col-md-8 - = f.text_field :retry, class: 'form-control' - .form-group - .col-md-4.control-label - = f.label :expire - .col-md-8 - = f.text_field :expire, class: 'form-control' - - .form-group - .col-md-4.control-label - = f.label :minimum_ttl - .col-md-8 - = f.text_field :minimum_ttl, class: 'form-control' - - .form-group - .col-md-4.control-label - = f.label :email - .col-md-8 - = f.text_field :email, class: 'form-control', email: true - - %hr - .row - .col-md-8.text-right - %button.btn.btn-primary= t(:save) += render 'form' diff --git a/app/views/admin/zonefile_settings/index.haml b/app/views/admin/zonefile_settings/index.haml index 8ef09d498..a062c0793 100644 --- a/app/views/admin/zonefile_settings/index.haml +++ b/app/views/admin/zonefile_settings/index.haml @@ -1,3 +1,5 @@ +- 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 @@ -15,6 +17,6 @@ %tr %td= link_to(x, edit_admin_zonefile_setting_path(x)) %td - = link_to(t(:generate_zonefile), - admin_zonefiles_path(origin: x.origin), + = 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 new file mode 100644 index 000000000..211054e03 --- /dev/null +++ b/app/views/admin/zonefile_settings/new.haml @@ -0,0 +1,5 @@ +- 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/en.yml b/config/locales/en.yml index 5dce96914..bf44f2407 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -895,3 +895,6 @@ en: result_count: '%{count} results' 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' diff --git a/db/migrate/20150803080914_add_ns_data_to_zones.rb b/db/migrate/20150803080914_add_ns_data_to_zones.rb new file mode 100644 index 000000000..2d438128c --- /dev/null +++ b/db/migrate/20150803080914_add_ns_data_to_zones.rb @@ -0,0 +1,7 @@ +class AddNsDataToZones < ActiveRecord::Migration + def change + add_column :zonefile_settings, :ns_records, :text + add_column :zonefile_settings, :a_records, :text + add_column :zonefile_settings, :a4_records, :text + end +end diff --git a/db/schema-read-only.rb b/db/schema-read-only.rb index f7f535ed6..46df6aac0 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: 20150722071128) do +ActiveRecord::Schema.define(version: 20150803080914) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -216,6 +216,12 @@ ActiveRecord::Schema.define(version: 20150722071128) do t.string "updator_str" end + create_table "data_migrations", id: false, force: :cascade do |t| + t.string "version", null: false + end + + add_index "data_migrations", ["version"], name: "unique_data_migrations", unique: true, using: :btree + create_table "delegation_signers", force: :cascade do |t| t.integer "domain_id" t.string "key_tag" @@ -1026,7 +1032,7 @@ ActiveRecord::Schema.define(version: 20150722071128) do t.text "crt" t.string "type" t.string "registrant_ident" - t.string "encrypted_password", default: "" + t.string "encrypted_password", default: "", null: false t.datetime "remember_created_at" t.integer "failed_attempts", default: 0, null: false t.datetime "locked_at" @@ -1076,6 +1082,9 @@ ActiveRecord::Schema.define(version: 20150722071128) do t.datetime "updated_at" t.string "creator_str" t.string "updator_str" + t.text "ns_records" + t.text "a_records" + t.text "a4_records" end end diff --git a/db/structure.sql b/db/structure.sql index 46aaf34c1..567ad5ac4 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -690,6 +690,15 @@ CREATE SEQUENCE countries_id_seq ALTER SEQUENCE countries_id_seq OWNED BY countries.id; +-- +-- Name: data_migrations; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- + +CREATE TABLE data_migrations ( + version character varying NOT NULL +); + + -- -- Name: delegation_signers; Type: TABLE; Schema: public; Owner: -; Tablespace: -- @@ -2377,7 +2386,7 @@ CREATE TABLE pricelists ( id integer NOT NULL, "desc" character varying, category character varying, - price_cents numeric(10,2) DEFAULT 0 NOT NULL, + price_cents numeric(10,2) DEFAULT 0.0 NOT NULL, price_currency character varying DEFAULT 'EUR'::character varying NOT NULL, valid_from timestamp without time zone, valid_to timestamp without time zone, @@ -2641,7 +2650,7 @@ CREATE TABLE users ( crt text, type character varying, registrant_ident character varying, - encrypted_password character varying DEFAULT ''::character varying, + encrypted_password character varying DEFAULT ''::character varying NOT NULL, remember_created_at timestamp without time zone, failed_attempts integer DEFAULT 0 NOT NULL, locked_at timestamp without time zone @@ -2784,7 +2793,10 @@ CREATE TABLE zonefile_settings ( created_at timestamp without time zone, updated_at timestamp without time zone, creator_str character varying, - updator_str character varying + updator_str character varying, + ns_records text, + a_records text, + a4_records text ); @@ -4512,6 +4524,13 @@ CREATE INDEX index_whois_records_on_domain_id ON whois_records USING btree (doma CREATE INDEX index_whois_records_on_registrar_id ON whois_records USING btree (registrar_id); +-- +-- Name: unique_data_migrations; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- + +CREATE UNIQUE INDEX unique_data_migrations ON data_migrations USING btree (version); + + -- -- Name: unique_schema_migrations; Type: INDEX; Schema: public; Owner: -; Tablespace: -- @@ -4727,8 +4746,6 @@ INSERT INTO schema_migrations (version) VALUES ('20150227092508'); INSERT INTO schema_migrations (version) VALUES ('20150227113121'); -INSERT INTO schema_migrations (version) VALUES ('20150302130224'); - INSERT INTO schema_migrations (version) VALUES ('20150302161712'); INSERT INTO schema_migrations (version) VALUES ('20150303130729'); @@ -4787,8 +4804,6 @@ INSERT INTO schema_migrations (version) VALUES ('20150417082723'); INSERT INTO schema_migrations (version) VALUES ('20150421134820'); -INSERT INTO schema_migrations (version) VALUES ('20150422090645'); - INSERT INTO schema_migrations (version) VALUES ('20150422092514'); INSERT INTO schema_migrations (version) VALUES ('20150422132631'); @@ -4833,8 +4848,6 @@ INSERT INTO schema_migrations (version) VALUES ('20150519115050'); INSERT INTO schema_migrations (version) VALUES ('20150519140853'); -INSERT INTO schema_migrations (version) VALUES ('20150519142542'); - INSERT INTO schema_migrations (version) VALUES ('20150519144118'); INSERT INTO schema_migrations (version) VALUES ('20150520163237'); @@ -4847,7 +4860,9 @@ INSERT INTO schema_migrations (version) VALUES ('20150522164020'); INSERT INTO schema_migrations (version) VALUES ('20150525075550'); -INSERT INTO schema_migrations (version) VALUES ('20150603141054'); +INSERT INTO schema_migrations (version) VALUES ('20150601083516'); + +INSERT INTO schema_migrations (version) VALUES ('20150601083800'); INSERT INTO schema_migrations (version) VALUES ('20150603141549'); @@ -4855,8 +4870,12 @@ INSERT INTO schema_migrations (version) VALUES ('20150603211318'); INSERT INTO schema_migrations (version) VALUES ('20150603212659'); +INSERT INTO schema_migrations (version) VALUES ('20150609093515'); + INSERT INTO schema_migrations (version) VALUES ('20150609103333'); +INSERT INTO schema_migrations (version) VALUES ('20150610111019'); + INSERT INTO schema_migrations (version) VALUES ('20150610112238'); INSERT INTO schema_migrations (version) VALUES ('20150610144547'); @@ -4865,8 +4884,12 @@ INSERT INTO schema_migrations (version) VALUES ('20150611124920'); INSERT INTO schema_migrations (version) VALUES ('20150612123111'); +INSERT INTO schema_migrations (version) VALUES ('20150612125720'); + INSERT INTO schema_migrations (version) VALUES ('20150701074344'); +INSERT INTO schema_migrations (version) VALUES ('20150703084206'); + INSERT INTO schema_migrations (version) VALUES ('20150703084632'); INSERT INTO schema_migrations (version) VALUES ('20150706091724'); @@ -4883,3 +4906,5 @@ INSERT INTO schema_migrations (version) VALUES ('20150713113436'); INSERT INTO schema_migrations (version) VALUES ('20150722071128'); +INSERT INTO schema_migrations (version) VALUES ('20150803080914'); + From 72b322ae1fe52cfb851d13bcb0f55ec1a356e1a9 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Mon, 3 Aug 2015 12:23:48 +0300 Subject: [PATCH 04/68] Add ability to delete records #2806 --- app/controllers/admin/zonefile_settings_controller.rb | 10 ++++++++++ app/models/zonefile_setting.rb | 8 ++++++++ app/views/admin/zonefile_settings/edit.haml | 2 ++ config/locales/en.yml | 1 + 4 files changed, 21 insertions(+) diff --git a/app/controllers/admin/zonefile_settings_controller.rb b/app/controllers/admin/zonefile_settings_controller.rb index d671acba5..b9491a02c 100644 --- a/app/controllers/admin/zonefile_settings_controller.rb +++ b/app/controllers/admin/zonefile_settings_controller.rb @@ -35,6 +35,16 @@ class Admin::ZonefileSettingsController < AdminController 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 diff --git a/app/models/zonefile_setting.rb b/app/models/zonefile_setting.rb index 60b9994c1..403385bb5 100644 --- a/app/models/zonefile_setting.rb +++ b/app/models/zonefile_setting.rb @@ -4,6 +4,14 @@ class ZonefileSetting < ActiveRecord::Base 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) diff --git a/app/views/admin/zonefile_settings/edit.haml b/app/views/admin/zonefile_settings/edit.haml index f8f9a83c4..93234ed2e 100644 --- a/app/views/admin/zonefile_settings/edit.haml +++ b/app/views/admin/zonefile_settings/edit.haml @@ -1,5 +1,7 @@ - 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/config/locales/en.yml b/config/locales/en.yml index bf44f2407..1e72a76b2 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -898,3 +898,4 @@ en: 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' From 8c6bd53019656dbba2a4e9f8c457a873609d7f8a Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Mon, 3 Aug 2015 12:53:10 +0300 Subject: [PATCH 05/68] Add tests for zonefile #2806 --- .../zonefile_setting_fabricator.rb | 10 +++++++ spec/models/zonefile_setting_spec.rb | 30 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 spec/fabricators/zonefile_setting_fabricator.rb diff --git a/spec/fabricators/zonefile_setting_fabricator.rb b/spec/fabricators/zonefile_setting_fabricator.rb new file mode 100644 index 000000000..b8b04513a --- /dev/null +++ b/spec/fabricators/zonefile_setting_fabricator.rb @@ -0,0 +1,10 @@ +Fabricator(:zonefile_setting) do + origin 'ee' + ttl 43200 + refresh 3600 + expire 1209600 + minimum_ttl 3600 + email 'hostmaster.eestiinternet.ee' + master_nameserver 'ns.tld.ee' + after_build { |x| x.retry = 900 } +end diff --git a/spec/models/zonefile_setting_spec.rb b/spec/models/zonefile_setting_spec.rb index c8909f2eb..5ac895a8e 100644 --- a/spec/models/zonefile_setting_spec.rb +++ b/spec/models/zonefile_setting_spec.rb @@ -49,4 +49,34 @@ describe ZonefileSetting do @zonefile.scan(/^#{d.name}/).count.should == 0 end + + it 'does not create duplicate zones' do + Fabricate(:zonefile_setting) + expect { Fabricate(:zonefile_setting) }.to raise_error(ActiveRecord::RecordInvalid) + end + + it 'does not allow deleting zone when it has existing domains' do + zs = ZonefileSetting.where({ + origin: 'ee', + ttl: 43200, + refresh: 3600, + retry: 900, + expire: 1209600, + minimum_ttl: 3600, + email: 'hostmaster.eestiinternet.ee', + master_nameserver: 'ns.tld.ee' + }).first_or_create! + + d = Fabricate(:domain) + + zs.destroy.should == false + + zs.errors.full_messages.should match_array(["There are 1 domains in this zone"]) + ZonefileSetting.count.should == 1 + + d.destroy + zs.destroy + + ZonefileSetting.count.should == 0 + end end From 57aa65263a8925efedb9bd8cb8a0aeb530dcda4d Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Mon, 3 Aug 2015 12:55:23 +0300 Subject: [PATCH 06/68] Refactor model creation to fabricator #2806 --- spec/models/zonefile_setting_spec.rb | 34 +++------------------------- 1 file changed, 3 insertions(+), 31 deletions(-) diff --git a/spec/models/zonefile_setting_spec.rb b/spec/models/zonefile_setting_spec.rb index 5ac895a8e..d7a11bf85 100644 --- a/spec/models/zonefile_setting_spec.rb +++ b/spec/models/zonefile_setting_spec.rb @@ -2,27 +2,8 @@ require 'rails_helper' describe ZonefileSetting do it 'generates the zonefile' do - ZonefileSetting.where({ - origin: 'ee', - ttl: 43200, - refresh: 3600, - retry: 900, - expire: 1209600, - minimum_ttl: 3600, - email: 'hostmaster.eestiinternet.ee', - master_nameserver: 'ns.tld.ee' - }).first_or_create! - - ZonefileSetting.where({ - origin: 'pri.ee', - ttl: 43200, - refresh: 3600, - retry: 900, - expire: 1209600, - minimum_ttl: 3600, - email: 'hostmaster.eestiinternet.ee', - master_nameserver: 'ns.tld.ee' - }).first_or_create! + Fabricate(:zonefile_setting) + Fabricate(:zonefile_setting, origin: 'pri.ee') d = Fabricate(:domain_with_dnskeys, name: 'testpri.ee') d.nameservers << Nameserver.new({ @@ -56,16 +37,7 @@ describe ZonefileSetting do end it 'does not allow deleting zone when it has existing domains' do - zs = ZonefileSetting.where({ - origin: 'ee', - ttl: 43200, - refresh: 3600, - retry: 900, - expire: 1209600, - minimum_ttl: 3600, - email: 'hostmaster.eestiinternet.ee', - master_nameserver: 'ns.tld.ee' - }).first_or_create! + zs = Fabricate(:zonefile_setting) d = Fabricate(:domain) From e8e730a6e1f1d8418a81f1e95b671e0637c9619c Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Mon, 3 Aug 2015 13:31:13 +0300 Subject: [PATCH 07/68] Add feature tests for zonefile settings #2806 --- .../admin/zonefile_settings_controller.rb | 3 +- app/models/zonefile_setting.rb | 2 +- app/views/admin/zonefile_settings/_form.haml | 6 ++ spec/features/admin/zonefile_setting_spec.rb | 75 +++++++++++++++++++ 4 files changed, 84 insertions(+), 2 deletions(-) diff --git a/app/controllers/admin/zonefile_settings_controller.rb b/app/controllers/admin/zonefile_settings_controller.rb index b9491a02c..34283d872 100644 --- a/app/controllers/admin/zonefile_settings_controller.rb +++ b/app/controllers/admin/zonefile_settings_controller.rb @@ -53,7 +53,8 @@ class Admin::ZonefileSettingsController < AdminController def zonefile_setting_params params.require(:zonefile_setting).permit( - :origin, :ttl, :refresh, :retry, :expire, :minimum_ttl, :email, :ns_records, :a_records, :a4_records + :origin, :ttl, :refresh, :retry, :expire, :minimum_ttl, :email, + :master_nameserver, :ns_records, :a_records, :a4_records ) end end diff --git a/app/models/zonefile_setting.rb b/app/models/zonefile_setting.rb index 403385bb5..4a9656b7a 100644 --- a/app/models/zonefile_setting.rb +++ b/app/models/zonefile_setting.rb @@ -1,6 +1,6 @@ class ZonefileSetting < ActiveRecord::Base include Versions # version/zonefile_setting_version.rb - validates :origin, :ttl, :refresh, :retry, :expire, :minimum_ttl, :email, presence: true + 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 diff --git a/app/views/admin/zonefile_settings/_form.haml b/app/views/admin/zonefile_settings/_form.haml index f83107508..42ef94efa 100644 --- a/app/views/admin/zonefile_settings/_form.haml +++ b/app/views/admin/zonefile_settings/_form.haml @@ -50,6 +50,12 @@ .col-md-8 = f.text_field :email, class: 'form-control' + .form-group + .col-md-4.control-label + = f.label :master_nameserver + .col-md-8 + = f.text_field :master_nameserver, class: 'form-control' + .form-group .col-md-4.control-label = f.label :ns_records diff --git a/spec/features/admin/zonefile_setting_spec.rb b/spec/features/admin/zonefile_setting_spec.rb index a335be69c..71cf1e6f2 100644 --- a/spec/features/admin/zonefile_setting_spec.rb +++ b/spec/features/admin/zonefile_setting_spec.rb @@ -20,5 +20,80 @@ feature 'Zonefile settings', type: :feature do page.should have_content('Zonefile settings') end + + it 'should create zone' do + sign_in @user + visit admin_zonefile_settings_url + + page.should_not have_content('Generate zonefile') + + click_link 'New' + fill_in 'Origin', with: 'ee' + fill_in 'TTL', with: '43200' + fill_in 'Refresh', with: '3600' + fill_in 'Retry', with: '900' + fill_in 'Expire', with: '1209600' + fill_in 'Minimum TTL', with: '3600' + fill_in 'E-Mail', with: 'hostmaster.eestiinternet.ee' + fill_in 'Master nameserver', with: 'ns.tld.ee' + fill_in('Ns records', with: ' + ee. IN NS sunic.sunet.se. + ee. IN NS ns.eenet.ee. + ee. IN NS ns.tld.ee. + ee. IN NS ns.ut.ee. + ee. IN NS e.tld.ee. + ee. IN NS b.tld.ee. + ee. IN NS ee.aso.ee. + ') + + fill_in('A records', with: ' + ns.ut.ee. IN A 193.40.5.99 + ns.tld.ee. IN A 195.43.87.10 + ee.aso.ee. IN A 213.184.51.122 + b.tld.ee. IN A 194.146.106.110 + ns.eenet.ee. IN A 193.40.56.245 + e.tld.ee. IN A 204.61.216.36 + ') + + fill_in('AAAA records', with: ' + ee.aso.ee. IN AAAA 2A02:88:0:21::2 + b.tld.ee. IN AAAA 2001:67C:1010:28::53 + ns.eenet.ee. IN AAAA 2001:BB8::1 + e.tld.ee. IN AAAA 2001:678:94:53::53 + ') + + click_button 'Save' + + page.should have_content('Record created') + page.should have_content('ee') + page.should have_content('Generate zonefile') + + click_link 'Generate zonefile' + response_headers['Content-Type'].should == 'text/plain' + response_headers['Content-Disposition'].should == "attachment; filename=\"ee.txt\"" + end + + it 'does not delete zone with existin domains' do + ZonefileSetting.find_by(origin: 'ee') || Fabricate(:zonefile_setting) + Fabricate(:domain) + sign_in @user + visit admin_zonefile_settings_url + click_link 'ee' + click_link 'Delete' + + page.should have_content("There are 1 domains in this zone") + page.should have_content('Failed to delete record') + end + + it 'deletes a zone' do + ZonefileSetting.find_by(origin: 'ee') || Fabricate(:zonefile_setting) + Domain.destroy_all + sign_in @user + visit admin_zonefile_settings_url + click_link 'ee' + click_link 'Delete' + page.should have_content('Record deleted') + page.should_not have_content("Generate zonefile") + end end end From 1a7360cc3c7fac87d5abba1f559958dcb5447634 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Mon, 3 Aug 2015 17:11:56 +0300 Subject: [PATCH 08/68] Tests #2806 --- app/validators/domain_name_validator.rb | 3 +- spec/models/domain_spec.rb | 56 +++++++++++++++---------- spec/models/zonefile_setting_spec.rb | 4 +- 3 files changed, 40 insertions(+), 23 deletions(-) diff --git a/app/validators/domain_name_validator.rb b/app/validators/domain_name_validator.rb index 471565c30..c8ed2813c 100644 --- a/app/validators/domain_name_validator.rb +++ b/app/validators/domain_name_validator.rb @@ -33,7 +33,8 @@ class DomainNameValidator < ActiveModel::EachValidator def validate_blocked(value) return true unless value - BlockedDomain.where("names @> ?::varchar[]", "{#{value}}").count == 0 + return false if BlockedDomain.where("names @> ?::varchar[]", "{#{value}}").count > 0 + ZonefileSetting.where(origin: value).count == 0 end end end diff --git a/spec/models/domain_spec.rb b/spec/models/domain_spec.rb index e39300e74..ef744d263 100644 --- a/spec/models/domain_spec.rb +++ b/spec/models/domain_spec.rb @@ -469,35 +469,49 @@ describe Domain do end end - # it 'validates domain name', skip: true do - # d = Fabricate(:domain) - # expect(d.name).to_not be_nil + it 'validates domain name' do + d = Fabricate(:domain) + expect(d.name).to_not be_nil - # invalid = ['a.ee', "#{'a' * 64}.ee", 'ab.eu', 'test.ab.ee', '-test.ee', '-test-.ee', 'test-.ee', 'te--st.ee', - # 'õ.pri.ee', 'test.com', 'www.ab.ee', 'test.eu', ' .ee', 'a b.ee', 'Ž .ee', 'test.edu.ee'] + invalid = ['a.ee', "#{'a' * 64}.ee", 'ab.eu', 'test.ab.ee', '-test.ee', '-test-.ee', 'test-.ee', 'te--st.ee', + 'õ.pri.ee', 'test.com', 'www.ab.ee', 'test.eu', ' .ee', 'a b.ee', 'Ž .ee', 'test.edu.ee'] - # invalid.each do |x| - # expect(Fabricate.build(:domain, name: x).valid?).to be false - # end + invalid.each do |x| + expect(Fabricate.build(:domain, name: x).valid?).to be false + end - # valid = ['ab.ee', "#{'a' * 63}.ee", 'te-s-t.ee', 'jäääär.ee', 'päike.pri.ee', - # 'õigus.com.ee', 'õäöü.fie.ee', 'test.med.ee', 'žä.ee', ' ŽŠ.ee '] + valid = ['ab.ee', "#{'a' * 63}.ee", 'te-s-t.ee', 'jäääär.ee', 'päike.pri.ee', + 'õigus.com.ee', 'õäöü.fie.ee', 'test.med.ee', 'žä.ee', ' ŽŠ.ee '] - # valid.each do |x| - # expect(Fabricate.build(:domain, name: x).valid?).to be true - # end + valid.each do |x| + expect(Fabricate.build(:domain, name: x).valid?).to be true + end - # invalid_punycode = ['xn--geaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-4we.pri.ee'] + invalid_punycode = ['xn--geaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-4we.pri.ee'] - # invalid_punycode.each do |x| - # expect(Fabricate.build(:domain, name: x).valid?).to be false - # end + invalid_punycode.each do |x| + expect(Fabricate.build(:domain, name: x).valid?).to be false + end - # valid_punycode = ['xn--ge-uia.pri.ee', 'xn--geaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-9te.pri.ee'] + valid_punycode = ['xn--ge-uia.pri.ee', 'xn--geaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-9te.pri.ee'] - # valid_punycode.each do |x| - # expect(Fabricate.build(:domain, name: x).valid?).to be true - # end + valid_punycode.each do |x| + expect(Fabricate.build(:domain, name: x).valid?).to be true + end + end + + it 'should not create zone origin domain' do + zs = Fabricate(:zonefile_setting) + d = Fabricate.build(:domain, name: 'ee') + d.save.should == false + d.errors.full_messages.should match_array([ + "Data management policy violation: Domain name is blocked [name]" + ]) + + zs.destroy + + d.save.should == true + end # d = Domain.new # expect(d.valid?).to be false diff --git a/spec/models/zonefile_setting_spec.rb b/spec/models/zonefile_setting_spec.rb index d7a11bf85..013015bbd 100644 --- a/spec/models/zonefile_setting_spec.rb +++ b/spec/models/zonefile_setting_spec.rb @@ -33,7 +33,9 @@ describe ZonefileSetting do it 'does not create duplicate zones' do Fabricate(:zonefile_setting) - expect { Fabricate(:zonefile_setting) }.to raise_error(ActiveRecord::RecordInvalid) + zs = Fabricate.build(:zonefile_setting) + zs.save.should == false + zs.errors.full_messages.should match_array(["Origin has already been taken"]) end it 'does not allow deleting zone when it has existing domains' do From 0fdbcadcf5245cac060477bdfb15797d8f153d2a Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 4 Aug 2015 11:33:38 +0300 Subject: [PATCH 09/68] Add new task to import zones #2806 --- lib/tasks/import.rake | 369 ++++++++++++++++++------------------------ 1 file changed, 160 insertions(+), 209 deletions(-) diff --git a/lib/tasks/import.rake b/lib/tasks/import.rake index 9a89d2b72..f8b7be5ce 100644 --- a/lib/tasks/import.rake +++ b/lib/tasks/import.rake @@ -54,7 +54,7 @@ namespace :import do Rake::Task['import:registrars'].invoke Rake::Task['import:contacts'].invoke Rake::Task['import:domains'].invoke - Rake::Task['import:eis_domains'].invoke + Rake::Task['import:zones'].invoke end desc 'Import registrars' @@ -473,246 +473,197 @@ namespace :import do puts "-----> Imported #{count} new domains in #{(Time.zone.now.to_f - start).round(2)} seconds" end - desc 'Import EIS domains' - task eis_domains: :environment do + desc 'Import zones' + task zones: :environment do start = Time.zone.now.to_f - puts '-----> Importing EIS domains...' + puts '-----> Importing zones...' - eis = Registrar.where( - name: 'EIS', - reg_no: '90010019', - phone: '+3727271000', - country_code: 'EE', - vat_no: 'EE101286464', - email: 'info@internet.ee', - state: 'Harjumaa', - city: 'Tallinn', - street: 'Paldiski mnt 80', - zip: '10617', - url: 'www.internet.ee', - code: 'EIS' - ).first_or_create! + ns_records, a_records, a4_records = parse_zone_ns_data(1) - unless eis.cash_account - eis.accounts.create(account_type: Account::CASH, currency: 'EUR') - eis.save - end - - c = Registrant.where( - name: 'Eesti Interneti Sihtasutus', - phone: '+372.7271000', - email: 'info@internet.ee', - ident: '90010019', - ident_type: 'passport', - city: 'Tallinn', - country_code: 'ee', - street: 'Paldiski mnt 80', - zip: '10617', - registrar: eis - ).first_or_create! - - # ee - ns_list = [] - Legacy::ZoneNs.where(zone: 1).each do |x| - ipv4 = x.addrs.select { |addr| addr.ipv4? }.first - ipv6 = x.addrs.select { |addr| addr.ipv6? }.first - ns_list << Nameserver.new(hostname: x.fqdn, ipv4: ipv4, ipv6: ipv6) - end - - Domain.create!( - name: 'ee', - valid_to: Date.new(9999, 1, 1), - period: 1, - period_unit: 'y', - registrant: c, - nameservers: ns_list, - admin_contacts: [c], - tech_contacts: [c], - registrar: eis - ) + ZonefileSetting.create!({ + origin: 'ee', + ttl: 43200, + refresh: 3600, + retry: 900, + expire: 1209600, + minimum_ttl: 3600, + email: 'hostmaster.eestiinternet.ee', + master_nameserver: 'ns.tld.ee', + ns_records: ns_records, + a_records: a_records, + a4_records: a4_records + }) # edu.ee - ns_list = [] - Legacy::ZoneNs.where(zone: 6).each do |x| - ipv4 = x.addrs.select { |addr| addr.ipv4? }.first - ipv6 = x.addrs.select { |addr| addr.ipv6? }.first - ns_list << Nameserver.new(hostname: x.fqdn, ipv4: ipv4, ipv6: ipv6) - end + ns_records, a_records, a4_records = parse_zone_ns_data(6) - Domain.create!( - name: 'edu.ee', - valid_to: Date.new(9999, 1, 1), - period: 1, - period_unit: 'y', - registrant: c, - nameservers: ns_list, - admin_contacts: [c], - tech_contacts: [c], - registrar: eis - ) + ZonefileSetting.create!({ + origin: 'edu.ee', + ttl: 43200, + refresh: 3600, + retry: 900, + expire: 1209600, + minimum_ttl: 3600, + email: 'hostmaster.eestiinternet.ee', + master_nameserver: 'ns.tld.ee', + ns_records: ns_records, + a_records: a_records, + a4_records: a4_records + }) # aip.ee - ns_list = [] - Legacy::ZoneNs.where(zone: 9).each do |x| - ipv4 = x.addrs.select { |addr| addr.ipv4? }.first - ipv6 = x.addrs.select { |addr| addr.ipv6? }.first - ns_list << Nameserver.new(hostname: x.fqdn, ipv4: ipv4, ipv6: ipv6) - end + ns_records, a_records, a4_records = parse_zone_ns_data(9) - Domain.create!( - name: 'aip.ee', - valid_to: Date.new(9999, 1, 1), - period: 1, - period_unit: 'y', - registrant: c, - nameservers: ns_list, - admin_contacts: [c], - tech_contacts: [c], - registrar: eis - ) + ZonefileSetting.create!({ + origin: 'aip.ee', + ttl: 43200, + refresh: 3600, + retry: 900, + expire: 1209600, + minimum_ttl: 3600, + email: 'hostmaster.eestiinternet.ee', + master_nameserver: 'ns.tld.ee', + ns_records: ns_records, + a_records: a_records, + a4_records: a4_records + }) # org.ee - ns_list = [] - Legacy::ZoneNs.where(zone: 10).each do |x| - ipv4 = x.addrs.select { |addr| addr.ipv4? }.first - ipv6 = x.addrs.select { |addr| addr.ipv6? }.first - ns_list << Nameserver.new(hostname: x.fqdn, ipv4: ipv4, ipv6: ipv6) - end + ns_records, a_records, a4_records = parse_zone_ns_data(10) - Domain.create!( - name: 'org.ee', - valid_to: Date.new(9999, 1, 1), - period: 1, - period_unit: 'y', - registrant: c, - nameservers: ns_list, - admin_contacts: [c], - tech_contacts: [c], - registrar: eis - ) + ZonefileSetting.create!({ + origin: 'org.ee', + ttl: 43200, + refresh: 3600, + retry: 900, + expire: 1209600, + minimum_ttl: 3600, + email: 'hostmaster.eestiinternet.ee', + master_nameserver: 'ns.tld.ee', + ns_records: ns_records, + a_records: a_records, + a4_records: a4_records + }) # pri.ee - ns_list = [] - Legacy::ZoneNs.where(zone: 2).each do |x| - ipv4 = x.addrs.select { |addr| addr.ipv4? }.first - ipv6 = x.addrs.select { |addr| addr.ipv6? }.first - ns_list << Nameserver.new(hostname: x.fqdn, ipv4: ipv4, ipv6: ipv6) - end + ns_records, a_records, a4_records = parse_zone_ns_data(2) - Domain.create!( - name: 'pri.ee', - valid_to: Date.new(9999, 1, 1), - period: 1, - period_unit: 'y', - registrant: c, - nameservers: ns_list, - admin_contacts: [c], - tech_contacts: [c], - registrar: eis - ) + ZonefileSetting.create!({ + origin: 'pri.ee', + ttl: 43200, + refresh: 3600, + retry: 900, + expire: 1209600, + minimum_ttl: 3600, + email: 'hostmaster.eestiinternet.ee', + master_nameserver: 'ns.tld.ee', + ns_records: ns_records, + a_records: a_records, + a4_records: a4_records + }) # med.ee - ns_list = [] - Legacy::ZoneNs.where(zone: 3).each do |x| - ipv4 = x.addrs.select { |addr| addr.ipv4? }.first - ipv6 = x.addrs.select { |addr| addr.ipv6? }.first - ns_list << Nameserver.new(hostname: x.fqdn, ipv4: ipv4, ipv6: ipv6) - end + ns_records, a_records, a4_records = parse_zone_ns_data(3) - Domain.create!( - name: 'med.ee', - valid_to: Date.new(9999, 1, 1), - period: 1, - period_unit: 'y', - registrant: c, - nameservers: ns_list, - admin_contacts: [c], - tech_contacts: [c], - registrar: eis - ) + ZonefileSetting.create!({ + origin: 'med.ee', + ttl: 43200, + refresh: 3600, + retry: 900, + expire: 1209600, + minimum_ttl: 3600, + email: 'hostmaster.eestiinternet.ee', + master_nameserver: 'ns.tld.ee', + ns_records: ns_records, + a_records: a_records, + a4_records: a4_records + }) # fie.ee - ns_list = [] - Legacy::ZoneNs.where(zone: 4).each do |x| - ipv4 = x.addrs.select { |addr| addr.ipv4? }.first - ipv6 = x.addrs.select { |addr| addr.ipv6? }.first - ns_list << Nameserver.new(hostname: x.fqdn, ipv4: ipv4, ipv6: ipv6) - end + ns_records, a_records, a4_records = parse_zone_ns_data(4) - Domain.create!( - name: 'fie.ee', - valid_to: Date.new(9999, 1, 1), - period: 1, - period_unit: 'y', - registrant: c, - nameservers: ns_list, - admin_contacts: [c], - tech_contacts: [c], - registrar: eis - ) + ZonefileSetting.create!({ + origin: 'fie.ee', + ttl: 43200, + refresh: 3600, + retry: 900, + expire: 1209600, + minimum_ttl: 3600, + email: 'hostmaster.eestiinternet.ee', + master_nameserver: 'ns.tld.ee', + ns_records: ns_records, + a_records: a_records, + a4_records: a4_records + }) # com.ee - ns_list = [] - Legacy::ZoneNs.where(zone: 5).each do |x| - ipv4 = x.addrs.select { |addr| addr.ipv4? }.first - ipv6 = x.addrs.select { |addr| addr.ipv6? }.first - ns_list << Nameserver.new(hostname: x.fqdn, ipv4: ipv4, ipv6: ipv6) - end + ns_records, a_records, a4_records = parse_zone_ns_data(5) - Domain.create!( - name: 'com.ee', - valid_to: Date.new(9999, 1, 1), - period: 1, - period_unit: 'y', - registrant: c, - nameservers: ns_list, - admin_contacts: [c], - tech_contacts: [c], - registrar: eis - ) + ZonefileSetting.create!({ + origin: 'com.ee', + ttl: 43200, + refresh: 3600, + retry: 900, + expire: 1209600, + minimum_ttl: 3600, + email: 'hostmaster.eestiinternet.ee', + master_nameserver: 'ns.tld.ee', + ns_records: ns_records, + a_records: a_records, + a4_records: a4_records + }) # gov.ee - ns_list = [] - Legacy::ZoneNs.where(zone: 7).each do |x| - ipv4 = x.addrs.select { |addr| addr.ipv4? }.first - ipv6 = x.addrs.select { |addr| addr.ipv6? }.first - ns_list << Nameserver.new(hostname: x.fqdn, ipv4: ipv4, ipv6: ipv6) - end + ns_records, a_records, a4_records = parse_zone_ns_data(7) - Domain.create!( - name: 'gov.ee', - valid_to: Date.new(9999, 1, 1), - period: 1, - period_unit: 'y', - registrant: c, - nameservers: ns_list, - admin_contacts: [c], - tech_contacts: [c], - registrar: eis - ) + ZonefileSetting.create!({ + origin: 'gov.ee', + ttl: 43200, + refresh: 3600, + retry: 900, + expire: 1209600, + minimum_ttl: 3600, + email: 'hostmaster.eestiinternet.ee', + master_nameserver: 'ns.tld.ee', + ns_records: ns_records, + a_records: a_records, + a4_records: a4_records + }) # riik.ee - ns_list = [] - Legacy::ZoneNs.where(zone: 8).each do |x| - ipv4 = x.addrs.select { |addr| addr.ipv4? }.first - ipv6 = x.addrs.select { |addr| addr.ipv6? }.first - ns_list << Nameserver.new(hostname: x.fqdn, ipv4: ipv4, ipv6: ipv6) - end + ns_records, a_records, a4_records = parse_zone_ns_data(8) - Domain.create!( - name: 'riik.ee', - valid_to: Date.new(9999, 1, 1), - period: 1, - period_unit: 'y', - registrant: c, - nameservers: ns_list, - admin_contacts: [c], - tech_contacts: [c], - registrar: eis - ) + ZonefileSetting.create!({ + origin: 'riik.ee', + ttl: 43200, + refresh: 3600, + retry: 900, + expire: 1209600, + minimum_ttl: 3600, + email: 'hostmaster.eestiinternet.ee', + master_nameserver: 'ns.tld.ee', + ns_records: ns_records, + a_records: a_records, + a4_records: a4_records + }) - puts "-----> Imported EIS domains in #{(Time.zone.now.to_f - start).round(2)} seconds" + puts "-----> Imported zones in #{(Time.zone.now.to_f - start).round(2)} seconds" end end + +def parse_zone_ns_data(zone) + ns_records = '' + a_records = '' + a4_records = '' + Legacy::ZoneNs.where(zone: zone).each do |x| + ipv4 = x.addrs.select { |addr| addr.ipv4? }.first + ipv6 = x.addrs.select { |addr| addr.ipv6? }.first + + ns_records += "ee. IN NS #{x.fqdn}.\n" + a_records += "#{x.fqdn}. IN A #{ipv4}\n" if ipv4.present? + a4_records += "#{x.fqdn}. IN AAAA #{ipv6}\n" if ipv6.present? + end + [ns_records.strip, a_records.strip, a4_records.strip] +end # rubocop: enable Performance/Detect # rubocop: enable Style/SymbolProc From 303e3150cdee0623997a17022a63b3158174070a Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 4 Aug 2015 13:18:35 +0300 Subject: [PATCH 10/68] Use origin ns records from zonefile settings #2806 --- lib/tasks/zonefile.rake | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/tasks/zonefile.rake b/lib/tasks/zonefile.rake index 4829f5324..d3d8f1f46 100644 --- a/lib/tasks/zonefile.rake +++ b/lib/tasks/zonefile.rake @@ -40,19 +40,23 @@ namespace :zonefile do 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 OR d.name = i_origin + WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter ORDER BY d.name ), chr(10) ) INTO tmp_var; - ret := concat(ret, '; Zone NS Records', chr(10), tmp_var, chr(10), chr(10)); + ret := concat(ret, tmp_var, chr(10), chr(10)); -- a glue records for origin nameservers SELECT array_to_string( From 73b23c1efacc8227916d63f150d07ddb05037688 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 4 Aug 2015 13:47:37 +0300 Subject: [PATCH 11/68] Use a and a4 records from zonefile setting #2806 --- lib/tasks/import.rake | 24 ++++++++-------- lib/tasks/zonefile.rake | 61 ++++++----------------------------------- 2 files changed, 20 insertions(+), 65 deletions(-) diff --git a/lib/tasks/import.rake b/lib/tasks/import.rake index f8b7be5ce..7b3625ad2 100644 --- a/lib/tasks/import.rake +++ b/lib/tasks/import.rake @@ -478,7 +478,7 @@ namespace :import do start = Time.zone.now.to_f puts '-----> Importing zones...' - ns_records, a_records, a4_records = parse_zone_ns_data(1) + ns_records, a_records, a4_records = parse_zone_ns_data('ee', 1) ZonefileSetting.create!({ origin: 'ee', @@ -495,7 +495,7 @@ namespace :import do }) # edu.ee - ns_records, a_records, a4_records = parse_zone_ns_data(6) + ns_records, a_records, a4_records = parse_zone_ns_data('edu.ee', 6) ZonefileSetting.create!({ origin: 'edu.ee', @@ -512,7 +512,7 @@ namespace :import do }) # aip.ee - ns_records, a_records, a4_records = parse_zone_ns_data(9) + ns_records, a_records, a4_records = parse_zone_ns_data('aip.ee', 9) ZonefileSetting.create!({ origin: 'aip.ee', @@ -529,7 +529,7 @@ namespace :import do }) # org.ee - ns_records, a_records, a4_records = parse_zone_ns_data(10) + ns_records, a_records, a4_records = parse_zone_ns_data('org.ee', 10) ZonefileSetting.create!({ origin: 'org.ee', @@ -546,7 +546,7 @@ namespace :import do }) # pri.ee - ns_records, a_records, a4_records = parse_zone_ns_data(2) + ns_records, a_records, a4_records = parse_zone_ns_data('pri.ee', 2) ZonefileSetting.create!({ origin: 'pri.ee', @@ -563,7 +563,7 @@ namespace :import do }) # med.ee - ns_records, a_records, a4_records = parse_zone_ns_data(3) + ns_records, a_records, a4_records = parse_zone_ns_data('med.ee', 3) ZonefileSetting.create!({ origin: 'med.ee', @@ -580,7 +580,7 @@ namespace :import do }) # fie.ee - ns_records, a_records, a4_records = parse_zone_ns_data(4) + ns_records, a_records, a4_records = parse_zone_ns_data('fie.ee', 4) ZonefileSetting.create!({ origin: 'fie.ee', @@ -597,7 +597,7 @@ namespace :import do }) # com.ee - ns_records, a_records, a4_records = parse_zone_ns_data(5) + ns_records, a_records, a4_records = parse_zone_ns_data('com.ee', 5) ZonefileSetting.create!({ origin: 'com.ee', @@ -614,7 +614,7 @@ namespace :import do }) # gov.ee - ns_records, a_records, a4_records = parse_zone_ns_data(7) + ns_records, a_records, a4_records = parse_zone_ns_data('gov.ee', 7) ZonefileSetting.create!({ origin: 'gov.ee', @@ -631,7 +631,7 @@ namespace :import do }) # riik.ee - ns_records, a_records, a4_records = parse_zone_ns_data(8) + ns_records, a_records, a4_records = parse_zone_ns_data('riik.ee', 8) ZonefileSetting.create!({ origin: 'riik.ee', @@ -651,7 +651,7 @@ namespace :import do end end -def parse_zone_ns_data(zone) +def parse_zone_ns_data(domain, zone) ns_records = '' a_records = '' a4_records = '' @@ -659,7 +659,7 @@ def parse_zone_ns_data(zone) ipv4 = x.addrs.select { |addr| addr.ipv4? }.first ipv6 = x.addrs.select { |addr| addr.ipv6? }.first - ns_records += "ee. IN NS #{x.fqdn}.\n" + ns_records += "#{domain}. IN NS #{x.fqdn}.\n" a_records += "#{x.fqdn}. IN A #{ipv4}\n" if ipv4.present? a4_records += "#{x.fqdn}. IN AAAA #{ipv6}\n" if ipv6.present? end diff --git a/lib/tasks/zonefile.rake b/lib/tasks/zonefile.rake index d3d8f1f46..4aaeaf50e 100644 --- a/lib/tasks/zonefile.rake +++ b/lib/tasks/zonefile.rake @@ -58,19 +58,9 @@ namespace :zonefile do ret := concat(ret, tmp_var, chr(10), chr(10)); - -- a glue records for origin nameservers - SELECT array_to_string( - array( - SELECT concat(ns.hostname, '. IN A ', ns.ipv4) - FROM nameservers ns - JOIN domains d ON d.id = ns.domain_id - WHERE d.name = i_origin - AND ns.hostname LIKE '%.' || d.name - AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '' - ), chr(10) - ) INTO tmp_var; - - ret := concat(ret, '; Zone A Records', chr(10), tmp_var); + -- 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( @@ -82,43 +72,14 @@ namespace :zonefile do AND ns.hostname LIKE '%.' || d.name AND d.name <> i_origin AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '' - AND NOT EXISTS ( -- filter out glue records that already appeared in origin glue recrods - SELECT 1 FROM nameservers nsi - JOIN domains di ON nsi.domain_id = di.id - WHERE di.name = i_origin - AND nsi.hostname = ns.hostname - ) ), chr(10) ) INTO tmp_var; - -- TODO This is a possible subtitition to the previous query, stress testing is needed to see which is faster + ret := concat(ret, tmp_var, chr(10), chr(10)); - -- SELECT ns.* - -- FROM nameservers ns - -- JOIN domains d ON d.id = ns.domain_id - -- WHERE d.name LIKE '%ee' AND d.name NOT LIKE '%pri.ee' - -- AND ns.hostname LIKE '%.' || d.name - -- AND d.name <> 'ee' - -- AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '' - -- AND ns.hostname NOT IN ( - -- SELECT ns.hostname FROM domains d JOIN nameservers ns ON d.id = ns.domain_id WHERE d.name = 'ee' - -- ) - - ret := concat(ret, chr(10), tmp_var, chr(10), chr(10)); - - -- aaaa glue records for origin nameservers - SELECT array_to_string( - array( - SELECT concat(ns.hostname, '. IN AAAA ', ns.ipv6) - FROM nameservers ns - JOIN domains d ON d.id = ns.domain_id - WHERE d.name = i_origin - AND ns.hostname LIKE '%.' || d.name - AND ns.ipv6 IS NOT NULL AND ns.ipv6 <> '' - ), chr(10) - ) INTO tmp_var; - - ret := concat(ret, '; Zone AAAA Records', chr(10), tmp_var); + -- 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( @@ -130,16 +91,10 @@ namespace :zonefile do AND ns.hostname LIKE '%.' || d.name AND d.name <> i_origin AND ns.ipv6 IS NOT NULL AND ns.ipv6 <> '' - AND NOT EXISTS ( -- filter out glue records that already appeared in origin glue recrods - SELECT 1 FROM nameservers nsi - JOIN domains di ON nsi.domain_id = di.id - WHERE di.name = i_origin - AND nsi.hostname = ns.hostname - ) ), chr(10) ) INTO tmp_var; - ret := concat(ret, chr(10), tmp_var, chr(10), chr(10)); + ret := concat(ret, tmp_var, chr(10), chr(10)); -- ds records SELECT array_to_string( From 33cdc6cdbea63916d62ad23252e30f22d2c27235 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 4 Aug 2015 17:13:53 +0300 Subject: [PATCH 12/68] Add legal doc types #2836 --- doc/schemas/eis-1.0.xsd | 3 +++ lib/schemas/eis-1.0.xsd | 3 +++ 2 files changed, 6 insertions(+) diff --git a/doc/schemas/eis-1.0.xsd b/doc/schemas/eis-1.0.xsd index a8b7221a3..262281cca 100644 --- a/doc/schemas/eis-1.0.xsd +++ b/doc/schemas/eis-1.0.xsd @@ -70,6 +70,9 @@ + + + diff --git a/lib/schemas/eis-1.0.xsd b/lib/schemas/eis-1.0.xsd index a8b7221a3..262281cca 100644 --- a/lib/schemas/eis-1.0.xsd +++ b/lib/schemas/eis-1.0.xsd @@ -70,6 +70,9 @@ + + + From c482a3e46de490723376e50e0deb3f0660f0c03c Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 4 Aug 2015 17:53:47 +0300 Subject: [PATCH 13/68] Fix rubocop --- spec/models/domain_spec.rb | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/spec/models/domain_spec.rb b/spec/models/domain_spec.rb index ef744d263..e99b2ef15 100644 --- a/spec/models/domain_spec.rb +++ b/spec/models/domain_spec.rb @@ -473,15 +473,20 @@ describe Domain do d = Fabricate(:domain) expect(d.name).to_not be_nil - invalid = ['a.ee', "#{'a' * 64}.ee", 'ab.eu', 'test.ab.ee', '-test.ee', '-test-.ee', 'test-.ee', 'te--st.ee', - 'õ.pri.ee', 'test.com', 'www.ab.ee', 'test.eu', ' .ee', 'a b.ee', 'Ž .ee', 'test.edu.ee'] + invalid = [ + 'a.ee', "#{'a' * 64}.ee", 'ab.eu', 'test.ab.ee', '-test.ee', '-test-.ee', + 'test-.ee', 'te--st.ee', 'õ.pri.ee', 'test.com', 'www.ab.ee', 'test.eu', ' .ee', 'a b.ee', + 'Ž .ee', 'test.edu.ee' + ] invalid.each do |x| expect(Fabricate.build(:domain, name: x).valid?).to be false end - valid = ['ab.ee', "#{'a' * 63}.ee", 'te-s-t.ee', 'jäääär.ee', 'päike.pri.ee', - 'õigus.com.ee', 'õäöü.fie.ee', 'test.med.ee', 'žä.ee', ' ŽŠ.ee '] + valid = [ + 'ab.ee', "#{'a' * 63}.ee", 'te-s-t.ee', 'jäääär.ee', 'päike.pri.ee', + 'õigus.com.ee', 'õäöü.fie.ee', 'test.med.ee', 'žä.ee', ' ŽŠ.ee ' + ] valid.each do |x| expect(Fabricate.build(:domain, name: x).valid?).to be true From 6ca53f946aac08cd4974d1d139a714eeec10a74c Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Thu, 6 Aug 2015 13:21:15 +0300 Subject: [PATCH 14/68] Validate contact and invoice emails when they change #2745 --- Gemfile | 2 ++ Gemfile.lock | 3 +++ app/models/contact.rb | 1 + app/models/invoice.rb | 2 +- app/models/registrar.rb | 4 +++- spec/epp/contact_spec.rb | 19 +++++++++++++++++++ spec/models/contact_spec.rb | 14 ++++++++++++++ 7 files changed, 43 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index b2fd0f844..4866b0396 100644 --- a/Gemfile +++ b/Gemfile @@ -18,6 +18,8 @@ gem 'figaro', '~> 1.1.1' # model related gem 'pg', '~> 0.18.0' gem 'ransack', '~> 1.5.1' # for searching +gem 'validates_email_format_of', '~> 1.6.3' # validates email against RFC 2822 and RFC 3696 + # with polymorphic fix gem 'paper_trail', github: 'airblade/paper_trail', diff --git a/Gemfile.lock b/Gemfile.lock index ee1c0ad36..57e700c12 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -521,6 +521,8 @@ GEM parser (~> 2.2.2) procto (~> 0.0.2) uuidtools (2.1.5) + validates_email_format_of (1.6.3) + i18n virtus (1.0.5) axiom-types (~> 0.1) coercible (~> 1.0) @@ -622,4 +624,5 @@ DEPENDENCIES uglifier (~> 2.7.1) unicorn uuidtools (~> 2.1.4) + validates_email_format_of (~> 1.6.3) whenever (~> 0.9.4) diff --git a/app/models/contact.rb b/app/models/contact.rb index c69797403..fc29c56eb 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -19,6 +19,7 @@ class Contact < ActiveRecord::Base # Phone nr validation is very minimam in order to support legacy requirements validates :phone, format: /\+[0-9]{1,3}\.[0-9]{1,14}?/ validates :email, format: /@/ + validates :email, email_format: { message: :invalid }, if: proc { |c| c.email_changed? } validates :ident, format: { with: /\d{4}-\d{2}-\d{2}/, message: :invalid_birthday_format }, if: proc { |c| c.ident_type == 'birthday' } diff --git a/app/models/invoice.rb b/app/models/invoice.rb index 83145553b..a658b69df 100644 --- a/app/models/invoice.rb +++ b/app/models/invoice.rb @@ -12,7 +12,7 @@ class Invoice < ActiveRecord::Base } attr_accessor :billing_email - validates :billing_email, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i }, allow_blank: true + validates :billing_email, email_format: { message: :invalid }, allow_blank: true validates :invoice_type, :due_date, :currency, :seller_name, :seller_iban, :buyer_name, :invoice_items, :vat_prc, presence: true diff --git a/app/models/registrar.rb b/app/models/registrar.rb index d5ba8bd9a..0110e5a16 100644 --- a/app/models/registrar.rb +++ b/app/models/registrar.rb @@ -45,7 +45,9 @@ class Registrar < ActiveRecord::Base end end - validates :email, :billing_email, format: /@/, allow_blank: true + validates :email, :billing_email, + email_format: { message: :invalid }, + allow_blank: true, if: proc { |c| c.email_changed? } WHOIS_TRIGGERS = %w(name email phone street city state zip) diff --git a/spec/epp/contact_spec.rb b/spec/epp/contact_spec.rb index b7b6bc976..754c5a4db 100644 --- a/spec/epp/contact_spec.rb +++ b/spec/epp/contact_spec.rb @@ -133,6 +133,13 @@ describe 'EPP Contact', epp: true do cr_date.text.in_time_zone.utc.should be_within(5).of(Time.zone.now) end + it 'should return email issue' do + response = create_request(email: { value: 'not@valid' }) + + response[:msg].should == 'Email is invalid [email]' + response[:result_code].should == '2005' + end + it 'should add registrar prefix for code when missing' do response = create_request({ id: { value: 'abc12345' } }) response[:msg].should == 'Command completed successfully' @@ -397,6 +404,18 @@ describe 'EPP Contact', epp: true do response[:results][1][:result_code].should == '2005' end + it 'should return email issue' do + response = update_request({ + id: { value: 'FIRST0:SH8013' }, + chg: { + email: { value: 'legacy@wrong' } + } + }) + + response[:msg].should == 'Email is invalid [email]' + response[:result_code].should == '2005' + end + it 'should not update code with custom string' do response = update_request( { diff --git a/spec/models/contact_spec.rb b/spec/models/contact_spec.rb index 6cc3ee124..b55626d26 100644 --- a/spec/models/contact_spec.rb +++ b/spec/models/contact_spec.rb @@ -109,6 +109,12 @@ describe Contact do it 'should have no related domain descriptions' do @contact.related_domain_descriptions.should == {} end + + it 'should fully validate email syntax for new records' do + @contact.email = 'not@correct' + @contact.valid? + @contact.errors[:email].should == ['Email is invalid'] + end end context 'with valid attributes' do @@ -247,6 +253,14 @@ describe Contact do contact = @domain.contacts.first contact.related_domain_descriptions.should == { "#{@domain.name}" => [:admin] } end + + it 'should fully validate email syntax for old records' do + old = @contact.email + @contact.email = 'legacy@support-not-correct' + @contact.valid? + @contact.errors[:email].should == ['Email is invalid'] + @contact.email = old + end end context 'as birthday' do From 4ef71d4da018acc88dbf92fd35d1e7cf9a36b264 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Thu, 6 Aug 2015 13:30:52 +0300 Subject: [PATCH 15/68] Do not put serverHold domains to zonefile #2023 --- lib/tasks/zonefile.rake | 4 ++ .../zonefile_setting_fabricator.rb | 6 +++ spec/models/zonefile_setting_spec.rb | 41 +++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/lib/tasks/zonefile.rake b/lib/tasks/zonefile.rake index 4aaeaf50e..d045d95dc 100644 --- a/lib/tasks/zonefile.rake +++ b/lib/tasks/zonefile.rake @@ -51,6 +51,7 @@ namespace :zonefile do 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}' && d.statuses) ORDER BY d.name ), chr(10) @@ -72,6 +73,7 @@ namespace :zonefile do AND ns.hostname LIKE '%.' || d.name AND d.name <> i_origin AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '' + AND NOT ('{serverHold}' && d.statuses) ), chr(10) ) INTO tmp_var; @@ -91,6 +93,7 @@ namespace :zonefile do AND ns.hostname LIKE '%.' || d.name AND d.name <> i_origin AND ns.ipv6 IS NOT NULL AND ns.ipv6 <> '' + AND NOT ('{serverHold}' && d.statuses) ), chr(10) ) INTO tmp_var; @@ -106,6 +109,7 @@ namespace :zonefile do 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}' && d.statuses) ), chr(10) ) INTO tmp_var; diff --git a/spec/fabricators/zonefile_setting_fabricator.rb b/spec/fabricators/zonefile_setting_fabricator.rb index b8b04513a..eae2663b3 100644 --- a/spec/fabricators/zonefile_setting_fabricator.rb +++ b/spec/fabricators/zonefile_setting_fabricator.rb @@ -6,5 +6,11 @@ Fabricator(:zonefile_setting) do minimum_ttl 3600 email 'hostmaster.eestiinternet.ee' master_nameserver 'ns.tld.ee' + ns_records "ee. IN NS ns.ut.ee.\nee. IN NS ns.tld.ee.\nee. IN NS sunic.sunet.se.\n" \ + "ee. IN NS ee.aso.ee.\nee. IN NS b.tld.ee.\nee. IN NS ns.eenet.ee.\nee. IN NS e.tld.ee." + a_records "ns.ut.ee. IN A 193.40.5.99\nns.tld.ee. IN A 195.43.87.10\nee.aso.ee. IN A 213.184.51.122\n" \ + "b.tld.ee. IN A 194.146.106.110\nns.eenet.ee. IN A 193.40.56.245\ne.tld.ee. IN A 204.61.216.36" + a4_records "ee.aso.ee. IN AAAA 2a02:88:0:21::2\nb.tld.ee. IN AAAA 2001:67c:1010:28::53\n" \ + "ns.eenet.ee. IN AAAA 2001:bb8::1\ne.tld.ee. IN AAAA 2001:678:94:53::53" after_build { |x| x.retry = 900 } end diff --git a/spec/models/zonefile_setting_spec.rb b/spec/models/zonefile_setting_spec.rb index 013015bbd..564403cdb 100644 --- a/spec/models/zonefile_setting_spec.rb +++ b/spec/models/zonefile_setting_spec.rb @@ -17,6 +17,14 @@ describe ZonefileSetting do )[0]['generate_zonefile'] @zonefile.should_not be_blank + + # origin ns + @zonefile.scan(/ee. IN NS ns.ut.ee.\nee. IN NS ns.tld.ee./).count.should == 1 + # origin a + @zonefile.scan(/ns.ut.ee. IN A 193.40.5.99\nns.tld.ee. IN A 195.43.87.10/).count.should == 1 + # origin aaaa + @zonefile.scan(/ee.aso.ee. IN AAAA 2a02:88:0:21::2\nb.tld.ee. IN AAAA 2001:67c:1010:28::53/).count.should == 1 + @zonefile.scan(/^#{d.name}/).count.should == 5 @zonefile.scan(/ns.#{d.name}/).count.should == 3 @zonefile.scan('123.123.123.123').count.should == 1 @@ -31,6 +39,39 @@ describe ZonefileSetting do @zonefile.scan(/^#{d.name}/).count.should == 0 end + it 'should not place serverHold domains into zonefile' do + Fabricate(:zonefile_setting) + d = Fabricate(:domain_with_dnskeys, name: 'testzone.ee', statuses: ['serverHold', 'serverDeleteProhibited']) + d.nameservers << Nameserver.new({ + hostname: "ns.#{d.name}", + ipv4: '123.123.123.123', + ipv6: 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329' + }) + + @zonefile = ActiveRecord::Base.connection.execute( + "select generate_zonefile('ee')" + )[0]['generate_zonefile'] + + @zonefile.should_not be_blank + @zonefile.scan(/^#{d.name}/).count.should == 0 + @zonefile.scan(/ns.#{d.name}/).count.should == 0 + @zonefile.scan('123.123.123.123').count.should == 0 + @zonefile.scan('FE80:0000:0000:0000:0202:B3FF:FE1E:8329').count.should == 0 + + d.statuses = ['ok'] + d.save + + @zonefile = ActiveRecord::Base.connection.execute( + "select generate_zonefile('ee')" + )[0]['generate_zonefile'] + + @zonefile.should_not be_blank + @zonefile.scan(/^#{d.name}/).count.should == 5 + @zonefile.scan(/ns.#{d.name}/).count.should == 3 + @zonefile.scan('123.123.123.123').count.should == 1 + @zonefile.scan('FE80:0000:0000:0000:0202:B3FF:FE1E:8329').count.should == 1 + end + it 'does not create duplicate zones' do Fabricate(:zonefile_setting) zs = Fabricate.build(:zonefile_setting) From 697c435743d71a01699f94c9eb6d593e89c8b9a5 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Thu, 6 Aug 2015 13:41:13 +0300 Subject: [PATCH 16/68] Do not put clientHold to zonefile #2023 --- lib/tasks/zonefile.rake | 8 ++++---- spec/models/zonefile_setting_spec.rb | 19 ++++++++++++++++--- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/lib/tasks/zonefile.rake b/lib/tasks/zonefile.rake index d045d95dc..510bb60c1 100644 --- a/lib/tasks/zonefile.rake +++ b/lib/tasks/zonefile.rake @@ -51,7 +51,7 @@ namespace :zonefile do 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}' && d.statuses) + AND NOT ('{serverHold,clientHold}' && d.statuses) ORDER BY d.name ), chr(10) @@ -73,7 +73,7 @@ namespace :zonefile do AND ns.hostname LIKE '%.' || d.name AND d.name <> i_origin AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '' - AND NOT ('{serverHold}' && d.statuses) + AND NOT ('{serverHold,clientHold}' && d.statuses) ), chr(10) ) INTO tmp_var; @@ -93,7 +93,7 @@ namespace :zonefile do AND ns.hostname LIKE '%.' || d.name AND d.name <> i_origin AND ns.ipv6 IS NOT NULL AND ns.ipv6 <> '' - AND NOT ('{serverHold}' && d.statuses) + AND NOT ('{serverHold,clientHold}' && d.statuses) ), chr(10) ) INTO tmp_var; @@ -109,7 +109,7 @@ namespace :zonefile do 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}' && d.statuses) + AND NOT ('{serverHold,clientHold}' && d.statuses) ), chr(10) ) INTO tmp_var; diff --git a/spec/models/zonefile_setting_spec.rb b/spec/models/zonefile_setting_spec.rb index 564403cdb..9386c3b1d 100644 --- a/spec/models/zonefile_setting_spec.rb +++ b/spec/models/zonefile_setting_spec.rb @@ -39,9 +39,9 @@ describe ZonefileSetting do @zonefile.scan(/^#{d.name}/).count.should == 0 end - it 'should not place serverHold domains into zonefile' do + it 'should not place serverHold nor clientHold domains into zonefile' do Fabricate(:zonefile_setting) - d = Fabricate(:domain_with_dnskeys, name: 'testzone.ee', statuses: ['serverHold', 'serverDeleteProhibited']) + d = Fabricate(:domain_with_dnskeys, name: 'testzone.ee', statuses: ['serverHold', 'serverDeleteProhibited', 'clientHold']) d.nameservers << Nameserver.new({ hostname: "ns.#{d.name}", ipv4: '123.123.123.123', @@ -58,7 +58,20 @@ describe ZonefileSetting do @zonefile.scan('123.123.123.123').count.should == 0 @zonefile.scan('FE80:0000:0000:0000:0202:B3FF:FE1E:8329').count.should == 0 - d.statuses = ['ok'] + d.statuses = ['clientHold', 'serverDeleteProhibited'] + d.save + + @zonefile = ActiveRecord::Base.connection.execute( + "select generate_zonefile('ee')" + )[0]['generate_zonefile'] + + @zonefile.should_not be_blank + @zonefile.scan(/^#{d.name}/).count.should == 0 + @zonefile.scan(/ns.#{d.name}/).count.should == 0 + @zonefile.scan('123.123.123.123').count.should == 0 + @zonefile.scan('FE80:0000:0000:0000:0202:B3FF:FE1E:8329').count.should == 0 + + d.statuses = ['serverDeleteProhibited'] d.save @zonefile = ActiveRecord::Base.connection.execute( From c486d3b7717985f19ed864b51c293f57762395da Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Thu, 6 Aug 2015 13:46:38 +0300 Subject: [PATCH 17/68] Update contact doc #2753 --- doc/epp/contact.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/epp/contact.md b/doc/epp/contact.md index b8a0be47d..26a88af24 100644 --- a/doc/epp/contact.md +++ b/doc/epp/contact.md @@ -13,8 +13,10 @@ Contact Mapping protocol short version: ----------------------- ------- ----------------- 1 1 Attribute: xmlns:contact="https://epp.tld.ee/schema/contact-eis-1.0.xsd" - 0-1 Contact id, optional, string, no spaces, max 100 characters, - generated automatically if missing + 0-1 Contact id, optional, + string: ASCII letters, numbers, ':', '-' characters, no spaces, + max 100 characters, + generated automatically if missing. 1 Postal information container 1 Full name of the contact 0 Org is not supported and must be blank or missing From 1d51d5fdab8ea9e5b1f2cabbbb64ef5b8808aab1 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Thu, 6 Aug 2015 13:56:39 +0300 Subject: [PATCH 18/68] Update structure #2023 --- db/structure.sql | 73 ++++++++++++------------------------------------ 1 file changed, 18 insertions(+), 55 deletions(-) diff --git a/db/structure.sql b/db/structure.sql index 567ad5ac4..dab6220b8 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -82,33 +82,28 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text 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 OR d.name = i_origin + WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter + AND NOT ('{serverHold}' && d.statuses) ORDER BY d.name ), chr(10) ) INTO tmp_var; - ret := concat(ret, '; Zone NS Records', chr(10), tmp_var, chr(10), chr(10)); + ret := concat(ret, tmp_var, chr(10), chr(10)); - -- a glue records for origin nameservers - SELECT array_to_string( - array( - SELECT concat(ns.hostname, '. IN A ', ns.ipv4) - FROM nameservers ns - JOIN domains d ON d.id = ns.domain_id - WHERE d.name = i_origin - AND ns.hostname LIKE '%.' || d.name - AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '' - ), chr(10) - ) INTO tmp_var; - - ret := concat(ret, '; Zone A Records', chr(10), tmp_var); + -- 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( @@ -120,43 +115,15 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text AND ns.hostname LIKE '%.' || d.name AND d.name <> i_origin AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '' - AND NOT EXISTS ( -- filter out glue records that already appeared in origin glue recrods - SELECT 1 FROM nameservers nsi - JOIN domains di ON nsi.domain_id = di.id - WHERE di.name = i_origin - AND nsi.hostname = ns.hostname - ) + AND NOT ('{serverHold}' && d.statuses) ), chr(10) ) INTO tmp_var; - -- TODO This is a possible subtitition to the previous query, stress testing is needed to see which is faster + ret := concat(ret, tmp_var, chr(10), chr(10)); - -- SELECT ns.* - -- FROM nameservers ns - -- JOIN domains d ON d.id = ns.domain_id - -- WHERE d.name LIKE '%ee' AND d.name NOT LIKE '%pri.ee' - -- AND ns.hostname LIKE '%.' || d.name - -- AND d.name <> 'ee' - -- AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '' - -- AND ns.hostname NOT IN ( - -- SELECT ns.hostname FROM domains d JOIN nameservers ns ON d.id = ns.domain_id WHERE d.name = 'ee' - -- ) - - ret := concat(ret, chr(10), tmp_var, chr(10), chr(10)); - - -- aaaa glue records for origin nameservers - SELECT array_to_string( - array( - SELECT concat(ns.hostname, '. IN AAAA ', ns.ipv6) - FROM nameservers ns - JOIN domains d ON d.id = ns.domain_id - WHERE d.name = i_origin - AND ns.hostname LIKE '%.' || d.name - AND ns.ipv6 IS NOT NULL AND ns.ipv6 <> '' - ), chr(10) - ) INTO tmp_var; - - ret := concat(ret, '; Zone AAAA Records', chr(10), tmp_var); + -- 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( @@ -168,16 +135,11 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text AND ns.hostname LIKE '%.' || d.name AND d.name <> i_origin AND ns.ipv6 IS NOT NULL AND ns.ipv6 <> '' - AND NOT EXISTS ( -- filter out glue records that already appeared in origin glue recrods - SELECT 1 FROM nameservers nsi - JOIN domains di ON nsi.domain_id = di.id - WHERE di.name = i_origin - AND nsi.hostname = ns.hostname - ) + AND NOT ('{serverHold}' && d.statuses) ), chr(10) ) INTO tmp_var; - ret := concat(ret, chr(10), tmp_var, chr(10), chr(10)); + ret := concat(ret, tmp_var, chr(10), chr(10)); -- ds records SELECT array_to_string( @@ -189,6 +151,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text 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}' && d.statuses) ), chr(10) ) INTO tmp_var; From 147948548f311ad8e997ea78f9615d3a33662b13 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Mon, 10 Aug 2015 11:27:20 +0300 Subject: [PATCH 19/68] Remove more statuses when applying forceDelete #2846 --- app/models/domain.rb | 4 ++++ spec/models/domain_spec.rb | 40 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/app/models/domain.rb b/app/models/domain.rb index 48f8c4960..621f3ac44 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -539,6 +539,10 @@ class Domain < ActiveRecord::Base statuses << DomainStatus::PENDING_DELETE statuses.delete(DomainStatus::CLIENT_DELETE_PROHIBITED) statuses.delete(DomainStatus::SERVER_DELETE_PROHIBITED) + statuses.delete(DomainStatus::PENDING_UPDATE) + statuses.delete(DomainStatus::PENDING_TRANSFER) + statuses.delete(DomainStatus::PENDING_RENEW) + statuses.delete(DomainStatus::PENDING_CREATE) self.force_delete_at = Time.zone.now + Setting.redemption_grace_period.days unless force_delete_at save(validate: false) diff --git a/spec/models/domain_spec.rb b/spec/models/domain_spec.rb index e99b2ef15..69b636d45 100644 --- a/spec/models/domain_spec.rb +++ b/spec/models/domain_spec.rb @@ -212,14 +212,50 @@ describe Domain do @domain.statuses = ['ok'] @domain.set_force_delete - @domain.statuses.count.should == 6 + @domain.statuses.should match_array([ + "forceDelete", + "pendingDelete", + "serverManualInzone", + "serverRenewProhibited", + "serverTransferProhibited", + "serverUpdateProhibited" + ]) + fda = Time.zone.now + Setting.redemption_grace_period.days @domain.force_delete_at.should be_within(20).of(fda) @domain.unset_force_delete - @domain.statuses.count.should == 1 + @domain.statuses.should == ['ok'] @domain.force_delete_at.should be_nil + + @domain.statuses = [ + DomainStatus::CLIENT_DELETE_PROHIBITED, + DomainStatus::SERVER_DELETE_PROHIBITED, + DomainStatus::PENDING_UPDATE, + DomainStatus::PENDING_TRANSFER, + DomainStatus::PENDING_RENEW, + DomainStatus::PENDING_CREATE, + DomainStatus::CLIENT_HOLD + ] + + @domain.save + + @domain.set_force_delete + + @domain.statuses.should match_array([ + "forceDelete", + "pendingDelete", + "serverManualInzone", + "serverRenewProhibited", + "serverTransferProhibited", + "serverUpdateProhibited", + "clientHold" + ]) + + @domain.unset_force_delete + + @domain.statuses.should == ['clientHold'] end it 'should set expired status and update outzone_at and delete_at' do From b0d4aff32e753bd429903e3cb18cea4820616671 Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Mon, 10 Aug 2015 12:20:30 +0300 Subject: [PATCH 20/68] Added dedicated force delete method #2623 --- app/models/domain.rb | 6 ++++++ app/models/epp/domain.rb | 1 + 2 files changed, 7 insertions(+) diff --git a/app/models/domain.rb b/app/models/domain.rb index 621f3ac44..603cd3755 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -577,10 +577,16 @@ class Domain < ActiveRecord::Base statuses.include?(DomainStatus::PENDING_UPDATE) end + # public api def update_prohibited? pending_update_prohibited? && pending_delete_prohibited? end + # public api + def delete_prohibited? + statuses.include?(DomainStatus::FORCE_DELETE) + end + # TODO: Review the list and disallow epp calls def pending_update_prohibited? (statuses & [ diff --git a/app/models/epp/domain.rb b/app/models/epp/domain.rb index ae571fa4f..13c0db84d 100644 --- a/app/models/epp/domain.rb +++ b/app/models/epp/domain.rb @@ -5,6 +5,7 @@ class Epp::Domain < Domain before_validation :manage_permissions def manage_permissions return unless update_prohibited? + return unless delete_prohibited? add_epp_error('2304', nil, nil, I18n.t(:object_status_prohibits_operation)) false end From 9067d0048cd837ca17824bd67bb4b0a60c8a7565 Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Mon, 10 Aug 2015 12:32:59 +0300 Subject: [PATCH 21/68] No pending update when force update #2623 --- app/models/domain.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/domain.rb b/app/models/domain.rb index 603cd3755..edc129ee8 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -574,7 +574,7 @@ class Domain < ActiveRecord::Base end def pending_update? - statuses.include?(DomainStatus::PENDING_UPDATE) + statuses.include?(DomainStatus::PENDING_UPDATE) && !statuses.include?(DomainStatus::FORCE_UPDATE) end # public api @@ -609,7 +609,7 @@ class Domain < ActiveRecord::Base end def pending_delete? - statuses.include?(DomainStatus::PENDING_DELETE) + statuses.include?(DomainStatus::PENDING_DELETE) && !statuses.include?(DomainStatus::FORCE_DELETE) end # TODO: Review the list and disallow epp calls From ff5391cb605afddd150e9ccdc72adcc95f1567c3 Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Mon, 10 Aug 2015 12:37:02 +0300 Subject: [PATCH 22/68] Data-migrate now uses internetee fork #2841 --- Gemfile | 4 ++-- Gemfile.lock | 67 +++++++++++++++++++++++++--------------------------- 2 files changed, 34 insertions(+), 37 deletions(-) diff --git a/Gemfile b/Gemfile index 4866b0396..1497b5bd6 100644 --- a/Gemfile +++ b/Gemfile @@ -66,8 +66,8 @@ gem 'money-rails', '~> 1.4.1' # deploy gem 'whenever', '~> 0.9.4', require: false -gem 'data_migrate', - github: 'gitlabeu/data_migrate', +gem 'data_migrate', + github: 'internetee/data-migrate', ref: '35d22b09ff37a4e9d61ab326ad5d8eb0edf1fc81' # monitors diff --git a/Gemfile.lock b/Gemfile.lock index 57e700c12..e69fa7f99 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -9,7 +9,7 @@ GIT request_store (~> 1.1.0) GIT - remote: https://github.com/gitlabeu/data_migrate.git + remote: https://github.com/internetee/data-migrate.git revision: 35d22b09ff37a4e9d61ab326ad5d8eb0edf1fc81 ref: 35d22b09ff37a4e9d61ab326ad5d8eb0edf1fc81 specs: @@ -81,15 +81,15 @@ GEM akami (1.3.1) gyoku (>= 0.4.0) nokogiri - arel (6.0.0) - ast (2.0.0) - astrolabe (1.3.0) - parser (>= 2.2.0.pre.3, < 3.0) - autodoc (0.5.0) + arel (6.0.3) + ast (2.1.0) + astrolabe (1.3.1) + parser (~> 2.2) + autodoc (0.5.1) actionpack activesupport (>= 3.0.0) rspec - autoprefixer-rails (5.2.1) + autoprefixer-rails (5.2.1.1) execjs json axiom-types (0.1.1) @@ -129,8 +129,6 @@ GEM rack (>= 1.0.0) rack-test (>= 0.5.4) xpath (~> 2.0) - celluloid (0.16.0) - timers (~> 4.0.0) chronic (0.10.2) cliver (0.3.2) coderay (1.1.0) @@ -146,7 +144,7 @@ GEM concord (0.1.5) adamantium (~> 0.2.0) equalizer (~> 0.0.9) - countries (0.11.4) + countries (0.11.5) currencies (~> 0.4.2) i18n_data (~> 0.7.0) crack (0.4.2) @@ -187,7 +185,7 @@ GEM faker (1.4.3) i18n (~> 0.5) fastercsv (1.5.5) - ffi (1.9.9) + ffi (1.9.10) figaro (1.1.1) thor (~> 0.14) flay (2.4.0) @@ -197,7 +195,7 @@ GEM ruby_parser (~> 3.1, > 3.1.0) sexp_processor (~> 4.4) formatador (0.2.5) - globalid (0.3.5) + globalid (0.3.6) activesupport (>= 4.1.0) grape (0.12.0) activesupport @@ -209,7 +207,7 @@ GEM rack-accept rack-mount virtus (>= 1.0.0) - guard (2.12.7) + guard (2.12.9) formatador (>= 0.2.4) listen (>= 2.7, <= 4.0) lumberjack (~> 1.0) @@ -243,14 +241,13 @@ GEM hashie-forbidden_attributes (0.1.1) hashie (>= 3.0) highline (1.6.21) - hitimes (1.2.2) hpricot (0.8.6) html2haml (2.0.0) erubis (~> 2.7.0) haml (~> 4.0.0) nokogiri (~> 1.6.0) ruby_parser (~> 3.5) - html5_validators (1.2.1) + html5_validators (1.2.2) httpclient (2.6.0.1) httpi (2.4.1) rack @@ -278,10 +275,9 @@ GEM kgio (2.9.3) launchy (2.4.3) addressable (~> 2.3) - libv8 (3.16.14.8) + libv8 (3.16.14.11) libxml-ruby (2.8.0) - listen (2.10.1) - celluloid (~> 0.16.0) + listen (3.0.3) rb-fsevent (>= 0.9.3) rb-inotify (>= 0.9) loofah (2.0.2) @@ -293,11 +289,11 @@ GEM thread_safe (~> 0.3, >= 0.3.1) method_source (0.8.2) mime-types (2.6.1) - mina (0.3.4) + mina (0.3.7) open4 (~> 1.3.4) rake mini_portile (0.6.2) - minitest (5.7.0) + minitest (5.8.0) monetize (1.1.0) money (~> 6.5.0) money (6.5.1) @@ -307,20 +303,20 @@ GEM monetize (~> 1.1.0) money (~> 6.5.0) railties (>= 3.0) - multi_json (1.11.1) + multi_json (1.11.2) multi_xml (0.5.5) nenv (0.2.0) newrelic_rpm (3.12.0.288) nokogiri (1.6.6.2) mini_portile (~> 0.6.0) nori (2.6.0) - notiffany (0.0.6) + notiffany (0.0.7) nenv (~> 0.1) shellany (~> 0.0) nprogress-rails (0.1.6.7) open4 (1.3.4) orm_adapter (0.5.0) - parser (2.2.2.5) + parser (2.2.2.6) ast (>= 1.1, < 3.0) pdfkit (0.6.2) pg (0.18.2) @@ -354,7 +350,7 @@ GEM rack rack-test (0.6.3) rack (>= 1.0) - railroady (1.3.0) + railroady (1.3.1) rails (4.2.3) actionmailer (= 4.2.3) actionpack (= 4.2.3) @@ -382,7 +378,7 @@ GEM rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) rainbow (2.0.0) - raindrops (0.14.0) + raindrops (0.15.0) rake (10.4.2) ransack (1.5.1) actionpack (>= 3.0) @@ -398,7 +394,7 @@ GEM parser (~> 2.2.0.pre.7) rainbow (>= 1.99, < 3.0) unparser (~> 0.2.2) - ref (1.0.5) + ref (2.0.0) request_store (1.1.0) responders (2.1.0) railties (>= 4.2.0, < 5) @@ -406,15 +402,15 @@ GEM rspec-core (~> 3.3.0) rspec-expectations (~> 3.3.0) rspec-mocks (~> 3.3.0) - rspec-core (3.3.1) + rspec-core (3.3.2) rspec-support (~> 3.3.0) - rspec-expectations (3.3.0) + rspec-expectations (3.3.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.3.0) - rspec-mocks (3.3.1) + rspec-mocks (3.3.2) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.3.0) - rspec-rails (3.3.2) + rspec-rails (3.3.3) actionpack (>= 3.0, < 4.3) activesupport (>= 3.0, < 4.3) railties (>= 3.0, < 4.3) @@ -433,7 +429,7 @@ GEM ruby2ruby (2.1.4) ruby_parser (~> 3.1) sexp_processor (~> 4.0) - ruby_parser (3.7.0) + ruby_parser (3.7.1) sexp_processor (~> 4.1) rubycritic (1.4.0) flay (= 2.4.0) @@ -442,7 +438,7 @@ GEM reek (= 1.6.5) virtus (~> 1.0) safe_yaml (1.0.4) - sass (3.4.15) + sass (3.4.16) sass-rails (5.0.3) railties (>= 4.0.0, < 5.0) sass (~> 3.1) @@ -496,8 +492,6 @@ GEM thor (0.19.1) thread_safe (0.3.5) tilt (1.4.1) - timers (4.0.1) - hitimes traceroute (0.5.0) rails (>= 3.0.0) turbolinks (2.5.3) @@ -533,7 +527,7 @@ GEM wasabi (3.5.0) httpi (~> 2.0) nokogiri (>= 1.4.2) - websocket-driver (0.5.4) + websocket-driver (0.6.2) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.2) whenever (0.9.4) @@ -626,3 +620,6 @@ DEPENDENCIES uuidtools (~> 2.1.4) validates_email_format_of (~> 1.6.3) whenever (~> 0.9.4) + +BUNDLED WITH + 1.10.6 From 6a758a9d91836d38071e6368ad052fc5a3bc03cf Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Mon, 10 Aug 2015 13:07:09 +0300 Subject: [PATCH 23/68] Fix permission check #2623 --- app/models/domain.rb | 2 +- app/models/epp/domain.rb | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/models/domain.rb b/app/models/domain.rb index edc129ee8..80cf7bc32 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -574,7 +574,7 @@ class Domain < ActiveRecord::Base end def pending_update? - statuses.include?(DomainStatus::PENDING_UPDATE) && !statuses.include?(DomainStatus::FORCE_UPDATE) + statuses.include?(DomainStatus::PENDING_UPDATE) && !statuses.include?(DomainStatus::FORCE_DELETE) end # public api diff --git a/app/models/epp/domain.rb b/app/models/epp/domain.rb index 13c0db84d..7ad6aadc0 100644 --- a/app/models/epp/domain.rb +++ b/app/models/epp/domain.rb @@ -4,8 +4,7 @@ class Epp::Domain < Domain before_validation :manage_permissions def manage_permissions - return unless update_prohibited? - return unless delete_prohibited? + return unless update_prohibited? || delete_prohibited? add_epp_error('2304', nil, nil, I18n.t(:object_status_prohibits_operation)) false end @@ -461,7 +460,7 @@ class Epp::Domain < Domain def epp_destroy(frame, user_id, verify = true) return false unless valid? - if verify && + if verify && Setting.request_confirmation_on_domain_deletion_enabled && frame.css('delete').attr('verified').to_s.downcase != 'yes' From 2c0de95363da43caddcf2fe34dab1b22295bec2d Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Mon, 10 Aug 2015 13:53:52 +0300 Subject: [PATCH 24/68] Prohibit updating domain when in force delete status #2845 --- Gemfile.lock | 3 --- app/models/domain.rb | 7 +++++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index e69fa7f99..fcbd6652c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -620,6 +620,3 @@ DEPENDENCIES uuidtools (~> 2.1.4) validates_email_format_of (~> 1.6.3) whenever (~> 0.9.4) - -BUNDLED WITH - 1.10.6 diff --git a/app/models/domain.rb b/app/models/domain.rb index 80cf7bc32..c6a0e7d1f 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -105,6 +105,13 @@ class Domain < ActiveRecord::Base errors.add(:base, :invalid_auth_information_reserved) end + validate :check_permissions + def check_permissions + return unless update_prohibited? || delete_prohibited? + errors.add(:base, I18n.t(:object_status_prohibits_operation)) + false + end + validates :nameservers, object_count: { min: -> { Setting.ns_min_count }, max: -> { Setting.ns_max_count } From c637d3f8564cd901258d752c99dd4658fbe1ace7 Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Mon, 10 Aug 2015 13:20:04 +0300 Subject: [PATCH 25/68] require email format gem when testing --- config/application.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/application.rb b/config/application.rb index 3fe81b40c..7734cc6e9 100644 --- a/config/application.rb +++ b/config/application.rb @@ -74,3 +74,5 @@ module Registry } end end + +require 'validates_email_format_of' From 86900fb839fc84b8d2dda887b152ab119dad3706 Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Mon, 10 Aug 2015 14:00:39 +0300 Subject: [PATCH 26/68] Added poll messages #2557 --- app/jobs/domain_delete_confirm_job.rb | 2 ++ app/jobs/domain_update_confirm_job.rb | 2 ++ app/models/domain.rb | 8 ++++++++ config/locales/en.yml | 5 +++++ spec/models/domain_spec.rb | 6 ++++++ 5 files changed, 23 insertions(+) diff --git a/app/jobs/domain_delete_confirm_job.rb b/app/jobs/domain_delete_confirm_job.rb index 153ef7012..9b30a6cbd 100644 --- a/app/jobs/domain_delete_confirm_job.rb +++ b/app/jobs/domain_delete_confirm_job.rb @@ -5,10 +5,12 @@ class DomainDeleteConfirmJob < Que::Job domain = Epp::Domain.find(domain_id) case action when RegistrantVerification::CONFIRMED + domain.poll_message!(:poll_pending_delete_confirmed_by_registrant) domain.apply_pending_delete! domain.clean_pendings! when RegistrantVerification::REJECTED DomainMailer.pending_delete_rejected_notification(domain).deliver_now + domain.poll_message!(:poll_pending_delete_rejected_by_registrant) domain.clean_pendings! end destroy # it's best to destroy the job in the same transaction diff --git a/app/jobs/domain_update_confirm_job.rb b/app/jobs/domain_update_confirm_job.rb index ab57e0a45..c668307a6 100644 --- a/app/jobs/domain_update_confirm_job.rb +++ b/app/jobs/domain_update_confirm_job.rb @@ -5,10 +5,12 @@ class DomainUpdateConfirmJob < Que::Job domain = Epp::Domain.find(domain_id) case action when RegistrantVerification::CONFIRMED + domain.poll_message!(:poll_pending_update_confirmed_by_registrant) domain.apply_pending_update! domain.clean_pendings! when RegistrantVerification::REJECTED DomainMailer.pending_update_rejected_notification_for_new_registrant(domain).deliver_now + domain.poll_message!(:poll_pending_update_rejected_by_registrant) domain.clean_pendings! end destroy # it's best to destroy the job in the same transaction diff --git a/app/models/domain.rb b/app/models/domain.rb index c6a0e7d1f..76a1f89fa 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -348,6 +348,14 @@ class Domain < ActiveRecord::Base true end + def poll_message!(message_key) + registrar.messages.create!( + body: I18n.t(message_key), + attached_obj_id: id, + attached_obj_type: self.class.to_s + ) + end + def preclean_pendings self.registrant_verification_token = nil self.registrant_verification_asked_at = nil diff --git a/config/locales/en.yml b/config/locales/en.yml index 1e72a76b2..5d11e4433 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -899,3 +899,8 @@ en: 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_registranti: 'Registrant rejected domain update' + poll_pending_delete_rejected_by_registrant: 'Registrant rejected domain deletion' + poll_pending_delete_confirmed_by_registrant: 'Registrant confirmed domain deletion.' + diff --git a/spec/models/domain_spec.rb b/spec/models/domain_spec.rb index 69b636d45..18e5f8f60 100644 --- a/spec/models/domain_spec.rb +++ b/spec/models/domain_spec.rb @@ -418,6 +418,12 @@ describe Domain do @domain.statuses = DomainStatus::OK # restore end + it 'should add poll message to registrar' do + domain = Fabricate(:domain) + domain.poll_message!(:poll_pending_update_confirmed_by_registrant) + domain.registrar.messages.first.body.should == 'Registrant confirmed domain update' + end + context 'about registrant update confirm' do before :all do @domain.registrant_verification_token = 123 From 99dc2b1483d34d1c5062748465f532ed83f2b643 Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Mon, 10 Aug 2015 14:31:17 +0300 Subject: [PATCH 27/68] Updated pending poll message #2557 --- app/jobs/domain_delete_confirm_job.rb | 2 +- app/jobs/domain_update_confirm_job.rb | 2 +- app/models/domain.rb | 2 +- spec/models/domain_spec.rb | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/jobs/domain_delete_confirm_job.rb b/app/jobs/domain_delete_confirm_job.rb index 9b30a6cbd..5d1e27bb6 100644 --- a/app/jobs/domain_delete_confirm_job.rb +++ b/app/jobs/domain_delete_confirm_job.rb @@ -2,7 +2,7 @@ class DomainDeleteConfirmJob < Que::Job def run(domain_id, action) # it's recommended to keep transaction against job table as short as possible. ActiveRecord::Base.transaction do - domain = Epp::Domain.find(domain_id) + domain = Epp::Domain.find(domain_id).include(:registrar) case action when RegistrantVerification::CONFIRMED domain.poll_message!(:poll_pending_delete_confirmed_by_registrant) diff --git a/app/jobs/domain_update_confirm_job.rb b/app/jobs/domain_update_confirm_job.rb index c668307a6..975ad885c 100644 --- a/app/jobs/domain_update_confirm_job.rb +++ b/app/jobs/domain_update_confirm_job.rb @@ -2,7 +2,7 @@ class DomainUpdateConfirmJob < Que::Job def run(domain_id, action) # it's recommended to keep transaction against job table as short as possible. ActiveRecord::Base.transaction do - domain = Epp::Domain.find(domain_id) + domain = Epp::Domain.find(domain_id).include(:registrar) case action when RegistrantVerification::CONFIRMED domain.poll_message!(:poll_pending_update_confirmed_by_registrant) diff --git a/app/models/domain.rb b/app/models/domain.rb index 76a1f89fa..45924e5b7 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -350,7 +350,7 @@ class Domain < ActiveRecord::Base def poll_message!(message_key) registrar.messages.create!( - body: I18n.t(message_key), + body: "#{I18n.t(message_key)}: #{name}", attached_obj_id: id, attached_obj_type: self.class.to_s ) diff --git a/spec/models/domain_spec.rb b/spec/models/domain_spec.rb index 18e5f8f60..0befd7e09 100644 --- a/spec/models/domain_spec.rb +++ b/spec/models/domain_spec.rb @@ -419,9 +419,9 @@ describe Domain do end it 'should add poll message to registrar' do - domain = Fabricate(:domain) + domain = Fabricate(:domain, name: 'testpollmessage123.ee') domain.poll_message!(:poll_pending_update_confirmed_by_registrant) - domain.registrar.messages.first.body.should == 'Registrant confirmed domain update' + domain.registrar.messages.first.body.should == 'Registrant confirmed domain update: testpollmessage123.ee' end context 'about registrant update confirm' do From ce63f40b4c166ffe9c3e89372497120fc799211e Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Mon, 10 Aug 2015 14:49:35 +0300 Subject: [PATCH 28/68] Removed job includes --- app/jobs/domain_delete_confirm_job.rb | 2 +- app/jobs/domain_update_confirm_job.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/jobs/domain_delete_confirm_job.rb b/app/jobs/domain_delete_confirm_job.rb index 5d1e27bb6..9b30a6cbd 100644 --- a/app/jobs/domain_delete_confirm_job.rb +++ b/app/jobs/domain_delete_confirm_job.rb @@ -2,7 +2,7 @@ class DomainDeleteConfirmJob < Que::Job def run(domain_id, action) # it's recommended to keep transaction against job table as short as possible. ActiveRecord::Base.transaction do - domain = Epp::Domain.find(domain_id).include(:registrar) + domain = Epp::Domain.find(domain_id) case action when RegistrantVerification::CONFIRMED domain.poll_message!(:poll_pending_delete_confirmed_by_registrant) diff --git a/app/jobs/domain_update_confirm_job.rb b/app/jobs/domain_update_confirm_job.rb index 975ad885c..c668307a6 100644 --- a/app/jobs/domain_update_confirm_job.rb +++ b/app/jobs/domain_update_confirm_job.rb @@ -2,7 +2,7 @@ class DomainUpdateConfirmJob < Que::Job def run(domain_id, action) # it's recommended to keep transaction against job table as short as possible. ActiveRecord::Base.transaction do - domain = Epp::Domain.find(domain_id).include(:registrar) + domain = Epp::Domain.find(domain_id) case action when RegistrantVerification::CONFIRMED domain.poll_message!(:poll_pending_update_confirmed_by_registrant) From c8ab2f06ca9c14484aa72742f88f4fbfe9e299e1 Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Mon, 10 Aug 2015 14:52:39 +0300 Subject: [PATCH 29/68] Update translation #2557 --- config/locales/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 5d11e4433..41def004e 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -902,5 +902,5 @@ en: poll_pending_update_confirmed_by_registrant: 'Registrant confirmed domain update' poll_pending_update_rejected_by_registranti: 'Registrant rejected domain update' poll_pending_delete_rejected_by_registrant: 'Registrant rejected domain deletion' - poll_pending_delete_confirmed_by_registrant: 'Registrant confirmed domain deletion.' + poll_pending_delete_confirmed_by_registrant: 'Registrant confirmed domain deletion' From 9157f861d8bc909bd29bfe4c522ad574b7aca279 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Mon, 10 Aug 2015 17:18:45 +0300 Subject: [PATCH 30/68] Save and restore statuses when setting and unsetting force delete #2845 --- app/models/domain.rb | 32 ++++++++++++------- ...0114746_add_statuses_backup_for_domains.rb | 5 +++ db/schema-read-only.rb | 3 +- db/structure.sql | 5 ++- 4 files changed, 32 insertions(+), 13 deletions(-) create mode 100644 db/migrate/20150810114746_add_statuses_backup_for_domains.rb diff --git a/app/models/domain.rb b/app/models/domain.rb index c6a0e7d1f..64c3b0b46 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -538,12 +538,7 @@ class Domain < ActiveRecord::Base end def set_force_delete - statuses << DomainStatus::FORCE_DELETE - statuses << DomainStatus::SERVER_RENEW_PROHIBITED - statuses << DomainStatus::SERVER_TRANSFER_PROHIBITED - statuses << DomainStatus::SERVER_UPDATE_PROHIBITED - statuses << DomainStatus::SERVER_MANUAL_INZONE - statuses << DomainStatus::PENDING_DELETE + self.statuses_backup = statuses statuses.delete(DomainStatus::CLIENT_DELETE_PROHIBITED) statuses.delete(DomainStatus::SERVER_DELETE_PROHIBITED) statuses.delete(DomainStatus::PENDING_UPDATE) @@ -551,11 +546,6 @@ class Domain < ActiveRecord::Base statuses.delete(DomainStatus::PENDING_RENEW) statuses.delete(DomainStatus::PENDING_CREATE) - self.force_delete_at = Time.zone.now + Setting.redemption_grace_period.days unless force_delete_at - save(validate: false) - end - - def unset_force_delete statuses.delete(DomainStatus::FORCE_DELETE) statuses.delete(DomainStatus::SERVER_RENEW_PROHIBITED) statuses.delete(DomainStatus::SERVER_TRANSFER_PROHIBITED) @@ -563,7 +553,27 @@ class Domain < ActiveRecord::Base statuses.delete(DomainStatus::SERVER_MANUAL_INZONE) statuses.delete(DomainStatus::PENDING_DELETE) + statuses << DomainStatus::FORCE_DELETE + statuses << DomainStatus::SERVER_RENEW_PROHIBITED + statuses << DomainStatus::SERVER_TRANSFER_PROHIBITED + statuses << DomainStatus::SERVER_UPDATE_PROHIBITED + statuses << DomainStatus::SERVER_MANUAL_INZONE + statuses << DomainStatus::PENDING_DELETE + + self.force_delete_at = Time.zone.now + Setting.redemption_grace_period.days unless force_delete_at + save(validate: false) + end + + def unset_force_delete + s = [] + s << DomainStatus::EXPIRED if statuses.include?(DomainStatus::EXPIRED) + s << DomainStatus::SERVER_HOLD if statuses.include?(DomainStatus::SERVER_HOLD) + s << DomainStatus::DELETE_CANDIDATE if statuses.include?(DomainStatus::DELETE_CANDIDATE) + + self.statuses = (statuses_backup + s).uniq + self.force_delete_at = nil + self.statuses_backup = [] save(validate: false) end diff --git a/db/migrate/20150810114746_add_statuses_backup_for_domains.rb b/db/migrate/20150810114746_add_statuses_backup_for_domains.rb new file mode 100644 index 000000000..85ae9aab7 --- /dev/null +++ b/db/migrate/20150810114746_add_statuses_backup_for_domains.rb @@ -0,0 +1,5 @@ +class AddStatusesBackupForDomains < ActiveRecord::Migration + def change + add_column :domains, :statuses_backup, :string, array: true, default: [] + end +end diff --git a/db/schema-read-only.rb b/db/schema-read-only.rb index 46df6aac0..5eee65c59 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: 20150803080914) do +ActiveRecord::Schema.define(version: 20150810114746) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -329,6 +329,7 @@ ActiveRecord::Schema.define(version: 20150803080914) do t.string "statuses", array: true t.boolean "reserved", default: false t.hstore "status_notes" + t.string "statuses_backup", default: [], array: true end add_index "domains", ["delete_at"], name: "index_domains_on_delete_at", using: :btree diff --git a/db/structure.sql b/db/structure.sql index dab6220b8..f4627c3d2 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -910,7 +910,8 @@ CREATE TABLE domains ( force_delete_at timestamp without time zone, statuses character varying[], reserved boolean DEFAULT false, - status_notes hstore + status_notes hstore, + statuses_backup character varying[] DEFAULT '{}'::character varying[] ); @@ -4871,3 +4872,5 @@ INSERT INTO schema_migrations (version) VALUES ('20150722071128'); INSERT INTO schema_migrations (version) VALUES ('20150803080914'); +INSERT INTO schema_migrations (version) VALUES ('20150810114746'); + From 65d67e16a3ddf9ead79a805dbe37bb69425ea9f6 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Mon, 10 Aug 2015 17:36:14 +0300 Subject: [PATCH 31/68] Fix tests #2845 --- db/structure.sql | 8 ++++---- spec/models/domain_spec.rb | 25 +++++++++++++++++++++---- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/db/structure.sql b/db/structure.sql index f4627c3d2..62d98a861 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -93,7 +93,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text 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}' && d.statuses) + AND NOT ('{serverHold,clientHold}' && d.statuses) ORDER BY d.name ), chr(10) @@ -115,7 +115,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text AND ns.hostname LIKE '%.' || d.name AND d.name <> i_origin AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '' - AND NOT ('{serverHold}' && d.statuses) + AND NOT ('{serverHold,clientHold}' && d.statuses) ), chr(10) ) INTO tmp_var; @@ -135,7 +135,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text AND ns.hostname LIKE '%.' || d.name AND d.name <> i_origin AND ns.ipv6 IS NOT NULL AND ns.ipv6 <> '' - AND NOT ('{serverHold}' && d.statuses) + AND NOT ('{serverHold,clientHold}' && d.statuses) ), chr(10) ) INTO tmp_var; @@ -151,7 +151,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text 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}' && d.statuses) + AND NOT ('{serverHold,clientHold}' && d.statuses) ), chr(10) ) INTO tmp_var; diff --git a/spec/models/domain_spec.rb b/spec/models/domain_spec.rb index 0befd7e09..1b9f7568f 100644 --- a/spec/models/domain_spec.rb +++ b/spec/models/domain_spec.rb @@ -236,7 +236,10 @@ describe Domain do DomainStatus::PENDING_TRANSFER, DomainStatus::PENDING_RENEW, DomainStatus::PENDING_CREATE, - DomainStatus::CLIENT_HOLD + DomainStatus::CLIENT_HOLD, + DomainStatus::EXPIRED, + DomainStatus::SERVER_HOLD, + DomainStatus::DELETE_CANDIDATE, ] @domain.save @@ -244,18 +247,32 @@ describe Domain do @domain.set_force_delete @domain.statuses.should match_array([ + "clientHold", + "deleteCandidate", + "expired", "forceDelete", "pendingDelete", + "serverHold", "serverManualInzone", "serverRenewProhibited", "serverTransferProhibited", - "serverUpdateProhibited", - "clientHold" + "serverUpdateProhibited" ]) @domain.unset_force_delete - @domain.statuses.should == ['clientHold'] + @domain.statuses.should match_array([ + "clientDeleteProhibited", + "clientHold", + "deleteCandidate", + "expired", + "pendingCreate", + "pendingRenew", + "pendingTransfer", + "pendingUpdate", + "serverDeleteProhibited", + "serverHold" + ]) end it 'should set expired status and update outzone_at and delete_at' do From ac977d2b8c477b6f602a8ad4faf8ebfe7a706f06 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Mon, 10 Aug 2015 18:28:00 +0300 Subject: [PATCH 32/68] Check if domain is transferrable before transfer #2845 --- app/models/epp/domain.rb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/app/models/epp/domain.rb b/app/models/epp/domain.rb index 7ad6aadc0..9a366a367 100644 --- a/app/models/epp/domain.rb +++ b/app/models/epp/domain.rb @@ -579,6 +579,13 @@ class Epp::Domain < Domain # rubocop: disable Metrics/MethodLength # rubocop: disable Metrics/AbcSize def query_transfer(frame, current_user) + unless transferrable? + throw :epp_error, { + code: '2304', + msg: I18n.t(:object_status_prohibits_operation) + } + end + unless can_be_transferred_to?(current_user.registrar) throw :epp_error, { code: '2002', @@ -741,6 +748,17 @@ class Epp::Domain < Domain new_registrar != registrar end + def transferrable? + (statuses & [ + DomainStatus::PENDING_CREATE, + DomainStatus::PENDING_UPDATE, + DomainStatus::PENDING_DELETE, + DomainStatus::PENDING_RENEW, + DomainStatus::PENDING_TRANSFER, + DomainStatus::FORCE_DELETE + ]).empty? + end + ## SHARED # For domain transfer From c5ba1b0dd3e38d86202b326654aab866d418226b Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Mon, 10 Aug 2015 19:17:49 +0300 Subject: [PATCH 33/68] Fix status check in model #2845 --- app/models/concerns/statuses.rb | 7 +++++++ app/models/domain.rb | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 app/models/concerns/statuses.rb diff --git a/app/models/concerns/statuses.rb b/app/models/concerns/statuses.rb new file mode 100644 index 000000000..454f43d94 --- /dev/null +++ b/app/models/concerns/statuses.rb @@ -0,0 +1,7 @@ +module Statuses + extend ActiveSupport::Concern + + def force_delete? + statuses.include?(DomainStatus::FORCE_DELETE) + end +end diff --git a/app/models/domain.rb b/app/models/domain.rb index 3d9f1d49b..dcdcbc120 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -1,6 +1,7 @@ # rubocop: disable Metrics/ClassLength class Domain < ActiveRecord::Base include Versions # version/domain_version.rb + include Statuses has_paper_trail class_name: "DomainVersion", meta: { children: :children_log } # TODO: whois requests ip whitelist for full info for own domains and partial info for other domains @@ -107,7 +108,7 @@ class Domain < ActiveRecord::Base validate :check_permissions def check_permissions - return unless update_prohibited? || delete_prohibited? + return unless force_delete? errors.add(:base, I18n.t(:object_status_prohibits_operation)) false end From fc1aa47411ef88f48872e63f3ef3d809a13cd7b1 Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Mon, 10 Aug 2015 21:48:17 +0300 Subject: [PATCH 34/68] Updated example files for easier setup/testing #2557 --- config/application-example.yml | 108 +++++++++++++++++++++++---------- 1 file changed, 76 insertions(+), 32 deletions(-) diff --git a/config/application-example.yml b/config/application-example.yml index 5cba1c9b2..a3a4d2cc0 100644 --- a/config/application-example.yml +++ b/config/application-example.yml @@ -1,30 +1,47 @@ +# +# Registry servers configuration +# +# # Be sure to restart your server when you modify settings. +# +# +# SMTP configuration (for Admin/EPP/Registrar/Registrant servers) +# +smtp_address: 'server-hostname' +smtp_port: '25' # 587, 465 +smtp_user_name: 'login' +smtp_password: 'pw/key' +# If you need to specify a HELO domain, you can do it here. +smtp_domain: '' # 'domain for HELO checking' +# Use "none" only when for a self-signed and/or wildcard certificate +smtp_openssl_verify_mode: 'peer' # 'none', 'peer', 'client_once','fail_if_no_peer_cert' +# Detects if STARTTLS is enabled in your SMTP server and starts to use it. Defaults to true. +# Set this to false if there is a problem with your server certificate that you cannot resolve. +smtp_enable_starttls_auto: 'true' # 'false' +# If your mail server requires authentication, please change. +smtp_authentication: 'plain' # 'plain', 'login', 'cram_md5' +registrant_url: 'https:/registrant.example.com' # for valid email body registrant links + +# +# ADMIN server +# app_name: '.EE Registry' zonefile_export_dir: 'export/zonefiles' bank_statement_import_dir: 'import/bank_statements' legal_documents_dir: 'import/legal_documents' time_zone: 'Tallinn' # more zones by rake time:zones:all -# New Relic app name, keep only current mode, remove other names. -# Example: 'Admin, EPP, REPP' will have name 'Admin, EPP, REPP - production' at New Relic. -new_relic_app_name: 'Admin, EPP, REPP, Registrar, Registrant' -new_relic_license_key: '42d1c2ba4ed17a9cf6297c59d80e563a3dd3c4fa' - -# You can use `rake secret` to generate a secure secret key. -# Your secret key is used for verifying the integrity of signed cookies. -# If you change this key, all old signed cookies will become invalid! -secret_key_base: 'please-change-it-you-can-generate-it-with-rake-secret' -devise_secret: 'please-change-it-you-can-generate-it-with-rake-secret' - -# Admin server configuration: openssl_config_path: '/etc/ssl/openssl.cnf' crl_dir: '/home/registry/registry/shared/ca/crl' ca_cert_path: '/home/registry/registry/shared/ca/certs/ca.crt.pem' ca_key_path: '/home/registry/registry/shared/ca/private/ca.key.pem' ca_key_password: 'your-root-key-password' -# EPP server configuration + +# +# EPP +# webclient_ips: '127.0.0.1,0.0.0.0' #ips, separated with commas webclient_cert_common_name: 'webclient' # Contact epp will not accept org value by default @@ -41,7 +58,10 @@ contact_org_enabled: 'false' # Custom legal document types # legal_document_types: "pdf,bdoc,ddoc,zip,rar,gz,tar,7z,odt,doc,docx" -# DEPP server configuration (both for Registrar/Registrant servers) + +# +# REGISTRAR configuration (DEPP) +# show_ds_data_fields: 'false' default_nameservers_count: '2' default_admin_contacts_count: '1' @@ -51,30 +71,40 @@ key_path: '/home/registry/registry/shared/ca/private/webclient.key.pem' epp_hostname: 'registry.gitlab.eu' repp_url: 'https://repp.gitlab.eu/repp/v1/' -# Registrant server configuration + +# +# REGISTRANT configuration +# restful_whois_url: 'https://restful-whois.example.com' -# SMTP configuration (for Admin/EPP/Registrar/Registrant servers) -smtp_address: 'server-hostname' -smtp_port: '25' # 587, 465 -smtp_user_name: 'login' -smtp_password: 'pw/key' -# If you need to specify a HELO domain, you can do it here. -smtp_domain: '' # 'domain for HELO checking' -# Use "none" only when for a self-signed and/or wildcard certificate -smtp_openssl_verify_mode: 'peer' # 'none', 'peer', 'client_once','fail_if_no_peer_cert' -# Detects if STARTTLS is enabled in your SMTP server and starts to use it. Defaults to true. -# Set this to false if there is a problem with your server certificate that you cannot resolve. -smtp_enable_starttls_auto: 'true' # 'false' -# If your mail server requires authentication, please change. -smtp_authentication: 'plain' # 'plain', 'login', 'cram_md5' -registrant_url: 'https:/registrant.example.com' # for valid email body registrant links + +# +# REGISTRAR AND REGISTRANT +# # SK DigiDocService sk_digi_doc_service_endpoint: 'https://openxades.org:9443/DigiDocService' sk_digi_doc_service_name: 'EIS test' -# Autotest config overwrites + +# +# MISC +# +# New Relic app name, keep only current mode, remove other names. +# Example: 'Admin, EPP, REPP' will have name 'Admin, EPP, REPP - production' at New Relic. +new_relic_app_name: 'Admin, EPP, REPP, Registrar, Registrant' +new_relic_license_key: '42d1c2ba4ed17a9cf6297c59d80e563a3dd3c4fa' + +# You can use `rake secret` to generate a secure secret key. +# Your secret key is used for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! +secret_key_base: 'please-change-it-you-can-generate-it-with-rake-secret' +devise_secret: 'please-change-it-you-can-generate-it-with-rake-secret' + + +# +# AUTOTEST overwrites +# test: webclient_ips: '127.0.0.1' # it should match to localhost ip address crl_dir: '/var/lib/jenkins/workspace/registry/ca/crl' @@ -84,7 +114,21 @@ test: ca_key_password: 'test' cert_path: '/var/lib/jenkins/workspace/registry/ca/certs/webclient.crt.pem' - # DEPP + # Registrar/DEPP key_path: '/var/lib/jenkins/workspace/registry/ca/private/webclient.key.pem' epp_hostname: '127.0.0.1' repp_url: 'http://127.0.0.1:8989/repp/v1/' + + +# +# DEVELOPMENT overwrites +# +development: + epp_hostname: '127.0.0.1' + repp_url: 'http://127.0.0.1:8080/repp/v1/' + cert_path: 'ca/certs/webclient.cert.pem' + key_path: 'ca/private/webclient.key.pem' + crl_dir: 'ca/crl' + ca_cert_path: 'ca/certs/ca.crt.pem' + ca_key_path: 'ca/private/ca.key.pem' + ca_key_password: 'your-root-key-password' From d8125ebea4b9e60090d6b67cf5134ebd9409fb8a Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Mon, 10 Aug 2015 22:01:26 +0300 Subject: [PATCH 35/68] Registrant new contact ident changable when not yet valid --- app/views/registrar/contacts/form_partials/_general.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/registrar/contacts/form_partials/_general.haml b/app/views/registrar/contacts/form_partials/_general.haml index 24e02e435..6d7f2845f 100644 --- a/app/views/registrar/contacts/form_partials/_general.haml +++ b/app/views/registrar/contacts/form_partials/_general.haml @@ -33,7 +33,7 @@ .col-md-3.control-label = f.label :ident, t(:ident) + '*' .col-md-7 - - if f.object.ident.present? + - if @contact.persisted? && f.object.ident.present? .disabled-value = f.object.ident - else From f5311301c9c7cf72c7ed8bb744d5914079ef1393 Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Mon, 10 Aug 2015 22:23:58 +0300 Subject: [PATCH 36/68] Registrant: remember invalid contact values --- app/views/registrar/contacts/form_partials/_general.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/registrar/contacts/form_partials/_general.haml b/app/views/registrar/contacts/form_partials/_general.haml index 6d7f2845f..9ef12d8f1 100644 --- a/app/views/registrar/contacts/form_partials/_general.haml +++ b/app/views/registrar/contacts/form_partials/_general.haml @@ -11,7 +11,7 @@ = Country.new(f.object.ident_country_code).try(:to_s) = " [#{f.object.ident_country_code}]" - else - - country_selected = @contact.persisted? ? '' : 'EE' + - country_selected = @contact.persisted? ? '' : (params[:depp_contact].try(:[], :ident_country_code) || 'EE') = f.select(:ident_country_code, SortedCountry.all_options(country_selected), {}, class: 'js-ident-country-code', required: true) @@ -24,7 +24,7 @@ = Depp::Contact.type_string(f.object.ident_type) = " [#{f.object.ident_type}]" - else - - type_selected = @contact.persisted? ? '' : 'bic' + - type_selected = @contact.persisted? ? '' : (params[:depp_contact].try(:[], :ident_type) || 'bic') = f.select(:ident_type, Depp::Contact::SELECTION_TYPES, { selected: type_selected }, class: 'js-ident-type', required: true) From e9cf3d2fbe3cbbdcfaa813c658163a54939d900f Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Mon, 10 Aug 2015 20:04:20 +0300 Subject: [PATCH 37/68] Added comma support #2785 --- .../admin/bank_transactions_controller.rb | 2 + .../admin/pricelists_controller.rb | 3 ++ app/controllers/application_controller.rb | 6 +++ app/helpers/application_helper.rb | 5 +++ app/models/deposit.rb | 4 ++ app/views/admin/bank_statements/show.haml | 2 +- app/views/admin/bank_transactions/_form.haml | 2 +- app/views/admin/bank_transactions/show.haml | 2 +- app/views/admin/pricelists/_form.haml | 2 +- app/views/admin/pricelists/index.haml | 2 +- .../registrar/invoices/partials/_items.haml | 12 +++--- app/views/registrar/invoices/pdf.haml | 12 +++--- spec/features/admin/bank_statement_spec.rb | 2 +- spec/features/admin/invoice_spec.rb | 6 +-- spec/models/deposit_spec.rb | 39 +++++++++++++++++++ 15 files changed, 80 insertions(+), 21 deletions(-) create mode 100644 spec/models/deposit_spec.rb diff --git a/app/controllers/admin/bank_transactions_controller.rb b/app/controllers/admin/bank_transactions_controller.rb index 1aaf452a8..7fbdb6ad1 100644 --- a/app/controllers/admin/bank_transactions_controller.rb +++ b/app/controllers/admin/bank_transactions_controller.rb @@ -7,6 +7,7 @@ class Admin::BankTransactionsController < AdminController end def create + comma_support_for(:bank_transaction, :sum) @bank_transaction = BankTransaction.new( bank_transaction_params.merge(bank_statement_id: params[:bank_statement_id]) ) @@ -21,6 +22,7 @@ class Admin::BankTransactionsController < AdminController end def update + comma_support_for(:bank_transaction, :sum) if @bank_transaction.update(bank_transaction_params) flash[:notice] = I18n.t('record_updated') redirect_to [:admin, @bank_transaction] diff --git a/app/controllers/admin/pricelists_controller.rb b/app/controllers/admin/pricelists_controller.rb index 8037f57f6..ce1431ab0 100644 --- a/app/controllers/admin/pricelists_controller.rb +++ b/app/controllers/admin/pricelists_controller.rb @@ -17,6 +17,7 @@ class Admin::PricelistsController < AdminController end def create + comma_support_for(:pricelist, :price) @pricelist = Pricelist.new(pricelist_params) if @pricelist.save @@ -27,6 +28,7 @@ class Admin::PricelistsController < AdminController end def update + comma_support_for(:pricelist, :price) if @pricelist.update_attributes(pricelist_params) redirect_to admin_pricelists_url else @@ -49,4 +51,5 @@ class Admin::PricelistsController < AdminController params.require(:pricelist).permit(:operation_category, :category, :price_category, :duration, :price, :valid_from, :valid_to) end + end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 87099d6fa..318923e3d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -70,4 +70,10 @@ class ApplicationController < ActionController::Base return 'public' if user.nil? "#{user.id}-#{user.class}: #{user.username}" end + + def comma_support_for(parent_key, key) + return if params[parent_key].blank? + return if params[parent_key][key].blank? + params[parent_key][key].sub!(/,/, '.') + end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 7397ec7cb..4efb6f2ee 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -45,4 +45,9 @@ module ApplicationHelper # can be api user or some other user link_to(model.updator, ['admin', model.updator]) end + + def currency(amount) + amount ||= 0 + ("%01.2f" % amount.round(2)).sub(/\./, ',') + end end diff --git a/app/models/deposit.rb b/app/models/deposit.rb index f9f887af1..23045196a 100644 --- a/app/models/deposit.rb +++ b/app/models/deposit.rb @@ -23,6 +23,10 @@ class Deposit false end + def amount + BigDecimal.new(@amount.to_s.sub(/,/, '.')) + end + def issue_prepayment_invoice valid? && registrar.issue_prepayment_invoice(amount, description) end diff --git a/app/views/admin/bank_statements/show.haml b/app/views/admin/bank_statements/show.haml index db8d64004..9797c59bf 100644 --- a/app/views/admin/bank_statements/show.haml +++ b/app/views/admin/bank_statements/show.haml @@ -63,7 +63,7 @@ %tr %td= link_to(l(x.paid_at, format: :date_long), [:admin, x]) %td= x.buyer_name - %td= x.sum + %td= currency(x.sum) %td= x.currency - c = x.binded? ? 'text-success' : 'text-danger' %td{class: c}= x.binded? ? t(:binded) : t(:not_binded) diff --git a/app/views/admin/bank_transactions/_form.haml b/app/views/admin/bank_transactions/_form.haml index 244284fda..b8c63c166 100644 --- a/app/views/admin/bank_transactions/_form.haml +++ b/app/views/admin/bank_transactions/_form.haml @@ -18,7 +18,7 @@ .form-group = f.label :sum, class: 'col-md-4 control-label required' .col-md-8 - = f.text_field(:sum, class: 'form-control', required: true) + = f.text_field(:sum, value: currency(f.object.sum), class: 'form-control', required: true) .form-group = f.label :reference_no, class: 'col-md-4 control-label required' diff --git a/app/views/admin/bank_transactions/show.haml b/app/views/admin/bank_transactions/show.haml index 7bcd8cfa1..4133386e5 100644 --- a/app/views/admin/bank_transactions/show.haml +++ b/app/views/admin/bank_transactions/show.haml @@ -36,7 +36,7 @@ %dd= @bank_transaction.description %dt= t(:sum) - %dd= @bank_transaction.sum + %dd= currency(@bank_transaction.sum) %dt= t(:currency) %dd= @bank_transaction.currency diff --git a/app/views/admin/pricelists/_form.haml b/app/views/admin/pricelists/_form.haml index 9e1715e72..a751825ca 100644 --- a/app/views/admin/pricelists/_form.haml +++ b/app/views/admin/pricelists/_form.haml @@ -15,7 +15,7 @@ .form-group = f.label :price .input-group - = f.text_field(:price, class: 'form-control') + = f.text_field(:price, value: currency(f.object.price), class: 'form-control') %span.input-group-addon= Money.default_currency .form-group.input-daterange = f.label :valid_from, t(:valid) diff --git a/app/views/admin/pricelists/index.haml b/app/views/admin/pricelists/index.haml index 2f51a4329..50edcff2e 100644 --- a/app/views/admin/pricelists/index.haml +++ b/app/views/admin/pricelists/index.haml @@ -33,7 +33,7 @@ %td= pricelist.category %td= pricelist.duration %td= pricelist.operation_category - %td= pricelist.price + %td= currency(pricelist.price) %td= l(pricelist.valid_from, format: :ydate) %td= l(pricelist.valid_to, format: :ydate) %td= link_to(t(:edit), edit_admin_pricelist_path(pricelist), class: 'btn btn-xs btn-primary') diff --git a/app/views/registrar/invoices/partials/_items.haml b/app/views/registrar/invoices/partials/_items.haml index 784fe4412..6ed5144a8 100644 --- a/app/views/registrar/invoices/partials/_items.haml +++ b/app/views/registrar/invoices/partials/_items.haml @@ -14,19 +14,19 @@ %tr %td= t(x.description) %td= x.unit - %td= x.amount - %td= x.price - %td= x.item_sum_without_vat + %td= currency(x.amount) + %td= currency(x.price) + %td= currency(x.item_sum_without_vat) %tfoot %tr %th{colspan: 3} %th= t(:total_without_vat) - %td= @invoice.sum_without_vat + %td= currency(@invoice.sum_without_vat) %tr %th.no-border{colspan: 3} %th= t('vat', vat_prc: (@invoice.vat_prc * 100).round) - %td= @invoice.vat + %td= currency(@invoice.vat) %tr %th.no-border{colspan: 3} %th= t(:total) - %td= @invoice.sum + %td= currency(@invoice.sum) diff --git a/app/views/registrar/invoices/pdf.haml b/app/views/registrar/invoices/pdf.haml index ae67ac4e3..d90c24fec 100644 --- a/app/views/registrar/invoices/pdf.haml +++ b/app/views/registrar/invoices/pdf.haml @@ -229,22 +229,22 @@ %tr %td= t(x.description) %td= x.unit - %td= x.amount - %td= x.price - %td= "#{x.item_sum_without_vat} #{@invoice.currency}" + %td= currency(x.amount) + %td= currency(x.price) + %td= "#{currency(x.item_sum_without_vat)} #{@invoice.currency}" %tfoot %tr %th{colspan: 3} %th= t(:total_without_vat) - %td= "#{@invoice.sum_without_vat} #{@invoice.currency}" + %td= "#{currency(@invoice.sum_without_vat)} #{@invoice.currency}" %tr %th.no-border{colspan: 3} %th= t('vat', vat_prc: (@invoice.vat_prc * 100).round) - %td= "#{@invoice.vat} #{@invoice.currency}" + %td= "#{currency(@invoice.vat)} #{@invoice.currency}" %tr %th.no-border{colspan: 3} %th= t(:total) - %td= "#{@invoice.sum} #{@invoice.currency}" + %td= "#{currency(@invoice.sum)} #{@invoice.currency}" #footer %hr diff --git a/spec/features/admin/bank_statement_spec.rb b/spec/features/admin/bank_statement_spec.rb index bca3136fb..b6ac8dcd2 100644 --- a/spec/features/admin/bank_statement_spec.rb +++ b/spec/features/admin/bank_statement_spec.rb @@ -46,7 +46,7 @@ feature 'BankStatement', type: :feature do click_link 'Back to bank statement' - page.should have_content('120.0') + page.should have_content('120,00') page.should have_content('Test buyer') end end diff --git a/spec/features/admin/invoice_spec.rb b/spec/features/admin/invoice_spec.rb index e036b5f1c..1e10f066b 100644 --- a/spec/features/admin/invoice_spec.rb +++ b/spec/features/admin/invoice_spec.rb @@ -37,7 +37,7 @@ feature 'Invoice', type: :feature do page.should have_content('Record created') page.should have_content('Invoice no.') page.should have_content('Prepayment') - page.should have_content('120.0') + page.should have_content('120,00') page.should have_content(r.name) end @@ -107,7 +107,7 @@ feature 'Invoice', type: :feature do page.should have_content('689') page.should have_content('EE557700771000598731') page.should have_content('Not binded', count: 2) - page.should have_content(invoice.sum.to_s) + page.should have_content('240,00') page.should have_content('EUR') click_link 'Bind invoices' @@ -120,7 +120,7 @@ feature 'Invoice', type: :feature do page.should have_content('Binded') page.should have_content(invoice.to_s) - page.should have_content(invoice.sum.to_s) + page.should have_content('240,00') page.should have_content(invoice.reference_no) page.should have_content(I18n.l(paid_at, format: :date_long)) diff --git a/spec/models/deposit_spec.rb b/spec/models/deposit_spec.rb new file mode 100644 index 000000000..ff77dbd98 --- /dev/null +++ b/spec/models/deposit_spec.rb @@ -0,0 +1,39 @@ +require 'rails_helper' + +describe Deposit do + context 'with invalid attribute' do + before :all do + @deposit = Deposit.new + end + + it 'should not be valid' do + @deposit.valid? + @deposit.errors.full_messages.should match_array([ + "Registrar is missing" + ]) + end + + it 'should have 0 amount' do + @deposit.amount.should == 0 + end + + it 'should not be presisted' do + @deposit.persisted?.should == false + end + + it 'should replace comma with point for 0' do + @deposit.amount = '0,0' + @deposit.amount.should == 0.0 + end + + it 'should replace comma with points' do + @deposit.amount = '10,11' + @deposit.amount.should == 10.11 + end + + it 'should work with float as well' do + @deposit.amount = 0.123 + @deposit.amount.should == 0.123 + end + end +end From e988bb6a2096c10836dd0b3651177622ca9e6853 Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Mon, 10 Aug 2015 23:33:09 +0300 Subject: [PATCH 38/68] Pending delete or update added to domain log view #2785 --- .../admin/domain_versions_controller.rb | 6 +++ app/helpers/application_helper.rb | 5 +++ app/views/admin/domain_versions/_version.haml | 37 +++++++++++++++---- app/views/admin/domain_versions/index.haml | 5 +++ .../admin/domains/partials/_statuses.haml | 8 +++- 5 files changed, 51 insertions(+), 10 deletions(-) diff --git a/app/controllers/admin/domain_versions_controller.rb b/app/controllers/admin/domain_versions_controller.rb index 981783e20..9700e26c1 100644 --- a/app/controllers/admin/domain_versions_controller.rb +++ b/app/controllers/admin/domain_versions_controller.rb @@ -4,6 +4,12 @@ class Admin::DomainVersionsController < AdminController def index @domain = Domain.find(params[:domain_id]) @versions = @domain.versions + + if @domain.pending_json.present? + frame = Nokogiri::XML(@domain.pending_json['frame']) + @pending_user = User.find(@domain.pending_json['current_user_id']) + @pending_domain = Epp::Domain.new_from_epp(frame, @pending_user) + end end # def index diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 4efb6f2ee..6ab5fe4e8 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -50,4 +50,9 @@ module ApplicationHelper amount ||= 0 ("%01.2f" % amount.round(2)).sub(/\./, ',') end + + def plain_username(username) + username ||= '' + username.split(':').last.to_s.strip + end end diff --git a/app/views/admin/domain_versions/_version.haml b/app/views/admin/domain_versions/_version.haml index c8bef118b..3c8b87ff2 100644 --- a/app/views/admin/domain_versions/_version.haml +++ b/app/views/admin/domain_versions/_version.haml @@ -1,16 +1,37 @@ -- if version.present? && domain.present? - - children = HashWithIndifferentAccess.new(version.children) - - nameservers = children[:nameservers] || [] - - tech_contacts = children[:tech_contacts] || [] - - admin_contacts = children[:admin_contacts] || [] - - registrant = children[:registrant] || [] +- version ||= false +- domain ||= false +- pending_user ||= false + +- if domain.present? + - if version # normal history + - children = HashWithIndifferentAccess.new(version.children) + - nameservers = children[:nameservers] || [] + - tech_contacts = children[:tech_contacts] || [] + - admin_contacts = children[:admin_contacts] || [] + - registrant = children[:registrant] || [] + - event = version.event + - creator = plain_username(version.terminator) + - elsif pending_user # pending history + - nameservers = domain.nameservers + - tech_contacts = domain.tech_contacts + - admin_contacts = domain.admin_contacts + - registrant = [domain.registrant] + - event = 'PENDING' + - creator = pending_user.try(:username) + - else # if legacy data not presentable + - nameservers = [] + - tech_contacts = [] + - admin_contacts = [] + - registrant = [] + - event = 'Log data is not viewable' + - creator = '' %td %p.nowrap = l(domain.updated_at, format: :short) - = version.event + = event %p.text-right - = version.terminator + = creator %td %p diff --git a/app/views/admin/domain_versions/index.haml b/app/views/admin/domain_versions/index.haml index 58bb175ab..ef31d2c17 100644 --- a/app/views/admin/domain_versions/index.haml +++ b/app/views/admin/domain_versions/index.haml @@ -17,6 +17,11 @@ %th{class: 'col-xs-2'}= t(:registrar) %tbody + - if @pending_domain.present? + %tr.small + = render 'admin/domain_versions/version', + domain: @pending_domain, pending_user: @pending_user + - if @domain.versions.present? %tr.small = render 'admin/domain_versions/version', diff --git a/app/views/admin/domains/partials/_statuses.haml b/app/views/admin/domains/partials/_statuses.haml index 51a88b18b..82480c7a6 100644 --- a/app/views/admin/domains/partials/_statuses.haml +++ b/app/views/admin/domains/partials/_statuses.haml @@ -8,7 +8,11 @@ %th{class: 'col-xs-6'}= t(:status) %th{class: 'col-xs-6'}= t(:description) %tbody - - @domain.statuses.each do |x| + - @domain.statuses.each do |status| %tr - %td= x + %td + - if [DomainStatus::PENDING_UPDATE, DomainStatus::PENDING_DELETE].include? status + = link_to status, admin_domain_domain_versions_path(@domain.id) + - else + = status %td From 17eec8e298cd6b19c2b5c858d4e694401cb605c2 Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Tue, 11 Aug 2015 00:04:36 +0300 Subject: [PATCH 39/68] Updated domain status view for pending #2785 --- app/controllers/admin/domains_controller.rb | 2 +- app/models/domain.rb | 8 ++++ app/views/admin/domains/edit.haml | 1 + .../domains/form_partials/_statuses.haml | 46 ++++++++++++------- .../admin/domains/partials/_statuses.haml | 4 +- 5 files changed, 41 insertions(+), 20 deletions(-) diff --git a/app/controllers/admin/domains_controller.rb b/app/controllers/admin/domains_controller.rb index c5d60ced3..ed0ac3c17 100644 --- a/app/controllers/admin/domains_controller.rb +++ b/app/controllers/admin/domains_controller.rb @@ -83,7 +83,7 @@ class Admin::DomainsController < AdminController def domain_params if params[:domain] - params.require(:domain).permit({ statuses: [] }) + params.require(:domain).permit({ statuses: [], status_notes_array: [] }) else { statuses: [] } end diff --git a/app/models/domain.rb b/app/models/domain.rb index dcdcbc120..3f06fe15b 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -681,5 +681,13 @@ class Domain < ActiveRecord::Base def update_whois_record whois_record.blank? ? create_whois_record : whois_record.save end + + def status_notes_array=(notes) + self.status_notes = {} + notes ||= [] + statuses.each_with_index do |status, i| + status_notes[status] = notes[i] + end + end end # rubocop: enable Metrics/ClassLength diff --git a/app/views/admin/domains/edit.haml b/app/views/admin/domains/edit.haml index 4b1c25ca6..36ddb3777 100644 --- a/app/views/admin/domains/edit.haml +++ b/app/views/admin/domains/edit.haml @@ -1,4 +1,5 @@ - content_for :actions do + = link_to(t(:add_new_status), '#', class: 'btn btn-primary js-add-status') = link_to(t(:back_to_domain), [:admin, @domain], class: 'btn btn-default') = render 'shared/title', name: "#{t(:edit)}: #{@domain.name}" diff --git a/app/views/admin/domains/form_partials/_statuses.haml b/app/views/admin/domains/form_partials/_statuses.haml index 52b9282ef..6b1c67b43 100644 --- a/app/views/admin/domains/form_partials/_statuses.haml +++ b/app/views/admin/domains/form_partials/_statuses.haml @@ -1,29 +1,41 @@ -#domain-statuses - - @server_statuses.each do |x| +#js-statuses + - f.object.statuses.each do |s| + - disabled = !DomainStatus::SERVER_STATUSES.include?(s) + - disabled_style = disabled ? 'display: none' : '' + - delete_style = [DomainStatus::OK].include?(s) ? 'display: none' : '' + .panel.panel-default .panel-heading.clearfix .pull-left= t(:status) .pull-right - = link_to(t(:add_another), '#', class: 'btn btn-primary btn-xs add-domain-status') - = link_to(t(:delete), '#', class: 'btn btn-danger btn-xs destroy-status') + = link_to(t(:delete), '#', class: 'btn btn-danger btn-xs js-destroy-status', style: delete_style) .panel-body .form-group = f.label 'status', class: 'col-md-2 control-label' .col-md-10 - = select_tag 'domain[statuses][]', options_for_select(DomainStatus.statuses_for_admin, x), include_blank: true, class: 'form-control' + .js-select{style: disabled_style} + = select_tag 'domain[statuses][]', + options_for_select(DomainStatus.statuses_for_admin, s), + include_blank: true, class: "form-control" + - if disabled + .disabled-value.js-disabled-value + = s + = hidden_field_tag 'domain[statuses][]', s, readonly: true .form-group - = label_tag t(:description), nil, class: 'col-md-2 control-label' + = label_tag t(:notes), nil, class: 'col-md-2 control-label' .col-md-10 - = text_field_tag :description, nil, class: 'form-control', autocomplete: 'off' - - @other_statuses.each do |x| - = hidden_field_tag 'domain[statuses][]', x, readonly: true -:coffee - $("#domain-statuses").nestedAttributes - bindAddTo: $(".add-domain-status") + - value = f.object.new_record? ? '' : f.object.status_notes[s] + = text_field_tag 'domain[status_notes_array][]', value, class: 'form-control' - $('.destroy-status').on 'click', (e) -> +:coffee + $("#js-statuses").nestedAttributes + bindAddTo: $(".js-add-status") + afterAdd: (el) -> + if el.find('.js-disabled-value') + el.find('.js-disabled-value').remove() + el.find('.js-select').show() + el.find('.js-destroy-status').show() + + $(document).on 'click', '.js-destroy-status', (e) -> e.preventDefault() - if $('.panel').length > 1 - $(this).parents('.panel').remove() - else - $(this).parents('.panel').find('select').val('') + $(this).parents('.panel').remove() diff --git a/app/views/admin/domains/partials/_statuses.haml b/app/views/admin/domains/partials/_statuses.haml index 82480c7a6..0f05f25d8 100644 --- a/app/views/admin/domains/partials/_statuses.haml +++ b/app/views/admin/domains/partials/_statuses.haml @@ -6,7 +6,7 @@ %thead %tr %th{class: 'col-xs-6'}= t(:status) - %th{class: 'col-xs-6'}= t(:description) + %th{class: 'col-xs-6'}= t(:notes) %tbody - @domain.statuses.each do |status| %tr @@ -15,4 +15,4 @@ = link_to status, admin_domain_domain_versions_path(@domain.id) - else = status - %td + %td= @domain.status_notes[status] From 7e340415e1cffce7e49987fc3f6e8bb6b4af96cd Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Tue, 11 Aug 2015 10:31:25 +0300 Subject: [PATCH 40/68] Rubocop updates --- app/controllers/admin/domain_versions_controller.rb | 2 ++ app/controllers/admin/pricelists_controller.rb | 1 - app/helpers/application_helper.rb | 2 +- app/models/domain.rb | 2 ++ spec/models/domain_spec.rb | 2 +- spec/models/zonefile_setting_spec.rb | 4 +++- 6 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/controllers/admin/domain_versions_controller.rb b/app/controllers/admin/domain_versions_controller.rb index 9700e26c1..ffb6b50e2 100644 --- a/app/controllers/admin/domain_versions_controller.rb +++ b/app/controllers/admin/domain_versions_controller.rb @@ -1,6 +1,7 @@ class Admin::DomainVersionsController < AdminController load_and_authorize_resource + # rubocop:disable Style/GuardClause def index @domain = Domain.find(params[:domain_id]) @versions = @domain.versions @@ -11,6 +12,7 @@ class Admin::DomainVersionsController < AdminController @pending_domain = Epp::Domain.new_from_epp(frame, @pending_user) end end + # rubocop:enable Style/GuardClause # def index # # @q = DomainVersion.deleted.search(params[:q]) diff --git a/app/controllers/admin/pricelists_controller.rb b/app/controllers/admin/pricelists_controller.rb index ce1431ab0..4de35c2c9 100644 --- a/app/controllers/admin/pricelists_controller.rb +++ b/app/controllers/admin/pricelists_controller.rb @@ -51,5 +51,4 @@ class Admin::PricelistsController < AdminController params.require(:pricelist).permit(:operation_category, :category, :price_category, :duration, :price, :valid_from, :valid_to) end - end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 6ab5fe4e8..7a75ff78f 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -48,7 +48,7 @@ module ApplicationHelper def currency(amount) amount ||= 0 - ("%01.2f" % amount.round(2)).sub(/\./, ',') + format("%01.2f", amount.round(2)).sub(/\./, ',') end def plain_username(username) diff --git a/app/models/domain.rb b/app/models/domain.rb index 3f06fe15b..af1a7240a 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -546,6 +546,7 @@ class Domain < ActiveRecord::Base self.delete_at = outzone_at + Setting.redemption_grace_period.days end + # rubocop:disable Metrics/AbcSize def set_force_delete self.statuses_backup = statuses statuses.delete(DomainStatus::CLIENT_DELETE_PROHIBITED) @@ -572,6 +573,7 @@ class Domain < ActiveRecord::Base self.force_delete_at = Time.zone.now + Setting.redemption_grace_period.days unless force_delete_at save(validate: false) end + # rubocop:enable Metrics/AbcSize def unset_force_delete s = [] diff --git a/spec/models/domain_spec.rb b/spec/models/domain_spec.rb index 1b9f7568f..a5a48ddb6 100644 --- a/spec/models/domain_spec.rb +++ b/spec/models/domain_spec.rb @@ -239,7 +239,7 @@ describe Domain do DomainStatus::CLIENT_HOLD, DomainStatus::EXPIRED, DomainStatus::SERVER_HOLD, - DomainStatus::DELETE_CANDIDATE, + DomainStatus::DELETE_CANDIDATE ] @domain.save diff --git a/spec/models/zonefile_setting_spec.rb b/spec/models/zonefile_setting_spec.rb index 9386c3b1d..9405aa063 100644 --- a/spec/models/zonefile_setting_spec.rb +++ b/spec/models/zonefile_setting_spec.rb @@ -41,7 +41,9 @@ describe ZonefileSetting do it 'should not place serverHold nor clientHold domains into zonefile' do Fabricate(:zonefile_setting) - d = Fabricate(:domain_with_dnskeys, name: 'testzone.ee', statuses: ['serverHold', 'serverDeleteProhibited', 'clientHold']) + d = Fabricate(:domain_with_dnskeys, + name: 'testzone.ee', + statuses: ['serverHold', 'serverDeleteProhibited', 'clientHold']) d.nameservers << Nameserver.new({ hostname: "ns.#{d.name}", ipv4: '123.123.123.123', From 97c3277ed9668683f8dedc3492a74446f2ab26b0 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 11 Aug 2015 10:35:42 +0300 Subject: [PATCH 41/68] Add force delete test to domain #2845 --- spec/epp/domain_spec.rb | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/spec/epp/domain_spec.rb b/spec/epp/domain_spec.rb index 26fc2b7b3..3062bbeb6 100644 --- a/spec/epp/domain_spec.rb +++ b/spec/epp/domain_spec.rb @@ -1855,6 +1855,31 @@ describe 'EPP Domain', epp: true do d.pending_update?.should == true end + it 'should not allow any update when status force delete' do + domain.set_force_delete + + existing_pw = domain.auth_info + + xml_params = { + name: { value: domain.name }, + chg: [ + registrant: { value: 'FIXED:CITIZEN_1234' } + ] + } + + response = epp_plain_request(domain_update_xml(xml_params, {}, { + _anonymus: [ + legalDocument: { + value: 'dGVzdCBmYWlsCg==', + attrs: { type: 'pdf' } + } + ] + })) + + response[:results][0][:msg].should == 'Object status prohibits operation' + response[:results][0][:result_code].should == '2304' + end + it 'updates domain and adds objects' do xml = domain_update_xml({ name: { value: domain.name }, From aa54e3c84fd92f3e31333b363a1fbfc4440574a9 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 11 Aug 2015 11:03:09 +0300 Subject: [PATCH 42/68] Update iso8601 --- Gemfile | 6 +++--- Gemfile.lock | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 1497b5bd6..7dd391c42 100644 --- a/Gemfile +++ b/Gemfile @@ -9,7 +9,7 @@ source 'https://rubygems.org' # core gem 'rails', '4.2.3' # when update, all initializers eis_custom files needs check/update -gem 'iso8601', '~> 0.8.2' # for dates and times +gem 'iso8601', '~> 0.8.6' # for dates and times gem 'hashie-forbidden_attributes', '~> 0.1.1' # load env @@ -66,8 +66,8 @@ gem 'money-rails', '~> 1.4.1' # deploy gem 'whenever', '~> 0.9.4', require: false -gem 'data_migrate', - github: 'internetee/data-migrate', +gem 'data_migrate', + github: 'internetee/data-migrate', ref: '35d22b09ff37a4e9d61ab326ad5d8eb0edf1fc81' # monitors diff --git a/Gemfile.lock b/Gemfile.lock index fcbd6652c..dd0bcf2f0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -574,7 +574,7 @@ DEPENDENCIES html2haml (~> 2.0.0) html5_validators (~> 1.2.0) isikukood - iso8601 (~> 0.8.2) + iso8601 (~> 0.8.6) jbuilder (~> 2.2.6) jquery-rails (~> 4.0.3) jquery-ui-rails (~> 5.0.3) From fe555837a09a0c6300d4fe97a4a9c7baa95f58d9 Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Tue, 11 Aug 2015 11:23:33 +0300 Subject: [PATCH 43/68] Added involid cert debug info to log file --- app/models/depp/user.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/models/depp/user.rb b/app/models/depp/user.rb index d510edecd..caebd779d 100644 --- a/app/models/depp/user.rb +++ b/app/models/depp/user.rb @@ -92,6 +92,8 @@ module Depp rescue OpenSSL::SSL::SSLError => e Rails.logger.error "INVALID CERT: #{e}" + Rails.logger.error "INVALID CERT DEBUG INFO: epp_hostname: #{ENV['epp_hostname']}," \ + "port: #{ENV['epp_port']}, cert_path: #{ENV['cert_path']}, key_path: #{ENV['key_path']}" errors.add(:base, :invalid_cert) end end From d3153ef706a2acf683cfa6b5c136768bcd34e24d Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Tue, 11 Aug 2015 11:39:28 +0300 Subject: [PATCH 44/68] Update specs --- spec/epp/domain_spec.rb | 2 -- spec/models/bank_statement_spec.rb | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/epp/domain_spec.rb b/spec/epp/domain_spec.rb index 3062bbeb6..c886724cf 100644 --- a/spec/epp/domain_spec.rb +++ b/spec/epp/domain_spec.rb @@ -1858,8 +1858,6 @@ describe 'EPP Domain', epp: true do it 'should not allow any update when status force delete' do domain.set_force_delete - existing_pw = domain.auth_info - xml_params = { name: { value: domain.name }, chg: [ diff --git a/spec/models/bank_statement_spec.rb b/spec/models/bank_statement_spec.rb index 77ffffd1e..659b733bb 100644 --- a/spec/models/bank_statement_spec.rb +++ b/spec/models/bank_statement_spec.rb @@ -67,6 +67,8 @@ describe BankStatement do a.sum.should == BigDecimal.new('200.0') a.activity_type = AccountActivity::ADD_CREDIT + r.reload + r.cash_account.reload r.cash_account.balance.should == 200.0 bs.bank_transactions.unbinded.count.should == 1 From 394f30255f100b2c11a7249a64e37448b135cc24 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 11 Aug 2015 11:41:55 +0300 Subject: [PATCH 45/68] Add feature test on force delete #2845 --- app/controllers/admin/domains_controller.rb | 2 +- spec/features/admin/domain_spec.rb | 34 +++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/app/controllers/admin/domains_controller.rb b/app/controllers/admin/domains_controller.rb index ed0ac3c17..7c90c1a49 100644 --- a/app/controllers/admin/domains_controller.rb +++ b/app/controllers/admin/domains_controller.rb @@ -18,7 +18,7 @@ class Admin::DomainsController < AdminController normalize_search_parameters do @q = domains.search(params[:q]) @domains = @q.result.page(params[:page]) - if @domains.count == 1 + if @domains.count == 1 && params[:q][:name_matches].present? redirect_to [:admin, @domains.first] and return elsif @domains.count == 0 && params[:q][:name_matches] !~ /^%.+%$/ # if we do not get any results, add wildcards to the name field and search again diff --git a/spec/features/admin/domain_spec.rb b/spec/features/admin/domain_spec.rb index 20ee508d8..42fbc76a2 100644 --- a/spec/features/admin/domain_spec.rb +++ b/spec/features/admin/domain_spec.rb @@ -48,4 +48,38 @@ feature 'Domain', type: :feature do find('.btn.btn-primary').click current_path.should == "/admin/domains/#{d1.id}" end + + it 'should set domain to force delete' do + d = Fabricate(:domain) + sign_in @user + visit admin_domains_url + click_link d.name + page.should have_content('ok') + click_link 'Set force delete' + page.should have_content('forceDelete') + page.should have_content('serverRenewProhibited') + page.should have_content('serverTransferProhibited') + page.should have_content('serverUpdateProhibited') + page.should have_content('serverManualInzone') + page.should have_content('pendingDelete') + + click_link 'Edit statuses' + click_button 'Save' + page.should have_content('Failed to update domain') + page.should have_content('Object status prohibits operation') + + click_link 'Back to domain' + click_link 'Unset force delete' + page.should_not have_content('forceDelete') + page.should_not have_content('serverRenewProhibited') + page.should_not have_content('serverTransferProhibited') + page.should_not have_content('serverUpdateProhibited') + page.should_not have_content('serverManualInzone') + page.should_not have_content('pendingDelete') + page.should have_content('ok') + + click_link 'Edit statuses' + click_button 'Save' + page.should have_content('Domain updated!') + end end From 4c981e736a7a4fbf286c9d8fcc1a93054947ef90 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 11 Aug 2015 12:15:59 +0300 Subject: [PATCH 46/68] Refactor #2809 --- app/models/epp/domain.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/models/epp/domain.rb b/app/models/epp/domain.rb index 9a366a367..0b012ad1d 100644 --- a/app/models/epp/domain.rb +++ b/app/models/epp/domain.rb @@ -586,7 +586,7 @@ class Epp::Domain < Domain } end - unless can_be_transferred_to?(current_user.registrar) + if current_user.registrar == registrar throw :epp_error, { code: '2002', msg: I18n.t(:domain_already_belongs_to_the_querying_registrar) @@ -744,10 +744,6 @@ class Epp::Domain < Domain true end - def can_be_transferred_to?(new_registrar) - new_registrar != registrar - end - def transferrable? (statuses & [ DomainStatus::PENDING_CREATE, From e5d03e3cdf6b9b7779cf769f2bc43300e85945bb Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Tue, 11 Aug 2015 12:45:52 +0300 Subject: [PATCH 47/68] Rubocop update --- app/models/depp/user.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/models/depp/user.rb b/app/models/depp/user.rb index caebd779d..44c25bbb1 100644 --- a/app/models/depp/user.rb +++ b/app/models/depp/user.rb @@ -71,6 +71,7 @@ module Depp private + # rubocop:disable Metrics/AbcSize def validate_existance_in_server return if errors.any? res = server.open_connection @@ -96,5 +97,6 @@ module Depp "port: #{ENV['epp_port']}, cert_path: #{ENV['cert_path']}, key_path: #{ENV['key_path']}" errors.add(:base, :invalid_cert) end + # rubocop:enable Metrics/AbcSize end end From dff3a80592d6eb2a1b4d374d12de0d835be2aff2 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 11 Aug 2015 13:01:09 +0300 Subject: [PATCH 48/68] Refactor test #2809 --- spec/epp/domain_spec.rb | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/spec/epp/domain_spec.rb b/spec/epp/domain_spec.rb index c886724cf..892665a09 100644 --- a/spec/epp/domain_spec.rb +++ b/spec/epp/domain_spec.rb @@ -1008,30 +1008,26 @@ describe 'EPP Domain', epp: true do # should show up in other registrar's poll - response = login_as :registrar2 do - epp_plain_request(@epp_xml.session.poll) + login_as :registrar2 do + response = epp_plain_request(@epp_xml.session.poll) + response[:msg].should == 'Command completed successfully; ack to dequeue' + msg_q = response[:parsed].css('msgQ') + msg_q.css('qDate').text.should_not be_blank + msg_q.css('msg').text.should == 'Transfer requested.' + msg_q.first['id'].should_not be_blank + msg_q.first['count'].should == '1' + + xml = @epp_xml.session.poll(poll: { + value: '', attrs: { op: 'ack', msgID: msg_q.first['id'] } + }) + + response = epp_plain_request(xml) + response[:msg].should == 'Command completed successfully' + msg_q = response[:parsed].css('msgQ') + msg_q.first['id'].should_not be_blank + msg_q.first['count'].should == '0' end - response[:msg].should == 'Command completed successfully; ack to dequeue' - msg_q = response[:parsed].css('msgQ') - msg_q.css('qDate').text.should_not be_blank - msg_q.css('msg').text.should == 'Transfer requested.' - msg_q.first['id'].should_not be_blank - msg_q.first['count'].should == '1' - - xml = @epp_xml.session.poll(poll: { - value: '', attrs: { op: 'ack', msgID: msg_q.first['id'] } - }) - - response = login_as :registrar2 do - epp_plain_request(xml) - end - - response[:msg].should == 'Command completed successfully' - msg_q = response[:parsed].css('msgQ') - msg_q.first['id'].should_not be_blank - msg_q.first['count'].should == '0' - create_settings end From 8c691542f033105715ceb1e5e12437dbc3a3c1eb Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 11 Aug 2015 14:52:00 +0300 Subject: [PATCH 49/68] Refactor tests #2809 --- app/views/admin/settings/index.haml | 2 +- config/initializers/initial_settings.rb | 1 + spec/epp/domain_spec.rb | 70 ++++++++++++++++++++++--- 3 files changed, 64 insertions(+), 9 deletions(-) diff --git a/app/views/admin/settings/index.haml b/app/views/admin/settings/index.haml index 94b87fff4..fc4cc4e9d 100644 --- a/app/views/admin/settings/index.haml +++ b/app/views/admin/settings/index.haml @@ -47,7 +47,7 @@ %th{class: 'col-xs-6'}= t(:setting) %th{class: 'col-xs-6'}= t(:value) %tbody - = render 'setting_row', var: :transfer_wait_time + /= render 'setting_row', var: :transfer_wait_time = render 'setting_row', var: :ds_algorithm = render 'setting_row', var: :client_side_status_editing_enabled = render 'setting_row', var: :api_ip_whitelist_enabled diff --git a/config/initializers/initial_settings.rb b/config/initializers/initial_settings.rb index 1325831da..bcee95150 100644 --- a/config/initializers/initial_settings.rb +++ b/config/initializers/initial_settings.rb @@ -22,6 +22,7 @@ if con.present? && con.table_exists?('settings') Setting.save_default(:ns_max_count, 11) Setting.save_default(:transfer_wait_time, 0) + Setting.transfer_wait_time = 0 Setting.save_default(:request_confrimation_on_registrant_change_enabled, true) Setting.save_default(:request_confirmation_on_domain_deletion_enabled, true) diff --git a/spec/epp/domain_spec.rb b/spec/epp/domain_spec.rb index 892665a09..c00225dc8 100644 --- a/spec/epp/domain_spec.rb +++ b/spec/epp/domain_spec.rb @@ -907,7 +907,6 @@ describe 'EPP Domain', epp: true do context 'with valid domain' do let(:domain) { Fabricate(:domain, registrar: @registrar1, dnskeys: []) } - ### TRANSFER ### it 'transfers a domain' do domain.registrar = @registrar1 domain.save @@ -928,6 +927,67 @@ describe 'EPP Domain', epp: true do old_contact_codes = domain.contacts.pluck(:code).sort.uniq old_registrant_code = domain.registrant.code + login_as :registrar2 do + response = epp_plain_request(xml) + domain.reload + dtl = domain.domain_transfers.last + + trn_data = response[:parsed].css('trnData') + trn_data.css('name').text.should == domain.name + trn_data.css('trStatus').text.should == 'serverApproved' + trn_data.css('reID').text.should == 'REGDOMAIN2' + trn_data.css('reDate').text.should == dtl.transfer_requested_at.in_time_zone.utc.utc.iso8601 + trn_data.css('acID').text.should == 'REGDOMAIN1' + trn_data.css('acDate').text.should == dtl.transferred_at.in_time_zone.utc.utc.iso8601 + trn_data.css('exDate').text.should == domain.valid_to.in_time_zone.utc.utc.iso8601 + + domain.registrar.should == @registrar2 + end + + response = epp_plain_request(@epp_xml.session.poll) + + response[:msg].should == 'Command completed successfully; ack to dequeue' + msg_q = response[:parsed].css('msgQ') + msg_q.css('qDate').text.should_not be_blank + + msg_q.css('msg').text.should == "Domain transfer was approved, associated contacts were: " \ + "#{old_contact_codes} and registrant was #{old_registrant_code}" + msg_q.first['id'].should_not be_blank + msg_q.first['count'].should == '1' + + xml = @epp_xml.session.poll(poll: { + value: '', attrs: { op: 'ack', msgID: msg_q.first['id'] } + }) + + response = epp_plain_request(xml) + response[:msg].should == 'Command completed successfully' + msg_q = response[:parsed].css('msgQ') + msg_q.first['id'].should_not be_blank + msg_q.first['count'].should == '0' + end + + ### TRANSFER ### + # Do not place this test to epp-examples (epp: false) + it 'transfers a domain with wait time > 0', epp: false do + domain.registrar = @registrar1 + domain.save + + pw = domain.auth_info + xml = domain_transfer_xml({ + name: { value: domain.name }, + authInfo: { pw: { value: pw } } + }, 'request', { + _anonymus: [ + legalDocument: { + value: 'dGVzdCBmYWlsCg==', + attrs: { type: 'pdf' } + } + ] + }) + + old_contact_codes = domain.contacts.pluck(:code).sort.uniq + old_registrant_code = domain.registrant.code + response = login_as :registrar2 do epp_plain_request(xml) end @@ -1032,7 +1092,6 @@ describe 'EPP Domain', epp: true do end it 'creates a domain transfer with legal document' do - Setting.transfer_wait_time = 1 domain.legal_documents.count.should == 0 pw = domain.auth_info xml = domain_transfer_xml({ @@ -1066,11 +1125,6 @@ describe 'EPP Domain', epp: true do response = login_as :registrar2 do epp_plain_request(xml) end - - response[:result_code].should == '1000' - domain.legal_documents.count.should == 1 # does not add another legal documen - - create_settings end it 'creates transfer successfully without legal document' do @@ -1568,7 +1622,7 @@ describe 'EPP Domain', epp: true do response[:results][0][:result_code].should == '2303' end - it 'should allow querying domain transfer' do + it 'should allow querying domain transfer', epp: false do Setting.transfer_wait_time = 1 pw = domain.auth_info xml = domain_transfer_xml({ From 7692e32b9ffb003536e6f01931af93c50affb741 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 11 Aug 2015 14:57:49 +0300 Subject: [PATCH 50/68] Update epp-examples #2809 --- doc/epp-examples.md | 2121 +++++++++++++++++-------------------------- 1 file changed, 836 insertions(+), 1285 deletions(-) diff --git a/doc/epp-examples.md b/doc/epp-examples.md index c26d25426..b821b2330 100644 --- a/doc/epp-examples.md +++ b/doc/epp-examples.md @@ -1,6 +1,6 @@ # EPP REQUEST - RESPONSE EXAMPLES -GENERATED AT: 2015-07-28 08:39:28 UTC -EXAMPLE COUNT: 187 +GENERATED AT: 2015-08-11 11:53:57 UTC +EXAMPLE COUNT: 189 --- @@ -44,7 +44,7 @@ RESPONSE: ABC-12345 - ccReg-3999773216 + ccReg-9082045089 @@ -77,7 +77,7 @@ RESPONSE: ABC-12345 - ccReg-5475530912 + ccReg-7708178641 @@ -128,13 +128,13 @@ RESPONSE: - FIRST0:6A469D40 - 2015-07-28T08:39:31Z + FIRST0:D0F0F307 + 2015-08-11T11:53:59Z ABC-12345 - ccReg-9419100913 + ccReg-6573619456 @@ -185,13 +185,13 @@ RESPONSE: - FIRST0:9175FF51 - 2015-07-28T08:39:31Z + FIRST0:20292602 + 2015-08-11T11:53:59Z ABC-12345 - ccReg-7112806347 + ccReg-3908771262 @@ -242,13 +242,13 @@ RESPONSE: - FIRST0:B0D47101 - 2015-07-28T08:39:31Z + FIRST0:89AE5789 + 2015-08-11T11:53:59Z ABC-12345 - ccReg-3112027327 + ccReg-5422552838 @@ -299,13 +299,64 @@ RESPONSE: - FIRST0:D97D17A8 - 2015-07-28T08:39:31Z + FIRST0:368D504A + 2015-08-11T11:54:00Z ABC-12345 - ccReg-8158844070 + ccReg-1406291850 + + + +``` + +### EPP Contact with valid user create command should return email issue + +REQUEST: + +```xml + + + + + + + John Doe + + 123 Example + Tallinn + 123456 + EE + + + +372.1234567 + not@valid + + + + + 37605030299 + dGVzdCBmYWlsCg== + + + ABC-12345 + + +``` + +RESPONSE: + +```xml + + + + + Email is invalid [email] + + + ABC-12345 + ccReg-0983305061 @@ -358,12 +409,12 @@ RESPONSE: FIRST0:ABC12345 - 2015-07-28T08:39:32Z + 2015-08-11T11:54:01Z ABC-12345 - ccReg-6348378603 + ccReg-4916468828 @@ -416,12 +467,12 @@ RESPONSE: FIRST0:ABC:ABC:12345 - 2015-07-28T08:39:32Z + 2015-08-11T11:54:01Z ABC-12345 - ccReg-6309817337 + ccReg-9016083927 @@ -473,7 +524,7 @@ RESPONSE: ABC-12345 - ccReg-3718665628 + ccReg-3212008733 @@ -525,7 +576,7 @@ RESPONSE: ABC-12345 - ccReg-7046803120 + ccReg-8511471629 @@ -577,7 +628,7 @@ RESPONSE: ABC-12345 - ccReg-7830897117 + ccReg-1241570735 @@ -630,7 +681,7 @@ RESPONSE: ABC-12345 - ccReg-0585936448 + ccReg-9718956708 @@ -680,7 +731,7 @@ RESPONSE: ABC-12345 - ccReg-9395726958 + ccReg-0579468088 @@ -733,7 +784,7 @@ RESPONSE: ABC-12345 - ccReg-3003187201 + ccReg-8588827952 @@ -786,12 +837,12 @@ RESPONSE: FIRST0:CID:FIRST0:ABC:ABC:NEW:12345 - 2015-07-28T08:39:38Z + 2015-08-11T11:54:07Z ABC-12345 - ccReg-3792142117 + ccReg-9156643507 @@ -844,12 +895,12 @@ RESPONSE: FIRST0:CID:FIRST0:ABC:CID:ABC:NEW:12345 - 2015-07-28T08:39:38Z + 2015-08-11T11:54:07Z ABC-12345 - ccReg-8833719931 + ccReg-1774855635 @@ -902,12 +953,12 @@ RESPONSE: FIRST0:ABC22 - 2015-07-28T08:39:39Z + 2015-08-11T11:54:07Z ABC-12345 - ccReg-9289988831 + ccReg-3574147962 @@ -960,12 +1011,12 @@ RESPONSE: FIRST0:CID2:FIRST0:ABC:ABC:11111 - 2015-07-28T08:39:39Z + 2015-08-11T11:54:08Z ABC-12345 - ccReg-8383857357 + ccReg-0447899806 @@ -1018,12 +1069,12 @@ RESPONSE: FIRST0:CID:FIRST0 - 2015-07-28T08:39:39Z + 2015-08-11T11:54:08Z ABC-12345 - ccReg-5997788919 + ccReg-5679805727 @@ -1074,13 +1125,13 @@ RESPONSE: - FIRST0:87E70060 - 2015-07-28T08:39:39Z + FIRST0:06BD3C8C + 2015-08-11T11:54:08Z ABC-12345 - ccReg-9532742811 + ccReg-8613111681 @@ -1131,13 +1182,13 @@ RESPONSE: - FIRST0:A74EABFE - 2015-07-28T08:39:39Z + FIRST0:BD59CDA7 + 2015-08-11T11:54:08Z ABC-12345 - ccReg-2995036796 + ccReg-0189667500 @@ -1189,7 +1240,7 @@ RESPONSE: ABC-12345 - ccReg-9068419905 + ccReg-3513815797 @@ -1241,7 +1292,7 @@ RESPONSE: ABC-12345 - ccReg-3667432897 + ccReg-2265155495 @@ -1274,7 +1325,7 @@ RESPONSE: ABC-12345 - ccReg-8184249905 + ccReg-9450535622 @@ -1327,7 +1378,7 @@ RESPONSE: ABC-12345 - ccReg-7422710793 + ccReg-1241202461 @@ -1378,12 +1429,12 @@ RESPONSE: FIRST0:SH8013 - 2015-07-28T08:39:41Z + 2015-08-11T11:54:10Z ABC-12345 - ccReg-4865022436 + ccReg-1676808251 @@ -1424,12 +1475,12 @@ RESPONSE: FIRST0:SH8013 - 2015-07-28T08:39:41Z + 2015-08-11T11:54:10Z ABC-12345 - ccReg-6633367984 + ccReg-3841640389 @@ -1477,7 +1528,7 @@ RESPONSE: ABC-12345 - ccReg-7530163933 + ccReg-7368384228 @@ -1526,12 +1577,12 @@ RESPONSE: FIRST0:SH8013 - 2015-07-28T08:39:41Z + 2015-08-11T11:54:10Z ABC-12345 - ccReg-4277646314 + ccReg-8647496616 @@ -1577,7 +1628,7 @@ RESPONSE: ABC-12345 - ccReg-4538846364 + ccReg-4146436220 @@ -1625,7 +1676,7 @@ RESPONSE: ABC-12345 - ccReg-6831340132 + ccReg-5737511484 @@ -1663,7 +1714,7 @@ RESPONSE: ABC-12345 - ccReg-6564840615 + ccReg-7339726178 @@ -1709,7 +1760,7 @@ RESPONSE: ABC-12345 - ccReg-5442863323 + ccReg-4434689187 @@ -1762,7 +1813,57 @@ RESPONSE: ABC-12345 - ccReg-8528718455 + ccReg-1430550210 + + + +``` + +### EPP Contact with valid user update command should return email issue + +REQUEST: + +```xml + + + + + + FIRST0:SH8013 + + + John Doe Edited + + +372.7654321 + legacy@wrong + + password + + + + + + + dGVzdCBmYWlsCg== + + + ABC-12345 + + +``` + +RESPONSE: + +```xml + + + + + Email is invalid [email] + + + ABC-12345 + ccReg-2794881800 @@ -1813,7 +1914,7 @@ RESPONSE: ABC-12345 - ccReg-4331200914 + ccReg-1436918030 @@ -1864,7 +1965,7 @@ RESPONSE: ABC-12345 - ccReg-4397523800 + ccReg-2413220348 @@ -1915,7 +2016,7 @@ RESPONSE: ABC-12345 - ccReg-7928150587 + ccReg-6059161763 @@ -1966,7 +2067,7 @@ RESPONSE: ABC-12345 - ccReg-3817458970 + ccReg-6512798819 @@ -2005,7 +2106,7 @@ RESPONSE: ABC-12345 - ccReg-3807652405 + ccReg-7467392690 @@ -2047,12 +2148,12 @@ RESPONSE: FIRST0:SH8013 - 2015-07-28T08:39:41Z + 2015-08-11T11:54:10Z ABC-12345 - ccReg-8133702938 + ccReg-2448465521 @@ -2097,7 +2198,7 @@ RESPONSE: ABC-12345 - ccReg-7011374408 + ccReg-9595670057 @@ -2141,7 +2242,7 @@ RESPONSE: ABC-12345 - ccReg-7610710976 + ccReg-7092339553 @@ -2185,7 +2286,7 @@ RESPONSE: ABC-12345 - ccReg-6395479303 + ccReg-5659939459 @@ -2226,7 +2327,7 @@ RESPONSE: ABC-12345 - ccReg-7007003785 + ccReg-8711843559 @@ -2270,7 +2371,7 @@ RESPONSE: ABC-12345 - ccReg-8061878233 + ccReg-7889570431 @@ -2314,7 +2415,7 @@ RESPONSE: ABC-12345 - ccReg-3091851486 + ccReg-9368399872 @@ -2361,7 +2462,7 @@ RESPONSE: ABC-12345 - ccReg-8609322144 + ccReg-8584439021 @@ -2404,7 +2505,7 @@ RESPONSE: ABC-12345 - ccReg-0582559112 + ccReg-9972353508 @@ -2448,12 +2549,12 @@ RESPONSE: FIRST0:SH8013 - 2015-07-28T08:39:41Z + 2015-08-11T11:54:10Z ABC-12345 - ccReg-8655942919 + ccReg-0465840835 @@ -2496,7 +2597,7 @@ RESPONSE: ABC-12345 - ccReg-9481106190 + ccReg-5948287752 @@ -2529,7 +2630,7 @@ RESPONSE: ABC-12345 - ccReg-5578564225 + ccReg-2005766067 @@ -2576,7 +2677,7 @@ RESPONSE: ABC-12345 - ccReg-6663525094 + ccReg-4783450134 @@ -2592,7 +2693,7 @@ REQUEST: - FIRST0:SH231039313 + FIRST0:SH801687153 password @@ -2620,7 +2721,7 @@ RESPONSE: ABC-12345 - ccReg-3780043277 + ccReg-8065634571 @@ -2636,7 +2737,7 @@ REQUEST: - FIRST0:SH495814614 + FIRST0:SH596230584 wrong password @@ -2664,7 +2765,7 @@ RESPONSE: ABC-12345 - ccReg-7212720521 + ccReg-8152139127 @@ -2680,7 +2781,7 @@ REQUEST: - FIRST0:SH345416025 + FIRST0:SH827840235 ABC-12345 @@ -2699,7 +2800,7 @@ RESPONSE: ABC-12345 - ccReg-6437000685 + ccReg-5094671453 @@ -2715,7 +2816,7 @@ REQUEST: - FIRST0:SH527033126 + FIRST0:SH543664306 password @@ -2743,7 +2844,7 @@ RESPONSE: ABC-12345 - ccReg-1807855170 + ccReg-9770009820 @@ -2791,7 +2892,7 @@ RESPONSE: ABC-12345 - ccReg-0288992099 + ccReg-0320951230 @@ -2805,7 +2906,7 @@ REQUEST: - FIRST0:SH031616179 + FIRST0:SH337053769 password @@ -2833,7 +2934,7 @@ RESPONSE: ABC-12345 - ccReg-4336841702 + ccReg-0617016997 @@ -2879,7 +2980,7 @@ RESPONSE: ABC-12345 - ccReg-8729288024 + ccReg-0539629581 @@ -2927,7 +3028,7 @@ RESPONSE: ABC-12345 - ccReg-6840346616 + ccReg-8866995360 @@ -2941,7 +3042,7 @@ REQUEST: - FIRST0:SH2297814310 + FIRST0:SH2750056010 ABC-12345 @@ -2960,7 +3061,7 @@ RESPONSE: ABC-12345 - ccReg-3383228806 + ccReg-6611721334 @@ -3006,7 +3107,7 @@ RESPONSE: ABC-12345 - ccReg-4682199982 + ccReg-6821784195 @@ -3054,7 +3155,7 @@ RESPONSE: ABC-12345 - ccReg-6469460670 + ccReg-2739951858 @@ -3068,7 +3169,7 @@ REQUEST: - FIRST0:SH3326380711 + FIRST0:SH7547714011 wrong password @@ -3096,7 +3197,7 @@ RESPONSE: ABC-12345 - ccReg-7404986506 + ccReg-6380340749 @@ -3142,7 +3243,7 @@ RESPONSE: ABC-12345 - ccReg-7294017342 + ccReg-5489286626 @@ -3175,7 +3276,7 @@ RESPONSE: ABC-12345 - ccReg-7052563758 + ccReg-2448090373 @@ -3222,7 +3323,7 @@ RESPONSE: ABC-12345 - ccReg-9831020858 + ccReg-1430458904 @@ -3269,7 +3370,7 @@ RESPONSE: ABC-12345 - ccReg-3695978327 + ccReg-3551943099 @@ -3302,7 +3403,7 @@ RESPONSE: ABC-12345 - ccReg-0977011305 + ccReg-2097504056 @@ -3343,7 +3444,7 @@ RESPONSE: ABC-12345 - ccReg-5298387301 + ccReg-4245808410 @@ -3395,10 +3496,10 @@ RESPONSE: +372.12345678 - adaline.farrell@wilkinson.org + berenice@kuhlmandickens.biz fixed registrar TEST-CREATOR - 2015-07-28T08:40:06Z + 2015-08-11T11:54:34Z password @@ -3411,7 +3512,7 @@ RESPONSE: ABC-12345 - ccReg-5155368245 + ccReg-6860164806 @@ -3463,10 +3564,10 @@ RESPONSE: +372.12345678 - adaline.farrell@wilkinson.org + berenice@kuhlmandickens.biz fixed registrar TEST-CREATOR - 2015-07-28T08:40:06Z + 2015-08-11T11:54:34Z password @@ -3479,7 +3580,7 @@ RESPONSE: ABC-12345 - ccReg-5763471786 + ccReg-4906024902 @@ -3531,10 +3632,10 @@ RESPONSE: +372.12345678 - adaline.farrell@wilkinson.org + berenice@kuhlmandickens.biz registrar1 TEST-CREATOR - 2015-07-28T08:40:06Z + 2015-08-11T11:54:34Z password @@ -3547,7 +3648,7 @@ RESPONSE: ABC-12345 - ccReg-1407507322 + ccReg-8249779521 @@ -3563,7 +3664,7 @@ REQUEST: - FIRST0:SH401752550 + FIRST0:SH828429550 wrong-pw @@ -3585,11 +3686,11 @@ RESPONSE: - FIRST0:SH401752550 + FIRST0:SH828429550 EIS-1 - Gloria Boyer MD0 + Adell O'Connell0 Short street 11 Tallinn @@ -3599,10 +3700,10 @@ RESPONSE: +372.12345678 - adaline.farrell@wilkinson.org + berenice@kuhlmandickens.biz registrar1 TEST-CREATOR - 2015-07-28T08:39:30Z + 2015-08-11T11:53:58Z password @@ -3615,7 +3716,7 @@ RESPONSE: ABC-12345 - ccReg-6798027147 + ccReg-7409111261 @@ -3657,7 +3758,7 @@ RESPONSE: EIS-32 - Mr. Brooks Crooks15 + Asia Labadie15 Short street 11 Tallinn @@ -3667,10 +3768,10 @@ RESPONSE: +372.12345678 - adaline.farrell@wilkinson.org + berenice@kuhlmandickens.biz fixed registrar TEST-CREATOR - 2015-07-28T08:40:06Z + 2015-08-11T11:54:35Z password @@ -3683,7 +3784,7 @@ RESPONSE: ABC-12345 - ccReg-3521737420 + ccReg-6138234631 @@ -3731,7 +3832,7 @@ RESPONSE: ABC-12345 - ccReg-9495273454 + ccReg-4837905217 @@ -3745,7 +3846,7 @@ REQUEST: - FIRST0:SH401752550 + FIRST0:SH828429550 password @@ -3767,11 +3868,11 @@ RESPONSE: - FIRST0:SH401752550 + FIRST0:SH828429550 EIS-1 - Gloria Boyer MD0 + Adell O'Connell0 Short street 11 Tallinn @@ -3781,10 +3882,10 @@ RESPONSE: +372.12345678 - adaline.farrell@wilkinson.org + berenice@kuhlmandickens.biz registrar1 TEST-CREATOR - 2015-07-28T08:39:30Z + 2015-08-11T11:53:58Z password @@ -3797,7 +3898,7 @@ RESPONSE: ABC-12345 - ccReg-7991464495 + ccReg-4619937530 @@ -3843,7 +3944,7 @@ RESPONSE: ABC-12345 - ccReg-4527051077 + ccReg-7648304008 @@ -3891,7 +3992,7 @@ RESPONSE: ABC-12345 - ccReg-0913409657 + ccReg-5442967201 @@ -3905,7 +4006,7 @@ REQUEST: - FIRST0:SH401752550 + FIRST0:SH828429550 wrong-pw @@ -3927,7 +4028,7 @@ RESPONSE: ABC-12345 - ccReg-6286749211 + ccReg-5316232237 @@ -3973,7 +4074,7 @@ RESPONSE: ABC-12345 - ccReg-8291798513 + ccReg-9170407002 @@ -4021,7 +4122,7 @@ RESPONSE: ABC-12345 - ccReg-5404035767 + ccReg-5697070528 @@ -4035,7 +4136,7 @@ REQUEST: - FIRST0:SH401752550 + FIRST0:SH828429550 @@ -4057,20 +4158,20 @@ RESPONSE: - FIRST0:SH401752550 + FIRST0:SH828429550 EIS-1 - Gloria Boyer MD0 + Adell O'Connell0 registrar1 TEST-CREATOR - 2015-07-28T08:39:30Z + 2015-08-11T11:53:58Z ABC-12345 - ccReg-2003839888 + ccReg-9096756536 @@ -4116,7 +4217,7 @@ RESPONSE: ABC-12345 - ccReg-5982274752 + ccReg-0828079009 @@ -4162,7 +4263,7 @@ RESPONSE: ABC-12345 - ccReg-1309091299 + ccReg-3048546936 @@ -4178,7 +4279,7 @@ REQUEST: - example92166977555993338.ee + example95956441774481215.ee 1 @@ -4225,7 +4326,7 @@ RESPONSE: ABC-12345 - ccReg-0406877402 + ccReg-8436943426 @@ -4241,7 +4342,7 @@ REQUEST: - example81690264966073237.ee + example36499490920514040.ee 1 @@ -4297,7 +4398,7 @@ RESPONSE: ABC-12345 - ccReg-7250362476 + ccReg-9458458331 @@ -4341,7 +4442,7 @@ RESPONSE: ABC-12345 - ccReg-0791690819 + ccReg-0312397391 @@ -4357,7 +4458,7 @@ REQUEST: - example32543506110306742.ee + example41098418244018042.ee 1 @@ -4404,14 +4505,14 @@ RESPONSE: - example32543506110306742.ee - 2015-07-28T08:40:12Z - 2016-07-28T08:40:12Z + example41098418244018042.ee + 2015-08-11T11:54:39Z + 2016-08-11T11:54:39Z ABC-12345 - ccReg-3409698461 + ccReg-6617612080 @@ -4427,7 +4528,7 @@ REQUEST: - example36382345567850627.ee + example65312373017135527.ee 1 @@ -4466,14 +4567,14 @@ RESPONSE: - example36382345567850627.ee - 2015-07-28T08:40:12Z - 2016-07-28T08:40:12Z + example65312373017135527.ee + 2015-08-11T11:54:39Z + 2016-08-11T11:54:39Z ABC-12345 - ccReg-4473161202 + ccReg-1229745778 @@ -4489,14 +4590,14 @@ REQUEST: - example94744851802697081.ee + example89348353823075344.ee 1 - ns1.example94744851802697081.ee + ns1.example89348353823075344.ee - ns2.example94744851802697081.ee + ns2.example89348353823075344.ee FIXED:CITIZEN_1234 @@ -4534,7 +4635,7 @@ RESPONSE: ABC-12345 - ccReg-0945142666 + ccReg-4184179047 @@ -4597,7 +4698,7 @@ RESPONSE: ABC-12345 - ccReg-1975664747 + ccReg-9262976252 @@ -4660,7 +4761,7 @@ RESPONSE: ABC-12345 - ccReg-1640127046 + ccReg-3870597963 @@ -4724,7 +4825,7 @@ RESPONSE: ABC-12345 - ccReg-2908502858 + ccReg-5039734544 @@ -4791,13 +4892,13 @@ RESPONSE: 1162.ee - 2015-07-28T08:40:17Z - 2016-07-28T08:40:17Z + 2015-08-11T11:54:44Z + 2016-08-11T11:54:44Z ABC-12345 - ccReg-0275498048 + ccReg-9326300859 @@ -4855,15 +4956,15 @@ RESPONSE: - - Domain name is blocked [name_dirty] + + Data management policy violation: Domain name is blocked [name] ftp.ee ABC-12345 - ccReg-9470981751 + ccReg-0435453253 @@ -4879,7 +4980,7 @@ REQUEST: - example62168642411513599.ee + example39938014756398389.ee 1 @@ -4922,7 +5023,7 @@ RESPONSE: ABC-12345 - ccReg-0968519360 + ccReg-6770301273 @@ -4938,7 +5039,7 @@ REQUEST: - example71800352143417997.ee + example51056249191798470.ee 1 FIXED:CITIZEN_1234 FIXED:SH8013 @@ -4978,7 +5079,7 @@ RESPONSE: ABC-12345 - ccReg-7839854930 + ccReg-5945666312 @@ -4994,7 +5095,7 @@ REQUEST: - example71680402331588779.ee + example92106127815766703.ee 1 @@ -5075,7 +5176,7 @@ RESPONSE: ABC-12345 - ccReg-3550426764 + ccReg-9078085118 @@ -5091,7 +5192,7 @@ REQUEST: - example68109979538689428.ee + example99991222910237006.ee 1 @@ -5145,7 +5246,7 @@ RESPONSE: ABC-12345 - ccReg-3024443751 + ccReg-8892994384 @@ -5161,7 +5262,7 @@ REQUEST: - example76831955690582435.ee + example25089417819765873.ee 1 ns1.example.ee @@ -5202,7 +5303,7 @@ RESPONSE: ABC-12345 - ccReg-6323264384 + ccReg-5174942352 @@ -5218,7 +5319,7 @@ REQUEST: - example32514723684684037.ee + example29956310300538261.ee 1 @@ -5260,14 +5361,14 @@ RESPONSE: - example32514723684684037.ee - 2015-07-28T08:40:23Z - 2016-07-28T08:40:23Z + example29956310300538261.ee + 2015-08-11T11:54:51Z + 2016-08-11T11:54:51Z ABC-12345 - ccReg-5056598055 + ccReg-5456107878 @@ -5283,7 +5384,7 @@ REQUEST: - example40338285586899571.ee + example83118712448109400.ee 1 @@ -5334,7 +5435,7 @@ RESPONSE: ABC-12345 - ccReg-0826897719 + ccReg-0920572204 @@ -5350,7 +5451,7 @@ REQUEST: - example66186778295502856.ee + example33790642820062255.ee 365 @@ -5397,14 +5498,14 @@ RESPONSE: - example66186778295502856.ee - 2015-07-28T08:40:25Z - 2016-07-28T08:40:25Z + example33790642820062255.ee + 2015-08-11T11:54:52Z + 2016-08-11T11:54:52Z ABC-12345 - ccReg-1614664137 + ccReg-8870266468 @@ -5420,7 +5521,7 @@ REQUEST: - example91954080942379032.ee + example67780502006773133.ee 2 @@ -5467,14 +5568,14 @@ RESPONSE: - example91954080942379032.ee - 2015-07-28T08:40:25Z - 2017-07-28T08:40:25Z + example67780502006773133.ee + 2015-08-11T11:54:52Z + 2017-08-11T11:54:52Z ABC-12345 - ccReg-4703652719 + ccReg-6433181781 @@ -5490,7 +5591,7 @@ REQUEST: - example30928593583996919.ee + example44281759994524000.ee 36 @@ -5537,14 +5638,14 @@ RESPONSE: - example30928593583996919.ee - 2015-07-28T08:40:26Z - 2018-07-28T08:40:26Z + example44281759994524000.ee + 2015-08-11T11:54:53Z + 2018-08-11T11:54:53Z ABC-12345 - ccReg-7270105536 + ccReg-5571781200 @@ -5560,7 +5661,7 @@ REQUEST: - example46362933949869671.ee + example66964589593603082.ee ns1.example.net @@ -5606,14 +5707,14 @@ RESPONSE: - example46362933949869671.ee - 2015-07-28T08:40:26Z - 2016-07-28T08:40:26Z + example66964589593603082.ee + 2015-08-11T11:54:53Z + 2016-08-11T11:54:53Z ABC-12345 - ccReg-1881376659 + ccReg-2547938752 @@ -5629,7 +5730,7 @@ REQUEST: - example11714535017331079.ee + example23535744421817439.ee 367 @@ -5679,7 +5780,7 @@ RESPONSE: ABC-12345 - ccReg-5484931345 + ccReg-9162816785 @@ -5695,7 +5796,7 @@ REQUEST: - example12063060146758107.ee + example23286870139469348.ee 1 @@ -5745,7 +5846,7 @@ RESPONSE: ABC-12345 - ccReg-8109184091 + ccReg-3488863467 @@ -5759,7 +5860,7 @@ REQUEST: - example22134060080142573.ee + example75186835336151620.ee 1 @@ -5809,7 +5910,7 @@ RESPONSE: ABC-12345 - ccReg-6082364829 + ccReg-6955477457 @@ -5825,7 +5926,7 @@ REQUEST: - example81422504470924299.ee + example49838956314740546.ee 1 @@ -5884,14 +5985,14 @@ RESPONSE: - example81422504470924299.ee - 2015-07-28T08:40:30Z - 2016-07-28T08:40:30Z + example49838956314740546.ee + 2015-08-11T11:54:57Z + 2016-08-11T11:54:57Z ABC-12345 - ccReg-1274053409 + ccReg-3975282652 @@ -5907,7 +6008,7 @@ REQUEST: - example52530934380418051.ee + example12885310810259783.ee 1 @@ -5969,7 +6070,7 @@ RESPONSE: ABC-12345 - ccReg-0039779987 + ccReg-9621270982 @@ -5983,7 +6084,7 @@ REQUEST: - example6111657126731846.ee + example76366275886530462.ee 1 @@ -6075,7 +6176,7 @@ RESPONSE: ABC-12345 - ccReg-5415301002 + ccReg-2852166470 @@ -6091,7 +6192,7 @@ REQUEST: - example59960668723180884.ee + example50792045522631645.ee 1 @@ -6147,7 +6248,7 @@ RESPONSE: ABC-12345 - ccReg-3029612280 + ccReg-4544925351 @@ -6163,7 +6264,7 @@ REQUEST: - example96012563680688440.ee + example33131074878956347.ee 1 @@ -6216,7 +6317,7 @@ RESPONSE: ABC-12345 - ccReg-0186058439 + ccReg-3093561380 @@ -6232,7 +6333,7 @@ REQUEST: - example76656279799751526.ee + example50489697149207160.ee 1 @@ -6279,14 +6380,14 @@ RESPONSE: - example76656279799751526.ee - 2015-07-28T08:40:35Z - 2016-07-28T08:40:35Z + example50489697149207160.ee + 2015-08-11T11:55:01Z + 2016-08-11T11:55:01Z ABC-12345 - ccReg-2063281633 + ccReg-5861716362 @@ -6302,7 +6403,7 @@ REQUEST: - example70580501288966544.ee + example40308503479082638.ee 1 @@ -6355,14 +6456,14 @@ RESPONSE: - example70580501288966544.ee - 2015-07-28T08:40:35Z - 2016-07-28T08:40:35Z + example40308503479082638.ee + 2015-08-11T11:55:02Z + 2016-08-11T11:55:02Z ABC-12345 - ccReg-4381859223 + ccReg-9793298475 @@ -6378,7 +6479,7 @@ REQUEST: - example95275486168393163.ee + example50735151990715294.ee 1 @@ -6431,7 +6532,7 @@ RESPONSE: ABC-12345 - ccReg-3354909144 + ccReg-2538777510 @@ -6447,7 +6548,7 @@ REQUEST: - example97367469702829730.ee + example16812641166048993.ee 1 @@ -6494,7 +6595,7 @@ RESPONSE: ABC-12345 - ccReg-8644792351 + ccReg-3495549455 @@ -6510,7 +6611,7 @@ REQUEST: - example70071198549943103.ee + example22021081880584996.ee 1 @@ -6563,7 +6664,7 @@ RESPONSE: ABC-12345 - ccReg-8173091592 + ccReg-3343130414 @@ -6579,7 +6680,7 @@ REQUEST: - example22431835510518513.ee + example6073069410185410.ee 1 @@ -6624,14 +6725,14 @@ RESPONSE: - example22431835510518513.ee - 2015-07-28T08:40:39Z - 2016-07-28T08:40:39Z + example6073069410185410.ee + 2015-08-11T11:55:05Z + 2016-08-11T11:55:05Z ABC-12345 - ccReg-2819985278 + ccReg-3861156552 @@ -6647,7 +6748,7 @@ REQUEST: - example59566819674530307.ee + example52106871088693975.ee 1 @@ -6692,7 +6793,7 @@ RESPONSE: ABC-12345 - ccReg-6708083266 + ccReg-0039198223 @@ -6708,7 +6809,7 @@ REQUEST: - example72083543502407430.ee + example56559769086909790.ee 1 @@ -6756,7 +6857,7 @@ RESPONSE: ABC-12345 - ccReg-7325897703 + ccReg-7911712466 @@ -6804,7 +6905,7 @@ RESPONSE: ABC-12345 - ccReg-4047445422 + ccReg-7145621242 @@ -6820,7 +6921,7 @@ REQUEST: domain1.ee - 512701cc6a8455e43612526cfd613ef1 + 22f7e8ef0096471c89cd111e3526bfec @@ -6848,15 +6949,15 @@ RESPONSE: domain1.ee serverApproved REGDOMAIN2 - 2015-07-28T08:40:42Z + 2015-08-11T11:55:08Z REGDOMAIN1 - 2015-07-28T08:40:42Z - 2016-07-28T08:40:41Z + 2015-08-11T11:55:08Z + 2016-08-11T11:55:08Z ABC-12345 - ccReg-2882098037 + ccReg-0598996094 @@ -6902,7 +7003,7 @@ RESPONSE: ABC-12345 - ccReg-4020170558 + ccReg-2129626529 @@ -6930,23 +7031,23 @@ RESPONSE: Command completed successfully; ack to dequeue - 2015-07-28T08:40:42Z - Domain transfer was approved, associated contacts were: ["FIXED:SH0465812013", "FIXED:SH3835271712"] and registrant was FIXED:REGISTRANT779976690 + 2015-08-11T11:55:08Z + Domain transfer was approved, associated contacts were: ["FIXED:SH1877813513", "FIXED:SH9602273212"] and registrant was FIXED:REGISTRANT227422540 domain1.ee serverApproved REGDOMAIN2 - 2015-07-28T08:40:42Z + 2015-08-11T11:55:08Z REGDOMAIN1 - 2015-07-28T08:40:42Z - 2016-07-28T08:40:41Z + 2015-08-11T11:55:08Z + 2016-08-11T11:55:08Z ABC-12345 - ccReg-2433533762 + ccReg-2870614930 @@ -6958,19 +7059,7 @@ REQUEST: - - - domain1.ee - - 3c706b7554d122c07c3a96255b62f728 - - - - - - dGVzdCBmYWlsCg== - - + ABC-12345 @@ -6985,330 +7074,10 @@ RESPONSE: Command completed successfully - - - domain1.ee - pending - REGDOMAIN1 - 2015-07-28T08:40:42Z - REGDOMAIN2 - 2015-07-28T09:40:42Z - 2016-07-28T08:40:41Z - - + ABC-12345 - ccReg-9163815770 - - - -``` - -REQUEST: - -```xml - - - - - - domain1.ee - - 3c706b7554d122c07c3a96255b62f728 - - - - - - dGVzdCBmYWlsCg== - - - ABC-12345 - - -``` - -RESPONSE: - -```xml - - - - - Command completed successfully - - - - domain1.ee - pending - REGDOMAIN1 - 2015-07-28T08:40:42Z - REGDOMAIN2 - 2015-07-28T09:40:42Z - 2016-07-28T08:40:41Z - - - - ABC-12345 - ccReg-1344906774 - - - -``` - -REQUEST: - -```xml - - - - - registrar2 - ghyt9e4fu - - 1.0 - en - - - https://epp.tld.ee/schema/domain-eis-1.0.xsd - https://epp.tld.ee/schema/contact-eis-1.0.xsd - urn:ietf:params:xml:ns:host-1.0 - urn:ietf:params:xml:ns:keyrelay-1.0 - - urn:ietf:params:xml:ns:secDNS-1.1 - https://epp.tld.ee/schema/eis-1.0.xsd - - - - ABC-12345 - - -``` - -RESPONSE: - -```xml - - - - - Command completed successfully - - - ABC-12345 - ccReg-2023826073 - - - -``` - -REQUEST: - -```xml - - - - - ABC-12345 - - -``` - -RESPONSE: - -```xml - - - - - Command completed successfully; ack to dequeue - - - 2015-07-28T08:40:42Z - Transfer requested. - - - - domain1.ee - pending - REGDOMAIN1 - 2015-07-28T08:40:42Z - REGDOMAIN2 - 2015-07-28T09:40:42Z - 2016-07-28T08:40:41Z - - - - ABC-12345 - ccReg-1404467939 - - - -``` - -REQUEST: - -```xml - - - - - registrar1 - ghyt9e4fu - - 1.0 - en - - - https://epp.tld.ee/schema/domain-eis-1.0.xsd - https://epp.tld.ee/schema/contact-eis-1.0.xsd - urn:ietf:params:xml:ns:host-1.0 - urn:ietf:params:xml:ns:keyrelay-1.0 - - urn:ietf:params:xml:ns:secDNS-1.1 - https://epp.tld.ee/schema/eis-1.0.xsd - - - - ABC-12345 - - -``` - -RESPONSE: - -```xml - - - - - Command completed successfully - - - ABC-12345 - ccReg-8545555548 - - - -``` - -REQUEST: - -```xml - - - - - registrar2 - ghyt9e4fu - - 1.0 - en - - - https://epp.tld.ee/schema/domain-eis-1.0.xsd - https://epp.tld.ee/schema/contact-eis-1.0.xsd - urn:ietf:params:xml:ns:host-1.0 - urn:ietf:params:xml:ns:keyrelay-1.0 - - urn:ietf:params:xml:ns:secDNS-1.1 - https://epp.tld.ee/schema/eis-1.0.xsd - - - - ABC-12345 - - -``` - -RESPONSE: - -```xml - - - - - Command completed successfully - - - ABC-12345 - ccReg-8253885703 - - - -``` - -REQUEST: - -```xml - - - - - ABC-12345 - - -``` - -RESPONSE: - -```xml - - - - - Command completed successfully - - - - ABC-12345 - ccReg-3483466836 - - - -``` - -REQUEST: - -```xml - - - - - registrar1 - ghyt9e4fu - - 1.0 - en - - - https://epp.tld.ee/schema/domain-eis-1.0.xsd - https://epp.tld.ee/schema/contact-eis-1.0.xsd - urn:ietf:params:xml:ns:host-1.0 - urn:ietf:params:xml:ns:keyrelay-1.0 - - urn:ietf:params:xml:ns:secDNS-1.1 - https://epp.tld.ee/schema/eis-1.0.xsd - - - - ABC-12345 - - -``` - -RESPONSE: - -```xml - - - - - Command completed successfully - - - ABC-12345 - ccReg-4285977126 + ccReg-7574478981 @@ -7356,7 +7125,7 @@ RESPONSE: ABC-12345 - ccReg-4057108889 + ccReg-3485024523 @@ -7372,7 +7141,7 @@ REQUEST: domain2.ee - 5d98f2cbe11306469ce55447e995a1c4 + 93724d15456623b8f6aeb257b00450c1 @@ -7398,17 +7167,17 @@ RESPONSE: domain2.ee - pending + serverApproved REGDOMAIN2 - 2015-07-28T08:40:43Z + 2015-08-11T11:55:09Z REGDOMAIN1 - 2015-07-28T09:40:43Z - 2016-07-28T08:40:43Z + 2015-08-11T11:55:09Z + 2016-08-11T11:55:08Z ABC-12345 - ccReg-4612548825 + ccReg-6805791315 @@ -7454,7 +7223,7 @@ RESPONSE: ABC-12345 - ccReg-4051705615 + ccReg-4275952981 @@ -7500,7 +7269,7 @@ RESPONSE: ABC-12345 - ccReg-1410613698 + ccReg-7987485087 @@ -7516,7 +7285,7 @@ REQUEST: domain2.ee - 5d98f2cbe11306469ce55447e995a1c4 + 93724d15456623b8f6aeb257b00450c1 @@ -7536,23 +7305,12 @@ RESPONSE: - - Command completed successfully + + Authorization error - - - domain2.ee - pending - REGDOMAIN2 - 2015-07-28T08:40:43Z - REGDOMAIN1 - 2015-07-28T09:40:43Z - 2016-07-28T08:40:43Z - - ABC-12345 - ccReg-2313898331 + ccReg-9036229459 @@ -7598,7 +7356,7 @@ RESPONSE: ABC-12345 - ccReg-5075928895 + ccReg-1240024032 @@ -7646,7 +7404,7 @@ RESPONSE: ABC-12345 - ccReg-8432415801 + ccReg-9098619557 @@ -7662,7 +7420,7 @@ REQUEST: domain3.ee - d21cc5784da4f1cd0a69ebccd64ea825 + 7c54d1dfea0df2312afa777675f61b8c @@ -7685,15 +7443,15 @@ RESPONSE: domain3.ee serverApproved REGDOMAIN2 - 2015-07-28T08:40:44Z + 2015-08-11T11:55:09Z REGDOMAIN1 - 2015-07-28T08:40:44Z - 2016-07-28T08:40:44Z + 2015-08-11T11:55:09Z + 2016-08-11T11:55:09Z ABC-12345 - ccReg-8319808701 + ccReg-5266624324 @@ -7739,7 +7497,7 @@ RESPONSE: ABC-12345 - ccReg-3709709960 + ccReg-4244053147 @@ -7787,7 +7545,7 @@ RESPONSE: ABC-12345 - ccReg-7289638867 + ccReg-1145113468 @@ -7803,7 +7561,7 @@ REQUEST: domain4.ee - c542d3f99353e1d042716d824f6fec12 + 5631abbafc7550e96e3e5736b0e9eaac @@ -7826,15 +7584,15 @@ RESPONSE: domain4.ee serverApproved REGDOMAIN2 - 2015-07-28T08:40:45Z + 2015-08-11T11:55:10Z REGDOMAIN1 - 2015-07-28T08:40:45Z - 2016-07-28T08:40:45Z + 2015-08-11T11:55:10Z + 2016-08-11T11:55:10Z ABC-12345 - ccReg-6544417100 + ccReg-2690357600 @@ -7880,7 +7638,7 @@ RESPONSE: ABC-12345 - ccReg-9728924318 + ccReg-8532612089 @@ -7928,7 +7686,7 @@ RESPONSE: ABC-12345 - ccReg-4703756087 + ccReg-0745479379 @@ -7944,7 +7702,7 @@ REQUEST: domain5.ee - d4bf9e0bc0fd09c7252541a194473cec + 04dbcd87852c667ee8fd0c8ffb957e37 @@ -7967,15 +7725,15 @@ RESPONSE: domain5.ee serverApproved REGDOMAIN2 - 2015-07-28T08:40:46Z + 2015-08-11T11:55:11Z REGDOMAIN1 - 2015-07-28T08:40:46Z - 2016-07-28T08:40:46Z + 2015-08-11T11:55:11Z + 2016-08-11T11:55:11Z ABC-12345 - ccReg-1877217438 + ccReg-6667852304 @@ -8021,7 +7779,7 @@ RESPONSE: ABC-12345 - ccReg-3796353322 + ccReg-4285327571 @@ -8069,7 +7827,7 @@ RESPONSE: ABC-12345 - ccReg-3792624699 + ccReg-6493678819 @@ -8085,7 +7843,7 @@ REQUEST: domain8.ee - 0bd19effb6079c4790d1475bd0199723 + 59b5dc1ad087fcbe5991cfe5ba28e06f @@ -8108,15 +7866,15 @@ RESPONSE: domain8.ee serverApproved REGDOMAIN2 - 2015-07-28T08:40:47Z + 2015-08-11T11:55:12Z REGDOMAIN1 - 2015-07-28T08:40:47Z - 2016-07-28T08:40:46Z + 2015-08-11T11:55:12Z + 2016-08-11T11:55:12Z ABC-12345 - ccReg-2654465761 + ccReg-0151424412 @@ -8162,7 +7920,7 @@ RESPONSE: ABC-12345 - ccReg-9967282082 + ccReg-3294109763 @@ -8210,7 +7968,7 @@ RESPONSE: ABC-12345 - ccReg-7212461778 + ccReg-8744928434 @@ -8226,7 +7984,7 @@ REQUEST: domain9.ee - 10eadc71cf7e6f1e87e1bf54bc99e263 + 3c48b5439c82db073370596ddb5ba199 @@ -8249,15 +8007,15 @@ RESPONSE: domain9.ee serverApproved REGDOMAIN2 - 2015-07-28T08:40:48Z + 2015-08-11T11:55:13Z REGDOMAIN1 - 2015-07-28T08:40:48Z - 2016-07-28T08:40:47Z + 2015-08-11T11:55:13Z + 2016-08-11T11:55:13Z ABC-12345 - ccReg-1877104282 + ccReg-8506851943 @@ -8303,7 +8061,7 @@ RESPONSE: ABC-12345 - ccReg-6337086891 + ccReg-6166041451 @@ -8351,7 +8109,7 @@ RESPONSE: ABC-12345 - ccReg-0660234392 + ccReg-2599921516 @@ -8367,7 +8125,7 @@ REQUEST: domain11.ee - 5d943994996a6a851e7247db3d2c1c4a + 9b20daba8ec3c362783fe7969ac83b04 @@ -8390,15 +8148,15 @@ RESPONSE: domain11.ee serverApproved REGDOMAIN2 - 2015-07-28T08:40:48Z + 2015-08-11T11:55:14Z REGDOMAIN1 - 2015-07-28T08:40:48Z - 2016-07-28T08:40:48Z + 2015-08-11T11:55:14Z + 2016-08-11T11:55:13Z ABC-12345 - ccReg-9157975420 + ccReg-7432784653 @@ -8444,7 +8202,7 @@ RESPONSE: ABC-12345 - ccReg-6402981411 + ccReg-9617529453 @@ -8492,7 +8250,7 @@ RESPONSE: ABC-12345 - ccReg-4407801058 + ccReg-3374688656 @@ -8508,7 +8266,7 @@ REQUEST: domain14.ee - 75065639f9945045256b9c5fe2a8fadc + 8c1bde6bb8b265951bb44ba26a5fcfdd @@ -8531,15 +8289,15 @@ RESPONSE: domain14.ee serverApproved REGDOMAIN2 - 2015-07-28T08:40:49Z + 2015-08-11T11:55:14Z REGDOMAIN1 - 2015-07-28T08:40:49Z - 2016-07-28T08:40:49Z + 2015-08-11T11:55:14Z + 2016-08-11T11:55:14Z ABC-12345 - ccReg-9637117596 + ccReg-5971983303 @@ -8585,7 +8343,7 @@ RESPONSE: ABC-12345 - ccReg-0421936954 + ccReg-0354959229 @@ -8633,7 +8391,7 @@ RESPONSE: ABC-12345 - ccReg-8532719762 + ccReg-5074830148 @@ -8649,7 +8407,7 @@ REQUEST: domain15.ee - e6349b913cb0788975f93a02ba220510 + dfb460a50d569d15cb5dfec1e28dfa4b @@ -8672,15 +8430,15 @@ RESPONSE: domain15.ee serverApproved REGDOMAIN2 - 2015-07-28T08:40:50Z + 2015-08-11T11:55:15Z REGDOMAIN1 - 2015-07-28T08:40:50Z - 2016-07-28T08:40:50Z + 2015-08-11T11:55:15Z + 2016-08-11T11:55:15Z ABC-12345 - ccReg-1495969172 + ccReg-0446599269 @@ -8726,7 +8484,7 @@ RESPONSE: ABC-12345 - ccReg-1225162463 + ccReg-3899474830 @@ -8774,7 +8532,7 @@ RESPONSE: ABC-12345 - ccReg-5138326156 + ccReg-5107128349 @@ -8810,7 +8568,7 @@ RESPONSE: ABC-12345 - ccReg-9171426317 + ccReg-2956409472 @@ -8856,7 +8614,7 @@ RESPONSE: ABC-12345 - ccReg-2262790683 + ccReg-8062552401 @@ -8874,7 +8632,7 @@ REQUEST: domain17.ee - d0d6f5f660ba9b1cb777074e05c9f9d5 + 36e43cb473f9c84fa062f7c0140a6c27 @@ -8902,15 +8660,15 @@ RESPONSE: domain17.ee clientApproved REGDOMAIN2 - 2015-07-28T08:40:51Z + 2015-08-11T11:55:15Z REGDOMAIN1 - 2015-07-28T08:40:51Z - 2016-07-28T08:40:51Z + 2015-08-11T11:55:15Z + 2016-08-11T11:55:15Z ABC-12345 - ccReg-2925262739 + ccReg-1731534669 @@ -8958,7 +8716,7 @@ RESPONSE: ABC-12345 - ccReg-2033369372 + ccReg-2855459641 @@ -8974,7 +8732,7 @@ REQUEST: domain18.ee - f40c17f5451f5c80e562bf9250ccd4d2 + 3b4848b958d2fd92b9ff4e57aaf64d1c @@ -8999,7 +8757,7 @@ RESPONSE: ABC-12345 - ccReg-7553628884 + ccReg-4418967428 @@ -9045,7 +8803,7 @@ RESPONSE: ABC-12345 - ccReg-8494729995 + ccReg-6054605262 @@ -9061,7 +8819,7 @@ REQUEST: domain18.ee - f40c17f5451f5c80e562bf9250ccd4d2 + 3b4848b958d2fd92b9ff4e57aaf64d1c @@ -9089,15 +8847,15 @@ RESPONSE: domain18.ee clientRejected REGDOMAIN2 - 2015-07-28T08:40:51Z + 2015-08-11T11:55:16Z REGDOMAIN1 - 2015-07-28T08:40:51Z - 2016-07-28T08:40:51Z + 2015-08-11T11:55:16Z + 2016-08-11T11:55:16Z ABC-12345 - ccReg-0035055015 + ccReg-0721272063 @@ -9145,7 +8903,7 @@ RESPONSE: ABC-12345 - ccReg-8757184492 + ccReg-7872048381 @@ -9161,7 +8919,7 @@ REQUEST: domain19.ee - 619c6d2109ee1b2deca3674b73619fda + d1ee6ab75f56acd328d548920230fd7f @@ -9186,7 +8944,7 @@ RESPONSE: ABC-12345 - ccReg-4815280002 + ccReg-8416351931 @@ -9232,7 +8990,7 @@ RESPONSE: ABC-12345 - ccReg-2650484631 + ccReg-0109476397 @@ -9275,7 +9033,7 @@ RESPONSE: ABC-12345 - ccReg-1473008535 + ccReg-9271730314 @@ -9293,7 +9051,7 @@ REQUEST: domain21.ee - fd06d8982dbdecde7e39f41d7f278c7d + d518e6d743362fd164b61d3266689ef9 @@ -9318,7 +9076,7 @@ RESPONSE: ABC-12345 - ccReg-0989479481 + ccReg-9842488474 @@ -9334,7 +9092,7 @@ REQUEST: - example44755290217170574.ee + example55687516553954347.ee 98oiewslkfkd @@ -9359,7 +9117,7 @@ RESPONSE: ABC-12345 - ccReg-7927987439 + ccReg-9686106085 @@ -9407,7 +9165,7 @@ RESPONSE: ABC-12345 - ccReg-2792059598 + ccReg-7881280571 @@ -9423,7 +9181,7 @@ REQUEST: domain22.ee - d7aa8aba40bf70cb78dfebc9474664b2 + 67abb90c2173f935c9c027eaaf390c1f @@ -9451,15 +9209,15 @@ RESPONSE: domain22.ee serverApproved REGDOMAIN2 - 2015-07-28T08:40:57Z + 2015-08-11T11:55:21Z REGDOMAIN1 - 2015-07-28T08:40:57Z - 2016-07-28T08:40:57Z + 2015-08-11T11:55:21Z + 2016-08-11T11:55:21Z ABC-12345 - ccReg-0573122351 + ccReg-5808219238 @@ -9475,7 +9233,7 @@ REQUEST: domain22.ee - d7aa8aba40bf70cb78dfebc9474664b2 + 67abb90c2173f935c9c027eaaf390c1f @@ -9500,7 +9258,7 @@ RESPONSE: ABC-12345 - ccReg-0832624566 + ccReg-6385015232 @@ -9546,7 +9304,7 @@ RESPONSE: ABC-12345 - ccReg-8225650710 + ccReg-6947473842 @@ -9564,7 +9322,7 @@ REQUEST: domain23.ee - 2c47c46daf97e12ddc0d9fc80da511d0 + e369bda5c6a263f3fadc6c68f19c0063 @@ -9589,7 +9347,7 @@ RESPONSE: ABC-12345 - ccReg-2025440519 + ccReg-0492735137 @@ -9607,7 +9365,7 @@ REQUEST: domain24.ee - 9bbf18edcc83fb42ddf249dc1f3e42af + 74042f7e28ba757ca91256d11782f218 @@ -9627,299 +9385,7 @@ RESPONSE: ABC-12345 - ccReg-8629472751 - - - -``` - -### EPP Domain with valid domain should allow querying domain transfer - -REQUEST: - -```xml - - - - - registrar2 - ghyt9e4fu - - 1.0 - en - - - https://epp.tld.ee/schema/domain-eis-1.0.xsd - https://epp.tld.ee/schema/contact-eis-1.0.xsd - urn:ietf:params:xml:ns:host-1.0 - urn:ietf:params:xml:ns:keyrelay-1.0 - - urn:ietf:params:xml:ns:secDNS-1.1 - https://epp.tld.ee/schema/eis-1.0.xsd - - - - ABC-12345 - - -``` - -RESPONSE: - -```xml - - - - - Command completed successfully - - - ABC-12345 - ccReg-7696022252 - - - -``` - -REQUEST: - -```xml - - - - - - domain25.ee - - 0935877a40fea9441ffd17fee6c0e7d8 - - - - - - dGVzdCBmYWlsCg== - - - ABC-12345 - - -``` - -RESPONSE: - -```xml - - - - - Command completed successfully - - - - domain25.ee - pending - REGDOMAIN2 - 2015-07-28T08:41:00Z - REGDOMAIN1 - 2015-07-28T09:41:00Z - 2016-07-28T08:41:00Z - - - - ABC-12345 - ccReg-7042077941 - - - -``` - -REQUEST: - -```xml - - - - - - domain25.ee - - 0935877a40fea9441ffd17fee6c0e7d8 - - - - ABC-12345 - - -``` - -RESPONSE: - -```xml - - - - - Command completed successfully - - - - domain25.ee - pending - REGDOMAIN2 - 2015-07-28T08:41:00Z - REGDOMAIN1 - 2015-07-28T09:41:00Z - 2016-07-28T08:41:00Z - - - - ABC-12345 - ccReg-4814615747 - - - -``` - -REQUEST: - -```xml - - - - - registrar1 - ghyt9e4fu - - 1.0 - en - - - https://epp.tld.ee/schema/domain-eis-1.0.xsd - https://epp.tld.ee/schema/contact-eis-1.0.xsd - urn:ietf:params:xml:ns:host-1.0 - urn:ietf:params:xml:ns:keyrelay-1.0 - - urn:ietf:params:xml:ns:secDNS-1.1 - https://epp.tld.ee/schema/eis-1.0.xsd - - - - ABC-12345 - - -``` - -RESPONSE: - -```xml - - - - - Command completed successfully - - - ABC-12345 - ccReg-6824308586 - - - -``` - -REQUEST: - -```xml - - - - - - domain25.ee - - 0935877a40fea9441ffd17fee6c0e7d8 - - - - - - dGVzdCBmYWlsCg== - - - ABC-12345 - - -``` - -RESPONSE: - -```xml - - - - - Command completed successfully - - - - domain25.ee - clientApproved - REGDOMAIN2 - 2015-07-28T08:41:00Z - REGDOMAIN1 - 2015-07-28T08:41:00Z - 2016-07-28T08:41:00Z - - - - ABC-12345 - ccReg-2690846279 - - - -``` - -REQUEST: - -```xml - - - - - - domain25.ee - - 665baee3468e834243928ce917ecc3ef - - - - ABC-12345 - - -``` - -RESPONSE: - -```xml - - - - - Command completed successfully - - - - domain25.ee - clientApproved - REGDOMAIN2 - 2015-07-28T08:41:00Z - REGDOMAIN1 - 2015-07-28T08:41:00Z - 2016-07-28T08:41:00Z - - - - ABC-12345 - ccReg-9400606855 + ccReg-0081798294 @@ -9967,7 +9433,7 @@ RESPONSE: ABC-12345 - ccReg-1604970396 + ccReg-6625933830 @@ -9981,10 +9447,10 @@ REQUEST: - domain26.ee + domain25.ee 1 - e0c3f74927da4bb3eee5667c66115352 + f668fe2ea4255d41310163771be05c3a @@ -10007,7 +9473,7 @@ RESPONSE: ABC-12345 - ccReg-8617519056 + ccReg-1429364526 @@ -10053,7 +9519,7 @@ RESPONSE: ABC-12345 - ccReg-1118050637 + ccReg-1751119123 @@ -10069,7 +9535,7 @@ REQUEST: - domain27.ee + domain26.ee FIXED:CITIZEN_1234 @@ -10097,7 +9563,7 @@ RESPONSE: ABC-12345 - ccReg-2670008628 + ccReg-6751900694 @@ -10113,7 +9579,7 @@ REQUEST: - domain28.ee + domain27.ee FIXED:CITIZEN_1234 @@ -10141,7 +9607,7 @@ RESPONSE: ABC-12345 - ccReg-8289277865 + ccReg-9775763247 @@ -10157,17 +9623,17 @@ REQUEST: - domain29.ee + domain28.ee - ns.bernhard89.ee + ns.ondricka84.ee - ns.effertzebert88.ee + ns.oconnell85.ee - ns.ondrickajakubowski87.ee + ns.wolff86.ee @@ -10198,7 +9664,7 @@ RESPONSE: ABC-12345 - ccReg-1648208045 + ccReg-8193078533 @@ -10208,6 +9674,50 @@ RESPONSE: REQUEST: +```xml + + + + + + domain29.ee + + FIXED:CITIZEN_1234 + + + + + + + dGVzdCBmYWlsCg== + + + ABC-12345 + + +``` + +RESPONSE: + +```xml + + + + + Nameservers count must be between 2-11 [nameservers] + + + ABC-12345 + ccReg-7770119639 + + + +``` + +### EPP Domain with valid domain should not allow any update when status pending update + +REQUEST: + ```xml @@ -10237,18 +9747,18 @@ RESPONSE: - - Nameservers count must be between 2-11 [nameservers] + + Object status prohibits operation ABC-12345 - ccReg-5575143855 + ccReg-1506907458 ``` -### EPP Domain with valid domain should not allow any update when status pending update +### EPP Domain with valid domain should not allow any update when status force delete REQUEST: @@ -10286,7 +9796,7 @@ RESPONSE: ABC-12345 - ccReg-7420673440 + ccReg-4941877020 @@ -10355,7 +9865,7 @@ RESPONSE: ABC-12345 - ccReg-5413112744 + ccReg-9371256889 @@ -10419,7 +9929,7 @@ RESPONSE: ABC-12345 - ccReg-3340757346 + ccReg-2822952906 @@ -10481,13 +9991,13 @@ RESPONSE: Nameserver already exists on this domain [hostname] - ns2.example.com + ns1.example.com Nameserver already exists on this domain [hostname] - ns1.example.com + ns2.example.com @@ -10499,18 +10009,18 @@ RESPONSE: Public key already exists [public_key] - 700b97b591ed27ec2590d19f06f88bba700b97b591ed27ec2590d19f + 841936717ae427ace63c28d04918569a841936717ae427ace63c28d0 Public key already exists [public_key] - 841936717ae427ace63c28d04918569a841936717ae427ace63c28d0 + 700b97b591ed27ec2590d19f06f88bba700b97b591ed27ec2590d19f ABC-12345 - ccReg-2640140355 + ccReg-9115010550 @@ -10585,7 +10095,7 @@ RESPONSE: ABC-12345 - ccReg-7630828881 + ccReg-9593704075 @@ -10655,7 +10165,7 @@ RESPONSE: ABC-12345 - ccReg-4914897472 + ccReg-3366912413 @@ -10694,7 +10204,7 @@ RESPONSE: ABC-12345 - ccReg-1063100515 + ccReg-5904323751 @@ -10760,7 +10270,7 @@ RESPONSE: ABC-12345 - ccReg-6247129672 + ccReg-7006132836 @@ -10814,7 +10324,7 @@ RESPONSE: ABC-12345 - ccReg-1536077793 + ccReg-2164010902 @@ -10889,7 +10399,7 @@ RESPONSE: ABC-12345 - ccReg-9074810399 + ccReg-3122413442 @@ -10930,7 +10440,7 @@ RESPONSE: ABC-12345 - ccReg-6433694543 + ccReg-8442543391 @@ -10950,10 +10460,10 @@ REQUEST: - ns.westemmerich108.ee + ns.pacocha108.ee - FIXED:SH2488479285 + FIXED:SH6764575385 @@ -10973,7 +10483,7 @@ RESPONSE: ABC-12345 - ccReg-2752561257 + ccReg-6803494102 @@ -10991,10 +10501,10 @@ REQUEST: - ns.westemmerich108.ee + ns.pacocha108.ee - FIXED:SH2488479285 + FIXED:SH6764575385 @@ -11012,18 +10522,18 @@ RESPONSE: Nameserver already exists on this domain [hostname] - ns.westemmerich108.ee + ns.pacocha108.ee Contact already exists on this domain [contact_code_cache] - FIXED:SH2488479285 + FIXED:SH6764575385 ABC-12345 - ccReg-9298371804 + ccReg-5929738624 @@ -11061,7 +10571,7 @@ RESPONSE: ABC-12345 - ccReg-4198817730 + ccReg-6694675619 @@ -11102,7 +10612,7 @@ RESPONSE: ABC-12345 - ccReg-8053378605 + ccReg-0685931406 @@ -11119,7 +10629,7 @@ REQUEST: domain40.ee - 2016-07-28 + 2016-08-11 1 @@ -11140,12 +10650,12 @@ RESPONSE: domain40.ee - 2017-07-28T08:41:19Z + 2017-08-11T11:55:43Z ABC-12345 - ccReg-2144233121 + ccReg-7894957170 @@ -11162,7 +10672,7 @@ REQUEST: domain41.ee - 2016-07-28 + 2016-08-11 1 @@ -11183,12 +10693,12 @@ RESPONSE: domain41.ee - 2017-07-28T08:41:20Z + 2017-08-11T11:55:43Z ABC-12345 - ccReg-6734533900 + ccReg-4818602643 @@ -11205,7 +10715,7 @@ REQUEST: domain42.ee - 2016-07-28 + 2016-08-11 ABC-12345 @@ -11225,12 +10735,12 @@ RESPONSE: domain42.ee - 2017-07-28T08:41:20Z + 2017-08-11T11:55:44Z ABC-12345 - ccReg-1952216525 + ccReg-5568347905 @@ -11247,7 +10757,7 @@ REQUEST: domain43.ee - 2016-07-28 + 2016-08-11 1 @@ -11270,7 +10780,7 @@ RESPONSE: ABC-12345 - ccReg-9450436889 + ccReg-6111537092 @@ -11285,7 +10795,7 @@ REQUEST: domain43.ee - 2016-07-28 + 2016-08-11 1 @@ -11308,7 +10818,7 @@ RESPONSE: ABC-12345 - ccReg-1447208589 + ccReg-8948273525 @@ -11325,7 +10835,7 @@ REQUEST: domain44.ee - 2015-08-07 + 2015-08-21 730 @@ -11346,12 +10856,12 @@ RESPONSE: domain44.ee - 2017-08-07T00:00:00Z + 2017-08-21T00:00:00Z ABC-12345 - ccReg-8888058768 + ccReg-9301611301 @@ -11368,7 +10878,7 @@ REQUEST: domain45.ee - 2015-08-07 + 2015-08-21 36 @@ -11389,12 +10899,12 @@ RESPONSE: domain45.ee - 2018-08-07T00:00:00Z + 2018-08-21T00:00:00Z ABC-12345 - ccReg-2368607304 + ccReg-1011945556 @@ -11411,7 +10921,7 @@ REQUEST: domain46.ee - 2015-08-07 + 2015-08-21 1 @@ -11431,7 +10941,7 @@ RESPONSE: ABC-12345 - ccReg-6821240882 + ccReg-7985467355 @@ -11474,7 +10984,7 @@ RESPONSE: ABC-12345 - ccReg-3646435252 + ccReg-4848773826 @@ -11491,7 +11001,7 @@ REQUEST: domain48.ee - 2015-08-07 + 2015-08-21 4 @@ -11514,7 +11024,7 @@ RESPONSE: ABC-12345 - ccReg-6217040456 + ccReg-5698763115 @@ -11531,7 +11041,7 @@ REQUEST: domain49.ee - 2015-10-26 + 2015-11-09 1 @@ -11551,7 +11061,7 @@ RESPONSE: ABC-12345 - ccReg-8796521058 + ccReg-8336303107 @@ -11566,7 +11076,7 @@ REQUEST: domain49.ee - 2015-10-25 + 2015-11-08 1 @@ -11587,12 +11097,12 @@ RESPONSE: domain49.ee - 2016-10-25T00:00:00Z + 2016-11-08T00:00:00Z ABC-12345 - ccReg-0448578516 + ccReg-4520499014 @@ -11609,7 +11119,7 @@ REQUEST: domain50.ee - 2020-07-28 + 2020-08-11 1 @@ -11630,12 +11140,12 @@ RESPONSE: domain50.ee - 2021-07-28T00:00:00Z + 2021-08-11T00:00:00Z ABC-12345 - ccReg-5093886658 + ccReg-4003912281 @@ -11652,7 +11162,7 @@ REQUEST: domain51.ee - 2015-08-07 + 2015-08-21 1 @@ -11672,7 +11182,7 @@ RESPONSE: ABC-12345 - ccReg-1090831490 + ccReg-2838847035 @@ -11680,6 +11190,47 @@ RESPONSE: ### EPP Domain with valid domain should renew a expired domain +REQUEST: + +```xml + + + + + + domain52.ee + 2015-05-13 + 1 + + + ABC-12345 + + +``` + +RESPONSE: + +```xml + + + + + Command completed successfully + + + + domain52.ee + 2016-05-13T11:55:53Z + + + + ABC-12345 + ccReg-9837541136 + + + +``` + ### EPP Domain with valid domain does not renew foreign domain REQUEST: @@ -11722,7 +11273,7 @@ RESPONSE: ABC-12345 - ccReg-0660211759 + ccReg-3159259519 @@ -11737,7 +11288,7 @@ REQUEST: domain53.ee - 2016-07-28 + 2016-08-11 1 @@ -11757,7 +11308,7 @@ RESPONSE: ABC-12345 - ccReg-9082042804 + ccReg-3581184901 @@ -11803,7 +11354,7 @@ RESPONSE: ABC-12345 - ccReg-0461998559 + ccReg-9114812387 @@ -11843,20 +11394,20 @@ RESPONSE: domain54.ee EIS-66 - FIXED:REGISTRANT3821775852 - FIXED:SH92766468122 - FIXED:SH95283245121 + FIXED:REGISTRANT6678728752 + FIXED:SH55312836122 + FIXED:SH23048934121 - ns.halvorsonkeeling162.ee + ns.muellerlindgren162.ee 192.168.1.1 - ns.cummings163.ee + ns.nicolas163.ee 192.168.1.1 - ns.dibbert164.ee + ns.harris164.ee 192.168.1.1 @@ -11866,11 +11417,11 @@ RESPONSE: registrar1 - 2015-07-28T08:41:31Z - 2015-07-28T08:41:31Z - 2016-07-28T08:41:31Z + 2015-08-11T11:55:54Z + 2015-08-11T11:55:54Z + 2016-08-11T11:55:54Z - 7bde3f39e40a68635bf5a69098169cc5 + e405e982392e123281cbe3024e833231 @@ -11903,7 +11454,7 @@ RESPONSE: - ccReg-6011078959 + ccReg-1762927056 @@ -11941,20 +11492,20 @@ RESPONSE: domain54.ee EIS-66 - FIXED:REGISTRANT3821775852 - FIXED:SH92766468122 - FIXED:SH95283245121 + FIXED:REGISTRANT6678728752 + FIXED:SH55312836122 + FIXED:SH23048934121 - ns.halvorsonkeeling162.ee + ns.muellerlindgren162.ee 192.168.1.1 - ns.cummings163.ee + ns.nicolas163.ee 192.168.1.1 - ns.dibbert164.ee + ns.harris164.ee 192.168.1.1 @@ -11964,11 +11515,11 @@ RESPONSE: registrar1 - 2015-07-28T08:41:31Z - 2015-07-28T08:41:31Z - 2016-07-28T08:41:31Z + 2015-08-11T11:55:54Z + 2015-08-11T11:55:54Z + 2016-08-11T11:55:54Z - 7bde3f39e40a68635bf5a69098169cc5 + e405e982392e123281cbe3024e833231 @@ -12001,7 +11552,7 @@ RESPONSE: - ccReg-9484163738 + ccReg-8611042006 @@ -12040,7 +11591,7 @@ RESPONSE: Element '{https://epp.tld.ee/schema/domain-eis-1.0.xsd}name', attribute 'hosts': 'invalid' is not a valid value of the atomic type '{https://epp.tld.ee/schema/domain-eis-1.0.xsd}hostsType'. - ccReg-6664642362 + ccReg-5710285862 @@ -12078,9 +11629,9 @@ RESPONSE: domain55.ee EIS-67 - FIXED:REGISTRANT0861566953 - FIXED:SH41938455124 - FIXED:SH51239690123 + FIXED:REGISTRANT1864627453 + FIXED:SH98335431124 + FIXED:SH14972112123 ns1.domain55.ee @@ -12094,16 +11645,16 @@ RESPONSE: registrar1 - 2015-07-28T08:41:31Z - 2015-07-28T08:41:31Z - 2016-07-28T08:41:31Z + 2015-08-11T11:55:54Z + 2015-08-11T11:55:55Z + 2016-08-11T11:55:54Z - 1f00f9c3dd3137349c89cb6122fd2087 + 6b82cec718a752daa0d054ddb47124f5 - ccReg-4706656698 + ccReg-7441088699 @@ -12141,9 +11692,9 @@ RESPONSE: domain55.ee EIS-67 - FIXED:REGISTRANT0861566953 - FIXED:SH41938455124 - FIXED:SH51239690123 + FIXED:REGISTRANT1864627453 + FIXED:SH98335431124 + FIXED:SH14972112123 ns3.test.ee @@ -12152,16 +11703,16 @@ RESPONSE: registrar1 - 2015-07-28T08:41:31Z - 2015-07-28T08:41:31Z - 2016-07-28T08:41:31Z + 2015-08-11T11:55:54Z + 2015-08-11T11:55:55Z + 2016-08-11T11:55:54Z - 1f00f9c3dd3137349c89cb6122fd2087 + 6b82cec718a752daa0d054ddb47124f5 - ccReg-6524782384 + ccReg-8877712602 @@ -12199,20 +11750,20 @@ RESPONSE: domain55.ee EIS-67 - FIXED:REGISTRANT0861566953 - FIXED:SH41938455124 - FIXED:SH51239690123 + FIXED:REGISTRANT1864627453 + FIXED:SH98335431124 + FIXED:SH14972112123 registrar1 - 2015-07-28T08:41:31Z - 2015-07-28T08:41:31Z - 2016-07-28T08:41:31Z + 2015-08-11T11:55:54Z + 2015-08-11T11:55:55Z + 2016-08-11T11:55:54Z - 1f00f9c3dd3137349c89cb6122fd2087 + 6b82cec718a752daa0d054ddb47124f5 - ccReg-6513443999 + ccReg-1985874847 @@ -12250,9 +11801,9 @@ RESPONSE: domain55.ee EIS-67 - FIXED:REGISTRANT0861566953 - FIXED:SH41938455124 - FIXED:SH51239690123 + FIXED:REGISTRANT1864627453 + FIXED:SH98335431124 + FIXED:SH14972112123 ns1.domain55.ee @@ -12271,16 +11822,16 @@ RESPONSE: registrar1 - 2015-07-28T08:41:31Z - 2015-07-28T08:41:31Z - 2016-07-28T08:41:31Z + 2015-08-11T11:55:54Z + 2015-08-11T11:55:55Z + 2016-08-11T11:55:54Z - 1f00f9c3dd3137349c89cb6122fd2087 + 6b82cec718a752daa0d054ddb47124f5 - ccReg-4393101167 + ccReg-7895563387 @@ -12319,7 +11870,7 @@ RESPONSE: - ccReg-7830292127 + ccReg-4606312676 @@ -12359,34 +11910,34 @@ RESPONSE: domain56.ee EIS-68 - FIXED:REGISTRANT8926104554 - FIXED:SH54896149126 - FIXED:SH80337499125 + FIXED:REGISTRANT6615814554 + FIXED:SH33692771126 + FIXED:SH04611136125 - ns.conroy168.ee + ns.pfannerstillschiller168.ee 192.168.1.1 - ns.bahringer169.ee + ns.krajcik169.ee 192.168.1.1 - ns.kochhyatt170.ee + ns.reichert170.ee 192.168.1.1 registrar1 - 2015-07-28T08:41:33Z - 2015-07-28T08:41:33Z - 2016-07-28T08:41:33Z + 2015-08-11T11:55:56Z + 2015-08-11T11:55:56Z + 2016-08-11T11:55:56Z - da322dc86ce37e526f9c2dedc0f5c9f4 + 9693144ac2a6c862944bbd89378f8e8d - ccReg-0824891046 + ccReg-8592733577 @@ -12434,7 +11985,7 @@ RESPONSE: ABC-12345 - ccReg-7661910824 + ccReg-8350220504 @@ -12468,7 +12019,7 @@ RESPONSE: Authorization error - ccReg-8708797571 + ccReg-3347584229 @@ -12514,7 +12065,7 @@ RESPONSE: ABC-12345 - ccReg-2730417805 + ccReg-5538659128 @@ -12562,7 +12113,7 @@ RESPONSE: ABC-12345 - ccReg-0152975550 + ccReg-2825253645 @@ -12597,31 +12148,31 @@ RESPONSE: domain58.ee EIS-70 - FIXED:REGISTRANT2923781556 - FIXED:SH74442662130 - FIXED:SH98223564129 + FIXED:REGISTRANT5046526256 + FIXED:SH31743232130 + FIXED:SH35555172129 - ns.wizastanton174.ee + ns.wunscharmstrong174.ee 192.168.1.1 - ns.hermann175.ee + ns.schaefer175.ee 192.168.1.1 - ns.mrazhintz176.ee + ns.feest176.ee 192.168.1.1 registrar1 - 2015-07-28T08:41:33Z - 2015-07-28T08:41:33Z - 2016-07-28T08:41:33Z + 2015-08-11T11:55:56Z + 2015-08-11T11:55:56Z + 2016-08-11T11:55:56Z - ccReg-5496759020 + ccReg-7305520906 @@ -12667,7 +12218,7 @@ RESPONSE: ABC-12345 - ccReg-5839948259 + ccReg-7996586807 @@ -12715,7 +12266,7 @@ RESPONSE: ABC-12345 - ccReg-9962481595 + ccReg-1769652713 @@ -12731,7 +12282,7 @@ REQUEST: domain59.ee - d1a0c13cf710ce60125dda34bc047357 + 7763e2a63bb5324a562b832ea91f4ea4 @@ -12753,34 +12304,34 @@ RESPONSE: domain59.ee EIS-71 - FIXED:REGISTRANT9338146457 - FIXED:SH08033657132 - FIXED:SH95760244131 + FIXED:REGISTRANT4215092657 + FIXED:SH67223411132 + FIXED:SH37311668131 - ns.hansen177.ee + ns.legros177.ee 192.168.1.1 - ns.bechtelar178.ee + ns.bosco178.ee 192.168.1.1 - ns.ryan179.ee + ns.kohler179.ee 192.168.1.1 registrar1 - 2015-07-28T08:41:34Z - 2015-07-28T08:41:34Z - 2016-07-28T08:41:34Z + 2015-08-11T11:55:57Z + 2015-08-11T11:55:57Z + 2016-08-11T11:55:57Z - d1a0c13cf710ce60125dda34bc047357 + 7763e2a63bb5324a562b832ea91f4ea4 - ccReg-5565279418 + ccReg-9758443099 @@ -12826,7 +12377,7 @@ RESPONSE: ABC-12345 - ccReg-1086178421 + ccReg-3535251971 @@ -12866,7 +12417,7 @@ RESPONSE: ABC-12345 - ccReg-6748161709 + ccReg-6418120672 @@ -12906,7 +12457,7 @@ RESPONSE: ABC-12345 - ccReg-3721491187 + ccReg-1091198620 @@ -12946,7 +12497,7 @@ RESPONSE: ABC-12345 - ccReg-8985283918 + ccReg-9096837356 @@ -12981,7 +12532,7 @@ RESPONSE: ABC-12345 - ccReg-6341995809 + ccReg-8675330286 @@ -13023,7 +12574,7 @@ RESPONSE: ABC-12345 - ccReg-5323793544 + ccReg-7290268396 @@ -13064,7 +12615,7 @@ RESPONSE: ABC-12345 - ccReg-9376664446 + ccReg-0077508545 @@ -13114,7 +12665,7 @@ RESPONSE: ABC-12345 - ccReg-8665354623 + ccReg-8086738861 @@ -13161,7 +12712,7 @@ RESPONSE: ABC-12345 - ccReg-0776655399 + ccReg-1647524069 @@ -13209,7 +12760,7 @@ RESPONSE: ABC-12345 - ccReg-6119482698 + ccReg-0909822570 @@ -13232,13 +12783,13 @@ REQUEST: cmlraXN0aGViZXN0 - 5a561b9d331c998c4f0383c7c67837be + 2607db9557ab057a5ffd16029160a608 P1M13D - 1438072899 + 1439294162 ``` @@ -13256,8 +12807,8 @@ RESPONSE: - 1438072899 - ccReg-0546548236 + 1439294162 + ccReg-7220924017 @@ -13279,13 +12830,13 @@ REQUEST: cmlraXN0aGViZXN0 - 5a561b9d331c998c4f0383c7c67837be + 2607db9557ab057a5ffd16029160a608 Invalid Expiry - 1438072900 + 1439294163 ``` @@ -13306,8 +12857,8 @@ RESPONSE: - 1438072900 - ccReg-6339589638 + 1439294163 + ccReg-9778324427 @@ -13330,13 +12881,13 @@ REQUEST: cmlraXN0aGViZXN0 - 5a561b9d331c998c4f0383c7c67837be + 2607db9557ab057a5ffd16029160a608 Invalid Expiry - 1438072901 + 1439294164 ``` @@ -13354,8 +12905,8 @@ RESPONSE: - 1438072901 - ccReg-5588050715 + 1439294164 + ccReg-8033554407 @@ -13378,13 +12929,13 @@ REQUEST: cmlraXN0aGViZXN0 - 5a561b9d331c998c4f0383c7c67837be + 2607db9557ab057a5ffd16029160a608 Invalid Absolute - 1438072902 + 1439294165 ``` @@ -13402,8 +12953,8 @@ RESPONSE: - 1438072902 - ccReg-3072813596 + 1439294165 + ccReg-3720220217 @@ -13426,7 +12977,7 @@ REQUEST: cmlraXN0aGViZXN0 - 5a561b9d331c998c4f0383c7c67837be + 2607db9557ab057a5ffd16029160a608 P1D @@ -13435,7 +12986,7 @@ REQUEST: JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp== - 1438072903 + 1439294166 ``` @@ -13453,8 +13004,8 @@ RESPONSE: - 1438072903 - ccReg-8005218060 + 1439294166 + ccReg-2343439515 @@ -13477,7 +13028,7 @@ REQUEST: cmlraXN0aGViZXN0 - 5a561b9d331c998c4f0383c7c67837be + 2607db9557ab057a5ffd16029160a608 P1D @@ -13486,7 +13037,7 @@ REQUEST: JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp== - 1438072904 + 1439294167 ``` @@ -13501,8 +13052,8 @@ RESPONSE: Attribute is invalid: type - 1438072904 - ccReg-7669723424 + 1439294167 + ccReg-0401411681 @@ -13548,7 +13099,7 @@ RESPONSE: ABC-12345 - ccReg-7183215230 + ccReg-7730088590 @@ -13563,7 +13114,7 @@ REQUEST: - 1438072906 + 1439294168 ``` @@ -13578,8 +13129,8 @@ RESPONSE: Command completed successfully; no messages - 1438072906 - ccReg-0904688053 + 1439294168 + ccReg-2280914410 @@ -13627,7 +13178,7 @@ RESPONSE: ABC-12345 - ccReg-9330176861 + ccReg-1986697051 @@ -13640,7 +13191,7 @@ REQUEST: - 1438072906 + 1439294169 ``` @@ -13655,8 +13206,8 @@ RESPONSE: Command completed successfully; no messages - 1438072906 - ccReg-9666096812 + 1439294169 + ccReg-5202120928 @@ -13702,7 +13253,7 @@ RESPONSE: ABC-12345 - ccReg-2827332510 + ccReg-9446890199 @@ -13715,7 +13266,7 @@ REQUEST: - 1438072906 + 1439294169 ``` @@ -13730,12 +13281,12 @@ RESPONSE: Command completed successfully; ack to dequeue - 2015-07-28T08:41:46Z + 2015-08-11T11:56:09Z Balance low. - 1438072906 - ccReg-8105139529 + 1439294169 + ccReg-5767853600 @@ -13781,7 +13332,7 @@ RESPONSE: ABC-12345 - ccReg-4202898264 + ccReg-1789858043 @@ -13794,7 +13345,7 @@ REQUEST: - 1438072906 + 1439294169 ``` @@ -13812,8 +13363,8 @@ RESPONSE: - 1438072906 - ccReg-6713795149 + 1439294169 + ccReg-1956891962 @@ -13859,7 +13410,7 @@ RESPONSE: ABC-12345 - ccReg-8383726441 + ccReg-9092138622 @@ -13872,7 +13423,7 @@ REQUEST: - 1438072906 + 1439294169 ``` @@ -13888,8 +13439,8 @@ RESPONSE: - 1438072906 - ccReg-9660232901 + 1439294169 + ccReg-6745736020 @@ -13902,7 +13453,7 @@ REQUEST: - 1438072906 + 1439294169 ``` @@ -13920,8 +13471,8 @@ RESPONSE: - 1438072906 - ccReg-8436895537 + 1439294169 + ccReg-3500436361 @@ -13936,7 +13487,7 @@ REQUEST: - 1438072909 + 1439294171 ``` @@ -13954,8 +13505,8 @@ RESPONSE: Element '{urn:ietf:params:xml:ns:epp-1.0}poll', attribute 'op': 'bla' is not a valid value of the atomic type '{urn:ietf:params:xml:ns:epp-1.0}pollOpType'. - 1438072909 - ccReg-0720048091 + 1439294171 + ccReg-4493252063 @@ -13970,7 +13521,7 @@ REQUEST: - 1438072910 + 1439294172 ``` @@ -13985,12 +13536,12 @@ RESPONSE: Command completed successfully; ack to dequeue - 2015-07-28T08:41:50Z + 2015-08-11T11:56:12Z Smth else. - 1438072910 - ccReg-4999056673 + 1439294172 + ccReg-3040938898 @@ -14003,7 +13554,7 @@ REQUEST: - 1438072910 + 1439294172 ``` @@ -14019,8 +13570,8 @@ RESPONSE: - 1438072910 - ccReg-2484759210 + 1439294172 + ccReg-4471665589 @@ -14033,7 +13584,7 @@ REQUEST: - 1438072910 + 1439294172 ``` @@ -14048,12 +13599,12 @@ RESPONSE: Command completed successfully; ack to dequeue - 2015-07-28T08:41:50Z + 2015-08-11T11:56:12Z Something. - 1438072910 - ccReg-8852256138 + 1439294172 + ccReg-6475550625 @@ -14066,7 +13617,7 @@ REQUEST: - 1438072910 + 1439294172 ``` @@ -14082,8 +13633,8 @@ RESPONSE: - 1438072910 - ccReg-4857662573 + 1439294172 + ccReg-9624718637 @@ -14096,7 +13647,7 @@ REQUEST: - 1438072910 + 1439294172 ``` @@ -14111,12 +13662,12 @@ RESPONSE: Command completed successfully; ack to dequeue - 2015-07-28T08:41:50Z + 2015-08-11T11:56:12Z Balance low. - 1438072910 - ccReg-7845130069 + 1439294172 + ccReg-3070249876 @@ -14129,7 +13680,7 @@ REQUEST: - 1438072910 + 1439294173 ``` @@ -14145,8 +13696,8 @@ RESPONSE: - 1438072910 - ccReg-5213820888 + 1439294173 + ccReg-4968625677 @@ -14159,7 +13710,7 @@ REQUEST: - 1438072910 + 1439294173 ``` @@ -14174,8 +13725,8 @@ RESPONSE: Command completed successfully; no messages - 1438072910 - ccReg-5526530522 + 1439294173 + ccReg-9296884701 @@ -14190,7 +13741,7 @@ RESPONSE: EPP server (EIS) - 2015-07-28T08:41:50Z + 2015-08-11T11:56:13Z 1.0 en @@ -14266,7 +13817,7 @@ RESPONSE: ABC-12345 - ccReg-3357021379 + ccReg-8845299596 @@ -14314,7 +13865,7 @@ RESPONSE: ABC-12345 - ccReg-7648731033 + ccReg-5595047459 @@ -14349,7 +13900,7 @@ RESPONSE: ABC-12345 - ccReg-9110727237 + ccReg-0543938056 @@ -14395,7 +13946,7 @@ RESPONSE: Authentication error; server closing connection (API user not found) - ccReg-3560736149 + ccReg-3872468269 @@ -14443,7 +13994,7 @@ RESPONSE: ABC-12345 - ccReg-9604669451 + ccReg-8811138694 @@ -14491,7 +14042,7 @@ RESPONSE: ABC-12345 - ccReg-2841249388 + ccReg-2886908735 @@ -14539,7 +14090,7 @@ RESPONSE: ABC-12345 - ccReg-7967943283 + ccReg-8092163355 @@ -14585,7 +14136,7 @@ RESPONSE: ABC-12345 - ccReg-8815596190 + ccReg-7898443219 @@ -14633,7 +14184,7 @@ RESPONSE: ABC-12345 - ccReg-3572848696 + ccReg-4059475229 @@ -14662,7 +14213,7 @@ RESPONSE: ABC-12345 - ccReg-9539000551 + ccReg-0841409227 @@ -14711,7 +14262,7 @@ RESPONSE: ABC-12345 - ccReg-6256430973 + ccReg-9094322774 @@ -14763,7 +14314,7 @@ RESPONSE: ABC-12345 - ccReg-6382004519 + ccReg-3240158726 From ef9048edb018f531352206304a976f3e6a34369c Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Tue, 11 Aug 2015 15:05:05 +0300 Subject: [PATCH 51/68] Possible to define whitelist emails --- CHANGELOG.md | 4 ++++ config/application-example.yml | 3 +++ config/initializers/settings.rb | 33 +++++++++++++-------------------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77da3eb1d..d77d6b6a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +11.08.2015 + +* Possible to add whitelist_emails_for_staging list at application.yml + 21.07.2015 * Possible to define custom trusted proxies at application.yml diff --git a/config/application-example.yml b/config/application-example.yml index a3a4d2cc0..f8cb0f26e 100644 --- a/config/application-example.yml +++ b/config/application-example.yml @@ -22,6 +22,9 @@ smtp_enable_starttls_auto: 'true' # 'false' # If your mail server requires authentication, please change. smtp_authentication: 'plain' # 'plain', 'login', 'cram_md5' registrant_url: 'https:/registrant.example.com' # for valid email body registrant links +whitelist_emails_for_staging: > + test@example.org, old@example.org, + new@example.org, old@example.com, new@example.com # # ADMIN server diff --git a/config/initializers/settings.rb b/config/initializers/settings.rb index 5dd1507c4..3433f9f4f 100644 --- a/config/initializers/settings.rb +++ b/config/initializers/settings.rb @@ -1,20 +1,13 @@ -TEST_EMAILS = %w( - timo.vohmar@internet.ee - timo.vohmar@eestiinternet.ee - rene.vahtel@internet.ee - martin.mettig@internet.ee - hannes.klausen@internet.ee - georg.kahest@internet.ee - norman.aeg@internet.ee - martti.oigus@internet.ee - jana.jarve@internet.ee - martin@gitlab.eu - priit@gitlab.eu - info@gitlab.eu - test@example.com - test@example.org - old@example.org - new@example.org - old@example.com - new@example.com -) +TEST_EMAILS = + if Rails.env.test? + %w( + test@example.com + test@example.org + old@example.org + new@example.org + old@example.com + new@example.com + ) + else + ENV['whitelist_emails_for_staging'].split(',').map(&:strip) + end From c527a4e55a210b76542fcbd686ecbc9e984b2020 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 11 Aug 2015 15:09:40 +0300 Subject: [PATCH 52/68] Add test for transfer cancel #2809 --- spec/epp/domain_spec.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/spec/epp/domain_spec.rb b/spec/epp/domain_spec.rb index c00225dc8..5a9e2bff8 100644 --- a/spec/epp/domain_spec.rb +++ b/spec/epp/domain_spec.rb @@ -1622,6 +1622,17 @@ describe 'EPP Domain', epp: true do response[:results][0][:result_code].should == '2303' end + it 'should not cancel transfer when there are none' do + xml = domain_transfer_xml({ + name: { value: domain.name }, + authInfo: { pw: { value: domain.auth_info } } + }, 'cancel') + + response = epp_plain_request(xml) + response[:results][0][:msg].should == 'No transfers found' + response[:results][0][:result_code].should == '2303' + end + it 'should allow querying domain transfer', epp: false do Setting.transfer_wait_time = 1 pw = domain.auth_info From 3a3a6960353825f637243262a957488f2e87b3cd Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 11 Aug 2015 18:05:41 +0300 Subject: [PATCH 53/68] Add proper domains search to registrar #2122 --- .../registrar/domains_controller.rb | 54 ++++- app/views/registrar/domains/index.haml | 109 ++++++--- ...fest-48c2dd3ff16b86b70040480e74a50543.json | 2 +- ...595592ba458671ccd1fb663f500229671eb30c9.js | 170 ++++++++++++++ ...595592ba458671ccd1fb663f500229671eb30c9.js | 170 ++++++++++++++ ...4b847d34f588c8fcefc055a29cb89dc3045279e.js | 216 ++++++++++++++++++ ...7954f548b4a9109e33e4c81ecfeb386ae70eed6.js | 1 + spec/features/registrar/domain_spec.rb | 41 ++++ 8 files changed, 721 insertions(+), 42 deletions(-) create mode 100644 public/assets/registrant-manifest-9bc7e99a627bcd8cd851f05e1595592ba458671ccd1fb663f500229671eb30c9.js create mode 100644 public/assets/registrar-manifest-9bc7e99a627bcd8cd851f05e1595592ba458671ccd1fb663f500229671eb30c9.js create mode 100644 public/assets/registrar-manifest-acc585f0f8ccb8f3a1b2ba4f54b847d34f588c8fcefc055a29cb89dc3045279e.js create mode 100644 public/assets/registrar/application-d550a9694cdd4555f5ebaa3317954f548b4a9109e33e4c81ecfeb386ae70eed6.js diff --git a/app/controllers/registrar/domains_controller.rb b/app/controllers/registrar/domains_controller.rb index 5da13d089..f7a122853 100644 --- a/app/controllers/registrar/domains_controller.rb +++ b/app/controllers/registrar/domains_controller.rb @@ -2,21 +2,41 @@ class Registrar::DomainsController < Registrar::DeppController # EPP controller before_action :init_domain, except: :new before_action :init_contacts_autocomplete_map, only: [:new, :edit, :create, :update] + # rubocop: disable Metrics/PerceivedComplexity + # rubocop: disable Metrics/CyclomaticComplexity + # rubocop: disable Metrics/AbcSize def index authorize! :view, Depp::Domain - limit, offset = pagination_details - res = depp_current_user.repp_request('domains', { details: true, limit: limit, offset: offset }) - if res.code == '200' - @response = res.parsed_body.with_indifferent_access - @contacts = @response ? @response[:contacts] : [] - - @paginatable_array = Kaminari.paginate_array( - [], total_count: @response[:total_number_of_records] - ).page(params[:page]).per(limit) + params[:q] ||= {} + 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 - flash.now[:epp_results] = [{ 'code' => res.code, 'msg' => res.message }] + + normalize_search_parameters do + @q = domains.search(params[:q]) + @domains = @q.result.page(params[:page]) + if @domains.count == 1 && params[:q][:name_matches].present? + redirect_to info_registrar_domains_path(domain_name: @domains.first.name) and return + elsif @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 + + @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 end + # rubocop: enable Metrics/PerceivedComplexity + # rubocop: enable Metrics/CyclomaticComplexity + # rubocop: enable Metrics/AbcSize def info authorize! :view, Depp::Domain @@ -123,4 +143,18 @@ class Registrar::DomainsController < Registrar::DeppController # EPP controller # @priv_contacts_autocomplete_map ||= # current_user.registrar.priv_contacts.pluck(:name, :code).map { |c| ["#{c.second} #{c.first}", c.second] } 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 diff --git a/app/views/registrar/domains/index.haml b/app/views/registrar/domains/index.haml index e4faeea80..77973f996 100644 --- a/app/views/registrar/domains/index.haml +++ b/app/views/registrar/domains/index.haml @@ -7,42 +7,89 @@ = render 'shared/title', name: t(:domains) .row - .col-md-12{style: 'margin-bottom: -15px;'} - = form_tag info_registrar_domains_path, class: 'form-horizontal', method: :get do - .col-md-11 - .form-group - = text_field_tag :domain_name, params[:domain_name], class: 'form-control', placeholder: t(:domain_name), autocomplete: 'off', autofocus: true - .col-md-1.text-right.text-center-xs - .form-group - %button.btn.btn-default + .col-md-12 + = search_form_for [:registrar, @q], html: { style: 'margin-bottom: 0;', class: 'js-form', autocomplete: 'off' } do |f| + .row + .col-md-3 + .form-group + = f.label :name + = f.search_field :name_matches, value: params[:q][:name_matches], class: 'form-control', placeholder: t(:name) + .col-md-3 + .form-group + = f.label t(:registrant_ident) + = f.search_field :registrant_ident_eq, class: 'form-control', placeholder: t(:registrant_ident) + .col-md-3 + .form-group + = f.label t(:contact_ident) + = f.search_field :contacts_ident_eq, class: 'form-control', placeholder: t(:contact_ident) + .col-md-3 + .form-group + = f.label t(:nameserver_hostname) + = f.search_field :nameservers_hostname_eq, class: 'form-control', placeholder: t(:nameserver_hostname) + .row + .col-md-6 + .form-group + = label_tag t(:status) + = select_tag :statuses_contains, options_for_select(DomainStatus::STATUSES, params[:statuses_contains]), { multiple: true, placeholder: t(:choose), class: 'form-control js-combobox' } + .col-md-3 + .form-group + = f.label t(:valid_to_from) + = f.search_field :valid_to_gteq, value: params[:q][:valid_to_gteq], class: 'form-control datepicker', placeholder: t(:valid_to_from) + .col-md-3 + .form-group + = f.label t(:valid_to_until) + = f.search_field :valid_to_lteq, value: params[:q][:valid_to_lteq], class: 'form-control datepicker', placeholder: t(:valid_to_until) + .row + .col-md-6 + .col-md-3 + .form-group + = label_tag t(:results_per_page) + = text_field_tag :results_per_page, params[:results_per_page], class: 'form-control', placeholder: t(:results_per_page) + .col-md-3{style: 'padding-top: 25px;'} + %button.btn.btn-primary.search   %span.glyphicon.glyphicon-search   - + %button.btn.btn-default.js-reset-form + = t(:clear_fields) %hr -- if @response - .table-responsive - %table.table.table-hover.table-condensed - %thead - %tr - %th{class: 'col-xs-3'}= t(:name) - %th{class: 'col-xs-6'}= t(:valid) - %th{class: 'col-xs-3'}= t(:actions) - %tbody - - @response['domains'].each do |x| +.row + .col-md-12 + .table-responsive + %table.table.table-hover.table-bordered.table-condensed + %thead %tr - %td= link_to(x['name'], info_registrar_domains_path(domain_name: x['name'])) - %td - = Time.zone.parse(x['valid_from']).try(:to_date) - \- - = Time.zone.parse(x['valid_to']).try(:to_date) - %td - = link_to(t(:edit), edit_registrar_domains_path(domain_name: x['name']), - class: 'btn btn-primary btn-xs') - = link_to(t(:renew), renew_registrar_domains_path(domain_name: x['name']), - class: 'btn btn-default btn-xs') - = link_to(t(:delete), delete_registrar_domains_path(domain_name: x['name']), + %th{class: 'col-xs-2'} + = sort_link(@q, 'name') + %th{class: 'col-xs-2'} + = sort_link(@q, 'registrant_name', t(:registrant)) + %th{class: 'col-xs-2'} + = sort_link(@q, 'valid_to', t(:valid_to)) + %th{class: 'col-xs-2'}= t('actions') + %tbody + - @domains.each do |x| + %tr + %td= link_to(x, info_registrar_domains_path(domain_name: x.name)) + %td + - if x.registrant + = link_to(x.registrant, registrar_contact_path(id: x.registrant.code)) + %td= l(x.valid_to, format: :date_long) + %td + = link_to(t(:edit), edit_registrar_domains_path(domain_name: x.name), + class: 'btn btn-primary btn-xs') + = link_to(t(:renew), renew_registrar_domains_path(domain_name: x.name), class: 'btn btn-default btn-xs') + = link_to(t(:delete), delete_registrar_domains_path(domain_name: x.name), + class: 'btn btn-default btn-xs') +.row + .col-md-6 + = paginate @domains + .col-md-6.text-right + .pagination + = t(:result_count, count: @domains.total_count) - = paginate @paginatable_array +:coffee + $(".js-reset-form").on "click", (e) -> + e.preventDefault(); + window.location = "#{registrar_domains_path}" diff --git a/public/assets/.sprockets-manifest-48c2dd3ff16b86b70040480e74a50543.json b/public/assets/.sprockets-manifest-48c2dd3ff16b86b70040480e74a50543.json index c5fd0c69d..f2801d8ce 100644 --- a/public/assets/.sprockets-manifest-48c2dd3ff16b86b70040480e74a50543.json +++ b/public/assets/.sprockets-manifest-48c2dd3ff16b86b70040480e74a50543.json @@ -1 +1 @@ -{"files":{"admin-manifest-58660819bb55d95ee3f0c8149722a0e2ea507a3a45f24d22a2610d060bdc8dc0.css":{"logical_path":"admin-manifest.css","mtime":"2015-06-16T16:19:54+03:00","size":435358,"digest":"58660819bb55d95ee3f0c8149722a0e2ea507a3a45f24d22a2610d060bdc8dc0","integrity":"sha256-WGYIGbtV2V7j8MgUlyKg4upQejpF8k0iomENBgvcjcA="},"admin-manifest-025801216a3b153631239205b373c5e4ac42d55cc9a53960d3c485b5eed9d467.js":{"logical_path":"admin-manifest.js","mtime":"2015-06-08T14:38:06+03:00","size":712602,"digest":"025801216a3b153631239205b373c5e4ac42d55cc9a53960d3c485b5eed9d467","integrity":"sha256-AlgBIWo7FTYxI5IFs3PF5KxC1VzJpTlg08SFte7Z1Gc="},"registrar-manifest-70dd177301fef149b726705917e97491911b4a74c1760a223eaefaaf3918a38b.css":{"logical_path":"registrar-manifest.css","mtime":"2015-06-16T16:19:54+03:00","size":475725,"digest":"70dd177301fef149b726705917e97491911b4a74c1760a223eaefaaf3918a38b","integrity":"sha256-cN0XcwH+8Um3JnBZF+l0kZEbSnTBdgoiPq76rzkYo4s="},"registrar-manifest-037217137e7dd50d2a0c4aec309e532b9cd2696de45c826cc0c4ff8bf58025e6.js":{"logical_path":"registrar-manifest.js","mtime":"2015-06-19T15:29:08+03:00","size":730835,"digest":"037217137e7dd50d2a0c4aec309e532b9cd2696de45c826cc0c4ff8bf58025e6","integrity":"sha256-A3IXE3591Q0qDErsMJ5TK5zSaW3kXIJswMT/i/WAJeY="},"registrant-manifest-6bfceed2fd52330f303b890fa9d229b1ecd097fda1b7df2db41829b8c25d40c0.css":{"logical_path":"registrant-manifest.css","mtime":"2015-06-16T16:19:54+03:00","size":476257,"digest":"6bfceed2fd52330f303b890fa9d229b1ecd097fda1b7df2db41829b8c25d40c0","integrity":"sha256-a/zu0v1SMw8wO4kPqdIpsezQl/2ht98ttBgpuMJdQMA="},"registrant-manifest-037217137e7dd50d2a0c4aec309e532b9cd2696de45c826cc0c4ff8bf58025e6.js":{"logical_path":"registrant-manifest.js","mtime":"2015-06-19T15:29:08+03:00","size":730835,"digest":"037217137e7dd50d2a0c4aec309e532b9cd2696de45c826cc0c4ff8bf58025e6","integrity":"sha256-A3IXE3591Q0qDErsMJ5TK5zSaW3kXIJswMT/i/WAJeY="},"shared/pdf-2f929bf92af2ce26249b1b02bb998c63cf49da0ae4e3526f869fccd0af65ac3b.css":{"logical_path":"shared/pdf.css","mtime":"2015-05-15T15:29:32+03:00","size":353119,"digest":"2f929bf92af2ce26249b1b02bb998c63cf49da0ae4e3526f869fccd0af65ac3b","integrity":"sha256-L5Kb+SryziYkmxsCu5mMY89J2grk41Jvhp/M0K9lrDs="},"select2-d6b5d8d83dbc18fb8d77c8761d331cd9e5123c9684950bab0406e98a24ac5ae8.png":{"logical_path":"select2.png","mtime":"2015-05-14T14:33:49+03:00","size":613,"digest":"d6b5d8d83dbc18fb8d77c8761d331cd9e5123c9684950bab0406e98a24ac5ae8","integrity":"sha256-1rXY2D28GPuNd8h2HTMc2eUSPJaElQurBAbpiiSsWug="},"select2-spinner-f6ecff617ec2ba7f559e6f535cad9b70a3f91120737535dab4d4548a6c83576c.gif":{"logical_path":"select2-spinner.gif","mtime":"2015-05-14T14:33:49+03:00","size":1849,"digest":"f6ecff617ec2ba7f559e6f535cad9b70a3f91120737535dab4d4548a6c83576c","integrity":"sha256-9uz/YX7Cun9Vnm9TXK2bcKP5ESBzdTXatNRUimyDV2w="},"select2x2-6fe28d687dc0ed4d96016238c608ba1e7198c9c9accfa0b360b78018b9fb9bc2.png":{"logical_path":"select2x2.png","mtime":"2015-05-14T14:33:49+03:00","size":845,"digest":"6fe28d687dc0ed4d96016238c608ba1e7198c9c9accfa0b360b78018b9fb9bc2","integrity":"sha256-b+KNaH3A7U2WAWI4xgi6HnGYycmsz6CzYLeAGLn7m8I="},"alpha-9ac45a6b3c13dd5c5cf1b5d18c6f24a537dd2e4598238527d232a3e2ea5b5947.png":{"logical_path":"alpha.png","mtime":"2015-05-15T15:29:32+03:00","size":7089,"digest":"9ac45a6b3c13dd5c5cf1b5d18c6f24a537dd2e4598238527d232a3e2ea5b5947","integrity":"sha256-msRaazwT3Vxc8bXRjG8kpTfdLkWYI4Un0jKj4upbWUc="},"bg-b8036abd2f0f36e3ab54d5d5b25b0fbac11d63ec6106d959df3fa180b379de05.jpg":{"logical_path":"bg.jpg","mtime":"2015-05-15T15:29:32+03:00","size":69058,"digest":"b8036abd2f0f36e3ab54d5d5b25b0fbac11d63ec6106d959df3fa180b379de05","integrity":"sha256-uANqvS8PNuOrVNXVslsPusEdY+xhBtlZ3z+hgLN53gU="},"danske-07a4395cc406785da129414e15872fe1d6a4f6f6da0066da6701b56cdb72ea96.png":{"logical_path":"danske.png","mtime":"2015-05-15T15:29:32+03:00","size":1130,"digest":"07a4395cc406785da129414e15872fe1d6a4f6f6da0066da6701b56cdb72ea96","integrity":"sha256-B6Q5XMQGeF2hKUFOFYcv4dak9vbaAGbaZwG1bNty6pY="},"development-0b993e22410c7952394ac19ce3b41b722a97b93138a9a002091e1e5226d29bf5.png":{"logical_path":"development.png","mtime":"2015-05-15T15:29:32+03:00","size":14496,"digest":"0b993e22410c7952394ac19ce3b41b722a97b93138a9a002091e1e5226d29bf5","integrity":"sha256-C5k+IkEMeVI5SsGc47QbciqXuTE4qaACCR4eUibSm/U="},"eis-logo-et-86a549d266cda73e3225c5eeba14532c59d498e1fd980ec129fded68da8bb307.png":{"logical_path":"eis-logo-et.png","mtime":"2015-05-15T15:29:32+03:00","size":1440,"digest":"86a549d266cda73e3225c5eeba14532c59d498e1fd980ec129fded68da8bb307","integrity":"sha256-hqVJ0mbNpz4yJcXuuhRTLFnUmOH9mA7BKf3taNqLswc="},"favicon-309e00e2f78f9a2b042abc2806a8a4ed9cf6bb5d3f00ccc0985b1308bfd86c49.ico":{"logical_path":"favicon.ico","mtime":"2015-05-15T15:29:32+03:00","size":1150,"digest":"309e00e2f78f9a2b042abc2806a8a4ed9cf6bb5d3f00ccc0985b1308bfd86c49","integrity":"sha256-MJ4A4vePmisEKrwoBqik7Zz2u10/AMzAmFsTCL/YbEk="},"id_card-ea506a49b25c8de4e68e786d90f5ec5defb6c8e895b90f2f129815f5e550fe8e.gif":{"logical_path":"id_card.gif","mtime":"2015-05-15T15:29:32+03:00","size":564,"digest":"ea506a49b25c8de4e68e786d90f5ec5defb6c8e895b90f2f129815f5e550fe8e","integrity":"sha256-6lBqSbJcjeTmjnhtkPXsXe+2yOiVuQ8vEpgV9eVQ/o4="},"lhv-4d09d3126a05df392b73c54fa9b1eb605798c2e9bd361cf44500f73038832030.png":{"logical_path":"lhv.png","mtime":"2015-05-15T15:29:32+03:00","size":3417,"digest":"4d09d3126a05df392b73c54fa9b1eb605798c2e9bd361cf44500f73038832030","integrity":"sha256-TQnTEmoF3zkrc8VPqbHrYFeYwum9Nhz0RQD3MDiDIDA="},"mid-275543ecea377debe1ac892470f3aea4f7e7f0f9089fc0fbea4de410742e5239.gif":{"logical_path":"mid.gif","mtime":"2015-05-15T15:29:32+03:00","size":1566,"digest":"275543ecea377debe1ac892470f3aea4f7e7f0f9089fc0fbea4de410742e5239","integrity":"sha256-J1VD7Oo3fevhrIkkcPOupPfn8PkIn8D76k3kEHQuUjk="},"nordea-75c938c7436e0c8316f056be8df8acd0e8b16e09790e78f78da96d9f8633ef3b.png":{"logical_path":"nordea.png","mtime":"2015-05-15T15:29:32+03:00","size":1181,"digest":"75c938c7436e0c8316f056be8df8acd0e8b16e09790e78f78da96d9f8633ef3b","integrity":"sha256-dck4x0NuDIMW8Fa+jfis0Oixbgl5Dnj3jaltn4Yz7zs="},"registrar/bg-alpha-9ac45a6b3c13dd5c5cf1b5d18c6f24a537dd2e4598238527d232a3e2ea5b5947.png":{"logical_path":"registrar/bg-alpha.png","mtime":"2015-05-15T15:29:32+03:00","size":7089,"digest":"9ac45a6b3c13dd5c5cf1b5d18c6f24a537dd2e4598238527d232a3e2ea5b5947","integrity":"sha256-msRaazwT3Vxc8bXRjG8kpTfdLkWYI4Un0jKj4upbWUc="},"registrar/bg-development-0b993e22410c7952394ac19ce3b41b722a97b93138a9a002091e1e5226d29bf5.png":{"logical_path":"registrar/bg-development.png","mtime":"2015-05-15T15:29:32+03:00","size":14496,"digest":"0b993e22410c7952394ac19ce3b41b722a97b93138a9a002091e1e5226d29bf5","integrity":"sha256-C5k+IkEMeVI5SsGc47QbciqXuTE4qaACCR4eUibSm/U="},"registrar/bg-staging-6276f8c00911bc99f301f919e408ae3ef726c7378324ac55fd5d378ba3a4dc2d.png":{"logical_path":"registrar/bg-staging.png","mtime":"2015-05-15T15:29:32+03:00","size":12294,"digest":"6276f8c00911bc99f301f919e408ae3ef726c7378324ac55fd5d378ba3a4dc2d","integrity":"sha256-Ynb4wAkRvJnzAfkZ5AiuPvcmxzeDJKxV/V03i6Ok3C0="},"registrar/favicon-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.ico":{"logical_path":"registrar/favicon.ico","mtime":"2015-05-15T15:29:32+03:00","size":0,"digest":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","integrity":"sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="},"seb-9c9d943014cc4ee706244893cd8a2c4a8a7cc97bfbdef6a66e22c72f33d5f25e.png":{"logical_path":"seb.png","mtime":"2015-05-15T15:29:32+03:00","size":2439,"digest":"9c9d943014cc4ee706244893cd8a2c4a8a7cc97bfbdef6a66e22c72f33d5f25e","integrity":"sha256-nJ2UMBTMTucGJEiTzYosSop8yXv73vambiLHLzPV8l4="},"staging-6276f8c00911bc99f301f919e408ae3ef726c7378324ac55fd5d378ba3a4dc2d.png":{"logical_path":"staging.png","mtime":"2015-05-15T15:29:32+03:00","size":12294,"digest":"6276f8c00911bc99f301f919e408ae3ef726c7378324ac55fd5d378ba3a4dc2d","integrity":"sha256-Ynb4wAkRvJnzAfkZ5AiuPvcmxzeDJKxV/V03i6Ok3C0="},"swed-2cf45729062cf5fa634247ba372c579c97f382e5cc43fa111219077e7473fdbb.png":{"logical_path":"swed.png","mtime":"2015-05-15T15:29:32+03:00","size":1521,"digest":"2cf45729062cf5fa634247ba372c579c97f382e5cc43fa111219077e7473fdbb","integrity":"sha256-LPRXKQYs9fpjQke6NyxXnJfzguXMQ/oREhkHfnRz/bs="},"test-9ac45a6b3c13dd5c5cf1b5d18c6f24a537dd2e4598238527d232a3e2ea5b5947.png":{"logical_path":"test.png","mtime":"2015-05-15T15:29:32+03:00","size":7089,"digest":"9ac45a6b3c13dd5c5cf1b5d18c6f24a537dd2e4598238527d232a3e2ea5b5947","integrity":"sha256-msRaazwT3Vxc8bXRjG8kpTfdLkWYI4Un0jKj4upbWUc="},"admin/application-b1444f5083209e83d34a087d1ff78a91b8a3eb487815a1987cbc5a120bf4e48f.js":{"logical_path":"admin/application.js","mtime":"2015-06-08T11:23:15+03:00","size":396,"digest":"b1444f5083209e83d34a087d1ff78a91b8a3eb487815a1987cbc5a120bf4e48f","integrity":"sha256-sURPUIMgnoPTSgh9H/eKkbij60h4FaGYfLxaEgv05I8="},"registrar/application-8ad3d7cb40be14b5c7dd76340db3618c0cd651644aa1e29bff59cc32e454ea85.js":{"logical_path":"registrar/application.js","mtime":"2015-06-19T15:29:08+03:00","size":1107,"digest":"8ad3d7cb40be14b5c7dd76340db3618c0cd651644aa1e29bff59cc32e454ea85","integrity":"sha256-itPXy0C+FLXH3XY0DbNhjAzWUWRKoeKb/1nMMuRU6oU="},"etelkalight-webfont-baf7e35ab2f64bf1c6fa4476d3934c7422062995738fd9e5715b02f55002d7c0.eot":{"logical_path":"etelkalight-webfont.eot","mtime":"2015-05-15T15:29:32+03:00","size":23109,"digest":"baf7e35ab2f64bf1c6fa4476d3934c7422062995738fd9e5715b02f55002d7c0","integrity":"sha256-uvfjWrL2S/HG+kR205NMdCIGKZVzj9nlcVsC9VAC18A="},"etelkalight-webfont-2b575f6e4696d74957af27a7c7bb7976b7ca31d0ebe8ec25bb4c3494d5d16e24.svg":{"logical_path":"etelkalight-webfont.svg","mtime":"2015-05-15T15:29:32+03:00","size":64768,"digest":"2b575f6e4696d74957af27a7c7bb7976b7ca31d0ebe8ec25bb4c3494d5d16e24","integrity":"sha256-K1dfbkaW10lXryenx7t5drfKMdDr6Owlu0w0lNXRbiQ="},"etelkalight-webfont-f68a2db6346d864f82c3b3e725ee60b0217e91e46ec47f96710f70f996b61af1.ttf":{"logical_path":"etelkalight-webfont.ttf","mtime":"2015-05-15T15:29:32+03:00","size":49748,"digest":"f68a2db6346d864f82c3b3e725ee60b0217e91e46ec47f96710f70f996b61af1","integrity":"sha256-9oottjRthk+Cw7PnJe5gsCF+keRuxH+WcQ9w+Za2GvE="},"etelkalight-webfont-1ed38dbac6b817bf74bd46a98d61005aa2615db7ac743e4037364d1021084043.woff":{"logical_path":"etelkalight-webfont.woff","mtime":"2015-05-15T15:29:32+03:00","size":26204,"digest":"1ed38dbac6b817bf74bd46a98d61005aa2615db7ac743e4037364d1021084043","integrity":"sha256-HtONusa4F790vUapjWEAWqJhXbesdD5ANzZNECEIQEM="},"etelkalightbold-webfont-1d94cabe6fb55b05f746fe0aa51a7a503683d7afdb68360ed26bfac03e1b3c39.eot":{"logical_path":"etelkalightbold-webfont.eot","mtime":"2015-05-15T15:29:32+03:00","size":23707,"digest":"1d94cabe6fb55b05f746fe0aa51a7a503683d7afdb68360ed26bfac03e1b3c39","integrity":"sha256-HZTKvm+1WwX3Rv4KpRp6UDaD16/baDYO0mv6wD4bPDk="},"etelkalightbold-webfont-bb0c8e17b99b10f211be3531a51d6ad48a5c6e4670c8fb6160a329fa4758c555.svg":{"logical_path":"etelkalightbold-webfont.svg","mtime":"2015-05-15T15:29:32+03:00","size":62829,"digest":"bb0c8e17b99b10f211be3531a51d6ad48a5c6e4670c8fb6160a329fa4758c555","integrity":"sha256-uwyOF7mbEPIRvjUxpR1q1IpcbkZwyPthYKMp+kdYxVU="},"etelkalightbold-webfont-0f06d1e7f099578e1cc0e9b1875aca2a7128c0ca0d640fd504e97bae0b028429.ttf":{"logical_path":"etelkalightbold-webfont.ttf","mtime":"2015-05-15T15:29:32+03:00","size":51172,"digest":"0f06d1e7f099578e1cc0e9b1875aca2a7128c0ca0d640fd504e97bae0b028429","integrity":"sha256-DwbR5/CZV44cwOmxh1rKKnEowMoNZA/VBOl7rgsChCk="},"etelkalightbold-webfont-d608c036b3e3f04ca87a1c494f8d9e9620a729b2760b5eb1dcee52c4bc8e8805.woff":{"logical_path":"etelkalightbold-webfont.woff","mtime":"2015-05-15T15:29:32+03:00","size":26956,"digest":"d608c036b3e3f04ca87a1c494f8d9e9620a729b2760b5eb1dcee52c4bc8e8805","integrity":"sha256-1gjANrPj8EyoehxJT42eliCnKbJ2C16x3O5SxLyOiAU="},"etelkalightitalic-webfont-ce5cdffe6c589a6dc6bd2c482c718486ff5fb416ab01740750db325179e58654.eot":{"logical_path":"etelkalightitalic-webfont.eot","mtime":"2015-05-15T15:29:32+03:00","size":26426,"digest":"ce5cdffe6c589a6dc6bd2c482c718486ff5fb416ab01740750db325179e58654","integrity":"sha256-zlzf/mxYmm3GvSxILHGEhv9ftBarAXQHUNsyUXnlhlQ="},"etelkalightitalic-webfont-dd5353c2af4ea63e1d0e99ec5f1f85162cee0c4dd0a3840260a2606eefc3e517.svg":{"logical_path":"etelkalightitalic-webfont.svg","mtime":"2015-05-15T15:29:32+03:00","size":69857,"digest":"dd5353c2af4ea63e1d0e99ec5f1f85162cee0c4dd0a3840260a2606eefc3e517","integrity":"sha256-3VNTwq9Opj4dDpnsXx+FFizuDE3Qo4QCYKJgbu/D5Rc="},"etelkalightitalic-webfont-54eb91ad0e0b639f50be02b7c25836c99ad989185f5d2a240d60ea14a1b7384a.ttf":{"logical_path":"etelkalightitalic-webfont.ttf","mtime":"2015-05-15T15:29:32+03:00","size":57040,"digest":"54eb91ad0e0b639f50be02b7c25836c99ad989185f5d2a240d60ea14a1b7384a","integrity":"sha256-VOuRrQ4LY59QvgK3wlg2yZrZiRhfXSokDWDqFKG3OEo="},"etelkalightitalic-webfont-d1fb9621d40ef45104078a4a5b98ce4cba00872cf8ac56e299cf1397c146cac3.woff":{"logical_path":"etelkalightitalic-webfont.woff","mtime":"2015-05-15T15:29:32+03:00","size":29884,"digest":"d1fb9621d40ef45104078a4a5b98ce4cba00872cf8ac56e299cf1397c146cac3","integrity":"sha256-0fuWIdQO9FEEB4pKW5jOTLoAhyz4rFbimc8Tl8FGysM="},"infotexb-webfont-1951e43e1d9ab99b0d4998abba4aab34f3e68b337be90800db517e4a8d27d001.eot":{"logical_path":"infotexb-webfont.eot","mtime":"2015-05-15T15:29:32+03:00","size":23124,"digest":"1951e43e1d9ab99b0d4998abba4aab34f3e68b337be90800db517e4a8d27d001","integrity":"sha256-GVHkPh2auZsNSZirukqrNPPmizN76QgA21F+So0n0AE="},"infotexb-webfont-0dda72e34d0d0ced7693b55ed08acc60fb1a9036afd7736e432ac3f22f2e6fdf.svg":{"logical_path":"infotexb-webfont.svg","mtime":"2015-05-15T15:29:32+03:00","size":90188,"digest":"0dda72e34d0d0ced7693b55ed08acc60fb1a9036afd7736e432ac3f22f2e6fdf","integrity":"sha256-Ddpy400NDO12k7Ve0IrMYPsakDav13NuQyrD8i8ub98="},"infotexb-webfont-c0737d1e2edff50645e201bf99f68f2313502ee2bdeb2e56435ee24721baf5cd.ttf":{"logical_path":"infotexb-webfont.ttf","mtime":"2015-05-15T15:29:32+03:00","size":47396,"digest":"c0737d1e2edff50645e201bf99f68f2313502ee2bdeb2e56435ee24721baf5cd","integrity":"sha256-wHN9Hi7f9QZF4gG/mfaPIxNQLuK96y5WQ17iRyG69c0="},"infotexb-webfont-8da32e6db23c39390c55dd5ea8949714757fddba516c5db65e72867504493fbc.woff":{"logical_path":"infotexb-webfont.woff","mtime":"2015-05-15T15:29:32+03:00","size":26228,"digest":"8da32e6db23c39390c55dd5ea8949714757fddba516c5db65e72867504493fbc","integrity":"sha256-jaMubbI8OTkMVd1eqJSXFHV/3bpRbF22XnKGdQRJP7w="},"infotexm-webfont-74df99faeb66d8b02966b8884b860af03c359ed41d348ddb813dbcc3c460eb26.eot":{"logical_path":"infotexm-webfont.eot","mtime":"2015-05-15T15:29:32+03:00","size":23273,"digest":"74df99faeb66d8b02966b8884b860af03c359ed41d348ddb813dbcc3c460eb26","integrity":"sha256-dN+Z+utm2LApZriIS4YK8Dw1ntQdNI3bgT28w8Rg6yY="},"infotexm-webfont-0b52ef10620b8cb7289dc809aac67826d5031e6ab040194fdb7365dc83e95557.svg":{"logical_path":"infotexm-webfont.svg","mtime":"2015-05-15T15:29:32+03:00","size":90423,"digest":"0b52ef10620b8cb7289dc809aac67826d5031e6ab040194fdb7365dc83e95557","integrity":"sha256-C1LvEGILjLconcgJqsZ4JtUDHmqwQBlP23Nl3IPpVVc="},"infotexm-webfont-1d244d27a4ec4c1a5f98c82966faa26e7855c4292c730429477003b6dab5c08b.ttf":{"logical_path":"infotexm-webfont.ttf","mtime":"2015-05-15T15:29:32+03:00","size":47484,"digest":"1d244d27a4ec4c1a5f98c82966faa26e7855c4292c730429477003b6dab5c08b","integrity":"sha256-HSRNJ6TsTBpfmMgpZvqibnhVxCkscwQpR3ADttq1wIs="},"infotexm-webfont-872b5ab4e0b7de6655a52f137a3c99f1e7941fa91ff21a56550f2039834ee9d0.woff":{"logical_path":"infotexm-webfont.woff","mtime":"2015-05-15T15:29:32+03:00","size":26492,"digest":"872b5ab4e0b7de6655a52f137a3c99f1e7941fa91ff21a56550f2039834ee9d0","integrity":"sha256-hytatOC33mZVpS8TejyZ8eeUH6kf8hpWVQ8gOYNO6dA="},"jquery-ui/ui-bg_flat_0_aaaaaa_40x100-9a8492a580bf85d3e98ae8861fbd45567e5a1f83eeafcf9574da0399d5f602ab.png":{"logical_path":"jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png","mtime":"2015-06-08T14:38:06+03:00","size":180,"digest":"9a8492a580bf85d3e98ae8861fbd45567e5a1f83eeafcf9574da0399d5f602ab","integrity":"sha256-moSSpYC/hdPpiuiGH71FVn5aH4Pur8+VdNoDmdX2Aqs="},"jquery-ui/ui-bg_flat_75_ffffff_40x100-39ab7ccd9f4e82579da78a9241265df288d8eb65dbbd7cf48aed2d0129887df5.png":{"logical_path":"jquery-ui/ui-bg_flat_75_ffffff_40x100.png","mtime":"2015-06-08T14:38:06+03:00","size":178,"digest":"39ab7ccd9f4e82579da78a9241265df288d8eb65dbbd7cf48aed2d0129887df5","integrity":"sha256-Oat8zZ9Ogledp4qSQSZd8ojY62XbvXz0iu0tASmIffU="},"jquery-ui/ui-bg_glass_55_fbf9ee_1x400-691597e8a40a891ea94d3589976ecfc33e6145c49422443b00ac2b5a0022964c.png":{"logical_path":"jquery-ui/ui-bg_glass_55_fbf9ee_1x400.png","mtime":"2015-06-08T14:38:06+03:00","size":120,"digest":"691597e8a40a891ea94d3589976ecfc33e6145c49422443b00ac2b5a0022964c","integrity":"sha256-aRWX6KQKiR6pTTWJl27Pwz5hRcSUIkQ7AKwrWgAilkw="},"jquery-ui/ui-bg_glass_65_ffffff_1x400-f0e6cd91b837d5c5644d026e5ffeccd907953317cd5c0f689901733afda260b2.png":{"logical_path":"jquery-ui/ui-bg_glass_65_ffffff_1x400.png","mtime":"2015-06-08T14:38:06+03:00","size":105,"digest":"f0e6cd91b837d5c5644d026e5ffeccd907953317cd5c0f689901733afda260b2","integrity":"sha256-8ObNkbg31cVkTQJuX/7M2QeVMxfNXA9omQFzOv2iYLI="},"jquery-ui/ui-bg_glass_75_dadada_1x400-c108f5cbf2dd9ec07a26530695ddd95e1664597ce6c056ae44c162cc2e28cec4.png":{"logical_path":"jquery-ui/ui-bg_glass_75_dadada_1x400.png","mtime":"2015-06-08T14:38:06+03:00","size":111,"digest":"c108f5cbf2dd9ec07a26530695ddd95e1664597ce6c056ae44c162cc2e28cec4","integrity":"sha256-wQj1y/LdnsB6JlMGld3ZXhZkWXzmwFauRMFizC4ozsQ="},"jquery-ui/ui-bg_glass_75_e6e6e6_1x400-ddf5dd4e0ef2b185e8bb0af7b6e90ebe74a84384cb4700658e76e754c8bfe550.png":{"logical_path":"jquery-ui/ui-bg_glass_75_e6e6e6_1x400.png","mtime":"2015-06-08T14:38:06+03:00","size":110,"digest":"ddf5dd4e0ef2b185e8bb0af7b6e90ebe74a84384cb4700658e76e754c8bfe550","integrity":"sha256-3fXdTg7ysYXouwr3tukOvnSoQ4TLRwBljnbnVMi/5VA="},"jquery-ui/ui-bg_glass_95_fef1ec_1x400-f6f1c1bedf1a0f37cfef81d12f5f012869d1ee7c984775a569827a1784d34f5c.png":{"logical_path":"jquery-ui/ui-bg_glass_95_fef1ec_1x400.png","mtime":"2015-06-08T14:38:06+03:00","size":119,"digest":"f6f1c1bedf1a0f37cfef81d12f5f012869d1ee7c984775a569827a1784d34f5c","integrity":"sha256-9vHBvt8aDzfP74HRL18BKGnR7nyYR3WlaYJ6F4TTT1w="},"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100-54270656df079c4da5182629a080fc633b6f84b87985eb016d25a560e2c38d4a.png":{"logical_path":"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100.png","mtime":"2015-06-08T14:38:06+03:00","size":101,"digest":"54270656df079c4da5182629a080fc633b6f84b87985eb016d25a560e2c38d4a","integrity":"sha256-VCcGVt8HnE2lGCYpoID8YztvhLh5hesBbSWlYOLDjUo="},"jquery-ui/ui-icons_222222_256x240-57adb0d65f4e91dacfee975d9574422bee7486c8a182d60133728c672f2cdbbc.png":{"logical_path":"jquery-ui/ui-icons_222222_256x240.png","mtime":"2015-06-08T14:38:06+03:00","size":4369,"digest":"57adb0d65f4e91dacfee975d9574422bee7486c8a182d60133728c672f2cdbbc","integrity":"sha256-V62w1l9OkdrP7pddlXRCK+50hsihgtYBM3KMZy8s27w="},"jquery-ui/ui-icons_2e83ff_256x240-20f8c6667afc48aa433ee9eb6d8a0584bdbd6b4a4a9091ff1e6b3adb31e63bd9.png":{"logical_path":"jquery-ui/ui-icons_2e83ff_256x240.png","mtime":"2015-06-08T14:38:06+03:00","size":4369,"digest":"20f8c6667afc48aa433ee9eb6d8a0584bdbd6b4a4a9091ff1e6b3adb31e63bd9","integrity":"sha256-IPjGZnr8SKpDPunrbYoFhL29a0pKkJH/Hms62zHmO9k="},"jquery-ui/ui-icons_454545_256x240-07460e843c3e59aaadbb34231e699e856a2980753c7a47b66447da5d9f93fb7f.png":{"logical_path":"jquery-ui/ui-icons_454545_256x240.png","mtime":"2015-06-08T14:38:06+03:00","size":4369,"digest":"07460e843c3e59aaadbb34231e699e856a2980753c7a47b66447da5d9f93fb7f","integrity":"sha256-B0YOhDw+WaqtuzQjHmmehWopgHU8eke2ZEfaXZ+T+38="},"jquery-ui/ui-icons_888888_256x240-ea2e29625de3463465e93b002b065f5833e05b97f7a052b1c141e754d62e1a8b.png":{"logical_path":"jquery-ui/ui-icons_888888_256x240.png","mtime":"2015-06-08T14:38:06+03:00","size":4369,"digest":"ea2e29625de3463465e93b002b065f5833e05b97f7a052b1c141e754d62e1a8b","integrity":"sha256-6i4pYl3jRjRl6TsAKwZfWDPgW5f3oFKxwUHnVNYuGos="},"jquery-ui/ui-icons_cd0a0a_256x240-1e32c6dbf5d3fd342f27a78aa881550d6412aa207f48468724a6a15402b6041b.png":{"logical_path":"jquery-ui/ui-icons_cd0a0a_256x240.png","mtime":"2015-06-08T14:38:06+03:00","size":4369,"digest":"1e32c6dbf5d3fd342f27a78aa881550d6412aa207f48468724a6a15402b6041b","integrity":"sha256-HjLG2/XT/TQvJ6eKqIFVDWQSqiB/SEaHJKahVAK2BBs="},"bootstrap/glyphicons-halflings-regular-13634da87d9e23f8c3ed9108ce1724d183a39ad072e73e1b3d8cbf646d2d0407.eot":{"logical_path":"bootstrap/glyphicons-halflings-regular.eot","mtime":"2015-06-29T12:04:56+03:00","size":20127,"digest":"13634da87d9e23f8c3ed9108ce1724d183a39ad072e73e1b3d8cbf646d2d0407","integrity":"sha256-E2NNqH2eI/jD7ZEIzhck0YOjmtBy5z4bPYy/ZG0tBAc="},"bootstrap/glyphicons-halflings-regular-42f60659d265c1a3c30f9fa42abcbb56bd4a53af4d83d316d6dd7a36903c43e5.svg":{"logical_path":"bootstrap/glyphicons-halflings-regular.svg","mtime":"2015-06-29T12:04:56+03:00","size":108738,"digest":"42f60659d265c1a3c30f9fa42abcbb56bd4a53af4d83d316d6dd7a36903c43e5","integrity":"sha256-QvYGWdJlwaPDD5+kKry7Vr1KU69Ng9MW1t16NpA8Q+U="},"bootstrap/glyphicons-halflings-regular-e395044093757d82afcb138957d06a1ea9361bdcf0b442d06a18a8051af57456.ttf":{"logical_path":"bootstrap/glyphicons-halflings-regular.ttf","mtime":"2015-06-29T12:04:56+03:00","size":45404,"digest":"e395044093757d82afcb138957d06a1ea9361bdcf0b442d06a18a8051af57456","integrity":"sha256-45UEQJN1fYKvyxOJV9BqHqk2G9zwtELQahioBRr1dFY="},"bootstrap/glyphicons-halflings-regular-a26394f7ede100ca118eff2eda08596275a9839b959c226e15439557a5a80742.woff":{"logical_path":"bootstrap/glyphicons-halflings-regular.woff","mtime":"2015-06-29T12:04:56+03:00","size":23424,"digest":"a26394f7ede100ca118eff2eda08596275a9839b959c226e15439557a5a80742","integrity":"sha256-omOU9+3hAMoRjv8u2ghZYnWpg5uVnCJuFUOVV6WoB0I="},"bootstrap/glyphicons-halflings-regular-fe185d11a49676890d47bb783312a0cda5a44c4039214094e7957b4c040ef11c.woff2":{"logical_path":"bootstrap/glyphicons-halflings-regular.woff2","mtime":"2015-06-29T12:04:56+03:00","size":18028,"digest":"fe185d11a49676890d47bb783312a0cda5a44c4039214094e7957b4c040ef11c","integrity":"sha256-/hhdEaSWdokNR7t4MxKgzaWkTEA5IUCU55V7TAQO8Rw="},"admin-manifest-1b7a9adf38de3299af2f97b0c037bf01c21b7056910e5ee41507a91ab675bd4d.css":{"logical_path":"admin-manifest.css","mtime":"2015-06-16T16:19:54+03:00","size":163910,"digest":"1b7a9adf38de3299af2f97b0c037bf01c21b7056910e5ee41507a91ab675bd4d","integrity":"sha256-G3qa3zjeMpmvL5ewwDe/AcIbcFaRDl7kFQepGrZ1vU0="},"admin-manifest-5f612f59c9effcca0be5396c4f00654de236d2bb1b16bbdf929b47e6504381f3.js":{"logical_path":"admin-manifest.js","mtime":"2015-06-08T14:38:06+03:00","size":323893,"digest":"5f612f59c9effcca0be5396c4f00654de236d2bb1b16bbdf929b47e6504381f3","integrity":"sha256-X2EvWcnv/MoL5TlsTwBlTeI20rsbFrvfkptH5lBDgfM="},"registrar-manifest-b4694748846de7a7f12463c4524f71013645b58fc770188432dfc5c5a93ded3a.css":{"logical_path":"registrar-manifest.css","mtime":"2015-06-16T16:19:54+03:00","size":187703,"digest":"b4694748846de7a7f12463c4524f71013645b58fc770188432dfc5c5a93ded3a","integrity":"sha256-tGlHSIRt56fxJGPEUk9xATZFtY/HcBiEMt/Fxak97To="},"registrar-manifest-700f689d9abdd73516260d2622b912a8d3e003de966996ba7a331bfa065720e7.js":{"logical_path":"registrar-manifest.js","mtime":"2015-06-19T15:29:08+03:00","size":314928,"digest":"700f689d9abdd73516260d2622b912a8d3e003de966996ba7a331bfa065720e7","integrity":"sha256-cA9onZq91zUWJg0mIrkSqNPgA96WaZa6ejMb+gZXIOc="},"registrant-manifest-ffb2502ddd176bf6bf64424abdf509f1c2fa44883cd159ffc6e0bf5bba81a226.css":{"logical_path":"registrant-manifest.css","mtime":"2015-06-16T16:19:54+03:00","size":187888,"digest":"ffb2502ddd176bf6bf64424abdf509f1c2fa44883cd159ffc6e0bf5bba81a226","integrity":"sha256-/7JQLd0Xa/a/ZEJKvfUJ8cL6RIg80Vn/xuC/W7qBoiY="},"registrant-manifest-700f689d9abdd73516260d2622b912a8d3e003de966996ba7a331bfa065720e7.js":{"logical_path":"registrant-manifest.js","mtime":"2015-06-19T15:29:08+03:00","size":314928,"digest":"700f689d9abdd73516260d2622b912a8d3e003de966996ba7a331bfa065720e7","integrity":"sha256-cA9onZq91zUWJg0mIrkSqNPgA96WaZa6ejMb+gZXIOc="},"shared/pdf-8d8bf4207c64d5de1ad8a683ed3c0d97dbe85a73644e9440b3a7c1d638c93590.css":{"logical_path":"shared/pdf.css","mtime":"2015-05-15T15:29:32+03:00","size":119782,"digest":"8d8bf4207c64d5de1ad8a683ed3c0d97dbe85a73644e9440b3a7c1d638c93590","integrity":"sha256-jYv0IHxk1d4a2KaD7TwNl9voWnNkTpRAs6fB1jjJNZA="},"admin/application-2e4aafc94dbce8d43d7bac4eb5521a14a72e3bbeece3b4363494d70fcd274542.js":{"logical_path":"admin/application.js","mtime":"2015-06-08T11:23:15+03:00","size":287,"digest":"2e4aafc94dbce8d43d7bac4eb5521a14a72e3bbeece3b4363494d70fcd274542","integrity":"sha256-LkqvyU286NQ9e6xOtVIaFKcuO77s47Q2NJTXD80nRUI="},"registrar/application-f96ff2f3f4d2326db627c9191074e5c10ad3679eac8eb2d22e3a9faef39e06a9.js":{"logical_path":"registrar/application.js","mtime":"2015-06-19T15:29:08+03:00","size":826,"digest":"f96ff2f3f4d2326db627c9191074e5c10ad3679eac8eb2d22e3a9faef39e06a9","integrity":"sha256-+W/y8/TSMm22J8kZEHTlwQrTZ56sjrLSLjqfrvOeBqk="},"registrar-manifest-413fda057832b25dee9d45f5f07b29ac369fc85f51ecd9e7bc2cdefa5297b4f3.js":{"logical_path":"registrar-manifest.js","mtime":"2015-06-08T14:38:06+03:00","size":314906,"digest":"413fda057832b25dee9d45f5f07b29ac369fc85f51ecd9e7bc2cdefa5297b4f3","integrity":"sha256-QT/aBXgysl3unUX18HsprDafyF9R7NnnvCze+lKXtPM="},"registrant-manifest-f9e9d795de4f7dabe387365fd329c1cb24da923bd357988c120cc5710230cc48.js":{"logical_path":"registrant-manifest.js","mtime":"2015-06-08T14:38:06+03:00","size":314906,"digest":"f9e9d795de4f7dabe387365fd329c1cb24da923bd357988c120cc5710230cc48","integrity":"sha256-+enXld5PfavjhzZf0ynByyTakjvTV5iMEgzFcQIwzEg="},"registrar/application-978b21a99ae3caabb8a9e301dccaa0b93f86cc789a9595158c98ee51393b8cb9.js":{"logical_path":"registrar/application.js","mtime":"2015-06-19T16:03:53+03:00","size":804,"digest":"978b21a99ae3caabb8a9e301dccaa0b93f86cc789a9595158c98ee51393b8cb9","integrity":"sha256-l4shqZrjyqu4qeMB3MqguT+GzHialZUVjJjuUTk7jLk="},"admin-manifest-6e5e54ad9b1f48eb4372bf4d3ffd1854d859dc5e2ab4977dbf59c4abfeebd760.css":{"logical_path":"admin-manifest.css","mtime":"2015-07-13T18:30:38+03:00","size":169226,"digest":"6e5e54ad9b1f48eb4372bf4d3ffd1854d859dc5e2ab4977dbf59c4abfeebd760","integrity":"sha256-bl5UrZsfSOtDcr9NP/0YVNhZ3F4qtJd9v1nEq/7r12A="},"admin-manifest-b904d5679d9ed357c2412b8d9054c5d60b6c8524e11e4ff80d2e45580108e709.js":{"logical_path":"admin-manifest.js","mtime":"2015-07-13T18:30:38+03:00","size":325028,"digest":"b904d5679d9ed357c2412b8d9054c5d60b6c8524e11e4ff80d2e45580108e709","integrity":"sha256-uQTVZ52e01fCQSuNkFTF1gtshSThHk/4DS5FWAEI5wk="},"registrar-manifest-d9e1a3fb37873e44c313486ea2ad7ff1791e9ce4d6d44e95a602d87d480f27e1.css":{"logical_path":"registrar-manifest.css","mtime":"2015-07-13T18:30:38+03:00","size":193019,"digest":"d9e1a3fb37873e44c313486ea2ad7ff1791e9ce4d6d44e95a602d87d480f27e1","integrity":"sha256-2eGj+zeHPkTDE0huoq1/8XkenOTW1E6VpgLYfUgPJ+E="},"registrar-manifest-0297caa2939148f9284b754e7a0cc2a08272b8ff3194d97be0c95858498cbe39.js":{"logical_path":"registrar-manifest.js","mtime":"2015-07-13T18:30:38+03:00","size":316041,"digest":"0297caa2939148f9284b754e7a0cc2a08272b8ff3194d97be0c95858498cbe39","integrity":"sha256-ApfKopORSPkoS3VOegzCoIJyuP8xlNl74MlYWEmMvjk="},"registrant-manifest-651e30954782cb9b1e582abeb18c47402c951e3fd4aa71311363a058869f4d66.css":{"logical_path":"registrant-manifest.css","mtime":"2015-07-13T18:30:38+03:00","size":193204,"digest":"651e30954782cb9b1e582abeb18c47402c951e3fd4aa71311363a058869f4d66","integrity":"sha256-ZR4wlUeCy5seWCq+sYxHQCyVHj/UqnExE2OgWIafTWY="},"registrant-manifest-a94cc4d69bafc048f1cb08fffd1c733fc37157e660e4897005207cf03f1d98ca.js":{"logical_path":"registrant-manifest.js","mtime":"2015-07-13T18:30:38+03:00","size":316041,"digest":"a94cc4d69bafc048f1cb08fffd1c733fc37157e660e4897005207cf03f1d98ca","integrity":"sha256-qUzE1puvwEjxywj//RxzP8NxV+Zg5IlwBSB88D8dmMo="},"shared/pdf-3f6858cfb5eec601002c5a418b287ccdddf38bb953111ffdff1321d3b1fbbddc.css":{"logical_path":"shared/pdf.css","mtime":"2015-06-29T12:04:56+03:00","size":125098,"digest":"3f6858cfb5eec601002c5a418b287ccdddf38bb953111ffdff1321d3b1fbbddc","integrity":"sha256-P2hYz7XuxgEALFpBiyh8zd3zi7lTER/9/xMh07H7vdw="},"admin-manifest-7058b706893af7473775946fa6171e3c3d7d81f5fe323c402acc8b207eac4f1b.css":{"logical_path":"admin-manifest.css","mtime":"2015-07-22T12:51:15+03:00","size":169258,"digest":"7058b706893af7473775946fa6171e3c3d7d81f5fe323c402acc8b207eac4f1b","integrity":"sha256-cFi3Bok690c3dZRvphcePD19gfX+MjxAKsyLIH6sTxs="},"registrar-manifest-12ddf3d27aeb82ed229b8a7ec6b50fdfa33c115326bb540d3c64d630122382bb.css":{"logical_path":"registrar-manifest.css","mtime":"2015-07-22T12:51:15+03:00","size":193051,"digest":"12ddf3d27aeb82ed229b8a7ec6b50fdfa33c115326bb540d3c64d630122382bb","integrity":"sha256-Et3z0nrrgu0im4p+xrUP36M8EVMmu1QNPGTWMBIjgrs="},"registrant-manifest-9711ccec91402d435ddfb0b0fbf708a1ffef67868a86c38014f975183d61e324.css":{"logical_path":"registrant-manifest.css","mtime":"2015-07-22T12:51:15+03:00","size":193236,"digest":"9711ccec91402d435ddfb0b0fbf708a1ffef67868a86c38014f975183d61e324","integrity":"sha256-lxHM7JFALUNd37Cw+/cIof/vZ4aKhsOAFPl1GD1h4yQ="},"admin-manifest-8e7ee8a12ecba21371b22a0f225d918c48c4edb92c4e793c76bcbc85f1d11b2d.js":{"logical_path":"admin-manifest.js","mtime":"2015-07-29T11:55:32+03:00","size":325018,"digest":"8e7ee8a12ecba21371b22a0f225d918c48c4edb92c4e793c76bcbc85f1d11b2d","integrity":"sha256-jn7ooS7LohNxsioPIl2RjEjE7bksTnk8dry8hfHRGy0="},"registrar-manifest-ccfec673488bbf1709b257f959ddaba3153692cd4ed34f7c10617e7cb8079c7f.js":{"logical_path":"registrar-manifest.js","mtime":"2015-07-29T11:55:32+03:00","size":316031,"digest":"ccfec673488bbf1709b257f959ddaba3153692cd4ed34f7c10617e7cb8079c7f","integrity":"sha256-zP7Gc0iLvxcJslf5Wd2roxU2ks1O0098EGF+fLgHnH8="},"registrant-manifest-029b3513f5314789848386b24148311e44df8160a0a4b5b587a6e6a446eddd45.js":{"logical_path":"registrant-manifest.js","mtime":"2015-07-29T11:55:32+03:00","size":316031,"digest":"029b3513f5314789848386b24148311e44df8160a0a4b5b587a6e6a446eddd45","integrity":"sha256-Aps1E/UxR4mEg4ayQUgxHkTfgWCgpLW1h6bmpEbt3UU="},"admin-manifest-faacc44f2693434d482abfa34e565890367f8a34a73a4334fb690dfd36606599.css":{"logical_path":"admin-manifest.css","mtime":"2015-07-30T17:08:04+03:00","size":195931,"digest":"faacc44f2693434d482abfa34e565890367f8a34a73a4334fb690dfd36606599","integrity":"sha256-+qzETyaTQ01IKr+jTlZYkDZ/ijSnOkM0+2kN/TZgZZk="},"admin-manifest-2d50db228bce0154b10046fa6de58775cf879387a8a2e63e278e51ef7802ddba.js":{"logical_path":"admin-manifest.js","mtime":"2015-07-30T17:08:04+03:00","size":391499,"digest":"2d50db228bce0154b10046fa6de58775cf879387a8a2e63e278e51ef7802ddba","integrity":"sha256-LVDbIovOAVSxAEb6beWHdc+Hk4eoouY+J45R73gC3bo="}},"assets":{"admin-manifest.css":"admin-manifest-faacc44f2693434d482abfa34e565890367f8a34a73a4334fb690dfd36606599.css","admin-manifest.js":"admin-manifest-2d50db228bce0154b10046fa6de58775cf879387a8a2e63e278e51ef7802ddba.js","registrar-manifest.css":"registrar-manifest-12ddf3d27aeb82ed229b8a7ec6b50fdfa33c115326bb540d3c64d630122382bb.css","registrar-manifest.js":"registrar-manifest-ccfec673488bbf1709b257f959ddaba3153692cd4ed34f7c10617e7cb8079c7f.js","registrant-manifest.css":"registrant-manifest-9711ccec91402d435ddfb0b0fbf708a1ffef67868a86c38014f975183d61e324.css","registrant-manifest.js":"registrant-manifest-029b3513f5314789848386b24148311e44df8160a0a4b5b587a6e6a446eddd45.js","shared/pdf.css":"shared/pdf-3f6858cfb5eec601002c5a418b287ccdddf38bb953111ffdff1321d3b1fbbddc.css","select2.png":"select2-d6b5d8d83dbc18fb8d77c8761d331cd9e5123c9684950bab0406e98a24ac5ae8.png","select2-spinner.gif":"select2-spinner-f6ecff617ec2ba7f559e6f535cad9b70a3f91120737535dab4d4548a6c83576c.gif","select2x2.png":"select2x2-6fe28d687dc0ed4d96016238c608ba1e7198c9c9accfa0b360b78018b9fb9bc2.png","alpha.png":"alpha-9ac45a6b3c13dd5c5cf1b5d18c6f24a537dd2e4598238527d232a3e2ea5b5947.png","bg.jpg":"bg-b8036abd2f0f36e3ab54d5d5b25b0fbac11d63ec6106d959df3fa180b379de05.jpg","danske.png":"danske-07a4395cc406785da129414e15872fe1d6a4f6f6da0066da6701b56cdb72ea96.png","development.png":"development-0b993e22410c7952394ac19ce3b41b722a97b93138a9a002091e1e5226d29bf5.png","eis-logo-et.png":"eis-logo-et-86a549d266cda73e3225c5eeba14532c59d498e1fd980ec129fded68da8bb307.png","favicon.ico":"favicon-309e00e2f78f9a2b042abc2806a8a4ed9cf6bb5d3f00ccc0985b1308bfd86c49.ico","id_card.gif":"id_card-ea506a49b25c8de4e68e786d90f5ec5defb6c8e895b90f2f129815f5e550fe8e.gif","lhv.png":"lhv-4d09d3126a05df392b73c54fa9b1eb605798c2e9bd361cf44500f73038832030.png","mid.gif":"mid-275543ecea377debe1ac892470f3aea4f7e7f0f9089fc0fbea4de410742e5239.gif","nordea.png":"nordea-75c938c7436e0c8316f056be8df8acd0e8b16e09790e78f78da96d9f8633ef3b.png","registrar/bg-alpha.png":"registrar/bg-alpha-9ac45a6b3c13dd5c5cf1b5d18c6f24a537dd2e4598238527d232a3e2ea5b5947.png","registrar/bg-development.png":"registrar/bg-development-0b993e22410c7952394ac19ce3b41b722a97b93138a9a002091e1e5226d29bf5.png","registrar/bg-staging.png":"registrar/bg-staging-6276f8c00911bc99f301f919e408ae3ef726c7378324ac55fd5d378ba3a4dc2d.png","registrar/favicon.ico":"registrar/favicon-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.ico","seb.png":"seb-9c9d943014cc4ee706244893cd8a2c4a8a7cc97bfbdef6a66e22c72f33d5f25e.png","staging.png":"staging-6276f8c00911bc99f301f919e408ae3ef726c7378324ac55fd5d378ba3a4dc2d.png","swed.png":"swed-2cf45729062cf5fa634247ba372c579c97f382e5cc43fa111219077e7473fdbb.png","test.png":"test-9ac45a6b3c13dd5c5cf1b5d18c6f24a537dd2e4598238527d232a3e2ea5b5947.png","admin/application.js":"admin/application-2e4aafc94dbce8d43d7bac4eb5521a14a72e3bbeece3b4363494d70fcd274542.js","registrar/application.js":"registrar/application-978b21a99ae3caabb8a9e301dccaa0b93f86cc789a9595158c98ee51393b8cb9.js","etelkalight-webfont.eot":"etelkalight-webfont-baf7e35ab2f64bf1c6fa4476d3934c7422062995738fd9e5715b02f55002d7c0.eot","etelkalight-webfont.svg":"etelkalight-webfont-2b575f6e4696d74957af27a7c7bb7976b7ca31d0ebe8ec25bb4c3494d5d16e24.svg","etelkalight-webfont.ttf":"etelkalight-webfont-f68a2db6346d864f82c3b3e725ee60b0217e91e46ec47f96710f70f996b61af1.ttf","etelkalight-webfont.woff":"etelkalight-webfont-1ed38dbac6b817bf74bd46a98d61005aa2615db7ac743e4037364d1021084043.woff","etelkalightbold-webfont.eot":"etelkalightbold-webfont-1d94cabe6fb55b05f746fe0aa51a7a503683d7afdb68360ed26bfac03e1b3c39.eot","etelkalightbold-webfont.svg":"etelkalightbold-webfont-bb0c8e17b99b10f211be3531a51d6ad48a5c6e4670c8fb6160a329fa4758c555.svg","etelkalightbold-webfont.ttf":"etelkalightbold-webfont-0f06d1e7f099578e1cc0e9b1875aca2a7128c0ca0d640fd504e97bae0b028429.ttf","etelkalightbold-webfont.woff":"etelkalightbold-webfont-d608c036b3e3f04ca87a1c494f8d9e9620a729b2760b5eb1dcee52c4bc8e8805.woff","etelkalightitalic-webfont.eot":"etelkalightitalic-webfont-ce5cdffe6c589a6dc6bd2c482c718486ff5fb416ab01740750db325179e58654.eot","etelkalightitalic-webfont.svg":"etelkalightitalic-webfont-dd5353c2af4ea63e1d0e99ec5f1f85162cee0c4dd0a3840260a2606eefc3e517.svg","etelkalightitalic-webfont.ttf":"etelkalightitalic-webfont-54eb91ad0e0b639f50be02b7c25836c99ad989185f5d2a240d60ea14a1b7384a.ttf","etelkalightitalic-webfont.woff":"etelkalightitalic-webfont-d1fb9621d40ef45104078a4a5b98ce4cba00872cf8ac56e299cf1397c146cac3.woff","infotexb-webfont.eot":"infotexb-webfont-1951e43e1d9ab99b0d4998abba4aab34f3e68b337be90800db517e4a8d27d001.eot","infotexb-webfont.svg":"infotexb-webfont-0dda72e34d0d0ced7693b55ed08acc60fb1a9036afd7736e432ac3f22f2e6fdf.svg","infotexb-webfont.ttf":"infotexb-webfont-c0737d1e2edff50645e201bf99f68f2313502ee2bdeb2e56435ee24721baf5cd.ttf","infotexb-webfont.woff":"infotexb-webfont-8da32e6db23c39390c55dd5ea8949714757fddba516c5db65e72867504493fbc.woff","infotexm-webfont.eot":"infotexm-webfont-74df99faeb66d8b02966b8884b860af03c359ed41d348ddb813dbcc3c460eb26.eot","infotexm-webfont.svg":"infotexm-webfont-0b52ef10620b8cb7289dc809aac67826d5031e6ab040194fdb7365dc83e95557.svg","infotexm-webfont.ttf":"infotexm-webfont-1d244d27a4ec4c1a5f98c82966faa26e7855c4292c730429477003b6dab5c08b.ttf","infotexm-webfont.woff":"infotexm-webfont-872b5ab4e0b7de6655a52f137a3c99f1e7941fa91ff21a56550f2039834ee9d0.woff","jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png":"jquery-ui/ui-bg_flat_0_aaaaaa_40x100-9a8492a580bf85d3e98ae8861fbd45567e5a1f83eeafcf9574da0399d5f602ab.png","jquery-ui/ui-bg_flat_75_ffffff_40x100.png":"jquery-ui/ui-bg_flat_75_ffffff_40x100-39ab7ccd9f4e82579da78a9241265df288d8eb65dbbd7cf48aed2d0129887df5.png","jquery-ui/ui-bg_glass_55_fbf9ee_1x400.png":"jquery-ui/ui-bg_glass_55_fbf9ee_1x400-691597e8a40a891ea94d3589976ecfc33e6145c49422443b00ac2b5a0022964c.png","jquery-ui/ui-bg_glass_65_ffffff_1x400.png":"jquery-ui/ui-bg_glass_65_ffffff_1x400-f0e6cd91b837d5c5644d026e5ffeccd907953317cd5c0f689901733afda260b2.png","jquery-ui/ui-bg_glass_75_dadada_1x400.png":"jquery-ui/ui-bg_glass_75_dadada_1x400-c108f5cbf2dd9ec07a26530695ddd95e1664597ce6c056ae44c162cc2e28cec4.png","jquery-ui/ui-bg_glass_75_e6e6e6_1x400.png":"jquery-ui/ui-bg_glass_75_e6e6e6_1x400-ddf5dd4e0ef2b185e8bb0af7b6e90ebe74a84384cb4700658e76e754c8bfe550.png","jquery-ui/ui-bg_glass_95_fef1ec_1x400.png":"jquery-ui/ui-bg_glass_95_fef1ec_1x400-f6f1c1bedf1a0f37cfef81d12f5f012869d1ee7c984775a569827a1784d34f5c.png","jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100.png":"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100-54270656df079c4da5182629a080fc633b6f84b87985eb016d25a560e2c38d4a.png","jquery-ui/ui-icons_222222_256x240.png":"jquery-ui/ui-icons_222222_256x240-57adb0d65f4e91dacfee975d9574422bee7486c8a182d60133728c672f2cdbbc.png","jquery-ui/ui-icons_2e83ff_256x240.png":"jquery-ui/ui-icons_2e83ff_256x240-20f8c6667afc48aa433ee9eb6d8a0584bdbd6b4a4a9091ff1e6b3adb31e63bd9.png","jquery-ui/ui-icons_454545_256x240.png":"jquery-ui/ui-icons_454545_256x240-07460e843c3e59aaadbb34231e699e856a2980753c7a47b66447da5d9f93fb7f.png","jquery-ui/ui-icons_888888_256x240.png":"jquery-ui/ui-icons_888888_256x240-ea2e29625de3463465e93b002b065f5833e05b97f7a052b1c141e754d62e1a8b.png","jquery-ui/ui-icons_cd0a0a_256x240.png":"jquery-ui/ui-icons_cd0a0a_256x240-1e32c6dbf5d3fd342f27a78aa881550d6412aa207f48468724a6a15402b6041b.png","bootstrap/glyphicons-halflings-regular.eot":"bootstrap/glyphicons-halflings-regular-13634da87d9e23f8c3ed9108ce1724d183a39ad072e73e1b3d8cbf646d2d0407.eot","bootstrap/glyphicons-halflings-regular.svg":"bootstrap/glyphicons-halflings-regular-42f60659d265c1a3c30f9fa42abcbb56bd4a53af4d83d316d6dd7a36903c43e5.svg","bootstrap/glyphicons-halflings-regular.ttf":"bootstrap/glyphicons-halflings-regular-e395044093757d82afcb138957d06a1ea9361bdcf0b442d06a18a8051af57456.ttf","bootstrap/glyphicons-halflings-regular.woff":"bootstrap/glyphicons-halflings-regular-a26394f7ede100ca118eff2eda08596275a9839b959c226e15439557a5a80742.woff","bootstrap/glyphicons-halflings-regular.woff2":"bootstrap/glyphicons-halflings-regular-fe185d11a49676890d47bb783312a0cda5a44c4039214094e7957b4c040ef11c.woff2"}} \ No newline at end of file +{"files":{"admin-manifest-58660819bb55d95ee3f0c8149722a0e2ea507a3a45f24d22a2610d060bdc8dc0.css":{"logical_path":"admin-manifest.css","mtime":"2015-06-16T16:19:54+03:00","size":435358,"digest":"58660819bb55d95ee3f0c8149722a0e2ea507a3a45f24d22a2610d060bdc8dc0","integrity":"sha256-WGYIGbtV2V7j8MgUlyKg4upQejpF8k0iomENBgvcjcA="},"admin-manifest-025801216a3b153631239205b373c5e4ac42d55cc9a53960d3c485b5eed9d467.js":{"logical_path":"admin-manifest.js","mtime":"2015-06-08T14:38:06+03:00","size":712602,"digest":"025801216a3b153631239205b373c5e4ac42d55cc9a53960d3c485b5eed9d467","integrity":"sha256-AlgBIWo7FTYxI5IFs3PF5KxC1VzJpTlg08SFte7Z1Gc="},"registrar-manifest-70dd177301fef149b726705917e97491911b4a74c1760a223eaefaaf3918a38b.css":{"logical_path":"registrar-manifest.css","mtime":"2015-06-16T16:19:54+03:00","size":475725,"digest":"70dd177301fef149b726705917e97491911b4a74c1760a223eaefaaf3918a38b","integrity":"sha256-cN0XcwH+8Um3JnBZF+l0kZEbSnTBdgoiPq76rzkYo4s="},"registrar-manifest-037217137e7dd50d2a0c4aec309e532b9cd2696de45c826cc0c4ff8bf58025e6.js":{"logical_path":"registrar-manifest.js","mtime":"2015-06-19T15:29:08+03:00","size":730835,"digest":"037217137e7dd50d2a0c4aec309e532b9cd2696de45c826cc0c4ff8bf58025e6","integrity":"sha256-A3IXE3591Q0qDErsMJ5TK5zSaW3kXIJswMT/i/WAJeY="},"registrant-manifest-6bfceed2fd52330f303b890fa9d229b1ecd097fda1b7df2db41829b8c25d40c0.css":{"logical_path":"registrant-manifest.css","mtime":"2015-06-16T16:19:54+03:00","size":476257,"digest":"6bfceed2fd52330f303b890fa9d229b1ecd097fda1b7df2db41829b8c25d40c0","integrity":"sha256-a/zu0v1SMw8wO4kPqdIpsezQl/2ht98ttBgpuMJdQMA="},"registrant-manifest-037217137e7dd50d2a0c4aec309e532b9cd2696de45c826cc0c4ff8bf58025e6.js":{"logical_path":"registrant-manifest.js","mtime":"2015-06-19T15:29:08+03:00","size":730835,"digest":"037217137e7dd50d2a0c4aec309e532b9cd2696de45c826cc0c4ff8bf58025e6","integrity":"sha256-A3IXE3591Q0qDErsMJ5TK5zSaW3kXIJswMT/i/WAJeY="},"shared/pdf-2f929bf92af2ce26249b1b02bb998c63cf49da0ae4e3526f869fccd0af65ac3b.css":{"logical_path":"shared/pdf.css","mtime":"2015-05-15T15:29:32+03:00","size":353119,"digest":"2f929bf92af2ce26249b1b02bb998c63cf49da0ae4e3526f869fccd0af65ac3b","integrity":"sha256-L5Kb+SryziYkmxsCu5mMY89J2grk41Jvhp/M0K9lrDs="},"select2-d6b5d8d83dbc18fb8d77c8761d331cd9e5123c9684950bab0406e98a24ac5ae8.png":{"logical_path":"select2.png","mtime":"2015-05-14T14:33:49+03:00","size":613,"digest":"d6b5d8d83dbc18fb8d77c8761d331cd9e5123c9684950bab0406e98a24ac5ae8","integrity":"sha256-1rXY2D28GPuNd8h2HTMc2eUSPJaElQurBAbpiiSsWug="},"select2-spinner-f6ecff617ec2ba7f559e6f535cad9b70a3f91120737535dab4d4548a6c83576c.gif":{"logical_path":"select2-spinner.gif","mtime":"2015-05-14T14:33:49+03:00","size":1849,"digest":"f6ecff617ec2ba7f559e6f535cad9b70a3f91120737535dab4d4548a6c83576c","integrity":"sha256-9uz/YX7Cun9Vnm9TXK2bcKP5ESBzdTXatNRUimyDV2w="},"select2x2-6fe28d687dc0ed4d96016238c608ba1e7198c9c9accfa0b360b78018b9fb9bc2.png":{"logical_path":"select2x2.png","mtime":"2015-05-14T14:33:49+03:00","size":845,"digest":"6fe28d687dc0ed4d96016238c608ba1e7198c9c9accfa0b360b78018b9fb9bc2","integrity":"sha256-b+KNaH3A7U2WAWI4xgi6HnGYycmsz6CzYLeAGLn7m8I="},"alpha-9ac45a6b3c13dd5c5cf1b5d18c6f24a537dd2e4598238527d232a3e2ea5b5947.png":{"logical_path":"alpha.png","mtime":"2015-05-15T15:29:32+03:00","size":7089,"digest":"9ac45a6b3c13dd5c5cf1b5d18c6f24a537dd2e4598238527d232a3e2ea5b5947","integrity":"sha256-msRaazwT3Vxc8bXRjG8kpTfdLkWYI4Un0jKj4upbWUc="},"bg-b8036abd2f0f36e3ab54d5d5b25b0fbac11d63ec6106d959df3fa180b379de05.jpg":{"logical_path":"bg.jpg","mtime":"2015-05-15T15:29:32+03:00","size":69058,"digest":"b8036abd2f0f36e3ab54d5d5b25b0fbac11d63ec6106d959df3fa180b379de05","integrity":"sha256-uANqvS8PNuOrVNXVslsPusEdY+xhBtlZ3z+hgLN53gU="},"danske-07a4395cc406785da129414e15872fe1d6a4f6f6da0066da6701b56cdb72ea96.png":{"logical_path":"danske.png","mtime":"2015-05-15T15:29:32+03:00","size":1130,"digest":"07a4395cc406785da129414e15872fe1d6a4f6f6da0066da6701b56cdb72ea96","integrity":"sha256-B6Q5XMQGeF2hKUFOFYcv4dak9vbaAGbaZwG1bNty6pY="},"development-0b993e22410c7952394ac19ce3b41b722a97b93138a9a002091e1e5226d29bf5.png":{"logical_path":"development.png","mtime":"2015-05-15T15:29:32+03:00","size":14496,"digest":"0b993e22410c7952394ac19ce3b41b722a97b93138a9a002091e1e5226d29bf5","integrity":"sha256-C5k+IkEMeVI5SsGc47QbciqXuTE4qaACCR4eUibSm/U="},"eis-logo-et-86a549d266cda73e3225c5eeba14532c59d498e1fd980ec129fded68da8bb307.png":{"logical_path":"eis-logo-et.png","mtime":"2015-05-15T15:29:32+03:00","size":1440,"digest":"86a549d266cda73e3225c5eeba14532c59d498e1fd980ec129fded68da8bb307","integrity":"sha256-hqVJ0mbNpz4yJcXuuhRTLFnUmOH9mA7BKf3taNqLswc="},"favicon-309e00e2f78f9a2b042abc2806a8a4ed9cf6bb5d3f00ccc0985b1308bfd86c49.ico":{"logical_path":"favicon.ico","mtime":"2015-05-15T15:29:32+03:00","size":1150,"digest":"309e00e2f78f9a2b042abc2806a8a4ed9cf6bb5d3f00ccc0985b1308bfd86c49","integrity":"sha256-MJ4A4vePmisEKrwoBqik7Zz2u10/AMzAmFsTCL/YbEk="},"id_card-ea506a49b25c8de4e68e786d90f5ec5defb6c8e895b90f2f129815f5e550fe8e.gif":{"logical_path":"id_card.gif","mtime":"2015-05-15T15:29:32+03:00","size":564,"digest":"ea506a49b25c8de4e68e786d90f5ec5defb6c8e895b90f2f129815f5e550fe8e","integrity":"sha256-6lBqSbJcjeTmjnhtkPXsXe+2yOiVuQ8vEpgV9eVQ/o4="},"lhv-4d09d3126a05df392b73c54fa9b1eb605798c2e9bd361cf44500f73038832030.png":{"logical_path":"lhv.png","mtime":"2015-05-15T15:29:32+03:00","size":3417,"digest":"4d09d3126a05df392b73c54fa9b1eb605798c2e9bd361cf44500f73038832030","integrity":"sha256-TQnTEmoF3zkrc8VPqbHrYFeYwum9Nhz0RQD3MDiDIDA="},"mid-275543ecea377debe1ac892470f3aea4f7e7f0f9089fc0fbea4de410742e5239.gif":{"logical_path":"mid.gif","mtime":"2015-05-15T15:29:32+03:00","size":1566,"digest":"275543ecea377debe1ac892470f3aea4f7e7f0f9089fc0fbea4de410742e5239","integrity":"sha256-J1VD7Oo3fevhrIkkcPOupPfn8PkIn8D76k3kEHQuUjk="},"nordea-75c938c7436e0c8316f056be8df8acd0e8b16e09790e78f78da96d9f8633ef3b.png":{"logical_path":"nordea.png","mtime":"2015-05-15T15:29:32+03:00","size":1181,"digest":"75c938c7436e0c8316f056be8df8acd0e8b16e09790e78f78da96d9f8633ef3b","integrity":"sha256-dck4x0NuDIMW8Fa+jfis0Oixbgl5Dnj3jaltn4Yz7zs="},"registrar/bg-alpha-9ac45a6b3c13dd5c5cf1b5d18c6f24a537dd2e4598238527d232a3e2ea5b5947.png":{"logical_path":"registrar/bg-alpha.png","mtime":"2015-05-15T15:29:32+03:00","size":7089,"digest":"9ac45a6b3c13dd5c5cf1b5d18c6f24a537dd2e4598238527d232a3e2ea5b5947","integrity":"sha256-msRaazwT3Vxc8bXRjG8kpTfdLkWYI4Un0jKj4upbWUc="},"registrar/bg-development-0b993e22410c7952394ac19ce3b41b722a97b93138a9a002091e1e5226d29bf5.png":{"logical_path":"registrar/bg-development.png","mtime":"2015-05-15T15:29:32+03:00","size":14496,"digest":"0b993e22410c7952394ac19ce3b41b722a97b93138a9a002091e1e5226d29bf5","integrity":"sha256-C5k+IkEMeVI5SsGc47QbciqXuTE4qaACCR4eUibSm/U="},"registrar/bg-staging-6276f8c00911bc99f301f919e408ae3ef726c7378324ac55fd5d378ba3a4dc2d.png":{"logical_path":"registrar/bg-staging.png","mtime":"2015-05-15T15:29:32+03:00","size":12294,"digest":"6276f8c00911bc99f301f919e408ae3ef726c7378324ac55fd5d378ba3a4dc2d","integrity":"sha256-Ynb4wAkRvJnzAfkZ5AiuPvcmxzeDJKxV/V03i6Ok3C0="},"registrar/favicon-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.ico":{"logical_path":"registrar/favicon.ico","mtime":"2015-05-15T15:29:32+03:00","size":0,"digest":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","integrity":"sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="},"seb-9c9d943014cc4ee706244893cd8a2c4a8a7cc97bfbdef6a66e22c72f33d5f25e.png":{"logical_path":"seb.png","mtime":"2015-05-15T15:29:32+03:00","size":2439,"digest":"9c9d943014cc4ee706244893cd8a2c4a8a7cc97bfbdef6a66e22c72f33d5f25e","integrity":"sha256-nJ2UMBTMTucGJEiTzYosSop8yXv73vambiLHLzPV8l4="},"staging-6276f8c00911bc99f301f919e408ae3ef726c7378324ac55fd5d378ba3a4dc2d.png":{"logical_path":"staging.png","mtime":"2015-05-15T15:29:32+03:00","size":12294,"digest":"6276f8c00911bc99f301f919e408ae3ef726c7378324ac55fd5d378ba3a4dc2d","integrity":"sha256-Ynb4wAkRvJnzAfkZ5AiuPvcmxzeDJKxV/V03i6Ok3C0="},"swed-2cf45729062cf5fa634247ba372c579c97f382e5cc43fa111219077e7473fdbb.png":{"logical_path":"swed.png","mtime":"2015-05-15T15:29:32+03:00","size":1521,"digest":"2cf45729062cf5fa634247ba372c579c97f382e5cc43fa111219077e7473fdbb","integrity":"sha256-LPRXKQYs9fpjQke6NyxXnJfzguXMQ/oREhkHfnRz/bs="},"test-9ac45a6b3c13dd5c5cf1b5d18c6f24a537dd2e4598238527d232a3e2ea5b5947.png":{"logical_path":"test.png","mtime":"2015-05-15T15:29:32+03:00","size":7089,"digest":"9ac45a6b3c13dd5c5cf1b5d18c6f24a537dd2e4598238527d232a3e2ea5b5947","integrity":"sha256-msRaazwT3Vxc8bXRjG8kpTfdLkWYI4Un0jKj4upbWUc="},"admin/application-b1444f5083209e83d34a087d1ff78a91b8a3eb487815a1987cbc5a120bf4e48f.js":{"logical_path":"admin/application.js","mtime":"2015-06-08T11:23:15+03:00","size":396,"digest":"b1444f5083209e83d34a087d1ff78a91b8a3eb487815a1987cbc5a120bf4e48f","integrity":"sha256-sURPUIMgnoPTSgh9H/eKkbij60h4FaGYfLxaEgv05I8="},"registrar/application-8ad3d7cb40be14b5c7dd76340db3618c0cd651644aa1e29bff59cc32e454ea85.js":{"logical_path":"registrar/application.js","mtime":"2015-06-19T15:29:08+03:00","size":1107,"digest":"8ad3d7cb40be14b5c7dd76340db3618c0cd651644aa1e29bff59cc32e454ea85","integrity":"sha256-itPXy0C+FLXH3XY0DbNhjAzWUWRKoeKb/1nMMuRU6oU="},"etelkalight-webfont-baf7e35ab2f64bf1c6fa4476d3934c7422062995738fd9e5715b02f55002d7c0.eot":{"logical_path":"etelkalight-webfont.eot","mtime":"2015-05-15T15:29:32+03:00","size":23109,"digest":"baf7e35ab2f64bf1c6fa4476d3934c7422062995738fd9e5715b02f55002d7c0","integrity":"sha256-uvfjWrL2S/HG+kR205NMdCIGKZVzj9nlcVsC9VAC18A="},"etelkalight-webfont-2b575f6e4696d74957af27a7c7bb7976b7ca31d0ebe8ec25bb4c3494d5d16e24.svg":{"logical_path":"etelkalight-webfont.svg","mtime":"2015-05-15T15:29:32+03:00","size":64768,"digest":"2b575f6e4696d74957af27a7c7bb7976b7ca31d0ebe8ec25bb4c3494d5d16e24","integrity":"sha256-K1dfbkaW10lXryenx7t5drfKMdDr6Owlu0w0lNXRbiQ="},"etelkalight-webfont-f68a2db6346d864f82c3b3e725ee60b0217e91e46ec47f96710f70f996b61af1.ttf":{"logical_path":"etelkalight-webfont.ttf","mtime":"2015-05-15T15:29:32+03:00","size":49748,"digest":"f68a2db6346d864f82c3b3e725ee60b0217e91e46ec47f96710f70f996b61af1","integrity":"sha256-9oottjRthk+Cw7PnJe5gsCF+keRuxH+WcQ9w+Za2GvE="},"etelkalight-webfont-1ed38dbac6b817bf74bd46a98d61005aa2615db7ac743e4037364d1021084043.woff":{"logical_path":"etelkalight-webfont.woff","mtime":"2015-05-15T15:29:32+03:00","size":26204,"digest":"1ed38dbac6b817bf74bd46a98d61005aa2615db7ac743e4037364d1021084043","integrity":"sha256-HtONusa4F790vUapjWEAWqJhXbesdD5ANzZNECEIQEM="},"etelkalightbold-webfont-1d94cabe6fb55b05f746fe0aa51a7a503683d7afdb68360ed26bfac03e1b3c39.eot":{"logical_path":"etelkalightbold-webfont.eot","mtime":"2015-05-15T15:29:32+03:00","size":23707,"digest":"1d94cabe6fb55b05f746fe0aa51a7a503683d7afdb68360ed26bfac03e1b3c39","integrity":"sha256-HZTKvm+1WwX3Rv4KpRp6UDaD16/baDYO0mv6wD4bPDk="},"etelkalightbold-webfont-bb0c8e17b99b10f211be3531a51d6ad48a5c6e4670c8fb6160a329fa4758c555.svg":{"logical_path":"etelkalightbold-webfont.svg","mtime":"2015-05-15T15:29:32+03:00","size":62829,"digest":"bb0c8e17b99b10f211be3531a51d6ad48a5c6e4670c8fb6160a329fa4758c555","integrity":"sha256-uwyOF7mbEPIRvjUxpR1q1IpcbkZwyPthYKMp+kdYxVU="},"etelkalightbold-webfont-0f06d1e7f099578e1cc0e9b1875aca2a7128c0ca0d640fd504e97bae0b028429.ttf":{"logical_path":"etelkalightbold-webfont.ttf","mtime":"2015-05-15T15:29:32+03:00","size":51172,"digest":"0f06d1e7f099578e1cc0e9b1875aca2a7128c0ca0d640fd504e97bae0b028429","integrity":"sha256-DwbR5/CZV44cwOmxh1rKKnEowMoNZA/VBOl7rgsChCk="},"etelkalightbold-webfont-d608c036b3e3f04ca87a1c494f8d9e9620a729b2760b5eb1dcee52c4bc8e8805.woff":{"logical_path":"etelkalightbold-webfont.woff","mtime":"2015-05-15T15:29:32+03:00","size":26956,"digest":"d608c036b3e3f04ca87a1c494f8d9e9620a729b2760b5eb1dcee52c4bc8e8805","integrity":"sha256-1gjANrPj8EyoehxJT42eliCnKbJ2C16x3O5SxLyOiAU="},"etelkalightitalic-webfont-ce5cdffe6c589a6dc6bd2c482c718486ff5fb416ab01740750db325179e58654.eot":{"logical_path":"etelkalightitalic-webfont.eot","mtime":"2015-05-15T15:29:32+03:00","size":26426,"digest":"ce5cdffe6c589a6dc6bd2c482c718486ff5fb416ab01740750db325179e58654","integrity":"sha256-zlzf/mxYmm3GvSxILHGEhv9ftBarAXQHUNsyUXnlhlQ="},"etelkalightitalic-webfont-dd5353c2af4ea63e1d0e99ec5f1f85162cee0c4dd0a3840260a2606eefc3e517.svg":{"logical_path":"etelkalightitalic-webfont.svg","mtime":"2015-05-15T15:29:32+03:00","size":69857,"digest":"dd5353c2af4ea63e1d0e99ec5f1f85162cee0c4dd0a3840260a2606eefc3e517","integrity":"sha256-3VNTwq9Opj4dDpnsXx+FFizuDE3Qo4QCYKJgbu/D5Rc="},"etelkalightitalic-webfont-54eb91ad0e0b639f50be02b7c25836c99ad989185f5d2a240d60ea14a1b7384a.ttf":{"logical_path":"etelkalightitalic-webfont.ttf","mtime":"2015-05-15T15:29:32+03:00","size":57040,"digest":"54eb91ad0e0b639f50be02b7c25836c99ad989185f5d2a240d60ea14a1b7384a","integrity":"sha256-VOuRrQ4LY59QvgK3wlg2yZrZiRhfXSokDWDqFKG3OEo="},"etelkalightitalic-webfont-d1fb9621d40ef45104078a4a5b98ce4cba00872cf8ac56e299cf1397c146cac3.woff":{"logical_path":"etelkalightitalic-webfont.woff","mtime":"2015-05-15T15:29:32+03:00","size":29884,"digest":"d1fb9621d40ef45104078a4a5b98ce4cba00872cf8ac56e299cf1397c146cac3","integrity":"sha256-0fuWIdQO9FEEB4pKW5jOTLoAhyz4rFbimc8Tl8FGysM="},"infotexb-webfont-1951e43e1d9ab99b0d4998abba4aab34f3e68b337be90800db517e4a8d27d001.eot":{"logical_path":"infotexb-webfont.eot","mtime":"2015-05-15T15:29:32+03:00","size":23124,"digest":"1951e43e1d9ab99b0d4998abba4aab34f3e68b337be90800db517e4a8d27d001","integrity":"sha256-GVHkPh2auZsNSZirukqrNPPmizN76QgA21F+So0n0AE="},"infotexb-webfont-0dda72e34d0d0ced7693b55ed08acc60fb1a9036afd7736e432ac3f22f2e6fdf.svg":{"logical_path":"infotexb-webfont.svg","mtime":"2015-05-15T15:29:32+03:00","size":90188,"digest":"0dda72e34d0d0ced7693b55ed08acc60fb1a9036afd7736e432ac3f22f2e6fdf","integrity":"sha256-Ddpy400NDO12k7Ve0IrMYPsakDav13NuQyrD8i8ub98="},"infotexb-webfont-c0737d1e2edff50645e201bf99f68f2313502ee2bdeb2e56435ee24721baf5cd.ttf":{"logical_path":"infotexb-webfont.ttf","mtime":"2015-05-15T15:29:32+03:00","size":47396,"digest":"c0737d1e2edff50645e201bf99f68f2313502ee2bdeb2e56435ee24721baf5cd","integrity":"sha256-wHN9Hi7f9QZF4gG/mfaPIxNQLuK96y5WQ17iRyG69c0="},"infotexb-webfont-8da32e6db23c39390c55dd5ea8949714757fddba516c5db65e72867504493fbc.woff":{"logical_path":"infotexb-webfont.woff","mtime":"2015-05-15T15:29:32+03:00","size":26228,"digest":"8da32e6db23c39390c55dd5ea8949714757fddba516c5db65e72867504493fbc","integrity":"sha256-jaMubbI8OTkMVd1eqJSXFHV/3bpRbF22XnKGdQRJP7w="},"infotexm-webfont-74df99faeb66d8b02966b8884b860af03c359ed41d348ddb813dbcc3c460eb26.eot":{"logical_path":"infotexm-webfont.eot","mtime":"2015-05-15T15:29:32+03:00","size":23273,"digest":"74df99faeb66d8b02966b8884b860af03c359ed41d348ddb813dbcc3c460eb26","integrity":"sha256-dN+Z+utm2LApZriIS4YK8Dw1ntQdNI3bgT28w8Rg6yY="},"infotexm-webfont-0b52ef10620b8cb7289dc809aac67826d5031e6ab040194fdb7365dc83e95557.svg":{"logical_path":"infotexm-webfont.svg","mtime":"2015-05-15T15:29:32+03:00","size":90423,"digest":"0b52ef10620b8cb7289dc809aac67826d5031e6ab040194fdb7365dc83e95557","integrity":"sha256-C1LvEGILjLconcgJqsZ4JtUDHmqwQBlP23Nl3IPpVVc="},"infotexm-webfont-1d244d27a4ec4c1a5f98c82966faa26e7855c4292c730429477003b6dab5c08b.ttf":{"logical_path":"infotexm-webfont.ttf","mtime":"2015-05-15T15:29:32+03:00","size":47484,"digest":"1d244d27a4ec4c1a5f98c82966faa26e7855c4292c730429477003b6dab5c08b","integrity":"sha256-HSRNJ6TsTBpfmMgpZvqibnhVxCkscwQpR3ADttq1wIs="},"infotexm-webfont-872b5ab4e0b7de6655a52f137a3c99f1e7941fa91ff21a56550f2039834ee9d0.woff":{"logical_path":"infotexm-webfont.woff","mtime":"2015-05-15T15:29:32+03:00","size":26492,"digest":"872b5ab4e0b7de6655a52f137a3c99f1e7941fa91ff21a56550f2039834ee9d0","integrity":"sha256-hytatOC33mZVpS8TejyZ8eeUH6kf8hpWVQ8gOYNO6dA="},"jquery-ui/ui-bg_flat_0_aaaaaa_40x100-9a8492a580bf85d3e98ae8861fbd45567e5a1f83eeafcf9574da0399d5f602ab.png":{"logical_path":"jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png","mtime":"2015-06-08T14:38:06+03:00","size":180,"digest":"9a8492a580bf85d3e98ae8861fbd45567e5a1f83eeafcf9574da0399d5f602ab","integrity":"sha256-moSSpYC/hdPpiuiGH71FVn5aH4Pur8+VdNoDmdX2Aqs="},"jquery-ui/ui-bg_flat_75_ffffff_40x100-39ab7ccd9f4e82579da78a9241265df288d8eb65dbbd7cf48aed2d0129887df5.png":{"logical_path":"jquery-ui/ui-bg_flat_75_ffffff_40x100.png","mtime":"2015-06-08T14:38:06+03:00","size":178,"digest":"39ab7ccd9f4e82579da78a9241265df288d8eb65dbbd7cf48aed2d0129887df5","integrity":"sha256-Oat8zZ9Ogledp4qSQSZd8ojY62XbvXz0iu0tASmIffU="},"jquery-ui/ui-bg_glass_55_fbf9ee_1x400-691597e8a40a891ea94d3589976ecfc33e6145c49422443b00ac2b5a0022964c.png":{"logical_path":"jquery-ui/ui-bg_glass_55_fbf9ee_1x400.png","mtime":"2015-06-08T14:38:06+03:00","size":120,"digest":"691597e8a40a891ea94d3589976ecfc33e6145c49422443b00ac2b5a0022964c","integrity":"sha256-aRWX6KQKiR6pTTWJl27Pwz5hRcSUIkQ7AKwrWgAilkw="},"jquery-ui/ui-bg_glass_65_ffffff_1x400-f0e6cd91b837d5c5644d026e5ffeccd907953317cd5c0f689901733afda260b2.png":{"logical_path":"jquery-ui/ui-bg_glass_65_ffffff_1x400.png","mtime":"2015-06-08T14:38:06+03:00","size":105,"digest":"f0e6cd91b837d5c5644d026e5ffeccd907953317cd5c0f689901733afda260b2","integrity":"sha256-8ObNkbg31cVkTQJuX/7M2QeVMxfNXA9omQFzOv2iYLI="},"jquery-ui/ui-bg_glass_75_dadada_1x400-c108f5cbf2dd9ec07a26530695ddd95e1664597ce6c056ae44c162cc2e28cec4.png":{"logical_path":"jquery-ui/ui-bg_glass_75_dadada_1x400.png","mtime":"2015-06-08T14:38:06+03:00","size":111,"digest":"c108f5cbf2dd9ec07a26530695ddd95e1664597ce6c056ae44c162cc2e28cec4","integrity":"sha256-wQj1y/LdnsB6JlMGld3ZXhZkWXzmwFauRMFizC4ozsQ="},"jquery-ui/ui-bg_glass_75_e6e6e6_1x400-ddf5dd4e0ef2b185e8bb0af7b6e90ebe74a84384cb4700658e76e754c8bfe550.png":{"logical_path":"jquery-ui/ui-bg_glass_75_e6e6e6_1x400.png","mtime":"2015-06-08T14:38:06+03:00","size":110,"digest":"ddf5dd4e0ef2b185e8bb0af7b6e90ebe74a84384cb4700658e76e754c8bfe550","integrity":"sha256-3fXdTg7ysYXouwr3tukOvnSoQ4TLRwBljnbnVMi/5VA="},"jquery-ui/ui-bg_glass_95_fef1ec_1x400-f6f1c1bedf1a0f37cfef81d12f5f012869d1ee7c984775a569827a1784d34f5c.png":{"logical_path":"jquery-ui/ui-bg_glass_95_fef1ec_1x400.png","mtime":"2015-06-08T14:38:06+03:00","size":119,"digest":"f6f1c1bedf1a0f37cfef81d12f5f012869d1ee7c984775a569827a1784d34f5c","integrity":"sha256-9vHBvt8aDzfP74HRL18BKGnR7nyYR3WlaYJ6F4TTT1w="},"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100-54270656df079c4da5182629a080fc633b6f84b87985eb016d25a560e2c38d4a.png":{"logical_path":"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100.png","mtime":"2015-06-08T14:38:06+03:00","size":101,"digest":"54270656df079c4da5182629a080fc633b6f84b87985eb016d25a560e2c38d4a","integrity":"sha256-VCcGVt8HnE2lGCYpoID8YztvhLh5hesBbSWlYOLDjUo="},"jquery-ui/ui-icons_222222_256x240-57adb0d65f4e91dacfee975d9574422bee7486c8a182d60133728c672f2cdbbc.png":{"logical_path":"jquery-ui/ui-icons_222222_256x240.png","mtime":"2015-06-08T14:38:06+03:00","size":4369,"digest":"57adb0d65f4e91dacfee975d9574422bee7486c8a182d60133728c672f2cdbbc","integrity":"sha256-V62w1l9OkdrP7pddlXRCK+50hsihgtYBM3KMZy8s27w="},"jquery-ui/ui-icons_2e83ff_256x240-20f8c6667afc48aa433ee9eb6d8a0584bdbd6b4a4a9091ff1e6b3adb31e63bd9.png":{"logical_path":"jquery-ui/ui-icons_2e83ff_256x240.png","mtime":"2015-06-08T14:38:06+03:00","size":4369,"digest":"20f8c6667afc48aa433ee9eb6d8a0584bdbd6b4a4a9091ff1e6b3adb31e63bd9","integrity":"sha256-IPjGZnr8SKpDPunrbYoFhL29a0pKkJH/Hms62zHmO9k="},"jquery-ui/ui-icons_454545_256x240-07460e843c3e59aaadbb34231e699e856a2980753c7a47b66447da5d9f93fb7f.png":{"logical_path":"jquery-ui/ui-icons_454545_256x240.png","mtime":"2015-06-08T14:38:06+03:00","size":4369,"digest":"07460e843c3e59aaadbb34231e699e856a2980753c7a47b66447da5d9f93fb7f","integrity":"sha256-B0YOhDw+WaqtuzQjHmmehWopgHU8eke2ZEfaXZ+T+38="},"jquery-ui/ui-icons_888888_256x240-ea2e29625de3463465e93b002b065f5833e05b97f7a052b1c141e754d62e1a8b.png":{"logical_path":"jquery-ui/ui-icons_888888_256x240.png","mtime":"2015-06-08T14:38:06+03:00","size":4369,"digest":"ea2e29625de3463465e93b002b065f5833e05b97f7a052b1c141e754d62e1a8b","integrity":"sha256-6i4pYl3jRjRl6TsAKwZfWDPgW5f3oFKxwUHnVNYuGos="},"jquery-ui/ui-icons_cd0a0a_256x240-1e32c6dbf5d3fd342f27a78aa881550d6412aa207f48468724a6a15402b6041b.png":{"logical_path":"jquery-ui/ui-icons_cd0a0a_256x240.png","mtime":"2015-06-08T14:38:06+03:00","size":4369,"digest":"1e32c6dbf5d3fd342f27a78aa881550d6412aa207f48468724a6a15402b6041b","integrity":"sha256-HjLG2/XT/TQvJ6eKqIFVDWQSqiB/SEaHJKahVAK2BBs="},"bootstrap/glyphicons-halflings-regular-13634da87d9e23f8c3ed9108ce1724d183a39ad072e73e1b3d8cbf646d2d0407.eot":{"logical_path":"bootstrap/glyphicons-halflings-regular.eot","mtime":"2015-06-29T12:04:56+03:00","size":20127,"digest":"13634da87d9e23f8c3ed9108ce1724d183a39ad072e73e1b3d8cbf646d2d0407","integrity":"sha256-E2NNqH2eI/jD7ZEIzhck0YOjmtBy5z4bPYy/ZG0tBAc="},"bootstrap/glyphicons-halflings-regular-42f60659d265c1a3c30f9fa42abcbb56bd4a53af4d83d316d6dd7a36903c43e5.svg":{"logical_path":"bootstrap/glyphicons-halflings-regular.svg","mtime":"2015-06-29T12:04:56+03:00","size":108738,"digest":"42f60659d265c1a3c30f9fa42abcbb56bd4a53af4d83d316d6dd7a36903c43e5","integrity":"sha256-QvYGWdJlwaPDD5+kKry7Vr1KU69Ng9MW1t16NpA8Q+U="},"bootstrap/glyphicons-halflings-regular-e395044093757d82afcb138957d06a1ea9361bdcf0b442d06a18a8051af57456.ttf":{"logical_path":"bootstrap/glyphicons-halflings-regular.ttf","mtime":"2015-06-29T12:04:56+03:00","size":45404,"digest":"e395044093757d82afcb138957d06a1ea9361bdcf0b442d06a18a8051af57456","integrity":"sha256-45UEQJN1fYKvyxOJV9BqHqk2G9zwtELQahioBRr1dFY="},"bootstrap/glyphicons-halflings-regular-a26394f7ede100ca118eff2eda08596275a9839b959c226e15439557a5a80742.woff":{"logical_path":"bootstrap/glyphicons-halflings-regular.woff","mtime":"2015-06-29T12:04:56+03:00","size":23424,"digest":"a26394f7ede100ca118eff2eda08596275a9839b959c226e15439557a5a80742","integrity":"sha256-omOU9+3hAMoRjv8u2ghZYnWpg5uVnCJuFUOVV6WoB0I="},"bootstrap/glyphicons-halflings-regular-fe185d11a49676890d47bb783312a0cda5a44c4039214094e7957b4c040ef11c.woff2":{"logical_path":"bootstrap/glyphicons-halflings-regular.woff2","mtime":"2015-06-29T12:04:56+03:00","size":18028,"digest":"fe185d11a49676890d47bb783312a0cda5a44c4039214094e7957b4c040ef11c","integrity":"sha256-/hhdEaSWdokNR7t4MxKgzaWkTEA5IUCU55V7TAQO8Rw="},"admin-manifest-1b7a9adf38de3299af2f97b0c037bf01c21b7056910e5ee41507a91ab675bd4d.css":{"logical_path":"admin-manifest.css","mtime":"2015-06-16T16:19:54+03:00","size":163910,"digest":"1b7a9adf38de3299af2f97b0c037bf01c21b7056910e5ee41507a91ab675bd4d","integrity":"sha256-G3qa3zjeMpmvL5ewwDe/AcIbcFaRDl7kFQepGrZ1vU0="},"admin-manifest-5f612f59c9effcca0be5396c4f00654de236d2bb1b16bbdf929b47e6504381f3.js":{"logical_path":"admin-manifest.js","mtime":"2015-06-08T14:38:06+03:00","size":323893,"digest":"5f612f59c9effcca0be5396c4f00654de236d2bb1b16bbdf929b47e6504381f3","integrity":"sha256-X2EvWcnv/MoL5TlsTwBlTeI20rsbFrvfkptH5lBDgfM="},"registrar-manifest-b4694748846de7a7f12463c4524f71013645b58fc770188432dfc5c5a93ded3a.css":{"logical_path":"registrar-manifest.css","mtime":"2015-06-16T16:19:54+03:00","size":187703,"digest":"b4694748846de7a7f12463c4524f71013645b58fc770188432dfc5c5a93ded3a","integrity":"sha256-tGlHSIRt56fxJGPEUk9xATZFtY/HcBiEMt/Fxak97To="},"registrar-manifest-700f689d9abdd73516260d2622b912a8d3e003de966996ba7a331bfa065720e7.js":{"logical_path":"registrar-manifest.js","mtime":"2015-06-19T15:29:08+03:00","size":314928,"digest":"700f689d9abdd73516260d2622b912a8d3e003de966996ba7a331bfa065720e7","integrity":"sha256-cA9onZq91zUWJg0mIrkSqNPgA96WaZa6ejMb+gZXIOc="},"registrant-manifest-ffb2502ddd176bf6bf64424abdf509f1c2fa44883cd159ffc6e0bf5bba81a226.css":{"logical_path":"registrant-manifest.css","mtime":"2015-06-16T16:19:54+03:00","size":187888,"digest":"ffb2502ddd176bf6bf64424abdf509f1c2fa44883cd159ffc6e0bf5bba81a226","integrity":"sha256-/7JQLd0Xa/a/ZEJKvfUJ8cL6RIg80Vn/xuC/W7qBoiY="},"registrant-manifest-700f689d9abdd73516260d2622b912a8d3e003de966996ba7a331bfa065720e7.js":{"logical_path":"registrant-manifest.js","mtime":"2015-06-19T15:29:08+03:00","size":314928,"digest":"700f689d9abdd73516260d2622b912a8d3e003de966996ba7a331bfa065720e7","integrity":"sha256-cA9onZq91zUWJg0mIrkSqNPgA96WaZa6ejMb+gZXIOc="},"shared/pdf-8d8bf4207c64d5de1ad8a683ed3c0d97dbe85a73644e9440b3a7c1d638c93590.css":{"logical_path":"shared/pdf.css","mtime":"2015-05-15T15:29:32+03:00","size":119782,"digest":"8d8bf4207c64d5de1ad8a683ed3c0d97dbe85a73644e9440b3a7c1d638c93590","integrity":"sha256-jYv0IHxk1d4a2KaD7TwNl9voWnNkTpRAs6fB1jjJNZA="},"admin/application-2e4aafc94dbce8d43d7bac4eb5521a14a72e3bbeece3b4363494d70fcd274542.js":{"logical_path":"admin/application.js","mtime":"2015-06-08T11:23:15+03:00","size":287,"digest":"2e4aafc94dbce8d43d7bac4eb5521a14a72e3bbeece3b4363494d70fcd274542","integrity":"sha256-LkqvyU286NQ9e6xOtVIaFKcuO77s47Q2NJTXD80nRUI="},"registrar/application-f96ff2f3f4d2326db627c9191074e5c10ad3679eac8eb2d22e3a9faef39e06a9.js":{"logical_path":"registrar/application.js","mtime":"2015-06-19T15:29:08+03:00","size":826,"digest":"f96ff2f3f4d2326db627c9191074e5c10ad3679eac8eb2d22e3a9faef39e06a9","integrity":"sha256-+W/y8/TSMm22J8kZEHTlwQrTZ56sjrLSLjqfrvOeBqk="},"registrar-manifest-413fda057832b25dee9d45f5f07b29ac369fc85f51ecd9e7bc2cdefa5297b4f3.js":{"logical_path":"registrar-manifest.js","mtime":"2015-06-08T14:38:06+03:00","size":314906,"digest":"413fda057832b25dee9d45f5f07b29ac369fc85f51ecd9e7bc2cdefa5297b4f3","integrity":"sha256-QT/aBXgysl3unUX18HsprDafyF9R7NnnvCze+lKXtPM="},"registrant-manifest-f9e9d795de4f7dabe387365fd329c1cb24da923bd357988c120cc5710230cc48.js":{"logical_path":"registrant-manifest.js","mtime":"2015-06-08T14:38:06+03:00","size":314906,"digest":"f9e9d795de4f7dabe387365fd329c1cb24da923bd357988c120cc5710230cc48","integrity":"sha256-+enXld5PfavjhzZf0ynByyTakjvTV5iMEgzFcQIwzEg="},"registrar/application-978b21a99ae3caabb8a9e301dccaa0b93f86cc789a9595158c98ee51393b8cb9.js":{"logical_path":"registrar/application.js","mtime":"2015-06-19T16:03:53+03:00","size":804,"digest":"978b21a99ae3caabb8a9e301dccaa0b93f86cc789a9595158c98ee51393b8cb9","integrity":"sha256-l4shqZrjyqu4qeMB3MqguT+GzHialZUVjJjuUTk7jLk="},"admin-manifest-6e5e54ad9b1f48eb4372bf4d3ffd1854d859dc5e2ab4977dbf59c4abfeebd760.css":{"logical_path":"admin-manifest.css","mtime":"2015-07-13T18:30:38+03:00","size":169226,"digest":"6e5e54ad9b1f48eb4372bf4d3ffd1854d859dc5e2ab4977dbf59c4abfeebd760","integrity":"sha256-bl5UrZsfSOtDcr9NP/0YVNhZ3F4qtJd9v1nEq/7r12A="},"admin-manifest-b904d5679d9ed357c2412b8d9054c5d60b6c8524e11e4ff80d2e45580108e709.js":{"logical_path":"admin-manifest.js","mtime":"2015-07-13T18:30:38+03:00","size":325028,"digest":"b904d5679d9ed357c2412b8d9054c5d60b6c8524e11e4ff80d2e45580108e709","integrity":"sha256-uQTVZ52e01fCQSuNkFTF1gtshSThHk/4DS5FWAEI5wk="},"registrar-manifest-d9e1a3fb37873e44c313486ea2ad7ff1791e9ce4d6d44e95a602d87d480f27e1.css":{"logical_path":"registrar-manifest.css","mtime":"2015-07-13T18:30:38+03:00","size":193019,"digest":"d9e1a3fb37873e44c313486ea2ad7ff1791e9ce4d6d44e95a602d87d480f27e1","integrity":"sha256-2eGj+zeHPkTDE0huoq1/8XkenOTW1E6VpgLYfUgPJ+E="},"registrar-manifest-0297caa2939148f9284b754e7a0cc2a08272b8ff3194d97be0c95858498cbe39.js":{"logical_path":"registrar-manifest.js","mtime":"2015-07-13T18:30:38+03:00","size":316041,"digest":"0297caa2939148f9284b754e7a0cc2a08272b8ff3194d97be0c95858498cbe39","integrity":"sha256-ApfKopORSPkoS3VOegzCoIJyuP8xlNl74MlYWEmMvjk="},"registrant-manifest-651e30954782cb9b1e582abeb18c47402c951e3fd4aa71311363a058869f4d66.css":{"logical_path":"registrant-manifest.css","mtime":"2015-07-13T18:30:38+03:00","size":193204,"digest":"651e30954782cb9b1e582abeb18c47402c951e3fd4aa71311363a058869f4d66","integrity":"sha256-ZR4wlUeCy5seWCq+sYxHQCyVHj/UqnExE2OgWIafTWY="},"registrant-manifest-a94cc4d69bafc048f1cb08fffd1c733fc37157e660e4897005207cf03f1d98ca.js":{"logical_path":"registrant-manifest.js","mtime":"2015-07-13T18:30:38+03:00","size":316041,"digest":"a94cc4d69bafc048f1cb08fffd1c733fc37157e660e4897005207cf03f1d98ca","integrity":"sha256-qUzE1puvwEjxywj//RxzP8NxV+Zg5IlwBSB88D8dmMo="},"shared/pdf-3f6858cfb5eec601002c5a418b287ccdddf38bb953111ffdff1321d3b1fbbddc.css":{"logical_path":"shared/pdf.css","mtime":"2015-06-29T12:04:56+03:00","size":125098,"digest":"3f6858cfb5eec601002c5a418b287ccdddf38bb953111ffdff1321d3b1fbbddc","integrity":"sha256-P2hYz7XuxgEALFpBiyh8zd3zi7lTER/9/xMh07H7vdw="},"admin-manifest-7058b706893af7473775946fa6171e3c3d7d81f5fe323c402acc8b207eac4f1b.css":{"logical_path":"admin-manifest.css","mtime":"2015-07-22T12:51:15+03:00","size":169258,"digest":"7058b706893af7473775946fa6171e3c3d7d81f5fe323c402acc8b207eac4f1b","integrity":"sha256-cFi3Bok690c3dZRvphcePD19gfX+MjxAKsyLIH6sTxs="},"registrar-manifest-12ddf3d27aeb82ed229b8a7ec6b50fdfa33c115326bb540d3c64d630122382bb.css":{"logical_path":"registrar-manifest.css","mtime":"2015-07-30T17:08:04+03:00","size":193051,"digest":"12ddf3d27aeb82ed229b8a7ec6b50fdfa33c115326bb540d3c64d630122382bb","integrity":"sha256-Et3z0nrrgu0im4p+xrUP36M8EVMmu1QNPGTWMBIjgrs="},"registrant-manifest-9711ccec91402d435ddfb0b0fbf708a1ffef67868a86c38014f975183d61e324.css":{"logical_path":"registrant-manifest.css","mtime":"2015-07-30T17:08:04+03:00","size":193236,"digest":"9711ccec91402d435ddfb0b0fbf708a1ffef67868a86c38014f975183d61e324","integrity":"sha256-lxHM7JFALUNd37Cw+/cIof/vZ4aKhsOAFPl1GD1h4yQ="},"admin-manifest-8e7ee8a12ecba21371b22a0f225d918c48c4edb92c4e793c76bcbc85f1d11b2d.js":{"logical_path":"admin-manifest.js","mtime":"2015-07-29T11:55:32+03:00","size":325018,"digest":"8e7ee8a12ecba21371b22a0f225d918c48c4edb92c4e793c76bcbc85f1d11b2d","integrity":"sha256-jn7ooS7LohNxsioPIl2RjEjE7bksTnk8dry8hfHRGy0="},"registrar-manifest-ccfec673488bbf1709b257f959ddaba3153692cd4ed34f7c10617e7cb8079c7f.js":{"logical_path":"registrar-manifest.js","mtime":"2015-07-29T11:55:32+03:00","size":316031,"digest":"ccfec673488bbf1709b257f959ddaba3153692cd4ed34f7c10617e7cb8079c7f","integrity":"sha256-zP7Gc0iLvxcJslf5Wd2roxU2ks1O0098EGF+fLgHnH8="},"registrant-manifest-029b3513f5314789848386b24148311e44df8160a0a4b5b587a6e6a446eddd45.js":{"logical_path":"registrant-manifest.js","mtime":"2015-07-29T11:55:32+03:00","size":316031,"digest":"029b3513f5314789848386b24148311e44df8160a0a4b5b587a6e6a446eddd45","integrity":"sha256-Aps1E/UxR4mEg4ayQUgxHkTfgWCgpLW1h6bmpEbt3UU="},"admin-manifest-faacc44f2693434d482abfa34e565890367f8a34a73a4334fb690dfd36606599.css":{"logical_path":"admin-manifest.css","mtime":"2015-07-30T17:08:04+03:00","size":195931,"digest":"faacc44f2693434d482abfa34e565890367f8a34a73a4334fb690dfd36606599","integrity":"sha256-+qzETyaTQ01IKr+jTlZYkDZ/ijSnOkM0+2kN/TZgZZk="},"admin-manifest-2d50db228bce0154b10046fa6de58775cf879387a8a2e63e278e51ef7802ddba.js":{"logical_path":"admin-manifest.js","mtime":"2015-07-30T17:08:04+03:00","size":391499,"digest":"2d50db228bce0154b10046fa6de58775cf879387a8a2e63e278e51ef7802ddba","integrity":"sha256-LVDbIovOAVSxAEb6beWHdc+Hk4eoouY+J45R73gC3bo="},"registrar-manifest-acc585f0f8ccb8f3a1b2ba4f54b847d34f588c8fcefc055a29cb89dc3045279e.js":{"logical_path":"registrar-manifest.js","mtime":"2015-08-11T16:52:25+03:00","size":360581,"digest":"acc585f0f8ccb8f3a1b2ba4f54b847d34f588c8fcefc055a29cb89dc3045279e","integrity":"sha256-rMWF8PjMuPOhsrpPVLhH009YjI/O/AVaKcuJ3DBFJ54="},"registrar-manifest-9bc7e99a627bcd8cd851f05e1595592ba458671ccd1fb663f500229671eb30c9.js":{"logical_path":"registrar-manifest.js","mtime":"2015-08-11T17:07:57+03:00","size":316080,"digest":"9bc7e99a627bcd8cd851f05e1595592ba458671ccd1fb663f500229671eb30c9","integrity":"sha256-m8fpmmJ7zYzYUfBeFZVZK6RYZxzNH7Zj9QAilnHrMMk="},"registrant-manifest-9bc7e99a627bcd8cd851f05e1595592ba458671ccd1fb663f500229671eb30c9.js":{"logical_path":"registrant-manifest.js","mtime":"2015-08-11T16:54:20+03:00","size":316080,"digest":"9bc7e99a627bcd8cd851f05e1595592ba458671ccd1fb663f500229671eb30c9","integrity":"sha256-m8fpmmJ7zYzYUfBeFZVZK6RYZxzNH7Zj9QAilnHrMMk="},"registrar/application-d550a9694cdd4555f5ebaa3317954f548b4a9109e33e4c81ecfeb386ae70eed6.js":{"logical_path":"registrar/application.js","mtime":"2015-08-11T16:54:20+03:00","size":853,"digest":"d550a9694cdd4555f5ebaa3317954f548b4a9109e33e4c81ecfeb386ae70eed6","integrity":"sha256-1VCpaUzdRVX166ozF5VPVItKkQnjPkyB7P6zhq5w7tY="}},"assets":{"admin-manifest.css":"admin-manifest-faacc44f2693434d482abfa34e565890367f8a34a73a4334fb690dfd36606599.css","admin-manifest.js":"admin-manifest-2d50db228bce0154b10046fa6de58775cf879387a8a2e63e278e51ef7802ddba.js","registrar-manifest.css":"registrar-manifest-12ddf3d27aeb82ed229b8a7ec6b50fdfa33c115326bb540d3c64d630122382bb.css","registrar-manifest.js":"registrar-manifest-ccfec673488bbf1709b257f959ddaba3153692cd4ed34f7c10617e7cb8079c7f.js","registrant-manifest.css":"registrant-manifest-9711ccec91402d435ddfb0b0fbf708a1ffef67868a86c38014f975183d61e324.css","registrant-manifest.js":"registrant-manifest-029b3513f5314789848386b24148311e44df8160a0a4b5b587a6e6a446eddd45.js","shared/pdf.css":"shared/pdf-3f6858cfb5eec601002c5a418b287ccdddf38bb953111ffdff1321d3b1fbbddc.css","select2.png":"select2-d6b5d8d83dbc18fb8d77c8761d331cd9e5123c9684950bab0406e98a24ac5ae8.png","select2-spinner.gif":"select2-spinner-f6ecff617ec2ba7f559e6f535cad9b70a3f91120737535dab4d4548a6c83576c.gif","select2x2.png":"select2x2-6fe28d687dc0ed4d96016238c608ba1e7198c9c9accfa0b360b78018b9fb9bc2.png","alpha.png":"alpha-9ac45a6b3c13dd5c5cf1b5d18c6f24a537dd2e4598238527d232a3e2ea5b5947.png","bg.jpg":"bg-b8036abd2f0f36e3ab54d5d5b25b0fbac11d63ec6106d959df3fa180b379de05.jpg","danske.png":"danske-07a4395cc406785da129414e15872fe1d6a4f6f6da0066da6701b56cdb72ea96.png","development.png":"development-0b993e22410c7952394ac19ce3b41b722a97b93138a9a002091e1e5226d29bf5.png","eis-logo-et.png":"eis-logo-et-86a549d266cda73e3225c5eeba14532c59d498e1fd980ec129fded68da8bb307.png","favicon.ico":"favicon-309e00e2f78f9a2b042abc2806a8a4ed9cf6bb5d3f00ccc0985b1308bfd86c49.ico","id_card.gif":"id_card-ea506a49b25c8de4e68e786d90f5ec5defb6c8e895b90f2f129815f5e550fe8e.gif","lhv.png":"lhv-4d09d3126a05df392b73c54fa9b1eb605798c2e9bd361cf44500f73038832030.png","mid.gif":"mid-275543ecea377debe1ac892470f3aea4f7e7f0f9089fc0fbea4de410742e5239.gif","nordea.png":"nordea-75c938c7436e0c8316f056be8df8acd0e8b16e09790e78f78da96d9f8633ef3b.png","registrar/bg-alpha.png":"registrar/bg-alpha-9ac45a6b3c13dd5c5cf1b5d18c6f24a537dd2e4598238527d232a3e2ea5b5947.png","registrar/bg-development.png":"registrar/bg-development-0b993e22410c7952394ac19ce3b41b722a97b93138a9a002091e1e5226d29bf5.png","registrar/bg-staging.png":"registrar/bg-staging-6276f8c00911bc99f301f919e408ae3ef726c7378324ac55fd5d378ba3a4dc2d.png","registrar/favicon.ico":"registrar/favicon-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.ico","seb.png":"seb-9c9d943014cc4ee706244893cd8a2c4a8a7cc97bfbdef6a66e22c72f33d5f25e.png","staging.png":"staging-6276f8c00911bc99f301f919e408ae3ef726c7378324ac55fd5d378ba3a4dc2d.png","swed.png":"swed-2cf45729062cf5fa634247ba372c579c97f382e5cc43fa111219077e7473fdbb.png","test.png":"test-9ac45a6b3c13dd5c5cf1b5d18c6f24a537dd2e4598238527d232a3e2ea5b5947.png","admin/application.js":"admin/application-2e4aafc94dbce8d43d7bac4eb5521a14a72e3bbeece3b4363494d70fcd274542.js","registrar/application.js":"registrar/application-978b21a99ae3caabb8a9e301dccaa0b93f86cc789a9595158c98ee51393b8cb9.js","etelkalight-webfont.eot":"etelkalight-webfont-baf7e35ab2f64bf1c6fa4476d3934c7422062995738fd9e5715b02f55002d7c0.eot","etelkalight-webfont.svg":"etelkalight-webfont-2b575f6e4696d74957af27a7c7bb7976b7ca31d0ebe8ec25bb4c3494d5d16e24.svg","etelkalight-webfont.ttf":"etelkalight-webfont-f68a2db6346d864f82c3b3e725ee60b0217e91e46ec47f96710f70f996b61af1.ttf","etelkalight-webfont.woff":"etelkalight-webfont-1ed38dbac6b817bf74bd46a98d61005aa2615db7ac743e4037364d1021084043.woff","etelkalightbold-webfont.eot":"etelkalightbold-webfont-1d94cabe6fb55b05f746fe0aa51a7a503683d7afdb68360ed26bfac03e1b3c39.eot","etelkalightbold-webfont.svg":"etelkalightbold-webfont-bb0c8e17b99b10f211be3531a51d6ad48a5c6e4670c8fb6160a329fa4758c555.svg","etelkalightbold-webfont.ttf":"etelkalightbold-webfont-0f06d1e7f099578e1cc0e9b1875aca2a7128c0ca0d640fd504e97bae0b028429.ttf","etelkalightbold-webfont.woff":"etelkalightbold-webfont-d608c036b3e3f04ca87a1c494f8d9e9620a729b2760b5eb1dcee52c4bc8e8805.woff","etelkalightitalic-webfont.eot":"etelkalightitalic-webfont-ce5cdffe6c589a6dc6bd2c482c718486ff5fb416ab01740750db325179e58654.eot","etelkalightitalic-webfont.svg":"etelkalightitalic-webfont-dd5353c2af4ea63e1d0e99ec5f1f85162cee0c4dd0a3840260a2606eefc3e517.svg","etelkalightitalic-webfont.ttf":"etelkalightitalic-webfont-54eb91ad0e0b639f50be02b7c25836c99ad989185f5d2a240d60ea14a1b7384a.ttf","etelkalightitalic-webfont.woff":"etelkalightitalic-webfont-d1fb9621d40ef45104078a4a5b98ce4cba00872cf8ac56e299cf1397c146cac3.woff","infotexb-webfont.eot":"infotexb-webfont-1951e43e1d9ab99b0d4998abba4aab34f3e68b337be90800db517e4a8d27d001.eot","infotexb-webfont.svg":"infotexb-webfont-0dda72e34d0d0ced7693b55ed08acc60fb1a9036afd7736e432ac3f22f2e6fdf.svg","infotexb-webfont.ttf":"infotexb-webfont-c0737d1e2edff50645e201bf99f68f2313502ee2bdeb2e56435ee24721baf5cd.ttf","infotexb-webfont.woff":"infotexb-webfont-8da32e6db23c39390c55dd5ea8949714757fddba516c5db65e72867504493fbc.woff","infotexm-webfont.eot":"infotexm-webfont-74df99faeb66d8b02966b8884b860af03c359ed41d348ddb813dbcc3c460eb26.eot","infotexm-webfont.svg":"infotexm-webfont-0b52ef10620b8cb7289dc809aac67826d5031e6ab040194fdb7365dc83e95557.svg","infotexm-webfont.ttf":"infotexm-webfont-1d244d27a4ec4c1a5f98c82966faa26e7855c4292c730429477003b6dab5c08b.ttf","infotexm-webfont.woff":"infotexm-webfont-872b5ab4e0b7de6655a52f137a3c99f1e7941fa91ff21a56550f2039834ee9d0.woff","jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png":"jquery-ui/ui-bg_flat_0_aaaaaa_40x100-9a8492a580bf85d3e98ae8861fbd45567e5a1f83eeafcf9574da0399d5f602ab.png","jquery-ui/ui-bg_flat_75_ffffff_40x100.png":"jquery-ui/ui-bg_flat_75_ffffff_40x100-39ab7ccd9f4e82579da78a9241265df288d8eb65dbbd7cf48aed2d0129887df5.png","jquery-ui/ui-bg_glass_55_fbf9ee_1x400.png":"jquery-ui/ui-bg_glass_55_fbf9ee_1x400-691597e8a40a891ea94d3589976ecfc33e6145c49422443b00ac2b5a0022964c.png","jquery-ui/ui-bg_glass_65_ffffff_1x400.png":"jquery-ui/ui-bg_glass_65_ffffff_1x400-f0e6cd91b837d5c5644d026e5ffeccd907953317cd5c0f689901733afda260b2.png","jquery-ui/ui-bg_glass_75_dadada_1x400.png":"jquery-ui/ui-bg_glass_75_dadada_1x400-c108f5cbf2dd9ec07a26530695ddd95e1664597ce6c056ae44c162cc2e28cec4.png","jquery-ui/ui-bg_glass_75_e6e6e6_1x400.png":"jquery-ui/ui-bg_glass_75_e6e6e6_1x400-ddf5dd4e0ef2b185e8bb0af7b6e90ebe74a84384cb4700658e76e754c8bfe550.png","jquery-ui/ui-bg_glass_95_fef1ec_1x400.png":"jquery-ui/ui-bg_glass_95_fef1ec_1x400-f6f1c1bedf1a0f37cfef81d12f5f012869d1ee7c984775a569827a1784d34f5c.png","jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100.png":"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100-54270656df079c4da5182629a080fc633b6f84b87985eb016d25a560e2c38d4a.png","jquery-ui/ui-icons_222222_256x240.png":"jquery-ui/ui-icons_222222_256x240-57adb0d65f4e91dacfee975d9574422bee7486c8a182d60133728c672f2cdbbc.png","jquery-ui/ui-icons_2e83ff_256x240.png":"jquery-ui/ui-icons_2e83ff_256x240-20f8c6667afc48aa433ee9eb6d8a0584bdbd6b4a4a9091ff1e6b3adb31e63bd9.png","jquery-ui/ui-icons_454545_256x240.png":"jquery-ui/ui-icons_454545_256x240-07460e843c3e59aaadbb34231e699e856a2980753c7a47b66447da5d9f93fb7f.png","jquery-ui/ui-icons_888888_256x240.png":"jquery-ui/ui-icons_888888_256x240-ea2e29625de3463465e93b002b065f5833e05b97f7a052b1c141e754d62e1a8b.png","jquery-ui/ui-icons_cd0a0a_256x240.png":"jquery-ui/ui-icons_cd0a0a_256x240-1e32c6dbf5d3fd342f27a78aa881550d6412aa207f48468724a6a15402b6041b.png","bootstrap/glyphicons-halflings-regular.eot":"bootstrap/glyphicons-halflings-regular-13634da87d9e23f8c3ed9108ce1724d183a39ad072e73e1b3d8cbf646d2d0407.eot","bootstrap/glyphicons-halflings-regular.svg":"bootstrap/glyphicons-halflings-regular-42f60659d265c1a3c30f9fa42abcbb56bd4a53af4d83d316d6dd7a36903c43e5.svg","bootstrap/glyphicons-halflings-regular.ttf":"bootstrap/glyphicons-halflings-regular-e395044093757d82afcb138957d06a1ea9361bdcf0b442d06a18a8051af57456.ttf","bootstrap/glyphicons-halflings-regular.woff":"bootstrap/glyphicons-halflings-regular-a26394f7ede100ca118eff2eda08596275a9839b959c226e15439557a5a80742.woff","bootstrap/glyphicons-halflings-regular.woff2":"bootstrap/glyphicons-halflings-regular-fe185d11a49676890d47bb783312a0cda5a44c4039214094e7957b4c040ef11c.woff2"}} \ No newline at end of file diff --git a/public/assets/registrant-manifest-9bc7e99a627bcd8cd851f05e1595592ba458671ccd1fb663f500229671eb30c9.js b/public/assets/registrant-manifest-9bc7e99a627bcd8cd851f05e1595592ba458671ccd1fb663f500229671eb30c9.js new file mode 100644 index 000000000..d3efd1976 --- /dev/null +++ b/public/assets/registrant-manifest-9bc7e99a627bcd8cd851f05e1595592ba458671ccd1fb663f500229671eb30c9.js @@ -0,0 +1,170 @@ +/*! + * jQuery JavaScript Library v1.11.2 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-17T15:27Z + */ +!function(t,e){"object"==typeof module&&"object"==typeof module.exports?module.exports=t.document?e(t,!0):function(t){if(!t.document)throw new Error("jQuery requires a window with a document");return e(t)}:e(t)}("undefined"!=typeof window?window:this,function(t,e){function n(t){var e=t.length,n=re.type(t);return"function"===n||re.isWindow(t)?!1:1===t.nodeType&&e?!0:"array"===n||0===e||"number"==typeof e&&e>0&&e-1 in t}function i(t,e,n){if(re.isFunction(e))return re.grep(t,function(t,i){return!!e.call(t,i,t)!==n});if(e.nodeType)return re.grep(t,function(t){return t===e!==n});if("string"==typeof e){if(he.test(e))return re.filter(e,t,n);e=re.filter(e,t)}return re.grep(t,function(t){return re.inArray(t,e)>=0!==n})}function r(t,e){do t=t[e];while(t&&1!==t.nodeType);return t}function s(t){var e=we[t]={};return re.each(t.match(be)||[],function(t,n){e[n]=!0}),e}function a(){fe.addEventListener?(fe.removeEventListener("DOMContentLoaded",o,!1),t.removeEventListener("load",o,!1)):(fe.detachEvent("onreadystatechange",o),t.detachEvent("onload",o))}function o(){(fe.addEventListener||"load"===event.type||"complete"===fe.readyState)&&(a(),re.ready())}function l(t,e,n){if(void 0===n&&1===t.nodeType){var i="data-"+e.replace(Te,"-$1").toLowerCase();if(n=t.getAttribute(i),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:De.test(n)?re.parseJSON(n):n}catch(r){}re.data(t,e,n)}else n=void 0}return n}function c(t){var e;for(e in t)if(("data"!==e||!re.isEmptyObject(t[e]))&&"toJSON"!==e)return!1;return!0}function u(t,e,n,i){if(re.acceptData(t)){var r,s,a=re.expando,o=t.nodeType,l=o?re.cache:t,c=o?t[a]:t[a]&&a;if(c&&l[c]&&(i||l[c].data)||void 0!==n||"string"!=typeof e)return c||(c=o?t[a]=Z.pop()||re.guid++:a),l[c]||(l[c]=o?{}:{toJSON:re.noop}),("object"==typeof e||"function"==typeof e)&&(i?l[c]=re.extend(l[c],e):l[c].data=re.extend(l[c].data,e)),s=l[c],i||(s.data||(s.data={}),s=s.data),void 0!==n&&(s[re.camelCase(e)]=n),"string"==typeof e?(r=s[e],null==r&&(r=s[re.camelCase(e)])):r=s,r}}function d(t,e,n){if(re.acceptData(t)){var i,r,s=t.nodeType,a=s?re.cache:t,o=s?t[re.expando]:re.expando;if(a[o]){if(e&&(i=n?a[o]:a[o].data)){re.isArray(e)?e=e.concat(re.map(e,re.camelCase)):e in i?e=[e]:(e=re.camelCase(e),e=e in i?[e]:e.split(" ")),r=e.length;for(;r--;)delete i[e[r]];if(n?!c(i):!re.isEmptyObject(i))return}(n||(delete a[o].data,c(a[o])))&&(s?re.cleanData([t],!0):ne.deleteExpando||a!=a.window?delete a[o]:a[o]=null)}}}function h(){return!0}function p(){return!1}function f(){try{return fe.activeElement}catch(t){}}function g(t){var e=Re.split("|"),n=t.createDocumentFragment();if(n.createElement)for(;e.length;)n.createElement(e.pop());return n}function m(t,e){var n,i,r=0,s=typeof t.getElementsByTagName!==ke?t.getElementsByTagName(e||"*"):typeof t.querySelectorAll!==ke?t.querySelectorAll(e||"*"):void 0;if(!s)for(s=[],n=t.childNodes||t;null!=(i=n[r]);r++)!e||re.nodeName(i,e)?s.push(i):re.merge(s,m(i,e));return void 0===e||e&&re.nodeName(t,e)?re.merge([t],s):s}function v(t){Fe.test(t.type)&&(t.defaultChecked=t.checked)}function y(t,e){return re.nodeName(t,"table")&&re.nodeName(11!==e.nodeType?e:e.firstChild,"tr")?t.getElementsByTagName("tbody")[0]||t.appendChild(t.ownerDocument.createElement("tbody")):t}function b(t){return t.type=(null!==re.find.attr(t,"type"))+"/"+t.type,t}function w(t){var e=Ke.exec(t.type);return e?t.type=e[1]:t.removeAttribute("type"),t}function x(t,e){for(var n,i=0;null!=(n=t[i]);i++)re._data(n,"globalEval",!e||re._data(e[i],"globalEval"))}function C(t,e){if(1===e.nodeType&&re.hasData(t)){var n,i,r,s=re._data(t),a=re._data(e,s),o=s.events;if(o){delete a.handle,a.events={};for(n in o)for(i=0,r=o[n].length;r>i;i++)re.event.add(e,n,o[n][i])}a.data&&(a.data=re.extend({},a.data))}}function k(t,e){var n,i,r;if(1===e.nodeType){if(n=e.nodeName.toLowerCase(),!ne.noCloneEvent&&e[re.expando]){r=re._data(e);for(i in r.events)re.removeEvent(e,i,r.handle);e.removeAttribute(re.expando)}"script"===n&&e.text!==t.text?(b(e).text=t.text,w(e)):"object"===n?(e.parentNode&&(e.outerHTML=t.outerHTML),ne.html5Clone&&t.innerHTML&&!re.trim(e.innerHTML)&&(e.innerHTML=t.innerHTML)):"input"===n&&Fe.test(t.type)?(e.defaultChecked=e.checked=t.checked,e.value!==t.value&&(e.value=t.value)):"option"===n?e.defaultSelected=e.selected=t.defaultSelected:("input"===n||"textarea"===n)&&(e.defaultValue=t.defaultValue)}}function D(e,n){var i,r=re(n.createElement(e)).appendTo(n.body),s=t.getDefaultComputedStyle&&(i=t.getDefaultComputedStyle(r[0]))?i.display:re.css(r[0],"display");return r.detach(),s}function T(t){var e=fe,n=Je[t];return n||(n=D(t,e),"none"!==n&&n||(Qe=(Qe||re("