Merge remote-tracking branch 'origin/master' into 105846070-merge-with-105842700-arireg-for-registrant-port

# Conflicts:
#	app/models/domain.rb
This commit is contained in:
Vladimir Krylov 2016-02-15 10:11:07 +02:00
commit afd3b06f62
94 changed files with 2001 additions and 720 deletions

View file

@ -12,6 +12,7 @@ gem 'rails', '4.2.4' # when update, all initializers eis_custom files nee
gem 'iso8601', '0.8.6' # for dates and times gem 'iso8601', '0.8.6' # for dates and times
gem 'hashie-forbidden_attributes', '0.1.1' gem 'hashie-forbidden_attributes', '0.1.1'
gem 'SyslogLogger', '2.0', require: 'syslog/logger' gem 'SyslogLogger', '2.0', require: 'syslog/logger'
gem 'rest-client'
# load env # load env
gem 'figaro', '1.1.1' gem 'figaro', '1.1.1'

View file

@ -188,6 +188,8 @@ 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)
domain_name (0.5.25)
unf (>= 0.0.5, < 1.0.0)
epp-xml (1.0.4) epp-xml (1.0.4)
activesupport (~> 4.1) activesupport (~> 4.1)
builder (~> 3.2) builder (~> 3.2)
@ -261,6 +263,8 @@ GEM
nokogiri (~> 1.6.0) nokogiri (~> 1.6.0)
ruby_parser (~> 3.5) ruby_parser (~> 3.5)
html5_validators (1.2.2) html5_validators (1.2.2)
http-cookie (1.0.2)
domain_name (~> 0.5)
httpclient (2.6.0.1) httpclient (2.6.0.1)
httpi (2.4.1) httpi (2.4.1)
rack rack
@ -320,6 +324,7 @@ GEM
multi_json (1.11.2) multi_json (1.11.2)
multi_xml (0.5.5) multi_xml (0.5.5)
nenv (0.2.0) nenv (0.2.0)
netrc (0.11.0)
newrelic_rpm (3.12.0.288) newrelic_rpm (3.12.0.288)
nokogiri (1.6.6.2) nokogiri (1.6.6.2)
mini_portile (~> 0.6.0) mini_portile (~> 0.6.0)
@ -412,6 +417,10 @@ GEM
request_store (1.1.0) request_store (1.1.0)
responders (2.1.0) responders (2.1.0)
railties (>= 4.2.0, < 5) railties (>= 4.2.0, < 5)
rest-client (1.8.0)
http-cookie (>= 1.0.2, < 2.0)
mime-types (>= 1.16, < 3.0)
netrc (~> 0.7)
rspec (3.3.0) rspec (3.3.0)
rspec-core (~> 3.3.0) rspec-core (~> 3.3.0)
rspec-expectations (~> 3.3.0) rspec-expectations (~> 3.3.0)
@ -515,6 +524,9 @@ GEM
uglifier (2.7.1) uglifier (2.7.1)
execjs (>= 0.3.0) execjs (>= 0.3.0)
json (>= 1.8.0) json (>= 1.8.0)
unf (0.1.4)
unf_ext
unf_ext (0.0.7.1)
unicorn (4.9.0) unicorn (4.9.0)
kgio (~> 2.6) kgio (~> 2.6)
rack rack
@ -617,6 +629,7 @@ DEPENDENCIES
rails-settings-cached (= 0.4.1) rails-settings-cached (= 0.4.1)
rake rake
ransack (= 1.5.1) ransack (= 1.5.1)
rest-client
rspec-rails (= 3.3.2) rspec-rails (= 3.3.2)
rubocop (= 0.32.1) rubocop (= 0.32.1)
rubycritic (= 1.4.0) rubycritic (= 1.4.0)

View file

@ -12,11 +12,27 @@ class Admin::AccountActivitiesController < AdminController
logger.warn('Invalid date') logger.warn('Invalid date')
end end
balance_params = params[:q].deep_dup
if balance_params[:created_at_gteq]
balance_params.delete('created_at_gteq')
end
@q = AccountActivity.includes(:invoice, account: :registrar).search(params[:q]) @q = AccountActivity.includes(:invoice, account: :registrar).search(params[:q])
@b = AccountActivity.search(balance_params)
@q.sorts = 'id desc' if @q.sorts.empty? @q.sorts = 'id desc' if @q.sorts.empty?
@account_activities = @q.result.page(params[:page]).per(params[:results_per_page])
sort = @account_activities.orders.map(&:to_sql).join(",")
if params[:page] && params[:page].to_i > 1
@sum = @q.result.reorder(sort).limit(@account_activities.offset_value) + @b.result.where.not(id: @q.result.map(&:id))
else
@sum = @b.result.where.not(id: @q.result.map(&:id))
end
respond_to do |format| respond_to do |format|
format.html { @account_activities = @q.result.page(params[:page]) } format.html
format.csv do format.csv do
send_data @q.result.to_csv, filename: "account_activities_#{Time.zone.now.to_formatted_s(:number)}.csv" send_data @q.result.to_csv, filename: "account_activities_#{Time.zone.now.to_formatted_s(:number)}.csv"
end end

View file

@ -2,22 +2,54 @@ class Admin::BlockedDomainsController < AdminController
load_and_authorize_resource load_and_authorize_resource
def index def index
bd = BlockedDomain.first_or_initialize
@blocked_domains = bd.names.join("\n") params[:q] ||= {}
domains = BlockedDomain.all.order(:name)
@q = domains.search(params[:q])
@domains = @q.result.page(params[:page])
@domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i > 0
end
def new
@domain = BlockedDomain.new
end end
def create def create
names = params[:blocked_domains].split("\r\n").map(&:strip)
bd = BlockedDomain.first_or_create @domain = BlockedDomain.new(blocked_domain_params)
if bd.update(names: names) if @domain.save
flash[:notice] = I18n.t('record_updated') flash[:notice] = I18n.t('domain_added')
redirect_to :back redirect_to admin_blocked_domains_path
else else
@blocked_domains = params[:blocked_domains] flash.now[:alert] = I18n.t('failed_to_add_domain')
flash.now[:alert] = I18n.t('failed_to_update_record') render 'new'
render :index end
end
def delete
if BlockedDomain.find(params[:id]).destroy
flash[:notice] = I18n.t('domain_deleted')
redirect_to admin_blocked_domains_path
else
flash.now[:alert] = I18n.t('failed_to_delete_domain')
redirect_to admin_blocked_domains_path
end end
end end
def blocked_domain_params
params.require(:blocked_domain).permit(:name)
end
private
def set_domain
@domain = BlockedDomain.find(params[:id])
end
end end

View file

