Merge branch 'master' into alpha

This commit is contained in:
Priit Tark 2015-06-09 18:29:50 +03:00
commit 05ba870385
46 changed files with 2178 additions and 1001 deletions

View file

@ -1,3 +1,8 @@
08.06.2015
* Add sk service name to application.yml
* Renew zonefile procedure
02.06.2015 02.06.2015
* Added possibility to overwrite legal document types at application.yml level. * Added possibility to overwrite legal document types at application.yml level.

View file

@ -55,7 +55,7 @@ gem 'money-rails', '~> 1.3.0' # Money helpers
# deploy # deploy
gem 'whenever', '~> 0.9.4', require: false gem 'whenever', '~> 0.9.4', require: false
gem 'data_migrate', gem 'data_migrate',
github: 'gitlabeu/data_migrate', github: 'gitlabeu/data_migrate',
ref: '35d22b09ff37a4e9d61ab326ad5d8eb0edf1fc81' ref: '35d22b09ff37a4e9d61ab326ad5d8eb0edf1fc81'
@ -73,7 +73,7 @@ gem 'digidoc_client', '~> 0.2.1'
# epp # epp
gem 'epp', '~> 1.4.2', github: 'gitlabeu/epp' gem 'epp', '~> 1.4.2', github: 'gitlabeu/epp'
gem 'epp-xml', '~> 1.0.1' # EPP XMLs gem 'epp-xml', '~> 1.0.2' # EPP XMLs
gem 'uuidtools', '~> 2.1.4' # For unique IDs (used by the epp gem) gem 'uuidtools', '~> 2.1.4' # For unique IDs (used by the epp gem)
# for importing legacy db # for importing legacy db

View file

@ -171,7 +171,7 @@ GEM
nokogiri (>= 1.4.0) nokogiri (>= 1.4.0)
savon (>= 2.4.0) savon (>= 2.4.0)
docile (1.1.5) docile (1.1.5)
epp-xml (1.0.1) epp-xml (1.0.2)
activesupport (~> 4.1) activesupport (~> 4.1)
builder (~> 3.2) builder (~> 3.2)
equalizer (0.0.11) equalizer (0.0.11)
@ -529,7 +529,7 @@ DEPENDENCIES
devise (~> 3.4.1) devise (~> 3.4.1)
digidoc_client (~> 0.2.1) digidoc_client (~> 0.2.1)
epp (~> 1.4.2)! epp (~> 1.4.2)!
epp-xml (~> 1.0.1) epp-xml (~> 1.0.2)
fabrication (~> 2.12.2) fabrication (~> 2.12.2)
faker (~> 1.3.0) faker (~> 1.3.0)
figaro (~> 1.1.0) figaro (~> 1.1.0)

View file

@ -57,6 +57,7 @@ class Admin::AdminUsersController < AdminController
end end
def admin_user_params def admin_user_params
params.require(:admin_user).permit(:username, :password, :password_confirmation, :identity_code, :email, :country_code, { roles: [] }) params.require(:admin_user).permit(:username,
:password, :password_confirmation, :identity_code, :email, :country_code, { roles: [] })
end end
end end

View file

@ -39,6 +39,7 @@ class Admin::PricelistsController < AdminController
end end
def pricelist_params def pricelist_params
params.require(:pricelist).permit(:category, :name, :duration, :price, :valid_from, :valid_to) params.require(:pricelist).permit(:operation_category, :category, :price_category,
:duration, :price, :valid_from, :valid_to)
end end
end end

View file

@ -118,6 +118,9 @@ class Epp::ContactsController < EppController
contact_org_disabled contact_org_disabled
fax_disabled fax_disabled
status_editing_disabled status_editing_disabled
if params[:parsed_frame].css('ident').present?
epp_errors << { code: '2306', msg: "#{I18n.t(:ident_update_error)} [ident]" }
end
requires 'id' requires 'id'
@prefix = nil @prefix = nil
end end

View file

