mirror of
https://github.com/internetee/registry.git
synced 2025-05-18 10:19:45 +02:00
Merge branch 'registry-267' into staging
This commit is contained in:
commit
fd5b0ffa77
22 changed files with 672 additions and 52 deletions
|
@ -17,10 +17,15 @@ class Admin::RegistrarsController < AdminController
|
||||||
def create
|
def create
|
||||||
@registrar = Registrar.new(registrar_params)
|
@registrar = Registrar.new(registrar_params)
|
||||||
|
|
||||||
if @registrar.save
|
begin
|
||||||
|
@registrar.transaction do
|
||||||
|
@registrar.save!
|
||||||
|
@registrar.accounts.create!(account_type: Account::CASH, currency: 'EUR')
|
||||||
|
end
|
||||||
|
|
||||||
flash[:notice] = I18n.t('registrar_added')
|
flash[:notice] = I18n.t('registrar_added')
|
||||||
redirect_to [:admin, @registrar]
|
redirect_to [:admin, @registrar]
|
||||||
else
|
rescue ActiveRecord::RecordInvalid
|
||||||
flash.now[:alert] = I18n.t('failed_to_add_registrar')
|
flash.now[:alert] = I18n.t('failed_to_add_registrar')
|
||||||
render 'new'
|
render 'new'
|
||||||
end
|
end
|
||||||
|
|
|
@ -79,6 +79,7 @@ class Admin::SettingsController < AdminController
|
||||||
:api_ip_whitelist_enabled,
|
:api_ip_whitelist_enabled,
|
||||||
:request_confrimation_on_registrant_change_enabled,
|
:request_confrimation_on_registrant_change_enabled,
|
||||||
:request_confirmation_on_domain_deletion_enabled,
|
:request_confirmation_on_domain_deletion_enabled,
|
||||||
|
:nameserver_required,
|
||||||
:address_processing
|
:address_processing
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -157,8 +157,10 @@ class Epp::DomainsController < EppController
|
||||||
end
|
end
|
||||||
|
|
||||||
def validate_create
|
def validate_create
|
||||||
|
if Domain.nameserver_required?
|
||||||
@prefix = 'create > create >'
|
@prefix = 'create > create >'
|
||||||
requires 'name', 'ns', 'registrant', 'ns > hostAttr'
|
requires 'name', 'ns', 'registrant', 'ns > hostAttr'
|
||||||
|
end
|
||||||
|
|
||||||
@prefix = 'extension > create >'
|
@prefix = 'extension > create >'
|
||||||
mutually_exclusive 'keyData', 'dsData'
|
mutually_exclusive 'keyData', 'dsData'
|
||||||
|
|
|
@ -141,7 +141,7 @@ class Domain < ActiveRecord::Base
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|
||||||
validates :nameservers, object_count: {
|
validates :nameservers, domain_nameserver: {
|
||||||
min: -> { Setting.ns_min_count },
|
min: -> { Setting.ns_min_count },
|
||||||
max: -> { Setting.ns_max_count }
|
max: -> { Setting.ns_max_count }
|
||||||
}
|
}
|
||||||
|
@ -245,6 +245,10 @@ class Domain < ActiveRecord::Base
|
||||||
{ admin_contacts: :registrar }
|
{ admin_contacts: :registrar }
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def nameserver_required?
|
||||||
|
Setting.nameserver_required
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def name=(value)
|
def name=(value)
|
||||||
|
@ -688,6 +692,11 @@ class Domain < ActiveRecord::Base
|
||||||
p_d = statuses.include?(DomainStatus::PENDING_DELETE)
|
p_d = statuses.include?(DomainStatus::PENDING_DELETE)
|
||||||
s_h = (statuses & [DomainStatus::SERVER_MANUAL_INZONE, DomainStatus::SERVER_HOLD]).empty?
|
s_h = (statuses & [DomainStatus::SERVER_MANUAL_INZONE, DomainStatus::SERVER_HOLD]).empty?
|
||||||
statuses << DomainStatus::SERVER_HOLD if p_d && s_h
|
statuses << DomainStatus::SERVER_HOLD if p_d && s_h
|
||||||
|
|
||||||
|
if !self.class.nameserver_required?
|
||||||
|
statuses << DomainStatus::INACTIVE if nameservers.empty?
|
||||||
|
statuses.delete(DomainStatus::INACTIVE) if nameservers.size >= Setting.ns_min_count
|
||||||
|
end
|
||||||
end
|
end
|
||||||
# rubocop: enable Metrics/CyclomaticComplexity
|
# rubocop: enable Metrics/CyclomaticComplexity
|
||||||
# rubocop: enable Metrics/PerceivedComplexity
|
# rubocop: enable Metrics/PerceivedComplexity
|
||||||
|
|
|
@ -71,12 +71,6 @@ class Epp::Domain < Domain
|
||||||
[:base, :required_parameter_missing_reserved]
|
[:base, :required_parameter_missing_reserved]
|
||||||
],
|
],
|
||||||
'2004' => [ # Parameter value range error
|
'2004' => [ # Parameter value range error
|
||||||
[:nameservers, :out_of_range,
|
|
||||||
{
|
|
||||||
min: Setting.ns_min_count,
|
|
||||||
max: Setting.ns_max_count
|
|
||||||
}
|
|
||||||
],
|
|
||||||
[:dnskeys, :out_of_range,
|
[:dnskeys, :out_of_range,
|
||||||
{
|
{
|
||||||
min: Setting.dnskeys_min_count,
|
min: Setting.dnskeys_min_count,
|
||||||
|
@ -124,7 +118,13 @@ class Epp::Domain < Domain
|
||||||
[:registrant, :cannot_be_missing]
|
[:registrant, :cannot_be_missing]
|
||||||
],
|
],
|
||||||
'2308' => [
|
'2308' => [
|
||||||
[:base, :domain_name_blocked, { value: { obj: 'name', val: name_dirty } }]
|
[:base, :domain_name_blocked, { value: { obj: 'name', val: name_dirty } }],
|
||||||
|
[:nameservers, :out_of_range,
|
||||||
|
{
|
||||||
|
min: Setting.ns_min_count,
|
||||||
|
max: Setting.ns_max_count
|
||||||
|
}
|
||||||
|
],
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
|
@ -57,11 +57,6 @@ class Registrar < ActiveRecord::Base
|
||||||
RegenerateRegistrarWhoisesJob.enqueue id
|
RegenerateRegistrarWhoisesJob.enqueue id
|
||||||
end
|
end
|
||||||
|
|
||||||
after_create :create_cash_account
|
|
||||||
def create_cash_account
|
|
||||||
accounts.create(account_type: Account::CASH, currency: 'EUR')
|
|
||||||
end
|
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
def search_by_query(query)
|
def search_by_query(query)
|
||||||
res = search(name_or_reg_no_cont: query).result
|
res = search(name_or_reg_no_cont: query).result
|
||||||
|
|
12
app/validators/domain_nameserver_validator.rb
Normal file
12
app/validators/domain_nameserver_validator.rb
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
class DomainNameserverValidator < ActiveModel::EachValidator
|
||||||
|
def validate_each(record, attribute, value)
|
||||||
|
return true if !Domain.nameserver_required? && value.empty?
|
||||||
|
|
||||||
|
min, max = options[:min].call, options[:max].call
|
||||||
|
values = value.reject(&:marked_for_destruction?)
|
||||||
|
|
||||||
|
return if values.size.between?(min, max)
|
||||||
|
association = options[:association] || attribute
|
||||||
|
record.errors.add(association, :out_of_range, { min: min, max: max })
|
||||||
|
end
|
||||||
|
end
|
|
@ -20,6 +20,7 @@
|
||||||
= render 'setting_row', var: :key_data_allowed
|
= render 'setting_row', var: :key_data_allowed
|
||||||
= render 'setting_row', var: :dnskeys_min_count
|
= render 'setting_row', var: :dnskeys_min_count
|
||||||
= render 'setting_row', var: :dnskeys_max_count
|
= render 'setting_row', var: :dnskeys_max_count
|
||||||
|
= render 'setting_row', var: :nameserver_required
|
||||||
= render 'setting_row', var: :ns_min_count
|
= render 'setting_row', var: :ns_min_count
|
||||||
= render 'setting_row', var: :ns_max_count
|
= render 'setting_row', var: :ns_max_count
|
||||||
= render 'setting_row', var: :expire_pending_confirmation
|
= render 'setting_row', var: :expire_pending_confirmation
|
||||||
|
|
|
@ -47,7 +47,7 @@ Rails.application.configure do
|
||||||
Bullet.enable = true
|
Bullet.enable = true
|
||||||
Bullet.bullet_logger = true
|
Bullet.bullet_logger = true
|
||||||
Bullet.rails_logger = true
|
Bullet.rails_logger = true
|
||||||
Bullet.raise = true # raise an error if n+1 query occurs
|
Bullet.raise = false # raise an error if n+1 query occurs
|
||||||
Bullet.unused_eager_loading_enable = false
|
Bullet.unused_eager_loading_enable = false
|
||||||
|
|
||||||
# Currenty hard to fix, it is triggered by Epp::Domain.new_from_epp for create request
|
# Currenty hard to fix, it is triggered by Epp::Domain.new_from_epp for create request
|
||||||
|
|
|
@ -27,6 +27,7 @@ if con.present? && con.table_exists?('settings')
|
||||||
Setting.save_default(:request_confrimation_on_registrant_change_enabled, true)
|
Setting.save_default(:request_confrimation_on_registrant_change_enabled, true)
|
||||||
Setting.save_default(:request_confirmation_on_domain_deletion_enabled, true)
|
Setting.save_default(:request_confirmation_on_domain_deletion_enabled, true)
|
||||||
Setting.save_default(:address_processing, true)
|
Setting.save_default(:address_processing, true)
|
||||||
|
Setting.save_default(:nameserver_required, false)
|
||||||
|
|
||||||
Setting.save_default(:client_side_status_editing_enabled, false)
|
Setting.save_default(:client_side_status_editing_enabled, false)
|
||||||
|
|
||||||
|
|
|
@ -97,7 +97,7 @@ en:
|
||||||
out_of_range: 'Tech contacts count must be between %{min}-%{max}'
|
out_of_range: 'Tech contacts count must be between %{min}-%{max}'
|
||||||
nameservers:
|
nameservers:
|
||||||
invalid: 'Nameservers are invalid'
|
invalid: 'Nameservers are invalid'
|
||||||
out_of_range: 'Nameservers count must be between %{min}-%{max}'
|
out_of_range: Data management policy violation; Nameserver count must be between %{min}-%{max} for active domains
|
||||||
not_found: 'Nameserver was not found'
|
not_found: 'Nameserver was not found'
|
||||||
taken: 'Nameserver already exists on this domain'
|
taken: 'Nameserver already exists on this domain'
|
||||||
less_than_or_equal_to: 'Nameservers count must be less than or equal to %{count}'
|
less_than_or_equal_to: 'Nameservers count must be less than or equal to %{count}'
|
||||||
|
|
128
db/migrate/20161227193500_update_generate_zone_file_function.rb
Normal file
128
db/migrate/20161227193500_update_generate_zone_file_function.rb
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
class UpdateGenerateZoneFileFunction < ActiveRecord::Migration
|
||||||
|
def up
|
||||||
|
execute <<-SQL
|
||||||
|
CREATE OR REPLACE FUNCTION generate_zonefile(i_origin character varying) RETURNS text
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $_$
|
||||||
|
DECLARE
|
||||||
|
zone_header text := concat('$ORIGIN ', i_origin, '.');
|
||||||
|
serial_num varchar;
|
||||||
|
include_filter varchar := '';
|
||||||
|
exclude_filter varchar := '';
|
||||||
|
tmp_var text;
|
||||||
|
ret text;
|
||||||
|
BEGIN
|
||||||
|
-- define filters
|
||||||
|
include_filter = '%.' || i_origin;
|
||||||
|
|
||||||
|
-- for %.%.%
|
||||||
|
IF i_origin ~ '\.' THEN
|
||||||
|
exclude_filter := '';
|
||||||
|
-- for %.%
|
||||||
|
ELSE
|
||||||
|
exclude_filter := '%.%.' || i_origin;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
SELECT ROUND(extract(epoch from now() at time zone 'utc')) INTO serial_num;
|
||||||
|
|
||||||
|
-- zonefile header
|
||||||
|
SELECT concat(
|
||||||
|
format('%-10s', '$ORIGIN .'), chr(10),
|
||||||
|
format('%-10s', '$TTL'), zf.ttl, chr(10), chr(10),
|
||||||
|
format('%-10s', i_origin || '.'), 'IN SOA ', zf.master_nameserver, '. ', zf.email, '. (', chr(10),
|
||||||
|
format('%-17s', ''), format('%-12s', serial_num), '; serial number', chr(10),
|
||||||
|
format('%-17s', ''), format('%-12s', zf.refresh), '; refresh, seconds', chr(10),
|
||||||
|
format('%-17s', ''), format('%-12s', zf.retry), '; retry, seconds', chr(10),
|
||||||
|
format('%-17s', ''), format('%-12s', zf.expire), '; expire, seconds', chr(10),
|
||||||
|
format('%-17s', ''), format('%-12s', zf.minimum_ttl), '; minimum TTL, seconds', chr(10),
|
||||||
|
format('%-17s', ''), ')'
|
||||||
|
) FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var;
|
||||||
|
|
||||||
|
ret = concat(tmp_var, chr(10), chr(10));
|
||||||
|
|
||||||
|
-- origin ns records
|
||||||
|
SELECT ns_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var;
|
||||||
|
ret := concat(ret, '; Zone NS Records', chr(10), tmp_var, chr(10));
|
||||||
|
|
||||||
|
-- ns records
|
||||||
|
SELECT array_to_string(
|
||||||
|
array(
|
||||||
|
SELECT concat(d.name_puny, '. IN NS ', ns.hostname, '.')
|
||||||
|
FROM domains d
|
||||||
|
JOIN nameservers ns ON ns.domain_id = d.id
|
||||||
|
WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter
|
||||||
|
AND NOT ('{serverHold,clientHold,inactive}' && d.statuses)
|
||||||
|
ORDER BY d.name
|
||||||
|
),
|
||||||
|
chr(10)
|
||||||
|
) INTO tmp_var;
|
||||||
|
|
||||||
|
ret := concat(ret, tmp_var, chr(10), chr(10));
|
||||||
|
|
||||||
|
-- origin a glue records
|
||||||
|
SELECT a_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var;
|
||||||
|
ret := concat(ret, '; Zone A Records', chr(10), tmp_var, chr(10));
|
||||||
|
|
||||||
|
-- a glue records for other nameservers
|
||||||
|
SELECT array_to_string(
|
||||||
|
array(
|
||||||
|
SELECT concat(ns.hostname, '. IN A ', unnest(ns.ipv4))
|
||||||
|
FROM nameservers ns
|
||||||
|
JOIN domains d ON d.id = ns.domain_id
|
||||||
|
WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter
|
||||||
|
AND ns.hostname LIKE '%.' || d.name
|
||||||
|
AND d.name <> i_origin
|
||||||
|
AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '{}'
|
||||||
|
AND NOT ('{serverHold,clientHold,inactive}' && d.statuses)
|
||||||
|
), chr(10)
|
||||||
|
) INTO tmp_var;
|
||||||
|
|
||||||
|
ret := concat(ret, tmp_var, chr(10), chr(10));
|
||||||
|
|
||||||
|
-- origin aaaa glue records
|
||||||
|
SELECT a4_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var;
|
||||||
|
ret := concat(ret, '; Zone AAAA Records', chr(10), tmp_var, chr(10));
|
||||||
|
|
||||||
|
-- aaaa glue records for other nameservers
|
||||||
|
SELECT array_to_string(
|
||||||
|
array(
|
||||||
|
SELECT concat(ns.hostname, '. IN AAAA ', unnest(ns.ipv6))
|
||||||
|
FROM nameservers ns
|
||||||
|
JOIN domains d ON d.id = ns.domain_id
|
||||||
|
WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter
|
||||||
|
AND ns.hostname LIKE '%.' || d.name
|
||||||
|
AND d.name <> i_origin
|
||||||
|
AND ns.ipv6 IS NOT NULL AND ns.ipv6 <> '{}'
|
||||||
|
AND NOT ('{serverHold,clientHold,inactive}' && d.statuses)
|
||||||
|
), chr(10)
|
||||||
|
) INTO tmp_var;
|
||||||
|
|
||||||
|
ret := concat(ret, tmp_var, chr(10), chr(10));
|
||||||
|
|
||||||
|
-- ds records
|
||||||
|
SELECT array_to_string(
|
||||||
|
array(
|
||||||
|
SELECT concat(
|
||||||
|
d.name_puny, '. 3600 IN DS ', dk.ds_key_tag, ' ',
|
||||||
|
dk.ds_alg, ' ', dk.ds_digest_type, ' ', dk.ds_digest
|
||||||
|
)
|
||||||
|
FROM domains d
|
||||||
|
JOIN dnskeys dk ON dk.domain_id = d.id
|
||||||
|
WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter AND dk.flags = 257
|
||||||
|
AND NOT ('{serverHold,clientHold,inactive}' && d.statuses)
|
||||||
|
),
|
||||||
|
chr(10)
|
||||||
|
) INTO tmp_var;
|
||||||
|
|
||||||
|
ret := concat(ret, '; Zone DS Records', chr(10), tmp_var, chr(10));
|
||||||
|
|
||||||
|
RETURN ret;
|
||||||
|
END;
|
||||||
|
$_$;
|
||||||
|
SQL
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
raise ActiveRecord::IrreversibleMigration
|
||||||
|
end
|
||||||
|
end
|
|
@ -11,7 +11,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 20160629114503) do
|
ActiveRecord::Schema.define(version: 20161227193500) do
|
||||||
|
|
||||||
# These are extensions that must be enabled in order to support this database
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "plpgsql"
|
enable_extension "plpgsql"
|
||||||
|
@ -958,10 +958,10 @@ ActiveRecord::Schema.define(version: 20160629114503) do
|
||||||
|
|
||||||
create_table "nameservers", force: :cascade do |t|
|
create_table "nameservers", force: :cascade do |t|
|
||||||
t.string "hostname"
|
t.string "hostname"
|
||||||
t.string "ipv4", array: true
|
t.string "ipv4", default: [], array: true
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
t.string "ipv6", array: true
|
t.string "ipv6", default: [], array: true
|
||||||
t.integer "domain_id"
|
t.integer "domain_id"
|
||||||
t.string "creator_str"
|
t.string "creator_str"
|
||||||
t.string "updator_str"
|
t.string "updator_str"
|
||||||
|
@ -1051,6 +1051,7 @@ ActiveRecord::Schema.define(version: 20160629114503) do
|
||||||
t.boolean "vat"
|
t.boolean "vat"
|
||||||
t.integer "legacy_id"
|
t.integer "legacy_id"
|
||||||
t.string "reference_no"
|
t.string "reference_no"
|
||||||
|
t.boolean "exclude_in_monthly_directo", default: false
|
||||||
t.boolean "test_registrar", default: false
|
t.boolean "test_registrar", default: false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1067,8 +1068,6 @@ ActiveRecord::Schema.define(version: 20160629114503) do
|
||||||
t.string "password"
|
t.string "password"
|
||||||
end
|
end
|
||||||
|
|
||||||
add_index "reserved_domains", ["name"], name: "index_reserved_domains_on_name", using: :btree
|
|
||||||
|
|
||||||
create_table "settings", force: :cascade do |t|
|
create_table "settings", force: :cascade do |t|
|
||||||
t.string "var", null: false
|
t.string "var", null: false
|
||||||
t.text "value"
|
t.text "value"
|
||||||
|
|
|
@ -172,7 +172,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text
|
||||||
include_filter = '%.' || i_origin;
|
include_filter = '%.' || i_origin;
|
||||||
|
|
||||||
-- for %.%.%
|
-- for %.%.%
|
||||||
IF i_origin ~ '\.' THEN
|
IF i_origin ~ '.' THEN
|
||||||
exclude_filter := '';
|
exclude_filter := '';
|
||||||
-- for %.%
|
-- for %.%
|
||||||
ELSE
|
ELSE
|
||||||
|
@ -207,7 +207,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text
|
||||||
FROM domains d
|
FROM domains d
|
||||||
JOIN nameservers ns ON ns.domain_id = d.id
|
JOIN nameservers ns ON ns.domain_id = d.id
|
||||||
WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter
|
WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter
|
||||||
AND NOT ('{serverHold,clientHold}' && d.statuses)
|
AND NOT ('{serverHold,clientHold,inactive}' && d.statuses)
|
||||||
ORDER BY d.name
|
ORDER BY d.name
|
||||||
),
|
),
|
||||||
chr(10)
|
chr(10)
|
||||||
|
@ -222,14 +222,14 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text
|
||||||
-- a glue records for other nameservers
|
-- a glue records for other nameservers
|
||||||
SELECT array_to_string(
|
SELECT array_to_string(
|
||||||
array(
|
array(
|
||||||
SELECT concat(ns.hostname, '. IN A ', ns.ipv4)
|
SELECT concat(ns.hostname, '. IN A ', unnest(ns.ipv4))
|
||||||
FROM nameservers ns
|
FROM nameservers ns
|
||||||
JOIN domains d ON d.id = ns.domain_id
|
JOIN domains d ON d.id = ns.domain_id
|
||||||
WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter
|
WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter
|
||||||
AND ns.hostname LIKE '%.' || d.name
|
AND ns.hostname LIKE '%.' || d.name
|
||||||
AND d.name <> i_origin
|
AND d.name <> i_origin
|
||||||
AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '{}'
|
AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '{}'
|
||||||
AND NOT ('{serverHold,clientHold}' && d.statuses)
|
AND NOT ('{serverHold,clientHold,inactive}' && d.statuses)
|
||||||
), chr(10)
|
), chr(10)
|
||||||
) INTO tmp_var;
|
) INTO tmp_var;
|
||||||
|
|
||||||
|
@ -242,14 +242,14 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text
|
||||||
-- aaaa glue records for other nameservers
|
-- aaaa glue records for other nameservers
|
||||||
SELECT array_to_string(
|
SELECT array_to_string(
|
||||||
array(
|
array(
|
||||||
SELECT concat(ns.hostname, '. IN AAAA ', ns.ipv6)
|
SELECT concat(ns.hostname, '. IN AAAA ', unnest(ns.ipv6))
|
||||||
FROM nameservers ns
|
FROM nameservers ns
|
||||||
JOIN domains d ON d.id = ns.domain_id
|
JOIN domains d ON d.id = ns.domain_id
|
||||||
WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter
|
WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter
|
||||||
AND ns.hostname LIKE '%.' || d.name
|
AND ns.hostname LIKE '%.' || d.name
|
||||||
AND d.name <> i_origin
|
AND d.name <> i_origin
|
||||||
AND ns.ipv6 IS NOT NULL AND ns.ipv6 <> '{}'
|
AND ns.ipv6 IS NOT NULL AND ns.ipv6 <> '{}'
|
||||||
AND NOT ('{serverHold,clientHold}' && d.statuses)
|
AND NOT ('{serverHold,clientHold,inactive}' && d.statuses)
|
||||||
), chr(10)
|
), chr(10)
|
||||||
) INTO tmp_var;
|
) INTO tmp_var;
|
||||||
|
|
||||||
|
@ -265,7 +265,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text
|
||||||
FROM domains d
|
FROM domains d
|
||||||
JOIN dnskeys dk ON dk.domain_id = d.id
|
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
|
WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter AND dk.flags = 257
|
||||||
AND NOT ('{serverHold,clientHold}' && d.statuses)
|
AND NOT ('{serverHold,clientHold,inactive}' && d.statuses)
|
||||||
),
|
),
|
||||||
chr(10)
|
chr(10)
|
||||||
) INTO tmp_var;
|
) INTO tmp_var;
|
||||||
|
@ -2493,10 +2493,10 @@ ALTER SEQUENCE messages_id_seq OWNED BY messages.id;
|
||||||
CREATE TABLE nameservers (
|
CREATE TABLE nameservers (
|
||||||
id integer NOT NULL,
|
id integer NOT NULL,
|
||||||
hostname character varying,
|
hostname character varying,
|
||||||
ipv4 character varying[],
|
ipv4 character varying[] DEFAULT '{}'::character varying[],
|
||||||
created_at timestamp without time zone,
|
created_at timestamp without time zone,
|
||||||
updated_at timestamp without time zone,
|
updated_at timestamp without time zone,
|
||||||
ipv6 character varying[],
|
ipv6 character varying[] DEFAULT '{}'::character varying[],
|
||||||
domain_id integer,
|
domain_id integer,
|
||||||
creator_str character varying,
|
creator_str character varying,
|
||||||
updator_str character varying,
|
updator_str character varying,
|
||||||
|
@ -2709,6 +2709,7 @@ CREATE TABLE registrars (
|
||||||
vat boolean,
|
vat boolean,
|
||||||
legacy_id integer,
|
legacy_id integer,
|
||||||
reference_no character varying,
|
reference_no character varying,
|
||||||
|
exclude_in_monthly_directo boolean DEFAULT false,
|
||||||
test_registrar boolean DEFAULT false
|
test_registrar boolean DEFAULT false
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -4744,13 +4745,6 @@ CREATE INDEX index_registrars_on_code ON registrars USING btree (code);
|
||||||
CREATE INDEX index_registrars_on_legacy_id ON registrars USING btree (legacy_id);
|
CREATE INDEX index_registrars_on_legacy_id ON registrars USING btree (legacy_id);
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: index_reserved_domains_on_name; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE INDEX index_reserved_domains_on_name ON reserved_domains USING btree (name);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: index_settings_on_thing_type_and_thing_id_and_var; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
-- Name: index_settings_on_thing_type_and_thing_id_and_var; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
||||||
--
|
--
|
||||||
|
@ -4793,13 +4787,6 @@ CREATE INDEX index_whois_records_on_registrar_id ON whois_records USING btree (r
|
||||||
CREATE INDEX log_contacts_object_legacy_id ON log_contacts USING btree ((((object ->> 'legacy_id'::text))::integer));
|
CREATE INDEX log_contacts_object_legacy_id ON log_contacts USING btree ((((object ->> 'legacy_id'::text))::integer));
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: log_contacts_object_legacy_id1; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE INDEX log_contacts_object_legacy_id1 ON log_contacts USING btree ((((object ->> 'legacy_id'::text))::integer));
|
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: log_dnskeys_object_legacy_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
-- Name: log_dnskeys_object_legacy_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
||||||
--
|
--
|
||||||
|
@ -5193,6 +5180,8 @@ INSERT INTO schema_migrations (version) VALUES ('20150706091724');
|
||||||
|
|
||||||
INSERT INTO schema_migrations (version) VALUES ('20150707103241');
|
INSERT INTO schema_migrations (version) VALUES ('20150707103241');
|
||||||
|
|
||||||
|
INSERT INTO schema_migrations (version) VALUES ('20150707103801');
|
||||||
|
|
||||||
INSERT INTO schema_migrations (version) VALUES ('20150707104937');
|
INSERT INTO schema_migrations (version) VALUES ('20150707104937');
|
||||||
|
|
||||||
INSERT INTO schema_migrations (version) VALUES ('20150707154543');
|
INSERT INTO schema_migrations (version) VALUES ('20150707154543');
|
||||||
|
@ -5267,6 +5256,8 @@ INSERT INTO schema_migrations (version) VALUES ('20160226132056');
|
||||||
|
|
||||||
INSERT INTO schema_migrations (version) VALUES ('20160304125933');
|
INSERT INTO schema_migrations (version) VALUES ('20160304125933');
|
||||||
|
|
||||||
|
INSERT INTO schema_migrations (version) VALUES ('20160311085956');
|
||||||
|
|
||||||
INSERT INTO schema_migrations (version) VALUES ('20160311085957');
|
INSERT INTO schema_migrations (version) VALUES ('20160311085957');
|
||||||
|
|
||||||
INSERT INTO schema_migrations (version) VALUES ('20160405131315');
|
INSERT INTO schema_migrations (version) VALUES ('20160405131315');
|
||||||
|
@ -5275,9 +5266,15 @@ INSERT INTO schema_migrations (version) VALUES ('20160411140719');
|
||||||
|
|
||||||
INSERT INTO schema_migrations (version) VALUES ('20160414110443');
|
INSERT INTO schema_migrations (version) VALUES ('20160414110443');
|
||||||
|
|
||||||
|
INSERT INTO schema_migrations (version) VALUES ('20160421074023');
|
||||||
|
|
||||||
INSERT INTO schema_migrations (version) VALUES ('20160429114732');
|
INSERT INTO schema_migrations (version) VALUES ('20160429114732');
|
||||||
|
|
||||||
INSERT INTO schema_migrations (version) VALUES ('20160527110738');
|
INSERT INTO schema_migrations (version) VALUES ('20160527110738');
|
||||||
|
|
||||||
INSERT INTO schema_migrations (version) VALUES ('20160629114503');
|
INSERT INTO schema_migrations (version) VALUES ('20160629114503');
|
||||||
|
|
||||||
|
INSERT INTO schema_migrations (version) VALUES ('20161004101419');
|
||||||
|
|
||||||
|
INSERT INTO schema_migrations (version) VALUES ('20161227193500');
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ Domain name mapping protocol short version:
|
||||||
Must add up to 1 / 2 / 3 years.
|
Must add up to 1 / 2 / 3 years.
|
||||||
Attribute: unit="y/m/d"
|
Attribute: unit="y/m/d"
|
||||||
Default is 1 year.
|
Default is 1 year.
|
||||||
<domain:ns> 1
|
<domain:ns> 0-1
|
||||||
<domain:hostAttr> 2-11
|
<domain:hostAttr> 2-11
|
||||||
<domain:hostName> 1 Hostname of the nameserver
|
<domain:hostName> 1 Hostname of the nameserver
|
||||||
<domain:hostAddr> 0-2 Required if nameserver is under domain zone.
|
<domain:hostAddr> 0-2 Required if nameserver is under domain zone.
|
||||||
|
|
|
@ -7,7 +7,6 @@ FactoryGirl.define do
|
||||||
registrant
|
registrant
|
||||||
|
|
||||||
after :build do |domain|
|
after :build do |domain|
|
||||||
domain.nameservers << FactoryGirl.build_pair(:nameserver)
|
|
||||||
domain.admin_domain_contacts << FactoryGirl.build(:admin_domain_contact)
|
domain.admin_domain_contacts << FactoryGirl.build(:admin_domain_contact)
|
||||||
domain.tech_domain_contacts << FactoryGirl.build(:tech_domain_contact)
|
domain.tech_domain_contacts << FactoryGirl.build(:tech_domain_contact)
|
||||||
end
|
end
|
||||||
|
|
|
@ -37,7 +37,6 @@ RSpec.describe Domain do
|
||||||
@domain.valid?
|
@domain.valid?
|
||||||
@domain.errors.full_messages.should match_array([
|
@domain.errors.full_messages.should match_array([
|
||||||
"Admin domain contacts Admin contacts count must be between 1-10",
|
"Admin domain contacts Admin contacts count must be between 1-10",
|
||||||
"Nameservers Nameservers count must be between 2-11",
|
|
||||||
"Period Period is not a number",
|
"Period Period is not a number",
|
||||||
"Registrant Registrant is missing",
|
"Registrant Registrant is missing",
|
||||||
"Registrar Registrar is missing"
|
"Registrar Registrar is missing"
|
||||||
|
@ -704,6 +703,81 @@ RSpec.describe Domain, db: false do
|
||||||
it { is_expected.to alias_attribute(:force_delete_time, :force_delete_at) }
|
it { is_expected.to alias_attribute(:force_delete_time, :force_delete_at) }
|
||||||
it { is_expected.to alias_attribute(:outzone_time, :outzone_at) }
|
it { is_expected.to alias_attribute(:outzone_time, :outzone_at) }
|
||||||
|
|
||||||
|
describe 'nameserver validation', db: true do
|
||||||
|
let(:domain) { described_class.new }
|
||||||
|
|
||||||
|
it 'rejects less than min' do
|
||||||
|
Setting.ns_min_count = 2
|
||||||
|
domain.nameservers.build(FactoryGirl.attributes_for(:nameserver))
|
||||||
|
domain.validate
|
||||||
|
expect(domain.errors).to have_key(:nameservers)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'rejects more than max' do
|
||||||
|
Setting.ns_min_count = 1
|
||||||
|
Setting.ns_max_count = 1
|
||||||
|
domain.nameservers.build(FactoryGirl.attributes_for(:nameserver))
|
||||||
|
domain.nameservers.build(FactoryGirl.attributes_for(:nameserver))
|
||||||
|
domain.validate
|
||||||
|
expect(domain.errors).to have_key(:nameservers)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'accepts min' do
|
||||||
|
Setting.ns_min_count = 1
|
||||||
|
domain.nameservers.build(FactoryGirl.attributes_for(:nameserver))
|
||||||
|
domain.validate
|
||||||
|
expect(domain.errors).to_not have_key(:nameservers)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'accepts max' do
|
||||||
|
Setting.ns_min_count = 1
|
||||||
|
Setting.ns_max_count = 2
|
||||||
|
domain.nameservers.build(FactoryGirl.attributes_for(:nameserver))
|
||||||
|
domain.nameservers.build(FactoryGirl.attributes_for(:nameserver))
|
||||||
|
domain.validate
|
||||||
|
expect(domain.errors).to_not have_key(:nameservers)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when nameserver is optional' do
|
||||||
|
before :example do
|
||||||
|
allow(Domain).to receive(:nameserver_required?).and_return(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'rejects less than min' do
|
||||||
|
Setting.ns_min_count = 2
|
||||||
|
domain.nameservers.build(FactoryGirl.attributes_for(:nameserver))
|
||||||
|
domain.validate
|
||||||
|
expect(domain.errors).to have_key(:nameservers)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'accepts absent' do
|
||||||
|
domain.validate
|
||||||
|
expect(domain.errors).to_not have_key(:nameservers)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when nameserver is required' do
|
||||||
|
before :example do
|
||||||
|
allow(Domain).to receive(:nameserver_required?).and_return(true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'rejects absent' do
|
||||||
|
domain.validate
|
||||||
|
expect(domain.errors).to have_key(:nameservers)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '::nameserver_required?' do
|
||||||
|
before do
|
||||||
|
Setting.nameserver_required = 'test'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns setting value' do
|
||||||
|
expect(described_class.nameserver_required?).to eq('test')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '::expire_warning_period', db: true do
|
describe '::expire_warning_period', db: true do
|
||||||
before :example do
|
before :example do
|
||||||
Setting.expire_warning_period = 1
|
Setting.expire_warning_period = 1
|
||||||
|
|
|
@ -16,6 +16,7 @@ end
|
||||||
require 'support/matchers/alias_attribute'
|
require 'support/matchers/alias_attribute'
|
||||||
require 'support/matchers/active_job'
|
require 'support/matchers/active_job'
|
||||||
require 'support/capybara'
|
require 'support/capybara'
|
||||||
|
require 'support/factory_girl'
|
||||||
require 'support/database_cleaner'
|
require 'support/database_cleaner'
|
||||||
require 'support/paper_trail'
|
require 'support/paper_trail'
|
||||||
require 'support/settings'
|
require 'support/settings'
|
||||||
|
|
198
spec/requests/epp/domain/create_spec.rb
Normal file
198
spec/requests/epp/domain/create_spec.rb
Normal file
|
@ -0,0 +1,198 @@
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe 'EPP domain:create' do
|
||||||
|
subject(:response_xml) { Nokogiri::XML(response.body) }
|
||||||
|
subject(:response_code) { response_xml.xpath('//xmlns:result').first['code'] }
|
||||||
|
subject(:response_description) { response_xml.css('result msg').text }
|
||||||
|
|
||||||
|
before :example do
|
||||||
|
travel_to Time.zone.parse('05.07.2010')
|
||||||
|
|
||||||
|
registrar = create(:registrar)
|
||||||
|
user = create(:api_user_epp, registrar: registrar)
|
||||||
|
create(:account, registrar: registrar, balance: 1.0)
|
||||||
|
|
||||||
|
create(:contact, code: 'test')
|
||||||
|
|
||||||
|
create(:pricelist,
|
||||||
|
category: 'com',
|
||||||
|
duration: '1year',
|
||||||
|
price: 1.to_money,
|
||||||
|
operation_category: 'create',
|
||||||
|
valid_from: Time.zone.parse('05.07.2010'),
|
||||||
|
valid_to: Time.zone.parse('05.07.2010')
|
||||||
|
)
|
||||||
|
|
||||||
|
sign_in_to_epp_area(user: user)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when nameserver is optional' do
|
||||||
|
before :example do
|
||||||
|
allow(Domain).to receive(:nameserver_required?).and_return(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when minimum nameserver count is not satisfied' do
|
||||||
|
let(:request_xml) { <<-XML
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<epp xmlns="https://epp.tld.ee/schema/epp-ee-1.0.xsd">
|
||||||
|
<command>
|
||||||
|
<create>
|
||||||
|
<domain:create xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd">
|
||||||
|
<domain:name>test.com</domain:name>
|
||||||
|
<domain:period unit="y">1</domain:period>
|
||||||
|
<domain:ns>
|
||||||
|
<domain:hostAttr>
|
||||||
|
<domain:hostName>ns.test.com</domain:hostName>
|
||||||
|
<domain:hostAddr ip="v4">192.168.1.1</domain:hostAddr>
|
||||||
|
</domain:hostAttr>
|
||||||
|
</domain:ns>
|
||||||
|
<domain:registrant>test</domain:registrant>
|
||||||
|
<domain:contact type="admin">test</domain:contact>
|
||||||
|
<domain:contact type="tech">test</domain:contact>
|
||||||
|
</domain:create>
|
||||||
|
</create>
|
||||||
|
<extension>
|
||||||
|
<eis:extdata xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd">
|
||||||
|
<eis:legalDocument type="pdf">#{Base64.encode64('a' * 5000)}</eis:legalDocument>
|
||||||
|
</eis:extdata>
|
||||||
|
</extension>
|
||||||
|
</command>
|
||||||
|
</epp>
|
||||||
|
XML
|
||||||
|
}
|
||||||
|
|
||||||
|
before :example do
|
||||||
|
Setting.ns_min_count = 2
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns epp code of 2308' do
|
||||||
|
post '/epp/command/create', frame: request_xml
|
||||||
|
expect(response_code).to eq('2308')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns epp description' do
|
||||||
|
post '/epp/command/create', frame: request_xml
|
||||||
|
|
||||||
|
description = 'Data management policy violation;' \
|
||||||
|
" Nameserver count must be between #{Setting.ns_min_count}-#{Setting.ns_max_count}" \
|
||||||
|
' for active domains [nameservers]'
|
||||||
|
expect(response_description).to eq(description)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when nameserver is absent' do
|
||||||
|
let(:request_xml) { <<-XML
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<epp xmlns="https://epp.tld.ee/schema/epp-ee-1.0.xsd">
|
||||||
|
<command>
|
||||||
|
<create>
|
||||||
|
<domain:create xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd">
|
||||||
|
<domain:name>test.com</domain:name>
|
||||||
|
<domain:period unit="y">1</domain:period>
|
||||||
|
<domain:registrant>test</domain:registrant>
|
||||||
|
<domain:contact type="admin">test</domain:contact>
|
||||||
|
<domain:contact type="tech">test</domain:contact>
|
||||||
|
</domain:create>
|
||||||
|
</create>
|
||||||
|
<extension>
|
||||||
|
<eis:extdata xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd">
|
||||||
|
<eis:legalDocument type="pdf">#{Base64.encode64('a' * 5000)}</eis:legalDocument>
|
||||||
|
</eis:extdata>
|
||||||
|
</extension>
|
||||||
|
</command>
|
||||||
|
</epp>
|
||||||
|
XML
|
||||||
|
}
|
||||||
|
|
||||||
|
it 'returns epp code of 1000' do
|
||||||
|
post '/epp/command/create', frame: request_xml
|
||||||
|
expect(response_code).to eq('1000'), "Expected EPP code of 1000, got #{response_code} (#{response_description})"
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'creates new domain' do
|
||||||
|
expect { post '/epp/command/create', frame: request_xml }.to change { Domain.count }.from(0).to(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'new domain' do
|
||||||
|
it 'has status of inactive' do
|
||||||
|
post '/epp/command/create', frame: request_xml
|
||||||
|
domain = Domain.find_by(name: 'test.com')
|
||||||
|
expect(domain.statuses).to include(DomainStatus::INACTIVE)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when nameserver is required' do
|
||||||
|
before :example do
|
||||||
|
allow(Domain).to receive(:nameserver_required?).and_return(true)
|
||||||
|
Setting.ns_min_count = 1
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when nameserver is present' do
|
||||||
|
let(:request_xml) { <<-XML
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<epp xmlns="https://epp.tld.ee/schema/epp-ee-1.0.xsd">
|
||||||
|
<command>
|
||||||
|
<create>
|
||||||
|
<domain:create xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd">
|
||||||
|
<domain:name>test.com</domain:name>
|
||||||
|
<domain:period unit="y">1</domain:period>
|
||||||
|
<domain:ns>
|
||||||
|
<domain:hostAttr>
|
||||||
|
<domain:hostName>ns.test.com</domain:hostName>
|
||||||
|
<domain:hostAddr ip="v4">192.168.1.1</domain:hostAddr>
|
||||||
|
</domain:hostAttr>
|
||||||
|
</domain:ns>
|
||||||
|
<domain:registrant>test</domain:registrant>
|
||||||
|
<domain:contact type="admin">test</domain:contact>
|
||||||
|
<domain:contact type="tech">test</domain:contact>
|
||||||
|
</domain:create>
|
||||||
|
</create>
|
||||||
|
<extension>
|
||||||
|
<eis:extdata xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd">
|
||||||
|
<eis:legalDocument type="pdf">#{Base64.encode64('a' * 5000)}</eis:legalDocument>
|
||||||
|
</eis:extdata>
|
||||||
|
</extension>
|
||||||
|
</command>
|
||||||
|
</epp>
|
||||||
|
XML
|
||||||
|
}
|
||||||
|
|
||||||
|
it 'returns epp code of 1000' do
|
||||||
|
post '/epp/command/create', frame: request_xml
|
||||||
|
expect(response_code).to eq('1000'), "Expected EPP code of 1000, got #{response_code} (#{response_description})"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when nameserver is absent' do
|
||||||
|
let(:request_xml) { <<-XML
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<epp xmlns="https://epp.tld.ee/schema/epp-ee-1.0.xsd">
|
||||||
|
<command>
|
||||||
|
<create>
|
||||||
|
<domain:create xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd">
|
||||||
|
<domain:name>test.com</domain:name>
|
||||||
|
<domain:period unit="y">1</domain:period>
|
||||||
|
<domain:registrant>test</domain:registrant>
|
||||||
|
<domain:contact type="admin">test</domain:contact>
|
||||||
|
<domain:contact type="tech">test</domain:contact>
|
||||||
|
</domain:create>
|
||||||
|
</create>
|
||||||
|
<extension>
|
||||||
|
<eis:extdata xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd">
|
||||||
|
<eis:legalDocument type="pdf">#{Base64.encode64('a' * 5000)}</eis:legalDocument>
|
||||||
|
</eis:extdata>
|
||||||
|
</extension>
|
||||||
|
</command>
|
||||||
|
</epp>
|
||||||
|
XML
|
||||||
|
}
|
||||||
|
|
||||||
|
it 'returns epp code of 2003' do
|
||||||
|
post '/epp/command/create', frame: request_xml
|
||||||
|
expect(response_code).to eq('2003')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
193
spec/requests/epp/domain/update_spec.rb
Normal file
193
spec/requests/epp/domain/update_spec.rb
Normal file
|
@ -0,0 +1,193 @@
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe 'EPP domain:update' do
|
||||||
|
let!(:domain) { create(:domain, name: 'test.com') }
|
||||||
|
subject(:response_xml) { Nokogiri::XML(response.body) }
|
||||||
|
subject(:response_code) { response_xml.xpath('//xmlns:result').first['code'] }
|
||||||
|
subject(:response_description) { response_xml.css('result msg').text }
|
||||||
|
|
||||||
|
before :example do
|
||||||
|
sign_in_to_epp_area
|
||||||
|
|
||||||
|
allow(Domain).to receive(:nameserver_required?).and_return(false)
|
||||||
|
Setting.ns_min_count = 2
|
||||||
|
Setting.ns_max_count = 3
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'nameserver add' do
|
||||||
|
context 'when nameserver count is less than minimum' do
|
||||||
|
let(:request_xml) { <<-XML
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<epp xmlns="https://epp.tld.ee/schema/epp-ee-1.0.xsd">
|
||||||
|
<command>
|
||||||
|
<update>
|
||||||
|
<domain:update xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd">
|
||||||
|
<domain:name>test.com</domain:name>
|
||||||
|
<domain:add>
|
||||||
|
<domain:ns>
|
||||||
|
<domain:hostAttr>
|
||||||
|
<domain:hostName>ns1.test.ee</domain:hostName>
|
||||||
|
</domain:hostAttr>
|
||||||
|
</domain:ns>
|
||||||
|
</domain:add>
|
||||||
|
</domain:update>
|
||||||
|
</update>
|
||||||
|
<extension>
|
||||||
|
<secDNS:update xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1"/>
|
||||||
|
<eis:extdata xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd">
|
||||||
|
<eis:legalDocument type="pdf">#{Base64.encode64('a' * 5000)}</eis:legalDocument>
|
||||||
|
</eis:extdata>
|
||||||
|
</extension>
|
||||||
|
</command>
|
||||||
|
</epp>
|
||||||
|
XML
|
||||||
|
}
|
||||||
|
|
||||||
|
it 'returns epp code of 2308' do
|
||||||
|
post '/epp/command/update', frame: request_xml
|
||||||
|
expect(response_code).to eq('2308'), "Expected EPP code of 2308, got #{response_code} (#{response_description})"
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns epp description' do
|
||||||
|
post '/epp/command/update', frame: request_xml
|
||||||
|
|
||||||
|
description = 'Data management policy violation;' \
|
||||||
|
" Nameserver count must be between #{Setting.ns_min_count}-#{Setting.ns_max_count}" \
|
||||||
|
' for active domains [nameservers]'
|
||||||
|
expect(response_description).to eq(description)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when nameserver count satisfies required minimum' do
|
||||||
|
let!(:domain) { create(:domain, name: 'test.com') }
|
||||||
|
let(:request_xml) { <<-XML
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<epp xmlns="https://epp.tld.ee/schema/epp-ee-1.0.xsd">
|
||||||
|
<command>
|
||||||
|
<update>
|
||||||
|
<domain:update xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd">
|
||||||
|
<domain:name>test.com</domain:name>
|
||||||
|
<domain:add>
|
||||||
|
<domain:ns>
|
||||||
|
<domain:hostAttr>
|
||||||
|
<domain:hostName>ns1.test.ee</domain:hostName>
|
||||||
|
</domain:hostAttr>
|
||||||
|
<domain:hostAttr>
|
||||||
|
<domain:hostName>ns2.test.ee</domain:hostName>
|
||||||
|
</domain:hostAttr>
|
||||||
|
</domain:ns>
|
||||||
|
</domain:add>
|
||||||
|
</domain:update>
|
||||||
|
</update>
|
||||||
|
<extension>
|
||||||
|
<secDNS:update xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1"/>
|
||||||
|
<eis:extdata xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd">
|
||||||
|
<eis:legalDocument type="pdf">#{Base64.encode64('a' * 5000)}</eis:legalDocument>
|
||||||
|
</eis:extdata>
|
||||||
|
</extension>
|
||||||
|
</command>
|
||||||
|
</epp>
|
||||||
|
XML
|
||||||
|
}
|
||||||
|
|
||||||
|
it 'returns epp code of 1000' do
|
||||||
|
post '/epp/command/update', frame: request_xml
|
||||||
|
expect(response_code).to eq('1000'), "Expected EPP code of 1000, got #{response_code} (#{response_description})"
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'removes inactive status' do
|
||||||
|
post '/epp/command/update', frame: request_xml
|
||||||
|
|
||||||
|
domain = Domain.find_by(name: 'test.com')
|
||||||
|
expect(domain.statuses).to_not include(DomainStatus::INACTIVE)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'nameserver remove' do
|
||||||
|
before :example do
|
||||||
|
domain.nameservers << create(:nameserver, hostname: 'ns1.test.ee')
|
||||||
|
domain.nameservers << create(:nameserver, hostname: 'ns2.test.ee')
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when nameserver count is less than minimum' do
|
||||||
|
let(:request_xml) { <<-XML
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<epp xmlns="https://epp.tld.ee/schema/epp-ee-1.0.xsd">
|
||||||
|
<command>
|
||||||
|
<update>
|
||||||
|
<domain:update xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd">
|
||||||
|
<domain:name>test.com</domain:name>
|
||||||
|
<domain:rem>
|
||||||
|
<domain:ns>
|
||||||
|
<domain:hostAttr>
|
||||||
|
<domain:hostName>ns1.test.ee</domain:hostName>
|
||||||
|
</domain:hostAttr>
|
||||||
|
</domain:ns>
|
||||||
|
</domain:rem>
|
||||||
|
</domain:update>
|
||||||
|
</update>
|
||||||
|
<extension>
|
||||||
|
<secDNS:update xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1"/>
|
||||||
|
<eis:extdata xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd">
|
||||||
|
<eis:legalDocument type="pdf">#{Base64.encode64('a' * 5000)}</eis:legalDocument>
|
||||||
|
</eis:extdata>
|
||||||
|
</extension>
|
||||||
|
</command>
|
||||||
|
</epp>
|
||||||
|
XML
|
||||||
|
}
|
||||||
|
|
||||||
|
it 'returns epp code of 2308' do
|
||||||
|
post '/epp/command/update', frame: request_xml
|
||||||
|
expect(response_code).to eq('2308'), "Expected EPP code of 2308, got #{response_code} (#{response_description})"
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns epp description' do
|
||||||
|
post '/epp/command/update', frame: request_xml
|
||||||
|
|
||||||
|
description = 'Data management policy violation;' \
|
||||||
|
" Nameserver count must be between #{Setting.ns_min_count}-#{Setting.ns_max_count}" \
|
||||||
|
' for active domains [nameservers]'
|
||||||
|
expect(response_description).to eq(description)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when all nameservers are removed' do
|
||||||
|
let(:request_xml) { <<-XML
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<epp xmlns="https://epp.tld.ee/schema/epp-ee-1.0.xsd">
|
||||||
|
<command>
|
||||||
|
<update>
|
||||||
|
<domain:update xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd">
|
||||||
|
<domain:name>test.com</domain:name>
|
||||||
|
<domain:rem>
|
||||||
|
<domain:ns>
|
||||||
|
<domain:hostAttr>
|
||||||
|
<domain:hostName>ns1.test.ee</domain:hostName>
|
||||||
|
</domain:hostAttr>
|
||||||
|
<domain:hostAttr>
|
||||||
|
<domain:hostName>ns2.test.ee</domain:hostName>
|
||||||
|
</domain:hostAttr>
|
||||||
|
</domain:ns>
|
||||||
|
</domain:rem>
|
||||||
|
</domain:update>
|
||||||
|
</update>
|
||||||
|
<extension>
|
||||||
|
<secDNS:update xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1"/>
|
||||||
|
<eis:extdata xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd">
|
||||||
|
<eis:legalDocument type="pdf">#{Base64.encode64('a' * 5000)}</eis:legalDocument>
|
||||||
|
</eis:extdata>
|
||||||
|
</extension>
|
||||||
|
</command>
|
||||||
|
</epp>
|
||||||
|
XML
|
||||||
|
}
|
||||||
|
|
||||||
|
it 'returns epp code of 1000' do
|
||||||
|
post '/epp/command/update', frame: request_xml
|
||||||
|
expect(response_code).to eq('2308'), "Expected EPP code of 1000, got #{response_code} (#{response_description})"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
3
spec/support/factory_girl.rb
Normal file
3
spec/support/factory_girl.rb
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
RSpec.configure do |config|
|
||||||
|
config.include FactoryGirl::Syntax::Methods
|
||||||
|
end
|
|
@ -10,6 +10,8 @@ RSpec.configure do |config|
|
||||||
|
|
||||||
Setting.dnskeys_min_count = 0
|
Setting.dnskeys_min_count = 0
|
||||||
Setting.dnskeys_max_count = 9
|
Setting.dnskeys_max_count = 9
|
||||||
|
|
||||||
|
Setting.nameserver_required = false
|
||||||
Setting.ns_min_count = 2
|
Setting.ns_min_count = 2
|
||||||
Setting.ns_max_count = 11
|
Setting.ns_max_count = 11
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue