Merge remote-tracking branch 'origin/master' into 110687814-update_values

# Conflicts:
#	app/models/epp/domain.rb
This commit is contained in:
Stas 2016-04-08 18:11:47 +03:00
commit ae3467a8b1
304 changed files with 3676 additions and 426401 deletions

1
.gitignore vendored
View file

@ -5,6 +5,7 @@ capybara-*.html
/tmp /tmp
/db/*.sqlite3 /db/*.sqlite3
/public/system /public/system
/public/assets
/coverage/ /coverage/
/spec/tmp /spec/tmp
**.orig **.orig

10
Gemfile
View file

@ -8,7 +8,7 @@ end if Bundler::VERSION < '2'
source 'https://rubygems.org' source 'https://rubygems.org'
# core # core
gem 'rails', '4.2.4' # when update, all initializers eis_custom files needs check/update gem 'rails', '4.2.5.2' # when update, all initializers eis_custom files needs check/update
gem 'iso8601', '0.8.6' # for dates and times gem 'iso8601', '0.8.6' # for dates and times
gem 'hashie-forbidden_attributes', '0.1.1' gem 'hashie-forbidden_attributes', '0.1.1'
gem 'SyslogLogger', '2.0', require: 'syslog/logger' gem 'SyslogLogger', '2.0', require: 'syslog/logger'
@ -31,17 +31,17 @@ gem 'rails-settings-cached', '0.4.1' # for settings
# html-xml # html-xml
gem 'haml-rails', '0.9.0' # haml for views gem 'haml-rails', '0.9.0' # haml for views
gem 'nokogiri', '1.6.6.2' # For XML parsing gem 'nokogiri', '1.6.7.2' # For XML parsing
# style # style
gem 'sass-rails', '5.0.3' # sass style gem 'sass-rails', '5.0.3' # sass style
gem 'bootstrap-sass', '3.3.5.1' # bootstrap style gem 'bootstrap-sass', '3.3.5.1' # bootstrap style
# js # js
gem 'uglifier', '2.7.1' # minifies js gem 'uglifier', '2.7.2' # minifies js
gem 'coffee-rails', '4.1.0' # coffeescript support gem 'coffee-rails', '4.1.0' # coffeescript support
gem 'turbolinks', '2.5.3' # faster page load gem 'turbolinks', '2.5.3' # faster page load
gem 'jquery-rails', '4.0.3' # jquery gem 'jquery-rails', '4.0.4' # jquery
gem 'selectize-rails', '0.12.1' # include selectize.js for select gem 'selectize-rails', '0.12.1' # include selectize.js for select
gem 'therubyracer', '0.12.2', platforms: :ruby gem 'therubyracer', '0.12.2', platforms: :ruby
gem 'jquery-validation-rails', '1.13.1' # validate on client side gem 'jquery-validation-rails', '1.13.1' # validate on client side
@ -56,7 +56,7 @@ gem 'bootstrap-datepicker-rails', '1.3.1.1' # datepicker
gem 'liquid', '3.0.6' # for email templates gem 'liquid', '3.0.6' # for email templates
# rights # rights
gem 'devise', '3.5.1' # authenitcation gem 'devise', '3.5.4' # authenitcation
gem 'cancancan', '1.11.0' # autharization gem 'cancancan', '1.11.0' # autharization
# rest api # rest api

View file

@ -50,38 +50,38 @@ GEM
specs: specs:
SyslogLogger (2.0) SyslogLogger (2.0)
abstract_type (0.0.7) abstract_type (0.0.7)
actionmailer (4.2.4) actionmailer (4.2.5.2)
actionpack (= 4.2.4) actionpack (= 4.2.5.2)
actionview (= 4.2.4) actionview (= 4.2.5.2)
activejob (= 4.2.4) activejob (= 4.2.5.2)
mail (~> 2.5, >= 2.5.4) mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 1.0, >= 1.0.5) rails-dom-testing (~> 1.0, >= 1.0.5)
actionpack (4.2.4) actionpack (4.2.5.2)
actionview (= 4.2.4) actionview (= 4.2.5.2)
activesupport (= 4.2.4) activesupport (= 4.2.5.2)
rack (~> 1.6) rack (~> 1.6)
rack-test (~> 0.6.2) rack-test (~> 0.6.2)
rails-dom-testing (~> 1.0, >= 1.0.5) rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2) rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (4.2.4) actionview (4.2.5.2)
activesupport (= 4.2.4) activesupport (= 4.2.5.2)
builder (~> 3.1) builder (~> 3.1)
erubis (~> 2.7.0) erubis (~> 2.7.0)
rails-dom-testing (~> 1.0, >= 1.0.5) rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2) rails-html-sanitizer (~> 1.0, >= 1.0.2)
activejob (4.2.4) activejob (4.2.5.2)
activesupport (= 4.2.4) activesupport (= 4.2.5.2)
globalid (>= 0.3.0) globalid (>= 0.3.0)
activemodel (4.2.4) activemodel (4.2.5.2)
activesupport (= 4.2.4) activesupport (= 4.2.5.2)
builder (~> 3.1) builder (~> 3.1)
activerecord (4.2.4) activerecord (4.2.5.2)
activemodel (= 4.2.4) activemodel (= 4.2.5.2)
activesupport (= 4.2.4) activesupport (= 4.2.5.2)
arel (~> 6.0) arel (~> 6.0)
activerecord-import (0.7.0) activerecord-import (0.7.0)
activerecord (>= 3.0) activerecord (>= 3.0)
activesupport (4.2.4) activesupport (4.2.5.2)
i18n (~> 0.7) i18n (~> 0.7)
json (~> 1.7, >= 1.7.7) json (~> 1.7, >= 1.7.7)
minitest (~> 5.1) minitest (~> 5.1)
@ -157,6 +157,7 @@ GEM
concord (0.1.5) concord (0.1.5)
adamantium (~> 0.2.0) adamantium (~> 0.2.0)
equalizer (~> 0.0.9) equalizer (~> 0.0.9)
concurrent-ruby (1.0.1)
countries (0.11.4) countries (0.11.4)
currencies (~> 0.4.2) currencies (~> 0.4.2)
i18n_data (~> 0.7.0) i18n_data (~> 0.7.0)
@ -173,7 +174,7 @@ GEM
activerecord (>= 3.1.0, < 5.0.0) activerecord (>= 3.1.0, < 5.0.0)
descendants_tracker (0.0.4) descendants_tracker (0.0.4)
thread_safe (~> 0.3, >= 0.3.1) thread_safe (~> 0.3, >= 0.3.1)
devise (3.5.1) devise (3.5.4)
bcrypt (~> 3.0) bcrypt (~> 3.0)
orm_adapter (~> 0.1) orm_adapter (~> 0.1)
railties (>= 3.2.6, < 5) railties (>= 3.2.6, < 5)
@ -276,7 +277,7 @@ GEM
jbuilder (2.2.16) jbuilder (2.2.16)
activesupport (>= 3.0.0, < 5) activesupport (>= 3.0.0, < 5)
multi_json (~> 1.2) multi_json (~> 1.2)
jquery-rails (4.0.3) jquery-rails (4.0.4)
rails-dom-testing (~> 1.0) rails-dom-testing (~> 1.0)
railties (>= 4.2.0) railties (>= 4.2.0)
thor (>= 0.14, < 2.0) thor (>= 0.14, < 2.0)
@ -306,12 +307,12 @@ GEM
memoizable (0.4.2) memoizable (0.4.2)
thread_safe (~> 0.3, >= 0.3.1) thread_safe (~> 0.3, >= 0.3.1)
method_source (0.8.2) method_source (0.8.2)
mime-types (2.6.1) mime-types (2.99.1)
mina (0.3.1) mina (0.3.1)
open4 (~> 1.3.4) open4 (~> 1.3.4)
rake rake
mini_portile (0.6.2) mini_portile2 (2.0.0)
minitest (5.8.0) minitest (5.8.4)
monetize (1.1.0) monetize (1.1.0)
money (~> 6.5.0) money (~> 6.5.0)
money (6.5.1) money (6.5.1)
@ -326,8 +327,8 @@ GEM
nenv (0.2.0) nenv (0.2.0)
netrc (0.11.0) netrc (0.11.0)
newrelic_rpm (3.12.0.288) newrelic_rpm (3.12.0.288)
nokogiri (1.6.6.2) nokogiri (1.6.7.2)
mini_portile (~> 0.6.0) mini_portile2 (~> 2.0.0.rc2)
nori (2.6.0) nori (2.6.0)
notiffany (0.0.7) notiffany (0.0.7)
nenv (~> 0.1) nenv (~> 0.1)
@ -370,16 +371,16 @@ GEM
rack-test (0.6.3) rack-test (0.6.3)
rack (>= 1.0) rack (>= 1.0)
railroady (1.3.0) railroady (1.3.0)
rails (4.2.4) rails (4.2.5.2)
actionmailer (= 4.2.4) actionmailer (= 4.2.5.2)
actionpack (= 4.2.4) actionpack (= 4.2.5.2)
actionview (= 4.2.4) actionview (= 4.2.5.2)
activejob (= 4.2.4) activejob (= 4.2.5.2)
activemodel (= 4.2.4) activemodel (= 4.2.5.2)
activerecord (= 4.2.4) activerecord (= 4.2.5.2)
activesupport (= 4.2.4) activesupport (= 4.2.5.2)
bundler (>= 1.3.0, < 2.0) bundler (>= 1.3.0, < 2.0)
railties (= 4.2.4) railties (= 4.2.5.2)
sprockets-rails sprockets-rails
rails-deprecated_sanitizer (1.0.3) rails-deprecated_sanitizer (1.0.3)
activesupport (>= 4.2.0.alpha) activesupport (>= 4.2.0.alpha)
@ -387,18 +388,18 @@ GEM
activesupport (>= 4.2.0.beta, < 5.0) activesupport (>= 4.2.0.beta, < 5.0)
nokogiri (~> 1.6.0) nokogiri (~> 1.6.0)
rails-deprecated_sanitizer (>= 1.0.1) rails-deprecated_sanitizer (>= 1.0.1)
rails-html-sanitizer (1.0.2) rails-html-sanitizer (1.0.3)
loofah (~> 2.0) loofah (~> 2.0)
rails-settings-cached (0.4.1) rails-settings-cached (0.4.1)
rails (>= 4.0.0) rails (>= 4.0.0)
railties (4.2.4) railties (4.2.5.2)
actionpack (= 4.2.4) actionpack (= 4.2.5.2)
activesupport (= 4.2.4) activesupport (= 4.2.5.2)
rake (>= 0.8.7) rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0) thor (>= 0.18.1, < 2.0)
rainbow (2.0.0) rainbow (2.0.0)
raindrops (0.15.0) raindrops (0.15.0)
rake (10.4.2) rake (10.5.0)
ransack (1.5.1) ransack (1.5.1)
actionpack (>= 3.0) actionpack (>= 3.0)
activerecord (>= 3.0) activerecord (>= 3.0)
@ -415,8 +416,8 @@ GEM
unparser (~> 0.2.2) unparser (~> 0.2.2)
ref (2.0.0) ref (2.0.0)
request_store (1.1.0) request_store (1.1.0)
responders (2.1.0) responders (2.1.1)
railties (>= 4.2.0, < 5) railties (>= 4.2.0, < 5.1)
rest-client (1.8.0) rest-client (1.8.0)
http-cookie (>= 1.0.2, < 2.0) http-cookie (>= 1.0.2, < 2.0)
mime-types (>= 1.16, < 3.0) mime-types (>= 1.16, < 3.0)
@ -500,12 +501,13 @@ GEM
spring (1.3.6) spring (1.3.6)
spring-commands-rspec (1.0.4) spring-commands-rspec (1.0.4)
spring (>= 0.9.1) spring (>= 0.9.1)
sprockets (3.3.4) sprockets (3.5.2)
rack (~> 1.0) concurrent-ruby (~> 1.0)
sprockets-rails (2.3.3) rack (> 1, < 3)
actionpack (>= 3.0) sprockets-rails (3.0.4)
activesupport (>= 3.0) actionpack (>= 4.0)
sprockets (>= 2.8, < 4.0) activesupport (>= 4.0)
sprockets (>= 3.0.0)
sys-uname (0.9.0) sys-uname (0.9.0)
ffi (>= 1.0.0) ffi (>= 1.0.0)
terminal-table (1.5.2) terminal-table (1.5.2)
@ -521,7 +523,7 @@ GEM
coffee-rails coffee-rails
tzinfo (1.2.2) tzinfo (1.2.2)
thread_safe (~> 0.1) thread_safe (~> 0.1)
uglifier (2.7.1) uglifier (2.7.2)
execjs (>= 0.3.0) execjs (>= 0.3.0)
json (>= 1.8.0) json (>= 1.8.0)
unf (0.1.4) unf (0.1.4)
@ -548,7 +550,7 @@ GEM
coercible (~> 1.0) coercible (~> 1.0)
descendants_tracker (~> 0.0, >= 0.0.3) descendants_tracker (~> 0.0, >= 0.0.3)
equalizer (~> 0.0, >= 0.0.9) equalizer (~> 0.0, >= 0.0.9)
warden (1.2.3) warden (1.2.6)
rack (>= 1.0) rack (>= 1.0)
wasabi (3.5.0) wasabi (3.5.0)
httpi (~> 2.0) httpi (~> 2.0)
@ -584,7 +586,7 @@ DEPENDENCIES
data_migrate! data_migrate!
database_cleaner (= 1.4.1) database_cleaner (= 1.4.1)
deep_cloneable (= 2.1.1) deep_cloneable (= 2.1.1)
devise (= 3.5.1) devise (= 3.5.4)
digidoc_client (= 0.2.1) digidoc_client (= 0.2.1)
epp (= 1.4.2)! epp (= 1.4.2)!
epp-xml (= 1.0.4) epp-xml (= 1.0.4)
@ -603,7 +605,7 @@ DEPENDENCIES
isikukood isikukood
iso8601 (= 0.8.6) iso8601 (= 0.8.6)
jbuilder (= 2.2.16) jbuilder (= 2.2.16)
jquery-rails (= 4.0.3) jquery-rails (= 4.0.4)
jquery-ui-rails (= 5.0.5) jquery-ui-rails (= 5.0.5)
jquery-validation-rails (= 1.13.1) jquery-validation-rails (= 1.13.1)
kaminari (= 0.16.3) kaminari (= 0.16.3)
@ -612,7 +614,7 @@ DEPENDENCIES
mina (= 0.3.1) mina (= 0.3.1)
money-rails (= 1.4.1) money-rails (= 1.4.1)
newrelic_rpm (= 3.12.0.288) newrelic_rpm (= 3.12.0.288)
nokogiri (= 1.6.6.2) nokogiri (= 1.6.7.2)
nprogress-rails (= 0.1.6.7) nprogress-rails (= 0.1.6.7)
paper_trail! paper_trail!
pdfkit (= 0.6.2) pdfkit (= 0.6.2)
@ -625,7 +627,7 @@ DEPENDENCIES
que-web (= 0.4.0) que-web (= 0.4.0)
que_mailer! que_mailer!
railroady (= 1.3.0) railroady (= 1.3.0)
rails (= 4.2.4) rails (= 4.2.5.2)
rails-settings-cached (= 0.4.1) rails-settings-cached (= 0.4.1)
rake rake
ransack (= 1.5.1) ransack (= 1.5.1)
@ -645,7 +647,7 @@ DEPENDENCIES
therubyracer (= 0.12.2) therubyracer (= 0.12.2)
traceroute (= 0.5.0) traceroute (= 0.5.0)
turbolinks (= 2.5.3) turbolinks (= 2.5.3)
uglifier (= 2.7.1) uglifier (= 2.7.2)
unicorn unicorn
uuidtools (= 2.1.5) uuidtools (= 2.1.5)
validates_email_format_of (= 1.6.3) validates_email_format_of (= 1.6.3)

View file

@ -27,3 +27,16 @@ $(document).on 'page:change', ->
form.find('.js-ident-tip').show() form.find('.js-ident-tip').show()
$('.js-contact-form').trigger('restoreDefault') $('.js-contact-form').trigger('restoreDefault')
$('[data-legal-document]').each (i, fileInput)->
minSize = 3 * 1024 # 3kB
maxSize = 8 * 1024 * 1024; # 8 MB
$(fileInput).closest('form').submit (e) ->
if (files = fileInput.files).length
fileSize = files[0].size
if fileSize < minSize
alert 'Document size should be more than 3kB'
return false
else if fileSize > maxSize
alert 'Document size should be less than 8MB'
return false

View file

@ -1,8 +1,8 @@
class Admin::AccountActivitiesController < AdminController class Admin::AccountActivitiesController < AdminController
load_and_authorize_resource load_and_authorize_resource
before_action :set_default_dates, only: [:index]
def index # rubocop: disable Metrics/AbcSize def index # rubocop: disable Metrics/AbcSize
params[:q] ||= {}
ca_cache = params[:q][:created_at_lteq] ca_cache = params[:q][:created_at_lteq]
begin begin
@ -25,10 +25,11 @@ class Admin::AccountActivitiesController < AdminController
@account_activities = @q.result.page(params[:page]).per(params[:results_per_page]) @account_activities = @q.result.page(params[:page]).per(params[:results_per_page])
sort = @account_activities.orders.map(&:to_sql).join(",") sort = @account_activities.orders.map(&:to_sql).join(",")
# can do here inline SQL as it's our
if params[:page] && params[:page].to_i > 1 if params[:page] && params[:page].to_i > 1
@sum = @q.result.reorder(sort).limit(@account_activities.offset_value) + @b.result.where.not(id: @q.result.map(&:id)) @sum = @q.result.reorder(sort).limit(@account_activities.offset_value).sum(:sum) + @b.result.where("account_activities.id NOT IN (#{@q.result.select(:id).to_sql})").sum(:sum)
else else
@sum = @b.result.where.not(id: @q.result.map(&:id)) @sum = @b.result.where("account_activities.id NOT IN (#{@q.result.select(:id).to_sql})").sum(:sum)
end end
respond_to do |format| respond_to do |format|
@ -40,4 +41,20 @@ class Admin::AccountActivitiesController < AdminController
params[:q][:created_at_lteq] = ca_cache params[:q][:created_at_lteq] = ca_cache
end end
def set_default_dates
params[:q] ||= {}
if params[:q][:created_at_gteq].nil? && params[:q][:created_at_lteq].nil? && params[:created_after].present?
default_date = params[:created_after]
if !['today', 'tomorrow', 'yesterday'].include?(default_date)
default_date = 'today'
end
params[:q][:created_at_gteq] = Date.send(default_date).strftime("%Y-%m-%d")
end
end
end end

View file

@ -2,46 +2,54 @@ class Admin::BlockedDomainsController < AdminController
load_and_authorize_resource load_and_authorize_resource
def index def index
bd = BlockedDomain.pluck(:name)
if bd params[:q] ||= {}
@blocked_domains = bd.to_yaml.gsub("---\n", '').gsub("-", '').gsub(" ", '') domains = BlockedDomain.all.order(:name)
@q = domains.search(params[:q])
@domains = @q.result.page(params[:page])
@domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i > 0
end end
def new
@domain = BlockedDomain.new
end end
def create def create
@blocked_domains = params[:blocked_domains]
begin @domain = BlockedDomain.new(blocked_domain_params)
params[:blocked_domains] = "---\n" if params[:blocked_domains].blank?
names = YAML.load(params[:blocked_domains])
fail if names == false
rescue
flash.now[:alert] = I18n.t('invalid_yaml')
logger.warn 'Invalid YAML'
render :index and return
end
names = names.split(' ') if @domain.save
result = true flash[:notice] = I18n.t('domain_added')
BlockedDomain.transaction do redirect_to admin_blocked_domains_path
existing = BlockedDomain.any_of_domains(names).pluck(:id)
BlockedDomain.where.not(id: existing).destroy_all
names.each do |name|
rec = BlockedDomain.find_or_initialize_by(name: name)
unless rec.save
result = false
raise ActiveRecord::Rollback
end
end
end
if result
flash[:notice] = I18n.t('record_updated')
redirect_to :back
else else
flash.now[:alert] = I18n.t('failed_to_update_record') flash.now[:alert] = I18n.t('failed_to_add_domain')
render :index render 'new'
end
end
def delete
if BlockedDomain.find(params[:id]).destroy
flash[:notice] = I18n.t('domain_deleted')
redirect_to admin_blocked_domains_path
else
flash.now[:alert] = I18n.t('failed_to_delete_domain')
redirect_to admin_blocked_domains_path
end end
end end
def blocked_domain_params
params.require(:blocked_domain).permit(:name)
end
private
def set_domain
@domain = BlockedDomain.find(params[:id])
end
end end

View file

@ -20,6 +20,8 @@ class Admin::ContactsController < AdminController
else else
contacts = Contact.includes(:registrar) contacts = Contact.includes(:registrar)
end end
contacts = contacts.where("ident_country_code is null or ident_country_code=''") if params[:only_no_country_code].eql?('1')
normalize_search_parameters do normalize_search_parameters do
@q = contacts.search(search_params) @q = contacts.search(search_params)

View file

@ -1,5 +1,6 @@
class Admin::EppLogsController < AdminController class Admin::EppLogsController < AdminController
load_and_authorize_resource class: ApiLog::EppLog load_and_authorize_resource class: ApiLog::EppLog
before_action :set_default_dates, only: [:index]
def index def index
@q = ApiLog::EppLog.search(params[:q]) @q = ApiLog::EppLog.search(params[:q])
@ -10,4 +11,19 @@ class Admin::EppLogsController < AdminController
def show def show
@epp_log = ApiLog::EppLog.find(params[:id]) @epp_log = ApiLog::EppLog.find(params[:id])
end end
def set_default_dates
params[:q] ||= {}
if params[:q][:created_at_gteq].nil? && params[:q][:created_at_lteq].nil? && params[:created_after].present?
default_date = params[:created_after]
if !['today', 'tomorrow', 'yesterday'].include?(default_date)
default_date = 'today'
end
params[:q][:created_at_gteq] = Date.send(default_date).strftime("%Y-%m-%d")
end
end
end end

View file

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

View file

@ -57,7 +57,7 @@ class Admin::RegistrarsController < AdminController
def registrar_params def registrar_params
params.require(:registrar).permit( params.require(:registrar).permit(
:name, :reg_no, :vat_no, :street, :city, :state, :zip, :billing_address, :name, :reg_no, :vat_no, :street, :city, :state, :zip, :billing_address,
:country_code, :email, :phone, :billing_email, :code :country_code, :email, :phone, :billing_email, :code, :test_registrar
) )
end end
end end

View file

@ -1,5 +1,6 @@
class Admin::ReppLogsController < AdminController class Admin::ReppLogsController < AdminController
load_and_authorize_resource class: ApiLog::ReppLog load_and_authorize_resource class: ApiLog::ReppLog
before_action :set_default_dates, only: [:index]
def index def index
@q = ApiLog::ReppLog.search(params[:q]) @q = ApiLog::ReppLog.search(params[:q])
@ -10,4 +11,20 @@ class Admin::ReppLogsController < AdminController
def show def show
@repp_log = ApiLog::ReppLog.find(params[:id]) @repp_log = ApiLog::ReppLog.find(params[:id])
end end
def set_default_dates
params[:q] ||= {}
if params[:q][:created_at_gteq].nil? && params[:q][:created_at_lteq].nil? && params[:created_after].present?
default_date = params[:created_after]
if !['today', 'tomorrow', 'yesterday'].include?(default_date)
default_date = 'today'
end
params[:q][:created_at_gteq] = Date.send(default_date).strftime("%Y-%m-%d")
end
end
end end

View file

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

View file

@ -59,6 +59,7 @@ class Admin::SettingsController < AdminController
:transfer_wait_time, :transfer_wait_time,
:invoice_number_min, :invoice_number_min,
:invoice_number_max, :invoice_number_max,
:days_to_keep_business_registry_cache,
:days_to_keep_invoices_active, :days_to_keep_invoices_active,
:days_to_keep_overdue_invoices_active, :days_to_keep_overdue_invoices_active,
:days_to_renew_domain_before_expire, :days_to_renew_domain_before_expire,

View file

@ -32,7 +32,7 @@ class ApplicationController < ActionController::Base
if registrar_request? if registrar_request?
registrar_root_url registrar_root_url
elsif registrant_request? elsif registrant_request?
registrant_root_url registrant_login_url
elsif admin_request? elsif admin_request?
admin_root_url admin_root_url
end end

View file

@ -19,6 +19,8 @@ class Epp::ContactsController < EppController
authorize! :create, Epp::Contact authorize! :create, Epp::Contact
@contact = Epp::Contact.new(params[:parsed_frame], current_user.registrar) @contact = Epp::Contact.new(params[:parsed_frame], current_user.registrar)
@contact.add_legal_file_to_new(params[:parsed_frame])
if @contact.save if @contact.save
render_epp_response '/epp/contacts/create' render_epp_response '/epp/contacts/create'
else else
@ -39,7 +41,7 @@ class Epp::ContactsController < EppController
def delete def delete
authorize! :delete, @contact, @password authorize! :delete, @contact, @password
if @contact.destroy_and_clean if @contact.destroy_and_clean(params[:parsed_frame])
render_epp_response '/epp/contacts/delete' render_epp_response '/epp/contacts/delete'
else else
handle_errors(@contact) handle_errors(@contact)

View file

@ -30,6 +30,8 @@ class Epp::DomainsController < EppController
handle_errors and return unless balance_ok?('create') # loads pricelist in this method handle_errors and return unless balance_ok?('create') # loads pricelist in this method
ActiveRecord::Base.transaction do ActiveRecord::Base.transaction do
@domain.add_legal_file_to_new(params[:parsed_frame])
if @domain.save # TODO: Maybe use validate: false here because we have already validated the domain? if @domain.save # TODO: Maybe use validate: false here because we have already validated the domain?
current_user.registrar.debit!({ current_user.registrar.debit!({
sum: @domain_pricelist.price.amount, sum: @domain_pricelist.price.amount,

View file

@ -361,9 +361,10 @@ class EppController < ApplicationController
if request_command == 'login' && frame.present? if request_command == 'login' && frame.present?
frame.gsub!(/pw>.+<\//, 'pw>[FILTERED]</') frame.gsub!(/pw>.+<\//, 'pw>[FILTERED]</')
end end
trimmed_request = frame.gsub(/<eis:legalDocument([^>]+)>([^<])+<\/eis:legalDocument>/, "<eis:legalDocument>[FILTERED]</eis:legalDocument>")
ApiLog::EppLog.create({ ApiLog::EppLog.create({
request: frame, request: trimmed_request,
request_command: request_command, request_command: request_command,
request_successful: epp_errors.empty?, request_successful: epp_errors.empty?,
request_object: params[:epp_object_type], request_object: params[:epp_object_type],

View file

@ -0,0 +1,26 @@
class Registrant::ContactsController < RegistrantController
helper_method :domain_ids
def show
@contact = Contact.where(id: contacts).find_by(id: params[:id])
@current_user = current_user
authorize! :read, @contact
end
def contacts
begin
DomainContact.where(domain_id: domain_ids).pluck(:contact_id) | Domain.where(id: domain_ids).pluck(:registrant_id)
rescue Soap::Arireg::NotAvailableError => error
flash[:notice] = I18n.t(error.json[:message])
Rails.logger.fatal("[EXCEPTION] #{error.to_s}")
[]
end
end
def domain_ids
@domain_ids ||= begin
ident_cc, ident = @current_user.registrant_ident.to_s.split '-'
BusinessRegistryCache.fetch_by_ident_and_cc(ident, ident_cc).associated_domain_ids
end
end
end

View file

@ -1,5 +1,86 @@
class Registrant::DomainsController < RegistrantController class Registrant::DomainsController < RegistrantController
def index def index
authorize! :view, :registrant_domains authorize! :view, :registrant_domains
params[:q] ||= {}
normalize_search_parameters do
@q = domains.search(params[:q])
@domains = @q.result.page(params[:page])
end
@domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i > 0
end
def show
@domain = domains.find(params[:id])
authorize! :read, @domain
end
def set_domain
@domain = domains.find(params[:id])
end
def domain_verification_url
authorize! :view, :registrant_domains
dom = domains.find(params[:id])
if (dom.statuses.include?(DomainStatus::PENDING_UPDATE) || dom.statuses.include?(DomainStatus::PENDING_DELETE_CONFIRMATION)) &&
dom.pending_json.present?
@domain = dom
confirm_path = get_confirm_path(dom.statuses)
@verification_url = "#{confirm_path}/#{@domain.id}?token=#{@domain.registrant_verification_token}"
else
flash[:warning] = I18n.t('available_verification_url_not_found')
redirect_to registrant_domain_path(dom.id)
end end
end end
def download_list
authorize! :view, :registrant_domains
params[:q] ||= {}
normalize_search_parameters do
@q = domains.search(params[:q])
@domains = @q
end
respond_to do |format|
format.csv { render text: @domains.result.to_csv }
format.pdf do
pdf = @domains.result.pdf(render_to_string('registrant/domains/download_list', layout: false))
send_data pdf, filename: 'domains.pdf'
end
end
end
def domains
ident_cc, ident = @current_user.registrant_ident.split '-'
begin
BusinessRegistryCache.fetch_associated_domains ident, ident_cc
rescue Soap::Arireg::NotAvailableError => error
flash[:notice] = I18n.t(error.json[:message])
Rails.logger.fatal("[EXCEPTION] #{error.to_s}")
current_user.domains
end
end
def normalize_search_parameters
ca_cache = params[:q][:valid_to_lteq]
begin
end_time = params[:q][:valid_to_lteq].try(:to_date)
params[:q][:valid_to_lteq] = end_time.try(:end_of_day)
rescue
logger.warn('Invalid date')
end
yield
params[:q][:valid_to_lteq] = ca_cache
end
def get_confirm_path(statuses)
if statuses.include?(DomainStatus::PENDING_UPDATE)
"#{ENV['registrant_url']}/registrant/domain_update_confirms"
elsif statuses.include?(DomainStatus::PENDING_DELETE_CONFIRMATION)
"#{ENV['registrant_url']}/registrant/domain_delete_confirms"
end
end
end

View file

@ -0,0 +1,7 @@
class Registrant::RegistrarsController < RegistrantController
def show
@registrar = Registrar.find(params[:id])
authorize! :read, @registrar
end
end

View file

@ -6,15 +6,10 @@ class Registrant::SessionsController < Devise::SessionsController
# rubocop: disable Metrics/AbcSize # rubocop: disable Metrics/AbcSize
def id def id
if Rails.env.development? id_code, id_issuer = request.env['SSL_CLIENT_S_DN'], request.env['SSL_CLIENT_I_DN_O']
sign_in(RegistrantUser.find_or_create_by_idc_data('test'), event: :authentication) id_code, id_issuer = 'test', RegistrantUser::ACCEPTED_ISSUER if Rails.env.development?
return redirect_to registrant_root_url
end
logger.error request.env['SSL_CLIENT_S_DN'] @user = RegistrantUser.find_or_create_by_idc_data(id_code, id_issuer)
logger.error request.env['SSL_CLIENT_S_DN'].encoding
logger.error request.env['SSL_CLIENT_I_DN_O']
@user = RegistrantUser.find_or_create_by_idc_data(request.env['SSL_CLIENT_S_DN'], request.env['SSL_CLIENT_I_DN_O'])
if @user if @user
sign_in(@user, event: :authentication) sign_in(@user, event: :authentication)
redirect_to registrant_root_url redirect_to registrant_root_url

View file

@ -1,5 +1,9 @@
class Registrant::WhoisController < RegistrantController class Registrant::WhoisController < RegistrantController
def index def index
authorize! :view, :registrant_whois authorize! :view, :registrant_whois
if params[:domain_name].present?
@domain = WhoisRecord.find_by(name: params[:domain_name]);
end
end end
end end

View file

@ -0,0 +1,17 @@
class DomainDeleteJob < Que::Job
def run(domain_id)
domain = Domain.find(domain_id)
::PaperTrail.whodunnit = "job - #{self.class.name}"
WhoisRecord.where(domain_id: domain.id).destroy_all
domain.destroy
bye_bye = domain.versions.last
domain.registrar.messages.create!(
body: "#{I18n.t(:domain_deleted)}: #{domain.name}",
attached_obj_id: bye_bye.id,
attached_obj_type: bye_bye.class.to_s
)
end
end

View file

@ -0,0 +1,10 @@
class DomainSetDeleteCandidateJob < Que::Job
def run(domain_id)
domain = Domain.find(domain_id)
domain.statuses << DomainStatus::DELETE_CANDIDATE
::PaperTrail.whodunnit = "job - #{self.class.name}"
domain.save(validate: false)
DomainDeleteJob.enqueue(domain.id, run_at: rand(((24*60) - (DateTime.now.hour * 60 + DateTime.now.minute))).minutes.from_now)
end
end

View file

@ -3,8 +3,8 @@ class RegenerateRegistrarWhoisesJob < Que::Job
# no return as we want restart job if fails # no return as we want restart job if fails
registrar = Registrar.find(registrar_id) registrar = Registrar.find(registrar_id)
registrar.whois_records.select(:id).find_in_batches(batch_size: 20) do |group| registrar.whois_records.select(:name).find_in_batches(batch_size: 20) do |group|
RegenerateWhoisRecordJob.enqueue group.map(&:id) UpdateWhoisRecordJob.enqueue group.map(&:name), 'domain'
end end
end end
end end

View file

@ -1,10 +0,0 @@
class RegenerateWhoisRecordJob < Que::Job
def run(ids)
ids.each do |id|
record = WhoisRecord.find_by(id: id)
return unless record
record.save
end
end
end

View file

@ -1,16 +1,52 @@
class UpdateWhoisRecordJob < Que::Job class UpdateWhoisRecordJob < Que::Job
def run(ids, type) def run(names, type)
klass = case type klass = case type
when 'reserved'then ReservedDomain when 'reserved'then ReservedDomain
when 'blocked' then BlockedDomain when 'blocked' then BlockedDomain
else Domain when 'domain' then Domain
end end
ids.each do |id| Array(names).each do |name|
record = klass.find_by(id: id) record = klass.find_by(name: name)
next unless record if record
record.update_whois_record send "update_#{type}", record
else
send "delete_#{type}", name
end end
end end
end end
def update_domain(domain)
domain.whois_record ? domain.whois_record.save : domain.create_whois_record
end
def update_reserved(record)
record.generate_data
end
def update_blocked(record)
update_reserved(record)
end
# 1. deleting own
# 2. trying to regenerate reserved in order domain is still in the list
def delete_domain(name)
WhoisRecord.where(name: name).destroy_all
BlockedDomain.find_by(name: name).try(:generate_data)
ReservedDomain.find_by(name: name).try(:generate_data)
end
def delete_reserved(name)
Domain.where(name: name).any?
Whois::Record.where(name: name).delete_all
end
def delete_blocked(name)
delete_reserved(name)
end
end

View file

@ -117,9 +117,11 @@ class Ability
end end
def static_registrant def static_registrant
customer_service
can :manage, :registrant_domains can :manage, :registrant_domains
can :manage, :registrant_whois can :manage, :registrant_whois
can :manage, Depp::Domain can :manage, Depp::Domain
can :manage, Domain
end end
def user def user

View file

@ -6,6 +6,8 @@ class AccountActivity < ActiveRecord::Base
belongs_to :bank_transaction belongs_to :bank_transaction
belongs_to :invoice belongs_to :invoice
attr_accessor :registrar
CREATE = 'create' CREATE = 'create'
RENEW = 'renew' RENEW = 'renew'
ADD_CREDIT = 'add_credit' ADD_CREDIT = 'add_credit'
@ -22,12 +24,13 @@ class AccountActivity < ActiveRecord::Base
end end
def to_csv def to_csv
attributes = %w(description activity_type created_at sum) attributes = %w(registrar description activity_type created_at sum)
CSV.generate(headers: true) do |csv| CSV.generate(headers: true) do |csv|
csv << %w(description activity_type receipt_date sum) csv << %w(registrar description activity_type receipt_date sum)
all.each do |x| # rubocop:disable Rails/FindEach all.each do |x| # rubocop:disable Rails/FindEach
x.registrar = Registrar.find(x.account_id).try(:code)
csv << attributes.map { |attr| x.send(attr) } csv << attributes.map { |attr| x.send(attr) }
end end
end end

View file

@ -2,7 +2,6 @@ class BankTransaction < ActiveRecord::Base
include Versions include Versions
belongs_to :bank_statement belongs_to :bank_statement
has_one :account_activity has_one :account_activity
has_many :directo_records, as: :item, class_name: 'Directo'# Deprecated
scope :unbinded, lambda { scope :unbinded, lambda {
where('id NOT IN (SELECT bank_transaction_id FROM account_activities where bank_transaction_id IS NOT NULL)') where('id NOT IN (SELECT bank_transaction_id FROM account_activities where bank_transaction_id IS NOT NULL)')

View file

@ -1,7 +1,9 @@
class BlockedDomain < ActiveRecord::Base class BlockedDomain < ActiveRecord::Base
include Versions include Versions
before_save :generate_data before_save :generate_data
before_destroy :remove_data after_destroy :remove_data
validates :name, domain_name: true, uniqueness: true
class << self class << self
@ -21,19 +23,14 @@ class BlockedDomain < ActiveRecord::Base
def generate_data def generate_data
return if Domain.where(name: name).any? return if Domain.where(name: name).any?
@json = generate_json wr = Whois::Record.find_or_initialize_by(name: name)
@body = generate_body wr.json = @json = generate_json # we need @json to bind to class
update_whois_server wr.body = generate_body
wr.save
end end
alias_method :update_whois_record, :generate_data alias_method :update_whois_record, :generate_data
def update_whois_server
wr = Whois::Record.find_or_initialize_by(name: name)
wr.body = @body
wr.json = @json
wr.save
end
def generate_body def generate_body
template = Rails.root.join("app/views/for_models/whois_other.erb".freeze) template = Rails.root.join("app/views/for_models/whois_other.erb".freeze)
@ -48,8 +45,6 @@ class BlockedDomain < ActiveRecord::Base
end end
def remove_data def remove_data
return if Domain.where(name: name).any? UpdateWhoisRecordJob.enqueue name, 'blocked'
Whois::Record.where(name: name).delete_all
end end
end end

View file

@ -0,0 +1,83 @@
=begin
The portal for registrants has to offer an overview of the domains the user is related to directly or through an organisation.
Personal relation is defined by matching the personal identification code associated with a domain and the one acquired on
authentication using electronic ID. Association through a business organisation requires a query to business registry.
* when user logs in the personal identification code is sent to business registry (using XML service)
* business registry returns the list of business registry codes the user is a board member of
* the list is cached for two days (configurable)
* during that time no new queries are made to business registry for that personal identification code
and the cached organisation code listing is used
* user sees the listing of domains that are associated with him/her directly or through registered organisation
* UI of the portal displays the list of organisation codes and names used to fetch additional domains for the user
(currently by clicking on a username in top right corner of the screen).
Also time and date of the query to the business registry is displayed with the list of organisations.
* if the query to the business registry fails for any reason the list of
domains associated directly with the user is still displayed with an error message indicating a problem
with receiving current list business entities. Outdated list of organisations cannot be used.
=end
class BusinessRegistryCache < ActiveRecord::Base
# 1. load domains by business
# 2. load domains by person
def associated_contacts
contact_ids = Contact.where(ident_type: 'org', ident: associated_businesses, ident_country_code: 'EE').pluck(:id)
contact_ids += Contact.where(ident_type: 'priv', ident: ident, ident_country_code: ident_country_code).pluck(:id)
contact_ids
end
def associated_domain_ids
domain_ids = []
contact_ids = associated_contacts
unless contact_ids.blank?
domain_ids = DomainContact.distinct.where(contact_id: contact_ids).pluck(:domain_id)
end
domain_ids
end
def associated_domains
Domain.includes(:registrar, :registrant).where(id: associated_domain_ids)
end
class << self
def fetch_associated_domains(ident_code, ident_cc)
fetch_by_ident_and_cc(ident_code, ident_cc).associated_domains
end
def fetch_by_ident_and_cc(ident_code, ident_cc)
cache = BusinessRegistryCache.where(ident: ident_code, ident_country_code: ident_cc).first_or_initialize
msg_start = "[Ariregister] #{ident_cc}-#{ident_code}:"
# fetch new data if cache is expired
if cache.retrieved_on && cache.retrieved_on > (Time.zone.now - Setting.days_to_keep_business_registry_cache.days)
Rails.logger.info("#{msg_start} Info loaded from cache")
return cache
end
cache.attributes = business_registry.associated_businesses(ident_code, ident_cc)
Rails.logger.info("#{msg_start} Info loaded from server")
cache.save
cache
end
def business_registry
Soap::Arireg.new
end
def purge
STDOUT << "#{Time.zone.now.utc} - Starting Purge of old BusinessRegistry data from cache\n" unless Rails.env.test?
purged = 0
BusinessRegistryCache.where('retrieved_on < ?',
Time.zone.now < Setting.days_to_keep_business_registry_cache.days).each do |br|
br.destroy and purged += 1
end
STDOUT << "#{Time.zone.now.utc} - Finished purging #{purged} old BusinessRegistry cache items\n" unless Rails.env.test?
end
end
end

View file

@ -12,6 +12,10 @@ class Contact < ActiveRecord::Base
# TODO: remove later # TODO: remove later
has_many :depricated_statuses, class_name: 'DepricatedContactStatus', dependent: :destroy has_many :depricated_statuses, class_name: 'DepricatedContactStatus', dependent: :destroy
has_paper_trail class_name: "ContactVersion", meta: { children: :children_log }
attr_accessor :legal_document_id
accepts_nested_attributes_for :legal_documents accepts_nested_attributes_for :legal_documents
validates :name, :phone, :email, :ident, :ident_type, validates :name, :phone, :email, :ident, :ident_type,
@ -32,6 +36,7 @@ class Contact < ActiveRecord::Base
validate :val_ident_valid_format? validate :val_ident_valid_format?
validate :uniq_statuses? validate :uniq_statuses?
validate :validate_html validate :validate_html
validate :val_country_code
after_initialize do after_initialize do
self.statuses = [] if statuses.nil? self.statuses = [] if statuses.nil?
@ -39,7 +44,7 @@ class Contact < ActiveRecord::Base
self.ident_updated_at = Time.zone.now if new_record? && ident_updated_at.blank? self.ident_updated_at = Time.zone.now if new_record? && ident_updated_at.blank?
end end
before_validation :set_ident_country_code before_validation :to_upcase_country_code
before_validation :prefix_code before_validation :prefix_code
before_create :generate_auth_info before_create :generate_auth_info
@ -330,22 +335,36 @@ class Contact < ActiveRecord::Base
# TODO: refactor, it should not allow to destroy with normal destroy, # TODO: refactor, it should not allow to destroy with normal destroy,
# no need separate method # no need separate method
# should use only in transaction # should use only in transaction
def destroy_and_clean def destroy_and_clean frame
if domains_present? if domains_present?
errors.add(:domains, :exist) errors.add(:domains, :exist)
return false return false
end end
legal_document_data = Epp::Domain.parse_legal_document_from_frame(frame)
if legal_document_data
doc = LegalDocument.create(
documentable_type: Contact,
document_type: legal_document_data[:type],
body: legal_document_data[:body]
)
self.legal_documents = [doc]
self.legal_document_id = doc.id
self.save
end
destroy destroy
end end
def set_ident_country_code def to_upcase_country_code
return true unless ident_country_code_changed? && ident_country_code.present? self.ident_country_code = ident_country_code.upcase if ident_country_code
code = Country.new(ident_country_code) self.country_code = country_code.upcase if country_code
if code
self.ident_country_code = code.alpha2
else
errors.add(:ident, :invalid_country_code)
end end
def val_country_code
errors.add(:ident, :invalid_country_code) unless Country.new(ident_country_code)
errors.add(:ident, :invalid_country_code) unless Country.new(country_code)
end end
def related_domain_descriptions def related_domain_descriptions
@ -415,7 +434,10 @@ class Contact < ActiveRecord::Base
# fetch domains # fetch domains
domains = Domain.where("domains.id IN (#{filter_sql})").includes(:registrar).page(page).per(per) domains = Domain.where("domains.id IN (#{filter_sql})")
domains = domains.where("domains.id" => params[:leave_domains]) if params[:leave_domains]
domains = domains.includes(:registrar).page(page).per(per)
if sorts.first == "registrar_name".freeze if sorts.first == "registrar_name".freeze
# using small rails hack to generate outer join # using small rails hack to generate outer join
domains = domains.includes(:registrar).where.not(registrars: {id: nil}).order("registrars.name #{order} NULLS LAST") domains = domains.includes(:registrar).where.not(registrars: {id: nil}).order("registrars.name #{order} NULLS LAST")
@ -434,6 +456,30 @@ class Contact < ActiveRecord::Base
domains domains
end end
def all_registrant_domains(page: nil, per: nil, params: {}, registrant: nil)
if registrant
sorts = params.fetch(:sort, {}).first || []
sort = Domain.column_names.include?(sorts.first) ? sorts.first : "valid_to"
order = {"asc"=>"desc", "desc"=>"asc"}[sorts.second] || "desc"
domain_ids = DomainContact.distinct.where(contact_id: registrant.id).pluck(:domain_id)
domains = Domain.where(id: domain_ids).includes(:registrar).page(page).per(per)
if sorts.first == "registrar_name".freeze
domains = domains.includes(:registrar).where.not(registrars: {id: nil}).order("registrars.name #{order} NULLS LAST")
else
domains = domains.order("#{sort} #{order} NULLS LAST")
end
domain_c = Hash.new([])
registrant_domains.where(id: domains.map(&:id)).each{|d| domain_c[d.id] |= ["Registrant".freeze] }
DomainContact.where(contact_id: id, domain_id: domains.map(&:id)).each{|d| domain_c[d.domain_id] |= [d.type] }
domains.each{|d| d.roles = domain_c[d.id].uniq}
domains
end
end
def set_linked def set_linked
statuses << LINKED if statuses.detect { |s| s == LINKED }.blank? statuses << LINKED if statuses.detect { |s| s == LINKED }.blank?
end end
@ -499,7 +545,14 @@ class Contact < ActiveRecord::Base
end end
def update_related_whois_records def update_related_whois_records
related_domain_descriptions.each{ |x, y| WhoisRecord.find_by(name: x).try(:save) } names = related_domain_descriptions.keys
UpdateWhoisRecordJob.enqueue(names, :domain) if names.present?
end
def children_log
log = HashWithIndifferentAccess.new
log[:legal_documents]= [legal_document_id]
log
end end
end end

24
app/models/counter.rb Normal file
View file

@ -0,0 +1,24 @@
class Counter
def initialize value = 0
@value = value
end
attr_accessor :value
def method_missing *args, &blk
@value.send(*args, &blk)
end
def to_s
@value.to_s
end
def now
@value
end
# pre-increment ".+" when x not present
def next(x = 1)
@value += x
end
def prev(x = 1)
@value -= x
end
end

View file

@ -1,15 +1,25 @@
class Directo < ActiveRecord::Base class Directo < ActiveRecord::Base
DOMAIN_TO_PRODUCT = {"ee" => "01EE", "com.ee" => "02COM", "pri.ee" => "03PRI", "fie.ee"=>"04FIE", "med.ee" => "05MED"}.freeze
belongs_to :item, polymorphic: true belongs_to :item, polymorphic: true
def self.send_receipts def self.send_receipts
new_trans = Invoice.where(invoice_type: "DEB", in_directo: false).where.not(cancelled_at: nil) new_trans = Invoice.where(invoice_type: "DEB", in_directo: false).where(cancelled_at: nil)
total = new_trans.count
counter = 0
Rails.logger.info("[DIRECTO] Will try to send #{total} invoices")
new_trans.find_in_batches(batch_size: 10).each do |group| new_trans.find_in_batches(batch_size: 10).each do |group|
mappers = {} # need them as no direct connection between invoice mappers = {} # need them as no direct connection between invoice
builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml| builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml|
xml.invoices { xml.invoices {
group.each do |invoice| group.each do |invoice|
next if invoice.account_activity.nil? || invoice.account_activity.bank_transaction.nil?
# next if invoice.account_activity.bank_transaction.sum.nil? || invoice.account_activity.bank_transaction.sum != invoice.sum_cache if invoice.account_activity.nil? || invoice.account_activity.bank_transaction.nil? ||
invoice.account_activity.bank_transaction.sum.nil? || invoice.account_activity.bank_transaction.sum != invoice.sum_cache
Rails.logger.info("[DIRECTO] Invoice #{invoice.number} has been skipped")
next
end
counter += 1
num = invoice.number num = invoice.number
mappers[num] = invoice mappers[num] = invoice
@ -36,14 +46,134 @@ class Directo < ActiveRecord::Base
response = RestClient::Request.execute(url: ENV['directo_invoice_url'], method: :post, payload: {put: "1", what: "invoice", xmldata: data}, verify_ssl: false).to_s response = RestClient::Request.execute(url: ENV['directo_invoice_url'], method: :post, payload: {put: "1", what: "invoice", xmldata: data}, verify_ssl: false).to_s
dump_result_to_db(mappers, response) dump_result_to_db(mappers, response)
end end
STDOUT << "#{Time.zone.now.utc} - Directo receipts sending finished. #{counter} of #{total} are sent\n"
end end
def self.dump_result_to_db mappers, xml def self.dump_result_to_db mappers, xml
Nokogiri::XML(xml).css("Result").each do |res| Nokogiri::XML(xml).css("Result").each do |res|
obj = mappers[res.attributes["docid"].value.to_i] obj = mappers[res.attributes["docid"].value.to_i]
obj.directo_records.create!(response: res.as_json.to_h) obj.directo_records.create!(response: res.as_json.to_h, invoice_number: obj.number)
obj.update_columns(in_directo: true) obj.update_columns(in_directo: true)
Rails.logger.info("[DIRECTO] Invoice #{res.attributes["docid"].value} was pushed and return is #{res.as_json.to_h.inspect}") Rails.logger.info("[DIRECTO] Invoice #{res.attributes["docid"].value} was pushed and return is #{res.as_json.to_h.inspect}")
end end
end end
def self.send_monthly_invoices(debug: false)
@debug = debug
I18n.locale = :et
month = Time.now - 1.month
invoices_until = month.end_of_month
date_format = "%Y-%m-%d"
invoice_counter= Counter.new
min_directo = Setting.directo_monthly_number_min.presence.try(:to_i)
max_directo = Setting.directo_monthly_number_max.presence.try(:to_i)
last_directo = [Setting.directo_monthly_number_last.presence.try(:to_i), min_directo].compact.max || 0
if max_directo && max_directo <= last_directo
raise "Directo counter is out of period (max allowed number is smaller than last counter number)"
end end
directo_next = last_directo
Registrar.where.not(test_registrar: true).find_each do |registrar|
unless registrar.cash_account
Rails.logger.info("[DIRECTO] Monthly invoice for registrar #{registrar.id} has been skipped as it doesn't has cash_account")
next
end
counter = Counter.new(1)
items = {}
registrar_activities = AccountActivity.where(account_id: registrar.account_ids).where("created_at BETWEEN ? AND ?",month.beginning_of_month, month.end_of_month)
# adding domains items
registrar_activities.where(activity_type: [AccountActivity::CREATE, AccountActivity::RENEW]).each do |activity|
pricelist = load_activity_pricelist(activity)
unless pricelist
Rails.logger.error("[DIRECTO] Skipping activity #{activity.id} as pricelist not found")
next
end
pricelist.years_amount.times do |i|
year = i+1
hash = {
"ProductID" => DOMAIN_TO_PRODUCT[pricelist.category],
"Unit" => "tk",
"ProductName" => ".#{pricelist.category} registreerimine: #{pricelist.years_amount} aasta",
"UnitPriceWoVAT" => pricelist.price_decimal/pricelist.years_amount
}
hash["StartDate"] = (activity.created_at + (year-1).year).end_of_month.strftime(date_format) if year > 1
hash["EndDate"] = (activity.created_at + (year-1).year + 1).end_of_month.strftime(date_format) if year > 1
if items.has_key?(hash)
items[hash]["Quantity"] += 1
else
items[hash] = {"RN"=>counter.next, "RR" => counter.now - i, "Quantity"=> 1}
end
end
end
#adding prepaiments
if items.any?
total = 0
items.each{ |key, val| total += val["Quantity"] * key["UnitPriceWoVAT"] }
hash = {"ProductID" => Setting.directo_receipt_product_name, "Unit" => "tk", "ProductName" => "Domeenide ettemaks", "UnitPriceWoVAT"=>total}
items[hash] = {"RN"=>counter.next, "RR" => counter.now, "Quantity"=> -1}
end
# generating XML
if items.any?
directo_next += 1
invoice_counter.next
builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml|
xml.invoices{
xml.invoice("Number" =>directo_next,
"InvoiceDate" =>invoices_until.strftime(date_format),
"PaymentTerm" =>Setting.directo_receipt_payment_term,
"CustomerCode"=>registrar.directo_handle,
"Language" =>"",
"Currency" =>registrar_activities.first.currency,
"SalesAgent" =>Setting.directo_sales_agent){
xml.line("RN" => 1, "RR"=>1, "ProductName"=> "Domeenide registreerimine - #{I18n.l(invoices_until, format: "%B %Y").titleize}")
items.each do |line, val|
xml.line(val.merge(line))
end
}
}
end
data = builder.to_xml.gsub("\n",'')
response = RestClient::Request.execute(url: ENV['directo_invoice_url'], method: :post, payload: {put: "1", what: "invoice", xmldata: data}, verify_ssl: false).to_s
if @debug
STDOUT << "#{Time.zone.now.utc} - Directo xml had to be sent #{data}\n"
else
Setting.directo_monthly_number_last = directo_next
Nokogiri::XML(response).css("Result").each do |res|
Directo.create!(request: data, response: res.as_json.to_h, invoice_number: directo_next)
Rails.logger.info("[DIRECTO] Invoice #{res.attributes["docid"].value} was pushed and return is #{res.as_json.to_h.inspect}")
end
end
else
Rails.logger.info("[DIRECTO] Registrar #{registrar.id} has nothing to be sent to Directo")
end
end
STDOUT << "#{Time.zone.now.utc} - Directo invoices sending finished. #{invoice_counter.now} are sent\n"
end
def self.load_activity_pricelist activity
@pricelists ||= {}
return @pricelists[activity.log_pricelist_id] if @pricelists.has_key?(activity.log_pricelist_id)
pricelist = Pricelist.find_by(id: activity.log_pricelist_id) || PricelistVersion.find_by(item_id: activity.log_pricelist_id).try(:reify)
unless pricelist
@pricelists[activity.log_pricelist_id] = nil
Rails.logger.info("[DIRECTO] AccountActivity #{activity.id} cannot be sent as pricelist wasn't found #{activity.log_pricelist_id}")
return
end
@pricelists[activity.log_pricelist_id] = pricelist.version_at(activity.created_at) || pricelist
end
end

View file

@ -7,6 +7,8 @@ class Domain < ActiveRecord::Base
attr_accessor :roles attr_accessor :roles
attr_accessor :legal_document_id
# TODO: whois requests ip whitelist for full info for own domains and partial info for other domains # TODO: whois requests ip whitelist for full info for own domains and partial info for other domains
# TODO: most inputs should be trimmed before validatation, probably some global logic? # TODO: most inputs should be trimmed before validatation, probably some global logic?
@ -43,7 +45,7 @@ class Domain < ActiveRecord::Base
has_many :dnskeys, dependent: :destroy has_many :dnskeys, dependent: :destroy
has_many :keyrelays has_many :keyrelays
has_one :whois_record, dependent: :destroy has_one :whois_record # destroyment will be done in after_commit
accepts_nested_attributes_for :dnskeys, allow_destroy: true accepts_nested_attributes_for :dnskeys, allow_destroy: true
@ -87,14 +89,11 @@ class Domain < ActiveRecord::Base
true true
end end
after_save :update_whois_record after_commit :update_whois_record
after_create :update_reserved_domains after_create :update_reserved_domains
def update_reserved_domains def update_reserved_domains
return unless in_reserved_list? ReservedDomain.new_password_for(name) if in_reserved_list?
rd = ReservedDomain.by_domain(name).first
rd.password = SecureRandom.hex
rd.save
end end
validates :name_dirty, domain_name: true, uniqueness: true validates :name_dirty, domain_name: true, uniqueness: true
@ -203,6 +202,31 @@ class Domain < ActiveRecord::Base
statuses.include? DomainStatus::SERVER_TECH_CHANGE_PROHIBITED statuses.include? DomainStatus::SERVER_TECH_CHANGE_PROHIBITED
end end
def self.clean_expired_pendings
ActiveSupport::Deprecation.instance.deprecation_warning(DomainCron, __method__)
DomainCron.send(__method__)
end
def self.start_expire_period
ActiveSupport::Deprecation.instance.deprecation_warning(DomainCron, __method__)
DomainCron.send(__method__)
end
def self.start_redemption_grace_period
ActiveSupport::Deprecation.instance.deprecation_warning(DomainCron, __method__)
DomainCron.send(__method__)
end
def self.start_delete_period
ActiveSupport::Deprecation.instance.deprecation_warning(DomainCron, __method__)
DomainCron.send(__method__)
end
def self.destroy_delete_candidates
ActiveSupport::Deprecation.instance.deprecation_warning(DomainCron, __method__)
DomainCron.send(__method__)
end
class << self class << self
def convert_period_to_time(period, unit) def convert_period_to_time(period, unit)
return (period.to_i / 365).years if unit == 'd' return (period.to_i / 365).years if unit == 'd'
@ -220,122 +244,6 @@ class Domain < ActiveRecord::Base
{ admin_contacts: :registrar } { admin_contacts: :registrar }
) )
end end
# rubocop: disable Metrics/AbcSize
# rubocop: disable Metrics/CyclomaticComplexity
# rubocop: disable Metrics/PerceivedComplexity
def clean_expired_pendings
STDOUT << "#{Time.zone.now.utc} - Clean expired domain pendings\n" unless Rails.env.test?
expire_at = Setting.expire_pending_confirmation.hours.ago
count = 0
expired_pending_domains = Domain.where('registrant_verification_asked_at <= ?', expire_at)
expired_pending_domains.each do |domain|
unless domain.pending_update? || domain.pending_delete? || domain.pending_delete_confirmation?
msg = "#{Time.zone.now.utc} - ISSUE: DOMAIN #{domain.id}: #{domain.name} IS IN EXPIRED PENDING LIST, " \
"but no pendingDelete/pendingUpdate state present!\n"
STDOUT << msg unless Rails.env.test?
next
end
count += 1
if domain.pending_update?
domain.send_mail :pending_update_expired_notification_for_new_registrant
end
if domain.pending_delete? || domain.pending_delete_confirmation?
DomainMailer.pending_delete_expired_notification(domain.id, true).deliver
end
domain.clean_pendings_lowlevel
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
end
# rubocop: enable Metrics/PerceivedComplexity
# rubocop: enable Metrics/AbcSize
# rubocop: enable Metrics/CyclomaticComplexity
# rubocop: disable Metrics/LineLength
def start_expire_period
STDOUT << "#{Time.zone.now.utc} - Expiring domains\n" unless Rails.env.test?
domains = Domain.where('valid_to <= ?', Time.zone.now)
domains.each do |domain|
next unless domain.expirable?
domain.set_graceful_expired
DomainMailer.expiration_reminder(domain.id).deliver_in(Setting.expiration_reminder_mail.to_i.days)
STDOUT << "#{Time.zone.now.utc} Domain.start_expire_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test?
domain.save(validate: false)
end
STDOUT << "#{Time.zone.now.utc} - Successfully expired #{domains.count} domains\n" unless Rails.env.test?
end
def start_redemption_grace_period
STDOUT << "#{Time.zone.now.utc} - Setting server_hold to domains\n" unless Rails.env.test?
d = Domain.where('outzone_at <= ?', Time.zone.now)
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.name}) #{domain.changes}\n" unless Rails.env.test?
domain.save(validate: false)
end
STDOUT << "#{Time.zone.now.utc} - Successfully set server_hold to #{d.count} domains\n" unless Rails.env.test?
end
def start_delete_period
STDOUT << "#{Time.zone.now.utc} - Setting delete_candidate to domains\n" unless Rails.env.test?
d = Domain.where('delete_at <= ?', Time.zone.now)
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.name}) #{domain.changes}\n" unless Rails.env.test?
domain.save(validate: false)
end
return if Rails.env.test?
STDOUT << "#{Time.zone.now.utc} - Successfully set delete_candidate to #{d.count} domains\n"
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|
WhoisRecord.where(domain_id: x.id).destroy_all
destroy_with_message x
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|
WhoisRecord.where(domain_id: x.id).destroy_all
destroy_with_message x
STDOUT << "#{Time.zone.now.utc} Domain.destroy_delete_candidates: by force delete time ##{x.id} (#{x.name})\n" unless Rails.env.test?
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
def destroy_with_message(domain)
domain.destroy
bye_bye = domain.versions.last
domain.registrar.messages.create!(
body: "#{I18n.t(:domain_deleted)}: #{domain.name}",
attached_obj_id: bye_bye.id,
attached_obj_type: bye_bye.class.to_s # DomainVersion
)
end
end end
def name=(value) def name=(value)
@ -370,7 +278,7 @@ class Domain < ActiveRecord::Base
end end
def in_reserved_list? def in_reserved_list?
ReservedDomain.pw_for(name).present? @in_reserved_list ||= ReservedDomain.by_domain(name).any?
end end
def pending_transfer def pending_transfer
@ -439,7 +347,8 @@ class Domain < ActiveRecord::Base
end end
# state change shouln't be # state changes may be done low-level - no validation
# in this metod we still save PaperTrail log.
def clean_pendings_lowlevel def clean_pendings_lowlevel
statuses.delete(DomainStatus::PENDING_DELETE_CONFIRMATION) statuses.delete(DomainStatus::PENDING_DELETE_CONFIRMATION)
statuses.delete(DomainStatus::PENDING_UPDATE) statuses.delete(DomainStatus::PENDING_UPDATE)
@ -448,13 +357,23 @@ class Domain < ActiveRecord::Base
status_notes[DomainStatus::PENDING_UPDATE] = '' status_notes[DomainStatus::PENDING_UPDATE] = ''
status_notes[DomainStatus::PENDING_DELETE] = '' status_notes[DomainStatus::PENDING_DELETE] = ''
update_columns( hash = {
registrant_verification_token: nil, registrant_verification_token: nil,
registrant_verification_asked_at: nil, registrant_verification_asked_at: nil,
pending_json: {}, pending_json: {},
status_notes: status_notes, status_notes: status_notes,
statuses: statuses.presence || [DomainStatus::OK] statuses: statuses.presence || [DomainStatus::OK],
) # need this column in order to update PaperTrail version properly
updated_at: Time.now.utc
}
# PaperTrail
self.attributes = hash
record_update
clear_version_instance!
reset_transaction_id
update_columns(hash)
end end
def pending_update! def pending_update!
@ -478,6 +397,7 @@ class Domain < ActiveRecord::Base
self.registrant_verification_token = token self.registrant_verification_token = token
self.registrant_verification_asked_at = asked_at self.registrant_verification_asked_at = asked_at
set_pending_update set_pending_update
touch_always_version
pending_json['new_registrant_id'] = new_registrant_id pending_json['new_registrant_id'] = new_registrant_id
pending_json['new_registrant_email'] = new_registrant_email pending_json['new_registrant_email'] = new_registrant_email
pending_json['new_registrant_name'] = new_registrant_name pending_json['new_registrant_name'] = new_registrant_name
@ -543,19 +463,14 @@ class Domain < ActiveRecord::Base
period_i ||= period period_i ||= period
unit ||= period_unit unit ||= period_unit
# TODO: test if name.scan(/\.(.+)\z/).first.first is faster
zone = name.split('.').drop(1).join('.') zone = name.split('.').drop(1).join('.')
p = period_i / 365 if unit == 'd' p = period_i / 365 if unit == 'd'
p = period_i / 12 if unit == 'm' p = period_i / 12 if unit == 'm'
p = period_i if unit == 'y' p = period_i if unit == 'y'
if p > 1 Pricelist.pricelist_for(zone, operation, "#{p}year".pluralize(p))
p = "#{p}years"
else
p = "#{p}year"
end
Pricelist.pricelist_for(zone, operation, p)
end end
### VALIDATIONS ### ### VALIDATIONS ###
@ -592,7 +507,7 @@ class Domain < ActiveRecord::Base
def name_in_wire_format def name_in_wire_format
res = '' res = ''
parts = name.split('.') parts = name_puny.split('.')
parts.each do |x| parts.each do |x|
res += format('%02X', x.length) # length of label in hex res += format('%02X', x.length) # length of label in hex
res += x.each_byte.map { |b| format('%02X', b) }.join # label res += x.each_byte.map { |b| format('%02X', b) }.join # label
@ -728,8 +643,12 @@ class Domain < ActiveRecord::Base
case s case s
when DomainStatus::PENDING_DELETE when DomainStatus::PENDING_DELETE
self.delete_at = nil self.delete_at = nil
# Handle any other special remove cases? when DomainStatus::SERVER_MANUAL_INZONE # removal causes server hold to set
# when DomainStatus::FORCE_DELETE unset_force_delete self.outzone_at = Time.zone.now if self.force_delete_at.present?
when DomainStatus::DomainStatus::EXPIRED # removal causes server hold to set
self.outzone_at = self.valid_to + 15.day
when DomainStatus::DomainStatus::SERVER_HOLD # removal causes server hold to set
self.outzone_at = nil
end end
end end
end end
@ -820,13 +739,14 @@ class Domain < ActiveRecord::Base
log[:admin_contacts] = admin_contact_ids log[:admin_contacts] = admin_contact_ids
log[:tech_contacts] = tech_contact_ids log[:tech_contacts] = tech_contact_ids
log[:nameservers] = nameserver_ids log[:nameservers] = nameserver_ids
log[:legal_documents]= [legal_document_id]
log[:registrant] = [registrant_id] log[:registrant] = [registrant_id]
log[:domain_statuses] = domain_status_ids log[:domain_statuses] = domain_status_ids
log log
end end
def update_whois_record def update_whois_record
whois_record.blank? ? create_whois_record : whois_record.save UpdateWhoisRecordJob.enqueue name, 'domain'
end end
def status_notes_array=(notes) def status_notes_array=(notes)
@ -841,5 +761,19 @@ class Domain < ActiveRecord::Base
DomainMailer.send(action, DomainMailModel.new(self).send(action)).deliver DomainMailer.send(action, DomainMailModel.new(self).send(action)).deliver
end end
def self.to_csv
CSV.generate do |csv|
csv << column_names
all.each do |domain|
csv << domain.attributes.values_at(*column_names)
end
end
end
def self.pdf(html)
kit = PDFKit.new(html)
kit.to_pdf
end
end end
# rubocop: enable Metrics/ClassLength # rubocop: enable Metrics/ClassLength

132
app/models/domain_cron.rb Normal file
View file

@ -0,0 +1,132 @@
class DomainCron
def self.clean_expired_pendings
STDOUT << "#{Time.zone.now.utc} - Clean expired domain pendings\n" unless Rails.env.test?
expire_at = Setting.expire_pending_confirmation.hours.ago
count = 0
expired_pending_domains = Domain.where('registrant_verification_asked_at <= ?', expire_at)
expired_pending_domains.each do |domain|
unless domain.pending_update? || domain.pending_delete? || domain.pending_delete_confirmation?
msg = "#{Time.zone.now.utc} - ISSUE: DOMAIN #{domain.id}: #{domain.name} IS IN EXPIRED PENDING LIST, " \
"but no pendingDelete/pendingUpdate state present!\n"
STDOUT << msg unless Rails.env.test?
next
end
count += 1
if domain.pending_update?
DomainMailer.pending_update_expired_notification_for_new_registrant(domain.id).deliver
end
if domain.pending_delete? || domain.pending_delete_confirmation?
DomainMailer.pending_delete_expired_notification(domain.id, true).deliver
end
domain.clean_pendings_lowlevel
unless Rails.env.test?
STDOUT << "#{Time.zone.now.utc} DomainCron.clean_expired_pendings: ##{domain.id} (#{domain.name})\n"
end
UpdateWhoisRecordJob.enqueue domain.name, 'domain'
end
STDOUT << "#{Time.zone.now.utc} - Successfully cancelled #{count} domain pendings\n" unless Rails.env.test?
count
end
def self.start_expire_period
STDOUT << "#{Time.zone.now.utc} - Expiring domains\n" unless Rails.env.test?
domains = Domain.where('valid_to <= ?', Time.zone.now)
marked = 0
real = 0
domains.each do |domain|
next unless domain.expirable?
real += 1
domain.set_graceful_expired
STDOUT << "#{Time.zone.now.utc} DomainCron.start_expire_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test?
domain.save(validate: false) and marked += 1
end
STDOUT << "#{Time.zone.now.utc} - Successfully expired #{marked} of #{real} domains\n" unless Rails.env.test?
end
def self.start_redemption_grace_period
STDOUT << "#{Time.zone.now.utc} - Setting server_hold to domains\n" unless Rails.env.test?
d = Domain.where('outzone_at <= ?', Time.zone.now)
marked = 0
real = 0
d.each do |domain|
next unless domain.server_holdable?
real += 1
domain.statuses << DomainStatus::SERVER_HOLD
STDOUT << "#{Time.zone.now.utc} DomainCron.start_redemption_grace_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test?
domain.save(validate: false) and marked += 1
end
STDOUT << "#{Time.zone.now.utc} - Successfully set server_hold to #{marked} of #{real} domains\n" unless Rails.env.test?
marked
end
#doing nothing, deprecated
def self.start_delete_period
# begin
# STDOUT << "#{Time.zone.now.utc} - Setting delete_candidate to domains\n" unless Rails.env.test?
#
# d = Domain.where('delete_at <= ?', Time.zone.now)
# marked = 0
# real = 0
# d.each do |domain|
# next unless domain.delete_candidateable?
# real += 1
# domain.statuses << DomainStatus::DELETE_CANDIDATE
# STDOUT << "#{Time.zone.now.utc} DomainCron.start_delete_period: ##{domain.id} (#{domain.name})\n" unless Rails.env.test?
# ::PaperTrail.whodunnit = "cron - #{__method__}"
# domain.save(validate: false) and marked += 1
# end
# ensure # the operator should see what was accomplished
# STDOUT << "#{Time.zone.now.utc} - Finished setting delete_candidate - #{marked} out of #{real} successfully set\n" unless Rails.env.test?
# end
# marked
end
def self.destroy_delete_candidates
STDOUT << "#{Time.zone.now.utc} - Destroying domains\n" unless Rails.env.test?
c = 0
Domain.where('delete_at <= ?', Time.zone.now).each do |x|
next unless x.delete_candidateable?
x.statuses << DomainStatus::DELETE_CANDIDATE
# If domain successfully saved, add it to delete schedule
if x.save(validate: false)
::PaperTrail.whodunnit = "cron - #{__method__}"
DomainDeleteJob.enqueue(x.id, run_at: rand(((24*60) - (DateTime.now.hour * 60 + DateTime.now.minute))).minutes.from_now)
STDOUT << "#{Time.zone.now.utc} Domain.destroy_delete_candidates: job added by deleteCandidate status ##{x.id} (#{x.name})\n" unless Rails.env.test?
c += 1
end
end
Domain.where('force_delete_at <= ?', Time.zone.now).each do |x|
DomainDeleteJob.enqueue(x.id, run_at: rand(((24*60) - (DateTime.now.hour * 60 + DateTime.now.minute))).minutes.from_now)
STDOUT << "#{Time.zone.now.utc} DomainCron.destroy_delete_candidates: job added by force delete time ##{x.id} (#{x.name})\n" unless Rails.env.test?
c += 1
end
STDOUT << "#{Time.zone.now.utc} - Job destroy added for #{c} domains\n" unless Rails.env.test?
end
# rubocop: enable Metrics/AbcSize
# rubocop:enable Rails/FindEach
# rubocop: enable Metrics/LineLength
def self.destroy_with_message(domain)
domain.destroy
bye_bye = domain.versions.last
domain.registrar.messages.create!(
body: "#{I18n.t(:domain_deleted)}: #{domain.name}",
attached_obj_id: bye_bye.id,
attached_obj_type: bye_bye.class.to_s # DomainVersion
)
end
end

View file

@ -37,10 +37,7 @@ class Epp::Contact < Contact
at[:country_code] = f.css('postalInfo addr cc').text if f.css('postalInfo addr cc').present? at[:country_code] = f.css('postalInfo addr cc').text if f.css('postalInfo addr cc').present?
at[:auth_info] = f.css('authInfo pw').text if f.css('authInfo pw').present? at[:auth_info] = f.css('authInfo pw').text if f.css('authInfo pw').present?
legal_frame = f.css('legalDocument').first
if legal_frame.present?
at[:legal_documents_attributes] = legal_document_attrs(legal_frame)
end
at.merge!(ident_attrs(f.css('ident').first)) if new_record at.merge!(ident_attrs(f.css('ident').first)) if new_record
at at
end end
@ -104,6 +101,7 @@ class Epp::Contact < Contact
res res
end end
end end
delegate :ident_attr_valid?, to: :class delegate :ident_attr_valid?, to: :class
@ -152,8 +150,14 @@ class Epp::Contact < Contact
at[:statuses] = statuses - statuses_attrs(frame.css('rem'), 'rem') + statuses_attrs(frame.css('add'), 'add') at[:statuses] = statuses - statuses_attrs(frame.css('rem'), 'rem') + statuses_attrs(frame.css('add'), 'add')
end end
legal_frame = frame.css('legalDocument').first # legal_frame = frame.css('legalDocument').first
at[:legal_documents_attributes] = self.class.legal_document_attrs(legal_frame) # at[:legal_documents_attributes] = self.class.legal_document_attrs(legal_frame)
if doc = attach_legal_document(Epp::Domain.parse_legal_document_from_frame(frame))
frame.css("legalDocument").first.content = doc.path if doc && doc.persisted?
self.legal_document_id = doc.id
end
self.deliver_emails = true # turn on email delivery for epp self.deliver_emails = true # turn on email delivery for epp
@ -175,6 +179,8 @@ class Epp::Contact < Contact
else else
throw :epp_error, {code: '2306', msg: I18n.t(:ident_update_error)} throw :epp_error, {code: '2306', msg: I18n.t(:ident_update_error)}
end end
else
throw :epp_error, {code: '2306', msg: I18n.t(:ident_update_error)}
end end
end end
@ -218,4 +224,29 @@ class Epp::Contact < Contact
status_list status_list
end end
def attach_legal_document(legal_document_data)
return unless legal_document_data
legal_documents.create(
document_type: legal_document_data[:type],
body: legal_document_data[:body]
)
end
def add_legal_file_to_new frame
legal_document_data = Epp::Domain.parse_legal_document_from_frame(frame)
return unless legal_document_data
doc = LegalDocument.create(
documentable_type: Contact,
document_type: legal_document_data[:type],
body: legal_document_data[:body]
)
self.legal_documents = [doc]
frame.css("legalDocument").first.content = doc.path if doc && doc.persisted?
self.legal_document_id = doc.id
end
end end

View file

@ -133,7 +133,8 @@ class Epp::Domain < Domain
[:base, :ds_data_not_allowed], [:base, :ds_data_not_allowed],
[:base, :key_data_not_allowed], [:base, :key_data_not_allowed],
[:period, :not_a_number], [:period, :not_a_number],
[:period, :not_an_integer] [:period, :not_an_integer],
[:registrant, :cannot_be_missing]
], ],
'2308' => [ '2308' => [
[:base, :domain_name_blocked, { value: { obj: 'name', val: name_dirty } }] [:base, :domain_name_blocked, { value: { obj: 'name', val: name_dirty } }]
@ -155,7 +156,8 @@ class Epp::Domain < Domain
def attrs_from(frame, current_user, action = nil) def attrs_from(frame, current_user, action = nil)
at = {}.with_indifferent_access at = {}.with_indifferent_access
code = frame.css('registrant').first.try(:text) registrant_frame = frame.css('registrant').first
code = registrant_frame.try(:text)
if code.present? if code.present?
if action == 'chg' && registrant_change_prohibited? if action == 'chg' && registrant_change_prohibited?
add_epp_error('2304', nil, DomainStatus::SERVER_REGISTRANT_CHANGE_PROHIBITED, I18n.t(:object_status_prohibits_operation)) add_epp_error('2304', nil, DomainStatus::SERVER_REGISTRANT_CHANGE_PROHIBITED, I18n.t(:object_status_prohibits_operation))
@ -166,7 +168,10 @@ class Epp::Domain < Domain
else else
add_epp_error('2303', 'registrant', code, [:registrant, :not_found]) add_epp_error('2303', 'registrant', code, [:registrant, :not_found])
end end
end else
add_epp_error('2306', nil, nil, [:registrant, :cannot_be_missing])
end if registrant_frame
at[:name] = frame.css('name').text if new_record? at[:name] = frame.css('name').text if new_record?
at[:registrar_id] = current_user.registrar.try(:id) at[:registrar_id] = current_user.registrar.try(:id)
@ -195,9 +200,27 @@ class Epp::Domain < Domain
end end
at[:dnskeys_attributes] = dnskeys_attrs(dnskey_frame, action) at[:dnskeys_attributes] = dnskeys_attrs(dnskey_frame, action)
at[:legal_documents_attributes] = legal_document_from(frame)
at at
end end
# Adding legal doc to domain and
# if something goes wrong - raise Rollback error
def add_legal_file_to_new frame
legal_document_data = Epp::Domain.parse_legal_document_from_frame(frame)
return unless legal_document_data
doc = LegalDocument.create(
documentable_type: Domain,
document_type: legal_document_data[:type],
body: legal_document_data[:body]
)
self.legal_documents = [doc]
frame.css("legalDocument").first.content = doc.path if doc && doc.persisted?
self.legal_document_id = doc.id
end
# rubocop: enable Metrics/PerceivedComplexity # rubocop: enable Metrics/PerceivedComplexity
# rubocop: enable Metrics/CyclomaticComplexity # rubocop: enable Metrics/CyclomaticComplexity
# rubocop: enable Metrics/MethodLength # rubocop: enable Metrics/MethodLength
@ -457,15 +480,6 @@ class Epp::Domain < Domain
status_list status_list
end end
def legal_document_from(frame)
ld = frame.css('legalDocument').first
return [] unless ld
[{
body: ld.text,
document_type: ld['type']
}]
end
# rubocop: disable Metrics/AbcSize # rubocop: disable Metrics/AbcSize
# rubocop: disable Metrics/CyclomaticComplexity # rubocop: disable Metrics/CyclomaticComplexity
@ -477,6 +491,7 @@ class Epp::Domain < Domain
if doc = attach_legal_document(Epp::Domain.parse_legal_document_from_frame(frame)) if doc = attach_legal_document(Epp::Domain.parse_legal_document_from_frame(frame))
frame.css("legalDocument").first.content = doc.path if doc && doc.persisted? frame.css("legalDocument").first.content = doc.path if doc && doc.persisted?
self.legal_document_id = doc.id
end end
at_add = attrs_from(frame.css('add'), current_user, 'add') at_add = attrs_from(frame.css('add'), current_user, 'add')
@ -494,6 +509,15 @@ class Epp::Domain < Domain
self.up_date = Time.zone.now self.up_date = Time.zone.now
end end
if registrant_id && registrant.code == frame.css('registrant')
throw :epp_error, {
code: '2305',
msg: I18n.t(:contact_already_associated_with_the_domain)
}
end
if errors.empty? && verify && if errors.empty? && verify &&
Setting.request_confrimation_on_registrant_change_enabled && Setting.request_confrimation_on_registrant_change_enabled &&
frame.css('registrant').present? && frame.css('registrant').present? &&
@ -867,6 +891,7 @@ class Epp::Domain < Domain
ld = parsed_frame.css('legalDocument').first ld = parsed_frame.css('legalDocument').first
return nil unless ld return nil unless ld
return nil if ld.text.starts_with?(ENV['legal_documents_dir']) # escape reloading return nil if ld.text.starts_with?(ENV['legal_documents_dir']) # escape reloading
return nil if ld.text.starts_with?('/home/') # escape reloading
{ {
body: ld.text, body: ld.text,

View file

@ -11,6 +11,18 @@ class Invoice < ActiveRecord::Base
scope :unbinded, lambda { scope :unbinded, lambda {
where('id NOT IN (SELECT invoice_id FROM account_activities where invoice_id IS NOT NULL)') where('id NOT IN (SELECT invoice_id FROM account_activities where invoice_id IS NOT NULL)')
} }
scope :all_columns, ->{select("invoices.*")}
scope :sort_due_date_column, ->{all_columns.select("CASE WHEN invoices.cancelled_at is not null THEN
(invoices.cancelled_at + interval '100 year') ELSE
invoices.due_date END AS sort_due_date")}
scope :sort_by_sort_due_date_asc, ->{sort_due_date_column.order("sort_due_date ASC")}
scope :sort_by_sort_due_date_desc, ->{sort_due_date_column.order("sort_due_date DESC")}
scope :sort_receipt_date_column, ->{all_columns.includes(:account_activity).references(:account_activity).select(%Q{
CASE WHEN account_activities.created_at is not null THEN account_activities.created_at
WHEN invoices.cancelled_at is not null THEN invoices.cancelled_at + interval '100 year'
ELSE NULL END AS sort_receipt_date })}
scope :sort_by_sort_receipt_date_asc, ->{sort_receipt_date_column.order("sort_receipt_date ASC")}
scope :sort_by_sort_receipt_date_desc, ->{sort_receipt_date_column.order("sort_receipt_date DESC")}
attr_accessor :billing_email attr_accessor :billing_email
validates :billing_email, email_format: { message: :invalid }, allow_blank: true validates :billing_email, email_format: { message: :invalid }, allow_blank: true

View file

@ -1,4 +1,7 @@
class LegalDocument < ActiveRecord::Base class LegalDocument < ActiveRecord::Base
include EppErrors
MIN_BODY_SIZE = (1.37 * 3.kilobytes).ceil
if ENV['legal_document_types'].present? if ENV['legal_document_types'].present?
TYPES = ENV['legal_document_types'].split(',').map(&:strip) TYPES = ENV['legal_document_types'].split(',').map(&:strip)
else else
@ -9,9 +12,23 @@ class LegalDocument < ActiveRecord::Base
belongs_to :documentable, polymorphic: true belongs_to :documentable, polymorphic: true
validate :val_body_length, if: ->(file){ file.path.blank? && !Rails.env.staging?}
before_create :add_creator before_create :add_creator
before_save :save_to_filesystem before_save :save_to_filesystem
def epp_code_map
{
'2306' => [
[:body, :length]
]
}
end
def val_body_length
errors.add(:body, :length) if body.nil? || body.size < MIN_BODY_SIZE
end
def save_to_filesystem def save_to_filesystem

View file

@ -8,6 +8,8 @@ class Pricelist < ActiveRecord::Base
) )
} }
scope :valid_at, ->(time){ where("valid_from IS NULL OR valid_from <= ?", time).where("valid_to IS NULL OR valid_to >= ?", time) }
monetize :price_cents monetize :price_cents
validates :price_cents, :price_currency, :price, validates :price_cents, :price_currency, :price,
@ -27,6 +29,14 @@ class Pricelist < ActiveRecord::Base
"#{operation_category} #{category}" "#{operation_category} #{category}"
end end
def years_amount
duration.to_i
end
def price_decimal
price_cents / BigDecimal.new('100')
end
class << self class << self
def pricelist_for(zone, operation, period) def pricelist_for(zone, operation, period)
lists = valid.where(category: zone, operation_category: operation, duration: period) lists = valid.where(category: zone, operation_category: operation, duration: period)

View file

@ -1,4 +1,5 @@
class RegistrantUser < User class RegistrantUser < User
ACCEPTED_ISSUER = 'AS Sertifitseerimiskeskus'
attr_accessor :idc_data attr_accessor :idc_data
def ability def ability
@ -6,6 +7,19 @@ class RegistrantUser < User
end end
delegate :can?, :cannot?, to: :ability delegate :can?, :cannot?, to: :ability
def ident
registrant_ident.to_s.split("-").last
end
def domains
ident_cc, ident = registrant_ident.to_s.split '-'
Domain.includes(:registrar, :registrant).where(contacts: {
ident_type: 'priv',
ident: ident, #identity_code,
ident_country_code: ident_cc #country_code
})
end
def to_s def to_s
username username
end end
@ -13,15 +27,23 @@ class RegistrantUser < User
class << self class << self
def find_or_create_by_idc_data(idc_data, issuer_organization) def find_or_create_by_idc_data(idc_data, issuer_organization)
return false if idc_data.blank? return false if idc_data.blank?
return false if issuer_organization != 'AS Sertifitseerimiskeskus' return false if issuer_organization != ACCEPTED_ISSUER
idc_data.force_encoding('UTF-8') idc_data.force_encoding('UTF-8')
logger.error(idc_data)
logger.error(idc_data.encoding) # handling here new and old mode
if idc_data.starts_with?("/")
identity_code = idc_data.scan(/serialNumber=(\d+)/).flatten.first identity_code = idc_data.scan(/serialNumber=(\d+)/).flatten.first
country = idc_data.scan(/^\/C=(.{2})/).flatten.first country = idc_data.scan(/^\/C=(.{2})/).flatten.first
first_name = idc_data.scan(%r{/GN=(.+)/serialNumber}).flatten.first first_name = idc_data.scan(%r{/GN=(.+)/serialNumber}).flatten.first
last_name = idc_data.scan(%r{/SN=(.+)/GN}).flatten.first last_name = idc_data.scan(%r{/SN=(.+)/GN}).flatten.first
else
parse_str = "," + idc_data
identity_code = parse_str.scan(/,serialNumber=(\d+)/).flatten.first
country = parse_str.scan(/,C=(.{2})/).flatten.first
first_name = parse_str.scan(/,GN=([^,]+)/).flatten.first
last_name = parse_str.scan(/,SN=([^,]+)/).flatten.first
end
u = where(registrant_ident: "#{country}-#{identity_code}").first_or_create u = where(registrant_ident: "#{country}-#{identity_code}").first_or_create
u.username = "#{first_name} #{last_name}" u.username = "#{first_name} #{last_name}"

View file

@ -2,7 +2,11 @@ class ReservedDomain < ActiveRecord::Base
include Versions # version/reserved_domain_version.rb include Versions # version/reserved_domain_version.rb
before_save :fill_empty_passwords before_save :fill_empty_passwords
before_save :generate_data before_save :generate_data
before_destroy :remove_data after_destroy :remove_data
validates :name, domain_name: true, uniqueness: true
class << self class << self
@ -18,33 +22,40 @@ class ReservedDomain < ActiveRecord::Base
def any_of_domains names def any_of_domains names
where(name: names) where(name: names)
end end
def new_password_for name
record = by_domain(name).first
return unless record
record.regenerate_password
record.save
end
end end
def fill_empty_passwords
self.password = SecureRandom.hex unless self.password
end
def name= val def name= val
super SimpleIDN.to_unicode(val) super SimpleIDN.to_unicode(val)
end end
def fill_empty_passwords
regenerate_password if self.password.blank?
end
def regenerate_password
self.password = SecureRandom.hex
end
def generate_data def generate_data
return if Domain.where(name: name).any? return if Domain.where(name: name).any?
@json = generate_json
@body = generate_body
update_whois_server
end
alias_method :update_whois_record, :generate_data
def update_whois_server
wr = Whois::Record.find_or_initialize_by(name: name) wr = Whois::Record.find_or_initialize_by(name: name)
wr.body = @body wr.json = @json = generate_json # we need @json to bind to class
wr.json = @json wr.body = generate_body
wr.save wr.save
end end
alias_method :update_whois_record, :generate_data
def generate_body def generate_body
template = Rails.root.join("app/views/for_models/whois_other.erb".freeze) template = Rails.root.join("app/views/for_models/whois_other.erb".freeze)
@ -59,9 +70,7 @@ class ReservedDomain < ActiveRecord::Base
end end
def remove_data def remove_data
return if Domain.where(name: name).any? UpdateWhoisRecordJob.enqueue name, 'reserved'
Whois::Record.where(name: name).delete_all
end end
end end

219
app/models/soap/arireg.rb Normal file
View file

@ -0,0 +1,219 @@
# coding: utf-8
require 'savon'
=begin
Estonian Business registry provides information about registered companies via xml (SOAP over HTTPS).
Note:
The SSL endpoint certificate is self signed.
Documentation:
http://www.rik.ee/et/e-ariregister/xml-teenus
Specifications are in Eng and Est
User contract required
Testing:
https://demo-ariregxml.rik.ee:447/testariport/?wsdl
http://demo-ariregxml.rik.ee:81
https://demo-ariregxml.rik.ee:447
Live service:
https://ariregxml.rik.ee/ariport/?wsdl
https://ariregxml.rik.ee/
Implements Soap::Arireg # associated_businesses
8. arireg.paringesindus_v4
Rights of representation of all persons related to the company (newer)
http://www2.rik.ee/schemas/xtee/arireg/live/paringesindus_v4.xsd
expects personal id code, to fetch list of registered business id codes
returning {ident: person, ident_country_code: ... associated_businesses: [...id_codes...]}
=end
# do some SSL set up?
# ssl_version
# ssl_verify_mode
# ssl_cert_key_file
# ssl_cert_key
# ssl_cert_key_password
# ssl_cert_file
# ssl_cert
# ssl_ca_cert_file
# ssl_ca_cert
module Soap
class Arireg
class NotAvailableError < StandardError
attr_accessor :json
def initialize(params)
params[:message] = "#{I18n.t(:business_registry_service_not_available)}" unless params.key? :message
@json = params
super(params)
end
end
class << self
attr_accessor :wsdl, :host, :username, :password
end
def initialize
if self.class.username.nil?
if Rails.application.secrets.key?(:arireg)
arireg = Rails.application.secrets[:arireg].with_indifferent_access
self.class.username = arireg[:username]
self.class.password = arireg[:password]
if self.class.wsdl.nil? # no override of config/environments/* ?
self.class.wsdl = arireg[:wsdl]
self.class.host = arireg[:host]
end
else
self.class.username = ENV['arireg_username']
self.class.password = ENV['arireg_password']
end
end
if self.class.wsdl.nil?
self.class.wsdl = ENV['arireg_wsdl']
self.class.host = ENV['arireg_host']
end
# note Savon has error if https w/non-standard port,
# use non-standard force to pre-set endpoint
@client = Savon.client(wsdl: self.class.wsdl,
host: self.class.host,
endpoint: "#{self.class.host}/cgi-bin/consumer_proxy")
@session = nil
end
# retrieve business id codes for business that a person has a legal role
def associated_businesses(ident, ident_cc = 'EST')
begin
msg = {
'fyysilise_isiku_kood' => ident,
'fyysilise_isiku_koodi_riik' => country_code_3(ident_cc)
}
Rails.logger.info "[Ariregister] Request sent with data: #{msg.inspect}"
response = @client.call :paringesindus_v4, message: body(msg)
content = extract response, :paringesindus_v4_response
Rails.logger.info "[Ariregister] Got response with data: #{content.inspect}"
if content.present? && content[:ettevotjad].key?(:item)
business_ident = items(content, :ettevotjad).map{|item| item[:ariregistri_kood]}
else
business_ident = []
end
{
ident: ident,
ident_country_code: ident_cc,
# ident_type: 'priv',
retrieved_on: Time.now,
associated_businesses: business_ident
}
rescue Savon::SOAPFault => fault
Rails.logger.error "[Ariregister] #{fault} Äriregister arireg #{self.class.username} at #{self.class.host }"
raise NotAvailableError.new(exception: fault)
rescue HTTPI::SSLError => ssl_error
Rails.logger.error "[Ariregister] #{ssl_error} at #{self.class.host}"
raise NotAvailableError.new(exception: ssl_error)
rescue SocketError => sock
Rails.logger.error "[Ariregister] #{sock}"
raise NotAvailableError.new(exception: sock)
end
end
def debug
@client.globals.log_level :debug
@client.globals.log true
@client.globals.pretty_print_xml true
@debug = true
@client
end
private
# add required elements to request
def body(args)
if @session.nil?
args['ariregister_kasutajanimi'] = self.class.username
args['ariregister_parool'] = self.class.password
else
args['ariregister_sessioon'] = @session
end
{keha: args}
end
# TLA --- three letter acronym required not two letter acronym, transform
def country_code_3(code)
if code.length == 2
code = CC2X3[code]
raise NotAvailableError.new(message: 'Unrecognized Country') if code.nil?
end
code
end
def extract(response, element)
# response envelope body has again header/body under element; header is user and password returned
response.hash[:envelope][:body][element][:keha]
end
def items(content, parent)
items = content[parent][:item]
items.is_a?(Array) ? items : [items]
end
CC2X3 = {"AF"=>"AFG", "AX"=>"ALA", "AL"=>"ALB", "DZ"=>"DZA", "AS"=>"ASM",
"AD"=>"AND", "AO"=>"AGO", "AI"=>"AIA", "AQ"=>"ATA", "AG"=>"ATG",
"AR"=>"ARG", "AM"=>"ARM", "AW"=>"ABW", "AU"=>"AUS", "AT"=>"AUT",
"AZ"=>"AZE", "BS"=>"BHS", "BH"=>"BHR", "BD"=>"BGD", "BB"=>"BRB",
"BY"=>"BLR", "BE"=>"BEL", "BZ"=>"BLZ", "BJ"=>"BEN", "BM"=>"BMU",
"BT"=>"BTN", "BO"=>"BOL", "BQ"=>"BES", "BA"=>"BIH", "BW"=>"BWA",
"BV"=>"BVT", "BR"=>"BRA", "IO"=>"IOT", "BN"=>"BRN", "BG"=>"BGR",
"BF"=>"BFA", "BI"=>"BDI", "CV"=>"CPV", "KH"=>"KHM", "CM"=>"CMR",
"CA"=>"CAN", "KY"=>"CYM", "CF"=>"CAF", "TD"=>"TCD", "CL"=>"CHL",
"CN"=>"CHN", "CX"=>"CXR", "CC"=>"CCK", "CO"=>"COL", "KM"=>"COM",
"CD"=>"COD", "CG"=>"COG", "CK"=>"COK", "CR"=>"CRI", "CI"=>"CIV",
"HR"=>"HRV", "CU"=>"CUB", "CW"=>"CUW", "CY"=>"CYP", "CZ"=>"CZE",
"DK"=>"DNK", "DJ"=>"DJI", "DM"=>"DMA", "DO"=>"DOM", "EC"=>"ECU",
"EG"=>"EGY", "SV"=>"SLV", "GQ"=>"GNQ", "ER"=>"ERI", "EE"=>"EST",
"ET"=>"ETH", "FK"=>"FLK", "FO"=>"FRO", "FJ"=>"FJI", "FI"=>"FIN",
"FR"=>"FRA", "GF"=>"GUF", "PF"=>"PYF", "TF"=>"ATF", "GA"=>"GAB",
"GM"=>"GMB", "GE"=>"GEO", "DE"=>"DEU", "GH"=>"GHA", "GI"=>"GIB",
"GR"=>"GRC", "GL"=>"GRL", "GD"=>"GRD", "GP"=>"GLP", "GU"=>"GUM",
"GT"=>"GTM", "GG"=>"GGY", "GN"=>"GIN", "GW"=>"GNB", "GY"=>"GUY",
"HT"=>"HTI", "HM"=>"HMD", "VA"=>"VAT", "HN"=>"HND", "HK"=>"HKG",
"HU"=>"HUN", "IS"=>"ISL", "IN"=>"IND", "ID"=>"IDN", "IR"=>"IRN",
"IQ"=>"IRQ", "IE"=>"IRL", "IM"=>"IMN", "IL"=>"ISR", "IT"=>"ITA",
"JM"=>"JAM", "JP"=>"JPN", "JE"=>"JEY", "JO"=>"JOR", "KZ"=>"KAZ",
"KE"=>"KEN", "KI"=>"KIR", "KP"=>"PRK", "KR"=>"KOR", "KW"=>"KWT",
"KG"=>"KGZ", "LA"=>"LAO", "LV"=>"LVA", "LB"=>"LBN", "LS"=>"LSO",
"LR"=>"LBR", "LY"=>"LBY", "LI"=>"LIE", "LT"=>"LTU", "LU"=>"LUX",
"MO"=>"MAC", "MK"=>"MKD", "MG"=>"MDG", "MW"=>"MWI", "MY"=>"MYS",
"MV"=>"MDV", "ML"=>"MLI", "MT"=>"MLT", "MH"=>"MHL", "MQ"=>"MTQ",
"MR"=>"MRT", "MU"=>"MUS", "YT"=>"MYT", "MX"=>"MEX", "FM"=>"FSM",
"MD"=>"MDA", "MC"=>"MCO", "MN"=>"MNG", "ME"=>"MNE", "MS"=>"MSR",
"MA"=>"MAR", "MZ"=>"MOZ", "MM"=>"MMR", "NA"=>"NAM", "NR"=>"NRU",
"NP"=>"NPL", "NL"=>"NLD", "NC"=>"NCL", "NZ"=>"NZL", "NI"=>"NIC",
"NE"=>"NER", "NG"=>"NGA", "NU"=>"NIU", "NF"=>"NFK", "MP"=>"MNP",
"NO"=>"NOR", "OM"=>"OMN", "PK"=>"PAK", "PW"=>"PLW", "PS"=>"PSE",
"PA"=>"PAN", "PG"=>"PNG", "PY"=>"PRY", "PE"=>"PER", "PH"=>"PHL",
"PN"=>"PCN", "PL"=>"POL", "PT"=>"PRT", "PR"=>"PRI", "QA"=>"QAT",
"RE"=>"REU", "RO"=>"ROU", "RU"=>"RUS", "RW"=>"RWA", "BL"=>"BLM",
"SH"=>"SHN", "KN"=>"KNA", "LC"=>"LCA", "MF"=>"MAF", "PM"=>"SPM",
"VC"=>"VCT", "WS"=>"WSM", "SM"=>"SMR", "ST"=>"STP", "SA"=>"SAU",
"SN"=>"SEN", "RS"=>"SRB", "SC"=>"SYC", "SL"=>"SLE", "SG"=>"SGP",
"SX"=>"SXM", "SK"=>"SVK", "SI"=>"SVN", "SB"=>"SLB", "SO"=>"SOM",
"ZA"=>"ZAF", "GS"=>"SGS", "SS"=>"SSD", "ES"=>"ESP", "LK"=>"LKA",
"SD"=>"SDN", "SR"=>"SUR", "SJ"=>"SJM", "SZ"=>"SWZ", "SE"=>"SWE",
"CH"=>"CHE", "SY"=>"SYR", "TW"=>"TWN", "TJ"=>"TJK", "TZ"=>"TZA",
"TH"=>"THA", "TL"=>"TLS", "TG"=>"TGO", "TK"=>"TKL", "TO"=>"TON",
"TT"=>"TTO", "TN"=>"TUN", "TR"=>"TUR", "TM"=>"TKM", "TC"=>"TCA",
"TV"=>"TUV", "UG"=>"UGA", "UA"=>"UKR", "AE"=>"ARE", "GB"=>"GBR",
"UM"=>"UMI", "US"=>"USA", "UY"=>"URY", "UZ"=>"UZB", "VU"=>"VUT",
"VE"=>"VEN", "VN"=>"VNM", "VG"=>"VGB", "VI"=>"VIR", "WF"=>"WLF",
"EH"=>"ESH", "YE"=>"YEM", "ZM"=>"ZMB", "ZW"=>"ZWE"}
end
end

View file

@ -45,7 +45,7 @@
.col-md-3 .col-md-3
.col-md-2 .col-md-2
.col-md-4{class: 'text-right'} .col-md-4{class: 'text-right'}
= t(:starting_balance) + " #{@sum.to_a.map(&:sum).sum.to_f} EUR" = t(:starting_balance) + " #{@sum.to_f} EUR"
%hr %hr
@ -66,10 +66,10 @@
%th{class: 'col-xs-2'} %th{class: 'col-xs-2'}
= sort_link(@q, 'sum') = sort_link(@q, 'sum')
%tbody %tbody
-total = @sum.to_a.map(&:sum).sum.to_f -total = @sum.to_f
- @account_activities.each do |x| - @account_activities.each do |x|
%tr %tr
%td= link_to(x.account.registrar.try(:code), admin_registrar_path(x.account.registrar)) %td= x.account.registrar && link_to(x.account.registrar.try(:code), admin_registrar_path(x.account.registrar))
%td= x.description.present? ? x.description : '-' %td= x.description.present? ? x.description : '-'
%td= x.activity_type ? t(x.activity_type) : '' %td= x.activity_type ? t(x.activity_type) : ''
%td= l(x.created_at) %td= l(x.created_at)

View file

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

View file

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

View file

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

View file

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

View file

@ -59,7 +59,13 @@
.form-group .form-group
= label_tag t(:results_per_page) = label_tag t(:results_per_page)
= text_field_tag :results_per_page, params[:results_per_page], class: 'form-control', placeholder: t(:results_per_page) = text_field_tag :results_per_page, params[:results_per_page], class: 'form-control', placeholder: t(:results_per_page)
.col-md-3{style: 'padding-top: 25px;'} .col-md-3
.form-group
= label_tag :only_no_country_code, "Ident CC missing"
= check_box_tag :only_no_country_code, '1',params[:only_no_country_code].eql?('1'), style: 'width:auto;height:auto;float:right'
.row
.col-md-3{style: 'padding-top: 25px;float:right;'}
%button.btn.btn-primary %button.btn.btn-primary
&nbsp; &nbsp;
%span.glyphicon.glyphicon-search %span.glyphicon.glyphicon-search

View file

@ -29,11 +29,11 @@
.col-md-3 .col-md-3
.form-group .form-group
= f.label t(:created_after) = f.label t(:created_after)
= f.search_field :created_at_gteq, class: 'form-control', placeholder: t(:created_after), autocomplete: 'off' = f.search_field :created_at_gteq, value: params[:q][:created_at_gteq], class: 'form-control datepicker', placeholder: t(:created_after), autocomplete: 'off'
.col-md-3 .col-md-3
.form-group .form-group
= f.label t(:created_before) = f.label t(:created_before)
= f.search_field :created_at_lteq, class: 'form-control', placeholder: t(:created_before), autocomplete: 'off' = f.search_field :created_at_lteq, value: params[:q][:created_at_lteq], class: 'form-control datepicker', placeholder: t(:created_before), autocomplete: 'off'
.col-md-3{style: 'padding-top: 25px;'} .col-md-3{style: 'padding-top: 25px;'}
%button.btn.btn-primary %button.btn.btn-primary
&nbsp; &nbsp;

View file

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

View file

@ -82,6 +82,11 @@
= f.label :code = f.label :code
.col-md-7 .col-md-7
= f.text_field(:code, class: 'form-control', disabled: !f.object.new_record?) = f.text_field(:code, class: 'form-control', disabled: !f.object.new_record?)
.form-group
.col-md-4.control-label
= f.label :test_registrar
.col-md-7
= f.check_box :test_registrar, class: 'form-control'
%hr %hr
.row .row

View file

@ -14,12 +14,15 @@
= sort_link(@q, 'reg_no', t(:reg_no)) = sort_link(@q, 'reg_no', t(:reg_no))
%th{class: 'col-xs-4'} %th{class: 'col-xs-4'}
= t(:credit_balance) = t(:credit_balance)
%th{class: 'col-xs-4'}
= t(:test_registrar)
%tbody %tbody
- @registrars.each do |x| - @registrars.each do |x|
%tr %tr
%td= link_to(x, [:admin, x]) %td= link_to(x, [:admin, x])
%td= x.reg_no %td= x.reg_no
%td= "#{x.balance}" %td= "#{x.balance}"
%td= "#{x.test_registrar}"
.row .row
.col-md-12 .col-md-12
= paginate @registrars = paginate @registrars

View file

@ -2,6 +2,10 @@
= link_to(t(:edit), edit_admin_registrar_path(@registrar), class: 'btn btn-primary') = link_to(t(:edit), edit_admin_registrar_path(@registrar), class: 'btn btn-primary')
= link_to(t(:delete), admin_registrar_path(@registrar), = link_to(t(:delete), admin_registrar_path(@registrar),
method: :delete, data: { confirm: t(:are_you_sure) }, class: 'btn btn-danger') method: :delete, data: { confirm: t(:are_you_sure) }, class: 'btn btn-danger')
- content_for :page_name do
= @registrar.name
- if @registrar.test_registrar?
%span{style: "color: #c9302c;"} (test)
= render 'shared/title', name: @registrar.name = render 'shared/title', name: @registrar.name
- if @registrar.errors.any? - if @registrar.errors.any?

View file

@ -29,11 +29,11 @@
.col-md-3 .col-md-3
.form-group .form-group
= f.label t(:created_after) = f.label t(:created_after)
= f.search_field :created_at_gteq, class: 'form-control', placeholder: t(:created_after), autocomplete: 'off' = f.search_field :created_at_gteq, value: params[:q][:created_at_gteq], class: 'form-control datepicker', placeholder: t(:created_after), autocomplete: 'off'
.col-md-3 .col-md-3
.form-group .form-group
= f.label t(:created_before) = f.label t(:created_before)
= f.search_field :created_at_lteq, class: 'form-control', placeholder: t(:created_before), autocomplete: 'off' = f.search_field :created_at_lteq, value: params[:q][:created_at_lteq], class: 'form-control datepicker', placeholder: t(:created_before), autocomplete: 'off'
.col-md-3{style: 'padding-top: 25px;'} .col-md-3{style: 'padding-top: 25px;'}
%button.btn.btn-primary %button.btn.btn-primary
&nbsp; &nbsp;

View file

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

View file

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

View file

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

View file

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

View file

@ -51,6 +51,7 @@
= render 'setting_row', var: :transfer_wait_time = render 'setting_row', var: :transfer_wait_time
= render 'setting_row', var: :ds_digest_type = render 'setting_row', var: :ds_digest_type
= render 'setting_row', var: :client_side_status_editing_enabled = render 'setting_row', var: :client_side_status_editing_enabled
= render 'setting_row', var: :days_to_keep_business_registry_cache
= render 'setting_row', var: :api_ip_whitelist_enabled = render 'setting_row', var: :api_ip_whitelist_enabled
= render 'setting_row', var: :registrar_ip_whitelist_enabled = render 'setting_row', var: :registrar_ip_whitelist_enabled
= render 'setting_row', var: :request_confrimation_on_registrant_change_enabled = render 'setting_row', var: :request_confrimation_on_registrant_change_enabled
@ -68,6 +69,9 @@
%tbody %tbody
= render 'setting_row', var: :invoice_number_min = render 'setting_row', var: :invoice_number_min
= render 'setting_row', var: :invoice_number_max = render 'setting_row', var: :invoice_number_max
= render 'setting_row', var: :directo_monthly_number_min
= render 'setting_row', var: :directo_monthly_number_max
= render 'setting_row', var: :directo_monthly_number_last
= render 'setting_row', var: :days_to_keep_invoices_active = render 'setting_row', var: :days_to_keep_invoices_active
= render 'setting_row', var: :days_to_keep_overdue_invoices_active = render 'setting_row', var: :days_to_keep_overdue_invoices_active
= render 'setting_row', var: :minimum_deposit = render 'setting_row', var: :minimum_deposit

View file

@ -55,7 +55,7 @@
%li= link_to t(:pricelists), admin_pricelists_path %li= link_to t(:pricelists), admin_pricelists_path
%li= link_to t(:bank_statements), admin_bank_statements_path %li= link_to t(:bank_statements), admin_bank_statements_path
%li= link_to t(:invoices), admin_invoices_path %li= link_to t(:invoices), admin_invoices_path
%li= link_to t(:account_activities), admin_account_activities_path %li= link_to t(:account_activities), admin_account_activities_path(created_after: 'today')
%li.divider %li.divider
%li.dropdown-header= t(:system) %li.dropdown-header= t(:system)
%li= link_to t(:settings), admin_settings_path %li= link_to t(:settings), admin_settings_path
@ -64,8 +64,8 @@
%li= link_to t(:reserved_domains), admin_reserved_domains_path %li= link_to t(:reserved_domains), admin_reserved_domains_path
%li= link_to t(:mail_templates), admin_mail_templates_path %li= link_to t(:mail_templates), admin_mail_templates_path
-# %li= link_to t(:domains_history), admin_domain_versions_path -# %li= link_to t(:domains_history), admin_domain_versions_path
%li= link_to t(:epp_logs), admin_epp_logs_path %li= link_to t(:epp_logs), admin_epp_logs_path(created_after: 'today')
%li= link_to t(:repp_logs), admin_repp_logs_path %li= link_to t(:repp_logs), admin_repp_logs_path(created_after: 'today')
%li= link_to t(:que), '/admin/que' %li= link_to t(:que), '/admin/que'
- if signed_in? - if signed_in?

View file

@ -0,0 +1,23 @@
.panel.panel-default
.panel-heading
%h3.panel-title= t(:address)
.panel-body
%dl.dl-horizontal
- if @contact.org_name.present?
%dt= t(:org_name)
%dd= @contact.org_name
%dt= t(:street)
%dd= @contact.street.to_s.gsub("\n", '<br>').html_safe
%dt= t(:city)
%dd= @contact.city
%dt= t(:zip)
%dd= @contact.zip
%dt= t(:state)
%dd= @contact.state
%dt= t(:country)
%dd= @contact.country

View file

@ -0,0 +1,30 @@
- domains = contact.all_domains(page: params[:domain_page], per: 20, params: params.merge(leave_domains: domain_ids))
#contacts.panel.panel-default
.panel-heading
.pull-left
= t(:domains)
.pull-right
= form_tag request.path, method: :get do
= select_tag :domain_filter, options_for_select(%w(Registrant AdminDomainContact TechDomainContact), selected: params[:domain_filter]),
include_blank: true, class: 'form-control2 selectize2'
%button.btn.btn-primary
%span.glyphicon.glyphicon-search
.clearfix
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-3'}=custom_sort_link t(:domain_name), :name
%th{class: 'col-xs-3'}=custom_sort_link t(:registrar), :registrar_name
%th{class: 'col-xs-3'}=custom_sort_link t(:valid_to), :valid_to
%th{class: 'col-xs-3'}=custom_sort_link t(:roles), :roles
%tbody
- domains.each do |x|
%tr
%td= link_to(x.name, [:registrant, x])
%td= link_to(x.registrar, [:registrant, x.registrar])
%td= l(x.valid_to, format: :short)
%td= x.roles.join(", ")
= paginate domains, param_name: :domain_page

View file

@ -0,0 +1,48 @@
.panel.panel-default
.panel-heading
%h3.panel-title= t(:general)
.panel-body
%dl.dl-horizontal
%dt= t(:id)
%dd= @contact.code
%dt= t(:name)
%dd= @contact.name
%dt= t(:password)
%dd
= text_field_tag :auth_info, @contact.auth_info, readonly: true, class: 'partially-hidden'
%br
%dt= t(:ident)
%dd= ident_for(@contact)
%dt= t(:email)
%dd= @contact.email
%dt= t(:phone)
%dd= @contact.phone
- if @contact.fax
%dt= t(:fax)
%dd= @contact.fax
%br
%dt= t(:created)
%dd
= l(@contact.created_at, format: :short)
by
= @contact.name
%dt= t(:updated)
%dd
= l(@contact.updated_at, format: :short)
by
= @contact.name
%dt= t(:registrar)
%dd
- if @contact.registrar.present?
= link_to(@contact.registrar, registrant_registrar_path(@contact.registrar))

View file

@ -0,0 +1,6 @@
= search_form_for [:registrant, @q] do |f|
= f.search_field :name_cont
= f.submit do
%span.glyphicon.glyphicon-search

View file

@ -0,0 +1,21 @@
- panel_class = contact.errors.messages[:statuses] ? 'panel-danger' : 'panel-default'
#contact_statuses.panel{class: panel_class}
.panel-heading.clearfix
= t(:statuses)
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-6'}= t(:status)
%th{class: 'col-xs-6'}= t(:notes)
%tbody
- contact.statuses.each do |status|
%tr
%td= status
%td= contact.status_notes[status]
- if contact.errors.messages[:statuses]
%tfoot
- @domain.errors.messages[:statuses].each do |s|
%tr
%td{colspan: 4}= s

View file

@ -0,0 +1,11 @@
= render 'shared/title', name: @contact.name
.row
.col-md-6= render 'registrant/contacts/partials/general'
.col-md-6= render 'registrant/contacts/partials/address'
.row
.col-md-12= render 'registrant/contacts/partials/statuses', contact: @contact
.row
.col-md-12= render 'registrant/contacts/partials/domains', contact: @contact

View file

@ -0,0 +1,13 @@
- content_for :actions do
= render 'shared/title', name: @domain.name
.row
.col-md-12
.panel.panel-default
.panel-heading
%h3.panel-title= t(:personal_domain_verification_url)
.panel-body
.input-group.input-group-lg
%span#sizing-addon1.input-group-addon.glyphicon.glyphicon-link
%input.form-control{"aria-describedby" => "sizing-addon1", type: "text", value: @verification_url}

View file

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

View file

@ -1,5 +1,52 @@
= render 'shared/title', name: t(:domains) = render 'shared/title', name: t(:domains)
.row
.col-md-12
= search_form_for [:registrant, @q], html: { style: 'margin-bottom: 0;', class: 'js-form', autocomplete: 'off' } do |f|
.row
.col-md-3
.form-group
= f.label :name
= f.search_field :name_matches, value: params[:q][:name_matches], class: 'form-control', placeholder: t(:name)
.col-md-3
.form-group
= f.label t(:registrant_ident)
= f.search_field :registrant_ident_eq, class: 'form-control', placeholder: t(:registrant_ident)
.row
.col-md-3
.form-group
= f.label t(:valid_to_from)
= f.search_field :valid_to_gteq, value: params[:q][:valid_to_gteq], class: 'form-control datepicker', placeholder: t(:valid_to_from)
.col-md-3
.form-group
= f.label t(:valid_to_until)
= f.search_field :valid_to_lteq, value: params[:q][:valid_to_lteq], class: 'form-control datepicker', placeholder: t(:valid_to_until)
.col-md-3
.form-group
= label_tag t(:results_per_page)
= text_field_tag :results_per_page, params[:results_per_page], class: 'form-control', placeholder: t(:results_per_page)
.col-md-3{style: 'padding-top: 25px;'}
%button.btn.btn-primary
&nbsp;
%span.glyphicon.glyphicon-search
&nbsp;
%button.btn.btn-default.js-reset-form
= t(:clear_fields)
.row
.col-md-3
.btn-group{:role => "group"}
%button.btn.btn-default.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", :type => "button"}
Download
%span.caret
%ul.dropdown-menu
%li= link_to 'PDF', download_list_registrant_domains_path(q: params[:q], format: "pdf")
%li= link_to 'CSV', download_list_registrant_domains_path(q: params[:q], format: "csv")
.col-md-3
.col-md-3
.col-md-3
%hr %hr
.row .row
.col-md-12 .col-md-12
@ -8,20 +55,30 @@
%thead %thead
%tr %tr
%th{class: 'col-xs-2'} %th{class: 'col-xs-2'}
= t(:name) = sort_link(@q, 'name')
%th{class: 'col-xs-2'} %th{class: 'col-xs-2'}
= t(:registrant) = sort_link(@q, 'registrant_name', t(:registrant))
%th{class: 'col-xs-2'} %th{class: 'col-xs-2'}
= t(:valid_to) = sort_link(@q, 'valid_to', t(:valid_to))
%th{class: 'col-xs-2'} %th{class: 'col-xs-2'}
= t(:registrar) = sort_link(@q, 'registrar_name', t(:registrar))
%tbody %tbody
-# - @domains.each do |x| - @domains.each do |x|
-# %tr %tr
-# %td= link_to(x, admin_domain_path(x)) %td= link_to(x, registrant_domain_path(x))
-# %td %td= link_to(x.registrant.name, registrant_contact_path(x.registrant)) if x.registrant
-# - if x.registrant %td= l(x.valid_to, format: :short)
-# = link_to(x.registrant, [:admin, x.registrant]) %td= link_to(x.registrar, registrant_registrar_path(x.registrar)) if x.registrar
.row
.col-md-6
= paginate @domains
.col-md-6.text-right
.pagination
= t(:result_count, count: @domains.total_count)
:coffee
$(".js-reset-form").on "click", (e) ->
e.preventDefault();
window.location = "#{registrant_domains_path}"
-# %td= l(x.valid_to, format: :short)
-# %td= link_to(x.registrar, admin_registrar_path(x.registrar)) if x.registrar

View file

@ -0,0 +1,22 @@
- panel_class = @domain.errors.messages[:admin_contacts] ? 'panel-danger' : 'panel-default'
.panel{class: panel_class}
.panel-heading.clearfix
= t(:admin_contacts)
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-4'}= t(:name)
%th{class: 'col-xs-4'}= t(:id)
%th{class: 'col-xs-4'}= t(:email)
%tbody
- @domain.admin_contacts.each do |ac|
%tr
%td= link_to(ac, registrant_contact_path(ac))
%td= ac.code
%td= ac.email
- if @domain.errors.messages[:admin_contacts]
%tfoot
- @domain.errors.messages[:admin_contacts].each do |x|
%tr
%td{colspan: 4}= x

View file

@ -0,0 +1,25 @@
- panel_class = @domain.errors.messages[:dnskeys] ? 'panel-danger' : 'panel-default'
#dnskeys.panel{class: panel_class}
.panel-heading.clearfix
= t(:dnskeys)
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-1'}= t(:flag)
%th{class: 'col-xs-1'}= t(:protocol)
%th{class: 'col-xs-1'}= t(:algorithm)
%th{class: 'col-xs-9'}= t(:public_key)
%tbody
- @domain.dnskeys.each do |x|
%tr
%td= x.flags
%td= x.protocol
%td= x.alg
%td= x.public_key
- if @domain.errors.messages[:dnskeys]
%tfoot
- @domain.errors.messages[:dnskeys].each do |x|
%tr
%td{colspan: 4}= x

View file

@ -0,0 +1,32 @@
.panel.panel-default
.panel-heading
%h3.panel-title= t(:general)
.panel-body
%dl.dl-horizontal
%dt= t(:name)
%dd= @domain.name
%dt= t(:registered_at)
%dd= l(@domain.registered_at)
%dt= t(:registrar)
%dd= link_to(@domain.registrar, registrant_registrar_path(@domain.registrar))
%dt= t(:authinfo_pw)
%dd
= text_field_tag :password, @domain.auth_info, readonly: true, class: 'partially-hidden'
%dt= t(:valid_from)
%dd= l(@domain.valid_from)
%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)

View file

@ -0,0 +1,20 @@
.panel{class: 'panel-default'}
.panel-heading.clearfix
= t(:keyrelays)
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-4'}= t(:uploaded_at)
%th{class: 'col-xs-3'}= t(:expiry)
%th{class: 'col-xs-2'}= t(:requester)
%th{class: 'col-xs-2'}= t(:accepter)
%th{class: 'col-xs-1'}= t(:status)
%tbody
- @domain.keyrelays.includes([:requester, :accepter]).order(pa_date: :desc).each do |x|
%tr
%td= link_to(x.pa_date, [:registrar, x])
%td= x.expiry
%td= link_to(x.requester, [:registrar, x.requester])
%td= link_to(x.accepter, [:registrar, x.accepter])
%td= x.status

View file

@ -0,0 +1,14 @@
.panel.panel-default
.panel-heading.clearfix
= t(:legal_documents)
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-8'}= t(:created_at)
%th{class: 'col-xs-4'}= t(:type)
%tbody
- legal_documents.each do |x|
%tr
%td= link_to(x.created_at, [:registrar, x])
%td= x.document_type

View file

@ -0,0 +1,23 @@
- panel_class = @domain.errors.messages[:nameservers] ? 'panel-danger' : 'panel-default'
#nameservers.panel{class: panel_class}
.panel-heading.clearfix
= t(:nameservers)
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-4'}= t(:hostname)
%th{class: 'col-xs-4'}= t(:ipv4)
%th{class: 'col-xs-4'}= t(:ipv6)
%tbody
- @domain.nameservers.each do |x|
%tr
%td= x
%td= x.ipv4
%td= x.ipv6
- if @domain.errors.messages[:nameservers]
%tfoot
- @domain.errors.messages[:nameservers].each do |x|
%tr
%td{colspan: 3}= x

View file

@ -0,0 +1,19 @@
.panel.panel-default
.panel-heading
%h3.panel-title= t(:registrant)
.panel-body
%dl.dl-horizontal
%dt= t(:name)
%dd= link_to(@domain.registrant.name, registrant_contact_path(@domain.registrant))
%dt= t(:id)
%dd= @domain.registrant_code
%dt= t(:identity_code)
%dd= @domain.registrant_ident
%dt= t(:email)
%dd= @domain.registrant_email
%dt= t(:phone)
%dd= @domain.registrant_phone

View file

@ -0,0 +1,18 @@
#domain_statuses.panel.panel-default
.panel-heading.clearfix
= t(:statuses)
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-6'}= t(:status)
%th{class: 'col-xs-6'}= t(:notes)
%tbody
- @domain.statuses.each do |status|
%tr
%td
- if [DomainStatus::PENDING_UPDATE, DomainStatus::PENDING_DELETE_CONFIRMATION].include?(status) && @domain.pending_json.present?
= link_to(status, domain_verification_url_registrant_domain_url(@domain.id))
- else
= status
%td= @domain.status_notes[status]

View file

@ -0,0 +1,22 @@
- panel_class = @domain.errors.messages[:tech_contacts] ? 'panel-danger' : 'panel-default'
#tech_contacts.panel{class: panel_class}
.panel-heading.clearfix
= t(:tech_contacts)
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-4'}= t(:name)
%th{class: 'col-xs-4'}= t(:id)
%th{class: 'col-xs-4'}= t(:email)
%tbody
- @domain.tech_contacts.each do |tc|
%tr
%td= link_to(tc, registrant_contact_path(tc))
%td= tc.code
%td= tc.email
- if @domain.errors.messages[:tech_contacts]
%tfoot
- @domain.errors.messages[:tech_contacts].each do |x|
%tr
%td{colspan: 4}= x

View file

@ -0,0 +1,17 @@
= render 'shared/title', name: @domain.name
.row
.col-md-6= render 'registrant/domains/partials/general'
.col-md-6= render 'registrant/domains/partials/owner'
.row
.col-md-12= render 'registrant/domains/partials/tech_contacts'
.row
.col-md-12= render 'registrant/domains/partials/admin_contacts'
.row
.col-md-12= render 'registrant/domains/partials/statuses'
.row
.col-md-12= render 'registrant/domains/partials/nameservers'
.row
.col-md-12= render 'registrant/domains/partials/dnskeys'
.row
.col-md-12= render 'registrant/domains/partials/keyrelays'

View file

@ -0,0 +1,21 @@
- content_for :actions do
= render 'shared/title', name: t(:registrars)
.row
.col-md-12
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-6'}
= sort_link(@q, 'name')
%th{class: 'col-xs-6'}
= sort_link(@q, 'reg_no', t(:reg_no))
%tbody
- @registrars.each do |x|
%tr
%td= link_to(x, [:registrar, x])
%td= x.reg_no
.row
.col-md-12
= paginate @registrars

View file

@ -0,0 +1,53 @@
= render 'shared/title', name: @registrar.name
- if @registrar.errors.any?
- @registrar.errors.each do |attr, err|
= err
%br
- if @registrar.errors.any?
%hr
.row
.col-md-6
.panel.panel-default
.panel-heading
%h3.panel-title= t(:general)
.panel-body
%dl.dl-horizontal
%dt= t(:name)
%dd= @registrar.name
%dt= t(:reg_no)
%dd= @registrar.reg_no
%dt= t(:vat_no)
%dd= @registrar.vat_no
%dt= t(:reference_no)
%dd= @registrar.reference_no
%dt= t(:id)
%dd= @registrar.code
.col-md-6
.panel.panel-default
.panel-heading
%h3.panel-title= t(:contact)
.panel-body
%dl.dl-horizontal
%dt= t(:country)
%dd= @registrar.country
%dt= t(:address)
%dd= @registrar.address
%dt= t(:contact_phone)
%dd= @registrar.phone
%dt= t(:contact_email)
%dd= @registrar.email
%dt= t(:billing_address)
%dd= @registrar.billing_address
%dt= t(:billing_email)
%dd= @registrar.billing_email

View file

@ -17,5 +17,5 @@
%span.glyphicon.glyphicon-search %span.glyphicon.glyphicon-search
&nbsp; &nbsp;
%hr %hr
- if @results - if @domain
= @results %pre= @domain.body

View file

@ -10,4 +10,4 @@
= f.label :legal_document, t(:legal_document) = f.label :legal_document, t(:legal_document)
%p.help-block= t(:legal_document_max_size) %p.help-block= t(:legal_document_max_size)
.col-md-7 .col-md-7
= f.file_field :legal_document, :value => '' = f.file_field :legal_document, :value => '', data: {legal_document: true}

View file

@ -18,7 +18,7 @@
= label_tag 'domain[legal_document]', t(:legal_document), class: c = label_tag 'domain[legal_document]', t(:legal_document), class: c
%p.help-block= t(:legal_document_max_size) %p.help-block= t(:legal_document_max_size)
.col-md-7 .col-md-7
= file_field_tag 'domain[legal_document]', required: fr = file_field_tag 'domain[legal_document]', required: fr, data: {legal_document: true}
.col-md-4 .col-md-4
%p.domain-general-help= t(:domain_general_help).html_safe %p.domain-general-help= t(:domain_general_help).html_safe
%p.domain-admin-contact-help= t(:domain_admin_contact_help).html_safe %p.domain-admin-contact-help= t(:domain_admin_contact_help).html_safe

View file

@ -4,7 +4,7 @@
.row .row
.col-sm-6 .col-sm-6
%h1.text-center-xs %h1.text-center-xs
= truncate(name, length: 35) = content_for?(:page_name) ? yield(:page_name) : truncate(name, length: 35)
.col-sm-6 .col-sm-6
%h1.text-right.text-center-xs %h1.text-right.text-center-xs
= yield :actions = yield :actions

View file

@ -88,6 +88,16 @@ repp_url: 'https://repp.gitlab.eu/repp/v1/'
# #
restful_whois_url: 'https://restful-whois.example.com' restful_whois_url: 'https://restful-whois.example.com'
#
# Estonian Business Registry
#
# config/secrets.yml --- arireg: {username, password}
arireg_username: 'kasutaja'
arireg_password: 'parool'
# config/environments/production.rb --- Soap::Arireg.wsdl, Soap::Arireg.host
arireg_wsdl: 'lib/schemas/testariport.wsdl' # https://demo-ariregxml.rik.ee:447/testariport/?wsdl
#arireg_wsdl: 'lib/schemas/ariport.wsdl' # https://ariregxml.rik.ee/ariport/?wsdl
arireg_host: 'https://demo-ariregxml.rik.ee:447' # https://ariregxml.rik.ee/
# #
# REGISTRAR AND REGISTRANT # REGISTRAR AND REGISTRANT

View file

@ -7,6 +7,8 @@ require 'action_controller/railtie'
require 'action_mailer/railtie' require 'action_mailer/railtie'
require 'action_view/railtie' require 'action_view/railtie'
require 'sprockets/railtie' require 'sprockets/railtie'
require 'csv'
require 'rails/all'
# require "rails/test_unit/railtie" # require "rails/test_unit/railtie"
# Require the gems listed in Gemfile, including any gems # Require the gems listed in Gemfile, including any gems

View file

@ -144,6 +144,7 @@ set :shared_paths, [
'config/initializers/current_commit_hash.rb', 'config/initializers/current_commit_hash.rb',
'log', 'log',
'public/system', 'public/system',
'public/assets',
'export/zonefiles', 'export/zonefiles',
'import/bank_statements', 'import/bank_statements',
'import/legal_documents', 'import/legal_documents',
@ -180,6 +181,9 @@ task setup: :environment do
queue! %(mkdir -p "#{deploy_to}/shared/public/system") queue! %(mkdir -p "#{deploy_to}/shared/public/system")
queue! %(chmod g+rx,u+rwx "#{deploy_to}/shared/public/system") queue! %(chmod g+rx,u+rwx "#{deploy_to}/shared/public/system")
queue! %(mkdir -p "#{deploy_to}/shared/public/assets")
queue! %(chmod g+rx,u+rwx "#{deploy_to}/shared/public/assets")
queue! %(mkdir -p "#{deploy_to}/shared/export/zonefiles") queue! %(mkdir -p "#{deploy_to}/shared/export/zonefiles")
queue! %(chmod g+rx,u+rwx "#{deploy_to}/shared/export/zonefiles") queue! %(chmod g+rx,u+rwx "#{deploy_to}/shared/export/zonefiles")
@ -219,6 +223,7 @@ task deploy: :environment do
invoke :'deploy:link_shared_paths' invoke :'deploy:link_shared_paths'
invoke :'bundle:install' invoke :'bundle:install'
invoke :'rails:db_migrate' invoke :'rails:db_migrate'
invoke :'rails:assets_precompile'
to :launch do to :launch do
invoke :restart invoke :restart
invoke :'deploy:cleanup' invoke :'deploy:cleanup'

View file

@ -30,7 +30,7 @@ Rails.application.configure do
config.assets.compile = false config.assets.compile = false
# Generate digests for assets URLs. # Generate digests for assets URLs.
config.assets.digest = false config.assets.digest = true
# Version of your assets, change this if you want to expire all your assets. # Version of your assets, change this if you want to expire all your assets.
config.assets.version = '1.0' config.assets.version = '1.0'
@ -70,7 +70,7 @@ Rails.application.configure do
config.i18n.fallbacks = true config.i18n.fallbacks = true
# Send deprecation notices to registered listeners. # Send deprecation notices to registered listeners.
config.active_support.deprecation = :notify config.active_support.deprecation = :log
# Disable automatic flushing of the log to improve performance. # Disable automatic flushing of the log to improve performance.
# config.autoflush_log = false # config.autoflush_log = false

View file

@ -30,7 +30,7 @@ Rails.application.configure do
config.assets.compile = false config.assets.compile = false
# Generate digests for assets URLs. # Generate digests for assets URLs.
config.assets.digest = false config.assets.digest = true
# Version of your assets, change this if you want to expire all your assets. # Version of your assets, change this if you want to expire all your assets.
config.assets.version = '1.0' config.assets.version = '1.0'
@ -43,7 +43,7 @@ Rails.application.configure do
# config.force_ssl = true # config.force_ssl = true
# Set to :debug to see everything in the log. # Set to :debug to see everything in the log.
config.log_level = :info config.log_level = :debug
# Prepend all log lines with the following tags. # Prepend all log lines with the following tags.
config.log_tags = [:subdomain, :uuid, :remote_ip] config.log_tags = [:subdomain, :uuid, :remote_ip]
@ -70,7 +70,7 @@ Rails.application.configure do
config.i18n.fallbacks = true config.i18n.fallbacks = true
# Send deprecation notices to registered listeners. # Send deprecation notices to registered listeners.
config.active_support.deprecation = :notify config.active_support.deprecation = :log
# Disable automatic flushing of the log to improve performance. # Disable automatic flushing of the log to improve performance.
# config.autoflush_log = false # config.autoflush_log = false

View file

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

View file

@ -28,8 +28,13 @@ if con.present? && con.table_exists?('settings')
Setting.save_default(:client_side_status_editing_enabled, false) Setting.save_default(:client_side_status_editing_enabled, false)
Setting.save_default(:days_to_keep_business_registry_cache, 2)
Setting.save_default(:invoice_number_min, 131050) Setting.save_default(:invoice_number_min, 131050)
Setting.save_default(:invoice_number_max, 149999) Setting.save_default(:invoice_number_max, 149999)
Setting.save_default(:directo_monthly_number_min, 309901)
Setting.save_default(:directo_monthly_number_max, 309999)
Setting.save_default(:directo_monthly_number_last, 309901)
Setting.save_default(:days_to_keep_invoices_active, 30) Setting.save_default(:days_to_keep_invoices_active, 30)
Setting.save_default(:days_to_keep_overdue_invoices_active, 30) Setting.save_default(:days_to_keep_overdue_invoices_active, 30)
Setting.save_default(:minimum_deposit, 0.0) Setting.save_default(:minimum_deposit, 0.0)

View file

@ -77,6 +77,7 @@ en:
registrant: registrant:
blank: 'Registrant is missing' blank: 'Registrant is missing'
not_found: 'Registrant not found' not_found: 'Registrant not found'
cannot_be_missing: 'Parameter value policy error: registrant cannot be missing'
domain_contacts: domain_contacts:
invalid: 'Contacts are invalid' invalid: 'Contacts are invalid'
not_found: 'Contact was not found' not_found: 'Contact was not found'
@ -206,6 +207,10 @@ en:
blank: 'Algorithm is missing' blank: 'Algorithm is missing'
auth_info_pw: auth_info_pw:
blank: 'Password is missing' blank: 'Password is missing'
legal_document:
attributes:
body:
length: 'Parameter value policy error: legalDocument size should be more than 3kB'
attributes: attributes:
@ -355,6 +360,7 @@ en:
contact: 'Contact' contact: 'Contact'
credit_balance: 'Credit balance' credit_balance: 'Credit balance'
starting_balance: 'Starting balance' starting_balance: 'Starting balance'
destroyed: 'Destroyed'
domain_transfer_requested: 'Domain transfer requested!' domain_transfer_requested: 'Domain transfer requested!'
domain_transfer_approved: 'Domain transfer approved!' domain_transfer_approved: 'Domain transfer approved!'
@ -537,6 +543,7 @@ en:
switch_to: Switch to switch_to: Switch to
admin_menu: Admin admin_menu: Admin
domain_transfer_was_approved: 'Domain transfer was approved, associated contacts were: %{contacts} and registrant was %{registrant}' domain_transfer_was_approved: 'Domain transfer was approved, associated contacts were: %{contacts} and registrant was %{registrant}'
business_registry_service_not_available: "Business Registry service Ärireg is not available"
# DEPP # DEPP
activemodel: activemodel:
@ -931,3 +938,11 @@ en:
if_auth_info_is_left_empty_it_will_be_auto_generated: 'If auth info is left empty, it will be auto generated.' if_auth_info_is_left_empty_it_will_be_auto_generated: 'If auth info is left empty, it will be auto generated.'
each_domain_name_must_end_with_colon_sign: 'Each domain name must end with colon (:) sign.' each_domain_name_must_end_with_colon_sign: 'Each domain name must end with colon (:) sign.'
expiration_remind_subject: 'The %{name} domain has expired' expiration_remind_subject: 'The %{name} domain has expired'
personal_domain_verification_url: 'Personal domain verification url'
available_verification_url_not_found: 'Available verification url not found, for domain.'
contact_already_associated_with_the_domain: 'Object association prohibits operation, contact already associated with the domain'
add_reserved_domain: 'Add domain to reserved list'
add_blocked_domain: 'Add domain to blocked list'
edit_pw: 'Edit Pw'
optional: 'Optional'
test_registrar: "Test registrar"

View file

@ -103,6 +103,17 @@ Rails.application.routes.draw do
namespace :registrant do namespace :registrant do
root 'domains#index' root 'domains#index'
resources :domains do
collection do
get :download_list
end
member do
get 'domain_verification_url'
end
end
# resources :invoices do # resources :invoices do
# member do # member do
# get 'download_pdf' # get 'download_pdf'
@ -141,24 +152,18 @@ Rails.application.routes.draw do
end end
end end
resources :whois resources :registrars do
# resources :contacts do resources :api_users
# member do resources :white_ips
# get 'delete' collection do
# end get :search
# collection do
# get 'check'
# end
# end
# resource :poll do
# collection do
# post 'confirm_keyrelay'
# post 'confirm_transfer'
# end
# end
end end
end
resources :contacts
resources :whois
end
# ADMIN ROUTES # ADMIN ROUTES
namespace :admin do namespace :admin do
@ -204,8 +209,16 @@ Rails.application.routes.draw do
resources :settings resources :settings
resources :blocked_domains resources :blocked_domains do
resources :reserved_domains member do
get 'delete'
end
end
resources :reserved_domains do
member do
get 'delete'
end
end
resources :registrars do resources :registrars do
resources :api_users resources :api_users

View file

@ -31,7 +31,7 @@ if @cron_group == 'registry'
# end # end
every :day, at: '12:20am' do every :day, at: '12:20am' do
runner 'Domain.clean_expired_pendings' runner 'DomainCron.clean_expired_pendings'
end end
every 3.hours do every 3.hours do
@ -39,19 +39,19 @@ if @cron_group == 'registry'
end end
every 42.minutes do every 42.minutes do
runner 'Domain.destroy_delete_candidates' runner 'DomainCron.destroy_delete_candidates'
end end
every 45.minutes do every 45.minutes do
runner 'Domain.start_expire_period' runner 'DomainCron.start_expire_period'
end end
every 50.minutes do every 50.minutes do
runner 'Domain.start_delete_period' runner 'DomainCron.start_delete_period'
end end
every 52.minutes do every 52.minutes do
runner 'Domain.start_redemption_grace_period' runner 'DomainCron.start_redemption_grace_period'
end end
every :day, at: '19:00pm' do every :day, at: '19:00pm' do

View file

@ -0,0 +1,13 @@
class CreateBusinessRegistryCaches < ActiveRecord::Migration
def change
create_table :business_registry_caches do |t|
t.string :ident
t.string :ident_country_code
t.datetime :retrieved_on
t.string :associated_businesses, array: true
t.timestamps null: false
end
add_index :business_registry_caches, :ident
end
end

View file

@ -0,0 +1,5 @@
class IndexDomainStatuses < ActiveRecord::Migration
def change
add_index :domains, :statuses, using: :gin
end
end

Some files were not shown because too many files have changed in this diff Show more