diff --git a/CHANGELOG.md b/CHANGELOG.md
index d77d6b6a9..68391b057 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+21.09.2015
+* eis-1.0.xsd schema file updated without a new version, please publish a new updated schema file to public.
+
+17.09.2015
+* deploy-example.rb has been updated with `@cron_group`.
+
11.08.2015
* Possible to add whitelist_emails_for_staging list at application.yml
diff --git a/Gemfile b/Gemfile
index 8bf19fd3b..b52a299cd 100644
--- a/Gemfile
+++ b/Gemfile
@@ -25,6 +25,7 @@ gem 'validates_email_format_of', '1.6.3' # validates email against RFC 2822 and
gem 'paper_trail',
github: 'airblade/paper_trail',
ref: 'a453811226ec4ea59753ba6b827e390ced2fc140'
+# NB! if this gets upgraded, ensure Setting.reload_settings! still works correctly
gem 'rails-settings-cached', '0.4.1' # for settings
# html-xml
diff --git a/app/controllers/admin/account_activities_controller.rb b/app/controllers/admin/account_activities_controller.rb
new file mode 100644
index 000000000..1c447d8a6
--- /dev/null
+++ b/app/controllers/admin/account_activities_controller.rb
@@ -0,0 +1,27 @@
+class Admin::AccountActivitiesController < AdminController
+ load_and_authorize_resource
+
+ def index # rubocop: disable Metrics/AbcSize
+ params[:q] ||= {}
+
+ ca_cache = params[:q][:created_at_lteq]
+ begin
+ end_time = params[:q][:created_at_lteq].try(:to_date)
+ params[:q][:created_at_lteq] = end_time.try(:end_of_day)
+ rescue
+ logger.warn('Invalid date')
+ end
+
+ @q = AccountActivity.includes(:invoice, account: :registrar).search(params[:q])
+ @q.sorts = 'id desc' if @q.sorts.empty?
+
+ respond_to do |format|
+ format.html { @account_activities = @q.result.page(params[:page]) }
+ format.csv do
+ send_data @q.result.to_csv, filename: "account_activities_#{Time.zone.now.to_formatted_s(:number)}.csv"
+ end
+ end
+
+ params[:q][:created_at_lteq] = ca_cache
+ end
+end
diff --git a/app/controllers/admin/reserved_domains_controller.rb b/app/controllers/admin/reserved_domains_controller.rb
index eb3a5faae..b83500083 100644
--- a/app/controllers/admin/reserved_domains_controller.rb
+++ b/app/controllers/admin/reserved_domains_controller.rb
@@ -11,6 +11,7 @@ class Admin::ReservedDomainsController < AdminController
begin
names = YAML.load(params[:reserved_domains])
+ fail if names == false
rescue
flash.now[:alert] = I18n.t('invalid_yaml')
logger.warn 'Invalid YAML'
diff --git a/app/controllers/admin/white_ips_controller.rb b/app/controllers/admin/white_ips_controller.rb
index 7c0ecb184..059094614 100644
--- a/app/controllers/admin/white_ips_controller.rb
+++ b/app/controllers/admin/white_ips_controller.rb
@@ -51,6 +51,6 @@ class Admin::WhiteIpsController < AdminController
end
def white_ip_params
- params.require(:white_ip).permit(:ipv4, :ipv6, :interface, :registrar_id)
+ params.require(:white_ip).permit(:ipv4, :ipv6, :registrar_id, { interfaces: [] })
end
end
diff --git a/app/controllers/epp/contacts_controller.rb b/app/controllers/epp/contacts_controller.rb
index 2ee87d24c..5b0a39bbf 100644
--- a/app/controllers/epp/contacts_controller.rb
+++ b/app/controllers/epp/contacts_controller.rb
@@ -126,9 +126,6 @@ class Epp::ContactsController < EppController
contact_org_disabled
fax_disabled
status_editing_disabled
- if params[:parsed_frame].css('ident').present?
- epp_errors << { code: '2306', msg: "#{I18n.t(:ident_update_error)} [ident]" }
- end
requires 'id'
@prefix = nil
end
diff --git a/app/controllers/epp/domains_controller.rb b/app/controllers/epp/domains_controller.rb
index d3111ddfa..1e778b839 100644
--- a/app/controllers/epp/domains_controller.rb
+++ b/app/controllers/epp/domains_controller.rb
@@ -63,7 +63,6 @@ class Epp::DomainsController < EppController
def delete
authorize! :delete, @domain, @password
-
# all includes for bullet
@domain = Epp::Domain.where(id: @domain.id).includes(nameservers: :versions).first
diff --git a/app/controllers/registrar/dashboard_controller.rb b/app/controllers/registrar/dashboard_controller.rb
new file mode 100644
index 000000000..cdbc70b0c
--- /dev/null
+++ b/app/controllers/registrar/dashboard_controller.rb
@@ -0,0 +1,11 @@
+class Registrar::DashboardController < RegistrarController
+ authorize_resource class: false
+
+ def show
+ if can?(:show, :poll)
+ redirect_to registrar_poll_url and return
+ elsif can?(:show, Invoice)
+ redirect_to registrar_invoices_url and return
+ end
+ end
+end
diff --git a/app/controllers/registrar/domains_controller.rb b/app/controllers/registrar/domains_controller.rb
index c6595cb03..374f09d4a 100644
--- a/app/controllers/registrar/domains_controller.rb
+++ b/app/controllers/registrar/domains_controller.rb
@@ -46,7 +46,7 @@ class Registrar::DomainsController < Registrar::DeppController # EPP controller
# rubocop: enable Metrics/AbcSize
def info
- authorize! :view, Depp::Domain
+ authorize! :info, Depp::Domain
@data = @domain.info(params[:domain_name]) if params[:domain_name]
if response_ok?
render 'info'
@@ -57,7 +57,7 @@ class Registrar::DomainsController < Registrar::DeppController # EPP controller
end
def check
- authorize! :view, Depp::Domain
+ authorize! :check, Depp::Domain
if params[:domain_name]
@data = @domain.check(params[:domain_name])
render 'check_index' and return unless response_ok?
diff --git a/app/controllers/registrar/polls_controller.rb b/app/controllers/registrar/polls_controller.rb
index 9dd284512..e29f02f67 100644
--- a/app/controllers/registrar/polls_controller.rb
+++ b/app/controllers/registrar/polls_controller.rb
@@ -1,13 +1,12 @@
class Registrar::PollsController < Registrar::DeppController # EPP controller
+ authorize_resource class: false
before_action :init_epp_xml
def show
- authorize! :view, :registrar_dashboard
@data = depp_current_user.request(@ex.poll)
end
def destroy
- authorize! :delete, :registrar_poll
@data = depp_current_user.request(@ex.poll(poll: {
value: '', attrs: { op: 'ack', msgID: params[:id] }
}))
@@ -18,22 +17,22 @@ class Registrar::PollsController < Registrar::DeppController # EPP controller
render 'show'
end
- def confirm_keyrelay
- authorize! :confirm, :keyrelay
- domain_params = params[:domain]
- @data = @domain.confirm_keyrelay(domain_params)
+ # TODO: Keyrelay is disabled for now
+ # def confirm_keyrelay
+ # authorize! :confirm, :keyrelay
+ # domain_params = params[:domain]
+ # @data = @domain.confirm_keyrelay(domain_params)
- if response_ok?
- redirect_to info_registrar_domains_url(domain_name: domain_params[:name])
- else
- @results = @data.css('result')
- @data = depp_current_user.request(@ex.poll)
- render 'show'
- end
- end
+ # if response_ok?
+ # redirect_to info_registrar_domains_url(domain_name: domain_params[:name])
+ # else
+ # @results = @data.css('result')
+ # @data = depp_current_user.request(@ex.poll)
+ # render 'show'
+ # end
+ # end
def confirm_transfer
- authorize! :confirm, :transfer
domain_params = params[:domain]
@data = @domain.confirm_transfer(domain_params)
diff --git a/app/controllers/registrar/sessions_controller.rb b/app/controllers/registrar/sessions_controller.rb
index b28dfdcf0..ff97c4f2c 100644
--- a/app/controllers/registrar/sessions_controller.rb
+++ b/app/controllers/registrar/sessions_controller.rb
@@ -47,10 +47,10 @@ class Registrar::SessionsController < Devise::SessionsController
end
end
- if @depp_user.errors.none? && @depp_user.valid?
+ if @depp_user.errors.none?
if @api_user.active?
sign_in @api_user
- redirect_to role_base_root_url(@api_user)
+ redirect_to registrar_root_url
else
@depp_user.errors.add(:base, :not_active)
render 'login'
@@ -70,18 +70,11 @@ class Registrar::SessionsController < Devise::SessionsController
flash[:alert] = I18n.t(:ip_is_not_whitelisted)
redirect_to :back and return
end
-
- if @api_user.can?(:create, :epp_login)
- unless @api_user.registrar.api_ip_white?(request.ip)
- flash[:alert] = I18n.t(:ip_is_not_whitelisted)
- redirect_to :back and return
- end
- end
end
sign_in @api_user if @api_user.identity_code == current_user.identity_code
- redirect_to :back
+ redirect_to registrar_root_url
end
# rubocop:enable Metrics/CyclomaticComplexity
# rubocop:enable Metrics/PerceivedComplexity
@@ -91,7 +84,7 @@ class Registrar::SessionsController < Devise::SessionsController
if @user
sign_in(@user, event: :authentication)
- redirect_to role_base_root_url(@user)
+ redirect_to registrar_root_url
else
flash[:alert] = t('no_such_user')
redirect_to registrar_login_url
@@ -111,7 +104,7 @@ class Registrar::SessionsController < Devise::SessionsController
if Rails.env.test? && phone == "123"
@user = ApiUser.find_by(identity_code: "14212128025")
sign_in(@user, event: :authentication)
- return redirect_to role_base_root_url(@user)
+ return redirect_to registrar_root_url
end
# country_codes = {'+372' => 'EST'}
@@ -159,7 +152,7 @@ class Registrar::SessionsController < Devise::SessionsController
sign_in @user
flash[:notice] = t(:welcome)
flash.keep(:notice)
- render js: "window.location = '#{role_base_root_url(@user)}'"
+ render js: "window.location = '#{registrar_root_url}'"
when 'NOT_VALID'
render json: { message: t(:user_signature_is_invalid) }, status: :bad_request
when 'EXPIRED_TRANSACTION'
@@ -196,12 +189,4 @@ class Registrar::SessionsController < Devise::SessionsController
return if WhiteIp.registrar_ip_white?(request.ip)
render text: t('access_denied') and return
end
-
- def role_base_root_url(user)
- if user.try(:roles) == ['billing']
- registrar_invoices_url
- else
- registrar_root_url
- end
- end
end
diff --git a/app/controllers/registrar/xml_consoles_controller.rb b/app/controllers/registrar/xml_consoles_controller.rb
index 83c20383b..31ec3eafc 100644
--- a/app/controllers/registrar/xml_consoles_controller.rb
+++ b/app/controllers/registrar/xml_consoles_controller.rb
@@ -1,10 +1,10 @@
class Registrar::XmlConsolesController < Registrar::DeppController # EPP controller
+ authorize_resource class: false
+
def show
- authorize! :view, :registrar_xml_console
end
def create
- authorize! :create, :registrar_xml_console
begin
@result = depp_current_user.server.request(params[:payload])
rescue
@@ -14,7 +14,6 @@ class Registrar::XmlConsolesController < Registrar::DeppController # EPP control
end
def load_xml
- authorize! :create, :registrar_xml_console
cl_trid = "#{depp_current_user.tag}-#{Time.zone.now.to_i}"
xml_dir_path = Rails.root + 'app/views/registrar/xml_consoles/epp_requests'
xml = File.read("#{xml_dir_path}/#{params[:obj]}/#{params[:epp_action]}.xml")
diff --git a/app/controllers/registrar_controller.rb b/app/controllers/registrar_controller.rb
index a665cee09..47d596fd3 100644
--- a/app/controllers/registrar_controller.rb
+++ b/app/controllers/registrar_controller.rb
@@ -9,8 +9,6 @@ class RegistrarController < ApplicationController
false
end
- # rubocop:disable Metrics/PerceivedComplexity
- # rubocop:disable Metrics/CyclomaticComplexity
def check_ip
return unless current_user
unless current_user.is_a? ApiUser
@@ -20,21 +18,20 @@ class RegistrarController < ApplicationController
return if Rails.env.development?
registrar_ip_whitelisted = current_user.registrar.registrar_ip_white?(request.ip)
- api_ip_whitelisted = true
- if current_user.can?(:create, :epp_request)
- api_ip_whitelisted = current_user.registrar.api_ip_white?(request.ip)
- end
-
- return if registrar_ip_whitelisted && api_ip_whitelisted
+ return if registrar_ip_whitelisted
flash[:alert] = t('ip_is_not_whitelisted')
sign_out(current_user)
redirect_to registrar_login_path and return
end
- # rubocop:enable Metrics/PerceivedComplexity
- # rubocop:enable Metrics/CyclomaticComplexity
helper_method :head_title_sufix
def head_title_sufix
t(:registrar_head_title_sufix)
end
+
+ private
+
+ def current_ability
+ @current_ability ||= Ability.new(current_user, request.remote_ip)
+ end
end
diff --git a/app/mailers/domain_mailer.rb b/app/mailers/domain_mailer.rb
index 8544af6a7..a8c79f66d 100644
--- a/app/mailers/domain_mailer.rb
+++ b/app/mailers/domain_mailer.rb
@@ -20,7 +20,7 @@ class DomainMailer < ApplicationMailer
return if whitelist_blocked?(@old_registrant.email)
mail(to: format(@old_registrant.email),
- subject: "#{I18n.t(:pending_update_request_for_old_registrant_subject,
+ subject: "#{I18n.t(:pending_update_request_for_old_registrant_subject,
name: @domain.name)} [#{@domain.name}]")
end
@@ -43,7 +43,7 @@ class DomainMailer < ApplicationMailer
return if whitelist_blocked?(@new_registrant.email)
mail(to: format(@new_registrant.email),
- subject: "#{I18n.t(:pending_update_notification_for_new_registrant_subject,
+ subject: "#{I18n.t(:pending_update_notification_for_new_registrant_subject,
name: @domain.name)} [#{@domain.name}]")
end
@@ -53,19 +53,19 @@ class DomainMailer < ApplicationMailer
return if whitelist_blocked?(@domain.registrant_email)
mail(to: format(@domain.registrant_email),
- subject: "#{I18n.t(:registrant_updated_notification_for_new_registrant_subject,
+ subject: "#{I18n.t(:registrant_updated_notification_for_new_registrant_subject,
name: @domain.name)} [#{@domain.name}]")
end
def registrant_updated_notification_for_old_registrant(domain)
@domain = domain
return if delivery_off?(@domain)
-
+
@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,
+ subject: "#{I18n.t(:registrant_updated_notification_for_old_registrant_subject,
name: @domain.name)} [#{@domain.name}]")
end
@@ -73,12 +73,12 @@ class DomainMailer < ApplicationMailer
@domain = 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']
+ @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,
+ subject: "#{I18n.t(:pending_update_rejected_notification_for_new_registrant_subject,
name: @domain.name)} [#{@domain.name}]")
end
@@ -86,8 +86,8 @@ class DomainMailer < ApplicationMailer
@domain = 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']
+ @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?
@@ -95,7 +95,7 @@ class DomainMailer < ApplicationMailer
return
end
mail(to: format(@new_registrant_email),
- subject: "#{I18n.t(:pending_update_expired_notification_for_new_registrant_subject,
+ subject: "#{I18n.t(:pending_update_expired_notification_for_new_registrant_subject,
name: @domain.name)} [#{@domain.name}]")
end
@@ -120,7 +120,7 @@ class DomainMailer < ApplicationMailer
return if whitelist_blocked?(@old_registrant.email)
mail(to: format(@old_registrant.email),
- subject: "#{I18n.t(:domain_pending_deleted_subject,
+ subject: "#{I18n.t(:domain_pending_deleted_subject,
name: @domain.name)} [#{@domain.name}]")
end
@@ -140,7 +140,7 @@ class DomainMailer < ApplicationMailer
return if whitelist_blocked?(@domain.registrant.email)
mail(to: format(@domain.registrant.email),
- subject: "#{I18n.t(:pending_delete_rejected_notification_subject,
+ subject: "#{I18n.t(:pending_delete_rejected_notification_subject,
name: @domain.name)} [#{@domain.name}]")
end
@@ -150,7 +150,7 @@ class DomainMailer < ApplicationMailer
return if whitelist_blocked?(@domain.registrant.email)
mail(to: format(@domain.registrant.email),
- subject: "#{I18n.t(:pending_delete_expired_notification_subject,
+ subject: "#{I18n.t(:pending_delete_expired_notification_subject,
name: @domain.name)} [#{@domain.name}]")
end
@@ -159,7 +159,18 @@ class DomainMailer < ApplicationMailer
return if whitelist_blocked?(@domain.registrant.email)
mail(to: format(@domain.registrant.email),
- subject: "#{I18n.t(:delete_confirmation_subject,
+ subject: "#{I18n.t(:delete_confirmation_subject,
name: @domain.name)} [#{@domain.name}]")
end
+
+ def force_delete(domain)
+ @domain = domain
+ emails = ([@domain.registrant.email] + @domain.admin_contacts.map { |x| format(x.email) }).uniq
+ return if whitelist_blocked?(emails)
+
+ formatted_emails = emails.map { |x| format(x) }
+ mail(to: formatted_emails,
+ subject: "#{I18n.t(:force_delete_subject)}"
+ )
+ end
end
diff --git a/app/models/ability.rb b/app/models/ability.rb
index fc874f129..cf98cb704 100644
--- a/app/models/ability.rb
+++ b/app/models/ability.rb
@@ -4,7 +4,8 @@ class Ability
# rubocop: disable Metrics/PerceivedComplexity
# rubocop: disable Metrics/LineLength
# rubocop: disable Metrics/AbcSize
- def initialize(user)
+ def initialize(user, ip = nil)
+ @ip = ip
alias_action :show, to: :view
alias_action :show, :create, :update, :destroy, to: :crud
@@ -29,20 +30,28 @@ class Ability
#
def super # Registrar/api_user dynamic role
- static_registrar
epp
billing
end
def epp # Registrar/api_user dynamic role
- static_registrar
+ can :view, :registrar_dashboard
+
+ if @user.registrar.api_ip_white?(@ip)
+ can :manage, :poll
+ can :manage, Depp::Contact
+ # can :manage, Depp::Keyrelay # TODO: Keyrelay is disabled for now
+ # can :confirm, :keyrelay # TODO: Keyrelay is disabled for now
+ can :manage, :xml_console
+ can :manage, Depp::Domain
+ end
# REPP
can(:manage, :repp)
# EPP
- can(:create, :epp_login) # billing can establis epp connection in order to login
- can(:create, :epp_request)
+ can(:create, :epp_login) # billing can establish epp connection in order to login
+ # can(:create, :epp_request)
# Epp::Domain
can(:info, Epp::Domain) { |d, pw| d.registrar_id == @user.registrar_id || pw.blank? ? true : d.auth_info == pw }
@@ -70,7 +79,6 @@ class Ability
can(:manage, Invoice) { |i| i.buyer_id == @user.registrar_id }
can :manage, :deposit
can :read, AccountActivity
- can(:create, :epp_login) # billing can establis epp connection in order to login
end
def customer_service # Admin/admin_user dynamic role
@@ -99,6 +107,7 @@ class Ability
can :manage, MailTemplate
can :manage, Invoice
can :manage, WhiteIp
+ can :manage, AccountActivity
can :read, ApiLog::EppLog
can :read, ApiLog::ReppLog
can :update, :pending
@@ -107,23 +116,6 @@ class Ability
can :access, :settings_menu
end
- #
- # Static roles, linked from dynamic roles
- #
- def static_registrar
- can :manage, Nameserver
- can :view, :registrar_dashboard
- can :delete, :registrar_poll
- can :manage, :registrar_xml_console
- can :manage, Depp::Contact
- can :manage, Depp::Domain
- can :renew, Depp::Domain
- can :transfer, Depp::Domain
- can :manage, Depp::Keyrelay
- can :confirm, :keyrelay
- can :confirm, :transfer
- end
-
def static_registrant
can :manage, :registrant_domains
can :manage, :registrant_whois
diff --git a/app/models/contact.rb b/app/models/contact.rb
index 09552c636..b6be9f76d 100644
--- a/app/models/contact.rb
+++ b/app/models/contact.rb
@@ -23,7 +23,7 @@ class Contact < ActiveRecord::Base
validates :ident,
format: { with: /\d{4}-\d{2}-\d{2}/, message: :invalid_birthday_format },
if: proc { |c| c.ident_type == 'birthday' }
- validates :ident_country_code, presence: true, if: proc { |c| %w(bic priv).include? c.ident_type }
+ validates :ident_country_code, presence: true, if: proc { |c| %w(org priv).include? c.ident_type }
validates :code,
uniqueness: { message: :epp_id_taken },
format: { with: /\A[\w\-\:]*\Z/i, message: :invalid },
@@ -34,6 +34,7 @@ class Contact < ActiveRecord::Base
after_initialize do
self.statuses = [] if statuses.nil?
self.status_notes = {} if status_notes.nil?
+ self.ident_updated_at = Time.zone.now if new_record? && ident_updated_at.blank?
end
before_validation :set_ident_country_code
@@ -64,13 +65,13 @@ class Contact < ActiveRecord::Base
scope :current_registrars, ->(id) { where(registrar_id: id) }
- BIC = 'bic'
+ ORG = 'org'
PRIV = 'priv'
BIRTHDAY = 'birthday'
PASSPORT = 'passport'
IDENT_TYPES = [
- BIC, # Company registry code (or similar)
+ ORG, # Company registry code (or similar)
PRIV, # National idendtification number
BIRTHDAY # Birthday date
]
@@ -173,7 +174,7 @@ class Contact < ActiveRecord::Base
unless Rails.env.test?
orphans.each do |m|
- STDOUT << "#{Time.zone.now.utc} Contact.destroy_orphans: ##{m.id}\n"
+ STDOUT << "#{Time.zone.now.utc} Contact.destroy_orphans: ##{m.id} (#{m.name})\n"
end
end
@@ -226,12 +227,13 @@ class Contact < ActiveRecord::Base
false
end
- def bic?
- ident_type == BIC
+ def org?
+ ident_type == ORG
end
+ # it might mean priv or birthday type
def priv?
- ident_type != BIC
+ !org?
end
def generate_auth_info
diff --git a/app/models/depp/contact.rb b/app/models/depp/contact.rb
index 316d78818..0fa9f777a 100644
--- a/app/models/depp/contact.rb
+++ b/app/models/depp/contact.rb
@@ -10,9 +10,9 @@ module Depp
DISABLED = 'Disabled'
DISCLOSURE_TYPES = [DISABLED, '1', '0']
- TYPES = %w( bic priv birthday )
+ TYPES = %w( org priv birthday )
SELECTION_TYPES = [
- ['Business code', 'bic'],
+ ['Business code', 'org'],
['Personal identification code', 'priv'],
['Birthday', 'birthday']
]
@@ -163,7 +163,7 @@ module Depp
}
hash[:id] = nil if code.blank?
- create_xml = Depp::Contact.epp_xml.create(hash, extension_xml)
+ create_xml = Depp::Contact.epp_xml.create(hash, extension_xml(:create))
data = Depp::Contact.user.request(create_xml)
self.id = data.css('id').text
@@ -210,7 +210,7 @@ module Depp
}
}
},
- extension_xml
+ extension_xml(:update)
)
data = Depp::Contact.user.request(update_xml)
handle_errors(data)
@@ -224,20 +224,36 @@ module Depp
id: { value: id },
authInfo: { pw: { value: password } }
},
- extension_xml
+ extension_xml(:delete)
)
data = Depp::Contact.user.request(delete_xml)
handle_errors(data)
end
- def extension_xml
+ # rubocop:disable Metrics/CyclomaticComplexity
+ # rubocop:disable Style/NegatedIf
+ # rubocop:disable Style/RedundantSelf
+ def extension_xml(action)
xml = { _anonymus: [] }
- ident = ident_xml[:_anonymus].try(:first) unless persisted?
+
+ case action
+ when :create
+ ident = ident_xml[:_anonymus].try(:first)
+ when :update
+ # detect if any ident has changed, nb! ident and self.ident is not always same
+ if !(ident == self.ident && ident == self.ident_type && ident_country_code == self.ident_country_code)
+ ident = ident_xml[:_anonymus].try(:first)
+ end
+ end
+
legal = legal_document_xml[:_anonymus].try(:first)
xml[:_anonymus] << ident if ident.present?
xml[:_anonymus] << legal if legal.present?
xml
end
+ # rubocop:enable Metrics/CyclomaticComplexity
+ # rubocop:enable Style/NegatedIf
+ # rubocop:enable Style/RedundantSelf
def ident_xml
{
@@ -267,8 +283,8 @@ module Depp
Country.new(country_code)
end
- def bic?
- ident_type == 'bic'
+ def org?
+ ident_type == 'org'
end
def priv?
diff --git a/app/models/domain.rb b/app/models/domain.rb
index b5fbe0fed..1ea6a1cc6 100644
--- a/app/models/domain.rb
+++ b/app/models/domain.rb
@@ -9,6 +9,7 @@ class Domain < ActiveRecord::Base
belongs_to :registrar
belongs_to :registrant
+ # TODO: should we user validates_associated :registrant here?
has_many :admin_domain_contacts
accepts_nested_attributes_for :admin_domain_contacts, allow_destroy: true
@@ -215,7 +216,9 @@ class Domain < ActiveRecord::Base
DomainMailer.pending_delete_expired_notification(domain).deliver_now
end
domain.clean_pendings!
- STDOUT << "#{Time.zone.now.utc} Domain.clean_expired_pendings: ##{domain.id}\n" unless Rails.env.test?
+ unless Rails.env.test?
+ STDOUT << "#{Time.zone.now.utc} Domain.clean_expired_pendings: ##{domain.id} (#{domain.name})\n"
+ end
end
STDOUT << "#{Time.zone.now.utc} - Successfully cancelled #{count} domain pendings\n" unless Rails.env.test?
count
@@ -232,7 +235,7 @@ class Domain < ActiveRecord::Base
domains.each do |domain|
next unless domain.expirable?
domain.set_graceful_expired
- STDOUT << "#{Time.zone.now.utc} Domain.start_expire_period: ##{domain.id} #{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(validate: false)
end
@@ -246,7 +249,7 @@ class Domain < ActiveRecord::Base
d.each do |domain|
next unless domain.server_holdable?
domain.statuses << DomainStatus::SERVER_HOLD
- STDOUT << "#{Time.zone.now.utc} Domain.start_redemption_grace_period: ##{domain.id} #{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
end
@@ -260,7 +263,7 @@ class Domain < ActiveRecord::Base
d.each do |domain|
next unless domain.delete_candidateable?
domain.statuses << DomainStatus::DELETE_CANDIDATE
- STDOUT << "#{Time.zone.now.utc} Domain.start_delete_period: ##{domain.id} #{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
end
@@ -269,24 +272,26 @@ class Domain < ActiveRecord::Base
end
# rubocop:disable Rails/FindEach
+ # rubocop:disable Metrics/AbcSize
def destroy_delete_candidates
STDOUT << "#{Time.zone.now.utc} - Destroying domains\n" unless Rails.env.test?
c = 0
Domain.where("statuses @> '{deleteCandidate}'::varchar[]").each do |x|
x.destroy
- STDOUT << "#{Time.zone.now.utc} Domain.destroy_delete_candidates: by deleteCandidate ##{x.id}\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?
c += 1
end
Domain.where('force_delete_at <= ?', Time.zone.now).each do |x|
x.destroy
- STDOUT << "#{Time.zone.now.utc} Domain.destroy_delete_candidates: by force delete time ##{x.id}\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
end
STDOUT << "#{Time.zone.now.utc} - Successfully destroyed #{c} domains\n" unless Rails.env.test?
end
+ # rubocop: enable Metrics/AbcSize
# rubocop:enable Rails/FindEach
# rubocop: enable Metrics/LineLength
end
@@ -330,7 +335,6 @@ class Domain < ActiveRecord::Base
end
def server_holdable?
- return false if outzone_at > Time.zone.now
return false if statuses.include?(DomainStatus::SERVER_HOLD)
return false if statuses.include?(DomainStatus::SERVER_MANUAL_INZONE)
true
@@ -587,6 +591,7 @@ class Domain < ActiveRecord::Base
registrar.messages.create!(
body: I18n.t('force_delete_set_on_domain', domain: name)
)
+ DomainMailer.force_delete(self).deliver_now
return true
end
false
@@ -613,7 +618,6 @@ class Domain < ActiveRecord::Base
statuses << DomainStatus::EXPIRED
end
- # TODO: This looks odd - outzone_at and delete_at will be the same value?
def set_expired
# TODO: currently valid_to attribute update logic is open
# self.valid_to = valid_from + self.class.convert_period_to_time(period, period_unit)
@@ -642,7 +646,7 @@ class Domain < ActiveRecord::Base
end
def pending_update_prohibited?
- (statuses & [
+ (statuses_was & [
DomainStatus::CLIENT_UPDATE_PROHIBITED,
DomainStatus::SERVER_UPDATE_PROHIBITED,
DomainStatus::PENDING_CREATE,
@@ -666,17 +670,24 @@ class Domain < ActiveRecord::Base
end
def pending_delete_prohibited?
- (statuses & [
+ (statuses_was & [
DomainStatus::CLIENT_DELETE_PROHIBITED,
DomainStatus::SERVER_DELETE_PROHIBITED,
+ DomainStatus::CLIENT_UPDATE_PROHIBITED,
+ DomainStatus::SERVER_UPDATE_PROHIBITED,
DomainStatus::PENDING_CREATE,
- DomainStatus::PENDING_UPDATE,
- DomainStatus::PENDING_DELETE,
DomainStatus::PENDING_RENEW,
- DomainStatus::PENDING_TRANSFER
+ DomainStatus::PENDING_TRANSFER,
+ DomainStatus::PENDING_UPDATE,
+ DomainStatus::PENDING_DELETE
]).present?
end
+ # let's use positive method names
+ def pending_deletable?
+ !pending_delete_prohibited?
+ end
+
def set_pending_delete
if pending_delete_prohibited?
logger.info "DOMAIN STATUS UPDATE ISSUE ##{id}: PENDING_DELETE not allowed to set. [#{statuses}]"
@@ -685,13 +696,25 @@ class Domain < ActiveRecord::Base
statuses << DomainStatus::PENDING_DELETE
end
+ def set_server_hold
+ statuses << DomainStatus::SERVER_HOLD
+ end
+
+ # rubocop: disable Metrics/CyclomaticComplexity
+ # rubocop: disable Metrics/PerceivedComplexity
def manage_automatic_statuses
if statuses.empty? && valid?
statuses << DomainStatus::OK
elsif statuses.length > 1 || !valid?
statuses.delete(DomainStatus::OK)
end
+
+ p_d = statuses.include?(DomainStatus::PENDING_DELETE)
+ s_h = (statuses & [DomainStatus::SERVER_MANUAL_INZONE, DomainStatus::SERVER_HOLD]).empty?
+ statuses << DomainStatus::SERVER_HOLD if p_d && s_h
end
+ # rubocop: enable Metrics/CyclomaticComplexity
+ # rubocop: enable Metrics/PerceivedComplexity
def children_log
log = HashWithIndifferentAccess.new
diff --git a/app/models/domain_status.rb b/app/models/domain_status.rb
index 66908c16e..3f88de39f 100644
--- a/app/models/domain_status.rb
+++ b/app/models/domain_status.rb
@@ -122,40 +122,40 @@ class DomainStatus < ActiveRecord::Base
class << self
def admin_statuses
[
- SERVER_HOLD,
+ SERVER_HOLD,
# sync with admin_statuses_map
- # SERVER_MANUAL_INZONE,
- # SERVER_RENEW_PROHIBITED,
+ # SERVER_MANUAL_INZONE,
+ # SERVER_RENEW_PROHIBITED,
# SERVER_TRANSFER_PROHIBITED,
# SERVER_REGISTRANT_CHANGE_PROHIBITED,
- # SERVER_ADMIN_CHANGE_PROHIBITED,
+ # SERVER_ADMIN_CHANGE_PROHIBITED,
# SERVER_TECH_CHANGE_PROHIBITED,
- SERVER_DELETE_PROHIBITED,
+ SERVER_DELETE_PROHIBITED,
SERVER_UPDATE_PROHIBITED
]
end
def admin_statuses_map
[
- ['Hold', SERVER_HOLD],
+ ['Hold', SERVER_HOLD],
# sync with admin_statuses
- # ['ManualInzone', SERVER_MANUAL_INZONE],
+ # ['ManualInzone', SERVER_MANUAL_INZONE],
# [''],
- # ['RenewProhibited', SERVER_RENEW_PROHIBITED],
- # ['TransferProhibited', SERVER_TRANSFER_PROHIBITED],
+ # ['RenewProhibited', SERVER_RENEW_PROHIBITED],
+ ['TransferProhibited', SERVER_TRANSFER_PROHIBITED],
# ['RegistrantChangeProhibited', SERVER_REGISTRANT_CHANGE_PROHIBITED],
- # ['AdminChangeProhibited', SERVER_ADMIN_CHANGE_PROHIBITED],
+ # ['AdminChangeProhibited', SERVER_ADMIN_CHANGE_PROHIBITED],
# ['TechChangeProhibited', SERVER_TECH_CHANGE_PROHIBITED],
# [''],
- ['UpdateProhibited', SERVER_UPDATE_PROHIBITED],
+ ['UpdateProhibited', SERVER_UPDATE_PROHIBITED],
['DeleteProhibited', SERVER_DELETE_PROHIBITED]
]
end
def admin_not_deletable_statuses
[
- OK,
- INACTIVE,
+ OK,
+ INACTIVE,
FORCE_DELETE,
PENDING_CREATE,
PENDING_DELETE,
diff --git a/app/models/epp/contact.rb b/app/models/epp/contact.rb
index 3136beabd..57bf9192a 100644
--- a/app/models/epp/contact.rb
+++ b/app/models/epp/contact.rb
@@ -118,6 +118,7 @@ class Epp::Contact < Contact
[:ident, :invalid_EE_identity_format],
[:ident, :invalid_birthday_format],
[:ident, :invalid_country_code],
+ [:ident_type, :missing],
[:code, :invalid],
[:code, :too_long_contact_code]
],
@@ -132,6 +133,7 @@ class Epp::Contact < Contact
}
end
+ # rubocop:disable Metrics/AbcSize
def update_attributes(frame)
return super if frame.blank?
at = {}.with_indifferent_access
@@ -144,8 +146,23 @@ class Epp::Contact < Contact
legal_frame = frame.css('legalDocument').first
at[:legal_documents_attributes] = self.class.legal_document_attrs(legal_frame)
self.deliver_emails = true # turn on email delivery for epp
+
+ # allow to update ident code for legacy contacts
+ if frame.css('ident').first.present?
+ 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
+
super(at)
end
+ # rubocop:enable Metrics/AbcSize
def statuses_attrs(frame, action)
status_list = status_list_from(frame)
diff --git a/app/models/epp/domain.rb b/app/models/epp/domain.rb
index 27c88cd59..c8ceef2dc 100644
--- a/app/models/epp/domain.rb
+++ b/app/models/epp/domain.rb
@@ -9,11 +9,24 @@ class Epp::Domain < Domain
false
end
- before_validation :validate_contacts
+ after_validation :validate_contacts
def validate_contacts
- return if contacts.map(&:valid?).all?
- add_epp_error('2304', nil, nil, I18n.t(:object_status_prohibits_operation))
- false
+ ok = true
+ active_admins = admin_domain_contacts.select { |x| !x.marked_for_destruction? }
+ active_techs = tech_domain_contacts.select { |x| !x.marked_for_destruction? }
+
+ # bullet workaround
+ ac = active_admins.map { |x| Contact.find(x.contact_id) }
+ tc = active_techs.map { |x| Contact.find(x.contact_id) }
+
+ # validate registrant here as well
+ ([registrant] + ac + tc).each do |x|
+ unless x.valid?
+ add_epp_error('2304', nil, nil, I18n.t(:contact_is_not_valid, value: x.code))
+ ok = false
+ end
+ end
+ ok
end
before_save :link_contacts
@@ -124,7 +137,7 @@ class Epp::Domain < Domain
return if registrant.blank?
regt = Registrant.find(registrant.id) # temp for bullet
tech_contacts << regt if tech_domain_contacts.blank?
- admin_contacts << regt if admin_domain_contacts.blank? && regt.priv?
+ admin_contacts << regt if admin_domain_contacts.blank? && !regt.org?
end
# rubocop: disable Metrics/PerceivedComplexity
@@ -270,7 +283,7 @@ class Epp::Domain < Domain
end
if action != 'rem'
- if x['type'] == 'admin' && c.bic?
+ if x['type'] == 'admin' && c.org?
add_epp_error('2306', 'contact', x.text, [:domain_contacts, :admin_contact_can_be_only_private_person])
next
end
@@ -485,10 +498,22 @@ class Epp::Domain < Domain
manage_automatic_statuses
true # aka 1001 pending_delete
else
- set_expired!
+ set_pending_delete!
end
end
+ def set_pending_delete!
+ throw :epp_error, {
+ code: '2304',
+ msg: I18n.t(:object_status_prohibits_operation)
+ } unless pending_deletable?
+
+ self.delete_at = Time.zone.now + Setting.redemption_grace_period.days
+ set_pending_delete
+ set_server_hold if server_holdable?
+ save(validate: false)
+ end
+
### RENEW ###
def renew(cur_exp_date, period, unit = 'y')
@@ -512,7 +537,6 @@ class Epp::Domain < Domain
### TRANSFER ###
- # rubocop: disable Metrics/PerceivedComplexity
# rubocop: disable Metrics/CyclomaticComplexity
def transfer(frame, action, current_user)
case action
@@ -540,29 +564,15 @@ class Epp::Domain < Domain
oc = c.deep_clone
oc.code = nil
oc.registrar_id = registrar_id
+ oc.copy_from_id = c.id
oc.prefix_code
oc.save!(validate: false)
oc
end
- def transfer_contact(contact_id, registrar_id)
- oc = Contact.find(contact_id) # n+1 workaround
- oc.registrar_id = registrar_id
- oc.generate_new_code!
- oc.save!(validate: false)
- oc
- end
-
def transfer_registrant(registrar_id)
return if registrant.registrar_id == registrar_id
-
- is_other_domains_contact = DomainContact.where('contact_id = ? AND domain_id != ?', registrant_id, id).count > 0
- if registrant.registrant_domains.count > 1 || is_other_domains_contact
- oc = copy_and_transfer_contact(registrant_id, registrar_id)
- self.registrant_id = oc.id
- else
- transfer_contact(registrant_id, registrar_id)
- end
+ self.registrant_id = copy_and_transfer_contact(registrant_id, registrar_id).id
end
def transfer_domain_contacts(registrar_id)
@@ -570,22 +580,14 @@ class Epp::Domain < Domain
contacts.each do |c|
next if copied_ids.include?(c.id) || c.registrar_id == registrar_id
- is_other_domains_contact = DomainContact.where('contact_id = ? AND domain_id != ?', c.id, id).count > 0
- # if contact used to be owner contact but was copied, then contact must be transferred
- # (registrant_id_was != c.id)
- if c.domains.count > 1 || is_other_domains_contact
- # copy contact
- if registrant_id_was == c.id # owner contact was copied previously, do not copy it again
- oc = OpenStruct.new(id: registrant_id)
- else
- oc = copy_and_transfer_contact(c.id, registrar_id)
- end
-
- domain_contacts.where(contact_id: c.id).update_all({ contact_id: oc.id }) # n+1 workaround
- copied_ids << c.id
+ if registrant_id_was == c.id # registrant was copied previously, do not copy it again
+ oc = OpenStruct.new(id: registrant_id)
else
- transfer_contact(c.id, registrar_id)
+ oc = copy_and_transfer_contact(c.id, registrar_id)
end
+
+ domain_contacts.where(contact_id: c.id).update_all({ contact_id: oc.id }) # n+1 workaround
+ copied_ids << c.id
end
end
@@ -766,7 +768,9 @@ class Epp::Domain < Domain
DomainStatus::PENDING_DELETE,
DomainStatus::PENDING_RENEW,
DomainStatus::PENDING_TRANSFER,
- DomainStatus::FORCE_DELETE
+ DomainStatus::FORCE_DELETE,
+ DomainStatus::SERVER_TRANSFER_PROHIBITED,
+ DomainStatus::CLIENT_TRANSFER_PROHIBITED
]).empty?
end
diff --git a/app/models/setting.rb b/app/models/setting.rb
index 005cce626..122bfc99a 100644
--- a/app/models/setting.rb
+++ b/app/models/setting.rb
@@ -1,3 +1,9 @@
class Setting < RailsSettings::CachedSettings
include Versions # version/setting_version.rb
+
+ def self.reload_settings!
+ STDOUT << "#{Time.zone.now.utc} - Clearing settings cache\n"
+ Rails.cache.delete_matched('settings:.*')
+ STDOUT << "#{Time.zone.now.utc} - Settings cache cleared\n"
+ end
end
diff --git a/app/models/white_ip.rb b/app/models/white_ip.rb
index 7a35a33f6..918315004 100644
--- a/app/models/white_ip.rb
+++ b/app/models/white_ip.rb
@@ -17,19 +17,17 @@ class WhiteIp < ActiveRecord::Base
REGISTRAR = 'registrar'
INTERFACES = [API, REGISTRAR]
- scope :api, -> { where(interface: API) }
- scope :registrar, -> { where(interface: REGISTRAR) }
+ scope :api, -> { where("interfaces @> ?::varchar[]", "{#{API}}") }
+ scope :registrar, -> { where("interfaces @> ?::varchar[]", "{#{REGISTRAR}}") }
+
+ def interfaces=(interfaces)
+ super(interfaces.reject(&:blank?))
+ end
class << self
def registrar_ip_white?(ip)
return true unless Setting.registrar_ip_whitelist_enabled
-
- at = WhiteIp.arel_table
- WhiteIp.where(
- at[:interface].eq(REGISTRAR).and(
- at[:ipv4].eq(ip)
- )
- ).any?
+ WhiteIp.where(ipv4: ip).registrar.any?
end
end
end
diff --git a/app/views/admin/account_activities/index.haml b/app/views/admin/account_activities/index.haml
new file mode 100644
index 000000000..35e270dce
--- /dev/null
+++ b/app/views/admin/account_activities/index.haml
@@ -0,0 +1,74 @@
+- content_for :actions do
+ = link_to(t(:export_csv), url_for(params.merge(format: 'csv')), class: 'btn btn-default')
+
+= render 'shared/title', name: t(:account_activities)
+
+.row
+ .col-md-12
+ = search_form_for @q, url: [:admin, :account_activities], html: { style: 'margin-bottom: 0;' } do |f|
+ .row
+ .col-md-12
+ .form-group
+ = f.label t(:registrar)
+ = f.select :account_registrar_id_in, Registrar.all.map { |x| [x, x.id] }, {}, class: 'form-control js-combobox', placeholder: t(:choose), multiple: true
+ .row
+ .col-md-6
+ .form-group
+ = f.label t(:activity_type)
+ = f.select :activity_type_in, AccountActivity.types_for_select, {}, class: 'form-control js-combobox', placeholder: t(:choose), multiple: true
+ .col-md-6
+ .form-group
+ = f.label t(:description)
+ = f.search_field :description_cont, class: 'form-control', placeholder: t(:description), autocomplete: 'off'
+ .row
+ .col-md-3
+ .form-group
+ = f.label t(:receipt_date_from)
+ = f.search_field :created_at_gteq, value: params[:q][:created_at_gteq], class: 'form-control datepicker', placeholder: t(:receipt_date_from), autocomplete: 'off'
+ .col-md-3
+ .form-group
+ = 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'
+ .col-md-6{style: 'padding-top: 25px;'}
+ %button.btn.btn-default.search
+
+ %span.glyphicon.glyphicon-search
+
+ %button.btn.btn-default.js-reset-form
+ = t(:clear_fields)
+%hr
+
+.row
+ .col-md-12
+ .table-responsive
+ %table.table.table-hover.table-condensed
+ %thead
+ %tr
+ %th{class: 'col-xs-2'}
+ = sort_link(@q, 'registrar')
+ %th{class: 'col-xs-3'}
+ = sort_link(@q, 'description')
+ %th{class: 'col-xs-2'}
+ = sort_link(@q, 'activity_type')
+ %th{class: 'col-xs-3'}
+ = sort_link(@q, 'created_at', t(:receipt_date))
+ %th{class: 'col-xs-2'}
+ = sort_link(@q, 'sum')
+ %tbody
+ - @account_activities.each do |x|
+ %tr
+ %td= link_to(x.account.registrar.try(:code), admin_registrar_path(x.account.registrar))
+ %td= x.description.present? ? x.description : '-'
+ %td= x.activity_type ? t(x.activity_type) : ''
+ %td= l(x.created_at)
+ - c = x.sum > 0.0 ? 'text-success' : 'text-danger'
+ - s = x.sum > 0.0 ? "+#{x.sum} #{x.currency}" : "#{x.sum} #{x.currency}"
+ %td{class: c}= s
+.row
+ .col-md-12
+ = paginate @account_activities
+
+:coffee
+ $(".js-reset-form").on "click", (e) ->
+ e.preventDefault();
+ window.location = "#{admin_account_activities_path}"
diff --git a/app/views/admin/domains/partials/_general.haml b/app/views/admin/domains/partials/_general.haml
index 91b4aeabd..d433a1302 100644
--- a/app/views/admin/domains/partials/_general.haml
+++ b/app/views/admin/domains/partials/_general.haml
@@ -21,3 +21,12 @@
%dt= t(:valid_to)
%dd= l(@domain.valid_to)
+
+ %dt= t(:outzone_at)
+ %dd= l(@domain.outzone_at)
+
+ %dt= t(:delete_at)
+ %dd= l(@domain.delete_at)
+
+ %dt= t(:force_delete_at)
+ %dd= l(@domain.force_delete_at)
diff --git a/app/views/admin/registrars/show.haml b/app/views/admin/registrars/show.haml
index d41a0f9fd..c44523d87 100644
--- a/app/views/admin/registrars/show.haml
+++ b/app/views/admin/registrars/show.haml
@@ -92,10 +92,10 @@
%tr
%th{class: 'col-xs-4'}= t(:ipv4)
%th{class: 'col-xs-6'}= t(:ipv6)
- %th{class: 'col-xs-2'}= t(:interface)
+ %th{class: 'col-xs-2'}= t(:interfaces)
%tbody
- - @registrar.white_ips.order(:interface).each do |x|
+ - @registrar.white_ips.each do |x|
%tr
%td= link_to(x.ipv4, [:admin, @registrar, x])
%td= link_to(x.ipv6, [:admin, @registrar, x])
- %td= x.interface.upcase
+ %td= x.interfaces.join(', ').upcase
diff --git a/app/views/admin/white_ips/_form.haml b/app/views/admin/white_ips/_form.haml
index 253501e24..7a0371697 100644
--- a/app/views/admin/white_ips/_form.haml
+++ b/app/views/admin/white_ips/_form.haml
@@ -19,11 +19,13 @@
= f.label :ipv6
.col-md-7
= f.text_field(:ipv6, class: 'form-control', ipv6: true, autocomplete: 'off')
- .form-group
- .col-md-4.control-label
- = f.label :interface
- .col-md-7
- = f.select :interface, WhiteIp::INTERFACES.map {|x| [x.upcase, x]}, {}, class: 'form-control selectize'
+ - WhiteIp::INTERFACES.each do |x|
+ .form-group
+ .col-md-4.control-label
+ = f.label x
+ .col-md-7
+ = f.check_box :interfaces, { multiple: true }, x, nil
+ = hidden_field_tag "white_ip[interfaces][]", nil
%hr
.row
.col-md-8.text-right
diff --git a/app/views/admin/white_ips/show.haml b/app/views/admin/white_ips/show.haml
index da1da9616..0cfec654c 100644
--- a/app/views/admin/white_ips/show.haml
+++ b/app/views/admin/white_ips/show.haml
@@ -20,5 +20,5 @@
%dt= t(:ipv6)
%dd= @white_ip.ipv6
- %dt= t(:interface)
- %dd= @white_ip.interface.upcase
+ %dt= t(:interfaces)
+ %dd= @white_ip.interfaces.join(', ').upcase
diff --git a/app/views/layouts/admin/application.haml b/app/views/layouts/admin/application.haml
index d224b1464..6e3257740 100644
--- a/app/views/layouts/admin/application.haml
+++ b/app/views/layouts/admin/application.haml
@@ -55,6 +55,7 @@
%li= link_to t(:pricelists), admin_pricelists_path
%li= link_to t(:bank_statements), admin_bank_statements_path
%li= link_to t(:invoices), admin_invoices_path
+ %li= link_to t(:account_activities), admin_account_activities_path
%li.divider
%li.dropdown-header= t(:system)
%li= link_to t(:settings), admin_settings_path
diff --git a/app/views/layouts/registrar/application.haml b/app/views/layouts/registrar/application.haml
index 3754cd0bf..df936bbee 100644
--- a/app/views/layouts/registrar/application.haml
+++ b/app/views/layouts/registrar/application.haml
@@ -44,7 +44,7 @@
- active_class = ['registrar/invoices'].include?(params[:controller]) ? 'active' :nil
%li{class: active_class}= link_to t(:billing), registrar_invoices_path
- - if !Rails.env.production? && can?(:view, :registrar_xml_console)
+ - if !Rails.env.production? && can?(:manage, :xml_console)
- active_class = ['registrar/xml_consoles'].include?(params[:controller]) ? 'active' :nil
%li{class: active_class}= link_to t(:xml_console), registrar_xml_console_path
diff --git a/app/views/mailers/domain_mailer/force_delete.html.erb b/app/views/mailers/domain_mailer/force_delete.html.erb
new file mode 100644
index 000000000..5dac0d3b4
--- /dev/null
+++ b/app/views/mailers/domain_mailer/force_delete.html.erb
@@ -0,0 +1,76 @@
+
+
+ Eesti Interneti Sihtasutus
+ |
+
+
+
+
+
+Lugupeetud domeeni <%= @domain.name %> kontaktisik
+
+Eesti Interneti SA (EIS) domeeniregistrisse on domeeni <%= @domain.name %> kohta kantud järgmised andmed:
+
+Registreerija nimi: <%= @domain.registrant %>
+Registrikood: <%= @domain.registrant.try(:ident) %>
+
+EIS-le on saanud teatavaks, et juriidiline isik registrikoodiga <%= @domain.registrant.try(:ident) %> on äriregistrist kustutatud.
+
+Kuivõrd äriregistrist kustutatud juriidiline isik ei saa olla domeeni registreerijaks, siis algatas EIS <%= l(Time.zone.now, format: :date) %> vastavalt Domeenireeglite (http://www.internet.ee/et/domeenid/) punktile 6.4 domeeni <%= @domain.name %> suhtes 30 päeva pikkuse kustutusmenetluse. Kustutamise käigus jääb domeen internetis kättesaadavaks.
+
+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.
+
+Lisaküsimuste korral võtke palun ühendust oma registripidajaga <%= @domain.registrar %>, kelle kontaktandmed leiate lingilt http://www.internet.ee/registripidajad
+
+
+
+Dear contact of <%= @domain.name %> domain
+
+The following details for domain name <%= @domain.name %> have been entered into the Estonian Internet Foundation's (EIF) domain registry:
+
+Registrant's name: <%= @domain.registrant %>
+Registry code: <%= @domain.registrant.try(:ident) %>
+
+EIF has learned that the legal person with registry code <%= @domain.registrant.try(:ident) %> has been deleted from the Business Registry.
+
+As a terminated legal person cannot be the registrant of a domain, the EIF started the deletion process of <%= @domain.name %> domain on <%= l(Time.zone.now, format: :date) %> according to the Domain Regulation (http://www.internet.ee/en/domains/), using the 30-day delete procedure. The domain will remain available on the Internet during the delete procedure.
+
+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.
+
+Should you have additional questions, please contact your registrar <%= @domain.registrar %>, whose contact information can be found at http://www.internet.ee/en/registrars/
+
+
+
+Уважаемое контактное лицо домена <%= @domain.name %>
+
+В регистр доменов Целевого учреждения Eesti Internet (EIS) внесены следующие данные относительно домена <%= @domain.name %>:
+
+Имя регистранта: <%= @domain.registrant %>
+Регистрационный код: <%= @domain.registrant.try(:ident) %>
+
+EIS стало известно, что юридическое лицо с регистрационным кодом <%= @domain.registrant.try(:ident) %> удалено из коммерческого реестра.
+
+Поскольку прекратившее деятельность юридическое лицо не может являться регистрантом домена, то согласно пункту 6.4 Правил домена (http://www.internet.ee/ru/11364/11400/) EIS <%= l(Time.zone.now, format: :date) %> инициировало удаление домена <%= @domain.name %> с применением 30-дневной процедуры удаления. На протяжении процесса удаления домен остается доступным в Интернете.
+
+Согласно пункту 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) %> в случайный момент времени. По желанию после удаления из регистра домен можно снова зарегистрировать по принципу "кто успел, тот и съел".
+
+Просим обратиться к своему регистратору <%= @domain.registrar %>. Контактные данные регистраторов можно найти по адресу http://www.internet.ee/ru/p/
+
+
+
+ Lugupidamisega,
+ Yours Sincerely,
+ С уважением,
+ Eesti Interneti SA
+ Estonian Internet Foundation
+ | |
+
+
+ |
+
diff --git a/app/views/mailers/domain_mailer/force_delete.text.erb b/app/views/mailers/domain_mailer/force_delete.text.erb
new file mode 100644
index 000000000..fdd075647
--- /dev/null
+++ b/app/views/mailers/domain_mailer/force_delete.text.erb
@@ -0,0 +1,63 @@
+Lugupeetud domeeni <%= @domain.name %> kontaktisik
+
+Eesti Interneti SA (EIS) domeeniregistrisse on domeeni <%= @domain.name %> kohta kantud järgmised andmed:
+
+Registreerija nimi: <%= @domain.registrant %>
+Registrikood: <%= @domain.registrant.try(:ident) %>
+
+EIS-le on saanud teatavaks, et juriidiline isik registrikoodiga <%= @domain.registrant.try(:ident) %> on äriregistrist kustutatud.
+
+Kuivõrd äriregistrist kustutatud juriidiline isik ei saa olla domeeni registreerijaks, siis algatas EIS <%= l(Time.zone.now, format: :date) %> vastavalt Domeenireeglite (http://www.internet.ee/et/domeenid/) punktile 6.4 domeeni <%= @domain.name %> suhtes 30 päeva pikkuse kustutusmenetluse. Kustutamise käigus jääb domeen internetis kättesaadavaks.
+
+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.
+
+Lisaküsimuste korral võtke palun ühendust oma registripidajaga <%= @domain.registrar %>, kelle kontaktandmed leiate lingilt http://www.internet.ee/et/registripidajad/
+
+
+
+Dear contact of <%= @domain.name %> domain
+
+The following details for domain name <%= @domain.name %> have been entered into the Estonian Internet Foundation's (EIF) domain registry:
+
+Registrant's name: <%= @domain.registrant %>
+Registry code: <%= @domain.registrant.try(:ident) %>
+
+EIF has learned that the legal person with registry code <%= @domain.registrant.try(:ident) %> has been deleted from the Business Registry.
+
+As a terminated legal person cannot be the registrant of a domain, the EIF started the deletion process of <%= @domain.name %> domain on <%= l(Time.zone.now, format: :date) %> according to the Domain Regulation (http://www.internet.ee/en/domains/), using the 30-day delete procedure. The domain will remain available on the Internet during the delete procedure.
+
+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.
+
+Should you have additional questions, please contact your registrar <%= @domain.registrar %>, whose contact information can be found at http://www.internet.ee/en/registrars/
+
+
+
+Уважаемое контактное лицо домена <%= @domain.name %>
+
+В регистр доменов Целевого учреждения Eesti Internet (EIS) внесены следующие данные относительно домена <%= @domain.name %>:
+
+Имя регистранта: <%= @domain.registrant %>
+Регистрационный код: <%= @domain.registrant.try(:ident) %>
+
+EIS стало известно, что юридическое лицо с регистрационным кодом <%= @domain.registrant.try(:ident) %> удалено из коммерческого реестра.
+
+Поскольку прекратившее деятельность юридическое лицо не может являться регистрантом домена, то согласно пункту 6.4 Правил домена (http://www.internet.ee/ru/11364/11400/) EIS <%= l(Time.zone.now, format: :date) %> инициировало удаление домена <%= @domain.name %> с применением 30-дневной процедуры удаления. На протяжении процесса удаления домен остается доступным в Интернете.
+
+Согласно пункту 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) %> в случайный момент времени. По желанию после удаления из регистра домен можно снова зарегистрировать по принципу "кто успел, тот и съел".
+
+Просим обратиться к своему регистратору <%= @domain.registrar %>. Контактные данные регистраторов можно найти по адресу http://www.internet.ee/ru/p/
+
+
+
+Lugupidamisega,
+Yours Sincerely,
+С уважением,
+---
+Eesti Interneti SA
+Estonian Internet Foundation
diff --git a/app/views/registrar/contacts/form_partials/_general.haml b/app/views/registrar/contacts/form_partials/_general.haml
index b5f9eb0f9..a6ecbb500 100644
--- a/app/views/registrar/contacts/form_partials/_general.haml
+++ b/app/views/registrar/contacts/form_partials/_general.haml
@@ -1,3 +1,11 @@
+- ident_complete = f.object.ident_country_code.present? && f.object.ident_type.present? && f.object.ident.present?
+- if @contact.persisted?
+ - country_selected = f.object.ident_country_code || (params[:depp_contact].try(:[], :ident_country_code))
+ - type_selected = f.object.ident_type || (params[:depp_contact].try(:[], :ident_type))
+- else
+ - country_selected = (params[:depp_contact].try(:[], :ident_country_code) || 'EE')
+ - type_selected = (params[:depp_contact].try(:[], :ident_type) || 'org')
+
.panel.panel-default
.panel-heading.clearfix
.pull-left= t(:ident)
@@ -6,12 +14,11 @@
.col-md-3.control-label
= f.label :ident_country_code, t(:country) + '*'
.col-md-7
- - if @contact.persisted? && f.object.ident_country_code.present?
+ - if ident_complete && @contact.persisted? && f.object.ident_country_code.present?
.disabled-value
= Country.new(f.object.ident_country_code).try(:to_s)
= " [#{f.object.ident_country_code}]"
- else
- - country_selected = @contact.persisted? ? '' : (params[:depp_contact].try(:[], :ident_country_code) || 'EE')
= f.select(:ident_country_code, SortedCountry.all_options(country_selected), {},
class: 'js-ident-country-code', required: true)
@@ -19,25 +26,23 @@
.col-md-3.control-label
= f.label :ident_type, t(:type) + '*'
.col-md-7
- - if @contact.persisted? && f.object.ident_type.present?
+ - if ident_complete && @contact.persisted? && f.object.ident_type.present?
.disabled-value
= Depp::Contact.type_string(f.object.ident_type)
= " [#{f.object.ident_type}]"
- else
- - type_selected = @contact.persisted? ? '' : (params[:depp_contact].try(:[], :ident_type) || 'bic')
- = f.select(:ident_type, Depp::Contact::SELECTION_TYPES,
- { selected: type_selected },
+ = f.select(:ident_type, Depp::Contact::SELECTION_TYPES, { selected: type_selected },
class: 'js-ident-type', required: true)
.form-group
.col-md-3.control-label
= f.label :ident, t(:ident) + '*'
.col-md-7
- - if @contact.persisted? && f.object.ident.present?
+ - if ident_complete && @contact.persisted? && f.object.ident.present?
.disabled-value
= f.object.ident
- else
- = f.text_field :ident, class: 'form-control', required: true, disabled: @contact.persisted?
+ = f.text_field :ident, class: 'form-control', required: true
- tip_visibility = f.object.ident_type == 'birthday' ? '' : 'display: none'
.js-ident-tip{ style: tip_visibility }
= t(:birthday_format)
diff --git a/app/views/registrar/contacts/partials/_general.haml b/app/views/registrar/contacts/partials/_general.haml
index b0728120c..37bd87555 100644
--- a/app/views/registrar/contacts/partials/_general.haml
+++ b/app/views/registrar/contacts/partials/_general.haml
@@ -10,7 +10,6 @@
%dd
= text_field_tag :password, @contact.password, readonly: true, class: 'partially-hidden'
-
%br
%dt= t(:ident)
diff --git a/app/views/registrar/contacts/partials/_statuses.haml b/app/views/registrar/contacts/partials/_statuses.haml
index 5d41db972..c926c04cf 100644
--- a/app/views/registrar/contacts/partials/_statuses.haml
+++ b/app/views/registrar/contacts/partials/_statuses.haml
@@ -12,5 +12,3 @@
%tr
%td= s.first
%td= s.second
-
-
diff --git a/app/views/registrar/dashboard/show.haml b/app/views/registrar/dashboard/show.haml
new file mode 100644
index 000000000..74a9405a6
--- /dev/null
+++ b/app/views/registrar/dashboard/show.haml
@@ -0,0 +1,3 @@
+.panel.panel-default
+ .panel-body
+ = t('welcome_to_eis_registrar_portal')
diff --git a/config/application-example.yml b/config/application-example.yml
index f6f18315e..efc3101a7 100644
--- a/config/application-example.yml
+++ b/config/application-example.yml
@@ -62,7 +62,8 @@ contact_org_enabled: 'false'
# Enable iptables counter updater
# iptables_counter_enabled: 'true'
-# Custom legal document types
+# Custom legal document types. Changing this requires updating EPP extension schema for allowed legalDocEnumType values.
+# System default for legal document types is: pdf,bdoc,ddoc,zip,rar,gz,tar,7z,odt,doc,docx
# legal_document_types: "pdf,bdoc,ddoc,zip,rar,gz,tar,7z,odt,doc,docx"
diff --git a/config/database-example-development.yml b/config/database-example-development.yml
index 6cfce0d79..8bcaf097f 100644
--- a/config/database-example-development.yml
+++ b/config/database-example-development.yml
@@ -21,3 +21,21 @@ api_log_development:
registrant_write_development:
<<: *default
database: registry_development
+
+
+test:
+ <<: *default
+ database: registry_test
+
+whois_test:
+ <<: *default
+ database: registry_whois_test
+
+api_log_test:
+ <<: *default
+ database: registry_api_log_test
+
+registrant_write_test:
+ <<: *default
+ database: registry_test
+
diff --git a/config/deploy-example.rb b/config/deploy-example.rb
index 7454fe0a7..f6cd5dee6 100644
--- a/config/deploy-example.rb
+++ b/config/deploy-example.rb
@@ -1,7 +1,6 @@
require 'mina/bundler'
require 'mina/rails'
require 'mina/git'
-require 'mina/whenever'
require 'mina/rbenv' # for rbenv support. (http://rbenv.org)
# Basic settings:
@@ -17,6 +16,7 @@ set :repository, 'https://github.com/domify/registry' # dev repo
set :branch, 'master'
set :rails_env, 'alpha'
set :que_restart, true
+set :cron_group, 'registry'
# alpha branch, only use for heavy debugging
task :epp do
@@ -36,6 +36,7 @@ task :registrar do
set :branch, 'master'
set :rails_env, 'alpha'
set :que_restart, false
+ set :cron_group, 'registrar'
end
# alpha branch, only use for heavy debugging
@@ -46,6 +47,7 @@ task :registrant do
set :branch, 'master'
set :rails_env, 'alpha'
set :que_restart, false
+ set :cron_group, 'registrant'
end
# staging
@@ -66,6 +68,7 @@ task :eppst do
set :branch, 'staging'
set :rails_env, 'staging'
set :que_restart, false
+ set :cron_group, 'epp'
end
# staging
@@ -76,6 +79,7 @@ task :registrarst do
set :branch, 'staging'
set :rails_env, 'staging'
set :que_restart, false
+ set :cron_group, 'registrar'
end
# staging
@@ -86,6 +90,7 @@ task :registrantst do
set :branch, 'staging'
set :rails_env, 'staging'
set :que_restart, false
+ set :cron_group, 'registrant'
end
# production
@@ -106,6 +111,7 @@ task :epppr do
set :branch, 'master'
set :rails_env, 'production'
set :que_restart, false
+ set :cron_group, 'epp'
end
# production
@@ -116,6 +122,7 @@ task :registrarpr do
set :branch, 'master'
set :rails_env, 'production'
set :que_restart, false
+ set :cron_group, 'registrar'
end
# production
@@ -126,6 +133,7 @@ task :registrantpr do
set :branch, 'master'
set :rails_env, 'production'
set :que_restart, false
+ set :cron_group, 'registrant'
end
# Manually create these paths in shared/ (eg: shared/config/database.yml) in your server.
@@ -234,7 +242,7 @@ end
desc 'Restart que server'
task que_restart: :environment do
- queue "/etc/init.d/que restart"
+ queue "/etc/init.d/que restart"
end
namespace :cron do
@@ -251,6 +259,32 @@ namespace :cron do
end
end
+namespace :whenever do
+ name = -> { "#{domain}_#{rails_env}" }
+
+ desc "Clear crontab"
+ task clear: :environment do
+ queue %(
+ echo "-----> Clear crontab for #{name.call}"
+ #{echo_cmd %(cd #{deploy_to!}/#{current_path!} ; #{bundle_bin} exec whenever --clear-crontab #{name.call} --set 'environment=#{rails_env}&path=#{deploy_to!}/#{current_path!}&cron_group=#{cron_group}')}
+ )
+ end
+ desc "Update crontab"
+ task update: :environment do
+ queue %(
+ echo "-----> Update crontab for #{name.call}"
+ #{echo_cmd %(cd #{deploy_to!}/#{current_path!} ; #{bundle_bin} exec whenever --update-crontab #{name.call} --set 'environment=#{rails_env}&path=#{deploy_to!}/#{current_path!}&cron_group=#{cron_group}')}
+ )
+ end
+ desc "Write crontab"
+ task write: :environment do
+ queue %(
+ echo "-----> Update crontab for #{name.call}"
+ #{echo_cmd %(cd #{deploy_to!}/#{current_path!} ; #{bundle_bin} exec whenever --write-crontab #{name.call} --set 'environment=#{rails_env}&path=#{deploy_to!}/#{current_path!}&cron_group=#{cron_group}')}
+ )
+ end
+end
+
# For help in making your deploy script, see the Mina documentation:
#
# - http://nadarei.co/mina
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 5bd4c0f63..df6c53b77 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -148,7 +148,6 @@ en:
value:
taken: 'Status already exists on this domain'
-
user:
attributes:
username:
@@ -277,7 +276,7 @@ en:
name: 'Name'
transfer_can_be_approved_only_by_current_registrar: 'Transfer can be approved only by current domain registrar'
registrar: 'Registrar'
- owner: 'Owner'
+ owner: 'Registrant'
domain_details: 'Domain details'
registered_at: 'Registered at'
password: 'Password'
@@ -515,7 +514,7 @@ en:
crt_revoked: 'CRT (revoked)'
contact_org_error: 'Parameter value policy error. Org must be blank'
contact_fax_error: 'Parameter value policy error. Fax must be blank'
- ident_update_error: 'Parameter value policy error. Update of ident data not allowed'
+ ident_update_error: 'Parameter value policy error. Update of ident data not allowed [ident]'
invoices: 'Invoices'
no_such_user: 'No such user'
log_in: 'Log in'
@@ -730,6 +729,7 @@ en:
The domain name server
is a computer that saves and forwards via a general-access data communications network such data that is connected with the domain name and corresponding IP addresses. Your IT helpdesk or Internet service provider will have the necessary information about the domain name servers.
account_activity: 'Account activity'
+ account_activities: 'Account activities'
receipt_date: 'Receipt date'
manual_binding: 'Manual binding'
transaction_is_already_binded: 'Transaction is already binded'
@@ -803,20 +803,20 @@ en:
edit_white_ip: 'Edit white IP'
confirm_domain_delete: 'Confirm domain delete'
reject_domain_delete: 'Reject domain delete'
- confirm_domain_registrant_update: 'Confirm domain ownership change'
- reject_domain_registrant_update: 'Reject domain ownership change'
- domain_registrant_change_title: 'Please confirm or reject domain ownership change'
- domain_registrant_change_body: 'There is a request to change domain ownership. Before doing it we need your confirmation.'
+ confirm_domain_registrant_update: 'Confirm domain registrant change'
+ reject_domain_registrant_update: 'Reject domain registrant change'
+ domain_registrant_change_title: 'Please confirm or reject domain registrant change'
+ domain_registrant_change_body: 'There is a request to change domain registrant. Before doing it we need your confirmation.'
new_pending_registrant: 'New registrant'
current_registrant: 'Current registrant'
registrant_domain_verification_failed: 'Domain verification not available'
- domain_registrant_change_confirmed_title: 'Domain owner change has been received'
- domain_registrant_change_confirmed_body: 'You have successfully submitted domain owner change confirmation. You will receive email confirmation.'
- registrant_domain_verification_confirmed: 'Domain owner change has successfully received.'
+ domain_registrant_change_confirmed_title: 'Domain registrant change has been received'
+ domain_registrant_change_confirmed_body: 'You have successfully submitted domain registrant change confirmation. You will receive email confirmation.'
+ registrant_domain_verification_confirmed: 'Domain registrant change has successfully received.'
registrant_domain_verification_confirmed_failed: 'Something went wrong.'
- domain_registrant_change_rejected_title: 'Domain owner change has been rejected'
- domain_registrant_change_rejected_body: 'You have rejected domain owner change.'
- registrant_domain_verification_rejected: 'Domain owner change has been rejected successfully.'
+ domain_registrant_change_rejected_title: 'Domain registrant change has been rejected'
+ domain_registrant_change_rejected_body: 'You have rejected domain registrant change.'
+ registrant_domain_verification_rejected: 'Domain registrant change has been rejected successfully.'
registrant_domain_verification_rejected_failed: 'Something went wrong.'
domain_delete_title: 'Please confirm or reject domain deletation'
domain_delete_body: 'There is a request to delete a domain. Before doing it we need your confirmation.'
@@ -917,3 +917,7 @@ en:
mail_templates: Mail Templates
new_mail_template: New mail template
failure: "It was not saved"
+ contact_is_not_valid: 'Contact %{value} is not valid, please fix the invalid contact'
+ force_delete_subject: 'Kustutusmenetluse teade'
+ welcome_to_eis_registrar_portal: 'Welcome to EIS Registrar portal'
+ interfaces: 'Interfaces'
diff --git a/config/routes.rb b/config/routes.rb
index 5ea7beff7..5431cdbf4 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -19,7 +19,8 @@ Rails.application.routes.draw do
# REGISTRAR ROUTES
namespace :registrar do
- root 'polls#show'
+ resource :dashboard
+ root 'dashboard#show'
resources :invoices do
member do
@@ -161,6 +162,7 @@ Rails.application.routes.draw do
resources :keyrelays
resources :pricelists
resources :mail_templates
+ resources :account_activities
resources :bank_statements do
resources :bank_transactions
diff --git a/config/schedule.rb b/config/schedule.rb
index 265306904..5524f10ab 100644
--- a/config/schedule.rb
+++ b/config/schedule.rb
@@ -12,43 +12,49 @@ job_type :runner, "cd #{path} && bin/rails r -e :environment \":task\" :output"
# cron output
set :output, 'log/cron.log'
+if @cron_group == 'registry'
+ every 10.minutes do
+ runner 'ZonefileSetting.generate_zonefiles'
+ end
+
+ every 6.months, at: '12:01am' do
+ runner 'Contact.destroy_orphans'
+ end
+
+ every :day, at: '12:10am' do
+ runner 'Invoice.cancel_overdue_invoices'
+ end
+
+ # TODO
+ # every :day, at: '12:15am' do
+ # runner 'Domain.expire_domains'
+ # end
+
+ every :day, at: '12:20am' do
+ runner 'Domain.clean_expired_pendings'
+ end
+
+ every 3.hours do
+ runner 'Certificate.update_crl'
+ end
+
+ every 42.minutes do
+ runner 'Domain.destroy_delete_candidates'
+ end
+
+ every 45.minutes do
+ runner 'Domain.start_expire_period'
+ end
+
+ every 50.minutes do
+ runner 'Domain.start_delete_period'
+ end
+
+ every 52.minutes do
+ runner 'Domain.start_redemption_grace_period'
+ end
+end
+
every 10.minutes do
- runner 'ZonefileSetting.generate_zonefiles'
-end
-
-every 6.months, at: '12:01am' do
- runner 'Contact.destroy_orphans'
-end
-
-every :day, at: '12:10am' do
- runner 'Invoice.cancel_overdue_invoices'
-end
-
-# TODO
-# every :day, at: '12:15am' do
- # runner 'Domain.expire_domains'
-# end
-
-every :day, at: '12:20am' do
- runner 'Domain.clean_expired_pendings'
-end
-
-every 3.hours do
- runner 'Certificate.update_crl'
-end
-
-every 42.minutes do
- runner 'Domain.destroy_delete_candidates'
-end
-
-every 45.minutes do
- runner 'Domain.start_expire_period'
-end
-
-every 50.minutes do
- runner 'Domain.start_delete_period'
-end
-
-every 52.minutes do
- runner 'Domain.start_redemption_grace_period'
+ runner 'Setting.reload_settings!'
end
diff --git a/db/migrate/20150903105659_add_updated_token.rb b/db/migrate/20150903105659_add_updated_token.rb
new file mode 100644
index 000000000..9e6418c60
--- /dev/null
+++ b/db/migrate/20150903105659_add_updated_token.rb
@@ -0,0 +1,5 @@
+class AddUpdatedToken < ActiveRecord::Migration
+ def change
+ add_column :contacts, :legacy_ident_updated_at, :datetime
+ end
+end
diff --git a/db/migrate/20150910113839_add_copy_from_id.rb b/db/migrate/20150910113839_add_copy_from_id.rb
new file mode 100644
index 000000000..c023750ff
--- /dev/null
+++ b/db/migrate/20150910113839_add_copy_from_id.rb
@@ -0,0 +1,5 @@
+class AddCopyFromId < ActiveRecord::Migration
+ def change
+ add_column :contacts, :copy_from_id, :integer
+ end
+end
diff --git a/db/migrate/20150915094707_add_multiple_interfaces_for_white_ip.rb b/db/migrate/20150915094707_add_multiple_interfaces_for_white_ip.rb
new file mode 100644
index 000000000..59840e474
--- /dev/null
+++ b/db/migrate/20150915094707_add_multiple_interfaces_for_white_ip.rb
@@ -0,0 +1,6 @@
+class AddMultipleInterfacesForWhiteIp < ActiveRecord::Migration
+ def change
+ change_column :white_ips, :interface, "varchar[] USING (string_to_array(interface, ','))"
+ rename_column :white_ips, :interface, :interfaces
+ end
+end
diff --git a/db/migrate/20150921110152_update_contacts_logs.rb b/db/migrate/20150921110152_update_contacts_logs.rb
new file mode 100644
index 000000000..a43cb997a
--- /dev/null
+++ b/db/migrate/20150921110152_update_contacts_logs.rb
@@ -0,0 +1,5 @@
+class UpdateContactsLogs < ActiveRecord::Migration
+ def change
+ add_column :log_contacts, :legacy_ident_updated_at, :datetime
+ end
+end
diff --git a/db/migrate/20150921111842_rename_contact_ident_updator.rb b/db/migrate/20150921111842_rename_contact_ident_updator.rb
new file mode 100644
index 000000000..43dc40d9a
--- /dev/null
+++ b/db/migrate/20150921111842_rename_contact_ident_updator.rb
@@ -0,0 +1,6 @@
+class RenameContactIdentUpdator < ActiveRecord::Migration
+ def change
+ rename_column :contacts, :legacy_ident_updated_at, :ident_updated_at
+ rename_column :log_contacts, :legacy_ident_updated_at, :ident_updated_at
+ end
+end
diff --git a/db/schema-read-only.rb b/db/schema-read-only.rb
index 79739bb06..ca244af5f 100644
--- a/db/schema-read-only.rb
+++ b/db/schema-read-only.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20150825125118) do
+ActiveRecord::Schema.define(version: 20150921111842) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -201,6 +201,9 @@ ActiveRecord::Schema.define(version: 20150825125118) do
t.integer "legacy_id"
t.string "statuses", array: true
t.hstore "status_notes"
+ t.integer "legacy_history_id"
+ t.integer "copy_from_id"
+ t.datetime "ident_updated_at"
end
add_index "contacts", ["code"], name: "index_contacts_on_code", using: :btree
@@ -583,15 +586,16 @@ ActiveRecord::Schema.define(version: 20150825125118) do
add_index "log_contact_statuses", ["whodunnit"], name: "index_log_contact_statuses_on_whodunnit", using: :btree
create_table "log_contacts", force: :cascade do |t|
- t.string "item_type", null: false
- t.integer "item_id", null: false
- t.string "event", null: false
+ t.string "item_type", null: false
+ t.integer "item_id", null: false
+ t.string "event", null: false
t.string "whodunnit"
t.json "object"
t.json "object_changes"
t.datetime "created_at"
t.string "session"
t.json "children"
+ t.datetime "ident_updated_at"
end
add_index "log_contacts", ["item_type", "item_id"], name: "index_log_contacts_on_item_type_and_item_id", using: :btree
@@ -886,8 +890,8 @@ ActiveRecord::Schema.define(version: 20150825125118) do
t.string "cc"
t.text "body", null: false
t.text "text_body", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
+ t.datetime "created_at"
+ t.datetime "updated_at"
end
create_table "messages", force: :cascade do |t|
@@ -1062,7 +1066,7 @@ ActiveRecord::Schema.define(version: 20150825125118) do
t.integer "registrar_id"
t.string "ipv4"
t.string "ipv6"
- t.string "interface"
+ t.string "interfaces", array: true
t.datetime "created_at"
t.datetime "updated_at"
t.string "creator_str"
diff --git a/db/structure.sql b/db/structure.sql
index 74cddb0e9..fbe00eb4d 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -596,7 +596,10 @@ CREATE TABLE contacts (
state character varying,
legacy_id integer,
statuses character varying[],
- status_notes hstore
+ status_notes hstore,
+ legacy_history_id integer,
+ copy_from_id integer,
+ ident_updated_at timestamp without time zone
);
@@ -1500,7 +1503,8 @@ CREATE TABLE log_contacts (
object_changes json,
created_at timestamp without time zone,
session character varying,
- children json
+ children json,
+ ident_updated_at timestamp without time zone
);
@@ -2241,8 +2245,8 @@ CREATE TABLE mail_templates (
cc character varying,
body text NOT NULL,
text_body text NOT NULL,
- created_at timestamp without time zone NOT NULL,
- updated_at timestamp without time zone NOT NULL
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone
);
@@ -2715,7 +2719,7 @@ CREATE TABLE white_ips (
registrar_id integer,
ipv4 character varying,
ipv6 character varying,
- interface character varying,
+ interfaces character varying[],
created_at timestamp without time zone,
updated_at timestamp without time zone,
creator_str character varying,
@@ -4926,5 +4930,19 @@ INSERT INTO schema_migrations (version) VALUES ('20150803080914');
INSERT INTO schema_migrations (version) VALUES ('20150810114746');
+INSERT INTO schema_migrations (version) VALUES ('20150810114747');
+
INSERT INTO schema_migrations (version) VALUES ('20150825125118');
+INSERT INTO schema_migrations (version) VALUES ('20150827151906');
+
+INSERT INTO schema_migrations (version) VALUES ('20150903105659');
+
+INSERT INTO schema_migrations (version) VALUES ('20150910113839');
+
+INSERT INTO schema_migrations (version) VALUES ('20150915094707');
+
+INSERT INTO schema_migrations (version) VALUES ('20150921110152');
+
+INSERT INTO schema_migrations (version) VALUES ('20150921111842');
+
diff --git a/doc/application_build_doc.md b/doc/application_build_doc.md
index 4dc9535b4..dcc0190b7 100644
--- a/doc/application_build_doc.md
+++ b/doc/application_build_doc.md
@@ -117,7 +117,7 @@ General rake and mina tips:
### CRON
-Crontab can be setup after deploy. Jobs can be viewed [here](/config/schedule.rb).
+Crontab can be setup after deploy. Jobs can be viewed [here](/config/schedule.rb). Some jobs are dependent on `cron_group` variable set in [deploy-example.rb](/config/deploy-example.rb) file.
mina pr cron:setup # to update the crontab.
mina pr cron:clear # to clear crontab.
diff --git a/doc/schemas/eis-1.0.xsd b/doc/schemas/eis-1.0.xsd
index 262281cca..8093c832d 100644
--- a/doc/schemas/eis-1.0.xsd
+++ b/doc/schemas/eis-1.0.xsd
@@ -90,7 +90,7 @@
-
+
diff --git a/lib/schemas/eis-1.0.xsd b/lib/schemas/eis-1.0.xsd
index 262281cca..8093c832d 100644
--- a/lib/schemas/eis-1.0.xsd
+++ b/lib/schemas/eis-1.0.xsd
@@ -90,7 +90,7 @@
-
+
diff --git a/lib/sorted_country.rb b/lib/sorted_country.rb
index d05a31bab..1fc514d3f 100644
--- a/lib/sorted_country.rb
+++ b/lib/sorted_country.rb
@@ -6,7 +6,7 @@ class SortedCountry
include ActionView::Helpers
def all_options(selected = nil)
- quick_options = options_for_select([['', '']] + quick_list, { selected: selected })
+ quick_options = options_for_select(quick_list, { selected: selected })
# no double select
selected = quick_list.map(&:second).include?(selected) ? '' : selected
diff --git a/lib/tasks/import.rake b/lib/tasks/import.rake
index 7b3625ad2..54f85b105 100644
--- a/lib/tasks/import.rake
+++ b/lib/tasks/import.rake
@@ -138,7 +138,7 @@ namespace :import do
ident_type_map = {
2 => Contact::PRIV,
3 => Contact::PASSPORT,
- 4 => Contact::BIC,
+ 4 => Contact::ORG,
6 => Contact::BIRTHDAY
}
diff --git a/spec/epp/domain_spec.rb b/spec/epp/domain_spec.rb
index 9a9f5c1bc..473ea3cf3 100644
--- a/spec/epp/domain_spec.rb
+++ b/spec/epp/domain_spec.rb
@@ -23,7 +23,7 @@ describe 'EPP Domain', epp: true do
Fabricate(:contact, code: 'FIXED:CITIZEN_1234')
Fabricate(:contact, code: 'FIXED:SH8013')
Fabricate(:contact, code: 'FIXED:SH801333')
- Fabricate(:contact, code: 'FIXED:JURIDICAL_1234', ident_type: 'bic')
+ Fabricate(:contact, code: 'FIXED:JURIDICAL_1234', ident_type: 'org')
Fabricate(:reserved_domain)
Fabricate(:blocked_domain)
@pricelist_reg_1_year = Fabricate(:pricelist, valid_to: nil)
@@ -1181,9 +1181,10 @@ describe 'EPP Domain', epp: true do
end
# all domain contacts should be under registrar2 now
+ domain.reload
domain.registrant.reload
domain.registrant.registrar_id.should == @registrar2.id
- domain.registrant.id.should == original_oc_id
+ domain.registrant.id.should_not == original_oc_id
# must generate new code
domain.registrant.code.should_not == original_oc_code
@@ -1263,24 +1264,24 @@ describe 'EPP Domain', epp: true do
end
it 'transfers domain when domain contacts are some other domain contacts' do
- old_contact = Fabricate(:contact, registrar: @registrar1)
+ old_contact = Fabricate(:contact, registrar: @registrar1, name: 'old name')
domain.tech_contacts << old_contact
domain.admin_contacts << old_contact
d = Fabricate(:domain)
d.tech_contacts << old_contact
d.admin_contacts << old_contact
+
original_oc_id = domain.registrant.id
original_contact_count = Contact.count
original_domain_contact_count = DomainContact.count
- pw = domain.auth_info
- xml = domain_transfer_xml({
- name: { value: domain.name },
- authInfo: { pw: { value: pw } }
- })
-
login_as :registrar2 do
+ pw = domain.auth_info
+ xml = domain_transfer_xml({
+ name: { value: domain.name },
+ authInfo: { pw: { value: pw } }
+ })
response = epp_plain_request(xml)
response[:msg].should == 'Command completed successfully'
response[:result_code].should == '1000'
@@ -1289,8 +1290,7 @@ describe 'EPP Domain', epp: true do
# all domain contacts should be under registrar2 now
domain.reload
domain.registrant.registrar_id.should == @registrar2.id
- # registrant should not be a new record
- domain.registrant.id.should == original_oc_id
+ domain.registrant.id.should_not == original_oc_id
# old contact must not change
old_contact.registrar_id.should == @registrar1.id
@@ -1299,14 +1299,14 @@ describe 'EPP Domain', epp: true do
x.registrar_id.should == @registrar2.id
end
- new_contact = Contact.last
- new_contact.name.should == old_contact.name
+ new_contact = Contact.last(4).detect { |c| c.name == 'old name' } # database order
+ new_contact.name.should == 'old name'
# there should be 2 references to the new contact
domain.domain_contacts.where(contact_id: new_contact.id).count.should == 2
- # there should be only one new contact object
- (original_contact_count + 1).should == Contact.count
+ # there should be four new contact object
+ (original_contact_count + 4).should == Contact.count
# and no new references
original_domain_contact_count.should == DomainContact.count
@@ -1344,7 +1344,7 @@ describe 'EPP Domain', epp: true do
domain.reload
domain.registrant.registrar_id.should == @registrar2.id
# registrant should not be a new record
- domain.registrant.id.should == original_oc_id
+ domain.registrant.id.should_not == original_oc_id
# old contact must not change
old_contact.registrar_id.should == @registrar1.id
@@ -1353,13 +1353,11 @@ describe 'EPP Domain', epp: true do
x.registrar_id.should == @registrar2.id
end
- new_contact, new_contact_2 = Contact.last(2)
+ new_contact = Contact.last(5).detect { |c| c.name == 'first' }
+ new_contact_2 = Contact.last(5).detect { |c| c.name == 'second' }
- # database does not follow always same order, thus we swap object when different order
- new_contact, new_contact_2 = new_contact_2, new_contact if new_contact.name != 'first'
-
- new_contact.name.should == old_contact.name
- new_contact_2.name.should == old_contact_2.name
+ new_contact.name.should == 'first'
+ new_contact_2.name.should == 'second'
# there should be 2 references to the new contact (admin + tech)
domain.domain_contacts.where(contact_id: new_contact.id).count.should == 2
@@ -1367,8 +1365,8 @@ describe 'EPP Domain', epp: true do
# there should be 1 reference to the new contact 2 (tech)
domain.domain_contacts.where(contact_id: new_contact_2.id).count.should == 1
- # there should be only two new contact objects
- (original_contact_count + 2).should == Contact.count
+ # there should be four new contact objects
+ (original_contact_count + 5).should == Contact.count
# and no new references
original_domain_contact_count.should == DomainContact.count
@@ -1435,6 +1433,43 @@ describe 'EPP Domain', epp: true do
original_contacts_codes.sort.should == domain.contacts.pluck(:code).sort
end
+ it 'transfers domain contact should populate copy_from_id' do
+ d = Fabricate(:domain)
+ d.tech_contacts << domain.registrant
+
+ original_oc_id = domain.registrant.id
+ original_oc_code = domain.registrant.code
+ domain.registrant.copy_from_id.should == nil
+
+ original_contact_codes = domain.contacts.pluck(:code)
+
+ pw = domain.auth_info
+ xml = domain_transfer_xml({
+ name: { value: domain.name },
+ authInfo: { pw: { value: pw } }
+ })
+
+ login_as :registrar2 do
+ response = epp_plain_request(xml)
+ response[:msg].should == 'Command completed successfully'
+ response[:result_code].should == '1000'
+ end
+
+ # all domain contacts should be under registrar2 now
+ domain.reload
+ domain.registrant.registrar_id.should == @registrar2.id
+ # registrant should be a new record
+ domain.registrant.id.should_not == original_oc_id
+ domain.registrant.copy_from_id.should == original_oc_id
+ # must generate new code
+ domain.registrant.code.should_not == original_oc_code
+
+ domain.contacts.each do |c|
+ c.registrar_id.should == @registrar2.id
+ original_contact_codes.include?(c.code).should_not == true
+ end
+ end
+
it 'should not creates transfer without password' do
xml = domain_transfer_xml({
name: { value: domain.name }
@@ -1767,6 +1802,23 @@ describe 'EPP Domain', epp: true do
end
end
+ it 'should not transfer when in prohibited status' do
+ domain.statuses = [DomainStatus::SERVER_TRANSFER_PROHIBITED]
+ domain.save
+
+ pw = domain.auth_info
+ xml = domain_transfer_xml({
+ name: { value: domain.name },
+ authInfo: { pw: { value: pw } }
+ })
+
+ login_as :registrar2 do
+ response = epp_plain_request(xml)
+ response[:msg].should == 'Object status prohibits operation'
+ response[:result_code].should == '2304'
+ end
+ end
+
### UPDATE ###
it 'should update right away without update pending status' do
existing_pw = domain.auth_info
@@ -1997,7 +2049,7 @@ describe 'EPP Domain', epp: true do
_anonymus: [
{ contact: { value: 'FIXED:MAK21', attrs: { type: 'tech' } } },
{ status: { value: 'Payment overdue.', attrs: { s: 'clientHold', lang: 'en' } } },
- { status: { value: '', attrs: { s: 'clientUpdateProhibited' } } }
+ { status: { value: '', attrs: { s: 'clientRenewProhibited' } } }
]
]
}, {
@@ -2027,6 +2079,7 @@ describe 'EPP Domain', epp: true do
Fabricate(:contact, code: 'FIXED:MAK21')
response = epp_plain_request(xml)
+
response[:results][0][:result_code].should == '1000'
d = Domain.last
@@ -2039,7 +2092,7 @@ describe 'EPP Domain', epp: true do
d.statuses.count.should == 2
d.statuses.include?('clientHold').should == true
- d.statuses.include?('clientUpdateProhibited').should == true
+ d.statuses.include?('clientRenewProhibited').should == true
d.dnskeys.count.should == 2
@@ -2221,7 +2274,7 @@ describe 'EPP Domain', epp: true do
_anonymus: [
{ contact: { value: 'FIXED:CITIZEN_1234', attrs: { type: 'tech' } } },
{ status: { value: 'Payment overdue.', attrs: { s: 'clientHold', lang: 'en' } } },
- { status: { value: '', attrs: { s: 'clientUpdateProhibited' } } }
+ { status: { value: '', attrs: { s: 'clientRenewProhibited' } } }
]
]
}, {
@@ -2288,7 +2341,7 @@ describe 'EPP Domain', epp: true do
d.dnskeys.count.should == 1
d.statuses.count.should == 1
- d.statuses.first.should == 'clientUpdateProhibited'
+ d.statuses.first.should == 'clientRenewProhibited'
rem_ns = d.nameservers.find_by(hostname: 'ns1.example.com')
rem_ns.should be_falsey
diff --git a/spec/fabricators/registrar_fabricator.rb b/spec/fabricators/registrar_fabricator.rb
index c1f082083..bd801f642 100644
--- a/spec/fabricators/registrar_fabricator.rb
+++ b/spec/fabricators/registrar_fabricator.rb
@@ -9,7 +9,7 @@ Fabricator(:registrar) do
country_code 'EE'
code { sequence(:code) { |i| "REGISTRAR#{i}" } }
reference_no { sequence(:reference_no) { |i| "RF#{i}" } }
- white_ips { [Fabricate(:white_ip), Fabricate(:white_ip, interface: WhiteIp::REGISTRAR)] }
+ white_ips { [Fabricate(:white_ip), Fabricate(:white_ip, interfaces: [WhiteIp::REGISTRAR])] }
end
Fabricator(:registrar_with_no_account_activities, from: :registrar) do
diff --git a/spec/fabricators/white_ip_fabricator.rb b/spec/fabricators/white_ip_fabricator.rb
index 151cc6725..6eb574893 100644
--- a/spec/fabricators/white_ip_fabricator.rb
+++ b/spec/fabricators/white_ip_fabricator.rb
@@ -1,8 +1,8 @@
Fabricator(:white_ip) do
ipv4 '127.0.0.1'
- interface WhiteIp::API
+ interfaces [WhiteIp::API]
end
Fabricator(:white_ip_registrar, from: :white_ip) do
- interface WhiteIp::REGISTRAR
+ interfaces [WhiteIp::REGISTRAR]
end
diff --git a/spec/features/admin/account_activity_spec.rb b/spec/features/admin/account_activity_spec.rb
new file mode 100644
index 000000000..0101337b6
--- /dev/null
+++ b/spec/features/admin/account_activity_spec.rb
@@ -0,0 +1,45 @@
+require 'rails_helper'
+
+feature 'Account activity', type: :feature do
+ before :all do
+ @user = Fabricate(:admin_user)
+ r = Fabricate(:registrar)
+ Fabricate.times(5, :account_activity, account: r.cash_account)
+ Fabricate(:account_activity, account: r.cash_account, description: 'acc activity test', sum: -12)
+ end
+
+ context 'as unknown user' do
+ it 'should redirect to sign in page' do
+ visit '/admin/account_activities'
+ current_path.should == '/admin/login'
+ page.should have_text('You need to sign in or sign up')
+ end
+ end
+
+ context 'as signed in user' do
+ before do
+ sign_in @user
+ end
+
+ it 'should navigate to account activities page' do
+ visit admin_account_activities_path
+ page.should have_text('+110.0 EUR', count: 5)
+ page.should have_text('-12.0 EUR')
+ end
+
+ it 'should search activities by description' do
+ visit admin_account_activities_path
+ fill_in 'Description', with: 'test'
+ find('.btn.btn-default.search').click
+ page.should have_text('-12.0 EUR')
+ page.should_not have_text('+110.0 EUR')
+ end
+
+ it 'should download csv' do
+ visit admin_account_activities_path
+ click_link 'Export CSV'
+ response_headers['Content-Type'].should == 'text/csv'
+ response_headers['Content-Disposition'].should match(/attachment; filename="account_activities_\d+\.csv"/)
+ end
+ end
+end
diff --git a/spec/features/admin/white_ip_spec.rb b/spec/features/admin/white_ip_spec.rb
index 261ea134d..d077e687f 100644
--- a/spec/features/admin/white_ip_spec.rb
+++ b/spec/features/admin/white_ip_spec.rb
@@ -26,7 +26,7 @@ feature 'Api users', type: :feature do
fill_in 'IPv4', with: '192.168.1.1'
fill_in 'IPv6', with: 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329'
- select 'API', from: 'Interface'
+ find('#white_ip_interfaces_api').set(true)
click_button 'Save'
page.should have_text('Record created')
diff --git a/spec/features/registrar/account_activity_spec.rb b/spec/features/registrar/account_activity_spec.rb
index a9cc9c59e..3d97be16a 100644
--- a/spec/features/registrar/account_activity_spec.rb
+++ b/spec/features/registrar/account_activity_spec.rb
@@ -20,7 +20,7 @@ feature 'Account activity', type: :feature do
end
it 'should navigate to account activities page' do
- current_path.should == '/registrar'
+ current_path.should == '/registrar/poll'
click_link 'Billing'
click_link 'Account activity'
diff --git a/spec/features/registrar/contact_spec.rb b/spec/features/registrar/contact_spec.rb
index bf0ebcda4..6e3b1dfba 100644
--- a/spec/features/registrar/contact_spec.rb
+++ b/spec/features/registrar/contact_spec.rb
@@ -62,7 +62,7 @@ feature 'Contact', type: :feature do
visit '/registrar/contacts/new'
current_path.should == '/registrar/contacts/new'
- fill_in 'depp_contact_ident', with: 'bic-ident'
+ fill_in 'depp_contact_ident', with: 'org-ident'
fill_in 'depp_contact_name', with: 'Business Name Ltd'
fill_in 'depp_contact_email', with: 'example@example.com'
fill_in 'depp_contact_street', with: 'Example street 12'
@@ -72,7 +72,7 @@ feature 'Contact', type: :feature do
click_button 'Create'
page.should have_text('Business Name Ltd')
- page.should have_text('bic-ident [EE bic]')
+ page.should have_text('org-ident [EE org]')
end
it 'should create new contact with success' do
diff --git a/spec/features/registrar/domain_spec.rb b/spec/features/registrar/domain_spec.rb
index 3eecd5d10..956ddef4d 100644
--- a/spec/features/registrar/domain_spec.rb
+++ b/spec/features/registrar/domain_spec.rb
@@ -54,6 +54,8 @@ feature 'Domains', type: :feature do
click_link "#{user2} (#{user2.roles.first}) - #{user2.registrar}"
+ visit '/registrar/domains'
+
page.should_not have_text(d1.name)
page.should have_text(d2.name)
end
diff --git a/spec/features/registrar/invoices_spec.rb b/spec/features/registrar/invoices_spec.rb
index 37e3737dd..fee6e8fb6 100644
--- a/spec/features/registrar/invoices_spec.rb
+++ b/spec/features/registrar/invoices_spec.rb
@@ -20,7 +20,7 @@ feature 'Invoices', type: :feature do
end
it 'should navigate to the domains index page' do
- current_path.should == '/registrar'
+ current_path.should == '/registrar/poll'
click_link 'Billing'
current_path.should == '/registrar/invoices'
@@ -58,6 +58,7 @@ feature 'Invoices', type: :feature do
page.should have_text(@invoice.to_s)
page.should have_text('Buyer')
click_link "#{user2} (#{user2.roles.first}) - #{user2.registrar}"
+ visit "/registrar/invoices/#{@invoice.id}"
page.should have_text('You are not authorized to access this page.')
visit "/registrar/invoices/#{@invoice.id}/forward"
diff --git a/spec/models/contact_spec.rb b/spec/models/contact_spec.rb
index 4407fdac2..23c180647 100644
--- a/spec/models/contact_spec.rb
+++ b/spec/models/contact_spec.rb
@@ -53,8 +53,8 @@ describe Contact do
@contact.errors[:phone].should == ["Phone nr is invalid"]
end
- it 'should require country code when bic' do
- @contact.ident_type = 'bic'
+ it 'should require country code when org' do
+ @contact.ident_type = 'org'
@contact.valid?
@contact.errors[:ident_country_code].should == ['is missing']
end
@@ -66,7 +66,7 @@ describe Contact do
end
it 'should validate correct country code' do
- @contact.ident_type = 'bic'
+ @contact.ident_type = 'org'
@contact.ident_country_code = 'EE'
@contact.valid?
@@ -75,7 +75,7 @@ describe Contact do
it 'should require valid country code' do
@contact.ident = '123'
- @contact.ident_type = 'bic'
+ @contact.ident_type = 'org'
@contact.ident_country_code = 'INVALID'
@contact.valid?
@@ -84,7 +84,7 @@ describe Contact do
end
it 'should convert to alpha2 country code' do
- @contact.ident_type = 'bic'
+ @contact.ident_type = 'org'
@contact.ident_country_code = 'ee'
@contact.valid?
@@ -116,6 +116,10 @@ describe Contact do
@contact.valid?
@contact.errors[:email].should == ['Email is invalid']
end
+
+ it 'should have ident updated because the logic itself is dedicated for legacy contacts ' do
+ @contact.ident_updated_at.should_not == nil
+ end
end
context 'with valid attributes' do
@@ -148,8 +152,8 @@ describe Contact do
@contact.domains_present?.should == false
end
- it 'bic should be valid' do
- @contact.ident_type = 'bic'
+ it 'org should be valid' do
+ @contact.ident_type = 'org'
@contact.ident = '1234'
@contact.valid?
@contact.errors.full_messages.should match_array([])
@@ -234,6 +238,18 @@ describe Contact do
contact.status_notes['someotherstatus'].should == nil
end
+ it 'should have ident already updated because the logic itself is only for legacy contacts' do
+ @contact.ident_updated_at.should_not == nil
+ end
+
+ it 'should have not update ident updated at when initializing old contact' do
+ # creating a legacy contact
+ contact = Fabricate(:contact)
+ contact.update_column(:ident_updated_at, nil)
+
+ Contact.find(contact.id).ident_updated_at.should == nil
+ end
+
context 'as birthday' do
before do
@domain = Fabricate(:domain)
diff --git a/spec/models/domain_spec.rb b/spec/models/domain_spec.rb
index 48cfa0dc4..8ec5f4b25 100644
--- a/spec/models/domain_spec.rb
+++ b/spec/models/domain_spec.rb
@@ -454,8 +454,12 @@ describe Domain do
@domain.set_pending_delete
@domain.save
- @domain.statuses.should == ['pendingDelete']
+ @domain.statuses.should == ['pendingDelete', 'serverHold']
@domain.pending_delete?.should == true
+ @domain.statuses = ['serverManualInzone']
+ @domain.save
+ @domain.set_pending_delete
+ @domain.statuses.sort.should == ['pendingDelete', 'serverManualInzone'].sort
@domain.statuses = DomainStatus::OK # restore
end
@@ -463,6 +467,7 @@ describe Domain do
@domain.statuses = DomainStatus::OK # restore
@domain.pending_delete?.should == false
@domain.statuses << DomainStatus::CLIENT_DELETE_PROHIBITED
+ @domain.save
@domain.set_pending_delete.should == nil
|