@ -70,7 +70,7 @@ class Domain < ActiveRecord::Base
after_save :update_whois_record after_save :update_whois_record
validates :name_dirty, domain_name: true, uniqueness: true validates :name_dirty, domain_name: true, uniqueness: true
validates :name_puny, length: { maximum: 66 } validates :puny_label, length: { maximum: 63 }
validates :period, numericality: { only_integer: true } validates :period, numericality: { only_integer: true }
validates :registrant, :registrar, presence: true validates :registrant, :registrar, presence: true
@ -146,6 +146,12 @@ class Domain < ActiveRecord::Base
{ admin_contacts: :registrar } { admin_contacts: :registrar }
) )
end end
def expire_domains
Domain.where('valid_to <= ?', Time.zone.now).each do |x|
x.domain_statuses.create(value: DomainStatus::EXPIRED) if x.expirable?
end
end
end end
def name=(value) def name=(value)
@ -160,6 +166,10 @@ class Domain < ActiveRecord::Base
"EIS-#{id}" "EIS-#{id}"
end end
def puny_label
name_puny.to_s.split('.').first
end
def registrant_typeahead def registrant_typeahead
@registrant_typeahead || registrant.try(:name) || nil @registrant_typeahead || registrant.try(:name) || nil
end end
@ -174,6 +184,11 @@ class Domain < ActiveRecord::Base
)).empty? )).empty?
end end
def expirable?
return false if valid_to > Time.zone.now
domain_statuses.where(value: DomainStatus::EXPIRED).empty?
end
def pending_update? def pending_update?
(domain_statuses.pluck(:value) & %W( (domain_statuses.pluck(:value) & %W(
#{DomainStatus::PENDING_UPDATE} #{DomainStatus::PENDING_UPDATE}

View file

@ -143,7 +143,6 @@ class Epp::Contact < Contact
at.deep_merge!(self.class.attrs_from(frame.css('rem'), 'rem')) at.deep_merge!(self.class.attrs_from(frame.css('rem'), 'rem'))
at.deep_merge!(self.class.attrs_from(frame.css('add'))) at.deep_merge!(self.class.attrs_from(frame.css('add')))
at.deep_merge!(self.class.attrs_from(frame.css('chg'))) at.deep_merge!(self.class.attrs_from(frame.css('chg')))
at.merge!(self.class.ident_attrs(frame.css('ident').first))
legal_frame = frame.css('legalDocument').first legal_frame = frame.css('legalDocument').first
at[:legal_documents_attributes] = self.class.legal_document_attrs(legal_frame) at[:legal_documents_attributes] = self.class.legal_document_attrs(legal_frame)
self.deliver_emails = true # turn on email delivery for epp self.deliver_emails = true # turn on email delivery for epp

View file

@ -34,7 +34,6 @@ class Epp::Domain < Domain
max: Setting.ns_max_count max: Setting.ns_max_count
} }
], ],
[:period, :out_of_range, { value: { obj: 'period', val: period } }],
[:dnskeys, :out_of_range, [:dnskeys, :out_of_range,
{ {
min: Setting.dnskeys_min_count, min: Setting.dnskeys_min_count,
@ -56,7 +55,7 @@ class Epp::Domain < Domain
], ],
'2005' => [ # Parameter value syntax error '2005' => [ # Parameter value syntax error
[:name_dirty, :invalid, { obj: 'name', val: name_dirty }], [:name_dirty, :invalid, { obj: 'name', val: name_dirty }],
[:name_puny, :too_long, { obj: 'name', val: name_puny }] [:puny_label, :too_long, { obj: 'name', val: name_puny }]
], ],
'2201' => [ # Authorisation error '2201' => [ # Authorisation error
[:auth_info, :wrong_pw] [:auth_info, :wrong_pw]
@ -69,6 +68,7 @@ class Epp::Domain < Domain
[:base, :domain_status_prohibits_operation] [:base, :domain_status_prohibits_operation]
], ],
'2306' => [ # Parameter policy error '2306' => [ # Parameter policy error
[:period, :out_of_range, { value: { obj: 'period', val: period } }],
[:base, :ds_data_with_key_not_allowed], [:base, :ds_data_with_key_not_allowed],
[:base, :ds_data_not_allowed], [:base, :ds_data_not_allowed],
[:base, :key_data_not_allowed], [:base, :key_data_not_allowed],
@ -429,6 +429,13 @@ class Epp::Domain < Domain
def renew(cur_exp_date, period, unit = 'y') def renew(cur_exp_date, period, unit = 'y')
# TODO: Check how much time before domain exp date can it be renewed # TODO: Check how much time before domain exp date can it be renewed
validate_exp_dates(cur_exp_date) validate_exp_dates(cur_exp_date)
if Setting.days_to_renew_domain_before_expire != 0
if (valid_to - Time.zone.now).to_i / 1.day >= Setting.days_to_renew_domain_before_expire
add_epp_error('2105', nil, nil, I18n.t('object_is_not_eligible_for_renewal'))
end
end
return false if errors.any? return false if errors.any?
p = self.class.convert_period_to_time(period, unit) p = self.class.convert_period_to_time(period, unit)

View file

@ -3,9 +3,11 @@ class Pricelist < ActiveRecord::Base
monetize :price_cents monetize :price_cents
validates :price_cents, :price_currency, :valid_from, :category, presence: true validates :price_cents, :price_currency, :price,
:valid_from, :category, :operation_category, :duration, presence: true
CATEGORIES = %w(ee com.ee fie.ee pri.ee med.ee) CATEGORIES = %w(ee pri.ee fie.ee med.ee com.ee)
OPERATION_CATEGORIES = %w(new renew)
DURATIONS = %w(1year 2years 3years) DURATIONS = %w(1year 2years 3years)
after_initialize :init_values after_initialize :init_values
@ -13,4 +15,8 @@ class Pricelist < ActiveRecord::Base
return unless new_record? return unless new_record?
self.valid_from = Time.zone.now.beginning_of_year self.valid_from = Time.zone.now.beginning_of_year
end end
def name
"#{operation_category} #{category}"
end
end end

View file

@ -1,11 +1,4 @@
class DomainNameValidator < ActiveModel::EachValidator class DomainNameValidator < ActiveModel::EachValidator
# TODO
# validates lenght of 2-63
# validates/honours Estonian additional letters zäõüö
# honours punicode and all interfces honors utf8
# validates lower level domains (.pri.ee, edu.ee etc)
# lower level domains are fixed for .ee and can add statically into settings
def validate_each(record, attribute, value) def validate_each(record, attribute, value)
if !self.class.validate_format(value) if !self.class.validate_format(value)
record.errors[attribute] << (options[:message] || record.errors.generate_message(attribute, :invalid)) record.errors[attribute] << (options[:message] || record.errors.generate_message(attribute, :invalid))

View file

@ -3,12 +3,12 @@
.row .row
.col-md-6 .col-md-6
.form-group
= f.label :operation_category
= f.select(:operation_category, Pricelist::OPERATION_CATEGORIES, {}, { class: 'form-control' })
.form-group .form-group
= f.label :category, t(:category) = f.label :category, t(:category)
= f.select(:category, Pricelist::CATEGORIES, {}, { class: 'form-control' }) = f.select(:category, Pricelist::CATEGORIES, {}, { class: 'form-control' })
.form-group
= f.label :name
= f.text_field(:name, class: 'form-control')
.form-group .form-group
= f.label :duration = f.label :duration
= f.select(:duration, Pricelist::DURATIONS, {}, { class: 'form-control' }) = f.select(:duration, Pricelist::DURATIONS, {}, { class: 'form-control' })

View file

@ -5,20 +5,6 @@
%h2.text-right.text-center-xs %h2.text-right.text-center-xs
= link_to(t(:new), new_admin_pricelist_path, class: 'btn btn-primary') = link_to(t(:new), new_admin_pricelist_path, class: 'btn btn-primary')
%hr
-# .row
-# .col-md-12
-# = form_tag admin_pricelists_path, html: { class: 'form-horizontal' } do
-# .col-md-11
-# .form-group
-# = search_field_tag :name_cont, class: 'form-control'
-# .col-md-1.text-right.text-center-xs
-# .form-group
-# %button.btn.btn-primary
-# &nbsp;
-# %span.glyphicon.glyphicon-search
-# &nbsp;
%hr %hr
.row .row
.col-md-12 .col-md-12
@ -29,9 +15,9 @@
%th{class: 'col-xs-2'} %th{class: 'col-xs-2'}
= sort_link(@q, 'category', t(:category)) = sort_link(@q, 'category', t(:category))
%th{class: 'col-xs-2'} %th{class: 'col-xs-2'}
= sort_link(@q, 'duration', t(:duration)) = sort_link(@q, 'operation_category', t(:operation))
%th{class: 'col-xs-2'} %th{class: 'col-xs-2'}
= sort_link(@q, 'name', t(:name)) = sort_link(@q, 'duration', t(:duration))
%th{class: 'col-xs-2'} %th{class: 'col-xs-2'}
= sort_link(@q, 'price', t(:price)) = sort_link(@q, 'price', t(:price))
%th{class: 'col-xs-2'} %th{class: 'col-xs-2'}
@ -45,8 +31,8 @@
- @pricelists.each do |pricelist| - @pricelists.each do |pricelist|
%tr %tr
%td= pricelist.category %td= pricelist.category
%td= pricelist.operation_category
%td= pricelist.duration %td= pricelist.duration
%td= pricelist.name
%td= pricelist.price %td= pricelist.price
%td= l(pricelist.valid_from, format: :ydate) %td= l(pricelist.valid_from, format: :ydate)
%td= l(pricelist.valid_to, format: :ydate) %td= l(pricelist.valid_to, format: :ydate)

View file

@ -55,7 +55,7 @@ xml.epp_head do
end end
if can? :view_full_info, @contact, @password if can? :view_full_info, @contact, @password
xml.tag!('extension') do xml.tag!('extension') do
xml.tag!('eis:extdata', 'xmlns:eis' => 'urn:ee:eis:xml:epp:eis-1.0') do xml.tag!('eis:extdata', 'xmlns:eis' => 'https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd') do
xml.tag!('eis:ident', @contact.ident, xml.tag!('eis:ident', @contact.ident,
type: @contact.ident_type, cc: @contact.ident_country_code) type: @contact.ident_type, cc: @contact.ident_country_code)
end end

View file

@ -11,7 +11,7 @@ xml.epp_head do
xml.objURI 'urn:ietf:params:xml:ns:keyrelay-1.0' xml.objURI 'urn:ietf:params:xml:ns:keyrelay-1.0'
xml.svcExtension do xml.svcExtension do
xml.extURI 'urn:ietf:params:xml:ns:secDNS-1.1' xml.extURI 'urn:ietf:params:xml:ns:secDNS-1.1'
xml.extURI 'urn:ee:eis:xml:epp:eis-1.0' xml.extURI 'https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd'
end end
end end

View file

@ -20,7 +20,7 @@
</contact:create> </contact:create>
</create> </create>
<extension> <extension>
<eis:extdata xmlns:eis="urn:ee:eis:xml:epp:eis-1.0"> <eis:extdata xmlns:eis="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd">
<eis:ident type="bic" cc="EE">123</eis:ident> <eis:ident type="bic" cc="EE">123</eis:ident>
<eis:legalDocument type="pdf"> <eis:legalDocument type="pdf">
JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp== JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==

View file

@ -11,7 +11,7 @@
</contact:delete> </contact:delete>
</delete> </delete>
<extension> <extension>
<eis:extdata xmlns:eis="urn:ee:eis:xml:epp:eis-1.0"> <eis:extdata xmlns:eis="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd">
<eis:legalDocument type="pdf"> <eis:legalDocument type="pdf">
JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp== JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==
</eis:legalDocument> </eis:legalDocument>

View file

@ -25,7 +25,7 @@
</contact:update> </contact:update>
</update> </update>
<extension> <extension>
<eis:extdata xmlns:eis="urn:ee:eis:xml:epp:eis-1.0"> <eis:extdata xmlns:eis="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd">
<eis:legalDocument type="pdf"> <eis:legalDocument type="pdf">
JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp== JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==
</eis:legalDocument> </eis:legalDocument>

View file

@ -33,7 +33,7 @@
</secDNS:create> </secDNS:create>
</extension> </extension>
<extension> <extension>
<eis:extdata xmlns:eis="urn:ee:eis:xml:epp:eis-1.0"> <eis:extdata xmlns:eis="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd">
<eis:legalDocument type="pdf"> <eis:legalDocument type="pdf">
JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp== JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==
</eis:legalDocument> </eis:legalDocument>

View file

@ -8,7 +8,7 @@
</domain:delete> </domain:delete>
</delete> </delete>
<extension> <extension>
<eis:extdata xmlns:eis="urn:ee:eis:xml:epp:eis-1.0"> <eis:extdata xmlns:eis="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd">
<eis:legalDocument type="pdf"> <eis:legalDocument type="pdf">
JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp== JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==
</eis:legalDocument> </eis:legalDocument>

View file

@ -11,7 +11,7 @@
</domain:transfer> </domain:transfer>
</transfer> </transfer>
<extension> <extension>
<eis:extdata xmlns:eis="urn:ee:eis:xml:epp:eis-1.0"> <eis:extdata xmlns:eis="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd">
<eis:legalDocument type="pdf"> <eis:legalDocument type="pdf">
JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp== JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==
</eis:legalDocument> </eis:legalDocument>

View file

@ -37,7 +37,7 @@
</secDNS:update> </secDNS:update>
</extension> </extension>
<extension> <extension>
<eis:extdata xmlns:eis="urn:ee:eis:xml:epp:eis-1.0"> <eis:extdata xmlns:eis="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd">
<eis:legalDocument type="pdf"> <eis:legalDocument type="pdf">
JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp== JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==
</eis:legalDocument> </eis:legalDocument>

View file

@ -16,7 +16,7 @@
<ext:relative>P1D</ext:relative> <ext:relative>P1D</ext:relative>
</ext:expiry> </ext:expiry>
</ext:keyrelay> </ext:keyrelay>
<eis:extdata xmlns:eis="urn:ee:eis:xml:epp:eis-1.0"> <eis:extdata xmlns:eis="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd">
<eis:legalDocument type="pdf">JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==</eis:legalDocument> <eis:legalDocument type="pdf">JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==</eis:legalDocument>
</eis:extdata> </eis:extdata>
<ext:clTRID>1422542244</ext:clTRID> <ext:clTRID>1422542244</ext:clTRID>

View file

@ -31,6 +31,7 @@ if con.present? && con.table_exists?('settings')
Setting.save_default(:invoice_number_min, '131050') Setting.save_default(:invoice_number_min, '131050')
Setting.save_default(:invoice_number_max, '149999') Setting.save_default(:invoice_number_max, '149999')
Setting.save_default(:days_to_keep_overdue_invoices_active, 30) Setting.save_default(:days_to_keep_overdue_invoices_active, 30)
Setting.save_default(:days_to_renew_domain_before_expire, 90)
end end
# dev only setting # dev only setting

View file

@ -4,7 +4,7 @@ module I18n
class << self class << self
alias_method :original_localize, :localize alias_method :original_localize, :localize
def localize object, options = {} def localize(object, options = {})
object.present? ? original_localize(object, options) : '' object.present? ? original_localize(object, options) : ''
end end
end end

View file

@ -64,7 +64,7 @@ en:
invalid: 'Domain name is invalid' invalid: 'Domain name is invalid'
reserved: 'Domain name is reserved or restricted' reserved: 'Domain name is reserved or restricted'
taken: 'Domain name already exists' taken: 'Domain name already exists'
name_puny: puny_label:
too_long: 'Domain name is too long (maximum is 63 characters)' too_long: 'Domain name is too long (maximum is 63 characters)'
registrant: registrant:
blank: 'Registrant is missing' blank: 'Registrant is missing'
@ -505,6 +505,7 @@ en:
crt_revoked: 'CRT (revoked)' crt_revoked: 'CRT (revoked)'
contact_org_error: 'Parameter value policy error. Org must be blank' contact_org_error: 'Parameter value policy error. Org must be blank'
contact_fax_error: 'Parameter value policy error. Fax must be blank' contact_fax_error: 'Parameter value policy error. Fax must be blank'
ident_update_error: 'Parameter value policy error. Update of ident data not allowed'
invoices: 'Invoices' invoices: 'Invoices'
no_such_user: 'No such user' no_such_user: 'No such user'
log_in: 'Log in' log_in: 'Log in'
@ -816,3 +817,4 @@ en:
new_pricelist: New Pricelist new_pricelist: New Pricelist
valid: Valid valid: Valid
category: Zone category: Zone
object_is_not_eligible_for_renewal: 'Object is not eligible for renewal'

View file

@ -24,6 +24,10 @@ every :day, at: '12:10pm' do
runner 'Invoice.cancel_overdue_invoices' runner 'Invoice.cancel_overdue_invoices'
end end
every :day, at: '12:15pm' do
runner 'Domain.expire_domains'
end
every 3.hours do every 3.hours do
runner 'Certificate.update_crl' runner 'Certificate.update_crl'
end end

View file

@ -0,0 +1,9 @@
class AddRenewSetting < ActiveRecord::Migration
def self.up
Setting.days_to_renew_domain_before_expire = 90
end
def self.down
raise ActiveRecord::IrreversibleMigration
end
end

View file

@ -0,0 +1,6 @@
class UpdatePricelistChema < ActiveRecord::Migration
def change
add_column :pricelists, :operation_category, :string
rename_column :pricelists, :name, :desc
end
end

View file

@ -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: 20150603212659) do ActiveRecord::Schema.define(version: 20150609103333) 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"
@ -19,7 +19,7 @@ ActiveRecord::Schema.define(version: 20150603212659) do
create_table "account_activities", force: :cascade do |t| create_table "account_activities", force: :cascade do |t|
t.integer "account_id" t.integer "account_id"
t.integer "invoice_id" t.integer "invoice_id"
t.decimal "sum", precision: 10, scale: 2 t.decimal "sum", precision: 8, scale: 2
t.string "currency" t.string "currency"
t.integer "bank_transaction_id" t.integer "bank_transaction_id"
t.datetime "created_at" t.datetime "created_at"
@ -36,7 +36,7 @@ ActiveRecord::Schema.define(version: 20150603212659) do
create_table "accounts", force: :cascade do |t| create_table "accounts", force: :cascade do |t|
t.integer "registrar_id" t.integer "registrar_id"
t.string "account_type" t.string "account_type"
t.decimal "balance", precision: 10, scale: 2, default: 0.0, null: false t.decimal "balance", precision: 8, scale: 2, default: 0.0, null: false
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
t.string "currency" t.string "currency"
@ -98,7 +98,7 @@ ActiveRecord::Schema.define(version: 20150603212659) do
t.string "buyer_name" t.string "buyer_name"
t.string "document_no" t.string "document_no"
t.string "description" t.string "description"
t.decimal "sum", precision: 10, scale: 2 t.decimal "sum", precision: 8, scale: 2
t.string "reference_no" t.string "reference_no"
t.datetime "paid_at" t.datetime "paid_at"
t.datetime "created_at" t.datetime "created_at"
@ -114,7 +114,7 @@ ActiveRecord::Schema.define(version: 20150603212659) do
t.string "vk_rec_id" t.string "vk_rec_id"
t.string "vk_stamp" t.string "vk_stamp"
t.string "vk_t_no" t.string "vk_t_no"
t.decimal "vk_amount", precision: 10, scale: 2 t.decimal "vk_amount", precision: 8, scale: 2
t.string "vk_curr" t.string "vk_curr"
t.string "vk_rec_acc" t.string "vk_rec_acc"
t.string "vk_rec_name" t.string "vk_rec_name"
@ -328,10 +328,10 @@ ActiveRecord::Schema.define(version: 20150603212659) do
create_table "invoice_items", force: :cascade do |t| create_table "invoice_items", force: :cascade do |t|
t.integer "invoice_id" t.integer "invoice_id"
t.string "description", null: false t.string "description", null: false
t.string "unit" t.string "unit"
t.integer "amount" t.integer "amount"
t.decimal "price", precision: 10, scale: 2 t.decimal "price", precision: 8, scale: 2
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
t.string "creator_str" t.string "creator_str"
@ -341,20 +341,20 @@ ActiveRecord::Schema.define(version: 20150603212659) do
add_index "invoice_items", ["invoice_id"], name: "index_invoice_items_on_invoice_id", using: :btree add_index "invoice_items", ["invoice_id"], name: "index_invoice_items_on_invoice_id", using: :btree
create_table "invoices", force: :cascade do |t| create_table "invoices", force: :cascade do |t|
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.string "invoice_type", null: false t.string "invoice_type", null: false
t.datetime "due_date", null: false t.datetime "due_date", null: false
t.string "payment_term" t.string "payment_term"
t.string "currency", null: false t.string "currency", null: false
t.string "description" t.string "description"
t.string "reference_no" t.string "reference_no"
t.decimal "vat_prc", precision: 10, scale: 2, null: false t.decimal "vat_prc", precision: 8, scale: 2, null: false
t.datetime "paid_at" t.datetime "paid_at"
t.integer "seller_id" t.integer "seller_id"
t.string "seller_name", null: false t.string "seller_name", null: false
t.string "seller_reg_no" t.string "seller_reg_no"
t.string "seller_iban", null: false t.string "seller_iban", null: false
t.string "seller_bank" t.string "seller_bank"
t.string "seller_swift" t.string "seller_swift"
t.string "seller_vat_no" t.string "seller_vat_no"
@ -368,7 +368,7 @@ ActiveRecord::Schema.define(version: 20150603212659) do
t.string "seller_email" t.string "seller_email"
t.string "seller_contact_name" t.string "seller_contact_name"
t.integer "buyer_id" t.integer "buyer_id"
t.string "buyer_name", null: false t.string "buyer_name", null: false
t.string "buyer_reg_no" t.string "buyer_reg_no"
t.string "buyer_country_code" t.string "buyer_country_code"
t.string "buyer_state" t.string "buyer_state"
@ -382,7 +382,7 @@ ActiveRecord::Schema.define(version: 20150603212659) do
t.string "updator_str" t.string "updator_str"
t.integer "number" t.integer "number"
t.datetime "cancelled_at" t.datetime "cancelled_at"
t.decimal "sum_cache", precision: 10, scale: 2 t.decimal "sum_cache", precision: 8, scale: 2
end end
add_index "invoices", ["buyer_id"], name: "index_invoices_on_buyer_id", using: :btree add_index "invoices", ["buyer_id"], name: "index_invoices_on_buyer_id", using: :btree
@ -886,17 +886,18 @@ ActiveRecord::Schema.define(version: 20150603212659) do
add_index "people", ["reset_password_token"], name: "index_people_on_reset_password_token", unique: true, using: :btree add_index "people", ["reset_password_token"], name: "index_people_on_reset_password_token", unique: true, using: :btree
create_table "pricelists", force: :cascade do |t| create_table "pricelists", force: :cascade do |t|
t.string "name" t.string "desc"
t.string "category" t.string "category"
t.decimal "price_cents", precision: 8, scale: 2, default: 0.0, null: false t.decimal "price_cents", precision: 8, scale: 2, default: 0.0, null: false
t.string "price_currency", default: "EUR", null: false t.string "price_currency", default: "EUR", null: false
t.datetime "valid_from" t.datetime "valid_from"
t.datetime "valid_to" t.datetime "valid_to"
t.string "creator_str" t.string "creator_str"
t.string "updator_str" t.string "updator_str"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.string "duration" t.string "duration"
t.string "operation_category"
end end
create_table "registrant_verifications", force: :cascade do |t| create_table "registrant_verifications", force: :cascade do |t|
@ -982,7 +983,7 @@ ActiveRecord::Schema.define(version: 20150603212659) do
t.text "crt" t.text "crt"
t.string "type" t.string "type"
t.string "registrant_ident" t.string "registrant_ident"
t.string "encrypted_password", default: "" t.string "encrypted_password", default: "", null: false
t.datetime "remember_created_at" t.datetime "remember_created_at"
t.integer "failed_attempts", default: 0, null: false t.integer "failed_attempts", default: 0, null: false
t.datetime "locked_at" t.datetime "locked_at"