@ -4,8 +4,14 @@ class Admin::ContactsController < AdminController
def index def index
params[:q] ||= {} params[:q] ||= {}
@q = Contact.includes(:registrar).search(params[:q]) search_params = params[:q].deep_dup
@contacts = @q.result.page(params[:page])
if search_params[:domain_contacts_type_in].is_a?(Array) && search_params[:domain_contacts_type_in].delete('registrant')
search_params[:registrant_domains_id_not_null] = 1
end
@q = Contact.includes(:registrar).search(search_params)
@contacts = @q.result(distinct: :true).page(params[:page])
if params[:statuses_contains] if params[:statuses_contains]
contacts = Contact.includes(:registrar).where( contacts = Contact.includes(:registrar).where(
@ -16,8 +22,8 @@ class Admin::ContactsController < AdminController
end end
normalize_search_parameters do normalize_search_parameters do
@q = contacts.search(params[:q]) @q = contacts.search(search_params)
@contacts = @q.result.page(params[:page]) @contacts = @q.result(distinct: :true).page(params[:page])
end end
@contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 @contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i > 0

View file

@ -23,7 +23,7 @@ class Admin::InvoicesController < AdminController
def index def index
@q = Invoice.includes(:account_activity).search(params[:q]) @q = Invoice.includes(:account_activity).search(params[:q])
@q.sorts = 'id desc' if @q.sorts.empty? @q.sorts = 'number desc' if @q.sorts.empty?
@invoices = @q.result.page(params[:page]) @invoices = @q.result.page(params[:page])
end end

View file

@ -5,9 +5,7 @@ class Admin::PendingDeletesController < AdminController
def update def update
authorize! :update, :pending authorize! :update, :pending
@epp_domain = Epp::Domain.find(params[:domain_id]) # only epp domain has apply pending if registrant_verification.domain_registrant_delete_confirm!
@epp_domain.is_admin= true
if @epp_domain.apply_pending_delete!
redirect_to admin_domain_path(@domain.id), notice: t(:pending_applied) redirect_to admin_domain_path(@domain.id), notice: t(:pending_applied)
else else
redirect_to admin_edit_domain_path(@domain.id), alert: t(:failure) redirect_to admin_edit_domain_path(@domain.id), alert: t(:failure)
@ -17,7 +15,7 @@ class Admin::PendingDeletesController < AdminController
def destroy def destroy
authorize! :destroy, :pending authorize! :destroy, :pending
if @domain.clean_pendings! if registrant_verification.domain_registrant_delete_reject!
redirect_to admin_domain_path(@domain.id), notice: t(:pending_removed) redirect_to admin_domain_path(@domain.id), notice: t(:pending_removed)
else else
redirect_to admin_domain_path(@domain.id), alert: t(:failure) redirect_to admin_domain_path(@domain.id), alert: t(:failure)
@ -26,6 +24,14 @@ class Admin::PendingDeletesController < AdminController
private private
def registrant_verification
# steal token
token = @domain.registrant_verification_token
@registrant_verification = RegistrantVerification.new(domain_id: @domain.id,
domain_name: @domain.name,
verification_token: token)
end
def find_domain def find_domain
@domain = Domain.find(params[:domain_id]) @domain = Domain.find(params[:domain_id])
end end

View file

@ -5,8 +5,7 @@ class Admin::PendingUpdatesController < AdminController
def update def update
authorize! :update, :pending authorize! :update, :pending
@epp_domain = Epp::Domain.find(params[:domain_id]) # only epp domain has apply pending if registrant_verification.domain_registrant_change_confirm!
if @epp_domain.apply_pending_update!
redirect_to admin_domain_path(@domain.id), notice: t(:pending_applied) redirect_to admin_domain_path(@domain.id), notice: t(:pending_applied)
else else
redirect_to edit_admin_domain_path(@domain.id), alert: t(:failure) redirect_to edit_admin_domain_path(@domain.id), alert: t(:failure)
@ -15,14 +14,21 @@ class Admin::PendingUpdatesController < AdminController
def destroy def destroy
authorize! :destroy, :pending authorize! :destroy, :pending
if registrant_verification.domain_registrant_change_reject!
if @domain.clean_pendings!
redirect_to admin_domain_path(@domain.id), notice: t(:pending_removed) redirect_to admin_domain_path(@domain.id), notice: t(:pending_removed)
else else
redirect_to admin_domain_path(@domain.id), alert: t(:failure) redirect_to admin_domain_path(@domain.id), alert: t(:failure)
end end
end end
def registrant_verification
# steal token
token = @domain.registrant_verification_token
@registrant_verification = RegistrantVerification.new(domain_id: @domain.id,
domain_name: @domain.name,
verification_token: token)
end
private private
def find_domain def find_domain

View file

@ -6,7 +6,7 @@ class Admin::RegistrarsController < AdminController
end end
def index def index
@q = Registrar.ordered.search(params[:q]) @q = Registrar.joins(:accounts).ordered.search(params[:q])
@registrars = @q.result.page(params[:page]) @registrars = @q.result.page(params[:page])
end end

View file

@ -1,51 +1,68 @@
class Admin::ReservedDomainsController < AdminController class Admin::ReservedDomainsController < AdminController
load_and_authorize_resource load_and_authorize_resource
before_action :set_domain, only: [:edit, :update]
def index def index
names = ReservedDomain.pluck(:names).each_with_object({}){|e_h,h| h.merge!(e_h)}
names.names = nil if names.blank? params[:q] ||= {}
@reserved_domains = names.to_yaml.gsub(/---.?\n/, '').gsub(/\.\.\..?\n/, '') domains = ReservedDomain.all.order(:name)
@q = domains.search(params[:q])
@domains = @q.result.page(params[:page])
@domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i > 0
end
def new
@domain = ReservedDomain.new
end
def edit
end end
def create def create
@reserved_domains = params[:reserved_domains]
begin @domain = ReservedDomain.new(reserved_domain_params)
params[:reserved_domains] = "---\n" if params[:reserved_domains].blank?
names = YAML.load(params[:reserved_domains])
fail if names == false
rescue
flash.now[:alert] = I18n.t('invalid_yaml')
logger.warn 'Invalid YAML'
render :index and return
end
result = true if @domain.save
ReservedDomain.transaction do flash[:notice] = I18n.t('domain_added')
# removing old ones redirect_to admin_reserved_domains_path
existing = ReservedDomain.any_of_domains(names.keys).pluck(:id)
ReservedDomain.where.not(id: existing).delete_all
#updating and adding
names.each do |name, psw|
rec = ReservedDomain.by_domain(name).first
rec ||= ReservedDomain.new
rec.names = {name => psw}
unless rec.save
result = false
raise ActiveRecord::Rollback
end
end
end
if result
flash[:notice] = I18n.t('record_updated')
redirect_to :back
else else
flash.now[:alert] = I18n.t('failed_to_update_record') flash.now[:alert] = I18n.t('failed_to_add_domain')
render :index render 'new'
end end
end
def update
if @domain.update(reserved_domain_params)
flash[:notice] = I18n.t('domain_updated')
else
flash.now[:alert] = I18n.t('failed_to_update_domain')
end
render 'edit'
end
def delete
if ReservedDomain.find(params[:id]).destroy
flash[:notice] = I18n.t('domain_deleted')
redirect_to admin_reserved_domains_path
else
flash.now[:alert] = I18n.t('failed_to_delete_domain')
redirect_to admin_reserved_domains_path
end
end
private
def reserved_domain_params
params.require(:reserved_domain).permit(:name, :password)
end
def set_domain
@domain = ReservedDomain.find(params[:id])
end end
end end

View file

@ -67,8 +67,7 @@ class ApplicationController < ActionController::Base
end end
def user_log_str(user) def user_log_str(user)
return 'public' if user.nil? user.nil? ? 'public' : user.id_role_username
"#{user.id}-#{user.class}: #{user.username}"
end end
def comma_support_for(parent_key, key) def comma_support_for(parent_key, key)

View file

@ -29,11 +29,6 @@ class Epp::DomainsController < EppController
handle_errors(@domain) and return if @domain.errors.any? handle_errors(@domain) and return if @domain.errors.any?
handle_errors and return unless balance_ok?('create') # loads pricelist in this method handle_errors and return unless balance_ok?('create') # loads pricelist in this method
if !@domain_pricelist.try(:price)#checking if pricelist is not found
@domain.add_epp_error('2306', nil, nil, 'No price list for domain')
handle_errors(@domain) and return if @domain.errors.any?
end
ActiveRecord::Base.transaction do ActiveRecord::Base.transaction do
if @domain.save # TODO: Maybe use validate: false here because we have already validated the domain? if @domain.save # TODO: Maybe use validate: false here because we have already validated the domain?
current_user.registrar.debit!({ current_user.registrar.debit!({
@ -107,10 +102,6 @@ class Epp::DomainsController < EppController
period_unit = Epp::Domain.parse_period_unit_from_frame(params[:parsed_frame]) || 'y' period_unit = Epp::Domain.parse_period_unit_from_frame(params[:parsed_frame]) || 'y'
balance_ok?('renew', period, period_unit) # loading pricelist balance_ok?('renew', period, period_unit) # loading pricelist
if !@domain_pricelist.try(:price)#checking if pricelist is not found
@domain.add_epp_error('2306', nil, nil, 'No price list for domain')
handle_errors(@domain) and return if @domain.errors.any?
end
ActiveRecord::Base.transaction do ActiveRecord::Base.transaction do
success = @domain.renew( success = @domain.renew(
@ -258,12 +249,19 @@ class Epp::DomainsController < EppController
def balance_ok?(operation, period = nil, unit = nil) def balance_ok?(operation, period = nil, unit = nil)
@domain_pricelist = @domain.pricelist(operation, period.try(:to_i), unit) @domain_pricelist = @domain.pricelist(operation, period.try(:to_i), unit)
if current_user.registrar.balance < @domain_pricelist.price.amount if @domain_pricelist.try(:price) # checking if price list is not found
if current_user.registrar.balance < @domain_pricelist.price.amount
epp_errors << {
code: '2104',
msg: I18n.t('billing_failure_credit_balance_low')
}
return false
end
else
epp_errors << { epp_errors << {
code: '2104', code: '2104',
msg: I18n.t('billing_failure_credit_balance_low') msg: I18n.t(:active_price_missing_for_this_operation)
} }
return false return false
end end
true true

View file

@ -3,18 +3,68 @@ class Registrar::ContactsController < Registrar::DeppController # EPP controller
def index def index
authorize! :view, Depp::Contact authorize! :view, Depp::Contact
limit, offset = pagination_details
res = depp_current_user.repp_request('contacts', { details: true, limit: limit, offset: offset }) params[:q] ||= {}
if res.code == '200' params[:q].delete_if { |_k, v| v.blank? }
@response = res.parsed_body.with_indifferent_access
@contacts = @response ? @response[:contacts] : []
@paginatable_array = Kaminari.paginate_array( search_params = params[:q].deep_dup
[], total_count: @response[:total_number_of_records]
).page(params[:page]).per(limit) if search_params[:domain_contacts_type_in].is_a?(Array) && search_params[:domain_contacts_type_in].delete('registrant')
search_params[:registrant_domains_id_not_null] = 1
end end
flash.now[:epp_results] = [{ 'code' => res.code, 'msg' => res.message }]
if search_params.length == 1 && search_params[:name_matches].present?
@contacts = Contact.find_by(name: search_params[:name_matches])
end
if params[:statuses_contains]
contacts = current_user.registrar.contacts.includes(:registrar).where(
"contacts.statuses @> ?::varchar[]", "{#{params[:statuses_contains].join(',')}}"
)
else
contacts = current_user.registrar.contacts.includes(:registrar)
end
normalize_search_parameters do
@q = contacts.search(search_params)
@contacts = @q.result(distinct: :true).page(params[:page])
end
@contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i > 0
end
def download_list
authorize! :view, Depp::Contact
params[:q] ||= {}
params[:q].delete_if { |_k, v| v.blank? }
if params[:q].length == 1 && params[:q][:name_matches].present?
@contacts = Contact.find_by(name: params[:q][:name_matches])
end
if params[:statuses_contains]
contacts = current_user.registrar.contacts.includes(:registrar).where(
"contacts.statuses @> ?::varchar[]", "{#{params[:statuses_contains].join(',')}}"
)
else
contacts = current_user.registrar.contacts.includes(:registrar)
end
normalize_search_parameters do
@q = contacts.search(params[:q])
@contacts = @q.result.page(params[:page])
end
@contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i > 0
respond_to do |format|
format.csv { render text: @contacts.to_csv }
format.pdf do
pdf = @contacts.pdf(render_to_string('registrar/contacts/download_list', layout: false))
send_data pdf, filename: 'contacts.pdf'
end
end
end end
def new def new
@ -75,4 +125,18 @@ class Registrar::ContactsController < Registrar::DeppController # EPP controller
def init_epp_contact def init_epp_contact
Depp::Contact.user = depp_current_user Depp::Contact.user = depp_current_user
end end
def normalize_search_parameters
ca_cache = params[:q][:valid_to_lteq]
begin
end_time = params[:q][:valid_to_lteq].try(:to_date)
params[:q][:valid_to_lteq] = end_time.try(:end_of_day)
rescue
logger.warn('Invalid date')
end
yield
params[:q][:valid_to_lteq] = ca_cache
end
end end

View file

@ -3,19 +3,16 @@ class DomainUpdateConfirmJob < Que::Job
# it's recommended to keep transaction against job table as short as possible. # it's recommended to keep transaction against job table as short as possible.
ActiveRecord::Base.transaction do ActiveRecord::Base.transaction do
domain = Epp::Domain.find(domain_id) domain = Epp::Domain.find(domain_id)
domain.is_admin = true
case action case action
when RegistrantVerification::CONFIRMED when RegistrantVerification::CONFIRMED
domain.poll_message!(:poll_pending_update_confirmed_by_registrant) domain.poll_message!(:poll_pending_update_confirmed_by_registrant)
domain.apply_pending_update! do |e| domain.apply_pending_update!
e.instance_variable_set("@changed_attributes", e.changed_attributes.merge("statuses"=>[]))
end
domain.clean_pendings! domain.clean_pendings!
when RegistrantVerification::REJECTED when RegistrantVerification::REJECTED
DomainMailer.pending_update_rejected_notification_for_new_registrant(domain_id).deliver domain.send_mail :pending_update_rejected_notification_for_new_registrant
domain.poll_message!(:poll_pending_update_rejected_by_registrant) domain.poll_message!(:poll_pending_update_rejected_by_registrant)
domain.clean_pendings! domain.clean_pendings_lowlevel
domain.instance_variable_set("@changed_attributes", domain.changed_attributes.merge("statuses"=>[]))
domain.save
end end
destroy # it's best to destroy the job in the same transaction destroy # it's best to destroy the job in the same transaction
end end

View file

@ -0,0 +1,16 @@
class UpdateWhoisRecordJob < Que::Job
def run(ids, type)
klass = case type
when 'reserved'then ReservedDomain
when 'blocked' then BlockedDomain
else Domain
end
ids.each do |id|
record = klass.find_by(id: id)
next unless record
record.update_whois_record
end
end
end

View file

@ -1,109 +1,28 @@
class DomainMailer < ApplicationMailer class DomainMailer < ApplicationMailer
include Que::Mailer include Que::Mailer
def pending_update_request_for_old_registrant(domain_id, old_registrant_id, should_deliver) def pending_update_request_for_old_registrant(params)
@domain = Domain.find_by(id: domain_id) compose_from(params)
@old_registrant = Registrant.find(old_registrant_id)
return unless @domain
return if delivery_off?(@domain, should_deliver)
if @domain.registrant_verification_token.blank?
logger.warn "EMAIL NOT DELIVERED: registrant_verification_token is missing for #{@domain.name}"
return
end
if @domain.registrant_verification_asked_at.blank?
logger.warn "EMAIL NOT DELIVERED: registrant_verification_asked_at is missing for #{@domain.name}"
return
end
confirm_path = "#{ENV['registrant_url']}/registrant/domain_update_confirms"
@verification_url = "#{confirm_path}/#{@domain.id}?token=#{@domain.registrant_verification_token}"
return if whitelist_blocked?(@old_registrant.email)
mail(to: format(@old_registrant.email),
subject: "#{I18n.t(:pending_update_request_for_old_registrant_subject,
name: @domain.name)} [#{@domain.name}]")
end end
def pending_update_notification_for_new_registrant(domain_id, old_registrant_id, should_deliver) def pending_update_notification_for_new_registrant(params)
@domain = Domain.find_by(id: domain_id) compose_from(params)
@old_registrant = Registrant.find(old_registrant_id)
return unless @domain
return if delivery_off?(@domain, should_deliver)
if @domain.registrant_verification_token.blank?
logger.warn "EMAIL NOT DELIVERED: registrant_verification_token is missing for #{@domain.name}"
return
end
if @domain.registrant_verification_asked_at.blank?
logger.warn "EMAIL NOT DELIVERED: registrant_verification_asked_at is missing for #{@domain.name}"
return
end
@new_registrant = @domain.registrant # NB! new registrant at this point
return if whitelist_blocked?(@new_registrant.email)
mail(to: format(@new_registrant.email),
subject: "#{I18n.t(:pending_update_notification_for_new_registrant_subject,
name: @domain.name)} [#{@domain.name}]")
end end
def registrant_updated_notification_for_new_registrant(domain_id, should_deliver) def registrant_updated_notification_for_new_registrant(params)
@domain = Domain.find_by(id: domain_id) compose_from(params)
return unless @domain
return if delivery_off?(@domain, should_deliver)
return if whitelist_blocked?(@domain.registrant_email)
mail(to: format(@domain.registrant_email),
subject: "#{I18n.t(:registrant_updated_notification_for_new_registrant_subject,
name: @domain.name)} [#{@domain.name}]")
end end
def registrant_updated_notification_for_old_registrant(domain_id, should_deliver) def registrant_updated_notification_for_old_registrant(params)
domain = Domain.find_by(id: domain_id) compose_from(params)
return unless domain
return if delivery_off?(@domain, should_deliver)
@old_registrant_email = domain.registrant_email # Nb! before applying pending updates
return if whitelist_blocked?(@old_registrant_email)
mail(to: format(@old_registrant_email),
subject: "#{I18n.t(:registrant_updated_notification_for_old_registrant_subject,
name: @domain.name)} [#{@domain.name}]")
end end
def pending_update_rejected_notification_for_new_registrant(domain_id) def pending_update_rejected_notification_for_new_registrant(params)
@domain = Domain.find_by(id: domain_id) compose_from(params)
return unless @domain
# no delivery off control, driggered by que, no epp request
@new_registrant_email = @domain.pending_json['new_registrant_email']
@new_registrant_name = @domain.pending_json['new_registrant_name']
return if whitelist_blocked?(@new_registrant_email)
mail(to: format(@new_registrant_email),
subject: "#{I18n.t(:pending_update_rejected_notification_for_new_registrant_subject,
name: @domain.name)} [#{@domain.name}]")
end end
def pending_update_expired_notification_for_new_registrant(domain_id) def pending_update_expired_notification_for_new_registrant(params)
@domain = Domain.find_by(id: domain_id) compose_from(params)
return unless @domain
# no delivery off control, driggered by cron, no epp request
@new_registrant_email = @domain.pending_json['new_registrant_email']
@new_registrant_name = @domain.pending_json['new_registrant_name']
return if whitelist_blocked?(@new_registrant_email)
if @new_registrant_email.blank?
logger.info "EMAIL NOT DELIVERED: no registrant email [pending_update_expired_notification_for_new_registrant]"
return
end
mail(to: format(@new_registrant_email),
subject: "#{I18n.t(:pending_update_expired_notification_for_new_registrant_subject,
name: @domain.name)} [#{@domain.name}]")
end end
def pending_deleted(domain_id, old_registrant_id, should_deliver) def pending_deleted(domain_id, old_registrant_id, should_deliver)
@ -178,8 +97,9 @@ class DomainMailer < ApplicationMailer
def expiration_reminder(domain_id) def expiration_reminder(domain_id)
@domain = Domain.find_by(id: domain_id) @domain = Domain.find_by(id: domain_id)
return unless @domain return if @domain.nil? || !@domain.statuses.include?(DomainStatus::EXPIRED) || whitelist_blocked?(@domain.registrant.email)
return if whitelist_blocked?(@domain.registrant.email) return if whitelist_blocked?(@domain.registrant.email)
mail(to: format(@domain.registrant.email), mail(to: format(@domain.registrant.email),
subject: "#{I18n.t(:expiration_remind_subject, subject: "#{I18n.t(:expiration_remind_subject,
name: @domain.name)} [#{@domain.name}]") name: @domain.name)} [#{@domain.name}]")
@ -197,4 +117,18 @@ class DomainMailer < ApplicationMailer
subject: "#{I18n.t(:force_delete_subject)}" subject: "#{I18n.t(:force_delete_subject)}"
) )
end end
private
# app/models/DomainMailModel provides the data for mail that can be composed_from
# which ensures that values of objects are captured when they are valid, not later when this method is executed
def compose_from(params)
@params = params
return if delivery_off?(params, params[:deliver_emails])
return if whitelist_blocked?(params[:recipient])
params[:errors].map do |error|
logger.warn error
return
end
mail(to: params[:recipient], subject: params[:subject])
end
end end

View file

@ -32,7 +32,7 @@ class BankLink
hash["VK_AMOUNT"] = number_with_precision(invoice.sum_cache, :precision => 2, :separator => ".") hash["VK_AMOUNT"] = number_with_precision(invoice.sum_cache, :precision => 2, :separator => ".")
hash["VK_CURR"] = invoice.currency hash["VK_CURR"] = invoice.currency
hash["VK_REF"] = "" hash["VK_REF"] = ""
hash["VK_MSG"] = "Order nr. #{invoice.number}" hash["VK_MSG"] = invoice.description
hash["VK_RETURN"] = controller.registrar_return_payment_with_url(type) hash["VK_RETURN"] = controller.registrar_return_payment_with_url(type)
hash["VK_CANCEL"] = controller.registrar_return_payment_with_url(type) hash["VK_CANCEL"] = controller.registrar_return_payment_with_url(type)
hash["VK_DATETIME"] = Time.now.strftime("%Y-%m-%dT%H:%M:%S%z") hash["VK_DATETIME"] = Time.now.strftime("%Y-%m-%dT%H:%M:%S%z")
@ -101,6 +101,7 @@ class BankLink
transaction.buyer_iban = params["VK_SND_ACC"] transaction.buyer_iban = params["VK_SND_ACC"]
transaction.buyer_name = params["VK_SND_NAME"] transaction.buyer_name = params["VK_SND_NAME"]
transaction.paid_at = Time.parse(params["VK_T_DATETIME"]) transaction.paid_at = Time.parse(params["VK_T_DATETIME"])
transaction.save!
transaction.autobind_invoice transaction.autobind_invoice
end end

View file

@ -2,6 +2,7 @@ class BankTransaction < ActiveRecord::Base
include Versions include Versions
belongs_to :bank_statement belongs_to :bank_statement
has_one :account_activity has_one :account_activity
has_many :directo_records, as: :item, class_name: 'Directo'# Deprecated
scope :unbinded, lambda { scope :unbinded, lambda {
where('id NOT IN (SELECT bank_transaction_id FROM account_activities where bank_transaction_id IS NOT NULL)') where('id NOT IN (SELECT bank_transaction_id FROM account_activities where bank_transaction_id IS NOT NULL)')
@ -16,21 +17,32 @@ class BankTransaction < ActiveRecord::Base
account_activity.invoice account_activity.invoice
end end
def invoice_num
return @invoice_no if defined?(@invoice_no)
match = description.match(/^[^\d]*(\d+)/)
return unless match
@invoice_no = match[1].try(:to_i)
end
def invoice
@invoice ||= registrar.invoices.find_by(number: invoice_num) if registrar
end
def registrar
@registrar ||= Registrar.find_by(reference_no: reference_no)
end
# For successful binding, reference number, invoice id and sum must match with the invoice # For successful binding, reference number, invoice id and sum must match with the invoice
# rubocop: disable Metrics/PerceivedComplexity # rubocop: disable Metrics/PerceivedComplexity
# rubocop: disable Metrics/CyclomaticComplexity # rubocop: disable Metrics/CyclomaticComplexity
def autobind_invoice def autobind_invoice
return if binded? return if binded?
registrar = Registrar.find_by(reference_no: reference_no)
return unless registrar return unless registrar
return unless invoice_num
match = description.match(/^[^\d]*(\d+)/)
return unless match
invoice_no = match[1].to_i
return unless invoice_no
invoice = registrar.invoices.find_by(number: invoice_no)
return unless invoice return unless invoice
return if invoice.binded? return if invoice.binded?

View file

@ -1,5 +1,56 @@
class BlockedDomain < ActiveRecord::Base class BlockedDomain < ActiveRecord::Base
include Versions include Versions
before_save :generate_data
before_destroy :remove_data
validates :name, domain_name: true, uniqueness: true
after_initialize -> { self.names = [] if names.nil? }
class << self
def by_domain name
where(name: name)
end
def any_of_domains names
where(name: names)
end
end
def name= val
super SimpleIDN.to_unicode(val)
end
def generate_data
return if Domain.where(name: name).any?
@json = generate_json
@body = generate_body
update_whois_server
end
alias_method :update_whois_record, :generate_data
def update_whois_server
wr = Whois::Record.find_or_initialize_by(name: name)
wr.body = @body
wr.json = @json
wr.save
end
def generate_body
template = Rails.root.join("app/views/for_models/whois_other.erb".freeze)
ERB.new(template.read, nil, "-").result(binding)
end
def generate_json
h = HashWithIndifferentAccess.new
h[:name] = self.name
h[:status] = 'Blocked'
h
end
def remove_data
return if Domain.where(name: name).any?
Whois::Record.where(name: name).delete_all
end
end end

View file

@ -1,23 +1,30 @@
module UserEvents module UserEvents
extend ActiveSupport::Concern extend ActiveSupport::Concern
# TODO: remove old included do
# module ClassMethods # EPP requires a server defined creator ID, which should be registrar code if we have one
# def registrar_events(id) def cr_id
# registrar = Registrar.find(id) # try this, rebuild user for registrar before searching history? really?
# return [] unless registrar registrar = self.creator.try(:registrar)
# @events = [] if registrar.present? # Did creator return a kind of User that has a registrar?
# registrar.users.each { |user| @events << user_events(user.id) } registrar.code
# registrar.epp_users.each { |user| @events << epp_user_events(user.id) } else
# @events if self.versions.first.try(:object).nil?
# end changes = self.versions.first.try(:object_changes)
cr_registrar_id = changes['registrar_id'].second if changes.present?
else
# untested, expected never to execute
cr_registrar_id = self.versions.first.object['registrar_id']
end
# def user_events(id) if cr_registrar_id.present?
# where(whodunnit: id.to_s) Registrar.find(cr_registrar_id).code
# end else
# cr_id optional for domain, but required for contact; but we want something here anyway
self.creator_str # Fallback if we failed, maybe we can find a string here
end
end
end
end
# def epp_user_events(id)
# where(whodunnit: "#{id}-EppUser")
# end
# end
end end

View file

@ -22,32 +22,30 @@ module Versions
def creator def creator
return nil if creator_str.blank? return nil if creator_str.blank?
creator = user_from_id_role_username creator_str
if creator_str =~ /^\d+-AdminUser:/
creator = AdminUser.find_by(id: creator_str)
elsif creator_str =~ /^\d+-ApiUser:/
creator = ApiUser.find_by(id: creator_str)
elsif creator_str =~ /^\d+-api-/ # depricated
creator = ApiUser.find_by(id: creator_str)
end
creator.present? ? creator : creator_str creator.present? ? creator : creator_str
end end
def updator def updator
return nil if updator_str.blank? return nil if updator_str.blank?
updator = user_from_id_role_username updator_str
if updator_str =~ /^\d+-AdminUser:/
updator = AdminUser.find_by(id: updator_str)
elsif updator_str =~ /^\d+-ApiUser:/
updator = ApiUser.find_by(id: updator_str)
elsif updator_str =~ /^\d+-api-/ # depricated
updator = ApiUser.find_by(id: updator_str)
end
updator.present? ? updator : updator_str updator.present? ? updator : updator_str
end end
def user_from_id_role_username(str)
user = ApiUser.find_by(id: $1) if str =~ /^(\d+)-(ApiUser:|api-)/
unless user.present?
user = AdminUser.find_by(id: $1) if str =~ /^(\d+)-AdminUser:/
unless user.present?
# on import we copied Registrar name, which may eql code
registrar = Registrar.find_by(name: str)
# assume each registrar has only one user
user = registrar.api_users.first if registrar
end
end
user
end
# callbacks # callbacks
def touch_domain_version def touch_domain_version
domain.try(:touch_with_version) domain.try(:touch_with_version)

View file

@ -1,6 +1,7 @@
class Contact < ActiveRecord::Base class Contact < ActiveRecord::Base
include Versions # version/contact_version.rb include Versions # version/contact_version.rb
include EppErrors include EppErrors
include UserEvents
belongs_to :registrar belongs_to :registrar
has_many :domain_contacts has_many :domain_contacts
@ -28,7 +29,7 @@ class Contact < ActiveRecord::Base
uniqueness: { message: :epp_id_taken }, uniqueness: { message: :epp_id_taken },
format: { with: /\A[\w\-\:\.\_]*\z/i, message: :invalid }, format: { with: /\A[\w\-\:\.\_]*\z/i, message: :invalid },
length: { maximum: 100, message: :too_long_contact_code } length: { maximum: 100, message: :too_long_contact_code }
validate :ident_valid_format? validate :val_ident_valid_format?
validate :uniq_statuses? validate :uniq_statuses?
validate :validate_html validate :validate_html
@ -57,6 +58,11 @@ class Contact < ActiveRecord::Base
before_save :manage_statuses before_save :manage_statuses
def manage_statuses def manage_statuses
if domain_transfer # very ugly but need better workflow
self.statuses = statuses | [OK, LINKED]
return
end
manage_linked manage_linked
manage_ok manage_ok
end end
@ -80,6 +86,7 @@ class Contact < ActiveRecord::Base
] ]
attr_accessor :deliver_emails attr_accessor :deliver_emails
attr_accessor :domain_transfer # hack but solves problem faster
# #
# STATUSES # STATUSES
@ -203,6 +210,21 @@ class Contact < ActiveRecord::Base
['DeleteProhibited', SERVER_DELETE_PROHIBITED] ['DeleteProhibited', SERVER_DELETE_PROHIBITED]
] ]
end end
def to_csv
CSV.generate do |csv|
csv << column_names
all.each do |contact|
csv << contact.attributes.values_at(*column_names)
end
end
end
def pdf(html)
kit = PDFKit.new(html)
kit.to_pdf
end
end end
def roid def roid
@ -213,13 +235,18 @@ class Contact < ActiveRecord::Base
name || '[no name]' name || '[no name]'
end end
def ident_valid_format? def val_ident_valid_format?
case ident_type case ident_country_code
when 'priv' when 'EE'.freeze
case ident_country_code err_msg = "invalid_EE_identity_format#{"_update" if id}".to_sym
when 'EE' case ident_type
code = Isikukood.new(ident) when 'priv'.freeze
errors.add(:ident, :invalid_EE_identity_format) unless code.valid? errors.add(:ident, err_msg) unless Isikukood.new(ident).valid?
when 'org'.freeze
# !%w(1 7 8 9).freeze.include?(ident.first) ||
if ident.size != 8 || !(ident =~/\A[0-9]{8}\z/)
errors.add(:ident, err_msg)
end
end end
end end
end end
@ -472,7 +499,7 @@ class Contact < ActiveRecord::Base
end end
def update_related_whois_records def update_related_whois_records
related_domain_descriptions.each{ |x, y| WhoisRecord.find_by(name: x).save} related_domain_descriptions.each{ |x, y| WhoisRecord.find_by(name: x).try(:save) }
end end
end end

View file

@ -152,23 +152,17 @@ module Depp
} }
end end
data.css('dsData').each_with_index do |x, i| data.css('keyData').each_with_index do |x, i|
ds = { ret[:dnskeys_attributes][i] = {
ds_key_tag: x.css('keyTag').first.try(:text), flags: x.css('flags').text,
ds_alg: x.css('alg').first.try(:text), protocol: x.css('protocol').text,
ds_digest_type: x.css('digestType').first.try(:text), alg: x.css('alg').text,
ds_digest: x.css('digest').first.try(:text) public_key: x.css('pubKey').text,
ds_key_tag: x.css('keyTag').first.try(:text),
ds_alg: x.css('alg').first.try(:text),
ds_digest_type: x.css('digestType').first.try(:text),
ds_digest: x.css('digest').first.try(:text)
} }
kd = x.css('keyData').first
ds.merge!({
flags: kd.css('flags').first.try(:text),
protocol: kd.css('protocol').first.try(:text),
alg: kd.css('alg').first.try(:text),
public_key: kd.css('pubKey').first.try(:text)
}) if kd
ret[:dnskeys_attributes][i] = ds
end end
data.css('status').each_with_index do |x, i| data.css('status').each_with_index do |x, i|

49
app/models/directo.rb Normal file
View file

@ -0,0 +1,49 @@
class Directo < ActiveRecord::Base
belongs_to :item, polymorphic: true
def self.send_receipts
new_trans = Invoice.where(invoice_type: "DEB", in_directo: false).where.not(cancelled_at: nil)
new_trans.find_in_batches(batch_size: 10).each do |group|
mappers = {} # need them as no direct connection between invoice
builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml|
xml.invoices {
group.each do |invoice|
next if invoice.account_activity.nil? || invoice.account_activity.bank_transaction.nil?
# next if invoice.account_activity.bank_transaction.sum.nil? || invoice.account_activity.bank_transaction.sum != invoice.sum_cache
num = invoice.number
mappers[num] = invoice
xml.invoice(
"SalesAgent" => Setting.directo_sales_agent,
"Number" => num,
"InvoiceDate" => invoice.created_at.strftime("%Y-%m-%dT%H:%M:%S"),
"PaymentTerm" => Setting.directo_receipt_payment_term,
"Currency" => invoice.currency,
"CustomerCode"=> invoice.buyer.try(:directo_handle)
){
xml.line(
"ProductID" => Setting.directo_receipt_product_name,
"Quantity" => 1,
"UnitPriceWoVAT" => ActionController::Base.helpers.number_with_precision(invoice.sum_cache/(1+invoice.vat_prc), precision: 2, separator: "."),
"ProductName" => invoice.description
)
}
end
}
end
data = builder.to_xml.gsub("\n",'')
response = RestClient::Request.execute(url: ENV['directo_invoice_url'], method: :post, payload: {put: "1", what: "invoice", xmldata: data}, verify_ssl: false).to_s
dump_result_to_db(mappers, response)
end
end
def self.dump_result_to_db mappers, xml
Nokogiri::XML(xml).css("Result").each do |res|
obj = mappers[res.attributes["docid"].value.to_i]
obj.directo_records.create!(response: res.as_json.to_h)
obj.update_columns(in_directo: true)
Rails.logger.info("[DIRECTO] Invoice #{res.attributes["docid"].value} was pushed and return is #{res.as_json.to_h.inspect}")
end
end
end

View file

@ -1,5 +1,6 @@
# rubocop: disable Metrics/ClassLength # rubocop: disable Metrics/ClassLength
class Domain < ActiveRecord::Base class Domain < ActiveRecord::Base
include UserEvents
include Versions # version/domain_version.rb include Versions # version/domain_version.rb
include Statuses include Statuses
has_paper_trail class_name: "DomainVersion", meta: { children: :children_log } has_paper_trail class_name: "DomainVersion", meta: { children: :children_log }
@ -92,7 +93,7 @@ class Domain < ActiveRecord::Base
def update_reserved_domains def update_reserved_domains
return unless in_reserved_list? return unless in_reserved_list?
rd = ReservedDomain.by_domain(name).first rd = ReservedDomain.by_domain(name).first
rd.names[name] = SecureRandom.hex rd.password = SecureRandom.hex
rd.save rd.save
end end
@ -238,12 +239,12 @@ class Domain < ActiveRecord::Base
end end
count += 1 count += 1
if domain.pending_update? if domain.pending_update?
DomainMailer.pending_update_expired_notification_for_new_registrant(domain.id).deliver domain.send_mail :pending_update_expired_notification_for_new_registrant
end end
if domain.pending_delete? || domain.pending_delete_confirmation? if domain.pending_delete? || domain.pending_delete_confirmation?
DomainMailer.pending_delete_expired_notification(domain.id, deliver_emails).deliver DomainMailer.pending_delete_expired_notification(domain.id, true).deliver
end end
domain.clean_pendings! domain.clean_pendings_lowlevel
unless Rails.env.test? unless Rails.env.test?
STDOUT << "#{Time.zone.now.utc} Domain.clean_expired_pendings: ##{domain.id} (#{domain.name})\n" STDOUT << "#{Time.zone.now.utc} Domain.clean_expired_pendings: ##{domain.id} (#{domain.name})\n"
end end
@ -263,9 +264,9 @@ class Domain < ActiveRecord::Base
domains.each do |domain| domains.each do |domain|
next unless domain.expirable? next unless domain.expirable?
domain.set_graceful_expired domain.set_graceful_expired
DomainMailer.expiration_reminder(domain.id).deliver DomainMailer.expiration_reminder(domain.id).deliver_in(Setting.expiration_reminder_mail.to_i.days)
STDOUT << "#{Time.zone.now.utc} Domain.start_expire_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test? STDOUT << "#{Time.zone.now.utc} Domain.start_expire_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test?
domain.save domain.save(validate: false)
end end
STDOUT << "#{Time.zone.now.utc} - Successfully expired #{domains.count} domains\n" unless Rails.env.test? STDOUT << "#{Time.zone.now.utc} - Successfully expired #{domains.count} domains\n" unless Rails.env.test?
@ -279,7 +280,7 @@ class Domain < ActiveRecord::Base
next unless domain.server_holdable? next unless domain.server_holdable?
domain.statuses << DomainStatus::SERVER_HOLD domain.statuses << DomainStatus::SERVER_HOLD
STDOUT << "#{Time.zone.now.utc} Domain.start_redemption_grace_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test? STDOUT << "#{Time.zone.now.utc} Domain.start_redemption_grace_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test?
domain.save domain.save(validate: false)
end end
STDOUT << "#{Time.zone.now.utc} - Successfully set server_hold to #{d.count} domains\n" unless Rails.env.test? STDOUT << "#{Time.zone.now.utc} - Successfully set server_hold to #{d.count} domains\n" unless Rails.env.test?
@ -293,7 +294,7 @@ class Domain < ActiveRecord::Base
next unless domain.delete_candidateable? next unless domain.delete_candidateable?
domain.statuses << DomainStatus::DELETE_CANDIDATE domain.statuses << DomainStatus::DELETE_CANDIDATE
STDOUT << "#{Time.zone.now.utc} Domain.start_delete_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test? STDOUT << "#{Time.zone.now.utc} Domain.start_delete_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test?
domain.save domain.save(validate: false)
end end
return if Rails.env.test? return if Rails.env.test?
@ -307,7 +308,7 @@ class Domain < ActiveRecord::Base
c = 0 c = 0
Domain.where("statuses @> '{deleteCandidate}'::varchar[]").each do |x| Domain.where("statuses @> '{deleteCandidate}'::varchar[]").each do |x|
Whois::Record.where('domain_id = ?', x.id).try(':destroy') WhoisRecord.where(domain_id: x.id).destroy_all
destroy_with_message x destroy_with_message x
STDOUT << "#{Time.zone.now.utc} Domain.destroy_delete_candidates: by deleteCandidate ##{x.id} (#{x.name})\n" unless Rails.env.test? STDOUT << "#{Time.zone.now.utc} Domain.destroy_delete_candidates: by deleteCandidate ##{x.id} (#{x.name})\n" unless Rails.env.test?
@ -315,7 +316,7 @@ class Domain < ActiveRecord::Base
end end
Domain.where('force_delete_at <= ?', Time.zone.now).each do |x| Domain.where('force_delete_at <= ?', Time.zone.now).each do |x|
Whois::Record.where('domain_id = ?', x.id).try(':destroy') WhoisRecord.where(domain_id: x.id).destroy_all
destroy_with_message x destroy_with_message x
STDOUT << "#{Time.zone.now.utc} Domain.destroy_delete_candidates: by force delete time ##{x.id} (#{x.name})\n" unless Rails.env.test? STDOUT << "#{Time.zone.now.utc} Domain.destroy_delete_candidates: by force delete time ##{x.id} (#{x.name})\n" unless Rails.env.test?
c += 1 c += 1
@ -407,8 +408,7 @@ class Domain < ActiveRecord::Base
end end
end end
return false if statuses.include_any?(DomainStatus::DELETE_CANDIDATE, DomainStatus::SERVER_RENEW_PROHIBITED, return false if statuses.include_any?(DomainStatus::DELETE_CANDIDATE, DomainStatus::PENDING_RENEW,
DomainStatus::CLIENT_RENEW_PROHIBITED, DomainStatus::PENDING_RENEW,
DomainStatus::PENDING_TRANSFER, DomainStatus::PENDING_DELETE, DomainStatus::PENDING_TRANSFER, DomainStatus::PENDING_DELETE,
DomainStatus::PENDING_UPDATE, DomainStatus::PENDING_DELETE_CONFIRMATION) DomainStatus::PENDING_UPDATE, DomainStatus::PENDING_DELETE_CONFIRMATION)
true true
@ -438,8 +438,26 @@ class Domain < ActiveRecord::Base
save save
end end
# state change shouln't be
def clean_pendings_lowlevel
statuses.delete(DomainStatus::PENDING_DELETE_CONFIRMATION)
statuses.delete(DomainStatus::PENDING_UPDATE)
statuses.delete(DomainStatus::PENDING_DELETE)
status_notes[DomainStatus::PENDING_UPDATE] = ''
status_notes[DomainStatus::PENDING_DELETE] = ''
update_columns(
registrant_verification_token: nil,
registrant_verification_asked_at: nil,
pending_json: {},
status_notes: status_notes,
statuses: statuses.presence || [DomainStatus::OK]
)
end
def pending_update! def pending_update!
old_registrant_id = registrant_id
return true if pending_update? return true if pending_update?
self.epp_pending_update = true # for epp self.epp_pending_update = true # for epp
@ -451,8 +469,8 @@ class Domain < ActiveRecord::Base
new_registrant_email = registrant.email new_registrant_email = registrant.email
new_registrant_name = registrant.name new_registrant_name = registrant.name
DomainMailer.pending_update_request_for_old_registrant(id, old_registrant_id, deliver_emails).deliver send_mail :pending_update_request_for_old_registrant
DomainMailer.pending_update_notification_for_new_registrant(id, old_registrant_id, deliver_emails).deliver send_mail :pending_update_notification_for_new_registrant
reload # revert back to original reload # revert back to original
@ -543,8 +561,8 @@ class Domain < ActiveRecord::Base
### VALIDATIONS ### ### VALIDATIONS ###
def validate_nameserver_ips def validate_nameserver_ips
nameservers.each do |ns| nameservers.to_a.reject(&:marked_for_destruction?).each do |ns|
next unless ns.hostname.end_with?(name) next unless ns.hostname.end_with?(".#{name}")
next if ns.ipv4.present? next if ns.ipv4.present?
errors.add(:nameservers, :invalid) if errors[:nameservers].blank? errors.add(:nameservers, :invalid) if errors[:nameservers].blank?
ns.errors.add(:ipv4, :blank) ns.errors.add(:ipv4, :blank)
@ -819,6 +837,11 @@ class Domain < ActiveRecord::Base
end end
end end
def send_mail(action)
DomainMailer.send(action, DomainMailModel.new(self).send(action)).deliver
end
def self.to_csv def self.to_csv
CSV.generate do |csv| CSV.generate do |csv|
csv << column_names csv << column_names

View file

@ -0,0 +1,180 @@
class DomainMailModel
# Capture current values used in app/views/mailers/domain_mailer/* and app/mailers/domain_mailer will send later
def initialize(domain)
@domain = domain
@params = {errors: [], deliver_emails: domain.deliver_emails, id: domain.id}
end
def pending_update_request_for_old_registrant
registrant_old
subject(:pending_update_request_for_old_registrant_subject)
confirm_update
domain_info
compose
end
def pending_update_notification_for_new_registrant
registrant # new registrant at this point
subject(:pending_update_notification_for_new_registrant_subject)
domain_info
compose
end
def registrant_updated_notification_for_new_registrant
registrant
subject(:registrant_updated_notification_for_new_registrant_subject)
domain_info
compose
end
def registrant_updated_notification_for_old_registrant
registrant_pending
registrant_old
subject(:registrant_updated_notification_for_old_registrant_subject)
new_registrant = Registrant.find @domain.pending_json['new_registrant_id']
@params[:registrant_name] = new_registrant.name
@params[:registrant_ident] = new_registrant.ident
@params[:registrant_priv] = new_registrant.priv?
@params[:registrant_email] = new_registrant.email
@params[:registrant_street] = new_registrant.street
@params[:registrant_city] = new_registrant.city
@params[:registrant_country] = new_registrant.country.name
compose
end
def pending_update_rejected_notification_for_new_registrant
registrant_pending
subject(:pending_update_rejected_notification_for_new_registrant_subject)
@params[:deliver_emails] = true # triggered from que
@params[:registrar_name] = @domain.registrar.name
compose
end
def pending_update_expired_notification_for_new_registrant
registrant_pending
subject(:pending_update_expired_notification_for_new_registrant_subject)
domain_info
compose
end
def pending_deleted
registrant
subject(:domain_pending_deleted_subject)
confirm_delete
compose
end
def pending_delete_rejected_notification
registrant
subject(:pending_delete_rejected_notification_subject)
compose
end
def pending_delete_expired_notification
registrant
subject(:pending_delete_expired_notification_subject)
compose
end
def delete_confirmation
registrant
subject(:delete_confirmation_subject)
compose
end
def force_delete
admins
subject(:force_delete_subject)
compose
end
private
def registrant_old
@params[:recipient] = format Registrant.find(@domain.registrant_id_was).email
end
def registrant
@params[:recipient] = format @domain.registrant.email
end
def registrant_pending
@params[:recipient] = format @domain.pending_json['new_registrant_email']
@params[:new_registrant_name] = @domain.pending_json['new_registrant_name']
@params[:old_registrant_name] = @domain.registrant.name
end
# registrant and domain admin contacts
def admins
emails = ([@domain.registrant.email] + @domain.admin_contacts.map { |x| format(x.email) })
@params[:recipient] = emails.uniq.map { |x| format(x) }
end
# puny internet domain name, TODO: username<email>
def format(email)
return warn_no_email if email.nil?
user, host = email.split('@')
host = SimpleIDN.to_ascii(host)
"#{user}@#{host}"
end
def subject(subject)
@params[:name] = @domain.name
@params[:subject] = "#{I18n.t(subject, name: @domain.name)}, [#{@domain.name}]"
end
def confirm_update
verification_url('domain_update_confirms')
end
def confirm_delete
verification_url('domain_delete_confirms')
end
def compose
@params
end
def verification_url(path)
token = verification_token or return
@params[:verification_url] = "#{ENV['registrant_url']}/registrant/#{path}/#{@domain.id}?token=#{token}"
end
def verification_token
return warn_missing(:registrant_verification_token) if @domain.registrant_verification_token.blank?
return warn_missing(:registrant_verification_asked_at) if @domain.registrant_verification_asked_at.blank?
@domain.registrant_verification_token
end
def domain_info
[:name, :registrar_name,
:registrant_name, :registrant_ident, :registrant_email,
:registrant_street,:registrant_city
].each do |attr|
@params.store attr, @domain.send(attr)
end
@params.store :registrant_country, @domain.registrant_country.name
@params.store :registrant_priv, @domain.registrant.priv?
@params.store :old_registrant_name, Registrant.find(@domain.registrant_id_was).name
@params
end
def warn_no_email(item = 'email')
warn_missing item
nil
end
def warn_missing(item)
warn_not_delivered "#{item.to_s} is missing for #{@domain.name}"
end
def warn_not_delivered(reason)
message = "EMAIL NOT DELIVERED: #{reason}"
@params[:errors] << message
# Rails.logger.warn message
nil
end
end

View file

@ -123,6 +123,7 @@ class Epp::Contact < Contact
[:email, :invalid], [:email, :invalid],
[:ident, :invalid], [:ident, :invalid],
[:ident, :invalid_EE_identity_format], [:ident, :invalid_EE_identity_format],
[:ident, :invalid_EE_identity_format_update],
[:ident, :invalid_birthday_format], [:ident, :invalid_birthday_format],
[:ident, :invalid_country_code], [:ident, :invalid_country_code],
[:ident_type, :missing], [:ident_type, :missing],
@ -160,20 +161,20 @@ class Epp::Contact < Contact
self.ident_updated_at ||= Time.zone.now # not in use self.ident_updated_at ||= Time.zone.now # not in use
ident_frame = frame.css('ident').first ident_frame = frame.css('ident').first
if ident_frame && ident_attr_valid?(ident_frame) && ident_country_code.blank? && ident_type.in?(%w(org priv).freeze) if ident_frame && ident_attr_valid?(ident_frame)
at.merge!(ident_country_code: ident_frame.attr('cc')) org_priv = %w(org priv).freeze
if ident_country_code.blank? && org_priv.include?(ident_type) && org_priv.include?(ident_frame.attr('type'))
at.merge!(ident_country_code: ident_frame.attr('cc'), ident_type: ident_frame.attr('type'))
elsif ident_type == "birthday" && !ident[/\A\d{4}-\d{2}-\d{2}\z/] && (Date.parse(ident) rescue false)
at.merge!(ident: ident_frame.text)
at.merge!(ident_country_code: ident_frame.attr('cc')) if ident_frame.attr('cc').present?
elsif ident_type.blank? && ident_country_code.blank?
at.merge!(ident_type: ident_frame.attr('type'))
at.merge!(ident_country_code: ident_frame.attr('cc')) if ident_frame.attr('cc').present?
else
throw :epp_error, {code: '2306', msg: I18n.t(:ident_update_error)}
end
end end
# Deprecated
# if ident_updated_at.present?
# throw :epp_error, {
# code: '2306',
# msg: I18n.t(:ident_update_error)
# }
# else
# at.merge!(self.class.ident_attrs(frame.css('ident').first))
# self.ident_updated_at = Time.zone.now
# end
end end
super(at) super(at)

View file

@ -3,10 +3,12 @@ class Epp::Domain < Domain
include EppErrors include EppErrors
# TODO: remove this spagetti once data in production is correct. # TODO: remove this spagetti once data in production is correct.
attr_accessor :is_renewal attr_accessor :is_renewal, :is_transfer
before_validation :manage_permissions before_validation :manage_permissions
def manage_permissions def manage_permissions
return if is_admin # this bad hack for 109086524, refactor later
return true if is_transfer || is_renewal
return unless update_prohibited? || delete_prohibited? return unless update_prohibited? || delete_prohibited?
add_epp_error('2304', nil, nil, I18n.t(:object_status_prohibits_operation)) add_epp_error('2304', nil, nil, I18n.t(:object_status_prohibits_operation))
false false
@ -14,7 +16,7 @@ class Epp::Domain < Domain
after_validation :validate_contacts after_validation :validate_contacts
def validate_contacts def validate_contacts
return true if is_renewal return true if is_renewal || is_transfer
ok = true ok = true
active_admins = admin_domain_contacts.select { |x| !x.marked_for_destruction? } active_admins = admin_domain_contacts.select { |x| !x.marked_for_destruction? }
@ -500,18 +502,22 @@ class Epp::Domain < Domain
# rubocop: enable Metrics/CyclomaticComplexity # rubocop: enable Metrics/CyclomaticComplexity
def apply_pending_update! def apply_pending_update!
old_registrant_email = DomainMailer.registrant_updated_notification_for_old_registrant(id, deliver_emails)
preclean_pendings preclean_pendings
user = ApiUser.find(pending_json['current_user_id']) user = ApiUser.find(pending_json['current_user_id'])
frame = Nokogiri::XML(pending_json['frame']) frame = Nokogiri::XML(pending_json['frame'])
statuses.delete(DomainStatus::PENDING_UPDATE)
yield(self) if block_given? # need to skip statuses check here
self.deliver_emails = true # turn on email delivery
self.statuses.delete(DomainStatus::PENDING_UPDATE)
::PaperTrail.whodunnit = user.id_role_username # updator str should be the request originator not the approval user
send_mail :registrant_updated_notification_for_old_registrant
return unless update(frame, user, false) return unless update(frame, user, false)
clean_pendings! clean_pendings!
self.deliver_emails = true # turn on email delivery
DomainMailer.registrant_updated_notification_for_new_registrant(id, deliver_emails).deliver send_mail :registrant_updated_notification_for_new_registrant
old_registrant_email.deliver WhoisRecord.find_by(domain_id: id).save # need to reload model
save! # for notification if everything fails
true true
end end
@ -584,6 +590,7 @@ class Epp::Domain < Domain
statuses.delete(DomainStatus::SERVER_HOLD) statuses.delete(DomainStatus::SERVER_HOLD)
statuses.delete(DomainStatus::EXPIRED) statuses.delete(DomainStatus::EXPIRED)
statuses.delete(DomainStatus::SERVER_UPDATE_PROHIBITED)
save save
end end
@ -592,6 +599,8 @@ class Epp::Domain < Domain
# rubocop: disable Metrics/CyclomaticComplexity # rubocop: disable Metrics/CyclomaticComplexity
def transfer(frame, action, current_user) def transfer(frame, action, current_user)
@is_transfer = true
case action case action
when 'query' when 'query'
return domain_transfers.last if domain_transfers.any? return domain_transfers.last if domain_transfers.any?
@ -619,6 +628,7 @@ class Epp::Domain < Domain
oc.registrar_id = registrar_id oc.registrar_id = registrar_id
oc.copy_from_id = c.id oc.copy_from_id = c.id
oc.prefix_code oc.prefix_code
oc.domain_transfer = true
oc.save!(validate: false) oc.save!(validate: false)
oc oc
end end

View file

@ -2,14 +2,27 @@ class Invoice < ActiveRecord::Base
include Versions include Versions
belongs_to :seller, class_name: 'Registrar' belongs_to :seller, class_name: 'Registrar'
belongs_to :buyer, class_name: 'Registrar' belongs_to :buyer, class_name: 'Registrar'
has_one :account_activity
has_many :invoice_items has_many :invoice_items
has_one :account_activity has_many :directo_records, as: :item, class_name: 'Directo'
accepts_nested_attributes_for :invoice_items accepts_nested_attributes_for :invoice_items
scope :unbinded, lambda { scope :unbinded, lambda {
where('id NOT IN (SELECT invoice_id FROM account_activities where invoice_id IS NOT NULL)') where('id NOT IN (SELECT invoice_id FROM account_activities where invoice_id IS NOT NULL)')
} }
scope :all_columns, ->{select("invoices.*")}
scope :sort_due_date_column, ->{all_columns.select("CASE WHEN invoices.cancelled_at is not null THEN
(invoices.cancelled_at + interval '100 year') ELSE
invoices.due_date END AS sort_due_date")}
scope :sort_by_sort_due_date_asc, ->{sort_due_date_column.order("sort_due_date ASC")}
scope :sort_by_sort_due_date_desc, ->{sort_due_date_column.order("sort_due_date DESC")}
scope :sort_receipt_date_column, ->{all_columns.includes(:account_activity).references(:account_activity).select(%Q{
CASE WHEN account_activities.created_at is not null THEN account_activities.created_at
WHEN invoices.cancelled_at is not null THEN invoices.cancelled_at + interval '100 year'
ELSE NULL END AS sort_receipt_date })}
scope :sort_by_sort_receipt_date_asc, ->{sort_receipt_date_column.order("sort_receipt_date ASC")}
scope :sort_by_sort_receipt_date_desc, ->{sort_receipt_date_column.order("sort_receipt_date DESC")}
attr_accessor :billing_email attr_accessor :billing_email
validates :billing_email, email_format: { message: :invalid }, allow_blank: true validates :billing_email, email_format: { message: :invalid }, allow_blank: true
@ -17,7 +30,10 @@ class Invoice < ActiveRecord::Base
validates :invoice_type, :due_date, :currency, :seller_name, validates :invoice_type, :due_date, :currency, :seller_name,
:seller_iban, :buyer_name, :invoice_items, :vat_prc, presence: true :seller_iban, :buyer_name, :invoice_items, :vat_prc, presence: true
before_create :set_invoice_number before_create :set_invoice_number, :check_vat
before_save :check_vat
def set_invoice_number def set_invoice_number
last_no = Invoice.order(number: :desc).where('number IS NOT NULL').limit(1).pluck(:number).first last_no = Invoice.order(number: :desc).where('number IS NOT NULL').limit(1).pluck(:number).first
@ -34,6 +50,12 @@ class Invoice < ActiveRecord::Base
false false
end end
def check_vat
if buyer.country_code != 'EE' && buyer.vat_no.present?
self.vat_prc = 0
end
end
before_save -> { self.sum_cache = sum } before_save -> { self.sum_cache = sum }
class << self class << self
@ -90,6 +112,10 @@ class Invoice < ActiveRecord::Base
kit.to_pdf kit.to_pdf
end end
def description
"Order nr. #{number}"
end
def pdf_name def pdf_name
"invoice-#{number}.pdf" "invoice-#{number}.pdf"
end end

View file

@ -31,7 +31,7 @@ class Pricelist < ActiveRecord::Base
def pricelist_for(zone, operation, period) def pricelist_for(zone, operation, period)
lists = valid.where(category: zone, operation_category: operation, duration: period) lists = valid.where(category: zone, operation_category: operation, duration: period)
return lists.first if lists.count == 1 return lists.first if lists.count == 1
lists.where('valid_to IS NOT NULL').order(valid_from: :desc).first lists.order(valid_from: :desc).first
end end
end end
end end

View file

@ -12,7 +12,6 @@ class RegistrantVerification < ActiveRecord::Base
belongs_to :domain belongs_to :domain
validates :verification_token, :domain_name, :domain, :action, :action_type, presence: true validates :verification_token, :domain_name, :domain, :action, :action_type, presence: true
validates :domain, uniqueness: { scope: [:domain_id, :verification_token] }
def domain_registrant_change_confirm! def domain_registrant_change_confirm!
self.action_type = DOMAIN_REGISTRANT_CHANGE self.action_type = DOMAIN_REGISTRANT_CHANGE
@ -23,7 +22,7 @@ class RegistrantVerification < ActiveRecord::Base
def domain_registrant_change_reject! def domain_registrant_change_reject!
self.action_type = DOMAIN_REGISTRANT_CHANGE self.action_type = DOMAIN_REGISTRANT_CHANGE
self.action = REJECTED self.action = REJECTED
DomainUpdateConfirmJob.enqueue domain.id, REJECTED if save DomainUpdateConfirmJob.run domain.id, REJECTED if save
end end
def domain_registrant_delete_confirm! def domain_registrant_delete_confirm!

View file

@ -1,25 +1,75 @@
class ReservedDomain < ActiveRecord::Base class ReservedDomain < ActiveRecord::Base
include Versions # version/reserved_domain_version.rb include Versions # version/reserved_domain_version.rb
before_save :fill_empty_passwords before_save :fill_empty_passwords
before_save :generate_data
before_destroy :remove_data
validates :name, domain_name: true, uniqueness: true
def fill_empty_passwords
return unless names
names.each { |k, v| names[k] = SecureRandom.hex if v.blank? }
end
class << self class << self
def pw_for(domain_name) def pw_for(domain_name)
name_in_unicode = SimpleIDN.to_ascii(domain_name) name_in_ascii = SimpleIDN.to_ascii(domain_name)
by_domain(domain_name).select("names -> '#{domain_name}' AS pw").first.try(:pw) || by_domain(domain_name).first.try(:password) || by_domain(name_in_ascii).first.try(:password)
by_domain(name_in_unicode).select("names -> '#{name_in_unicode}' AS pw").first.try(:pw)
end end
def by_domain name def by_domain name
where("names ? '#{name}'") where(name: name)
end end
def any_of_domains names def any_of_domains names
where("names ?| ARRAY['#{names.join("','")}']") where(name: names)
end end
end end
def fill_empty_passwords
if self.password.empty?
self.password = SecureRandom.hex
end
end
def name= val
super SimpleIDN.to_unicode(val)
end
def generate_data
return if Domain.where(name: name).any?
@json = generate_json
@body = generate_body
update_whois_server
end
alias_method :update_whois_record, :generate_data
def update_whois_server
wr = Whois::Record.find_or_initialize_by(name: name)
wr.body = @body
wr.json = @json
wr.save
end
def generate_body
template = Rails.root.join("app/views/for_models/whois_other.erb".freeze)
ERB.new(template.read, nil, "-").result(binding)
end
def generate_json
h = HashWithIndifferentAccess.new
h[:name] = self.name
h[:status] = 'Reserved'
h
end
def remove_data
return if Domain.where(name: name).any?
Whois::Record.where(name: name).delete_all
end
end end

View file

@ -3,4 +3,9 @@ class User < ActiveRecord::Base
devise :trackable, :timeoutable devise :trackable, :timeoutable
attr_accessor :phone attr_accessor :phone
def id_role_username
"#{self.id}-#{self.class}: #{self.username}"
end
end end

View file

@ -3,7 +3,5 @@ class ContactVersion < PaperTrail::Version
self.table_name = :log_contacts self.table_name = :log_contacts
self.sequence_name = :log_contacts_id_seq self.sequence_name = :log_contacts_id_seq
# include UserEvents
# scope :deleted, -> { where(event: 'destroy') } # scope :deleted, -> { where(event: 'destroy') }
end end

View file

@ -4,7 +4,5 @@ class DomainVersion < PaperTrail::Version
self.table_name = :log_domains self.table_name = :log_domains
self.sequence_name = :log_domains_id_seq self.sequence_name = :log_domains_id_seq
include UserEvents
scope :deleted, -> { where(event: 'destroy') } scope :deleted, -> { where(event: 'destroy') }
end end

View file

@ -23,6 +23,10 @@ class WhoisRecord < ActiveRecord::Base
end end
end end
def self.find_by_name(name)
WhoisRecord.where("lower(name) = ?", name.downcase)
end
def generated_json def generated_json
@generated_json ||= generate_json @generated_json ||= generate_json
end end
@ -44,11 +48,11 @@ class WhoisRecord < ActiveRecord::Base
h[:changed] = domain.updated_at.try(:to_s, :iso8601) h[:changed] = domain.updated_at.try(:to_s, :iso8601)
h[:expire] = domain.valid_to.try(:to_date).try(:to_s) h[:expire] = domain.valid_to.try(:to_date).try(:to_s)
h[:outzone] = domain.outzone_at.try(:to_date).try(:to_s) h[:outzone] = domain.outzone_at.try(:to_date).try(:to_s)
h[:delete] = domain.delete_at.try(:to_date).try(:to_s) h[:delete] = [domain.delete_at, domain.force_delete_at].compact.min.try(:to_date).try(:to_s)
h[:registrant] = domain.registrant.name h[:registrant] = domain.registrant.name
h[:registrant_email] = domain.registrant.email h[:email] = domain.registrant.email
@disclosed << [:email, domain.registrant.email] @disclosed << [:email, domain.registrant.email]
h[:registrant_changed] = domain.registrant.updated_at.try(:to_s, :iso8601) h[:registrant_changed] = domain.registrant.updated_at.try(:to_s, :iso8601)
@ -102,7 +106,7 @@ class WhoisRecord < ActiveRecord::Base
self.json = generated_json self.json = generated_json
self.body = generated_body self.body = generated_body
self.name = json['name'] self.name = json['name']
self.registrar_id = domain.registrar_id # for faster registrar updates self.registrar_id = domain.registrar_id if domain # for faster registrar updates
end end
def update_whois_server def update_whois_server
@ -113,6 +117,6 @@ class WhoisRecord < ActiveRecord::Base
end end
def destroy_whois_record def destroy_whois_record
Whois::Record.where(name: name).delete_all() Whois::Record.where(name: name).delete_all
end end
end end

View file

@ -38,7 +38,7 @@ class DomainNameValidator < ActiveModel::EachValidator
def validate_blocked(value) def validate_blocked(value)
return true unless value return true unless value
return false if BlockedDomain.where("names @> ?::varchar[]", "{#{value}}").count > 0 return false if BlockedDomain.where(name: value).count > 0
ZonefileSetting.where(origin: value).count == 0 ZonefileSetting.where(origin: value).count == 0
end end
end end

View file

@ -29,13 +29,24 @@
.form-group .form-group
= f.label t(:receipt_date_until) = f.label t(:receipt_date_until)
= f.search_field :created_at_lteq, value: params[:q][:created_at_lteq], class: 'form-control datepicker', placeholder: t(:receipt_date_until), autocomplete: 'off' = f.search_field :created_at_lteq, value: params[:q][:created_at_lteq], class: 'form-control datepicker', placeholder: t(:receipt_date_until), autocomplete: 'off'
.col-md-6{style: 'padding-top: 25px;'} .col-md-3
.form-group
= label_tag t(:results_per_page)
= text_field_tag :results_per_page, params[:results_per_page], class: 'form-control', placeholder: t(:results_per_page)
.col-md-3{style: 'padding-top: 25px;'}
%button.btn.btn-default.search %button.btn.btn-default.search
&nbsp; &nbsp;
%span.glyphicon.glyphicon-search %span.glyphicon.glyphicon-search
&nbsp; &nbsp;
%button.btn.btn-default.js-reset-form %button.btn.btn-default.js-reset-form
= t(:clear_fields) = t(:clear_fields)
.row
.col-md-3
.col-md-3
.col-md-2
.col-md-4{class: 'text-right'}
= t(:starting_balance) + " #{@sum.to_a.map(&:sum).sum.to_f} EUR"
%hr %hr
.row .row
@ -55,6 +66,7 @@
%th{class: 'col-xs-2'} %th{class: 'col-xs-2'}
= sort_link(@q, 'sum') = sort_link(@q, 'sum')
%tbody %tbody
-total = @sum.to_a.map(&:sum).sum.to_f
- @account_activities.each do |x| - @account_activities.each do |x|
%tr %tr
%td= link_to(x.account.registrar.try(:code), admin_registrar_path(x.account.registrar)) %td= link_to(x.account.registrar.try(:code), admin_registrar_path(x.account.registrar))
@ -63,7 +75,15 @@
%td= l(x.created_at) %td= l(x.created_at)
- c = x.sum > 0.0 ? 'text-success' : 'text-danger' - c = x.sum > 0.0 ? 'text-success' : 'text-danger'
- s = x.sum > 0.0 ? "+#{x.sum} #{x.currency}" : "#{x.sum} #{x.currency}" - s = x.sum > 0.0 ? "+#{x.sum} #{x.currency}" : "#{x.sum} #{x.currency}"
-total += x.sum
%td{class: c}= s %td{class: c}= s
- if @account_activities.count > 0
%tr
%td
%td
%td
%td{class: 'text-right'}= t(:total)
%td{class: total > 0 ? 'text-success' : 'text-danger'}= total > 0 ? "+#{total} EUR" : "#{total} EUR"
.row .row
.col-md-12 .col-md-12
= paginate @account_activities = paginate @account_activities

View file

@ -0,0 +1,17 @@
= form_for([:admin, @domain], html: {class: 'form-horizontal'}) do |f|
= render 'shared/full_errors', object: @domain
.row
.col-md-8
.panel.panel-default
.panel-heading.clearfix
.pull-left= t(:general)
.panel-body
.form-group
.col-md-4.control-label
= f.label :name
.col-md-7
= f.text_field(:name, class: 'form-control')
.row
.col-md-8.text-right
= button_tag(t(:save), class: 'btn btn-primary')

View file

@ -0,0 +1,3 @@
= render 'shared/title', name: t(:edit_pw)
= render 'form'

View file

@ -1,10 +1,68 @@
- content_for :actions do
= link_to(t(:new), new_admin_blocked_domain_path, class: 'btn btn-primary')
= render 'shared/title', name: t(:blocked_domains) = render 'shared/title', name: t(:blocked_domains)
= form_tag([:admin, :blocked_domains]) do |f| .row
.row .col-md-12
.col-md-12 = search_form_for [:admin, @q], html: { style: 'margin-bottom: 0;', class: 'js-form', autocomplete: 'off' } do |f|
= text_area_tag :blocked_domains, @blocked_domains, class: 'form-control', rows: 30 .row
%hr .col-md-3
.row .form-group
.col-md-12.text-right = f.label :name
%button.btn.btn-warning=t(:save) = f.search_field :name_matches, value: params[:q][:name_matches], class: 'form-control', placeholder: t(:name)
.col-md-3
.form-group
= f.label t(:created_at_from)
= f.search_field :created_at_gteq, value: params[:q][:created_at_gteq], class: 'form-control datepicker', placeholder: t(:created_at_from)
.col-md-3
.form-group
= f.label t(:created_at_until)
= f.search_field :created_at_lteq, value: params[:q][:created_at_lteq], class: 'form-control datepicker', placeholder: t(:created_at_until)
.row
.col-md-3
.form-group
= label_tag t(:results_per_page)
= text_field_tag :results_per_page, params[:results_per_page], class: 'form-control', placeholder: t(:results_per_page)
.col-md-3{style: 'padding-top: 25px;'}
%button.btn.btn-primary
&nbsp;
%span.glyphicon.glyphicon-search
&nbsp;
%button.btn.btn-default.js-reset-form
= t(:clear_fields)
%hr
.row
.col-md-12
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-2'}
= sort_link(@q, 'name')
%th{class: 'col-xs-2'}
= sort_link(@q, 'created_at', t(:created_at))
%th{class: 'col-xs-2'}
= sort_link(@q, 'updated_at', t(:updated_at))
%th{class: 'col-xs-1'}
= t(:actions)
%tbody
- @domains.each do |x|
%tr
%td= x.name
%td= l(x.created_at, format: :short)
%td= l(x.updated_at, format: :short)
%td
%div{class: 'text-center'}
= link_to(t(:delete), delete_admin_blocked_domain_path(id: x.id),
data: { confirm: t(:are_you_sure) }, class: 'btn btn-danger btn-xs')
.row
.col-md-6
= paginate @domains
.col-md-6.text-right
.pagination
= t(:result_count, count: @domains.total_count)
:coffee
$(".js-reset-form").on "click", (e) ->
e.preventDefault();
window.location = "#{admin_blocked_domains_path}"

View file

@ -0,0 +1,3 @@
= render 'shared/title', name: t(:add_blocked_domain)
= render 'form'

View file

@ -29,15 +29,10 @@
.form-group .form-group
= label_tag t(:country) = label_tag t(:country)
= select_tag '[q][country_code_eq]', SortedCountry.all_options(params[:q][:country_code_eq]), { include_blank: true, placeholder: t(:choose), class: 'form-control selectize' } = select_tag '[q][country_code_eq]', SortedCountry.all_options(params[:q][:country_code_eq]), { include_blank: true, placeholder: t(:choose), class: 'form-control selectize' }
.col-md-3 .col-md-6
.form-group
= f.label t(:is_registrant)
%div
= f.check_box :registrant_domains_id_not_null
.col-md-3
.form-group .form-group
= label_tag t(:contact_type) = label_tag t(:contact_type)
= select_tag '[q][domain_contacts_type_in]', options_for_select([['admin', 'AdminDomainContact'], ['tech', 'TechDomainContact']], params[:q][:domain_contacts_type_in]), { multiple: true, placeholder: t(:choose), class: 'form-control js-combobox' } = select_tag '[q][domain_contacts_type_in]', options_for_select([['admin', 'AdminDomainContact'], ['tech', 'TechDomainContact'], ['registrant', 'registrant']], params[:q][:domain_contacts_type_in]), { multiple: true, placeholder: t(:choose), class: 'form-control js-combobox' }
.row .row
.col-md-3 .col-md-3
.form-group .form-group

View file

@ -6,7 +6,7 @@
%dt= t(:id) %dt= t(:id)
%dd= @contact.code %dd= @contact.code
%dt= t(:password) %dt= t(:authinfo_pw)
%dd %dd
= text_field_tag :auth_info, @contact.auth_info, readonly: true, class: 'partially-hidden' = text_field_tag :auth_info, @contact.auth_info, readonly: true, class: 'partially-hidden'

View file

@ -55,43 +55,47 @@
= "#{l(domain.valid_to, format: :date)}" = "#{l(domain.valid_to, format: :date)}"
%td %td
- registrant.each do |r| - if registrant
%p - registrant.each do |r|
= r[:name] %p
= r[:phone] = r[:name]
= r[:email] = r[:phone]
%p = r[:email]
= r[:code] %p
= r[:code]
%td %td
- admin_contacts.each do |ac| - if admin_contacts
%p - admin_contacts.each do |ac|
= ac[:name] %p
= ac[:phone] = ac[:name]
= ac[:email] = ac[:phone]
%p = ac[:email]
= ac[:code] %p
= ac[:code]
%td %td
- tech_contacts.each do |tc| - if tech_contacts
%p - tech_contacts.each do |tc|
= tc[:name] %p
= tc[:phone] = tc[:name]
= tc[:email] = tc[:phone]
%p = tc[:email]
= tc[:code] %p
= tc[:code]
%td %td
%p %p
- nameservers.each do |ns| - if nameservers
= ns[:hostname] - nameservers.each do |ns|
%br = ns[:hostname]
= ns[:ipv4] %br
= ns[:ipv6] = ns[:ipv4]
= ns[:ipv6]
%td %td
%p %p
= domain.registrar.name = domain.registrar.name if domain.registrar
- if domain.pending_json.present? - if domain.pending_json.present?
%tr.js-pending{ style: 'display: none;' } %tr.js-pending{ style: 'display: none;' }

View file

@ -12,7 +12,7 @@
%dt= t(:registrar) %dt= t(:registrar)
%dd= link_to(@domain.registrar, admin_registrar_path(@domain.registrar)) %dd= link_to(@domain.registrar, admin_registrar_path(@domain.registrar))
%dt= t(:password) %dt= t(:authinfo_pw)
%dd %dd
= text_field_tag :password, @domain.auth_info, readonly: true, class: 'partially-hidden' = text_field_tag :password, @domain.auth_info, readonly: true, class: 'partially-hidden'

View file

@ -8,13 +8,13 @@
%thead %thead
%tr %tr
%th{class: 'col-xs-3'} %th{class: 'col-xs-3'}
= sort_link(@q, 'invoice') = sort_link(@q, :number)
%th{class: 'col-xs-3'} %th{class: 'col-xs-3'}
= sort_link(@q, 'buyer') = sort_link(@q, :buyer_name, "Buyer")
%th{class: 'col-xs-3'} %th{class: 'col-xs-3'}
= sort_link(@q, 'due_date') = sort_link(@q, :sort_due_date, "Due date")
%th{class: 'col-xs-3'} %th{class: 'col-xs-3'}
= sort_link(@q, 'receipt_date') = sort_link(@q, :sort_receipt_date, "Receipt date")
%tbody %tbody
- @invoices.each do |x| - @invoices.each do |x|
%tr %tr

View file

@ -28,7 +28,7 @@
%dt= t(:public_key) %dt= t(:public_key)
%dd= @keyrelay.key_data_public_key %dd= @keyrelay.key_data_public_key
%dt= t(:password) %dt= t(:authinfo_pw)
%dd= @keyrelay.auth_info_pw %dd= @keyrelay.auth_info_pw
%dt= t(:expiry_relative) %dt= t(:expiry_relative)

View file

@ -8,15 +8,18 @@
%table.table.table-hover.table-bordered.table-condensed %table.table.table-hover.table-bordered.table-condensed
%thead %thead
%tr %tr
%th{class: 'col-xs-6'} %th{class: 'col-xs-4'}
= sort_link(@q, 'name') = sort_link(@q, 'name')
%th{class: 'col-xs-6'} %th{class: 'col-xs-4'}
= sort_link(@q, 'reg_no', t(:reg_no)) = sort_link(@q, 'reg_no', t(:reg_no))
%th{class: 'col-xs-4'}
= t(:credit_balance)
%tbody %tbody
- @registrars.each do |x| - @registrars.each do |x|
%tr %tr
%td= link_to(x, [:admin, x]) %td= link_to(x, [:admin, x])
%td= x.reg_no %td= x.reg_no
%td= "#{x.balance}"
.row .row
.col-md-12 .col-md-12
= paginate @registrars = paginate @registrars

View file

@ -32,6 +32,9 @@
%dt= t(:id) %dt= t(:id)
%dd= @registrar.code %dd= @registrar.code
%dt= t(:credit_balance)
%dd= @registrar.balance
.col-md-6 .col-md-6
.panel.panel-default .panel.panel-default
.panel-heading .panel-heading

View file

@ -0,0 +1,22 @@
= form_for([:admin, @domain], html: {class: 'form-horizontal'}) do |f|
= render 'shared/full_errors', object: @domain
.row
.col-md-8
.panel.panel-default
.panel-heading.clearfix
.pull-left= t(:general)
.panel-body
.form-group
.col-md-4.control-label
= f.label :name
.col-md-7
= f.text_field(:name, class: 'form-control', disabled: !f.object.new_record?)
.form-group
.col-md-4.control-label
= f.label :password
.col-md-7
= f.text_field(:password, placeholder: t(:optional), class: 'form-control')
.row
.col-md-8.text-right
= button_tag(t(:save), class: 'btn btn-primary')

View file

@ -0,0 +1,3 @@
= render 'shared/title', name: t(:edit_pw)
= render 'form'

View file

@ -1,14 +1,72 @@
- content_for :actions do - content_for :actions do
= link_to('#', class: 'btn btn-default', "data-container": "body", "data-title": t('list_format_is_in_yaml'), "data-content": "domain.ee: authinfopw<br>seconddomain.ee:<br>thirddomain.ee: authinfo3<br><br>#{t('if_auth_info_is_left_empty_it_will_be_auto_generated')}<br>#{t('each_domain_name_must_end_with_colon_sign')}", "data-placement": "left", "data-toggle": "popover", "data-html" => "true") do = link_to(t(:new), new_admin_reserved_domain_path, class: 'btn btn-primary')
%span.glyphicon.glyphicon-info-sign{"aria-hidden" => "true"}
= render 'shared/title', name: t(:reserved_domains) = render 'shared/title', name: t(:reserved_domains)
= form_tag([:admin, :reserved_domains]) do |f| .row
.row .col-md-12
.col-md-12 = search_form_for [:admin, @q], html: { style: 'margin-bottom: 0;', class: 'js-form', autocomplete: 'off' } do |f|
= text_area_tag :reserved_domains, @reserved_domains, class: 'form-control', rows: 30 .row
%hr .col-md-3
.row .form-group
.col-md-12.text-right = f.label :name
%button.btn.btn-warning=t(:save) = f.search_field :name_matches, value: params[:q][:name_matches], class: 'form-control', placeholder: t(:name)
.col-md-3
.form-group
= f.label t(:created_at_from)
= f.search_field :created_at_gteq, value: params[:q][:created_at_gteq], class: 'form-control datepicker', placeholder: t(:created_at_from)
.col-md-3
.form-group
= f.label t(:created_at_until)
= f.search_field :created_at_lteq, value: params[:q][:created_at_lteq], class: 'form-control datepicker', placeholder: t(:created_at_until)
.row
.col-md-3
.form-group
= label_tag t(:results_per_page)
= text_field_tag :results_per_page, params[:results_per_page], class: 'form-control', placeholder: t(:results_per_page)
.col-md-3{style: 'padding-top: 25px;'}
%button.btn.btn-primary
&nbsp;
%span.glyphicon.glyphicon-search
&nbsp;
%button.btn.btn-default.js-reset-form
= t(:clear_fields)
%hr
.row
.col-md-12
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-2'}
= sort_link(@q, 'name')
%th{class: 'col-xs-2'}
= sort_link(@q, 'password')
%th{class: 'col-xs-2'}
= sort_link(@q, 'created_at', t(:created_at))
%th{class: 'col-xs-2'}
= sort_link(@q, 'updated_at', t(:updated_at))
%th{class: 'col-xs-2'}
= t(:actions)
%tbody
- @domains.each do |x|
%tr
%td= x.name
%td= x.password
%td= l(x.created_at, format: :short)
%td= l(x.updated_at, format: :short)
%td
= link_to(t(:edit_pw), edit_admin_reserved_domain_path(id: x.id),
class: 'btn btn-primary btn-xs')
= link_to(t(:delete), delete_admin_reserved_domain_path(id: x.id),
data: { confirm: t(:are_you_sure) }, class: 'btn btn-danger btn-xs')
.row
.col-md-6
= paginate @domains
.col-md-6.text-right
.pagination
= t(:result_count, count: @domains.total_count)
:coffee
$(".js-reset-form").on "click", (e) ->
e.preventDefault();
window.location = "#{admin_reserved_domains_path}"

View file

@ -0,0 +1,3 @@
= render 'shared/title', name: t(:add_reserved_domain)
= render 'form'

View file

@ -36,6 +36,7 @@
= render 'setting_row', var: :days_to_renew_domain_before_expire = render 'setting_row', var: :days_to_renew_domain_before_expire
= render 'setting_row', var: :expire_warning_period = render 'setting_row', var: :expire_warning_period
= render 'setting_row', var: :redemption_grace_period = render 'setting_row', var: :redemption_grace_period
= render 'setting_row', var: :expiration_reminder_mail
.panel.panel-default .panel.panel-default
.panel-heading.clearfix .panel-heading.clearfix
@ -71,6 +72,9 @@
= render 'setting_row', var: :days_to_keep_invoices_active = render 'setting_row', var: :days_to_keep_invoices_active
= render 'setting_row', var: :days_to_keep_overdue_invoices_active = render 'setting_row', var: :days_to_keep_overdue_invoices_active
= render 'setting_row', var: :minimum_deposit = render 'setting_row', var: :minimum_deposit
= render 'setting_row', var: :directo_receipt_payment_term
= render 'setting_row', var: :directo_receipt_product_name
= render 'setting_row', var: :directo_sales_agent
= render 'setting_row', var: :registry_billing_email = render 'setting_row', var: :registry_billing_email
= render 'setting_row', var: :registry_invoice_contact = render 'setting_row', var: :registry_invoice_contact
= render 'setting_row', var: :registry_vat_no = render 'setting_row', var: :registry_vat_no

View file

@ -46,15 +46,15 @@ xml.epp_head do
xml.tag!('contact:email', 'No access') xml.tag!('contact:email', 'No access')
end end
xml.tag!('contact:clID', @contact.registrar.try(:name)) xml.tag!('contact:clID', @contact.registrar.try(:code))
if @contact.creator.try(:registrar).blank? && Rails.env.test?
xml.tag!('contact:crID', 'TEST-CREATOR') xml.tag!('contact:crID', @contact.cr_id)
else
xml.tag!('contact:crID', @contact.creator.try(:registrar))
end
xml.tag!('contact:crDate', @contact.created_at.try(:iso8601)) xml.tag!('contact:crDate', @contact.created_at.try(:iso8601))
if @contact.updated_at != @contact.created_at
xml.tag!('contact:upID', @contact.updator.try(:registrar)) if @contact.updated_at > @contact.created_at
upID = @contact.updator.try(:registrar)
upID = upID.code if upID.present? # Did updator return a kind of User that has a registrar?
xml.tag!('contact:upID', upID) if upID.present? # optional upID
xml.tag!('contact:upDate', @contact.updated_at.try(:iso8601)) xml.tag!('contact:upDate', @contact.updated_at.try(:iso8601))
end end
# xml.tag!('contact:trDate', '123') if false # xml.tag!('contact:trDate', '123') if false

View file

@ -36,19 +36,20 @@ xml.epp_head do
## TODO Find out what this domain:host is all about ## TODO Find out what this domain:host is all about
xml.tag!('domain:clID', @domain.registrar_name) xml.tag!('domain:clID', @domain.registrar.code)
xml.tag!('domain:crID', @domain.creator.try(:registrar)) if @domain.creator
xml.tag!('domain:crID', @domain.cr_id)
xml.tag!('domain:crDate', @domain.created_at.try(:iso8601)) xml.tag!('domain:crDate', @domain.created_at.try(:iso8601))
xml.tag!('domain:upDate', @domain.updated_at.try(:iso8601)) if @domain.updated_at != @domain.created_at if @domain.updated_at > @domain.created_at
upID = @domain.updator.try(:registrar)
upID = upID.code if upID.present? # Did updator return a kind of User that has a registrar?
xml.tag!('domain:upID', upID) if upID.present? # optional upID
xml.tag!('domain:upDate', @domain.updated_at.try(:iso8601))
end
xml.tag!('domain:exDate', @domain.valid_to.try(:iso8601)) xml.tag!('domain:exDate', @domain.valid_to.try(:iso8601))
# TODO Make domain stampable
#xml.tag!('domain:upID', @domain.updated_by)
# TODO Make domain transferrable # TODO Make domain transferrable
#xml.tag!('domain:trDate', @domain.transferred_at) if @domain.transferred_at #xml.tag!('domain:trDate', @domain.transferred_at) if @domain.transferred_at

View file

@ -0,0 +1,8 @@
Estonia .ee Top Level Domain WHOIS server
Domain:
name: <%= @json['name'] %>
status: <%= @json['status'] %>
Estonia .ee Top Level Domain WHOIS server
More information at http://internet.ee

View file

@ -1,7 +1,7 @@
Domeen <%= @domain.name %> on aegunud<br> Domeen <%= @domain.name %> on aegunud<br>
Lugupeetud .ee domeeni kasutaja<br> Lugupeetud .ee domeeni kasutaja<br>
<br> <br>
Domeeninimi <%= @domain.name %> on aegunud ja ei ole alates <%= l(@domain.outzone_at, format: :short) %> internetis kättesaadav. Alates <%= l(@domain.delete_at, format: :short) %> on domeen <%= @domain.name %> avatud registreerimiseks kõigile huvilistele. Domeeninimi <%= @domain.name %> on aegunud ja ei ole alates <%= l(@domain.outzone_at, format: :date) %> internetis kättesaadav. Alates <%= l(@domain.delete_at, format: :date) %> on domeen <%= @domain.name %> avatud registreerimiseks kõigile huvilistele.
<br><br> <br><br>
Domeeni registreeringu pikendamiseks pöörduge palun oma registripidaja <%= @domain.registrar.name %> poole. Registripidajate kontaktid leiate aadressilt www.internet.ee/registripidajad. Domeeni registreeringu pikendamiseks pöörduge palun oma registripidaja <%= @domain.registrar.name %> poole. Registripidajate kontaktid leiate aadressilt www.internet.ee/registripidajad.
<br><br> <br><br>
@ -27,7 +27,7 @@ Tel: +372 727 1000<br>
The <%= @domain.name %> domain has expired<br> The <%= @domain.name %> domain has expired<br>
Dear user of .ee domain,<br> Dear user of .ee domain,<br>
<br> <br>
The domain name <%= @domain.name %> has expired and will not be available on the Internet from <%= l(@domain.outzone_at, format: :short) %>. From <%= l(@domain.delete_at, format: :short) %>, the <%= @domain.name %> domain will be available for registration on a first come first served basis. The domain name <%= @domain.name %> has expired and will not be available on the Internet from <%= l(@domain.outzone_at, format: :date) %>. From <%= l(@domain.delete_at, format: :date) %>, the <%= @domain.name %> domain will be available for registration on a first come first served basis.
<br><br> <br><br>
To renew the domain registration, please contact your registrar <%= @domain.registrar.name %>. You can find the registrar's contacts at http://www.internet.ee/en/registripidajad/. To renew the domain registration, please contact your registrar <%= @domain.registrar.name %>. You can find the registrar's contacts at http://www.internet.ee/en/registripidajad/.
<br><br> <br><br>
@ -53,7 +53,7 @@ Phone: +372 727 1000<br>
Домен <%= @domain.name %> устарел<br> Домен <%= @domain.name %> устарел<br>
Уважаемый пользователь домена .ee<br> Уважаемый пользователь домена .ee<br>
<br> <br>
Доменное имя <%= @domain.name %> устарело и с <%= l(@domain.outzone_at, format: :short) %> недоступно в Интернете. С <%= l(@domain.delete_at, format: :short) %> домен <%= @domain.name %> доступен для регистрации всем желающим по принципу "first come, first served". Доменное имя <%= @domain.name %> устарело и с <%= l(@domain.outzone_at, format: :date) %> недоступно в Интернете. С <%= l(@domain.delete_at, format: :date) %> домен <%= @domain.name %> доступен для регистрации всем желающим по принципу "first come, first served".
<br><br> <br><br>
Для продления регистрации домена просим обратиться к своему регистратору <%= @domain.registrar.name %>. Контактные данные регистраторов можно найти по адресу http://www.internet.ee/ru/p/. Для продления регистрации домена просим обратиться к своему регистратору <%= @domain.registrar.name %>. Контактные данные регистраторов можно найти по адресу http://www.internet.ee/ru/p/.
<br><br> <br><br>

View file

@ -1,7 +1,7 @@
Domeen <%= @domain.name %> on aegunud Domeen <%= @domain.name %> on aegunud
Lugupeetud .ee domeeni kasutaja Lugupeetud .ee domeeni kasutaja
Domeeninimi <%= @domain.name %> on aegunud ja ei ole alates <%= l(@domain.outzone_at, format: :short) %> internetis kättesaadav. Alates <%= l(@domain.delete_at, format: :short) %> on domeen <%= @domain.name %> avatud registreerimiseks kõigile huvilistele. Domeeninimi <%= @domain.name %> on aegunud ja ei ole alates <%= l(@domain.outzone_at, format: :date) %> internetis kättesaadav. Alates <%= l(@domain.delete_at, format: :date) %> on domeen <%= @domain.name %> avatud registreerimiseks kõigile huvilistele.
Domeeni registreeringu pikendamiseks pöörduge palun oma registripidaja <%= @domain.registrar.name %> poole. Registripidajate kontaktid leiate aadressilt www.internet.ee/registripidajad. Domeeni registreeringu pikendamiseks pöörduge palun oma registripidaja <%= @domain.registrar.name %> poole. Registripidajate kontaktid leiate aadressilt www.internet.ee/registripidajad.
@ -27,7 +27,7 @@ Tel: +372 727 1000
The <%= @domain.name %> domain has expired The <%= @domain.name %> domain has expired
Dear user of .ee domain, Dear user of .ee domain,
The domain name <%= @domain.name %> has expired and will not be available on the Internet from <%= l(@domain.outzone_at, format: :short) %>. From <%= l(@domain.delete_at, format: :short) %>, the <%= @domain.name %> domain will be available for registration on a first come first served basis. The domain name <%= @domain.name %> has expired and will not be available on the Internet from <%= l(@domain.outzone_at, format: :date) %>. From <%= l(@domain.delete_at, format: :date) %>, the <%= @domain.name %> domain will be available for registration on a first come first served basis.
To renew the domain registration, please contact your registrar <%= @domain.registrar.name %>. You can find the registrar's contacts at http://www.internet.ee/en/registripidajad/. To renew the domain registration, please contact your registrar <%= @domain.registrar.name %>. You can find the registrar's contacts at http://www.internet.ee/en/registripidajad/.
@ -53,7 +53,7 @@ Phone: +372 727 1000
Домен <%= @domain.name %> устарел Домен <%= @domain.name %> устарел
Уважаемый пользователь домена .ee Уважаемый пользователь домена .ee
Доменное имя <%= @domain.name %> устарело и с <%= l(@domain.outzone_at, format: :short) %> недоступно в Интернете. С <%= l(@domain.delete_at, format: :short) %> домен <%= @domain.name %> доступен для регистрации всем желающим по принципу "first come, first served". Доменное имя <%= @domain.name %> устарело и с <%= l(@domain.outzone_at, format: :date) %> недоступно в Интернете. С <%= l(@domain.delete_at, format: :date) %> домен <%= @domain.name %> доступен для регистрации всем желающим по принципу "first come, first served".
Для продления регистрации домена просим обратиться к своему регистратору <%= @domain.registrar.name %>. Контактные данные регистраторов можно найти по адресу http://www.internet.ee/ru/p/. Для продления регистрации домена просим обратиться к своему регистратору <%= @domain.registrar.name %>. Контактные данные регистраторов можно найти по адресу http://www.internet.ee/ru/p/.

View file

@ -20,7 +20,7 @@ Registrikood: <b><%= @domain.registrant.try(:ident) %></b></p>
<p>Domeenireeglite punktist 6.4 tulenevalt on domeeni suhtes &otilde;igust omaval registreerijal v&otilde;imalus esitada domeeni <b><%= @domain.name %></b> registripidajale <b><%= @domain.registrar %></b> domeeni &uuml;leandmise taotlus Domeenireeglite p 5.3.6.2 kohaselt. Taotlusele tuleb lisada domeeni omandamist t&otilde;endavad dokumendid, mis asendavad Domeenireeglite punktis 5.3.6.3 s&auml;testatud &uuml;leandva registreerija n&otilde;usolekut. Vastav dokumentatsioon tuleks esitada Registripidajale esimesel v&otilde;imalusel.</p> <p>Domeenireeglite punktist 6.4 tulenevalt on domeeni suhtes &otilde;igust omaval registreerijal v&otilde;imalus esitada domeeni <b><%= @domain.name %></b> registripidajale <b><%= @domain.registrar %></b> domeeni &uuml;leandmise taotlus Domeenireeglite p 5.3.6.2 kohaselt. Taotlusele tuleb lisada domeeni omandamist t&otilde;endavad dokumendid, mis asendavad Domeenireeglite punktis 5.3.6.3 s&auml;testatud &uuml;leandva registreerija n&otilde;usolekut. Vastav dokumentatsioon tuleks esitada Registripidajale esimesel v&otilde;imalusel.</p>
<p>Kui &uuml;leandmine ei ole 30 p&auml;eva jooksul toimunud, kustub domeen <b><%= @domain.name %></b> 24 tunni jooksul <b><%= l(@domain.force_delete_at, format: :short) %></b> m&ouml;&ouml;dumisest juhuslikult valitud ajahetkel. Soovi korral on v&otilde;imalik domeen p&auml;rast selle kustumist registrist “kes ees, see mees” p&otilde;him&otilde;ttel uuesti registreerida.</p> <p>Kui &uuml;leandmine ei ole 30 p&auml;eva jooksul toimunud, kustub domeen <b><%= @domain.name %></b> 24 tunni jooksul <b><%= l(@domain.force_delete_at, format: :date) %></b> m&ouml;&ouml;dumisest juhuslikult valitud ajahetkel. Soovi korral on v&otilde;imalik domeen p&auml;rast selle kustumist registrist “kes ees, see mees” p&otilde;him&otilde;ttel uuesti registreerida.</p>
<p>Lisak&uuml;simuste korral v&otilde;tke palun &uuml;hendust oma registripidajaga <%= @domain.registrar %>, kelle kontaktandmed leiate lingilt <a href="http://www.internet.ee/registripidajad" target="_blank">http://www.internet.ee/registripidajad</a></p><br /><br /> <p>Lisak&uuml;simuste korral v&otilde;tke palun &uuml;hendust oma registripidajaga <%= @domain.registrar %>, kelle kontaktandmed leiate lingilt <a href="http://www.internet.ee/registripidajad" target="_blank">http://www.internet.ee/registripidajad</a></p><br /><br />
@ -39,7 +39,7 @@ Registry code: <b><%= @domain.registrant.try(:ident) %></b></p>
<p>According to paragraph 6.4 of the Domain Regulation, the registrant holding a right to the domain name <b><%= @domain.name %></b> can submit a domain name transfer application to the registrar <b><%= @domain.registrar %></b> in accordance with paragraph 5.3.6.2 of the Domain Regulation. The application must be submitted together with documents certifying the acquisition of the domain that will replace the consent of the surrendering registrant as laid down in paragraph 5.3.6.3 of the Domain Regulation. The relevant documents should be submitted to the registrar as soon as possible.</p> <p>According to paragraph 6.4 of the Domain Regulation, the registrant holding a right to the domain name <b><%= @domain.name %></b> can submit a domain name transfer application to the registrar <b><%= @domain.registrar %></b> in accordance with paragraph 5.3.6.2 of the Domain Regulation. The application must be submitted together with documents certifying the acquisition of the domain that will replace the consent of the surrendering registrant as laid down in paragraph 5.3.6.3 of the Domain Regulation. The relevant documents should be submitted to the registrar as soon as possible.</p>
<p>If the transfer has not been made in 30 days, the domain <b><%= @domain.name %></b> will be deleted at a randomly chosen moment within 24 hours after <b><%= l(@domain.force_delete_at, format: :short) %></b>. After deletion it is possible to reregister the domain on a "first come, first served" basis.</p> <p>If the transfer has not been made in 30 days, the domain <b><%= @domain.name %></b> will be deleted at a randomly chosen moment within 24 hours after <b><%= l(@domain.force_delete_at, format: :date) %></b>. After deletion it is possible to reregister the domain on a "first come, first served" basis.</p>
<p>Should you have additional questions, please contact your registrar <%= @domain.registrar %>, whose contact information can be found at <a href="http://www.internet.ee/registrars/" target="_blank">http://www.internet.ee/registrars/</a></p><br /><br /> <p>Should you have additional questions, please contact your registrar <%= @domain.registrar %>, whose contact information can be found at <a href="http://www.internet.ee/registrars/" target="_blank">http://www.internet.ee/registrars/</a></p><br /><br />
@ -58,7 +58,7 @@ Registry code: <b><%= @domain.registrant.try(:ident) %></b></p>
<p>Согласно пункту 6.4 Правил домена регистрант, имеющий право на домен, может подать регистратору <b><%= @domain.registrar %></b> домена <b><%= @domain.name %></b> ходатайство о передаче домена в соответствии с п. 5.3.6.2 Правил домена. К ходатайству следует приложить подтверждающие приобретение домена документы, заменяющие в соответствии с пунктом 5.3.6.3 Правил домена согласие передающего доменное имя регистранта. EIS предлагает представить соответствующую документацию Регистратору при первой возможности, начиная с инициирования процедуры удаления.</p> <p>Согласно пункту 6.4 Правил домена регистрант, имеющий право на домен, может подать регистратору <b><%= @domain.registrar %></b> домена <b><%= @domain.name %></b> ходатайство о передаче домена в соответствии с п. 5.3.6.2 Правил домена. К ходатайству следует приложить подтверждающие приобретение домена документы, заменяющие в соответствии с пунктом 5.3.6.3 Правил домена согласие передающего доменное имя регистранта. EIS предлагает представить соответствующую документацию Регистратору при первой возможности, начиная с инициирования процедуры удаления.</p>
<p>Если в течение 30 дней передача не произошла, домен <b><%= @domain.name %></b> удаляется по истечении 24 часов <b><%= l(@domain.force_delete_at, format: :short) %></b> в случайный момент времени. По желанию после удаления из регистра домен можно снова зарегистрировать по принципу "кто успел, тот и съел".</p> <p>Если в течение 30 дней передача не произошла, домен <b><%= @domain.name %></b> удаляется по истечении 24 часов <b><%= l(@domain.force_delete_at, format: :date) %></b> в случайный момент времени. По желанию после удаления из регистра домен можно снова зарегистрировать по принципу "кто успел, тот и съел".</p>
<p>Просим обратиться к своему регистратору <%= @domain.registrar %>. Контактные данные регистраторов можно найти по адресу <a href="http://www.internet.ee/registratory/" target="_blank">http://www.internet.ee/registratory/</a></p><br /><br /> <p>Просим обратиться к своему регистратору <%= @domain.registrar %>. Контактные данные регистраторов можно найти по адресу <a href="http://www.internet.ee/registratory/" target="_blank">http://www.internet.ee/registratory/</a></p><br /><br />

View file

@ -11,7 +11,7 @@ Kuivõrd äriregistrist kustutatud juriidiline isik ei saa olla domeeni registre
Domeenireeglite punktist 6.4 tulenevalt on domeeni suhtes õigust omaval registreerijal võimalus esitada domeeni <%= @domain.name %> registripidajale <%= @domain.registrar %> domeeni üleandmise taotlus Domeenireeglite p 5.3.6.2 kohaselt. Taotlusele tuleb lisada domeeni omandamist tõendavad dokumendid, mis asendavad Domeenireeglite punktis 5.3.6.3 sätestatud üleandva registreerija nõusolekut. Vastav dokumentatsioon tuleks esitada Registripidajale esimesel võimalusel. Domeenireeglite punktist 6.4 tulenevalt on domeeni suhtes õigust omaval registreerijal võimalus esitada domeeni <%= @domain.name %> registripidajale <%= @domain.registrar %> domeeni üleandmise taotlus Domeenireeglite p 5.3.6.2 kohaselt. Taotlusele tuleb lisada domeeni omandamist tõendavad dokumendid, mis asendavad Domeenireeglite punktis 5.3.6.3 sätestatud üleandva registreerija nõusolekut. Vastav dokumentatsioon tuleks esitada Registripidajale esimesel võimalusel.
Kui üleandmine ei ole 30 päeva jooksul toimunud, kustub domeen <%= @domain.name %> 24 tunni jooksul <%= l(@domain.force_delete_at, format: :short) %> möödumisest juhuslikult valitud ajahetkel. Soovi korral on võimalik domeen pärast selle kustumist registrist "kes ees, see mees" põhimõttel uuesti registreerida. Kui üleandmine ei ole 30 päeva jooksul toimunud, kustub domeen <%= @domain.name %> 24 tunni jooksul <%= l(@domain.force_delete_at, format: :date) %> möödumisest juhuslikult valitud ajahetkel. Soovi korral on võimalik domeen pärast selle kustumist registrist "kes ees, see mees" põhimõttel uuesti registreerida.
Lisaküsimuste korral võtke palun ühendust oma registripidajaga <%= @domain.registrar %>, kelle kontaktandmed leiate lingilt http://www.internet.ee/registripidajad/ Lisaküsimuste korral võtke palun ühendust oma registripidajaga <%= @domain.registrar %>, kelle kontaktandmed leiate lingilt http://www.internet.ee/registripidajad/
@ -30,7 +30,7 @@ As a terminated legal person cannot be the registrant of a domain, the EIF start
According to paragraph 6.4 of the Domain Regulation, the registrant holding a right to the domain name <%= @domain.name %> can submit a domain name transfer application to the registrar <%= @domain.registrar %> in accordance with paragraph 5.3.6.2 of the Domain Regulation. The application must be submitted together with documents certifying the acquisition of the domain that will replace the consent of the surrendering registrant as laid down in paragraph 5.3.6.3 of the Domain Regulation. The relevant documents should be submitted to the registrar as soon as possible. According to paragraph 6.4 of the Domain Regulation, the registrant holding a right to the domain name <%= @domain.name %> can submit a domain name transfer application to the registrar <%= @domain.registrar %> in accordance with paragraph 5.3.6.2 of the Domain Regulation. The application must be submitted together with documents certifying the acquisition of the domain that will replace the consent of the surrendering registrant as laid down in paragraph 5.3.6.3 of the Domain Regulation. The relevant documents should be submitted to the registrar as soon as possible.
If the transfer has not been made in 30 days, the domain <%= @domain.name %> will be deleted at a randomly chosen moment within 24 hours after <%= l(@domain.force_delete_at, format: :short) %>. After deletion it is possible to reregister the domain on a "first come, first served" basis. If the transfer has not been made in 30 days, the domain <%= @domain.name %> will be deleted at a randomly chosen moment within 24 hours after <%= l(@domain.force_delete_at, format: :date) %>. After deletion it is possible to reregister the domain on a "first come, first served" basis.
Should you have additional questions, please contact your registrar <%= @domain.registrar %>, whose contact information can be found at http://www.internet.ee/registrars/ Should you have additional questions, please contact your registrar <%= @domain.registrar %>, whose contact information can be found at http://www.internet.ee/registrars/
@ -49,7 +49,7 @@ EIS стало известно, что юридическое лицо с ре
Согласно пункту 6.4 Правил домена регистрант, имеющий право на домен, может подать регистратору <%= @domain.registrar %> домена <%= @domain.name %> ходатайство о передаче домена в соответствии с п. 5.3.6.2 Правил домена. К ходатайству следует приложить подтверждающие приобретение домена документы, заменяющие в соответствии с пунктом 5.3.6.3 Правил домена согласие передающего доменное имя регистранта. EIS предлагает представить соответствующую документацию Регистратору при первой возможности, начиная с инициирования процедуры удаления. Согласно пункту 6.4 Правил домена регистрант, имеющий право на домен, может подать регистратору <%= @domain.registrar %> домена <%= @domain.name %> ходатайство о передаче домена в соответствии с п. 5.3.6.2 Правил домена. К ходатайству следует приложить подтверждающие приобретение домена документы, заменяющие в соответствии с пунктом 5.3.6.3 Правил домена согласие передающего доменное имя регистранта. EIS предлагает представить соответствующую документацию Регистратору при первой возможности, начиная с инициирования процедуры удаления.
Если в течение 30 дней передача не произошла, домен <%= @domain.name %> удаляется по истечении 24 часов <%= l(@domain.force_delete_at, format: :short) %> в случайный момент времени. По желанию после удаления из регистра домен можно снова зарегистрировать по принципу "кто успел, тот и съел". Если в течение 30 дней передача не произошла, домен <%= @domain.name %> удаляется по истечении 24 часов <%= l(@domain.force_delete_at, format: :date) %> в случайный момент времени. По желанию после удаления из регистра домен можно снова зарегистрировать по принципу "кто успел, тот и съел".
Просим обратиться к своему регистратору <%= @domain.registrar %>. Контактные данные регистраторов можно найти по адресу http://www.internet.ee/registratory Просим обратиться к своему регистратору <%= @domain.registrar %>. Контактные данные регистраторов можно найти по адресу http://www.internet.ee/registratory

View file

@ -1,8 +1,8 @@
Tere, Tere,
<br><br> <br><br>
Domeeni <%= @domain.name %> registreerija <%= @domain.registrant_name %> ei kinnitanud tähtaegselt registreerija vahetuse taotlust. Domeeni <%= @domain.name %> registreerija vahetus on sellest tulenevalt tühistatud. Domeeni <%= @params[:name] %> registreerija <%= @params[:registrant_name] %> ei kinnitanud tähtaegselt registreerija vahetuse taotlust. Domeeni <%= @params[:name] %> registreerija vahetus on sellest tulenevalt tühistatud.
<br><br> <br><br>
Küsimuste korral palun võtke ühendust registripidajaga <%= @domain.registrar_name %>, kelle kontaktid leiate http://internet.ee/registripidajad/akrediteeritud-registripidajad Küsimuste korral palun võtke ühendust registripidajaga <%= @params[:registrar_name] %>, kelle kontaktid leiate http://internet.ee/registripidajad/akrediteeritud-registripidajad
<br><br> <br><br>
Lugupidamisega<br> Lugupidamisega<br>
Eesti Interneti SA Eesti Interneti SA
@ -11,9 +11,9 @@ Eesti Interneti SA
<br><br> <br><br>
Hi, Hi,
<br><br> <br><br>
Domain registrant change has been expired for the domain <%= @domain.name %>. Domain registrant change has been expired for the domain <%= @params[:name] %>.
<br><br> <br><br>
Please contact to your registrar <%= @domain.registrar_name %> if you have any questions. Please contact to your registrar <%= @params[:registrar_name] %> if you have any questions.
<br><br> <br><br>
Best Regards,<br> Best Regards,<br>
Estonian Internet Foundation Estonian Internet Foundation

View file

@ -1,8 +1,8 @@
Tere, Tere,
Domeeni <%= @domain.name %> registreerija <%= @domain.registrant_name %> ei kinnitanud tähtaegselt registreerija vahetuse taotlust. Domeeni <%= @domain.name %> registreerija vahetus on sellest tulenevalt tühistatud. Domeeni <%= @params[:name] %> registreerija <%= @params[:registrant_name] %> ei kinnitanud tähtaegselt registreerija vahetuse taotlust. Domeeni <%= @params[:name] %> registreerija vahetus on sellest tulenevalt tühistatud.
Küsimuste korral palun võtke ühendust registripidajaga <%= @domain.registrar_name %>, kelle kontaktid leiate http://internet.ee/registripidajad/akrediteeritud-registripidajad Küsimuste korral palun võtke ühendust registripidajaga <%= @params[:registrar_name] %>, kelle kontaktid leiate http://internet.ee/registripidajad/akrediteeritud-registripidajad
Lugupidamisega Lugupidamisega
Eesti Interneti SA Eesti Interneti SA
@ -11,9 +11,9 @@ Eesti Interneti SA
Hi, Hi,
Domain registrant change has been expired for the domain <%= @domain.name %>. Domain registrant change has been expired for the domain <%= @params[:name] %>.
Please contact to your registrar <%= @domain.registrar_name %> if you have any questions. Please contact to your registrar <%= @params[:registrar_name] %> if you have any questions.
Best Regards, Best Regards,
Estonian Internet Foundation Estonian Internet Foundation

View file

@ -1,25 +1,25 @@
Tere, Tere,
<br><br> <br><br>
Registripidaja <%= @domain.registrar_name %> vahendusel on algatatud <%= @domain.name %> domeeni omanikuvahetuse protseduur. Registripidaja <%= @params[:registrar_name] %> vahendusel on algatatud <%= @params[:name] %> domeeni omanikuvahetuse protseduur.
<br><br> <br><br>
Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja poole. Teie registripidaja on <%= @domain.registrar_name %> Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja poole. Teie registripidaja on <%= @params[:registrar_name] %>
<br><br> <br><br>
Uued registreerija andmed:<br> Uue registreerija andmed:<br>
Nimi: <%= @domain.registrant_name %><br> Nimi: <%= @params[:registrant_name] %><br>
<% if @domain.registrant.priv? %> <% if @params[:registrant_priv] %>
Isikukood: <%= @domain.registrant_ident %><br> Isikukood: <%= @params[:registrant_ident] %><br>
<% else %> <% else %>
Äriregistrikood: <%= @domain.registrant_ident %><br> Äriregistrikood: <%= @params[:registrant_ident] %><br>
<% end %> <% end %>
Tänav: <%= @domain.registrant_street %><br> Tänav: <%= @params[:registrant_street] %><br>
Linn: <%= @domain.registrant_city %><br> Linn: <%= @params[:registrant_city] %><br>
Riik: <%= @domain.registrant_country %> Riik: <%= @params[:registrant_country] %>
<br><br> <br><br>
Juhime Teie tähelepanu asjaolule, et omanikuvahetuse protseduur viiaks lõpule vaid juhul, kui domeeni hetkel kehtiv registreerija <%= @old_registrant.name %> omanikuvahetuse tähtaegselt kinnitab. Juhime Teie tähelepanu asjaolule, et omanikuvahetuse protseduur viiaks lõpule vaid juhul, kui domeeni hetkel kehtiv registreerija <%= @params[:old_registrant_name] %> omanikuvahetuse tähtaegselt kinnitab.
<br><br> <br><br>
Juhul kui <%= @old_registrant.name %> lükkab omanikuvahtuse taotluse tagasi või ei anna kinnitust enne <%= Setting.expire_pending_confirmation %> tundi, omanikuvahetuse protseduur tühistatakse. Juhul kui <%= @params[:old_registrant_name] %> lükkab omanikuvahtuse taotluse tagasi või ei anna kinnitust enne <%= Setting.expire_pending_confirmation %> tundi, omanikuvahetuse protseduur tühistatakse.
<br><br> <br><br>
Küsimuste korral palun võtke ühendust registripidajaga <%= @domain.registrar_name %>, kelle kontaktid leiate http://internet.ee/registripidajad/akrediteeritud-registripidajad Küsimuste korral palun võtke ühendust registripidajaga <%= @params[:registrar_name] %>, kelle kontaktid leiate http://internet.ee/registripidajad/akrediteeritud-registripidajad
<br><br> <br><br>
Lugupidamisega<br> Lugupidamisega<br>
Eesti Interneti SA Eesti Interneti SA
@ -28,20 +28,20 @@ Eesti Interneti SA
<br><br> <br><br>
Hi, Hi,
<br><br> <br><br>
Registrant change process for the domain <%= @domain.name %> has been started. Registrant change process for the domain <%= @params[:name] %> has been started.
<br><br> <br><br>
New registrant:<br> New registrant:<br>
Name: <%= @domain.registrant_name %><br> Name: <%= @params[:registrant_name] %><br>
<% if @domain.registrant.priv? %> <% if @params[:registrant_priv] %>
Personal code: <%= @domain.registrant_ident %><br> Personal code: <%= @params[:registrant_ident] %><br>
<% else %> <% else %>
Business Registry code: <%= @domain.registrant_ident %><br> Business Registry code: <%= @params[:registrant_ident] %><br>
<% end %> <% end %>
Street: <%= @domain.registrant_street %><br> Street: <%= @params[:registrant_street] %><br>
City: <%= @domain.registrant_city %><br> City: <%= @params[:registrant_city] %><br>
Country: <%= @domain.registrant_country %> Country: <%= @params[:registrant_country] %>
<br><br> <br><br>
Please contact to your registrar <%= @domain.registrar_name %> if you have any questions. Please contact to your registrar <%= @params[:registrar_name] %> if you have any questions.
<br><br> <br><br>
Best Regards,<br> Best Regards,<br>
Estonian Internet Foundation Estonian Internet Foundation

View file

@ -1,25 +1,25 @@
Tere, Tere,
Registripidaja <%= @domain.registrar_name %> vahendusel on algatatud <%= @domain.name %> domeeni omanikuvahetuse protseduur. Registripidaja <%= @params[:registrar_name] %> vahendusel on algatatud <%= @params[:name] %> domeeni omanikuvahetuse protseduur.
Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja poole. Teie registripidaja on <%= @domain.registrar_name %> Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja poole. Teie registripidaja on <%= @params[:registrar_name] %>
Uued registreerija andmed: Uue registreerija andmed:
Nimi: <%= @domain.registrant_name %> Nimi: <%= @params[:registrant_name] %>
<% if @domain.registrant.priv? %> <% if @params[:registrant_priv] %>
Isikukood: <%= @domain.registrant_ident %> Isikukood: <%= @params[:registrant_ident] %>
<% else %> <% else %>
Äriregistrikood: <%= @domain.registrant_ident %> Äriregistrikood: <%= @params[:registrant_ident] %>
<% end %> <% end %>
Tänav: <%= @domain.registrant_street %> Tänav: <%= @params[:registrant_street] %>
Linn: <%= @domain.registrant_city %> Linn: <%= @params[:registrant_city] %>
Riik: <%= @domain.registrant_country %> Riik: <%= @params[:registrant_country] %>
Juhime Teie tähelepanu asjaolule, et omanikuvahetuse protseduur viiaks lõpule vaid juhul, kui domeeni hetkel kehtiv registreerija <%= @old_registrant.name %> omanikuvahetuse tähtaegselt kinnitab. Juhime Teie tähelepanu asjaolule, et omanikuvahetuse protseduur viiaks lõpule vaid juhul, kui domeeni hetkel kehtiv registreerija <%= @params[:old_registrant_name] %> omanikuvahetuse tähtaegselt kinnitab.
Juhul kui <%= @old_registrant.name %> lükkab omanikuvahtuse taotluse tagasi või ei anna kinnitust enne <%= Setting.expire_pending_confirmation %> tundi, omanikuvahetuse protseduur tühistatakse. Juhul kui <%= @params[:old_registrant_name] %> lükkab omanikuvahtuse taotluse tagasi või ei anna kinnitust enne <%= Setting.expire_pending_confirmation %> tundi, omanikuvahetuse protseduur tühistatakse.
Küsimuste korral palun võtke ühendust registripidajaga <%= @domain.registrar_name %>, kelle kontaktid leiate http://internet.ee/registripidajad/akrediteeritud-registripidajad Küsimuste korral palun võtke ühendust registripidajaga <%= @params[:registrar_name] %>, kelle kontaktid leiate http://internet.ee/registripidajad/akrediteeritud-registripidajad
Lugupidamisega Lugupidamisega
Eesti Interneti SA Eesti Interneti SA
@ -28,20 +28,20 @@ Eesti Interneti SA
Hi, Hi,
Registrant change process for the domain <%= @domain.name %> has been started. Registrant change process for the domain <%= @params[:name] %> has been started.
New registrant: New registrant:
Name: <%= @domain.registrant_name %> Name: <%= @params[:registrant_name] %>
<% if @domain.registrant.priv? %> <% if @params[:registrant_priv] %>
Personal code: <%= @domain.registrant_ident %> Personal code: <%= @params[:registrant_ident] %>
<% else %> <% else %>
Business Registry code: <%= @domain.registrant_ident %> Business Registry code: <%= @params[:registrant_ident] %>
<% end %> <% end %>
Street: <%= @domain.registrant_street %> Street: <%= @params[:registrant_street] %>
City: <%= @domain.registrant_city %> City: <%= @params[:registrant_city] %>
Country: <%= @domain.registrant_country %> Country: <%= @params[:registrant_country] %>
Please contact to your registrar <%= @domain.registrar_name %> if you have any questions. Please contact to your registrar <%= @params[:registrar_name] %> if you have any questions.
Best Regards, Best Regards,
Estonian Internet Foundation Estonian Internet Foundation

View file

@ -1,8 +1,8 @@
Tere, Tere,
<br><br> <br><br>
Domeeni <%= @domain.name %> registreerija <%= @new_registrant_name %> on domeeni registreerija vahetamise taotluse tagasi lükanud. Domeeni <%= @params[:name] %> registreerija <%= @params[:old_registrant_name] %> on domeeni registreerija vahetamise taotluse tagasi lükanud.
<br><br> <br><br>
Küsimuste korral palun võtke ühendust registripidajaga <%= @domain.registrar_name %>, kelle kontaktid leiate http://internet.ee/registripidajad/akrediteeritud-registripidajad Küsimuste korral palun võtke ühendust registripidajaga <%= @params[:registrar_name] %>, kelle kontaktid leiate http://internet.ee/registripidajad/akrediteeritud-registripidajad
<br><br> <br><br>
Lugupidamisega,<br> Lugupidamisega,<br>
Eesti Interneti SA Eesti Interneti SA
@ -11,9 +11,9 @@ Eesti Interneti SA
<br><br> <br><br>
Hi, Hi,
<br><br> <br><br>
Registrant change was declined for the domain <%= @domain.name %>. Registrant change was declined for the domain <%= @params[:name] %>.
<br><br> <br><br>
Please contact to your registrar <%= @domain.registrar_name %> if you have any questions. Please contact to your registrar <%= @params[:registrar_name] %> if you have any questions.
<br><br> <br><br>
Best Regards,<br> Best Regards,<br>
Estonian Internet Foundation Estonian Internet Foundation

View file

@ -1,8 +1,8 @@
Tere, Tere,
Domeeni <%= @domain.name %> registreerija <%= @new_registrant_name %> on domeeni registreerija vahetamise taotluse tagasi lükanud. Domeeni <%= @params[:name] %> registreerija <%= @params[:old_registrant_name] %> on domeeni registreerija vahetamise taotluse tagasi lükanud.
Küsimuste korral palun võtke ühendust registripidajaga <%= @domain.registrar_name %>, kelle kontaktid leiate http://internet.ee/registripidajad/akrediteeritud-registripidajad Küsimuste korral palun võtke ühendust registripidajaga <%= @params[:registrar_name] %>, kelle kontaktid leiate http://internet.ee/registripidajad/akrediteeritud-registripidajad
Lugupidamisega Lugupidamisega
Eesti Interneti SA Eesti Interneti SA
@ -11,9 +11,9 @@ Eesti Interneti SA
Hi, Hi,
Registrant change was declined for the domain <%= @domain.name %>. Registrant change was declined for the domain <%= @params[:name] %>.
Please contact to your registrar <%= @domain.registrar_name %> if you have any questions. Please contact to your registrar <%= @params[:registrar_name] %> if you have any questions.
Best Regards, Best Regards,
Estonian Internet Foundation Estonian Internet Foundation

View file

@ -1,23 +1,23 @@
Tere, Tere,
<br><br> <br><br>
Registrisse laekus taotlus domeeni <%= @domain.name %> registreerija vahetuseks. Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja poole. Teie registripidaja on <%= @domain.registrar_name %> Registrisse laekus taotlus domeeni <%= @params[:name] %> registreerija vahetuseks. Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja poole. Teie registripidaja on <%= @params[:registrar_name] %>
<br><br> <br><br>
Uued registreerija andmed:<br> Uue registreerija andmed:<br>
Nimi: <%= @domain.registrant_name %><br> Nimi: <%= @params[:registrant_name] %><br>
<% if @domain.registrant.priv? %> <% if @params[:registrant_priv] %>
Isikukood: <%= @domain.registrant_ident %><br> Isikukood: <%= @params[:registrant_ident] %><br>
<% else %> <% else %>
Äriregistrikood: <%= @domain.registrant_ident %><br> Äriregistrikood: <%= @params[:registrant_ident] %><br>
<% end %> <% end %>
Tänav: <%= @domain.registrant_street %><br> Tänav: <%= @params[:registrant_street] %><br>
Linn: <%= @domain.registrant_city %><br> Linn: <%= @params[:registrant_city] %><br>
Riik: <%= @domain.registrant_country %> Riik: <%= @params[:registrant_country] %>
<br><br> <br><br>
Taotlus on aktiivne <%= Setting.expire_pending_confirmation %> tundi ja lükatakse automaatselt tagasi kui te seda enne ise ei kinnita või tagasi lükka. Taotlus on aktiivne <%= Setting.expire_pending_confirmation %> tundi ja lükatakse automaatselt tagasi kui te seda enne ise ei kinnita või tagasi lükka.
<br><br> <br><br>
Muudatuse kinnitamiseks külastage palun allolevat võrgulehekülge, kontrollige uuesti üle muudatuse andmed ning vajutage nuppu kinnitan:<br> Muudatuse kinnitamiseks külastage palun allolevat võrgulehekülge, kontrollige uuesti üle muudatuse andmed ning vajutage nuppu kinnitan:<br>
<%= link_to @verification_url, @verification_url %> <%= link_to @params[:verification_url], @params[:verification_url] %>
<br><br> <br><br>
Lugupidamisega<br> Lugupidamisega<br>
Eesti Interneti SA Eesti Interneti SA
@ -26,23 +26,23 @@ Eesti Interneti SA
<br><br> <br><br>
Hi, Hi,
<br><br> <br><br>
Application for changing registrant of your domain <%= @domain.name %> has been filed. Please make sure that the update and information are correct. Incase of problems please turn to your registrar. Your registrar is <%= @domain.registrar_name %> Application for changing registrant of your domain <%= @params[:name] %> has been filed. Please make sure that the update and information are correct. Incase of problems please turn to your registrar. Your registrar is <%= @params[:registrar_name] %>
<br><br> <br><br>
New registrant:<br> New registrant:<br>
Name: <%= @domain.registrant_name %><br> Name: <%= @params[:registrant_name] %><br>
<% if @domain.registrant.priv? %> <% if @params[:registrant_priv] %>
Personal code: <%= @domain.registrant_ident %><br> Personal code: <%= @params[:registrant_ident] %><br>
<% else %> <% else %>
Business Registry code: <%= @domain.registrant_ident %><br> Business Registry code: <%= @params[:registrant_ident] %><br>
<% end %> <% end %>
Street: <%= @domain.registrant_street %><br> Street: <%= @params[:registrant_street] %><br>
City: <%= @domain.registrant_city %><br> City: <%= @params[:registrant_city] %><br>
Country: <%= @domain.registrant_country %> Country: <%= @params[:registrant_country] %>
<br><br> <br><br>
The application will remain in pending status for <%= Setting.expire_pending_confirmation %> hrs and will be automaticcally rejected if it is not approved nor rejected before. The application will remain in pending status for <%= Setting.expire_pending_confirmation %> hrs and will be automaticcally rejected if it is not approved nor rejected before.
<br><br> <br><br>
To confirm the update please visit this website, once again review the data and press approve:<br> To confirm the update please visit this website, once again review the data and press approve:<br>
<%= link_to @verification_url, @verification_url %> <%= link_to @params[:verification_url], @params[:verification_url] %>
<br><br> <br><br>
Best Regards,<br> Best Regards,<br>
Estonian Internet Foundation Estonian Internet Foundation

View file

@ -1,21 +1,21 @@
Tere, Tere,
Registrisse laekus taotlus domeeni <%= @domain.name %> registreerija vahetuseks. Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja poole. Teie registripidaja on <%= @domain.registrar_name %> Registrisse laekus taotlus domeeni <%= @params[:name] %> registreerija vahetuseks. Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja poole. Teie registripidaja on <%= @params[:registrar_name] %>
Uued registreerija andmed: Uue registreerija andmed:
Nimi: <%= @domain.registrant_name %> Nimi: <%= @params[:registrant_name] %>
<% if @domain.registrant.priv? %> <% if @params[:registrant_priv] %>
Isikukood: <%= @domain.registrant_ident %> Isikukood: <%= @params[:registrant_ident] %>
<% else %> <% else %>
Äriregistrikood: <%= @domain.registrant_ident %> Äriregistrikood: <%= @params[:registrant_ident] %>
<% end %> <% end %>
Tänav: <%= @domain.registrant_street %> Tänav: <%= @params[:registrant_street] %>
Linn: <%= @domain.registrant_city %> Linn: <%= @params[:registrant_city] %>
Riik: <%= @domain.registrant_country %> Riik: <%= @params[:registrant_country] %>
Taotlus on aktiivne <%= Setting.expire_pending_confirmation %> tundi ja lükatakse automaatselt tagasi kui te seda enne ise ei kinnita või tagasi lükka. Taotlus on aktiivne <%= Setting.expire_pending_confirmation %> tundi ja lükatakse automaatselt tagasi kui te seda enne ise ei kinnita või tagasi lükka.
Muudatuse kinnitamiseks külastage palun allolevat võrgulehekülge, kontrollige uuesti üle muudatuse andmed ning vajutage nuppu kinnitan: Muudatuse kinnitamiseks külastage palun allolevat võrgulehekülge, kontrollige uuesti üle muudatuse andmed ning vajutage nuppu kinnitan:
<%= @verification_url %> <%= @params[:verification_url] %>
Lugupidamisega Lugupidamisega
Eesti Interneti SA Eesti Interneti SA
@ -24,22 +24,22 @@ Eesti Interneti SA
Hi, Hi,
Application for changing registrant of your domain <%= @domain.name %> has been filed. Please make sure that the update and information are correct. Incase of problems please turn to your registrar. Your registrar is <%= @domain.registrar_name %> Application for changing registrant of your domain <%= @params[:name] %> has been filed. Please make sure that the update and information are correct. Incase of problems please turn to your registrar. Your registrar is <%= @params[:registrar_name] %>
New registrant: New registrant:
Name: <%= @domain.registrant_name %> Name: <%= @params[:registrant_name] %>
<% if @domain.registrant.priv? %> <% if @params[:registrant_priv] %>
Personal code: <%= @domain.registrant_ident %> Personal code: <%= @params[:registrant_ident] %>
<% else %> <% else %>
Business Registry code: <%= @domain.registrant_ident %> Business Registry code: <%= @params[:registrant_ident] %>
<% end %> <% end %>
Street: <%= @domain.registrant_street %> Street: <%= @params[:registrant_street] %>
City: <%= @domain.registrant_city %> City: <%= @params[:registrant_city] %>
Country: <%= @domain.registrant_country %> Country: <%= @params[:registrant_country] %>
The application will remain in pending status for <%= Setting.expire_pending_confirmation %> hrs and will be automaticcally rejected if it is not approved nor rejected before. The application will remain in pending status for <%= Setting.expire_pending_confirmation %> hrs and will be automaticcally rejected if it is not approved nor rejected before.
To confirm the update please visit this website, once again review the data and press approve: To confirm the update please visit this website, once again review the data and press approve:
<%= @verification_url %> <%= @params[:verification_url] %>
Best Regards, Best Regards,
Estonian Internet Foundation Estonian Internet Foundation

View file

@ -1,18 +1,18 @@
Tere, Tere,
<br><br> <br><br>
Domeeni <%= @domain.name %> registreerija vahetuse taotlus on kinnitatud ning andmed registris uuendatud. Domeeni <%= @params[:name] %> registreerija vahetuse taotlus on kinnitatud ning andmed registris uuendatud.
<br><br> <br><br>
Uued registreerija andmed:<br> Uue registreerija andmed:<br>
Nimi: <%= @domain.registrant_name %><br> Nimi: <%= @params[:registrant_name] %><br>
<% if @domain.registrant.priv? %> <% if @params[:registrant_priv] %>
Isikukood: <%= @domain.registrant_ident %><br> Isikukood: <%= @params[:registrant_ident] %><br>
<% else %> <% else %>
Äriregistrikood: <%= @domain.registrant_ident %><br> Äriregistrikood: <%= @params[:registrant_ident] %><br>
<% end %> <% end %>
Epost: <%= @domain.registrant_email %><br> Epost: <%= @params[:registrant_email] %><br>
Tänav: <%= @domain.registrant_street %><br> Tänav: <%= @params[:registrant_street] %><br>
Linn: <%= @domain.registrant_city %><br> Linn: <%= @params[:registrant_city] %><br>
Riik: <%= @domain.registrant_country %> Riik: <%= @params[:registrant_country] %>
<br><br> <br><br>
Lugupidamisega<br> Lugupidamisega<br>
Eesti Interneti SA Eesti Interneti SA
@ -21,19 +21,19 @@ Eesti Interneti SA
<br><br> <br><br>
Hi, Hi,
<br><br> <br><br>
Process for changing registrant of the domain <%= @domain.name %> has been approved and the data in the registry is updated. Process for changing registrant of the domain <%= @params[:name] %> has been approved and the data in the registry is updated.
<br><br> <br><br>
New registrant:<br> New registrant:<br>
Name: <%= @domain.registrant_name %><br> Name: <%= @params[:registrant_name] %><br>
<% if @domain.registrant.priv? %> <% if @params[:registrant_priv] %>
Personal code: <%= @domain.registrant_ident %><br> Personal code: <%= @params[:registrant_ident] %><br>
<% else %> <% else %>
Business Registry code: <%= @domain.registrant_ident %><br> Business Registry code: <%= @params[:registrant_ident] %><br>
<% end %> <% end %>
E-mail: <%= @domain.registrant_email %><br> E-mail: <%= @params[:registrant_email] %><br>
Street: <%= @domain.registrant_street %><br> Street: <%= @params[:registrant_street] %><br>
City: <%= @domain.registrant_city %><br> City: <%= @params[:registrant_city] %><br>
Country: <%= @domain.registrant_country %> Country: <%= @params[:registrant_country] %>
<br><br> <br><br>
Best Regards,<br> Best Regards,<br>
Estonian Internet Foundation Estonian Internet Foundation

View file

@ -1,18 +1,18 @@
Tere, Tere,
Domeeni <%= @domain.name %> registreerija vahetuse taotlus on kinnitatud ning andmed registris uuendatud. Domeeni <%= @params[:name] %> registreerija vahetuse taotlus on kinnitatud ning andmed registris uuendatud.
Uued registreerija andmed: Uue registreerija andmed:
Nimi: <%= @domain.registrant_name %> Nimi: <%= @params[:registrant_name] %>
<% if @domain.registrant.priv? %> <% if @params[:registrant_priv] %>
Isikukood: <%= @domain.registrant_ident %> Isikukood: <%= @params[:registrant_ident] %>
<% else %> <% else %>
Äriregistrikood: <%= @domain.registrant_ident %> Äriregistrikood: <%= @params[:registrant_ident] %>
<% end %> <% end %>
Epost: <%= @domain.registrant_email %> Epost: <%= @params[:registrant_email] %>
Tänav: <%= @domain.registrant_street %> Tänav: <%= @params[:registrant_street] %>
Linn: <%= @domain.registrant_city %> Linn: <%= @params[:registrant_city] %>
Riik: <%= @domain.registrant_country %> Riik: <%= @params[:registrant_country] %>
Lugupidamisega Lugupidamisega
Eesti Interneti SA Eesti Interneti SA
@ -21,19 +21,19 @@ Eesti Interneti SA
Hi, Hi,
Process for changing registrant of the domain <%= @domain.name %> has been approved and the data in the registry is updated. Process for changing registrant of the domain <%= @params[:name] %> has been approved and the data in the registry is updated.
New registrant: New registrant:
Name: <%= @domain.registrant_name %> Name: <%= @params[:registrant_name] %>
<% if @domain.registrant.priv? %> <% if @params[:registrant_priv] %>
Personal code: <%= @domain.registrant_ident %> Personal code: <%= @params[:registrant_ident] %>
<% else %> <% else %>
Business Registry code: <%= @domain.registrant_ident %> Business Registry code: <%= @params[:registrant_ident] %>
<% end %> <% end %>
E-mail: <%= @domain.registrant_email %> E-mail: <%= @params[:registrant_email] %>
Street: <%= @domain.registrant_street %> Street: <%= @params[:registrant_street] %>
City: <%= @domain.registrant_city %> City: <%= @params[:registrant_city] %>
Country: <%= @domain.registrant_country %> Country: <%= @params[:registrant_country] %>
Best Regards, Best Regards,
Estonian Internet Foundation Estonian Internet Foundation

View file

@ -1,9 +1,18 @@
Tere, Tere,
<br><br> <br><br>
Domeeni <%= @domain.name %> registreerija vahetuse taotlus on kinnitatud ning andmed registris uuendatud. Domeeni <%= @params[:name] %> registreerija vahetuse taotlus on kinnitatud ning andmed registris uuendatud.
<br><br> <br><br>
Uued registreerija:<br> Uue registreerija andmed:<br>
Nimi: <%= @domain.registrant_name %> Nimi: <%= @params[:new_registrant_name] %><br>
<% if @params[:registrant_priv] %>
Isikukood: <%= @params[:registrant_ident] %><br>
<% else %>
Äriregistrikood: <%= @params[:registrant_ident] %><br>
<% end %>
Epost: <%= @params[:registrant_email] %><br>
Tänav: <%= @params[:registrant_street] %><br>
Linn: <%= @params[:registrant_city] %><br>
Riik: <%= @params[:registrant_country] %>
<br><br> <br><br>
Lugupidamisega<br> Lugupidamisega<br>
Eesti Interneti SA Eesti Interneti SA
@ -12,10 +21,19 @@ Eesti Interneti SA
<br><br> <br><br>
Hi, Hi,
<br><br> <br><br>
Process for changing registrant of the domain <%= @domain.name %> has been approved and the data in the registry is updated. Process for changing registrant of the domain <%= @params[:name] %> has been approved and the data in the registry is updated.
<br><br> <br><br>
New registrant:<br> New registrant:<br>
Name: <%= @domain.registrant_name %> Name: <%= @params[:new_registrant_name] %><br>
<% if @params[:registrant_priv] %>
Personal code: <%= @params[:registrant_ident] %><br>
<% else %>
Business Registry code: <%= @params[:registrant_ident] %><br>
<% end %>
E-mail: <%= @params[:registrant_email] %><br>
Street: <%= @params[:registrant_street] %><br>
City: <%= @params[:registrant_city] %><br>
Country: <%= @params[:registrant_country] %>
<br><br> <br><br>
Best Regards,<br> Best Regards,<br>
Estonian Internet Foundation Estonian Internet Foundation

View file

@ -1,9 +1,19 @@
Tere, Tere,
Domeeni <%= @domain.name %> registreerija vahetuse taotlus on kinnitatud ning andmed registris uuendatud. Domeeni <%= @params[:name] %> registreerija vahetuse taotlus on kinnitatud ning andmed registris uuendatud.
Uued registreerija: Uue registreerija andmed:
Nimi: <%= @domain.registrant_name %> Nimi: <%= @params[:new_registrant_name] %>
<% if @params[:registrant_priv] %>
Isikukood: <%= @params[:registrant_ident] %>
<% else %>
Äriregistrikood: <%= @params[:registrant_ident] %>
<% end %>
Epost: <%= @params[:registrant_email] %>
Tänav: <%= @params[:registrant_street] %>
Linn: <%= @params[:registrant_city] %>
Riik: <%= @params[:registrant_country] %>
Lugupidamisega Lugupidamisega
Eesti Interneti SA Eesti Interneti SA
@ -12,10 +22,20 @@ Eesti Interneti SA
Hi, Hi,
Process for changing registrant of the domain <%= @domain.name %> has been approved and the data in the registry is updated. Process for changing registrant of the domain <%= @params[:name] %> has been approved and the data in the registry is updated.
New registrant: New registrant:
Name: <%= @domain.registrant_name %> Name: <%= @params[:new_registrant_name] %>
<% if @params[:registrant_priv] %>
Personal code: <%= @params[:registrant_ident] %>
<% else %>
Business Registry code: <%= @params[:registrant_ident] %>
<% end %>
E-mail: <%= @params[:registrant_email] %>
Street: <%= @params[:registrant_street] %>
City: <%= @params[:registrant_city] %>
Country: <%= @params[:registrant_country] %>
Best Regards, Best Regards,
Estonian Internet Foundation Estonian Internet Foundation

View file

@ -0,0 +1,30 @@
!!!
%html
%head
%meta{:content => "text/html; charset=utf-8", "http-equiv" => "Content-Type"}
%title Contacts
%body
.row
.col-md-12
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-2'}
=t(:name)
%th{class: 'col-xs-2'}
=t(:id)
%th{class: 'col-xs-2'}
=t(:ident)
%th{class: 'col-xs-2'}
=t(:created_at)
%th{class: 'col-xs-2'}
=t(:registrar)
%tbody
- @contacts.each do |contact|
%tr
%td= contact
%td= contact.code
%td= ident_for(contact)
%td= l(contact.created_at, format: :short)
%td= contact.registrar

View file

@ -2,23 +2,125 @@
= link_to(t(:new), new_registrar_contact_path, class: 'btn btn-primary') = link_to(t(:new), new_registrar_contact_path, class: 'btn btn-primary')
= render 'shared/title', name: t(:contacts) = render 'shared/title', name: t(:contacts)
- if @response .row
.table-responsive .col-md-12
%table.table.table-hover.table-condensed = search_form_for [:registrar, @q], html: { style: 'margin-bottom: 0;', class: 'js-form', autocomplete: 'off' } do |f|
%thead .row
%tr .col-md-3
%th{class: 'col-xs-3'}= t(:name) .form-group
%th{class: 'col-xs-3'}= t(:id) = f.label :name
%th{class: 'col-xs-3'}= t(:ident) = f.search_field :name_matches, value: params[:q][:name_matches], class: 'form-control', placeholder: t(:name)
%th{class: 'col-xs-3'}= t(:actions) .col-md-3
%tbody .form-group
- @contacts.each do |c| = f.label t(:id)
%tr = f.search_field :code_eq, class: 'form-control', placeholder: t(:id)
%td= link_to(c[:name], registrar_contact_path(id: c[:code])) .col-md-3
%td= c[:code] .form-group
%td= ident_for(c) = f.label t(:ident)
%td = f.search_field :ident_matches, class: 'form-control', placeholder: t(:ident)
= link_to(t(:edit), edit_registrar_contact_path(c[:code]), class: 'btn btn-primary btn-xs') .col-md-3
= link_to(t(:delete), delete_registrar_contact_path(c[:code]), class: 'btn btn-default btn-xs') .form-group
= label_tag t(:ident_type)
= select_tag '[q][ident_type_eq]', options_for_select(Contact::IDENT_TYPES, params[:q][:ident_type_eq]), { include_blank: true, placeholder: t(:choose), class: 'form-control selectize' }
.row
.col-md-3
.form-group
= f.label t(:email)
= f.search_field :email_matches, class: 'form-control', placeholder: t(:email)
.col-md-3
.form-group
= label_tag t(:country)
= select_tag '[q][country_code_eq]', SortedCountry.all_options(params[:q][:country_code_eq]), { include_blank: true, placeholder: t(:choose), class: 'form-control selectize' }
.col-md-6
.form-group
= label_tag t(:contact_type)
= select_tag '[q][domain_contacts_type_in]', options_for_select([['admin', 'AdminDomainContact'], ['tech', 'TechDomainContact'], ['registrant', 'registrant']], params[:q][:domain_contacts_type_in]), { multiple: true, placeholder: t(:choose), class: 'form-control js-combobox' }
.row
.col-md-3
.form-group
= f.label t(:registrar)
= f.select :registrar_id_eq, Registrar.all.map { |x| [x, x.id] }, { include_blank: true }, class: 'form-control selectize', placeholder: t(:choose)
.col-md-3
.form-group
= f.label t(:created_at_from)
= f.search_field :created_at_gteq, value: params[:q][:created_at_gteq], class: 'form-control datepicker', placeholder: t(:created_at_from)
.col-md-3
.form-group
= f.label t(:created_at_until)
= f.search_field :created_at_lteq, value: params[:q][:created_at_lteq], class: 'form-control datepicker', placeholder: t(:created_at_until)
.col-md-3
.form-group
= f.label t(:updated_at)
= f.search_field :updated_at_gteq, value: params[:q][:updated_at_gteq], class: 'form-control datepicker', placeholder: t(:updated_at)
.row
.col-md-6
.form-group
= label_tag t(:status)
= select_tag :statuses_contains, options_for_select(Contact::STATUSES, params[:statuses_contains]), { multiple: true, placeholder: t(:choose), class: 'form-control js-combobox' }
.col-md-3
.form-group
= label_tag t(:results_per_page)
= text_field_tag :results_per_page, params[:results_per_page], class: 'form-control', placeholder: t(:results_per_page)
.col-md-3{style: 'padding-top: 25px;'}
%button.btn.btn-primary
&nbsp;
%span.glyphicon.glyphicon-search
&nbsp;
%button.btn.btn-default.js-reset-form
= t(:clear_fields)
.row
.col-md-3
.btn-group{:role => "group"}
%button.btn.btn-default.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", :type => "button"}
Download
%span.caret
%ul.dropdown-menu
%li= link_to 'PDF', download_list_registrar_contacts_path(q: params[:q], format: "pdf")
%li= link_to 'CSV', download_list_registrar_contacts_path(q: params[:q], format: "csv")
.col-md-3
.col-md-3
.col-md-3
= paginate @paginatable_array %hr
.row
.col-md-12
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-2'}
= sort_link(@q, 'name', t(:name))
%th{class: 'col-xs-2'}
= sort_link(@q, 'code', t(:id))
%th{class: 'col-xs-2'}
= sort_link(@q, 'ident', t(:ident))
%th{class: 'col-xs-2'}
= sort_link(@q, 'email', t(:created_at))
%th{class: 'col-xs-2'}
= sort_link(@q, 'registrar_name', t(:registrar))
%th{class: 'col-xs-2'}= t(:actions)
%tbody
- @contacts.each do |contact|
%tr
%td= link_to(contact.name, registrar_contact_path(id: contact.code))
%td= contact.code
%td= ident_for(contact)
%td= l(contact.created_at, format: :short)
%td
- if contact.registrar
= contact.registrar
%td
= link_to(t(:edit), edit_registrar_contact_path(contact.code), class: 'btn btn-primary btn-xs')
= link_to(t(:delete), delete_registrar_contact_path(contact.code), class: 'btn btn-default btn-xs')
.row
.col-md-6
= paginate @contacts
.col-md-6.text-right
.pagination
= t(:result_count, count: @contacts.total_count)
:coffee
$(".js-reset-form").on "click", (e) ->
e.preventDefault();
window.location = "#{registrar_contacts_path}"

View file

@ -6,7 +6,7 @@
%dt= t(:id) %dt= t(:id)
%dd= @contact.id %dd= @contact.id
%dt= t(:password) %dt= t(:authinfo_pw)
%dd %dd
= text_field_tag :password, @contact.password, readonly: true, class: 'partially-hidden' = text_field_tag :password, @contact.password, readonly: true, class: 'partially-hidden'

View file

@ -3,7 +3,7 @@
%h3.panel-title= t(:general) %h3.panel-title= t(:general)
.panel-body .panel-body
%dl.dl-horizontal %dl.dl-horizontal
%dt= t(:password) %dt= t(:authinfo_pw)
%dd= @data.css('pw').text.present? ? @data.css('pw').text : t('hidden') %dd= @data.css('pw').text.present? ? @data.css('pw').text : t('hidden')
- if @data.css('pw').text.blank? - if @data.css('pw').text.blank?

View file

@ -30,7 +30,7 @@
%dt= t(:domain_name) %dt= t(:domain_name)
%dd= @data.css('name').text %dd= @data.css('name').text
%dt= t(:password) %dt= t(:authinfo_pw)
%dd= @data.css('pw').text %dd= @data.css('pw').text
- if @data.css('relative').text.present? - if @data.css('relative').text.present?

View file

@ -45,6 +45,8 @@ ca_cert_path: '/home/registry/registry/shared/ca/certs/ca.crt.pem'
ca_key_path: '/home/registry/registry/shared/ca/private/ca.key.pem' ca_key_path: '/home/registry/registry/shared/ca/private/ca.key.pem'
ca_key_password: 'your-root-key-password' ca_key_password: 'your-root-key-password'
directo_invoice_url: 'https://domain/ddddd.asp'
# #
# EPP # EPP

View file

@ -0,0 +1,40 @@
# A custom initializer that enables sorting via custom scopes in Ransack (like the same feature in MetaSearch)
module Ransack
module Adapters
module ActiveRecord
class Context < ::Ransack::Context
# Allows for sorting by custom scopes
#
#
# Define your custom scopes in your model, e. g. sort_by_title_asc and sort_by_title_desc
# (The scopes would sort by some calculated column or a column added via some crazy join, etc.)
#
# In your sort links refer to the scopes like to standard fields, e. g.
# <%= sort_link(@q, :title, 'Crazy calculated title') %>
def evaluate(search, opts = {})
viz = Visitor.new
relation = @object.where(viz.accept(search.base))
if search.sorts.any?
custom_scopes = search.sorts.select do |s|
custom_scope_name = :"sort_by_#{s.name}_#{s.dir}"
relation.respond_to?(custom_scope_name)
end
attribute_scopes = search.sorts - custom_scopes
relation = relation.except(:order)
custom_scopes.each do |s|
custom_scope_name = :"sort_by_#{s.name}_#{s.dir}"
relation = relation.public_send(custom_scope_name)
end
relation = relation.reorder(viz.accept(attribute_scopes)) if attribute_scopes.any?
end
opts[:distinct] ? relation.distinct : relation
end
end
end
end
end

View file

@ -35,10 +35,14 @@ if con.present? && con.table_exists?('settings')
Setting.save_default(:days_to_keep_invoices_active, 30) Setting.save_default(:days_to_keep_invoices_active, 30)
Setting.save_default(:days_to_keep_overdue_invoices_active, 30) Setting.save_default(:days_to_keep_overdue_invoices_active, 30)
Setting.save_default(:minimum_deposit, 0.0) Setting.save_default(:minimum_deposit, 0.0)
Setting.save_default(:directo_receipt_payment_term, "R")
Setting.save_default(:directo_receipt_product_name, "ETTEM06")
Setting.save_default(:directo_sales_agent, "JAANA")
Setting.save_default(:days_to_renew_domain_before_expire, 90) Setting.save_default(:days_to_renew_domain_before_expire, 90)
Setting.save_default(:expire_warning_period, 15) Setting.save_default(:expire_warning_period, 15)
Setting.save_default(:redemption_grace_period, 30) Setting.save_default(:redemption_grace_period, 30)
Setting.save_default(:expiration_reminder_mail, 2)
Setting.save_default(:registrar_ip_whitelist_enabled, true) Setting.save_default(:registrar_ip_whitelist_enabled, true)
Setting.save_default(:api_ip_whitelist_enabled, true) Setting.save_default(:api_ip_whitelist_enabled, true)

View file

@ -49,6 +49,7 @@ en:
ident: ident:
blank: "Required parameter missing - ident" blank: "Required parameter missing - ident"
invalid_EE_identity_format: "Ident not in valid Estonian identity format." invalid_EE_identity_format: "Ident not in valid Estonian identity format."
invalid_EE_identity_format_update: "Ident not in valid Estonian identity format. Please create new contact"
invalid_birthday_format: "Ident not in valid birthady format, should be YYYY-MM-DD" invalid_birthday_format: "Ident not in valid birthady format, should be YYYY-MM-DD"
invalid_country_code: "Ident country code is not valid, should be in ISO_3166-1 alpha 2 format" invalid_country_code: "Ident country code is not valid, should be in ISO_3166-1 alpha 2 format"
domains: domains:
@ -280,6 +281,7 @@ en:
domain_details: 'Domain details' domain_details: 'Domain details'
registered_at: 'Registered at' registered_at: 'Registered at'
password: 'Password' password: 'Password'
authinfo_pw: 'AuthInfo pw'
valid_from: 'Valid from' valid_from: 'Valid from'
general: 'General' general: 'General'
contacts: 'Contacts' contacts: 'Contacts'
@ -351,6 +353,8 @@ en:
status: 'Status' status: 'Status'
eedirekt: 'EEDirekt' eedirekt: 'EEDirekt'
contact: 'Contact' contact: 'Contact'
credit_balance: 'Credit balance'
starting_balance: 'Starting balance'
domain_transfer_requested: 'Domain transfer requested!' domain_transfer_requested: 'Domain transfer requested!'
domain_transfer_approved: 'Domain transfer approved!' domain_transfer_approved: 'Domain transfer approved!'
@ -555,6 +559,7 @@ en:
username: 'Username' username: 'Username'
password: 'Password' password: 'Password'
authinfo_pw: 'AuthInfo pw'
log_in: 'Log in' log_in: 'Log in'
domains: 'Domains' domains: 'Domains'
register: 'Register' register: 'Register'
@ -905,7 +910,7 @@ en:
edit_zone: 'Edit zone' edit_zone: 'Edit zone'
there_are_count_domains_in_this_zone: 'There are %{count} domains in this zone' there_are_count_domains_in_this_zone: 'There are %{count} domains in this zone'
poll_pending_update_confirmed_by_registrant: 'Registrant confirmed domain update' poll_pending_update_confirmed_by_registrant: 'Registrant confirmed domain update'
poll_pending_update_rejected_by_registranti: 'Registrant rejected domain update' poll_pending_update_rejected_by_registrant: 'Registrant rejected domain update'
poll_pending_delete_rejected_by_registrant: 'Registrant rejected domain deletion' poll_pending_delete_rejected_by_registrant: 'Registrant rejected domain deletion'
poll_pending_delete_confirmed_by_registrant: 'Registrant confirmed domain deletion' poll_pending_delete_confirmed_by_registrant: 'Registrant confirmed domain deletion'
manage: Manage manage: Manage
@ -927,3 +932,7 @@ en:
if_auth_info_is_left_empty_it_will_be_auto_generated: 'If auth info is left empty, it will be auto generated.' if_auth_info_is_left_empty_it_will_be_auto_generated: 'If auth info is left empty, it will be auto generated.'
each_domain_name_must_end_with_colon_sign: 'Each domain name must end with colon (:) sign.' each_domain_name_must_end_with_colon_sign: 'Each domain name must end with colon (:) sign.'
expiration_remind_subject: 'The %{name} domain has expired' expiration_remind_subject: 'The %{name} domain has expired'
add_reserved_domain: 'Add domain to reserved list'
add_blocked_domain: 'Add domain to blocked list'
edit_pw: 'Edit Pw'
optional: 'Optional'

View file

@ -74,6 +74,7 @@ Rails.application.routes.draw do
collection do collection do
get 'check' get 'check'
get 'download_list'
end end
end end
@ -220,8 +221,16 @@ Rails.application.routes.draw do
resources :settings resources :settings
resources :blocked_domains resources :blocked_domains do
resources :reserved_domains member do
get 'delete'
end
end
resources :reserved_domains do
member do
get 'delete'
end
end
resources :registrars do resources :registrars do
resources :api_users resources :api_users

View file

@ -53,6 +53,10 @@ if @cron_group == 'registry'
every 52.minutes do every 52.minutes do
runner 'Domain.start_redemption_grace_period' runner 'Domain.start_redemption_grace_period'
end end
every :day, at: '19:00pm' do
runner 'Directo.send_receipts'
end if @environment == 'production'
end end
every 10.minutes do every 10.minutes do

View file

@ -0,0 +1,18 @@
class NameAndPasswordForReservedDomain < ActiveRecord::Migration
def up
add_column :reserved_domains, :name, :string
add_column :reserved_domains, :password, :string
add_index :reserved_domains, :name
ReservedDomain.find_each do |domain|
names = domain.names
domain.update_columns(name: names.keys.first, password: names.values.first)
end
remove_column :reserved_domains, :names
end
def down
end
end

View file

@ -0,0 +1,11 @@
class NameAndPasswordForBlockedDomain < ActiveRecord::Migration
def up
add_column :blocked_domains, :name, :string
add_index :blocked_domains, :name
remove_column :blocked_domains, :names
end
def down
end
end

View file

@ -0,0 +1,10 @@
class CreateDirectos < ActiveRecord::Migration
def change
create_table :directos do |t|
t.belongs_to :item, index: true, polymorphic: true
t.json :response
t.timestamps null: false
end
end
end

View file

@ -0,0 +1,5 @@
class AddInDirectoToInvoice < ActiveRecord::Migration
def change
add_column :invoices, :in_directo, :boolean, default: false
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: 20151029152638) do ActiveRecord::Schema.define(version: 20160108135436) 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"
@ -135,13 +135,15 @@ ActiveRecord::Schema.define(version: 20151029152638) do
end end
create_table "blocked_domains", force: :cascade do |t| create_table "blocked_domains", force: :cascade do |t|
t.string "names", array: true
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
t.string "creator_str" t.string "creator_str"
t.string "updator_str" t.string "updator_str"
t.string "name"
end end
add_index "blocked_domains", ["name"], name: "index_blocked_domains_on_name", using: :btree
create_table "cached_nameservers", id: false, force: :cascade do |t| create_table "cached_nameservers", id: false, force: :cascade do |t|
t.string "hostname", limit: 255 t.string "hostname", limit: 255
t.string "ipv4", limit: 255 t.string "ipv4", limit: 255
@ -240,19 +242,20 @@ ActiveRecord::Schema.define(version: 20151029152638) do
end end
create_table "dnskeys", force: :cascade do |t| create_table "dnskeys", force: :cascade do |t|
t.integer "domain_id" t.integer "domain_id"
t.integer "flags" t.integer "flags"
t.integer "protocol" t.integer "protocol"
t.integer "alg" t.integer "alg"
t.text "public_key" t.text "public_key"
t.integer "delegation_signer_id" t.integer "delegation_signer_id"
t.string "ds_key_tag" t.string "ds_key_tag"
t.integer "ds_alg" t.integer "ds_alg"
t.integer "ds_digest_type" t.integer "ds_digest_type"
t.string "ds_digest" t.string "ds_digest"
t.string "creator_str" t.string "creator_str"
t.string "updator_str" t.string "updator_str"
t.integer "legacy_domain_id" t.integer "legacy_domain_id"
t.datetime "updated_at"
end end
add_index "dnskeys", ["delegation_signer_id"], name: "index_dnskeys_on_delegation_signer_id", using: :btree add_index "dnskeys", ["delegation_signer_id"], name: "index_dnskeys_on_delegation_signer_id", using: :btree
@ -336,6 +339,7 @@ ActiveRecord::Schema.define(version: 20151029152638) do
end end
add_index "domains", ["delete_at"], name: "index_domains_on_delete_at", using: :btree add_index "domains", ["delete_at"], name: "index_domains_on_delete_at", using: :btree
add_index "domains", ["name"], name: "index_domains_on_name", unique: true, using: :btree
add_index "domains", ["outzone_at"], name: "index_domains_on_outzone_at", using: :btree add_index "domains", ["outzone_at"], name: "index_domains_on_outzone_at", using: :btree
add_index "domains", ["registrant_id"], name: "index_domains_on_registrant_id", using: :btree add_index "domains", ["registrant_id"], name: "index_domains_on_registrant_id", using: :btree
add_index "domains", ["registrant_verification_asked_at"], name: "index_domains_on_registrant_verification_asked_at", using: :btree add_index "domains", ["registrant_verification_asked_at"], name: "index_domains_on_registrant_verification_asked_at", using: :btree
@ -442,9 +446,7 @@ ActiveRecord::Schema.define(version: 20151029152638) do
t.integer "documentable_id" t.integer "documentable_id"
t.string "documentable_type" t.string "documentable_type"
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at"
t.string "creator_str" t.string "creator_str"
t.string "updator_str"
t.string "path" t.string "path"
end end
@ -739,21 +741,6 @@ ActiveRecord::Schema.define(version: 20151029152638) do
add_index "log_keyrelays", ["item_type", "item_id"], name: "index_log_keyrelays_on_item_type_and_item_id", using: :btree add_index "log_keyrelays", ["item_type", "item_id"], name: "index_log_keyrelays_on_item_type_and_item_id", using: :btree
add_index "log_keyrelays", ["whodunnit"], name: "index_log_keyrelays_on_whodunnit", using: :btree add_index "log_keyrelays", ["whodunnit"], name: "index_log_keyrelays_on_whodunnit", using: :btree
create_table "log_legal_documents", force: :cascade do |t|
t.string "item_type", null: false
t.integer "item_id", null: false
t.string "event", null: false
t.string "whodunnit"
t.json "object"
t.json "object_changes"
t.datetime "created_at"
t.string "session"
t.json "children"
end
add_index "log_legal_documents", ["item_type", "item_id"], name: "index_log_legal_documents_on_item_type_and_item_id", using: :btree
add_index "log_legal_documents", ["whodunnit"], name: "index_log_legal_documents_on_whodunnit", using: :btree
create_table "log_messages", force: :cascade do |t| create_table "log_messages", force: :cascade do |t|
t.string "item_type", null: false t.string "item_type", null: false
t.integer "item_id", null: false t.integer "item_id", null: false
@ -910,10 +897,10 @@ ActiveRecord::Schema.define(version: 20151029152638) do
create_table "nameservers", force: :cascade do |t| create_table "nameservers", force: :cascade do |t|
t.string "hostname" t.string "hostname"
t.string "ipv4" 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" 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"
@ -1011,9 +998,13 @@ ActiveRecord::Schema.define(version: 20151029152638) do
t.datetime "updated_at" t.datetime "updated_at"
t.string "creator_str" t.string "creator_str"
t.string "updator_str" t.string "updator_str"
t.hstore "names" t.integer "legacy_id"
t.string "name"
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"

View file

@ -73,7 +73,7 @@ admin3 = {
[admin1, admin2, admin3].each do |at| [admin1, admin2, admin3].each do |at|
admin = AdminUser.where(at) admin = AdminUser.where(at)
next if admin.present? next if admin.present?
admin = AdminUser.new(at.merge({ password_confirmation: 'testtest' })) admin = AdminUser.new(at.merge({ password_confirmation: 'testtest', password: 'testtest' }))
admin.roles = ['admin'] admin.roles = ['admin']
admin.save admin.save
end end

View file

@ -39,6 +39,242 @@ COMMENT ON EXTENSION hstore IS 'data type for storing sets of (key, value) pairs
SET search_path = public, pg_catalog; SET search_path = public, pg_catalog;
--
-- Name: change_ident_country(); Type: FUNCTION; Schema: public; Owner: -
--
CREATE FUNCTION change_ident_country() RETURNS boolean
LANGUAGE plpgsql
AS $_$
DECLARE
changed BOOLEAN;
multiplier INT [];
multiplier2 INT [];
multiplier3 INT [];
multiplier4 INT [];
r RECORD;
control TEXT;
total INT;
i INT;
mod INT;
counter INT;
BEGIN
multiplier := ARRAY [1, 2, 3, 4, 5, 6, 7, 8, 9, 1];
multiplier2 := ARRAY [3, 4, 5, 6, 7, 8, 9, 1, 2, 3];
multiplier3 := ARRAY [1, 2, 3, 4, 5, 6, 7];
multiplier4 := ARRAY [3, 4, 5, 6, 7, 8, 9];
FOR r IN SELECT id, ident FROM contacts WHERE ident_type = 'priv' /*AND ident_country_code IS NULL*/
LOOP
IF (length(r.ident) = 11 AND (r.ident ~ '^[0-9]+$') AND (substring(r.ident, 1, 1) = '3' OR substring(r.ident, 1, 1) = '4' OR substring(r.ident, 1, 1) = '5' OR substring(r.ident, 1, 1) = '6'))
THEN
total := 0;
counter := 1;
FOREACH i IN ARRAY multiplier
LOOP
total := (total + (i * to_number(substring(r.ident, counter, 1), '9')));
counter := (counter + 1);
END LOOP;
mod := (total % 11);
counter := 1;
IF (mod >= 10)
THEN
total = 0;
FOREACH i IN ARRAY multiplier2
LOOP
total := (total + (i * to_number(substring(r.ident, counter, 1), '9')));
counter := (counter + 1);
END LOOP;
mod := (total % 11);
END IF;
IF (mod < 10 AND substring(r.ident, 11, 1) = to_char(mod, 'FM999MI'))
THEN
UPDATE contacts SET ident_country_code = 'EE' WHERE id = r.id;
END IF;
total = 0;
END IF;
END LOOP;
FOR r IN SELECT id, ident FROM contacts WHERE ident_type = 'org'
LOOP
IF (length(r.ident) = 8 AND (r.ident ~ '^[0-9]+$') AND (substring(r.ident, 1, 1) = '1' OR substring(r.ident, 1, 1) = '8' OR substring(r.ident, 1, 1) = '9'))
THEN
total := 0;
counter := 1;
FOREACH i IN ARRAY multiplier3
LOOP
total := (total + (i * to_number(substring(r.ident, counter, 1), '9')));
counter := (counter + 1);
END LOOP;
mod := total % 11;
total = 0;
counter := 1;
IF (mod >= 10)
THEN
total = 0;
FOREACH i IN ARRAY multiplier4
LOOP
total := (total + (i * to_number(substring(r.ident, counter, 1), '9')));
counter := (counter + 1);
END LOOP;
mod := (total % 11);
END IF;
IF (mod < 10 AND (substring(r.ident, 8, 1) = to_char(mod, 'FM999MI')))
THEN
UPDATE contacts SET ident_country_code = 'EE' WHERE id = r.id;
END IF;
END IF;
END LOOP;
RETURN changed;
END;
$_$;
--
-- Name: change_ident_country(integer, text); Type: FUNCTION; Schema: public; Owner: -
--
CREATE FUNCTION change_ident_country(id integer, type text) RETURNS boolean
LANGUAGE plpgsql
AS $_$
DECLARE
changed BOOLEAN;
multiplier int[];
multiplier2 int[];
code int;
BEGIN
multiplier := ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 1];
multiplier2 := ARRAY[3, 4, 5, 6, 7, 8, 9, 1, 2, 3];
code := (SELECT code FROM contacts WHERE id = 208 AND ident_country_code = 'EE');
UPDATE contacts
SET ident = ''
WHERE id = $1 and ident_type = $2 AND ident_country_code = 'EE'
AND ident = '';
RETURN changed;
END;
$_$;
--
-- Name: fill_ident_country(); Type: FUNCTION; Schema: public; Owner: -
--
CREATE FUNCTION fill_ident_country() RETURNS boolean
LANGUAGE plpgsql
AS $_$
DECLARE
changed BOOLEAN;
multiplier INT [];
multiplier2 INT [];
multiplier3 INT [];
multiplier4 INT [];
r RECORD;
control TEXT;
total INT;
i INT;
mod INT;
counter INT;
BEGIN
multiplier := ARRAY [1, 2, 3, 4, 5, 6, 7, 8, 9, 1];
multiplier2 := ARRAY [3, 4, 5, 6, 7, 8, 9, 1, 2, 3];
multiplier3 := ARRAY [1, 2, 3, 4, 5, 6, 7];
multiplier4 := ARRAY [3, 4, 5, 6, 7, 8, 9];
FOR r IN SELECT id, ident FROM contacts WHERE ident_type = 'priv' AND ident_country_code IS NULL
LOOP
IF (length(r.ident) = 11 AND (r.ident ~ '^[0-9]+$') AND (substring(r.ident, 1, 1) = '3' OR substring(r.ident, 1, 1) = '4' OR substring(r.ident, 1, 1) = '5' OR substring(r.ident, 1, 1) = '6'))
THEN
total := 0;
counter := 1;
FOREACH i IN ARRAY multiplier
LOOP
total := (total + (i * to_number(substring(r.ident, counter, 1), '9')));
counter := (counter + 1);
END LOOP;
mod := (total % 11);
counter := 1;
IF (mod >= 10)
THEN
total = 0;
FOREACH i IN ARRAY multiplier2
LOOP
total := (total + (i * to_number(substring(r.ident, counter, 1), '9')));
counter := (counter + 1);
END LOOP;
mod := (total % 11);
END IF;
IF (mod = 10)
THEN
mod := 0;
END IF;
IF (substring(r.ident, 11, 1) = to_char(mod, 'FM999MI'))
THEN
UPDATE contacts SET ident_country_code = 'EE' WHERE id = r.id;
END IF;
total := 0;
END IF;
END LOOP;
FOR r IN SELECT id, ident FROM contacts WHERE ident_type = 'org' AND ident_country_code IS NULL
LOOP
IF (length(r.ident) = 8 AND (r.ident ~ '^[0-9]+$') AND (substring(r.ident, 1, 1) = '1' OR substring(r.ident, 1, 1) = '8' OR substring(r.ident, 1, 1) = '9'))
THEN
total := 0;
counter := 1;
FOREACH i IN ARRAY multiplier3
LOOP
total := (total + (i * to_number(substring(r.ident, counter, 1), '9')));
counter := (counter + 1);
END LOOP;
mod := total % 11;
total := 0;
counter := 1;
IF (mod >= 10)
THEN
total = 0;
FOREACH i IN ARRAY multiplier4
LOOP
total := (total + (i * to_number(substring(r.ident, counter, 1), '9')));
counter := (counter + 1);
END LOOP;
mod := (total % 11);
END IF;
IF (mod = 10)
THEN
mod := 0;
END IF;
IF (substring(r.ident, 8, 1) = to_char(mod, 'FM999MI'))
THEN
UPDATE contacts SET ident_country_code = 'EE' WHERE id = r.id;
END IF;
END IF;
END LOOP;
RETURN changed;
END;
$_$;
-- --
-- Name: generate_zonefile(character varying); Type: FUNCTION; Schema: public; Owner: - -- Name: generate_zonefile(character varying); Type: FUNCTION; Schema: public; Owner: -
-- --
@ -55,7 +291,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text
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
@ -82,10 +318,6 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text
ret = concat(tmp_var, chr(10), chr(10)); 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 -- ns records
SELECT array_to_string( SELECT array_to_string(
array( array(
@ -93,17 +325,26 @@ 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)
ORDER BY d.name ORDER BY d.name
), ),
chr(10) chr(10)
) INTO tmp_var; ) INTO tmp_var;
ret := concat(ret, tmp_var, chr(10), chr(10)); ret := concat(ret, '; Zone NS Records', chr(10), tmp_var, chr(10), chr(10));
-- origin a glue records -- a glue records for origin nameservers
SELECT a_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; SELECT array_to_string(
ret := concat(ret, '; Zone A Records', chr(10), tmp_var, chr(10)); array(
SELECT concat(ns.hostname, '. IN A ', ns.ipv4)
FROM nameservers ns
JOIN domains d ON d.id = ns.domain_id
WHERE d.name = i_origin
AND ns.hostname LIKE '%.' || d.name
AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> ''
), chr(10)
) INTO tmp_var;
ret := concat(ret, '; Zone A Records', chr(10), tmp_var);
-- a glue records for other nameservers -- a glue records for other nameservers
SELECT array_to_string( SELECT array_to_string(
@ -115,15 +356,43 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text
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 EXISTS ( -- filter out glue records that already appeared in origin glue recrods
SELECT 1 FROM nameservers nsi
JOIN domains di ON nsi.domain_id = di.id
WHERE di.name = i_origin
AND nsi.hostname = ns.hostname
)
), chr(10) ), chr(10)
) INTO tmp_var; ) INTO tmp_var;
ret := concat(ret, tmp_var, chr(10), chr(10)); -- TODO This is a possible subtitition to the previous query, stress testing is needed to see which is faster
-- origin aaaa glue records -- SELECT ns.*
SELECT a4_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; -- FROM nameservers ns
ret := concat(ret, '; Zone AAAA Records', chr(10), tmp_var, chr(10)); -- JOIN domains d ON d.id = ns.domain_id
-- WHERE d.name LIKE '%ee' AND d.name NOT LIKE '%pri.ee'
-- AND ns.hostname LIKE '%.' || d.name
-- AND d.name <> 'ee'
-- AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> ''
-- AND ns.hostname NOT IN (
-- SELECT ns.hostname FROM domains d JOIN nameservers ns ON d.id = ns.domain_id WHERE d.name = 'ee'
-- )
ret := concat(ret, chr(10), tmp_var, chr(10), chr(10));
-- aaaa glue records for origin nameservers
SELECT array_to_string(
array(
SELECT concat(ns.hostname, '. IN AAAA ', ns.ipv6)
FROM nameservers ns
JOIN domains d ON d.id = ns.domain_id
WHERE d.name = i_origin
AND ns.hostname LIKE '%.' || d.name
AND ns.ipv6 IS NOT NULL AND ns.ipv6 <> ''
), chr(10)
) INTO tmp_var;
ret := concat(ret, '; Zone AAAA Records', chr(10), tmp_var);
-- aaaa glue records for other nameservers -- aaaa glue records for other nameservers
SELECT array_to_string( SELECT array_to_string(
@ -135,23 +404,27 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text
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 EXISTS ( -- filter out glue records that already appeared in origin glue recrods
SELECT 1 FROM nameservers nsi
JOIN domains di ON nsi.domain_id = di.id
WHERE di.name = i_origin
AND nsi.hostname = ns.hostname
)
), chr(10) ), chr(10)
) INTO tmp_var; ) INTO tmp_var;
ret := concat(ret, tmp_var, chr(10), chr(10)); ret := concat(ret, chr(10), tmp_var, chr(10), chr(10));
-- ds records -- ds records
SELECT array_to_string( SELECT array_to_string(
array( array(
SELECT concat( SELECT concat(
d.name_puny, '. IN DS ', dk.ds_key_tag, ' ', d.name_puny, '. 3600 IN DS ', dk.ds_key_tag, ' ',
dk.ds_alg, ' ', dk.ds_digest_type, ' ( ', dk.ds_digest, ' )' dk.ds_alg, ' ', dk.ds_digest_type, ' ', dk.ds_digest
) )
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 NOT ('{serverHold,clientHold}' && d.statuses)
), ),
chr(10) chr(10)
) INTO tmp_var; ) INTO tmp_var;
@ -457,11 +730,11 @@ ALTER SEQUENCE banklink_transactions_id_seq OWNED BY banklink_transactions.id;
CREATE TABLE blocked_domains ( CREATE TABLE blocked_domains (
id integer NOT NULL, id integer NOT NULL,
names 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,
creator_str character varying, creator_str character varying,
updator_str character varying updator_str character varying,
name character varying
); );
@ -745,7 +1018,8 @@ CREATE TABLE dnskeys (
ds_digest character varying, ds_digest character varying,
creator_str character varying, creator_str character varying,
updator_str character varying, updator_str character varying,
legacy_domain_id integer legacy_domain_id integer,
updated_at timestamp without time zone
); );
@ -1130,9 +1404,7 @@ CREATE TABLE legal_documents (
documentable_id integer, documentable_id integer,
documentable_type character varying, documentable_type character varying,
created_at timestamp without time zone, created_at timestamp without time zone,
updated_at timestamp without time zone,
creator_str character varying, creator_str character varying,
updator_str character varying,
path character varying path character varying
); );
@ -1863,43 +2135,6 @@ CREATE SEQUENCE log_keyrelays_id_seq
ALTER SEQUENCE log_keyrelays_id_seq OWNED BY log_keyrelays.id; ALTER SEQUENCE log_keyrelays_id_seq OWNED BY log_keyrelays.id;
--
-- Name: log_legal_documents; Type: TABLE; Schema: public; Owner: -; Tablespace:
--
CREATE TABLE log_legal_documents (
id integer NOT NULL,
item_type character varying NOT NULL,
item_id integer NOT NULL,
event character varying NOT NULL,
whodunnit character varying,
object json,
object_changes json,
created_at timestamp without time zone,
session character varying,
children json
);
--
-- Name: log_legal_documents_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE log_legal_documents_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: log_legal_documents_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE log_legal_documents_id_seq OWNED BY log_legal_documents.id;
-- --
-- Name: log_messages; Type: TABLE; Schema: public; Owner: -; Tablespace: -- Name: log_messages; Type: TABLE; Schema: public; Owner: -; Tablespace:
-- --
@ -2313,10 +2548,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,
@ -2560,7 +2795,9 @@ CREATE TABLE reserved_domains (
updated_at timestamp without time zone, updated_at timestamp without time zone,
creator_str character varying, creator_str character varying,
updator_str character varying, updator_str character varying,
names hstore legacy_id integer,
name character varying,
password character varying
); );
@ -3126,13 +3363,6 @@ ALTER TABLE ONLY log_invoices ALTER COLUMN id SET DEFAULT nextval('log_invoices_
ALTER TABLE ONLY log_keyrelays ALTER COLUMN id SET DEFAULT nextval('log_keyrelays_id_seq'::regclass); ALTER TABLE ONLY log_keyrelays ALTER COLUMN id SET DEFAULT nextval('log_keyrelays_id_seq'::regclass);
--
-- Name: id; Type: DEFAULT; Schema: public; Owner: -
--
ALTER TABLE ONLY log_legal_documents ALTER COLUMN id SET DEFAULT nextval('log_legal_documents_id_seq'::regclass);
-- --
-- Name: id; Type: DEFAULT; Schema: public; Owner: - -- Name: id; Type: DEFAULT; Schema: public; Owner: -
-- --
@ -3645,14 +3875,6 @@ ALTER TABLE ONLY log_keyrelays
ADD CONSTRAINT log_keyrelays_pkey PRIMARY KEY (id); ADD CONSTRAINT log_keyrelays_pkey PRIMARY KEY (id);
--
-- Name: log_legal_documents_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
--
ALTER TABLE ONLY log_legal_documents
ADD CONSTRAINT log_legal_documents_pkey PRIMARY KEY (id);
-- --
-- Name: log_messages_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- Name: log_messages_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
-- --
@ -3880,6 +4102,13 @@ CREATE INDEX index_accounts_on_registrar_id ON accounts USING btree (registrar_i
CREATE INDEX index_api_users_on_registrar_id ON api_users USING btree (registrar_id); CREATE INDEX index_api_users_on_registrar_id ON api_users USING btree (registrar_id);
--
-- Name: index_blocked_domains_on_name; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
CREATE INDEX index_blocked_domains_on_name ON blocked_domains USING btree (name);
-- --
-- Name: index_cached_nameservers_on_hostname_and_ipv4_and_ipv6; Type: INDEX; Schema: public; Owner: -; Tablespace: -- Name: index_cached_nameservers_on_hostname_and_ipv4_and_ipv6; Type: INDEX; Schema: public; Owner: -; Tablespace:
-- --
@ -3985,6 +4214,13 @@ CREATE INDEX index_domain_transfers_on_domain_id ON domain_transfers USING btree
CREATE INDEX index_domains_on_delete_at ON domains USING btree (delete_at); CREATE INDEX index_domains_on_delete_at ON domains USING btree (delete_at);
--
-- Name: index_domains_on_name; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
CREATE UNIQUE INDEX index_domains_on_name ON domains USING btree (name);
-- --
-- Name: index_domains_on_outzone_at; Type: INDEX; Schema: public; Owner: -; Tablespace: -- Name: index_domains_on_outzone_at; Type: INDEX; Schema: public; Owner: -; Tablespace:
-- --
@ -4349,20 +4585,6 @@ CREATE INDEX index_log_keyrelays_on_item_type_and_item_id ON log_keyrelays USING
CREATE INDEX index_log_keyrelays_on_whodunnit ON log_keyrelays USING btree (whodunnit); CREATE INDEX index_log_keyrelays_on_whodunnit ON log_keyrelays USING btree (whodunnit);
--
-- Name: index_log_legal_documents_on_item_type_and_item_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
CREATE INDEX index_log_legal_documents_on_item_type_and_item_id ON log_legal_documents USING btree (item_type, item_id);
--
-- Name: index_log_legal_documents_on_whodunnit; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
CREATE INDEX index_log_legal_documents_on_whodunnit ON log_legal_documents USING btree (whodunnit);
-- --
-- Name: index_log_messages_on_item_type_and_item_id; Type: INDEX; Schema: public; Owner: -; Tablespace: -- Name: index_log_messages_on_item_type_and_item_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
-- --
@ -4510,6 +4732,13 @@ CREATE INDEX index_registrant_verifications_on_domain_id ON registrant_verificat
CREATE INDEX index_registrars_on_code ON registrars USING btree (code); CREATE INDEX index_registrars_on_code ON registrars USING btree (code);
--
-- 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:
-- --
@ -4947,5 +5176,27 @@ INSERT INTO schema_migrations (version) VALUES ('20150921110152');
INSERT INTO schema_migrations (version) VALUES ('20150921111842'); INSERT INTO schema_migrations (version) VALUES ('20150921111842');
INSERT INTO schema_migrations (version) VALUES ('20151028183132');
INSERT INTO schema_migrations (version) VALUES ('20151029152638'); INSERT INTO schema_migrations (version) VALUES ('20151029152638');
INSERT INTO schema_migrations (version) VALUES ('20151112160452');
INSERT INTO schema_migrations (version) VALUES ('20151117081204');
INSERT INTO schema_migrations (version) VALUES ('20151120090455');
INSERT INTO schema_migrations (version) VALUES ('20151124200353');
INSERT INTO schema_migrations (version) VALUES ('20151125155601');
INSERT INTO schema_migrations (version) VALUES ('20151127091716');
INSERT INTO schema_migrations (version) VALUES ('20151130175654');
INSERT INTO schema_migrations (version) VALUES ('20151202123506');
INSERT INTO schema_migrations (version) VALUES ('20160106092052');
INSERT INTO schema_migrations (version) VALUES ('20160108135436');

View file

@ -3,15 +3,24 @@ namespace :whois do
task regenerate: :environment do task regenerate: :environment do
start = Time.zone.now.to_f start = Time.zone.now.to_f
@i = 0
print "-----> Regenerate Registry whois_records table and sync with whois server..." print "-----> Regenerate Registry whois_records table and sync with whois server..."
ActiveRecord::Base.uncached do ActiveRecord::Base.uncached do
puts "\n#{@i}"
Domain.included.find_in_batches(batch_size: 10000) do |batch| print "\n-----> Update domains whois_records"
batch.map(&:update_whois_record) Domain.find_in_batches.each do |group|
puts(@i += 10000) UpdateWhoisRecordJob.enqueue group.map(&:id), 'domain'
GC.start
end end
print "\n-----> Update blocked domains whois_records"
BlockedDomain.find_in_batches.each do |group|
UpdateWhoisRecordJob.enqueue group.map(&:id), 'blocked'
end
print "\n-----> Update reserved domains whois_records"
ReservedDomain.find_in_batches.each do |group|
UpdateWhoisRecordJob.enqueue group.map(&:id), 'reserved'
end
end end
puts "\n-----> all done in #{(Time.zone.now.to_f - start).round(2)} seconds" puts "\n-----> all done in #{(Time.zone.now.to_f - start).round(2)} seconds"
end end

View file

@ -0,0 +1,5 @@
require 'rails_helper'
RSpec.describe Directo, type: :model do
pending "add some examples to (or delete) #{__FILE__}"
end