View file

@ -16,5 +16,15 @@ Our implementation supports following protocols:
[RFC5910 - DNSSEC Mapping](http://tools.ietf.org/html/rfc5910) [RFC5910 - DNSSEC Mapping](http://tools.ietf.org/html/rfc5910)
[RFC3735 - Guidelines for Extending the EPP](http://tools.ietf.org/html/rfc3735) [RFC3735 - Guidelines for Extending the EPP](http://tools.ietf.org/html/rfc3735)
Related XML Schema Definitions (may differ from policies applied to registry):
[contact-1.0.xsd](schemas/contact-1.0.xsd)
[domain-1.0.xsd](schemas/domain-1.0.xsd)
[eis-1.0.xsd](schemas/eis-1.0.xsd)
[epp-1.0.xsd](schemas/epp-1.0.xsd)
[eppcom-1.0.xsd](schemas/eppcom-1.0.xsd)
[host-1.0.xsd](schemas/host-1.0.xsd)
[secDNS-1.1.xsd](schemas/secDNS-1.1.xsd)
More info about The Extensible Provisioning Protocol (EPP):<br> More info about The Extensible Provisioning Protocol (EPP):<br>
http://en.wikipedia.org/wiki/Extensible_Provisioning_Protocol http://en.wikipedia.org/wiki/Extensible_Provisioning_Protocol

File diff suppressed because it is too large Load diff

View file

@ -26,7 +26,7 @@ Contact Mapping protocol short version:
<contact:voice> 1 Phone number in format \+ddd.d+ <contact:voice> 1 Phone number in format \+ddd.d+
<contact:email> 1 E-mail <contact:email> 1 E-mail
<extension> 1 <extension> 1
<eis:extdata> 1 Attribute: xmlns:eis="urn:ee:eis:xml:epp:eis-1.0" <eis:extdata> 1 Attribute: xmlns:eis="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd"
<eis:ident> 1 Contact identificator <eis:ident> 1 Contact identificator
Attribute: "type" Attribute: "type"
"bic" # Business registry code "bic" # Business registry code
@ -62,7 +62,7 @@ Contact Mapping protocol short version:
<contact:authInfo> 0-1 Required if registrar is not the owner of the contact. <contact:authInfo> 0-1 Required if registrar is not the owner of the contact.
<contact:pw> 1 Contact password. Attribute: roid="String" <contact:pw> 1 Contact password. Attribute: roid="String"
<extension> 0-1 <extension> 0-1
<eis:extdata> 0-1 Attribute: xmlns:eis="urn:ee:eis:xml:epp:eis-1.0" <eis:extdata> 0-1 Attribute: xmlns:eis="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd"
<eis:ident> 0-1 Contact identificator <eis:ident> 0-1 Contact identificator
Attribute: "type" Attribute: "type"
"bic" # Business registry code "bic" # Business registry code
@ -87,7 +87,7 @@ Contact Mapping protocol short version:
<contact:authInfo> 0-1 Required if registrar is not the owner of the contact. <contact:authInfo> 0-1 Required if registrar is not the owner of the contact.
<contact:pw> 1 Contact password. Attribute: roid="String" <contact:pw> 1 Contact password. Attribute: roid="String"
<extension> 0-1 <extension> 0-1
<eis:extdata> 0-1 Attribute: xmlns:eis="urn:ee:eis:xml:epp:eis-1.0" <eis:extdata> 0-1 Attribute: xmlns:eis="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd"
<eis:legalDocument> 0-1 Base64 encoded document. <eis:legalDocument> 0-1 Base64 encoded document.
Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z"
<clTRID> 0-1 Client transaction id <clTRID> 0-1 Client transaction id

View file

@ -35,7 +35,7 @@ Domain name mapping protocol short version:
<secDNS:protocol> 1 Allowed values: 3 <secDNS:protocol> 1 Allowed values: 3
<secDNS:alg> 1 Allowed values: 3, 5, 6, 7, 8, 252, 253, 254, 255 <secDNS:alg> 1 Allowed values: 3, 5, 6, 7, 8, 252, 253, 254, 255
<secDNS:pubKey> 1 Public key <secDNS:pubKey> 1 Public key
<eis:extdata> 1 Attribute: xmlns:eis="urn:ee:eis:xml:epp:eis-1.0" <eis:extdata> 1 Attribute: xmlns:eis="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd"
<eis:legalDocument> 1 Base64 encoded document. <eis:legalDocument> 1 Base64 encoded document.
Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z"
<clTRID> 0-1 Client transaction id <clTRID> 0-1 Client transaction id
@ -82,7 +82,7 @@ Domain name mapping protocol short version:
<secDNS:rem> 0-1 <secDNS:rem> 0-1
<secDNS:keyData> 1-n <secDNS:keyData> 1-n
<secDNS:pubKey> 1 Public key <secDNS:pubKey> 1 Public key
<eis:extdata> 0-1 Attribute: xmlns:eis="urn:ee:eis:xml:epp:eis-1.0" <eis:extdata> 0-1 Attribute: xmlns:eis="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd"
<eis:legalDocument> 0-1 Base64 encoded document. Required if registrant is changing. <eis:legalDocument> 0-1 Base64 encoded document. Required if registrant is changing.
Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z"
<clTRID> 0-1 Client transaction id <clTRID> 0-1 Client transaction id
@ -98,7 +98,7 @@ Domain name mapping protocol short version:
Optional attribute: verified="yes/no" Optional attribute: verified="yes/no"
<domain:name> 1 Domain name. Can contain unicode characters. <domain:name> 1 Domain name. Can contain unicode characters.
<extension> 1 <extension> 1
<eis:extdata> 1 Attribute: xmlns:eis="urn:ee:eis:xml:epp:eis-1.0" <eis:extdata> 1 Attribute: xmlns:eis="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd"
<eis:legalDocument> 1 Base64 encoded document. <eis:legalDocument> 1 Base64 encoded document.
Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z"
<clTRID> 0-1 Client transaction id <clTRID> 0-1 Client transaction id
@ -130,7 +130,7 @@ Domain name mapping protocol short version:
<domain:period> 1 Registration period for domain. <domain:period> 1 Registration period for domain.
Must add up to 1 / 2 / 3 years. Attribute: unit="y/m/d" Must add up to 1 / 2 / 3 years. Attribute: unit="y/m/d"
<extension> 0-1 <extension> 0-1
<eis:extdata> 0-1 Attribute: xmlns:eis="urn:ee:eis:xml:epp:eis-1.0" <eis:extdata> 0-1 Attribute: xmlns:eis="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd"
<eis:legalDocument> 0-1 Base64 encoded document. <eis:legalDocument> 0-1 Base64 encoded document.
Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z"
<clTRID> 0-1 Client transaction id <clTRID> 0-1 Client transaction id
@ -147,7 +147,7 @@ Domain name mapping protocol short version:
<domain:authInfo> 1 <domain:authInfo> 1
<domain:pw> 1 Domain password. Attribute: roid="String" <domain:pw> 1 Domain password. Attribute: roid="String"
<extension> 0-1 <extension> 0-1
<eis:extdata> 0-1 Attribute: xmlns:eis="urn:ee:eis:xml:epp:eis-1.0" <eis:extdata> 0-1 Attribute: xmlns:eis="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd"
<eis:legalDocument> 0-1 Base64 encoded document. <eis:legalDocument> 0-1 Base64 encoded document.
Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z"
<clTRID> 0-1 Client transaction id <clTRID> 0-1 Client transaction id

View file

@ -12,7 +12,6 @@
--> -->
<import namespace="urn:ietf:params:xml:ns:eppcom-1.0" schemaLocation="doc/schemas/eppcom-1.0.xsd"/> <import namespace="urn:ietf:params:xml:ns:eppcom-1.0" schemaLocation="doc/schemas/eppcom-1.0.xsd"/>
<import namespace="urn:ietf:params:xml:ns:epp-1.0" schemaLocation="doc/schemas/epp-1.0.xsd"/> <import namespace="urn:ietf:params:xml:ns:epp-1.0" schemaLocation="doc/schemas/epp-1.0.xsd"/>
<import namespace="urn:ietf:params:xml:ns:eis-1.0" schemaLocation="doc/schemas/eis-1.0.xsd"/>
<annotation> <annotation>
<documentation> <documentation>
@ -73,23 +72,6 @@
</restriction> </restriction>
</simpleType> </simpleType>
<complexType name="identType">
<simpleContent>
<extension base="eppcom:clIDType">
<attribute name="type" type="contact:identAttrType"/>
</extension>
</simpleContent>
</complexType>
<simpleType name="identAttrType">
<restriction base="token">
<enumeration value="ico"/>
<enumeration value="op"/>
<enumeration value="passport"/>
<enumeration value="birthday"/>
</restriction>
</simpleType>
<!-- <!--
Child elements of the <create> command. Child elements of the <create> command.
--> -->
@ -103,8 +85,6 @@
<element name="fax" type="contact:e164Type" <element name="fax" type="contact:e164Type"
minOccurs="0"/> minOccurs="0"/>
<element name="email" type="eppcom:minTokenType"/> <element name="email" type="eppcom:minTokenType"/>
<element name="ident" type="contact:identType"
minOccurs="0"/>
<element name="authInfo" type="contact:authInfoType" minOccurs="0"/> <element name="authInfo" type="contact:authInfoType" minOccurs="0"/>
</sequence> </sequence>
@ -220,8 +200,6 @@
minOccurs="0"/> minOccurs="0"/>
<element name="email" type="eppcom:minTokenType" <element name="email" type="eppcom:minTokenType"
minOccurs="0"/> minOccurs="0"/>
<element name="ident" type="contact:identType"
minOccurs="0"/>
<element name="authInfo" type="contact:authInfoType" <element name="authInfo" type="contact:authInfoType"
minOccurs="0"/> minOccurs="0"/>
</sequence> </sequence>

View file

@ -0,0 +1,366 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="urn:ietf:params:xml:ns:contact-1.0"
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0"
xmlns:epp="urn:ietf:params:xml:ns:epp-1.0"
xmlns:eppcom="urn:ietf:params:xml:ns:eppcom-1.0"
xmlns="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<!--
Import common element types.
-->
<import namespace="urn:ietf:params:xml:ns:eppcom-1.0" schemaLocation="doc/schemas/eppcom-1.0.xsd"/>
<import namespace="urn:ietf:params:xml:ns:epp-1.0" schemaLocation="doc/schemas/epp-1.0.xsd"/>
<import namespace="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd" schemaLocation="doc/schemas/eis-1.0.xsd"/>
<annotation>
<documentation>
Extensible Provisioning Protocol v1.0
contact provisioning schema.
</documentation>
</annotation>
<!--
Child elements found in EPP commands.
-->
<element name="check" type="contact:mIDType"/>
<element name="create" type="contact:createType"/>
<element name="delete" type="contact:authIDType"/>
<element name="info" type="contact:authIDType"/>
<element name="transfer" type="contact:authIDType"/>
<element name="update" type="contact:updateType"/>
<!--
Utility types.
-->
<simpleType name="ccType">
<restriction base="token">
<length value="2"/>
</restriction>
</simpleType>
<complexType name="e164Type">
<simpleContent>
<extension base="contact:e164StringType">
<attribute name="x" type="token"/>
</extension>
</simpleContent>
</complexType>
<simpleType name="e164StringType">
<restriction base="token">
<!--<pattern value="(\+[0-9]{1,3}\.[0-9]{1,14})?"/> -->
<maxLength value="17"/>
</restriction>
</simpleType>
<simpleType name="pcType">
<restriction base="token">
<maxLength value="16"/>
</restriction>
</simpleType>
<simpleType name="postalLineType">
<restriction base="normalizedString">
<minLength value="1"/>
<maxLength value="255"/>
</restriction>
</simpleType>
<simpleType name="optPostalLineType">
<restriction base="normalizedString">
<maxLength value="255"/>
</restriction>
</simpleType>
<!--
Child elements of the <create> command.
-->
<complexType name="createType">
<sequence>
<element name="id" type="eppcom:clIDType" minOccurs="0"/>
<element name="postalInfo" type="contact:postalInfoType"
maxOccurs="2"/>
<element name="voice" type="contact:e164Type"
minOccurs="0"/>
<element name="fax" type="contact:e164Type"
minOccurs="0"/>
<element name="email" type="eppcom:minTokenType"/>
<element name="authInfo" type="contact:authInfoType" minOccurs="0"/>
</sequence>
</complexType>
<complexType name="postalInfoType">
<sequence>
<element name="name" type="contact:postalLineType"/>
<element name="org" type="contact:optPostalLineType"
minOccurs="0"/>
<element name="addr" type="contact:addrType"/>
</sequence>
<attribute name="type" type="contact:postalInfoEnumType"/>
</complexType>
<simpleType name="postalInfoEnumType">
<restriction base="token">
<enumeration value="loc"/>
<enumeration value="int"/>
</restriction>
</simpleType>
<complexType name="addrType">
<sequence>
<element name="street" type="contact:optPostalLineType"
minOccurs="0" maxOccurs="3"/>
<element name="city" type="contact:postalLineType"/>
<element name="sp" type="contact:optPostalLineType"
minOccurs="0"/>
<element name="pc" type="contact:pcType"
minOccurs="0"/>
<element name="cc" type="contact:ccType"/>
</sequence>
</complexType>
<complexType name="authInfoType">
<choice>
<element name="pw" type="eppcom:pwAuthInfoType"/>
<element name="ext" type="eppcom:extAuthInfoType"/>
</choice>
</complexType>
<complexType name="intLocType">
<attribute name="type" type="contact:postalInfoEnumType"
use="required"/>
</complexType>
<!--
Child element of commands that require only an identifier.
-->
<complexType name="sIDType">
<sequence>
<element name="id" type="eppcom:clIDType"/>
</sequence>
</complexType>
<!--
Child element of commands that accept multiple identifiers.
-->
<complexType name="mIDType">
<sequence>
<element name="id" type="eppcom:clIDType"
maxOccurs="unbounded"/>
</sequence>
</complexType>
<!--
Child elements of the <info> and <transfer> commands.
-->
<complexType name="authIDType">
<sequence>
<element name="id" type="eppcom:clIDType"/>
<element name="authInfo" type="contact:authInfoType"
minOccurs="0"/>
</sequence>
</complexType>
<!--
Child elements of the <update> command.
-->
<complexType name="updateType">
<sequence>
<element name="id" type="eppcom:clIDType"/>
<element name="add" type="contact:addRemType"
minOccurs="0"/>
<element name="rem" type="contact:addRemType"
minOccurs="0"/>
<element name="chg" type="contact:chgType"
minOccurs="0"/>
</sequence>
</complexType>
<!--
Data elements that can be added or removed.
-->
<complexType name="addRemType">
<sequence>
<element name="status" type="contact:statusType"
maxOccurs="7"/>
</sequence>
</complexType>
<!--
Data elements that can be changed.
-->
<complexType name="chgType">
<sequence>
<element name="postalInfo" type="contact:chgPostalInfoType"
minOccurs="0" maxOccurs="2"/>
<element name="voice" type="contact:e164Type"
minOccurs="0"/>
<element name="fax" type="contact:e164Type"
minOccurs="0"/>
<element name="email" type="eppcom:minTokenType"
minOccurs="0"/>
<element name="authInfo" type="contact:authInfoType"
minOccurs="0"/>
</sequence>
</complexType>
<complexType name="chgPostalInfoType">
<sequence>
<element name="name" type="contact:postalLineType"
minOccurs="0"/>
<element name="org" type="contact:optPostalLineType"
minOccurs="0"/>
<element name="addr" type="contact:addrType"
minOccurs="0"/>
</sequence>
<attribute name="type" type="contact:postalInfoEnumType"/>
</complexType>
<!--
Child response elements.
-->
<element name="chkData" type="contact:chkDataType"/>
<element name="creData" type="contact:creDataType"/>
<element name="infData" type="contact:infDataType"/>
<element name="panData" type="contact:panDataType"/>
<element name="trnData" type="contact:trnDataType"/>
<!--
<check> response elements.
-->
<complexType name="chkDataType">
<sequence>
<element name="cd" type="contact:checkType"
maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="checkType">
<sequence>
<element name="id" type="contact:checkIDType"/>
<element name="reason" type="eppcom:reasonType"
minOccurs="0"/>
</sequence>
</complexType>
<complexType name="checkIDType">
<simpleContent>
<extension base="eppcom:clIDType">
<attribute name="avail" type="boolean"
use="required"/>
</extension>
</simpleContent>
</complexType>
<!--
<create> response elements.
-->
<complexType name="creDataType">
<sequence>
<element name="id" type="eppcom:clIDType"/>
<element name="crDate" type="dateTime"/>
</sequence>
</complexType>
<!--
<info> response elements.
-->
<complexType name="infDataType">
<sequence>
<element name="id" type="eppcom:clIDType"/>
<element name="roid" type="eppcom:roidType"/>
<element name="status" type="contact:statusType"
maxOccurs="7"/>
<element name="postalInfo" type="contact:postalInfoType"
maxOccurs="2"/>
<element name="voice" type="contact:e164Type"
minOccurs="0"/>
<element name="fax" type="contact:e164Type"
minOccurs="0"/>
<element name="email" type="eppcom:minTokenType"/>
<element name="clID" type="eppcom:clIDType"/>
<element name="crID" type="eppcom:clIDType"/>
<element name="crDate" type="dateTime"/>
<element name="upID" type="eppcom:clIDType"
minOccurs="0"/>
<element name="upDate" type="dateTime"
minOccurs="0"/>
<element name="trDate" type="dateTime"
minOccurs="0"/>
<element name="authInfo" type="contact:authInfoType"
minOccurs="0"/>
</sequence>
</complexType>
<!--
Status is a combination of attributes and an optional human-readable
message that may be expressed in languages other than English.
-->
<complexType name="statusType">
<simpleContent>
<extension base="normalizedString">
<attribute name="s" type="contact:statusValueType"
use="required"/>
<attribute name="lang" type="language"
default="en"/>
</extension>
</simpleContent>
</complexType>
<simpleType name="statusValueType">
<restriction base="token">
<enumeration value="clientDeleteProhibited"/>
<enumeration value="clientTransferProhibited"/>
<enumeration value="clientUpdateProhibited"/>
<enumeration value="linked"/>
<enumeration value="ok"/>
<enumeration value="pendingCreate"/>
<enumeration value="pendingDelete"/>
<enumeration value="pendingTransfer"/>
<enumeration value="pendingUpdate"/>
<enumeration value="serverDeleteProhibited"/>
<enumeration value="serverTransferProhibited"/>
<enumeration value="serverUpdateProhibited"/>
</restriction>
</simpleType>
<!--
Pending action notification response elements.
-->
<complexType name="panDataType">
<sequence>
<element name="id" type="contact:paCLIDType"/>
<element name="paTRID" type="epp:trIDType"/>
<element name="paDate" type="dateTime"/>
</sequence>
</complexType>
<complexType name="paCLIDType">
<simpleContent>
<extension base="eppcom:clIDType">
<attribute name="paResult" type="boolean"
use="required"/>
</extension>
</simpleContent>
</complexType>
<!--
<transfer> response elements.
-->
<complexType name="trnDataType">
<sequence>
<element name="id" type="eppcom:clIDType"/>
<element name="trStatus" type="eppcom:trStatusType"/>
<element name="reID" type="eppcom:clIDType"/>
<element name="reDate" type="dateTime"/>
<element name="acID" type="eppcom:clIDType"/>
<element name="acDate" type="dateTime"/>
</sequence>
</complexType>
<!--
End of schema.
-->
</schema>

View file

@ -15,7 +15,6 @@
<import namespace="urn:ietf:params:xml:ns:epp-1.0" schemaLocation="doc/schemas/epp-1.0.xsd"/> <import namespace="urn:ietf:params:xml:ns:epp-1.0" schemaLocation="doc/schemas/epp-1.0.xsd"/>
<import namespace="urn:ietf:params:xml:ns:host-1.0" schemaLocation="doc/schemas/host-1.0.xsd"/> <import namespace="urn:ietf:params:xml:ns:host-1.0" schemaLocation="doc/schemas/host-1.0.xsd"/>
<import namespace="urn:ietf:params:xml:ns:secDNS-1.1" schemaLocation="doc/schemas/secDNS-1.1.xsd"/> <import namespace="urn:ietf:params:xml:ns:secDNS-1.1" schemaLocation="doc/schemas/secDNS-1.1.xsd"/>
<import namespace="urn:ietf:params:xml:ns:eis-1.0" schemaLocation="doc/schemas/eis-1.0.xsd"/>
<annotation> <annotation>
<documentation> <documentation>

View file

@ -0,0 +1,451 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="urn:ietf:params:xml:ns:domain-1.0"
xmlns:domain="urn:ietf:params:xml:ns:domain-1.0"
xmlns:host="urn:ietf:params:xml:ns:host-1.0"
xmlns:epp="urn:ietf:params:xml:ns:epp-1.0"
xmlns:eppcom="urn:ietf:params:xml:ns:eppcom-1.0"
xmlns="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<!--
Import common element types.
-->
<import namespace="urn:ietf:params:xml:ns:eppcom-1.0" schemaLocation="doc/schemas/eppcom-1.0.xsd"/>
<import namespace="urn:ietf:params:xml:ns:epp-1.0" schemaLocation="doc/schemas/epp-1.0.xsd"/>
<import namespace="urn:ietf:params:xml:ns:host-1.0" schemaLocation="doc/schemas/host-1.0.xsd"/>
<import namespace="urn:ietf:params:xml:ns:secDNS-1.1" schemaLocation="doc/schemas/secDNS-1.1.xsd"/>
<import namespace="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd" schemaLocation="doc/schemas/eis-1.0.xsd"/>
<annotation>
<documentation>
Extensible Provisioning Protocol v1.0
domain provisioning schema.
</documentation>
</annotation>
<!--
Child elements found in EPP commands.
-->
<element name="check" type="domain:mNameType"/>
<element name="create" type="domain:createType"/>
<element name="delete" type="domain:sNameType"/>
<element name="info" type="domain:infoType"/>
<element name="renew" type="domain:renewType"/>
<element name="transfer" type="domain:transferType"/>
<element name="update" type="domain:updateType"/>
<!--
Child elements of the <create> command.
-->
<complexType name="createType">
<sequence>
<element name="name" type="eppcom:labelType"/>
<element name="period" type="domain:periodType"
minOccurs="0"/>
<element name="ns" type="domain:nsType"
minOccurs="0"/>
<element name="registrant" type="eppcom:clIDType"
minOccurs="0"/>
<element name="contact" type="domain:contactType"
minOccurs="0" maxOccurs="unbounded"/>
<element name="authInfo" type="domain:authInfoType" minOccurs="0"/>
</sequence>
</complexType>
<complexType name="periodType">
<simpleContent>
<extension base="domain:pLimitType">
<attribute name="unit" type="domain:pUnitType"
use="required"/>
</extension>
</simpleContent>
</complexType>
<simpleType name="pLimitType">
<restriction base="unsignedShort">
<minInclusive value="1"/>
<maxInclusive value="1095"/>
</restriction>
</simpleType>
<simpleType name="pUnitType">
<restriction base="token">
<enumeration value="y"/>
<enumeration value="m"/>
<enumeration value="d"/>
</restriction>
</simpleType>
<complexType name="nsType">
<choice>
<element name="hostObj" type="eppcom:labelType"
maxOccurs="unbounded"/>
<element name="hostAttr" type="domain:hostAttrType"
maxOccurs="unbounded"/>
</choice>
</complexType>
<!--
Name servers are either host objects or attributes.
-->
<complexType name="hostAttrType">
<sequence>
<element name="hostName" type="eppcom:labelType"/>
<element name="hostAddr" type="host:addrType"
minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
<!--
If attributes, addresses are optional and follow the
structure defined in the host mapping.
-->
<complexType name="contactType">
<simpleContent>
<extension base="eppcom:clIDType">
<attribute name="type" type="domain:contactAttrType"/>
</extension>
</simpleContent>
</complexType>
<simpleType name="contactAttrType">
<restriction base="token">
<enumeration value="admin"/>
<enumeration value="billing"/>
<enumeration value="tech"/>
</restriction>
</simpleType>
<complexType name="authInfoType">
<choice>
<element name="pw" type="eppcom:pwAuthInfoType"/>
<element name="ext" type="eppcom:extAuthInfoType"/>
</choice>
</complexType>
<!--
Child element of commands that require a single name.
-->
<complexType name="sNameType">
<sequence>
<element name="name" type="eppcom:labelType"/>
</sequence>
</complexType>
<!--
Child element of commands that accept multiple names.
-->
<complexType name="mNameType">
<sequence>
<element name="name" type="eppcom:labelType"
maxOccurs="unbounded"/>
</sequence>
</complexType>
<!--
Child elements of the <info> command.
-->
<complexType name="infoType">
<sequence>
<element name="name" type="domain:infoNameType"/>
<element name="authInfo" type="domain:authInfoType"
minOccurs="0"/>
</sequence>
</complexType>
<complexType name="infoNameType">
<simpleContent>
<extension base = "eppcom:labelType">
<attribute name="hosts" type="domain:hostsType"
default="all"/>
</extension>
</simpleContent>
</complexType>
<simpleType name="hostsType">
<restriction base="token">
<enumeration value="all"/>
<enumeration value="del"/>
<enumeration value="none"/>
<enumeration value="sub"/>
</restriction>
</simpleType>
<!--
Child elements of the <renew> command.
-->
<complexType name="renewType">
<sequence>
<element name="name" type="eppcom:labelType"/>
<element name="curExpDate" type="date"/>
<element name="period" type="domain:periodType"
minOccurs="0"/>
</sequence>
</complexType>
<!--
Child elements of the <transfer> command.
-->
<complexType name="transferType">
<sequence>
<element name="name" type="eppcom:labelType"/>
<element name="period" type="domain:periodType"
minOccurs="0"/>
<element name="authInfo" type="domain:authInfoType"
minOccurs="0"/>
</sequence>
</complexType>
<!--
Child elements of the <update> command.
-->
<complexType name="updateType">
<sequence>
<element name="name" type="eppcom:labelType"/>
<element name="add" type="domain:addRemType"
minOccurs="0"/>
<element name="rem" type="domain:addRemType"
minOccurs="0"/>
<element name="chg" type="domain:chgType"
minOccurs="0"/>
</sequence>
</complexType>
<!--
Data elements that can be added or removed.
-->
<complexType name="addRemType">
<sequence>
<element name="ns" type="domain:nsType"
minOccurs="0"/>
<element name="contact" type="domain:contactType"
minOccurs="0" maxOccurs="unbounded"/>
<element name="status" type="domain:statusType"
minOccurs="0" maxOccurs="11"/>
</sequence>
</complexType>
<!--
Data elements that can be changed.
-->
<complexType name="chgType">
<sequence>
<element name="registrant" type="domain:clIDChgType"
minOccurs="0"/>
<element name="authInfo" type="domain:authInfoChgType"
minOccurs="0"/>
</sequence>
</complexType>
<!--
Allow the registrant value to be nullified by changing the
minLength restriction to "0".
-->
<complexType name="clIDChgType">
<simpleContent>
<extension base="domain:clIDChgSimpleType">
<attribute name="verified" type="domain:verifiedType"/>
</extension>
</simpleContent>
</complexType>
<simpleType name="clIDChgSimpleType">
<restriction base="token">
<minLength value="0"/>
</restriction>
</simpleType>
<simpleType name="verifiedType">
<restriction base="token">
<enumeration value="yes"/>
<enumeration value="no"/>
</restriction>
</simpleType>
<!--
Allow the authInfo value to be nullified by including an
empty element within the choice.
-->
<complexType name="authInfoChgType">
<choice>
<element name="pw" type="eppcom:pwAuthInfoType"/>
<element name="ext" type="eppcom:extAuthInfoType"/>
<element name="null"/>
</choice>
</complexType>
<!--
Child response elements.
-->
<element name="chkData" type="domain:chkDataType"/>
<element name="creData" type="domain:creDataType"/>
<element name="infData" type="domain:infDataType"/>
<element name="panData" type="domain:panDataType"/>
<element name="renData" type="domain:renDataType"/>
<element name="trnData" type="domain:trnDataType"/>
<!--
<check> response elements.
-->
<complexType name="chkDataType">
<sequence>
<element name="cd" type="domain:checkType"
maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="checkType">
<sequence>
<element name="name" type="domain:checkNameType"/>
<element name="reason" type="eppcom:reasonType"
minOccurs="0"/>
</sequence>
</complexType>
<complexType name="checkNameType">
<simpleContent>
<extension base="eppcom:labelType">
<attribute name="avail" type="boolean"
use="required"/>
</extension>
</simpleContent>
</complexType>
<!--
<create> response elements.
-->
<complexType name="creDataType">
<sequence>
<element name="name" type="eppcom:labelType"/>
<element name="crDate" type="dateTime"/>
<element name="exDate" type="dateTime"
minOccurs="0"/>
</sequence>
</complexType>
<!--
<info> response elements.
-->
<complexType name="infDataType">
<sequence>
<element name="name" type="eppcom:labelType"/>
<element name="roid" type="eppcom:roidType"/>
<element name="status" type="domain:statusType"
minOccurs="0" maxOccurs="11"/>
<element name="registrant" type="eppcom:clIDType"
minOccurs="0"/>
<element name="contact" type="domain:contactType"
minOccurs="0" maxOccurs="unbounded"/>
<element name="ns" type="domain:nsType"
minOccurs="0"/>
<element name="host" type="eppcom:labelType"
minOccurs="0" maxOccurs="unbounded"/>
<element name="clID" type="eppcom:clIDType"/>
<element name="crID" type="eppcom:clIDType"
minOccurs="0"/>
<element name="crDate" type="dateTime"
minOccurs="0"/>
<element name="upID" type="eppcom:clIDType"
minOccurs="0"/>
<element name="upDate" type="dateTime"
minOccurs="0"/>
<element name="exDate" type="dateTime"
minOccurs="0"/>
<element name="trDate" type="dateTime"
minOccurs="0"/>
<element name="authInfo" type="domain:authInfoType"
minOccurs="0"/>
</sequence>
</complexType>
<!--
Status is a combination of attributes and an optional
human-readable message that may be expressed in languages other
than English.
-->
<complexType name="statusType">
<simpleContent>
<extension base="normalizedString">
<attribute name="s" type="domain:statusValueType"
use="required"/>
<attribute name="lang" type="language"
default="en"/>
</extension>
</simpleContent>
</complexType>
<simpleType name="statusValueType">
<restriction base="token">
<enumeration value="clientDeleteProhibited"/>
<enumeration value="clientHold"/>
<enumeration value="clientRenewProhibited"/>
<enumeration value="clientTransferProhibited"/>
<enumeration value="clientUpdateProhibited"/>
<enumeration value="inactive"/>
<enumeration value="ok"/>
<enumeration value="pendingCreate"/>
<enumeration value="pendingDelete"/>
<enumeration value="pendingRenew"/>
<enumeration value="pendingTransfer"/>
<enumeration value="pendingUpdate"/>
<enumeration value="serverDeleteProhibited"/>
<enumeration value="serverHold"/>
<enumeration value="serverRenewProhibited"/>
<enumeration value="serverTransferProhibited"/>
<enumeration value="serverUpdateProhibited"/>
</restriction>
</simpleType>
<!--
Pending action notification response elements.
-->
<complexType name="panDataType">
<sequence>
<element name="name" type="domain:paNameType"/>
<element name="paTRID" type="epp:trIDType"/>
<element name="paDate" type="dateTime"/>
</sequence>
</complexType>
<complexType name="paNameType">
<simpleContent>
<extension base="eppcom:labelType">
<attribute name="paResult" type="boolean"
use="required"/>
</extension>
</simpleContent>
</complexType>
<!--
<renew> response elements.
-->
<complexType name="renDataType">
<sequence>
<element name="name" type="eppcom:labelType"/>
<element name="exDate" type="dateTime"
minOccurs="0"/>
</sequence>
</complexType>
<!--
<transfer> response elements.
-->
<complexType name="trnDataType">
<sequence>
<element name="name" type="eppcom:labelType"/>
<element name="trStatus" type="eppcom:trStatusType"/>
<element name="reID" type="eppcom:clIDType"/>
<element name="reDate" type="dateTime"/>
<element name="acID" type="eppcom:clIDType"/>
<element name="acDate" type="dateTime"/>
<element name="exDate" type="dateTime"
minOccurs="0"/>
</sequence>
</complexType>
<!--
End of schema.
-->
</schema>

View file

@ -1,39 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<schema <schema
targetNamespace="urn:ee:eis:xml:epp:eis-1.0" targetNamespace="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd"
xmlns:eis="urn:ee:eis:xml:epp:eis-1.0" xmlns:eis="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd"
xmlns="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"> elementFormDefault="qualified">
<annotation> <annotation>
<documentation> <documentation>
EIS Extensible Provisioning Protocol v1.0 EIS Extensible Provisioning Protocol v1.0 extension schema.
extension schema.
</documentation> </documentation>
</annotation> </annotation>
<!-- <!--
Child elements found in EPP commands. Child elements found in EPP commands.
--> -->
<element name="extdata" type="eis:legalDocAndIdentType"/> <element name="extdata" type="eis:legalDocAndIdentType"/>
<!-- <!--
Child elements supporting either the Child elements supporting ident and legal documents.
dsData or the keyData interface. -->
-->
<complexType name="legalDocAndIdentType"> <complexType name="legalDocAndIdentType">
<sequence> <sequence>
<element name="legalDocument" type="eis:legalDocType" <element name="ident" type="eis:identType" minOccurs="0" maxOccurs="1"/>
minOccurs="0" maxOccurs="1"/> <element name="legalDocument" type="eis:legalDocType" minOccurs="0" maxOccurs="1"/>
<element name="ident" type="eis:identType"
minOccurs="0" maxOccurs="1"/>
</sequence> </sequence>
</complexType> </complexType>
<!-- <!--
Child elements of extdata Child elements of extdata
--> -->
<!--
Legal document, encoded in base64
-->
<complexType name="legalDocType"> <complexType name="legalDocType">
<simpleContent> <simpleContent>
<extension base="base64Binary"> <extension base="base64Binary">
@ -55,6 +55,9 @@
</restriction> </restriction>
</simpleType> </simpleType>
<!--
Ident with type and country code
-->
<complexType name="identType"> <complexType name="identType">
<simpleContent> <simpleContent>
<extension base="normalizedString"> <extension base="normalizedString">
@ -66,10 +69,9 @@
<simpleType name="identEnumType"> <simpleType name="identEnumType">
<restriction base="token"> <restriction base="token">
<enumeration value="pic"/> <enumeration value="bic"/>
<enumeration value="priv"/> <enumeration value="priv"/>
<enumeration value="birthday"/> <enumeration value="birthday"/>
<enumeration value="passport"/>
</restriction> </restriction>
</simpleType> </simpleType>

View file

@ -13,7 +13,7 @@ namespace :zonefile do
ret text; ret text;
BEGIN BEGIN
-- define filters -- define filters
include_filter = '%' || i_origin; include_filter = '%.' || i_origin;
-- for %.%.% -- for %.%.%
IF i_origin ~ '\\.' THEN IF i_origin ~ '\\.' THEN

View file

@ -2,7 +2,7 @@ require 'rails_helper'
describe 'EPP Contact', epp: true do describe 'EPP Contact', epp: true do
before :all do before :all do
@xsd = Nokogiri::XML::Schema(File.read('doc/schemas/contact-1.0.xsd')) @xsd = Nokogiri::XML::Schema(File.read('doc/schemas/contact-eis-1.0.xsd'))
@registrar1 = Fabricate(:registrar1) @registrar1 = Fabricate(:registrar1)
@registrar2 = Fabricate(:registrar2) @registrar2 = Fabricate(:registrar2)
@epp_xml = EppXml::Contact.new(cl_trid: 'ABC-12345') @epp_xml = EppXml::Contact.new(cl_trid: 'ABC-12345')
@ -15,13 +15,19 @@ describe 'EPP Contact', epp: true do
@contact = Fabricate(:contact, registrar: @registrar1) @contact = Fabricate(:contact, registrar: @registrar1)
@extension = { @extension = {
legalDocument: {
value: 'dGVzdCBmYWlsCg==',
attrs: { type: 'pdf' }
},
ident: { ident: {
value: '37605030299', value: '37605030299',
attrs: { type: 'priv', cc: 'EE' } attrs: { type: 'priv', cc: 'EE' }
},
legalDocument: {
value: 'dGVzdCBmYWlsCg==',
attrs: { type: 'pdf' }
}
}
@update_extension = {
legalDocument: {
value: 'dGVzdCBmYWlsCg==',
attrs: { type: 'pdf' }
} }
} }
end end
@ -106,13 +112,13 @@ describe 'EPP Contact', epp: true do
it 'successfully saves ident type with legal document' do it 'successfully saves ident type with legal document' do
extension = { extension = {
legalDocument: {
value: 'dGVzdCBmYWlsCg==',
attrs: { type: 'pdf' }
},
ident: { ident: {
value: '1990-22-12', value: '1990-22-12',
attrs: { type: 'birthday', cc: 'US' } attrs: { type: 'birthday', cc: 'US' }
},
legalDocument: {
value: 'dGVzdCBmYWlsCg==',
attrs: { type: 'pdf' }
} }
} }
response = create_request({}, extension) response = create_request({}, extension)
@ -272,7 +278,7 @@ describe 'EPP Contact', epp: true do
end end
def update_request(overwrites = {}, extension = {}, options = {}) def update_request(overwrites = {}, extension = {}, options = {})
extension = @extension if extension.blank? extension = @update_extension if extension.blank?
defaults = { defaults = {
id: { value: 'asd123123er' }, id: { value: 'asd123123er' },
@ -394,22 +400,23 @@ describe 'EPP Contact', epp: true do
@contact.reload.code.should == 'FIRST0:SH8013' @contact.reload.code.should == 'FIRST0:SH8013'
end end
it 'should update ident' do it 'should not be able to update ident' do
extension = { extension = {
legalDocument: {
value: 'dGVzdCBmYWlsCg==',
attrs: { type: 'pdf' }
},
ident: { ident: {
value: '1990-22-12', value: '1990-22-12',
attrs: { type: 'birthday', cc: 'US' } attrs: { type: 'birthday', cc: 'US' }
},
legalDocument: {
value: 'dGVzdCBmYWlsCg==',
attrs: { type: 'pdf' }
} }
} }
response = update_request({ id: { value: 'FIRST0:SH8013' } }, extension) response = update_request({ id: { value: 'FIRST0:SH8013' } }, extension)
response[:msg].should == 'Command completed successfully' response[:msg].should ==
response[:result_code].should == '1000' 'Parameter value policy error. Update of ident data not allowed [ident]'
response[:result_code].should == '2306'
Contact.find_by(code: 'FIRST0:SH8013').ident_type.should == 'birthday' Contact.find_by(code: 'FIRST0:SH8013').ident_type.should == 'priv'
end end
it 'should return parameter value policy errror for org update' do it 'should return parameter value policy errror for org update' do

View file

@ -2,7 +2,7 @@ require 'rails_helper'
describe 'EPP Domain', epp: true do describe 'EPP Domain', epp: true do
before(:all) do before(:all) do
@xsd = Nokogiri::XML::Schema(File.read('doc/schemas/domain-1.0.xsd')) @xsd = Nokogiri::XML::Schema(File.read('doc/schemas/domain-eis-1.0.xsd'))
@epp_xml = EppXml.new(cl_trid: 'ABC-12345') @epp_xml = EppXml.new(cl_trid: 'ABC-12345')
@registrar1 = Fabricate(:registrar1, code: 'REGDOMAIN1') @registrar1 = Fabricate(:registrar1, code: 'REGDOMAIN1')
@registrar2 = Fabricate(:registrar2, code: 'REGDOMAIN2') @registrar2 = Fabricate(:registrar2, code: 'REGDOMAIN2')
@ -193,7 +193,7 @@ describe 'EPP Domain', epp: true do
xml = domain_create_xml(name: { value: "#{'ä' * 63}.ee" }) xml = domain_create_xml(name: { value: "#{'ä' * 63}.ee" })
response = epp_plain_request(xml) response = epp_plain_request(xml)
response[:msg].should == 'Domain name is too long (maximum is 63 characters) [name_puny]' response[:msg].should == 'Domain name is too long (maximum is 63 characters) [puny_label]'
response[:result_code].should == '2005' response[:result_code].should == '2005'
response[:clTRID].should == 'ABC-12345' response[:clTRID].should == 'ABC-12345'
end end
@ -326,7 +326,7 @@ describe 'EPP Domain', epp: true do
}) })
response = epp_plain_request(xml) response = epp_plain_request(xml)
response[:results][0][:result_code].should == '2004' response[:results][0][:result_code].should == '2306'
response[:results][0][:msg].should == 'Period must add up to 1, 2 or 3 years [period]' response[:results][0][:msg].should == 'Period must add up to 1, 2 or 3 years [period]'
response[:results][0][:value].should == '367' response[:results][0][:value].should == '367'
end end
@ -1949,7 +1949,10 @@ describe 'EPP Domain', epp: true do
### RENEW ### ### RENEW ###
it 'renews a domain' do it 'renews a domain' do
exp_date = 1.year.since.to_date domain.valid_to = Time.zone.now.to_date + 10.days
domain.save
exp_date = domain.valid_to.to_date
xml = @epp_xml.domain.renew( xml = @epp_xml.domain.renew(
name: { value: domain.name }, name: { value: domain.name },
curExpDate: { value: exp_date.to_s }, curExpDate: { value: exp_date.to_s },
@ -1979,7 +1982,9 @@ describe 'EPP Domain', epp: true do
end end
it 'returns an error when period is invalid' do it 'returns an error when period is invalid' do
exp_date = (1.year.since.to_date) domain.valid_to = Time.zone.now.to_date + 10.days
domain.save
exp_date = domain.valid_to.to_date
xml = @epp_xml.domain.renew( xml = @epp_xml.domain.renew(
name: { value: domain.name }, name: { value: domain.name },
@ -1989,10 +1994,59 @@ describe 'EPP Domain', epp: true do
response = epp_plain_request(xml) response = epp_plain_request(xml)
response[:results][0][:msg].should == 'Period must add up to 1, 2 or 3 years [period]' response[:results][0][:msg].should == 'Period must add up to 1, 2 or 3 years [period]'
response[:results][0][:result_code].should == '2004' response[:results][0][:result_code].should == '2306'
response[:results][0][:value].should == '4' response[:results][0][:value].should == '4'
end end
it 'does not renew a domain unless less than 90 days till expiration' do
domain.valid_to = Time.zone.now.to_date + 91.days
domain.save
exp_date = domain.valid_to.to_date
xml = @epp_xml.domain.renew(
name: { value: domain.name },
curExpDate: { value: exp_date.to_s },
period: { value: '1', attrs: { unit: 'y' } }
)
response = epp_plain_request(xml)
response[:results][0][:msg].should == 'Object is not eligible for renewal'
response[:results][0][:result_code].should == '2105'
domain.valid_to = Time.zone.now.to_date + 90.days
domain.save
exp_date = domain.valid_to.to_date
xml = @epp_xml.domain.renew(
name: { value: domain.name },
curExpDate: { value: exp_date.to_s },
period: { value: '1', attrs: { unit: 'y' } }
)
response = epp_plain_request(xml)
response[:results][0][:msg].should == 'Command completed successfully'
response[:results][0][:result_code].should == '1000'
end
it 'does not renew a domain unless less than 90 days till expiration' do
Setting.days_to_renew_domain_before_expire = 0
domain.valid_to = Time.zone.now.to_date + 5.years
domain.save
exp_date = domain.valid_to.to_date
xml = @epp_xml.domain.renew(
name: { value: domain.name },
curExpDate: { value: exp_date.to_s },
period: { value: '1', attrs: { unit: 'y' } }
)
response = epp_plain_request(xml)
response[:results][0][:msg].should == 'Command completed successfully'
response[:results][0][:result_code].should == '1000'
Setting.days_to_renew_domain_before_expire = 90
end
it 'does not renew foreign domain' do it 'does not renew foreign domain' do
login_as :registrar2 do login_as :registrar2 do
exp_date = 1.year.since.to_date exp_date = 1.year.since.to_date

View file

@ -1,5 +1,8 @@
Fabricator(:pricelist) do Fabricator(:pricelist) do
active_from 1.year.ago valid_from 1.year.ago
active_until 1.year.since valid_to 1.year.since
category '.ee' category '.ee'
duration '1year'
operation_category 'new'
price 10
end end

View file

@ -85,6 +85,17 @@ describe Domain do
@domain.registrant_update_confirmable?('123').should == false @domain.registrant_update_confirmable?('123').should == false
end end
it 'should expire domains' do
Domain.expire_domains
@domain.domain_statuses.where(value: DomainStatus::EXPIRED).count.should == 0
@domain.valid_to = Time.zone.now - 10.days
@domain.save
Domain.expire_domains
@domain.domain_statuses.where(value: DomainStatus::EXPIRED).count.should == 1
end
context 'about registrant update confirm' do context 'about registrant update confirm' do
before :all do before :all do
@domain.registrant_verification_token = 123 @domain.registrant_verification_token = 123
@ -237,7 +248,7 @@ describe Domain do
d.valid? d.valid?
d.errors.full_messages.should match_array([ d.errors.full_messages.should match_array([
"Domain name Domain name is invalid", "Domain name Domain name is invalid",
"Domain name Domain name is too long (maximum is 63 characters)" "Puny label Domain name is too long (maximum is 63 characters)"
]) ])
end end
@ -247,7 +258,15 @@ describe Domain do
d.valid? d.valid?
d.errors.full_messages.should match_array([ d.errors.full_messages.should match_array([
"Domain name Domain name is invalid", "Domain name Domain name is invalid",
"Domain name Domain name is too long (maximum is 63 characters)" "Puny label Domain name is too long (maximum is 63 characters)"
])
end
it 'should be valid when name length is 63 characters' do
d = Fabricate.build(:domain,
name: "õäöüšžõäöüšžõäöüšžõäöüšžõäöüšžõäöüšžõäöüšžab123.pri.ee")
d.valid?
d.errors.full_messages.should match_array([
]) ])
end end
@ -255,7 +274,7 @@ describe Domain do
d = Fabricate.build(:domain, name: "#{'ä' * 63}.ee") d = Fabricate.build(:domain, name: "#{'ä' * 63}.ee")
d.valid? d.valid?
d.errors.full_messages.should == [ d.errors.full_messages.should == [
"Domain name Domain name is too long (maximum is 63 characters)" "Puny label Domain name is too long (maximum is 63 characters)"
] ]
end end
@ -264,7 +283,7 @@ describe Domain do
d.valid? d.valid?
d.errors.full_messages.should match_array([ d.errors.full_messages.should match_array([
"Domain name Domain name is invalid", "Domain name Domain name is invalid",
"Domain name Domain name is too long (maximum is 63 characters)" "Puny label Domain name is too long (maximum is 63 characters)"
]) ])
end end
@ -272,7 +291,7 @@ describe Domain do
d = Fabricate.build(:domain, name: "#{'ä' * 63}.pri.ee") d = Fabricate.build(:domain, name: "#{'ä' * 63}.pri.ee")
d.valid? d.valid?
d.errors.full_messages.should match_array([ d.errors.full_messages.should match_array([
"Domain name Domain name is too long (maximum is 63 characters)" "Puny label Domain name is too long (maximum is 63 characters)"
]) ])
end end

View file

@ -15,9 +15,9 @@ describe Pricelist do
it 'should not be valid' do it 'should not be valid' do
@pricelist.valid? @pricelist.valid?
@pricelist.errors.full_messages.should match_array([ @pricelist.errors.full_messages.should match_array([
"Valid from is missing", "Category is missing",
"Active until is missing", "Duration is missing",
"Category is missing" "Operation category is missing"
]) ])
end end
@ -32,6 +32,11 @@ describe Pricelist do
it 'should not have any versions' do it 'should not have any versions' do
@pricelist.versions.should == [] @pricelist.versions.should == []
end end
it 'should not have name' do
@pricelist.name.should == ' '
end
end end
context 'with valid attributes' do context 'with valid attributes' do
@ -50,10 +55,14 @@ describe Pricelist do
@pricelist.errors.full_messages.should match_array([]) @pricelist.errors.full_messages.should match_array([])
end end
it 'should have name' do
@pricelist.name.should == 'new .ee'
end
it 'should have one version' do it 'should have one version' do
with_versioning do with_versioning do
@pricelist.versions.reload.should == [] @pricelist.versions.reload.should == []
@pricelist.name = 'New name' @pricelist.price = 11
@pricelist.save @pricelist.save
@pricelist.errors.full_messages.should match_array([]) @pricelist.errors.full_messages.should match_array([])
@pricelist.versions.size.should == 1 @pricelist.versions.size.should == 1

View file

@ -24,7 +24,7 @@ describe ZonefileSetting do
master_nameserver: 'ns.tld.ee' master_nameserver: 'ns.tld.ee'
}).first_or_create! }).first_or_create!
d = Fabricate(:domain_with_dnskeys) d = Fabricate(:domain_with_dnskeys, name: 'testpri.ee')
d.nameservers << Nameserver.new({ d.nameservers << Nameserver.new({
hostname: "ns.#{d.name}", hostname: "ns.#{d.name}",
ipv4: '123.123.123.123', ipv4: '123.123.123.123',