Merge branch 'alpha' into staging

This commit is contained in:
Priit Tark 2015-06-19 14:45:56 +03:00
commit 1cd0767191
345 changed files with 19170 additions and 3258 deletions

View file

@ -8,6 +8,7 @@ AllCops:
- 'db/whois_schema.rb'
- 'db/api_log_schema.rb'
- 'db/migrate/*'
- 'db/data/*'
# epp support files until 'complexity issues' will be solved
- 'spec/support/epp.rb'
- 'spec/support/epp_contact_xml_builder.rb'

View file

@ -1,3 +1,20 @@
16.06.2015
* Application time_zone should be defined at application.yml, updated application-exaple.yml
15.06.2015
* Apache config update: now only TLSv1.2 allowed with whitelisted chipers, please review all SSL config parameters
08.06.2015
* Add sk service name to application.yml
* Renew zonefile procedure
02.06.2015
* Added possibility to overwrite legal document types at application.yml level.
01.06.2015
* Added separate data update, all data migration locate at db/data, more info 'rake -T data'
@ -8,6 +25,11 @@
26.05.2015
* Added separate data update, all data migration locate at db/data, more info 'rake -T data'
29.05.2015
* Removed old 'iptables_counter_update_command' and added 'iptables_counter_enabled'
* Updated deploy script, now staging comes from staging branch
25.05.2015

12
Gemfile
View file

@ -38,6 +38,7 @@ gem 'nprogress-rails', '~> 0.1.6.7' # visual loader
gem 'html5_validators', '~> 1.2.0' # model requements now automatically on html form
gem 'coderay', '~> 1.1.0' # xml console visualize
gem 'select2-rails', '~> 3.5.9.3' # for autocomplete
gem 'bootstrap-datepicker-rails', '~> 1.3.1.1' # datepicker
# rights
gem 'devise', '~> 3.4.1' # authenitcation
@ -50,10 +51,11 @@ gem 'jbuilder', '~> 2.2.6' # json api
# registry specfic
gem 'simpleidn', '~> 0.0.5' # For punycode
gem 'isikukood' # for EE-id validation
gem 'money-rails', '~> 1.4.1'
# deploy
gem 'whenever', '~> 0.9.4', require: false
gem 'data_migrate',
gem 'data_migrate',
github: 'gitlabeu/data_migrate',
ref: '35d22b09ff37a4e9d61ab326ad5d8eb0edf1fc81'
@ -70,10 +72,14 @@ gem 'deep_cloneable', '~> 2.1.1'
gem 'digidoc_client', '~> 0.2.1'
# epp
gem 'epp', '~> 1.4.2', github: 'gitlabeu/epp'
gem 'epp-xml', '~> 0.10.4' # EPP XMLs
gem 'epp', '~> 1.4.2', github: 'internetee/epp'
gem 'epp-xml', '~> 1.0.3' # EIS EPP XMLs
gem 'uuidtools', '~> 2.1.4' # For unique IDs (used by the epp gem)
# que
gem 'que', '~> 0.10.0'
gem 'que-web', '~> 0.4.0'
# for importing legacy db
gem 'activerecord-import', '~> 0.7.0' # for inserting dummy data

View file

@ -16,14 +16,6 @@ GIT
data_migrate (1.3.0)
rails (>= 4.1.0)
GIT
remote: git://github.com/gitlabeu/epp.git
revision: 505c3f2739eb1da918e54111aecfb138a822739d
specs:
epp (1.4.2)
hpricot
libxml-ruby
GIT
remote: git://github.com/haml/html2haml.git
revision: 6984f50bdbbd6291535027726a5697f28778ee8d
@ -35,6 +27,14 @@ GIT
nokogiri (~> 1.6.0)
ruby_parser (~> 3.5)
GIT
remote: git://github.com/internetee/epp.git
revision: 505c3f2739eb1da918e54111aecfb138a822739d
specs:
epp (1.4.2)
hpricot
libxml-ruby
GEM
remote: https://rubygems.org/
specs:
@ -76,18 +76,18 @@ GEM
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
addressable (2.3.8)
akami (1.3.0)
akami (1.3.1)
gyoku (>= 0.4.0)
nokogiri
arel (6.0.0)
ast (2.0.0)
astrolabe (1.3.0)
parser (>= 2.2.0.pre.3, < 3.0)
autodoc (0.4.4)
autodoc (0.5.0)
actionpack
activesupport (>= 3.0.0)
rspec
autoprefixer-rails (5.1.11)
autoprefixer-rails (5.2.0.1)
execjs
json
axiom-types (0.1.1)
@ -101,6 +101,8 @@ GEM
rack (>= 0.9.0)
binding_of_caller (0.7.2)
debug_inspector (>= 0.0.1)
bootstrap-datepicker-rails (1.3.1.1)
railties (>= 3.0)
bootstrap-sass (3.3.4.1)
autoprefixer-rails (>= 5.0.0.1)
sass (>= 3.2.19)
@ -116,9 +118,9 @@ GEM
slim (>= 1.3.6, < 3.0)
terminal-table (~> 1.4)
builder (3.2.2)
bullet (4.14.4)
bullet (4.14.7)
activesupport (>= 3.0.0)
uniform_notifier (>= 1.6.0)
uniform_notifier (~> 1.9.0)
bundler-audit (0.3.1)
bundler (~> 1.2)
thor (~> 0.18)
@ -142,7 +144,7 @@ GEM
coffee-script (2.4.1)
coffee-script-source
execjs
coffee-script-source (1.9.1)
coffee-script-source (1.9.1.1)
countries (0.10.0)
currencies (~> 0.4.2)
crack (0.4.2)
@ -169,18 +171,18 @@ GEM
nokogiri (>= 1.4.0)
savon (>= 2.4.0)
docile (1.1.5)
epp-xml (0.10.4)
epp-xml (1.0.3)
activesupport (~> 4.1)
builder (~> 3.2)
equalizer (0.0.11)
erubis (2.7.0)
execjs (2.5.0)
execjs (2.5.2)
fabrication (2.12.2)
faker (1.3.0)
i18n (~> 0.5)
fastercsv (1.5.5)
ffi (1.9.8)
figaro (1.1.0)
figaro (1.1.1)
thor (~> 0.14)
flay (2.4.0)
ruby_parser (~> 3.0)
@ -189,7 +191,7 @@ GEM
ruby_parser (~> 3.1, > 3.1.0)
sexp_processor (~> 4.4)
formatador (0.2.5)
globalid (0.3.3)
globalid (0.3.5)
activesupport (>= 4.1.0)
grape (0.10.1)
activesupport
@ -225,34 +227,33 @@ GEM
haml (>= 4.0.6, < 5.0)
html2haml (>= 1.0.1)
railties (>= 4.0.1)
hashie (3.4.1)
hashie (3.4.2)
hashie-forbidden_attributes (0.1.1)
hashie (>= 3.0)
highline (1.6.21)
hike (1.2.3)
hitimes (1.2.2)
hpricot (0.8.6)
html5_validators (1.2.0)
httpclient (2.6.0.1)
httpi (2.4.0)
httpi (2.4.1)
rack
i18n (0.7.0)
ice_nine (0.11.1)
isikukood (0.1.2)
iso8601 (0.8.5)
jbuilder (2.2.12)
iso8601 (0.8.6)
jbuilder (2.2.16)
activesupport (>= 3.0.0, < 5)
multi_json (~> 1.2)
jquery-rails (4.0.3)
jquery-rails (4.0.4)
rails-dom-testing (~> 1.0)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
jquery-ui-rails (5.0.3)
jquery-ui-rails (5.0.5)
railties (>= 3.2.16)
jquery-validation-rails (1.13.1)
railties (>= 3.2, < 5.0)
thor (~> 0.14)
json (1.8.2)
json (1.8.3)
kaminari (0.16.3)
actionpack (>= 3.0.0)
activesupport (>= 3.0.0)
@ -261,37 +262,44 @@ GEM
addressable (~> 2.3)
libv8 (3.16.14.7)
libxml-ruby (2.8.0)
listen (2.10.0)
listen (2.10.1)
celluloid (~> 0.16.0)
rb-fsevent (>= 0.9.3)
rb-inotify (>= 0.9)
loofah (2.0.1)
loofah (2.0.2)
nokogiri (>= 1.5.9)
lumberjack (1.0.9)
macaddr (1.7.1)
systemu (~> 2.6.2)
mail (2.6.3)
mime-types (>= 1.16, < 3)
method_source (0.8.2)
mime-types (2.4.3)
mime-types (2.6.1)
mina (0.3.4)
open4 (~> 1.3.4)
rake
mini_portile (0.6.2)
minitest (5.5.1)
multi_json (1.11.0)
minitest (5.7.0)
monetize (1.1.0)
money (~> 6.5.0)
money (6.5.1)
i18n (>= 0.6.4, <= 0.7.0)
money-rails (1.4.1)
activesupport (>= 3.0)
monetize (~> 1.1.0)
money (~> 6.5.0)
railties (>= 3.0)
multi_json (1.11.1)
multi_xml (0.5.5)
newrelic_rpm (3.9.9.275)
nokogiri (1.6.6.2)
mini_portile (~> 0.6.0)
nori (2.5.0)
nori (2.6.0)
nprogress-rails (0.1.6.7)
open4 (1.3.4)
orm_adapter (0.5.0)
parser (2.2.0.3)
parser (2.3.0.pre.2)
ast (>= 1.1, < 3.0)
pdfkit (0.6.2)
pg (0.18.1)
pg (0.18.2)
phantomjs (1.9.7.1)
phantomjs-binaries (1.9.2.4)
sys-uname (= 0.9.0)
@ -307,11 +315,18 @@ GEM
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
rack (1.6.0)
que (0.10.0)
que-web (0.4.0)
erubis
que (~> 0.8)
sinatra
rack (1.6.4)
rack-accept (0.4.5)
rack (>= 0.4)
rack-mount (0.8.3)
rack (>= 1.0.0)
rack-protection (1.5.3)
rack
rack-test (0.6.3)
rack (>= 1.0)
railroady (1.3.0)
@ -350,7 +365,7 @@ GEM
activesupport (>= 3.0)
i18n
polyamorous (~> 1.1)
rb-fsevent (0.9.4)
rb-fsevent (0.9.5)
rb-inotify (0.9.5)
ffi (>= 0.5.0)
rdoc (4.2.0)
@ -390,7 +405,7 @@ GEM
rainbow (>= 1.99.1, < 3.0)
ruby-progressbar (~> 1.4)
ruby-progressbar (1.7.5)
ruby2ruby (2.1.3)
ruby2ruby (2.1.4)
ruby_parser (~> 3.1)
sexp_processor (~> 4.0)
ruby_parser (3.5.0)
@ -403,21 +418,20 @@ GEM
ruby2ruby (>= 2.1.1, < 3.0)
virtus (~> 1.0)
safe_yaml (1.0.4)
sass (3.4.13)
sass (3.4.14)
sass-rails (5.0.3)
railties (>= 4.0.0, < 5.0)
sass (~> 3.1)
sprockets (>= 2.8, < 4.0)
sprockets-rails (>= 2.0, < 4.0)
tilt (~> 1.1)
savon (2.11.0)
savon (2.11.1)
akami (~> 1.2)
builder (>= 2.1.2)
gyoku (~> 1.2)
httpi (~> 2.3)
nokogiri (>= 1.4.0)
nori (~> 2.4)
uuid (~> 2.3.7)
wasabi (~> 3.4)
sdoc (0.4.1)
json (~> 1.7, >= 1.7.7)
@ -425,7 +439,7 @@ GEM
select2-rails (3.5.9.3)
thor (~> 0.14)
selectize-rails (0.12.1)
sexp_processor (4.5.0)
sexp_processor (4.6.0)
shoulda-matchers (2.6.2)
activesupport (>= 3.0.0)
simplecov (0.9.2)
@ -434,25 +448,25 @@ GEM
simplecov-html (~> 0.9.0)
simplecov-html (0.9.0)
simpleidn (0.0.5)
sinatra (1.4.6)
rack (~> 1.4)
rack-protection (~> 1.4)
tilt (>= 1.3, < 3)
slim (2.1.0)
temple (~> 0.6.9)
tilt (>= 1.3.3, < 2.1)
slop (3.6.0)
spring (1.3.4)
spring (1.3.6)
spring-commands-rspec (1.0.4)
spring (>= 0.9.1)
sprockets (2.12.3)
hike (~> 1.2)
multi_json (~> 1.0)
sprockets (3.2.0)
rack (~> 1.0)
tilt (~> 1.1, != 1.3.0)
sprockets-rails (2.2.4)
sprockets-rails (2.3.1)
actionpack (>= 3.0)
activesupport (>= 3.0)
sprockets (>= 2.8, < 4.0)
sys-uname (0.9.0)
ffi (>= 1.0.0)
systemu (2.6.5)
temple (0.6.10)
terminal-table (1.4.5)
therubyracer (0.12.2)
@ -472,13 +486,11 @@ GEM
uglifier (2.7.1)
execjs (>= 0.3.0)
json (>= 1.8.0)
unicorn (4.8.3)
unicorn (4.9.0)
kgio (~> 2.6)
rack
raindrops (~> 0.7)
uniform_notifier (1.8.0)
uuid (2.3.7)
macaddr (~> 1.0)
uniform_notifier (1.9.0)
uuidtools (2.1.5)
virtus (1.0.5)
axiom-types (~> 0.1)
@ -506,6 +518,7 @@ DEPENDENCIES
autodoc
better_errors (~> 2.0.0)
binding_of_caller (~> 0.7.2)
bootstrap-datepicker-rails (~> 1.3.1.1)
bootstrap-sass (~> 3.3.4.1)
brakeman (~> 2.6.2)
bullet (~> 4.14.4)
@ -521,7 +534,7 @@ DEPENDENCIES
devise (~> 3.4.1)
digidoc_client (~> 0.2.1)
epp (~> 1.4.2)!
epp-xml (~> 0.10.4)
epp-xml (~> 1.0.3)
fabrication (~> 2.12.2)
faker (~> 1.3.0)
figaro (~> 1.1.0)
@ -543,6 +556,7 @@ DEPENDENCIES
kaminari (~> 0.16.3)
launchy (~> 2.4.3)
mina (~> 0.3.1)
money-rails (~> 1.4.1)
newrelic_rpm (~> 3.9.9.275)
nokogiri (~> 1.6.6.2)
nprogress-rails (~> 0.1.6.7)
@ -553,6 +567,8 @@ DEPENDENCIES
phantomjs-binaries (~> 1.9.2.4)
poltergeist (~> 1.5.1)
pry (~> 0.10.1)
que (~> 0.10.0)
que-web (~> 0.4.0)
railroady (~> 1.3.0)
rails (= 4.2.1)
rails-settings-cached (~> 0.4.1)

View file

@ -97,9 +97,10 @@ For Apache, registry admin goes to port 443 in production, /etc/apache2/sites-en
SSLCertificateChainFile /etc/ssl/certs/your-chain-fail.pem
SSLCACertificateFile /etc/ssl/certs/ca.pem
SSLProtocol TLSv1
SSLProtocol -all +TLSv1.2
SSLHonorCipherOrder On
SSLCipherSuite RC4-SHA:HIGH:!ADH
SSLCompression off
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
RewriteEnginriteEngine on
RedirectMatch ^/$ /admin
@ -157,9 +158,10 @@ Registrar configuration (/etc/apache2/sites-enabled/registrar.conf) is as follow
SSLCertificateChainFile /etc/ssl/certs/your-chain-fail.pem
SSLCACertificateFile /etc/ssl/certs/ca.pem
SSLProtocol TLSv1
SSLProtocol -all +TLSv1.2
SSLHonorCipherOrder On
SSLCipherSuite RC4-SHA:HIGH:!ADH
SSLCompression off
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
RewriteEngine on
RedirectMatch ^/$ /registrar
@ -240,9 +242,10 @@ Registrant configuration (/etc/apache2/sites-enabled/registrant.conf) is as foll
SSLCertificateChainFile /etc/ssl/certs/your-chain-fail.pem
SSLCACertificateFile /etc/ssl/certs/ca.pem
SSLProtocol TLSv1
SSLProtocol -all +TLSv1.2
SSLHonorCipherOrder On
SSLCipherSuite RC4-SHA:HIGH:!ADH
SSLCompression off
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
RewriteEngine on
RedirectMatch ^/$ /registrant

View file

@ -2,8 +2,6 @@
#= require jquery_ujs
#= require turbolinks
#= require bootstrap-sprockets
#= require nprogress
#= require nprogress-turbolinks
#= require typeahead.bundle.min
#= require admin/autocomplete
#= require jquery.nested_attributes
@ -12,6 +10,3 @@
#= require jquery-ui/datepicker
#= require shared/general
#= require admin/application
NProgress.configure
showSpinner: false

View file

@ -1,12 +1,16 @@
ready = ->
$(document).on 'page:change', ->
$('.selectize').selectize({
allowEmptyOption: true
});
})
$('.js-datepicker').datepicker({
showAnim: "",
autoclose: true,
dateFormat: "dd.mm.yy",
changeMonth: true,
changeYear: true
})
# client side validate all forms
$('form').each ->
$(this).validate()
$(document).ready(ready)
$(document).on('page:load', ready)

View file

@ -1,4 +1,4 @@
$(document).on 'ready page:load', ->
$(document).on 'page:change', ->
# client side validate all forms
$('form').each ->
$(this).validate()

View file

@ -1,3 +1,9 @@
#= require nprogress
#= require nprogress-turbolinks
NProgress.configure
showSpinner: false
@flash_notice = (msg) ->
$('#flash').find('div').removeClass('bg-danger')
$('#flash').find('div').addClass('bg-success')
@ -10,7 +16,7 @@
$('#flash').find('div').html(msg)
$('#flash').show()
$(document).on 'ready page:load', ->
$(document).on 'page:change', ->
today = new Date()
tomorrow = new Date(today)
tomorrow.setDate(today.getDate() + 1)
@ -20,7 +26,8 @@ $(document).on 'ready page:load', ->
maxDate: tomorrow
)
$('.js-combobox').select2
width: "100%"
selectOnBlur: true
dropdownAutoWidth: if self==top then true else false
if $('.js-combobox').length
$('.js-combobox').select2
width: "100%"
selectOnBlur: true
dropdownAutoWidth: if self==top then true else false

View file

@ -1,5 +1,6 @@
//= require 'shared/general-manifest'
//= require 'admin/admin-bootstrap'
//= require 'jquery-ui/datepicker'
@import shared/fonts
@import shared/general
@import nprogress
@ -7,4 +8,5 @@
@import typeaheadjs
@import selectize
@import selectize.bootstrap3
// @import bootstrap-datepicker3
@import admin/admin

View file

@ -65,3 +65,6 @@
.required:after
content: "*"
margin: 0 0 0 1px
.not-required:after
content: ''

View file

@ -57,3 +57,8 @@ body > .container
.text-grey
color: grey
.partially-hidden
border: 1px solid #dddddd
padding-left: 4px
padding-right: 4px

View file

@ -11,6 +11,10 @@ class Admin::AdminUsersController < AdminController
@admin_user = AdminUser.new
end
def show; end
def edit; end
def create
@admin_user = AdminUser.new(admin_user_params)
@ -23,12 +27,11 @@ class Admin::AdminUsersController < AdminController
end
end
def show; end
def edit; end
def update
if @admin_user.update(admin_user_params)
params[:admin_user].delete(:password) if params[:admin_user][:password].blank?
params[:admin_user].delete(:password_confirmation) if params[:admin_user][:password_confirmation].blank?
if @admin_user.update_attributes(admin_user_params)
flash[:notice] = I18n.t('record_updated')
redirect_to [:admin, @admin_user]
else
@ -54,6 +57,7 @@ class Admin::AdminUsersController < AdminController
end
def admin_user_params
params.require(:admin_user).permit(:username, :password, :identity_code, :email, :country_code, { roles: [] })
params.require(:admin_user).permit(:username,
:password, :password_confirmation, :identity_code, :email, :country_code, { roles: [] })
end
end

View file

@ -29,6 +29,7 @@ class Admin::ApiUsersController < AdminController
def edit; end
def update
params[:api_user].delete(:password) if params[:api_user][:password].blank?
if @api_user.update(api_user_params)
flash[:notice] = I18n.t('record_updated')
redirect_to [:admin, @api_user]

View file

@ -16,18 +16,36 @@ class Admin::DomainsController < AdminController
end
def update
add_prefix_to_statuses
dp = ignore_empty_statuses
if @domain.update(domain_params)
if @domain.update(dp)
flash[:notice] = I18n.t('domain_updated')
redirect_to [:admin, @domain]
else
@domain.domain_statuses.build if @domain.domain_statuses.empty?
build_associations
flash.now[:alert] = I18n.t('failed_to_update_domain')
render 'edit'
end
end
def set_force_delete
if @domain.set_force_delete
flash[:notice] = I18n.t('domain_updated')
else
flash.now[:alert] = I18n.t('failed_to_update_domain')
end
redirect_to [:admin, @domain]
end
def unset_force_delete
if @domain.unset_force_delete
flash[:notice] = I18n.t('domain_updated')
else
flash.now[:alert] = I18n.t('failed_to_update_domain')
end
redirect_to [:admin, @domain]
end
private
def set_domain
@ -35,21 +53,23 @@ class Admin::DomainsController < AdminController
end
def domain_params
params.require(:domain).permit(
domain_statuses_attributes: [:id, :value, :description, :_destroy]
)
if params[:domain]
params.require(:domain).permit({ statuses: [] })
else
{ statuses: [] }
end
end
def build_associations
@domain.domain_statuses.build if @domain.domain_statuses.empty?
@server_statuses = @domain.domain_statuses.select(&:server_status?)
@server_statuses << @domain.domain_statuses.build if @server_statuses.empty?
@server_statuses = @domain.statuses.select { |x| DomainStatus::SERVER_STATUSES.include?(x) }
@server_statuses = [nil] if @server_statuses.empty?
@other_statuses = @domain.statuses.select { |x| !DomainStatus::SERVER_STATUSES.include?(x) }
end
def add_prefix_to_statuses
domain_params[:domain_statuses_attributes].each do |_k, hash|
hash[:value] = hash[:value].prepend('server') if hash[:value].present?
end
def ignore_empty_statuses
dp = domain_params
dp[:statuses].reject!(&:blank?)
dp
end
end

View file

@ -0,0 +1,45 @@
class Admin::PricelistsController < AdminController
load_and_authorize_resource
before_action :set_pricelist, only: [:show, :edit, :update]
def index
@q = Pricelist.search(params[:q])
@pricelists = @q.result.page(params[:page])
end
def new
@pricelist = Pricelist.new
end
def edit
end
def create
@pricelist = Pricelist.new(pricelist_params)
if @pricelist.save
redirect_to admin_pricelists_url
else
render 'new'
end
end
def update
if @pricelist.update_attributes(pricelist_params)
redirect_to admin_pricelists_url
else
render 'edit'
end
end
private
def set_pricelist
@pricelist = Pricelist.find(params[:id])
end
def pricelist_params
params.require(:pricelist).permit(:operation_category, :category, :price_category,
:duration, :price, :valid_from, :valid_to)
end
end

View file

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

View file

@ -56,7 +56,7 @@ class Epp::DomainsController < EppController
@domain.attach_legal_document(Epp::Domain.parse_legal_document_from_frame(params[:parsed_frame]))
@domain.save(validate: false)
if @domain.epp_destroy(params[:parsed_frame])
if @domain.epp_destroy(params[:parsed_frame], current_user.id)
if @domain.epp_pending_delete.present?
render_epp_response '/epp/domains/success_pending'
else
@ -77,7 +77,7 @@ class Epp::DomainsController < EppController
end
def renew
authorize! :renew, Epp::Domain
authorize! :renew, @domain
handle_errors(@domain) and return unless @domain.renew(
params[:parsed_frame].css('curExpDate').text,

View file

@ -1,9 +1,11 @@
class EppController < ApplicationController
include Iptable
layout false
protect_from_forgery with: :null_session
skip_before_action :verify_authenticity_token
before_action :generate_svtrid
before_action :latin_only
before_action :validate_request
before_action :update_epp_session
helper_method :current_user
@ -92,6 +94,10 @@ class EppController < ApplicationController
@errors.uniq!
# Requested by client, ticket #2688
# Known issues: error request is exactly 1 second slower and server can handle less load
sleep 1 if !Rails.env.test? || !Rails.env.development?
render_epp_response '/epp/error'
end
@ -101,6 +107,14 @@ class EppController < ApplicationController
write_to_epp_log
end
# VALIDATION
def latin_only
return true if params['frame'].blank?
return true if params['frame'].match(/\A[\p{Latin}\p{Z}\p{P}\p{S}\p{Cc}\p{Cf}\w_\'\+\-\.\(\)\/]*\Z/i)
render_epp_response '/epp/latin_error'
false
end
# VALIDATION
def validate_request
validation_method = "validate_#{params[:action]}"
@ -285,6 +299,8 @@ class EppController < ApplicationController
# rubocop: enable Metrics/CyclomaticComplexity
def iptables_counter_update
`ENV['iptables_counter_update_command']` if ENV['iptables_counter_update_command'].present?
return if ENV['iptables_counter_enabled'].blank? && ENV['iptables_counter_enabled'] != 'true'
return if current_user.blank?
counter_update(current_user.registrar_code, request.remote_ip)
end
end

View file

@ -1,12 +1,43 @@
class Registrant::DomainDeleteConfirmsController < RegistrantController
skip_before_action :authenticate_user!, only: [:show, :create]
skip_authorization_check only: [:show, :create]
skip_before_action :authenticate_user!, only: [:show, :update]
skip_authorization_check only: [:show, :update]
def show
return if params[:confirmed] || params[:rejected]
@domain = Domain.find(params[:id])
@domain = nil unless @domain.registrant_delete_confirmable?(params[:token])
end
def create
# # rubocop: disable Metrics/PerceivedComplexity
# # rubocop: disable Metrics/CyclomaticComplexity
def update
@domain = Domain.find(params[:id])
unless @domain.registrant_delete_confirmable?(params[:token])
flash[:alert] = t(:registrant_domain_verification_failed)
return render 'show'
end
@registrant_verification = RegistrantVerification.new(domain_id: @domain.id,
domain_name: @domain.name,
verification_token: params[:token])
if params[:rejected]
if @registrant_verification.domain_registrant_delete_reject!
flash[:notice] = t(:registrant_domain_verification_rejected)
redirect_to registrant_domain_delete_confirm_path(@domain.id, rejected: true)
else
flash[:alert] = t(:registrant_domain_verification_rejected_failed)
return render 'show'
end
elsif params[:confirmed]
if @registrant_verification.domain_registrant_delete_confirm!
flash[:notice] = t(:registrant_domain_verification_confirmed)
redirect_to registrant_domain_delete_confirm_path(@domain.id, confirmed: true)
else
flash[:alert] = t(:registrant_domain_verification_confirmed_failed)
return render 'show'
end
end
end
# rubocop: enable Metrics/PerceivedComplexity
# rubocop: enable Metrics/CyclomaticComplexity
end

View file

@ -20,7 +20,6 @@ class Registrant::DomainUpdateConfirmsController < RegistrantController
@registrant_verification = RegistrantVerification.new(domain_id: @domain.id,
domain_name: @domain.name,
verification_token: params[:token])
if params[:rejected]
if @registrant_verification.domain_registrant_change_reject!
flash[:notice] = t(:registrant_domain_verification_rejected)

View file

@ -27,9 +27,10 @@ class Registrant::SessionsController < Devise::SessionsController
@user = User.new
end
def mid
def mid # rubocop: disable Metrics/MethodLength
phone = params[:user][:phone]
client = Digidoc::Client.new
endpoint = "#{ENV['sk_digi_doc_service_endpoint']}"
client = Digidoc::Client.new(endpoint)
if Rails.env.test? && phone == "123"
@user = ApiUser.find_by(identity_code: "14212128025")

View file

@ -6,6 +6,8 @@ class Registrar::InvoicesController < RegistrarController
def index
params[:q] ||= {}
invoices = current_user.registrar.invoices.includes(:invoice_items, :account_activity)
params[:q][:sum_cache_gteq].gsub!(',', '.')
params[:q][:sum_cache_lteq].gsub!(',', '.')
@q = invoices.search(params[:q])
@q.sorts = 'id desc' if @q.sorts.empty?
@invoices = @q.result.page(params[:page])

View file

@ -0,0 +1,16 @@
class DomainDeleteConfirmJob < Que::Job
def run(domain_id, action)
# it's recommended to keep transaction against job table as short as possible.
ActiveRecord::Base.transaction do
domain = Epp::Domain.find(domain_id)
case action
when RegistrantVerification::CONFIRMED
domain.apply_pending_delete!
domain.clean_pendings!
when RegistrantVerification::REJECTED
domain.clean_pendings!
end
destroy # it's best to destroy the job in the same transaction
end
end
end

View file

@ -0,0 +1,16 @@
class DomainUpdateConfirmJob < Que::Job
def run(domain_id, action)
# it's recommended to keep transaction against job table as short as possible.
ActiveRecord::Base.transaction do
domain = Epp::Domain.find(domain_id)
case action
when RegistrantVerification::CONFIRMED
domain.apply_pending_update!
domain.clean_pendings!
when RegistrantVerification::REJECTED
domain.clean_pendings!
end
destroy # it's best to destroy the job in the same transaction
end
end
end

View file

@ -1,4 +1,5 @@
class ContactMailer < ApplicationMailer
# rubocop: disable Metrics/CyclomaticComplexity
def email_updated(contact)
unless Rails.env.production?
return unless TEST_EMAILS.include?(contact.email) || TEST_EMAILS.include?(contact.email_was)
@ -8,7 +9,15 @@ class ContactMailer < ApplicationMailer
return if contact.deliver_emails != true
@contact = contact
mail(to: [@contact.email, @contact.email_was],
subject: "#{I18n.t(:contact_email_update_subject)} [#{@contact.code}]")
emails = []
emails << [@contact.email, @contact.email_was] if @contact.registrant_domains.present?
emails << @contact.domains.map(&:email) if @contact.domains.present?
emails = emails.uniq
emails.each do |email|
mail(to: email, subject: "#{I18n.t(:contact_email_update_subject)} [#{@contact.code}]")
end
end
# rubocop: enable Metrics/CyclomaticComplexity
end

View file

@ -28,7 +28,7 @@ class Ability
can(:info, Epp::Domain) { |d, pw| d.registrar_id == @user.registrar_id || pw.blank? ? true : d.auth_info == pw }
can(:check, Epp::Domain)
can(:create, Epp::Domain)
can(:renew, Epp::Domain)
can(:renew, Epp::Domain) { |d| d.registrar_id == @user.registrar_id }
can(:update, Epp::Domain) { |d, pw| d.registrar_id == @user.registrar_id || d.auth_info == pw }
can(:transfer, Epp::Domain) { |d, pw| d.auth_info == pw }
can(:view_password, Epp::Domain) { |d, pw| d.registrar_id == @user.registrar_id || d.auth_info == pw }
@ -107,6 +107,7 @@ class Ability
can :manage, Setting
can :manage, ZonefileSetting
can :manage, DomainVersion
can :manage, Pricelist
can :manage, User
can :manage, ApiUser
can :manage, AdminUser

View file

@ -1,9 +1,10 @@
class AdminUser < User
validates :username, :password, :country_code, :roles, presence: true
validates :username, :country_code, :roles, presence: true
validates :identity_code, uniqueness: true, allow_blank: true
validates :identity_code, presence: true, if: -> { country_code == 'EE' }
validates :email, presence: true
validates :email, presence: true
validates :password, :password_confirmation, presence: true, if: :new_record?
validates :password_confirmation, presence: true, if: :encrypted_password_changed?
validate :validate_identity_code, if: -> { country_code == 'EE' }
ROLES = %w(user customer_service admin) # should not match to api_users roles

View file

@ -11,13 +11,16 @@ class ApiUser < User
}
end
# TODO: should have max request limit per day
# TODO: should have max request limit per day?
belongs_to :registrar
has_many :certificates
validates :username, :password, :registrar, :roles, presence: true
validates :username, uniqueness: true
# TODO: probably cache, because it's requested on every EPP
delegate :code, to: :registrar, prefix: true
attr_accessor :registrar_typeahead
ROLES = %w(super epp billing) # should not match to admin roles

View file

@ -75,7 +75,7 @@ class BankTransaction < ActiveRecord::Base
create_account_activity(
account: registrar.cash_account,
invoice: invoice,
sum: sum,
sum: invoice.sum_without_vat,
currency: currency,
description: description
)

View file

@ -7,6 +7,7 @@ class Contact < ActiveRecord::Base
has_many :domains, through: :domain_contacts
has_many :statuses, class_name: 'ContactStatus', dependent: :destroy
has_many :legal_documents, as: :documentable
has_many :registrant_domains, class_name: 'Domain', foreign_key: 'registrant_id' # when contant is registrant
accepts_nested_attributes_for :legal_documents
@ -84,6 +85,10 @@ class Contact < ActiveRecord::Base
end
end
def roid
"EIS-#{id}"
end
def to_s
name || '[no name]'
end
@ -132,7 +137,7 @@ class Contact < ActiveRecord::Base
# custom code from client
# add prefix when needed
if code.present?
if code.present?
prefix, *custom_code = code.split(':')
code = custom_code.join(':') if prefix == registrar.code
end
@ -143,10 +148,10 @@ class Contact < ActiveRecord::Base
end
# rubocop:enable Metrics/CyclomaticComplexity
# used only for contact trasphere
# used only for contact transfer
def generate_new_code!
return nil if registrar.blank?
registrar.reload # for contact transfere
registrar.reload # for contact transfer
self[:code] = "#{registrar.code}:#{SecureRandom.hex(4)}".upcase
end
@ -181,7 +186,24 @@ class Contact < ActiveRecord::Base
if code
self.ident_country_code = code.alpha2
else
errors.add(:ident_country_code, 'is not following ISO_3166-1 alpha 2 format')
errors.add(:ident, :invalid_country_code)
end
end
def related_domain_descriptions
@desc = {}
registrant_domains.each do |dom|
@desc[dom.name] ||= []
@desc[dom.name] << :registrant
end
domain_contacts.each do |dc|
@desc[dc.domain.name] ||= []
@desc[dc.domain.name] << dc.name.downcase.to_sym
@desc[dc.domain.name] = @desc[dc.domain.name].compact
end
@desc
end
end

View file

@ -229,7 +229,12 @@ module Depp
end
def extension_xml
ident_xml.merge(legal_document_xml)
xml = { _anonymus: [] }
ident = ident_xml[:_anonymus].try(:first) unless persisted?
legal = legal_document_xml[:_anonymus].try(:first)
xml[:_anonymus] << ident if ident.present?
xml[:_anonymus] << legal if legal.present?
xml
end
def ident_xml

View file

@ -192,10 +192,10 @@ module Depp
end
def construct_edit_hash(domain_params, old_domain_params)
contacts = create_contacts_hash(domain_params) - create_contacts_hash(old_domain_params)
contacts = array_difference(create_contacts_hash(domain_params), create_contacts_hash(old_domain_params))
add_anon = contacts
contacts = create_contacts_hash(old_domain_params) - create_contacts_hash(domain_params)
contacts = array_difference(create_contacts_hash(old_domain_params), create_contacts_hash(domain_params))
rem_anon = contacts
if domain_params[:registrant] != old_domain_params[:registrant]
@ -284,6 +284,15 @@ module Depp
pubKey: { value: key_data_params['public_key'] }
}
end
def array_difference(x, y)
ret = x.dup
y.each do |element|
index = ret.index(element)
ret.delete_at(index) if index
end
ret
end
end
end
end

View file

@ -1,3 +1,4 @@
# rubocop: disable Metrics/ClassLength
class Domain < ActiveRecord::Base
include Versions # version/domain_version.rb
has_paper_trail class_name: "DomainVersion", meta: { children: :children_log }
@ -53,6 +54,11 @@ class Domain < ActiveRecord::Base
delegate :name, to: :registrar, prefix: true
delegate :street, to: :registrar, prefix: true
after_initialize :init_default_values
def init_default_values
self.pending_json = {} if pending_json.blank?
end
before_create :generate_auth_info
before_create :set_validity_dates
before_update :manage_statuses
@ -62,14 +68,18 @@ class Domain < ActiveRecord::Base
true
end
before_save :manage_automatic_statuses
before_save :touch_always_version
def touch_always_version
self.updated_at = Time.zone.now
end
after_save :manage_automatic_statuses
after_save :update_whois_record
after_initialize -> { self.statuses = [] if statuses.nil? }
validates :name_dirty, domain_name: true, uniqueness: true
validates :puny_label, length: { maximum: 63 }
validates :period, numericality: { only_integer: true }
validates :registrant, :registrar, presence: true
@ -117,7 +127,13 @@ class Domain < ActiveRecord::Base
validate :validate_nameserver_ips
attr_accessor :registrant_typeahead, :update_me, :deliver_emails,
validate :statuses_uniqueness
def statuses_uniqueness
return if statuses.uniq == statuses
errors.add(:statuses, :taken)
end
attr_accessor :registrant_typeahead, :update_me, :deliver_emails,
:epp_pending_update, :epp_pending_delete
def subordinate_nameservers
@ -145,6 +161,68 @@ class Domain < ActiveRecord::Base
{ admin_contacts: :registrar }
)
end
def start_expire_period
STDOUT << "#{Time.zone.now.utc} - Expiring domains\n" unless Rails.env.test?
d = Domain.where('valid_to <= ?', Time.zone.now)
d.each do |x|
next unless x.expirable?
x.statuses << DomainStatus::EXPIRED
# TODO: This should be managed by automatic_statuses
x.statuses.delete(DomainStatus::OK)
x.save(validate: false)
end
STDOUT << "#{Time.zone.now.utc} - Successfully expired #{d.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 |x|
next unless x.server_holdable?
x.statuses << DomainStatus::SERVER_HOLD
# TODO: This should be managed by automatic_statuses
x.statuses.delete(DomainStatus::OK)
x.save
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 |x|
x.statuses << DomainStatus::DELETE_CANDIDATE if x.delete_candidateable?
# TODO: This should be managed by automatic_statuses
x.statuses.delete(DomainStatus::OK)
x.save
end
return if Rails.env.test?
STDOUT << "#{Time.zone.now.utc} - Successfully set delete_candidate to #{d.count} domains\n"
end
def destroy_delete_candidates
STDOUT << "#{Time.zone.now.utc} - Destroying domains\n" unless Rails.env.test?
c = 0
Domain.where("statuses @> '{deleteCandidate}'::varchar[]").each do |x|
x.destroy
c += 1
end
Domain.where('force_delete_at <= ?', Time.zone.now).each do |x|
x.destroy
c += 1
end
STDOUT << "#{Time.zone.now.utc} - Successfully destroyed #{c} domains\n" unless Rails.env.test?
end
end
def name=(value)
@ -155,6 +233,14 @@ class Domain < ActiveRecord::Base
self[:name_dirty] = value
end
def roid
"EIS-#{id}"
end
def puny_label
name_puny.to_s.split('.').first
end
def registrant_typeahead
@registrant_typeahead || registrant.try(:name) || nil
end
@ -163,16 +249,52 @@ class Domain < ActiveRecord::Base
domain_transfers.find_by(status: DomainTransfer::PENDING)
end
def can_be_deleted?
(domain_statuses.pluck(:value) & %W(
#{DomainStatus::SERVER_DELETE_PROHIBITED}
)).empty?
def expirable?
return false if valid_to > Time.zone.now
!statuses.include?(DomainStatus::EXPIRED)
end
def server_holdable?
return false if outzone_at > Time.zone.now
return false if statuses.include?(DomainStatus::SERVER_HOLD)
return false if statuses.include?(DomainStatus::SERVER_MANUAL_INZONE)
true
end
def delete_candidateable?
return false if delete_at > Time.zone.now
return false if statuses.include?(DomainStatus::DELETE_CANDIDATE)
return false if statuses.include?(DomainStatus::SERVER_DELETE_PROHIBITED)
true
end
def renewable?
if Setting.days_to_renew_domain_before_expire != 0
if ((valid_to - Time.zone.now.beginning_of_day).to_i / 1.day) + 1 > Setting.days_to_renew_domain_before_expire
return false
end
end
return false if statuses.include?(DomainStatus::DELETE_CANDIDATE)
true
end
def preclean_pendings
self.registrant_verification_token = nil
self.registrant_verification_asked_at = nil
end
def clean_pendings!
preclean_pendings
self.pending_json = {}
statuses.delete(DomainStatus::PENDING_UPDATE)
statuses.delete(DomainStatus::PENDING_DELETE)
save
end
def pending_update?
(domain_statuses.pluck(:value) & %W(
#{DomainStatus::PENDING_UPDATE}
)).present?
statuses.include?(DomainStatus::PENDING_UPDATE)
end
def pending_update!
@ -180,9 +302,10 @@ class Domain < ActiveRecord::Base
self.epp_pending_update = true # for epp
return true unless registrant_verification_asked?
pending_json_cache = all_changes
pending_json_cache = pending_json
token = registrant_verification_token
asked_at = registrant_verification_asked_at
changes_cache = changes
DomainMailer.registrant_pending_updated(self).deliver_now
@ -191,10 +314,13 @@ class Domain < ActiveRecord::Base
self.pending_json = pending_json_cache
self.registrant_verification_token = token
self.registrant_verification_asked_at = asked_at
domain_statuses.create(value: DomainStatus::PENDING_UPDATE)
self.statuses = [DomainStatus::PENDING_UPDATE]
pending_json[:domain] = changes_cache
end
# rubocop: disable Metrics/CyclomaticComplexity
def registrant_update_confirmable?(token)
return true if Rails.env.development?
return false unless pending_update?
return false if registrant_verification_token.blank?
return false if registrant_verification_asked_at.blank?
@ -204,6 +330,7 @@ class Domain < ActiveRecord::Base
end
def registrant_delete_confirmable?(token)
return true if Rails.env.development?
return false unless pending_delete?
return false if registrant_verification_token.blank?
return false if registrant_verification_asked_at.blank?
@ -211,20 +338,25 @@ class Domain < ActiveRecord::Base
return false if registrant_verification_token != token
true
end
# rubocop: enable Metrics/CyclomaticComplexity
def force_deletable?
!statuses.include?(DomainStatus::FORCE_DELETE)
end
def registrant_verification_asked?
registrant_verification_asked_at.present? && registrant_verification_token.present?
end
def registrant_verification_asked!
def registrant_verification_asked!(frame_str, current_user_id)
pending_json['frame'] = frame_str
pending_json['current_user_id'] = current_user_id
self.registrant_verification_asked_at = Time.zone.now
self.registrant_verification_token = SecureRandom.hex(42)
end
def pending_delete?
(domain_statuses.pluck(:value) & %W(
#{DomainStatus::PENDING_DELETE}
)).present?
statuses.include?(DomainStatus::PENDING_DELETE)
end
def pending_delete!
@ -232,7 +364,9 @@ class Domain < ActiveRecord::Base
self.epp_pending_delete = true # for epp
return true unless registrant_verification_asked?
domain_statuses.create(value: DomainStatus::PENDING_DELETE)
self.statuses = [DomainStatus::PENDING_DELETE]
save(validate: false) # should check if this did succeed
DomainMailer.pending_deleted(self).deliver_now
end
@ -250,7 +384,7 @@ class Domain < ActiveRecord::Base
def validate_period
return unless period.present?
if period_unit == 'd'
valid_values = %w(365 366 710 712 1065 1068)
valid_values = %w(365 730 1095)
elsif period_unit == 'm'
valid_values = %w(12 24 36)
else
@ -289,12 +423,10 @@ class Domain < ActiveRecord::Base
name
end
def pending_registrant_name
def pending_registrant
return '' if pending_json.blank?
return '' if pending_json['domain'].blank?
return '' if pending_json['domain']['registrant_id'].blank?
registrant = Registrant.find_by(id: pending_json['domain']['registrant_id'].last)
registrant.try(:name)
Registrant.find_by(id: pending_json['domain']['registrant_id'].last)
end
# rubocop:disable Lint/Loop
@ -307,19 +439,45 @@ class Domain < ActiveRecord::Base
def set_validity_dates
self.registered_at = Time.zone.now
self.valid_from = Time.zone.now.to_date
self.valid_from = Time.zone.now
self.valid_to = valid_from + self.class.convert_period_to_time(period, period_unit)
self.outzone_at = valid_to + Setting.expire_warning_period.days
self.delete_at = outzone_at + Setting.redemption_grace_period.days
end
def set_force_delete
statuses << DomainStatus::FORCE_DELETE
statuses << DomainStatus::SERVER_RENEW_PROHIBITED
statuses << DomainStatus::SERVER_TRANSFER_PROHIBITED
statuses << DomainStatus::SERVER_UPDATE_PROHIBITED
statuses << DomainStatus::SERVER_MANUAL_INZONE
statuses << DomainStatus::PENDING_DELETE
statuses.delete(DomainStatus::CLIENT_DELETE_PROHIBITED)
statuses.delete(DomainStatus::SERVER_DELETE_PROHIBITED)
self.force_delete_at = Time.zone.now + Setting.redemption_grace_period.days unless force_delete_at
save(validate: false)
end
def unset_force_delete
statuses.delete(DomainStatus::FORCE_DELETE)
statuses.delete(DomainStatus::SERVER_RENEW_PROHIBITED)
statuses.delete(DomainStatus::SERVER_TRANSFER_PROHIBITED)
statuses.delete(DomainStatus::SERVER_UPDATE_PROHIBITED)
statuses.delete(DomainStatus::SERVER_MANUAL_INZONE)
statuses.delete(DomainStatus::PENDING_DELETE)
self.force_delete_at = nil
save(validate: false)
end
def manage_automatic_statuses
if domain_statuses.empty? && valid?
domain_statuses.create(value: DomainStatus::OK)
elsif domain_statuses.length > 1 || !valid?
domain_statuses.find_by(value: DomainStatus::OK).try(:destroy)
# domain_statuses.create(value: DomainStatus::DELETE_CANDIDATE) if delete_candidateable?
if statuses.empty? && valid?
statuses << DomainStatus::OK
elsif statuses.length > 1 || !valid?
statuses.delete(DomainStatus::OK)
end
# otherwise domain_statuses are in old state for domain object
domain_statuses.reload
end
def children_log
@ -332,18 +490,8 @@ class Domain < ActiveRecord::Base
log
end
def all_changes
all_changes = HashWithIndifferentAccess.new
all_changes[:domain] = changes
all_changes[:admin_contacts] = admin_contacts.map(&:changes)
all_changes[:tech_contacts] = tech_contacts.map(&:changes)
all_changes[:nameservers] = nameservers.map(&:changes)
all_changes[:registrant] = registrant.try(:changes)
all_changes[:domain_statuses] = domain_statuses.map(&:changes)
all_changes
end
def update_whois_record
whois_record.blank? ? create_whois_record : whois_record.save
end
end
# rubocop: enable Metrics/ClassLength

View file

@ -73,23 +73,23 @@ class DomainStatus < ActiveRecord::Base
EXPIRED = 'expired'
STATUSES = [
CLIENT_DELETE_PROHIBITED, SERVER_DELETE_PROHIBITED, CLIENT_HOLD, SERVER_HOLD,
CLIENT_RENEW_PROHIBITED, SERVER_RENEW_PROHIBITED, CLIENT_TRANSFER_PROHIBITED,
SERVER_TRANSFER_PROHIBITED, CLIENT_UPDATE_PROHIBITED, SERVER_UPDATE_PROHIBITED,
INACTIVE, OK, PENDING_CREATE, PENDING_DELETE, PENDING_RENEW, PENDING_TRANSFER,
PENDING_UPDATE, SERVER_MANUAL_INZONE, SERVER_REGISTRANT_CHANGE_PROHIBITED,
SERVER_ADMIN_CHANGE_PROHIBITED, SERVER_TECH_CHANGE_PROHIBITED, FORCE_DELETE,
CLIENT_DELETE_PROHIBITED, SERVER_DELETE_PROHIBITED, CLIENT_HOLD, SERVER_HOLD,
CLIENT_RENEW_PROHIBITED, SERVER_RENEW_PROHIBITED, CLIENT_TRANSFER_PROHIBITED,
SERVER_TRANSFER_PROHIBITED, CLIENT_UPDATE_PROHIBITED, SERVER_UPDATE_PROHIBITED,
INACTIVE, OK, PENDING_CREATE, PENDING_DELETE, PENDING_RENEW, PENDING_TRANSFER,
PENDING_UPDATE, SERVER_MANUAL_INZONE, SERVER_REGISTRANT_CHANGE_PROHIBITED,
SERVER_ADMIN_CHANGE_PROHIBITED, SERVER_TECH_CHANGE_PROHIBITED, FORCE_DELETE,
DELETE_CANDIDATE, EXPIRED
]
CLIENT_STATUSES = [
CLIENT_DELETE_PROHIBITED, CLIENT_HOLD, CLIENT_RENEW_PROHIBITED, CLIENT_TRANSFER_PROHIBITED,
CLIENT_DELETE_PROHIBITED, CLIENT_HOLD, CLIENT_RENEW_PROHIBITED, CLIENT_TRANSFER_PROHIBITED,
CLIENT_UPDATE_PROHIBITED
]
SERVER_STATUSES = [
SERVER_DELETE_PROHIBITED, SERVER_HOLD, SERVER_RENEW_PROHIBITED, SERVER_TRANSFER_PROHIBITED,
SERVER_UPDATE_PROHIBITED, SERVER_MANUAL_INZONE, SERVER_REGISTRANT_CHANGE_PROHIBITED,
SERVER_UPDATE_PROHIBITED, SERVER_MANUAL_INZONE, SERVER_REGISTRANT_CHANGE_PROHIBITED,
SERVER_ADMIN_CHANGE_PROHIBITED, SERVER_TECH_CHANGE_PROHIBITED
]
@ -113,7 +113,7 @@ class DomainStatus < ActiveRecord::Base
case value
when 'ok'
'ok (paid and in zone)'
else
else
value
end
end
@ -124,7 +124,7 @@ class DomainStatus < ActiveRecord::Base
end
def statuses_for_admin
SERVER_STATUSES.map { |x| x.sub('server', '') }
SERVER_STATUSES.map { |x| [x.sub('server', ''), x] }
end
end
end

View file

@ -51,9 +51,9 @@ class DomainTransfer < ActiveRecord::Base
end
end
def notify_losing_registrar
def notify_losing_registrar(contacts, registrant)
transfer_from.messages.create!(
body: I18n.t('domain_transfer_was_approved', contacts: domain.contacts.pluck(:code).sort),
body: I18n.t('domain_transfer_was_approved', contacts: contacts, registrant: registrant),
attached_obj_id: id,
attached_obj_type: self.class.to_s
)

View file

@ -123,7 +123,8 @@ class Epp::Contact < Contact
[:email, :invalid],
[:ident, :invalid],
[:ident, :invalid_EE_identity_format],
[:ident, :invalid_birthday_format]
[:ident, :invalid_birthday_format],
[:ident, :invalid_country_code]
],
'2302' => [ # Object exists
[:code, :epp_id_taken]
@ -142,7 +143,6 @@ class Epp::Contact < Contact
at.deep_merge!(self.class.attrs_from(frame.css('rem'), 'rem'))
at.deep_merge!(self.class.attrs_from(frame.css('add')))
at.deep_merge!(self.class.attrs_from(frame.css('chg')))
at.merge!(self.class.ident_attrs(frame.css('ident').first))
legal_frame = frame.css('legalDocument').first
at[:legal_documents_attributes] = self.class.legal_document_attrs(legal_frame)
self.deliver_emails = true # turn on email delivery for epp

View file

@ -34,7 +34,6 @@ class Epp::Domain < Domain
max: Setting.ns_max_count
}
],
[:period, :out_of_range, { value: { obj: 'period', val: period } }],
[:dnskeys, :out_of_range,
{
min: Setting.dnskeys_min_count,
@ -55,7 +54,8 @@ class Epp::Domain < Domain
]
],
'2005' => [ # Parameter value syntax error
[:name_dirty, :invalid, { obj: 'name', val: name_dirty }]
[:name_dirty, :invalid, { obj: 'name', val: name_dirty }],
[:puny_label, :too_long, { obj: 'name', val: name_puny }]
],
'2201' => [ # Authorisation error
[:auth_info, :wrong_pw]
@ -68,6 +68,7 @@ class Epp::Domain < Domain
[:base, :domain_status_prohibits_operation]
],
'2306' => [ # Parameter policy error
[:period, :out_of_range, { value: { obj: 'period', val: period } }],
[:base, :ds_data_with_key_not_allowed],
[:base, :ds_data_not_allowed],
[:base, :key_data_not_allowed],
@ -109,10 +110,12 @@ class Epp::Domain < Domain
at[:period_unit] = Epp::Domain.parse_period_unit_from_frame(frame) || 'y'
# at[:statuses] = domain_statuses_attrs(frame, action)
# binding.pry
at[:nameservers_attributes] = nameservers_attrs(frame, action)
at[:admin_domain_contacts_attributes] = admin_domain_contacts_attrs(frame, action)
at[:tech_domain_contacts_attributes] = tech_domain_contacts_attrs(frame, action)
at[:domain_statuses_attributes] = domain_statuses_attrs(frame, action)
# at[:domain_statuses_attributes] = domain_statuses_attrs(frame, action)
if new_record?
dnskey_frame = frame.css('extension create')
@ -234,24 +237,6 @@ class Epp::Domain < Domain
attrs
end
def domain_status_list_from(frame)
status_list = []
frame.css('status').each do |x|
unless DomainStatus::CLIENT_STATUSES.include?(x['s'])
add_epp_error('2303', 'status', x['s'], [:domain_statuses, :not_found])
next
end
status_list << {
value: x['s'],
description: x.text
}
end
status_list
end
# rubocop: disable Metrics/PerceivedComplexity
# rubocop: disable Metrics/CyclomaticComplexity
def dnskeys_attrs(frame, action)
@ -335,14 +320,10 @@ class Epp::Domain < Domain
if action == 'rem'
to_destroy = []
status_list.each do |x|
status = domain_statuses.find_by(value: x[:value])
if status.blank?
add_epp_error('2303', 'status', x[:value], [:domain_statuses, :not_found])
if statuses.include?(x)
to_destroy << x
else
to_destroy << {
id: status.id,
_destroy: 1
}
add_epp_error('2303', 'status', x, [:domain_statuses, :not_found])
end
end
@ -361,10 +342,7 @@ class Epp::Domain < Domain
next
end
status_list << {
value: x['s'],
description: x.text
}
status_list << x['s']
end
status_list
@ -380,7 +358,7 @@ class Epp::Domain < Domain
}]
end
def update(frame, current_user)
def update(frame, current_user, verify = true)
return super if frame.blank?
at = {}.with_indifferent_access
at.deep_merge!(attrs_from(frame.css('chg'), current_user))
@ -391,16 +369,36 @@ class Epp::Domain < Domain
at[:admin_domain_contacts_attributes] += at_add[:admin_domain_contacts_attributes]
at[:tech_domain_contacts_attributes] += at_add[:tech_domain_contacts_attributes]
at[:dnskeys_attributes] += at_add[:dnskeys_attributes]
at[:domain_statuses_attributes] += at_add[:domain_statuses_attributes]
at[:statuses] =
statuses - domain_statuses_attrs(frame.css('rem'), 'rem') + domain_statuses_attrs(frame.css('add'), 'add')
if frame.css('registrant').present? && frame.css('registrant').attr('verified').to_s.downcase != 'yes'
registrant_verification_asked!
# at[:statuses] += at_add[:domain_statuses_attributes]
if verify && frame.css('registrant').present? && frame.css('registrant').attr('verified').to_s.downcase != 'yes'
registrant_verification_asked!(frame.to_s, current_user.id)
end
self.deliver_emails = true # turn on email delivery for epp
errors.empty? && super(at)
end
def apply_pending_update!
preclean_pendings
user = ApiUser.find(pending_json['current_user_id'])
frame = Nokogiri::XML(pending_json['frame'])
statuses.delete(DomainStatus::PENDING_UPDATE)
clean_pendings! if update(frame, user, false)
end
def apply_pending_delete!
preclean_pendings
user = ApiUser.find(pending_json['current_user_id'])
frame = Nokogiri::XML(pending_json['frame'])
statuses.delete(DomainStatus::PENDING_DELETE)
clean_pendings! if epp_destroy(frame, user, false)
end
def attach_legal_document(legal_document_data)
return unless legal_document_data
@ -410,11 +408,12 @@ class Epp::Domain < Domain
)
end
def epp_destroy(frame)
def epp_destroy(frame, user_id, verify=true)
return false unless valid?
if frame.css('delete').attr('verified').to_s.downcase != 'yes'
registrant_verification_asked!
if verify && frame.css('delete').attr('verified').to_s.downcase != 'yes'
registrant_verification_asked!(frame.to_s, user_id)
self.deliver_emails = true # turn on email delivery for epp
pending_delete!
manage_automatic_statuses
true # aka 1001 pending_delete
@ -426,14 +425,21 @@ class Epp::Domain < Domain
### RENEW ###
def renew(cur_exp_date, period, unit = 'y')
# TODO: Check how much time before domain exp date can it be renewed
validate_exp_dates(cur_exp_date)
add_epp_error('2105', nil, nil, I18n.t('object_is_not_eligible_for_renewal')) unless renewable?
return false if errors.any?
p = self.class.convert_period_to_time(period, unit)
self.valid_to = valid_to + p
self.outzone_at = outzone_at + p
self.delete_at = delete_at + p
self.period = period
self.period_unit = unit
statuses.delete(DomainStatus::SERVER_HOLD)
statuses.delete(DomainStatus::EXPIRED)
save
end
@ -466,7 +472,8 @@ class Epp::Domain < Domain
oc = c.deep_clone include: [:statuses]
oc.code = nil
oc.registrar_id = registrar_id
oc.save!
oc.prefix_code
oc.save!(validate: false)
oc
end
@ -474,7 +481,7 @@ class Epp::Domain < Domain
oc = Contact.find(contact_id) # n+1 workaround
oc.registrar_id = registrar_id
oc.generate_new_code!
oc.save!
oc.save!(validate: false)
oc
end
@ -520,6 +527,9 @@ class Epp::Domain < Domain
def query_transfer(frame, current_user)
return false unless can_be_transferred_to?(current_user.registrar)
old_contact_codes = contacts.pluck(:code).sort.uniq
old_registrant_code = registrant.code
transaction do
begin
dt = domain_transfers.create!(
@ -538,7 +548,7 @@ class Epp::Domain < Domain
if dt.approved?
transfer_contacts(current_user.registrar_id)
dt.notify_losing_registrar
dt.notify_losing_registrar(old_contact_codes, old_registrant_code)
generate_auth_info
self.registrar = current_user.registrar
end
@ -547,8 +557,10 @@ class Epp::Domain < Domain
save!(validate: false)
return dt
rescue => _e
rescue => e
add_epp_error('2306', nil, nil, I18n.t('action_failed_due_to_server_error'))
logger.error('DOMAIN TRANSFER FAILED')
logger.error(e)
raise ActiveRecord::Rollback
end
end
@ -671,9 +683,7 @@ class Epp::Domain < Domain
begin
errors.add(:base, :domain_status_prohibits_operation)
return false
end if (domain_statuses.pluck(:value) & %W(
#{DomainStatus::CLIENT_DELETE_PROHIBITED}
)).any?
end if statuses.include?(DomainStatus::CLIENT_DELETE_PROHIBITED)
true
end

View file

@ -0,0 +1,5 @@
module Legacy
class Invoice < Db
self.table_name = :invoice
end
end

View file

@ -1,5 +1,11 @@
module Legacy
class Registrar < Db
self.table_name = :registrar
has_many :invoices, foreign_key: :registrarid
def account_balance
invoices.sum(:credit)
end
end
end

View file

@ -2,7 +2,11 @@ class LegalDocument < ActiveRecord::Base
include Versions # version/legal_document_version.rb
belongs_to :documentable, polymorphic: true
TYPES = %w(pdf bdoc ddoc zip rar gz tar 7z)
if ENV['legal_document_types'].present?
TYPES = ENV['legal_document_types'].split(',').map(&:strip)
else
TYPES = %w(pdf bdoc ddoc zip rar gz tar 7z odt doc docx)
end
attr_accessor :body

22
app/models/pricelist.rb Normal file
View file

@ -0,0 +1,22 @@
class Pricelist < ActiveRecord::Base
include Versions # version/pricelist_version.rb
monetize :price_cents
validates :price_cents, :price_currency, :price,
:valid_from, :category, :operation_category, :duration, presence: true
CATEGORIES = %w(ee pri.ee fie.ee med.ee com.ee)
OPERATION_CATEGORIES = %w(create renew)
DURATIONS = %w(1year 2years 3years)
after_initialize :init_values
def init_values
return unless new_record?
self.valid_from = Time.zone.now.beginning_of_year
end
def name
"#{operation_category} #{category}"
end
end

View file

@ -17,12 +17,24 @@ class RegistrantVerification < ActiveRecord::Base
def domain_registrant_change_confirm!
self.action_type = DOMAIN_REGISTRANT_CHANGE
self.action = CONFIRMED
save
DomainUpdateConfirmJob.enqueue domain.id, CONFIRMED if save
end
def domain_registrant_change_reject!
self.action_type = DOMAIN_REGISTRANT_CHANGE
self.action = REJECTED
save
DomainUpdateConfirmJob.enqueue domain.id, REJECTED if save
end
def domain_registrant_delete_confirm!
self.action_type = DOMAIN_DELETE
self.action = CONFIRMED
DomainDeleteConfirmJob.enqueue domain.id, CONFIRMED if save
end
def domain_registrant_delete_reject!
self.action_type = DOMAIN_DELETE
self.action = REJECTED
DomainDeleteConfirmJob.enqueue domain.id, REJECTED if save
end
end

View file

@ -0,0 +1,4 @@
class PricelistVersion < PaperTrail::Version
self.table_name = :log_pricelists
self.sequence_name = :log_pricelists_id_seq
end

View file

@ -20,11 +20,11 @@ class WhoisRecord < ActiveRecord::Base
includes(
domain: [
:registrant,
:registrar,
:nameservers,
:registrar,
:nameservers,
{ tech_contacts: :registrar },
{ admin_contacts: :registrar }
]
]
)
end
end
@ -34,19 +34,23 @@ class WhoisRecord < ActiveRecord::Base
h = HashWithIndifferentAccess.new
return h if domain.blank?
status_map = {
'ok' => 'ok (paid and in zone)'
}
@disclosed = []
h[:name] = domain.name
h[:registrant] = domain.registrant.name
h[:status] = domain.domain_statuses.map(&:human_value).join(', ')
h[:status] = domain.statuses.map { |x| status_map[x] || x }.join(', ')
h[:registered] = domain.registered_at.try(:to_s, :iso8601)
h[:updated_at] = domain.updated_at.try(:to_s, :iso8601)
h[:valid_to] = domain.valid_to.try(:to_s, :iso8601)
# update registar triggers when adding new attributes
h[:registrar] = domain.registrar.name
h[:registrar_phone] = domain.registrar.phone
h[:registrar_address] = domain.registrar.address
h[:registrar_update_at] = domain.registrar.updated_at.try(:to_s, :iso8601)
h[:registrar_update_at] = domain.registrar.updated_at.try(:to_s, :iso8601)
h[:admin_contacts] = []
domain.admin_contacts.each do |ac|

View file

@ -1,11 +1,4 @@
class DomainNameValidator < ActiveModel::EachValidator
# TODO
# validates lenght of 2-63
# validates/honours Estonian additional letters zäõüö
# honours punicode and all interfces honors utf8
# validates lower level domains (.pri.ee, edu.ee etc)
# lower level domains are fixed for .ee and can add statically into settings
def validate_each(record, attribute, value)
if !self.class.validate_format(value)
record.errors[attribute] << (options[:message] || record.errors.generate_message(attribute, :invalid))
@ -31,9 +24,8 @@ class DomainNameValidator < ActiveModel::EachValidator
# rubocop: disable Metrics/LineLength
unicode_chars = /\u00E4\u00F5\u00F6\u00FC\u0161\u017E/ # äõöüšž
regexp = /\A[a-zA-Z0-9#{unicode_chars}][a-zA-Z0-9#{unicode_chars}-]{0,61}[a-zA-Z0-9#{unicode_chars}]#{general_domains}\z/
regexp = /\A[a-zA-Z0-9#{unicode_chars.source}][a-zA-Z0-9#{unicode_chars.source}-]{0,61}[a-zA-Z0-9#{unicode_chars.source}]#{general_domains.source}\z/
# rubocop: enable Metrics/LineLength
# rubocop: disable Style/DoubleNegation
!!(value =~ regexp)
# rubocop: enable Style/DoubleNegation

View file

@ -11,14 +11,15 @@
- if @admin_user.new_record? || can?(:update, AdminUser)
.form-group
.col-md-4.control-label
= f.label :password
- not_required = @admin_user.new_record? ? '' : 'not-required'
= f.label :password, class: not_required
.col-md-8
= f.text_field(:password, class: 'form-control')
= f.password_field(:password, class: 'form-control')
.form-group
.col-md-4.control-label
= f.label :password_confirmation
= f.label :password_confirmation, class: not_required
.col-md-8
= f.text_field(:password_confirmation, class: 'form-control')
= f.password_field(:password_confirmation, class: 'form-control')
%hr
.form-group
@ -48,3 +49,8 @@
.row
.col-md-8.text-right
= button_tag(t(:save), class: 'btn btn-primary')
:coffee
$("#admin_user_password").removeAttr('required')
$("#admin_user_password_confirmation").removeAttr('required')

View file

@ -1,4 +1,5 @@
= form_for([:admin, @api_user], multipart: true, html: {class: 'form-horizontal'}) do |f|
= form_for([:admin, @api_user], multipart: true,
html: {class: 'form-horizontal', autocomplete: 'off'}) do |f|
= render 'shared/full_errors', object: @api_user
.row
@ -10,9 +11,11 @@
= f.text_field(:username, class: 'form-control')
.form-group
.col-md-4.control-label
= f.label :password
- not_required = @api_user.new_record? ? '' : 'not-required'
= f.label :password, class: not_required
.col-md-7
= f.text_field(:password, class: 'form-control')
= f.text_field :password, class: 'form-control', autocomplete: 'off'
.form-group
.col-md-4.control-label
= f.label :identity_code
@ -48,4 +51,5 @@
= button_tag(t(:save), class: 'btn btn-primary')
:coffee
Autocomplete.bindAdminRegistrarSearch();
Autocomplete.bindAdminRegistrarSearch()
$("#api_user_password").removeAttr('required')

View file

@ -12,6 +12,8 @@
= f.label :th6_file
.col-md-8
= f.file_field :th6_file
.col-md-4
%p= t(:bank_statement_desc).html_safe
%hr
.row
.col-md-8.text-right

View file

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

View file

@ -1,26 +1,29 @@
#domain-statuses
= f.fields_for :domain_statuses, @server_statuses do |status_fields|
- @server_statuses.each do |x|
.panel.panel-default
.panel-heading.clearfix
.pull-left= t(:status)
.pull-right
= link_to(t(:add_another), '#', class: 'btn btn-primary btn-xs add-domain-status')
= link_to(t(:delete), '#', class: 'btn btn-danger btn-xs destroy')
= link_to(t(:delete), '#', class: 'btn btn-danger btn-xs destroy-status')
.panel-body
.errors
= render 'shared/errors', object: status_fields.object
- if status_fields.object.errors.any?
%hr
.form-group
= status_fields.label :value, class: 'col-md-2 control-label'
= f.label 'status', class: 'col-md-2 control-label'
.col-md-10
= status_fields.select :value, options_for_select(DomainStatus.statuses_for_admin, status_fields.object.value.try(:sub, 'server', '')), {include_blank: true}, {class: 'form-control'}
= select_tag 'domain[statuses][]', options_for_select(DomainStatus.statuses_for_admin, x), include_blank: true, class: 'form-control'
.form-group
= status_fields.label :description, class: 'col-md-2 control-label'
= label_tag t(:description), nil, class: 'col-md-2 control-label'
.col-md-10
= status_fields.text_field :description, class: 'form-control', autocomplete: 'off'
= text_field_tag :description, nil, class: 'form-control', autocomplete: 'off'
- @other_statuses.each do |x|
= hidden_field_tag 'domain[statuses][]', x, readonly: true
:coffee
$("#domain-statuses").nestedAttributes
bindAddTo: $(".add-domain-status")
afterAdd: (item) ->
item.find(".errors").html ""
$('.destroy-status').on 'click', (e) ->
e.preventDefault()
if $('.panel').length > 1
$(this).parents('.panel').remove()
else
$(this).parents('.panel').find('select').val('')

View file

@ -13,7 +13,8 @@
%dd= link_to(@domain.registrar, root_path)
%dt= t(:password)
%dd= @domain.auth_info
%dd
= text_field_tag :password, @domain.auth_info, readonly: true, class: 'partially-hidden'
%dt= t(:valid_from)
%dd= l(@domain.valid_from)

View file

@ -1,5 +1,4 @@
- panel_class = @domain.errors.messages[:domain_statuses] ? 'panel-danger' : 'panel-default'
#domain_statuses.panel{class: panel_class}
#domain_statuses.panel.panel-default
.panel-heading.clearfix
= t(:statuses)
.table-responsive
@ -9,12 +8,7 @@
%th{class: 'col-xs-6'}= t(:status)
%th{class: 'col-xs-6'}= t(:description)
%tbody
- @domain.domain_statuses.each do |x|
- @domain.statuses.each do |x|
%tr
%td= x.value
%td= x.description
- if @domain.errors.messages[:domain_statuses]
%tfoot
- @domain.errors.messages[:domain_statuses].each do |x|
%tr
%td{colspan: 4}= x
%td= x
%td

View file

@ -1,6 +1,11 @@
- content_for :actions do
= link_to(t(:edit_statuses), edit_admin_domain_path(@domain), class: 'btn btn-primary')
= link_to(t(:history), admin_domain_domain_versions_path(@domain.id), method: :get, class: 'btn btn-primary')
- if @domain.force_deletable?
= link_to(t(:set_force_delete), set_force_delete_admin_domain_path(@domain), method: :post, data: { confirm: t(:are_you_sure) }, class: 'btn btn-warning')
- else
= link_to(t(:unset_force_delete), unset_force_delete_admin_domain_path(@domain), method: :post, data: { confirm: t(:are_you_sure) }, class: 'btn btn-warning')
= render 'shared/title', name: @domain.name
.row

View file

@ -0,0 +1,33 @@
= form_for([:admin, @pricelist], multipart: true) do |f|
= render 'shared/errors', object: f.object
.row
.col-md-6
.form-group
= f.label :operation_category
= f.select(:operation_category, Pricelist::OPERATION_CATEGORIES, {}, { class: 'form-control' })
.form-group
= f.label :category, t(:category)
= f.select(:category, Pricelist::CATEGORIES, {}, { class: 'form-control' })
.form-group
= f.label :duration
= f.select(:duration, Pricelist::DURATIONS, {}, { class: 'form-control' })
.form-group
= f.label :price
.input-group
= f.text_field(:price, class: 'form-control')
%span.input-group-addon= Money.default_currency
.form-group.input-daterange
= f.label :valid_from, t(:valid)
.input-group
= f.text_field(:valid_from, value: f.object.valid_from.try(:to_s, :dshort),
class: 'form-control js-datepicker')
%span.input-group-addon -
= f.text_field(:valid_to, value: f.object.valid_to.try(:to_s, :dshort),
class: 'form-control js-datepicker')
%hr
.row
.col-md-12.text-right
= button_tag(t(:save), class: 'btn btn-primary')

View file

@ -0,0 +1,6 @@
.row
.col-sm-6
%h2.text-center-xs= "#{t(:edit)}: #{@pricelist.name}"
%hr
= render 'form'

View file

@ -0,0 +1,43 @@
.row
.col-sm-6
%h2.text-center-xs= t(:pricelists)
.col-sm-6
%h2.text-right.text-center-xs
= link_to(t(:new), new_admin_pricelist_path, class: 'btn btn-primary')
%hr
.row
.col-md-12
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-2'}
= sort_link(@q, 'category', t(:category))
%th{class: 'col-xs-2'}
= sort_link(@q, 'operation_category', t(:operation))
%th{class: 'col-xs-2'}
= sort_link(@q, 'duration', t(:duration))
%th{class: 'col-xs-2'}
= sort_link(@q, 'price', t(:price))
%th{class: 'col-xs-2'}
= sort_link(@q, 'valid_from', t(:valid_from))
%th{class: 'col-xs-2'}
= sort_link(@q, 'valid_to', t(:valid_to))
%th{class: 'col-xs-2'}
= t(:action)
%tbody
- @pricelists.each do |pricelist|
%tr
%td= pricelist.category
%td= pricelist.operation_category
%td= pricelist.duration
%td= pricelist.price
%td= l(pricelist.valid_from, format: :ydate)
%td= l(pricelist.valid_to, format: :ydate)
%td= link_to(t(:edit), edit_admin_pricelist_path(pricelist), class: 'btn btn-xs btn-primary')
.row
.col-md-12
= paginate @pricelists

View file

@ -0,0 +1,3 @@
%h2= t(:new_price)
%hr
= render 'form'

View file

@ -0,0 +1,9 @@
- value = Setting.send(var)
%tr
%td= t(var)
- if [TrueClass, FalseClass].include?(value.class)
%td
= hidden_field_tag("[settings][#{var}]", '')
= check_box_tag("[settings][#{var}]", true, value)
- else
%td= text_field_tag("[settings][#{var}]", value)

View file

@ -1,27 +1,72 @@
= render 'shared/title', name: t(:settings)
= form_tag [:admin, :settings] do
.panel.panel-default
.panel-heading.clearfix
= t(:domain_validation_rules)
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-6'}= t(:setting)
%th{class: 'col-xs-6'}= t(:value)
%tbody
= render 'setting_row', var: :admin_contacts_min_count
= render 'setting_row', var: :admin_contacts_max_count
= render 'setting_row', var: :tech_contacts_min_count
= render 'setting_row', var: :tech_contacts_max_count
= render 'setting_row', var: :ds_data_allowed
= render 'setting_row', var: :key_data_allowed
= render 'setting_row', var: :dnskeys_min_count
= render 'setting_row', var: :dnskeys_max_count
= render 'setting_row', var: :ns_min_count
= render 'setting_row', var: :ns_max_count
.panel.panel-default
.panel-heading.clearfix
= t(:domain_expiring)
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-6'}= t(:setting)
%th{class: 'col-xs-6'}= t(:value)
%tbody
= render 'setting_row', var: :days_to_renew_domain_before_expire
= render 'setting_row', var: :expire_warning_period
= render 'setting_row', var: :redemption_grace_period
.panel.panel-default
.panel-heading.clearfix
= t(:billing)
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-6'}= t(:setting)
%th{class: 'col-xs-6'}= t(:value)
%tbody
= render 'setting_row', var: :eis_iban
= render 'setting_row', var: :eis_bank
= render 'setting_row', var: :eis_swift
= render 'setting_row', var: :eis_invoice_contact
= render 'setting_row', var: :invoice_number_min
= render 'setting_row', var: :invoice_number_max
= render 'setting_row', var: :days_to_keep_overdue_invoices_active
.panel.panel-default
.panel-heading.clearfix
= t(:other)
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-6'}= t(:setting)
%th{class: 'col-xs-6'}= t(:value)
%tbody
= render 'setting_row', var: :transfer_wait_time
= render 'setting_row', var: :ds_algorithm
= render 'setting_row', var: :client_side_status_editing_enabled
.row
.col-md-8
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-4'}
= t(:setting)
%th{class: 'col-xs-2'}
= t(:value)
%tbody
- @settings.each do |x|
%tr
%td= t("#{x.var}")
- if [TrueClass, FalseClass].include?(x.value.class)
%td
= hidden_field_tag("[settings][#{x.var}]", '')
= check_box_tag("[settings][#{x.var}]", true, x.value)
- else
%td= text_field_tag("[settings][#{x.var}]", x.value)
%hr
.row
.col-md-8.text-right
.col-md-12.text-right
%button.btn.btn-primary=t(:save)

View file

@ -6,10 +6,10 @@ uus aadress: <%= @contact.email %>
<br><br>
Eposti aadressile saadetakse domeenidega seotud infot seal hulgas kinnitustaotluseid omaniku vahetuse ja domeeni kustutamise korral. Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduga oma registripidaja poole. Teie registripidaja on <%= @contact.registrar.name %>
<br><br>
<% if @contact.domain_contacts.present? %>
<% if @contact.related_domain_descriptions.present? %>
Muudatusega seotud domeenid:<br>
<% @contact.domain_contacts.each do |dc| %>
<%= dc.domain.name %> (<%= dc.name %>)<br>
<% @contact.related_domain_descriptions.each do |domain, desc| %>
<%= domain %> (<%= desc.map { |d| t(d, locale: :et) }.join(', ') %>)<br>
<% end %>
<% end %>
<br>
@ -35,9 +35,11 @@ new address: <% @contact.email %>
<br><br>
E-mail addresses are used to send important information regarding your registered domains including applications for approval of registrant change and domain deletion. Please make sure that the update and contact information are correct. Incase of problems please turn to your registrar. Your registrar is <%= @contact.registrar.name %>
<br><br>
<% if @contact.related_domain_descriptions.present? %>
Domains affected by this update:<br>
<% @contact.domain_contacts.each do |dc| %>
<%= dc.domain.name %> (<%= dc.name %>)<br>
<% @contact.related_domain_descriptions.each do |domain, desc| %>
<%= domain %> (<%= desc.map { |d| t(d, locale: :en) }.join(', ') %>)<br>
<% end %>
<% end %>
<br>
Contact information:<br>

View file

@ -6,11 +6,11 @@ uus aadress: <%= @contact.email %>
Eposti aadressile saadetakse domeenidega seotud infot seal hulgas kinnitustaotluseid omaniku vahetuse ja domeeni kustutamise korral. Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduga oma registripidaja poole. Teie registripidaja on <%= @contact.registrar.name %>
<% if @contact.domain_contacts.present? %>
<% if @contact.related_domain_descriptions.present? %>
Muudatusega seotud domeenid:
<% @contact.domain_contacts.each do |dc| %>
<%= dc.domain.name %> (<%= dc.name %>)
<% end %>
<% @contact.related_domain_descriptions.each do |domain, desc| %>
<%= domain %> (<%= desc.map { |d| t(d, locale: :et) }.join(', ') %>)
<% end %>
<% end %>
Kontaktandmed:
@ -35,9 +35,11 @@ new address: <% @contact.email %>
E-mail addresses are used to send important information regarding your registered domains including applications for approval of registrant change and domain deletion. Please make sure that the update and contact information are correct. Incase of problems please turn to your registrar. Your registrar is <%= @contact.registrar.name %>
<% if @contact.related_domain_descriptions.present? %>
Domains affected by this update:
<% @contact.domain_contacts.each do |dc| %>
<%= dc.domain.name %> (<%= dc.name %>)
<% @contact.related_domain_descriptions.each do |domain, desc| %>
<%= domain %> (<%= desc.map { |d| t(d, locale: :en) }.join(', ') %>)
<% end %>
<% end %>
Contact information:

View file

@ -9,8 +9,6 @@ Isikukood: <%= @domain.registrant_ident %><br>
<% else %>
Äriregistrikood: <%= @domain.registrant_ident %><br>
<% end %>
Epost: <%= @domain.registrant_email %><br>
Tel: <%= @domain.registrant_phone %><br>
Tänav: <%= @domain.registrant_street %><br>
Linn: <%= @domain.registrant_city %><br>
Riik: <%= @domain.registrant_country %>
@ -34,8 +32,6 @@ Personal code: <%= @domain.registrant_ident %><br>
<% else %>
Business Registry code: <%= @domain.registrant_ident %><br>
<% end %>
E-mail: <%= @domain.registrant_email %><br>
Tel: <%= @domain.registrant_phone %><br>
Street: <%= @domain.registrant_street %><br>
City: <%= @domain.registrant_city %><br>
Country: <%= @domain.registrant_country %>

View file

@ -9,8 +9,6 @@ Isikukood: <%= @domain.registrant_ident %>
<% else %>
Äriregistrikood: <%= @domain.registrant_ident %>
<% end %>
Epost: <%= @domain.registrant_email %>
Tel: <%= @domain.registrant_phone %>
Tänav: <%= @domain.registrant_street %>
Linn: <%= @domain.registrant_city %>
Riik: <%= @domain.registrant_country %>
@ -34,8 +32,6 @@ Personal code: <%= @domain.registrant_ident %>
<% else %>
Business Registry code: <%= @domain.registrant_ident %>
<% end %>
E-mail: <%= @domain.registrant_email %>
Tel: <%= @domain.registrant_phone %>
Street: <%= @domain.registrant_street %>
City: <%= @domain.registrant_city %>
Country: <%= @domain.registrant_country %>

View file

@ -5,7 +5,7 @@ xml.epp_head do
end
xml.resData do
xml.tag!('contact:chkData', 'xmlns:contact' => 'urn:ietf:params:xml:ns:contact-1.0') do
xml.tag!('contact:chkData', 'xmlns:contact' => 'https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/contact-eis-1.0.xsd') do
@results.each do |result|
xml.tag!('contact:cd') do
xml.tag! "contact:id", result[:code], avail: result[:avail]
@ -15,6 +15,6 @@ xml.epp_head do
end
end
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -5,12 +5,12 @@ xml.epp_head do
end
xml.resData do
xml.tag!('contact:creData', 'xmlns:contact' => 'urn:ietf:params:xml:ns:contact-1.0') do
xml.tag!('contact:creData', 'xmlns:contact' => 'https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/contact-eis-1.0.xsd') do
xml.tag!('contact:id', @contact.code)
xml.tag!('contact:crDate', @contact.created_at)
xml.tag!('contact:crDate', @contact.created_at.try(:iso8601))
end
end
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -4,6 +4,6 @@ xml.epp_head do
xml.msg 'Command completed successfully'
end
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -5,12 +5,12 @@ xml.epp_head do
end
xml.resData do
xml.tag!('contact:infData', 'xmlns:contact' => 'urn:ietf:params:xml:ns:contact-1.0') do
xml.tag!('contact:infData', 'xmlns:contact' => 'https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/contact-eis-1.0.xsd') do
xml.tag!('contact:id', @contact.code)
if can? :view_full_info, @contact, @password
xml.tag!('contact:voice', @contact.phone)
xml.tag!('contact:email', @contact.email)
xml.tag!('contact:fax', @contact.fax) if @contact.fax.present?
xml.tag!('contact:roid', @contact.roid)
@contact.statuses.each do |status|
xml.tag!('contact:status', s: status.value)
end
xml.tag!('contact:postalInfo', type: 'int') do
@ -20,19 +20,29 @@ xml.epp_head do
xml.tag!('contact:addr') do
xml.tag!('contact:street', @contact.street)
xml.tag!('contact:city', @contact.city)
xml.tag!('contact:pc', @contact.zip)
xml.tag!('contact:sp', @contact.state)
xml.tag!('contact:pc', @contact.zip)
xml.tag!('contact:cc', @contact.country_code)
end
end
end
if can? :view_full_info, @contact, @password
xml.tag!('contact:voice', @contact.phone)
xml.tag!('contact:fax', @contact.fax) if @contact.fax.present?
xml.tag!('contact:email', @contact.email)
end
xml.tag!('contact:clID', @contact.registrar.try(:name))
xml.tag!('contact:crID', @contact.creator.try(:registrar))
xml.tag!('contact:crDate', @contact.created_at)
if @contact.creator.try(:registrar).blank? && Rails.env.test?
xml.tag!('contact:crID', 'TEST-CREATOR')
else
xml.tag!('contact:crID', @contact.creator.try(:registrar))
end
xml.tag!('contact:crDate', @contact.created_at.try(:iso8601))
if @contact.updated_at != @contact.created_at
xml.tag!('contact:upID', @contact.updator.try(:registrar))
xml.tag!('contact:upDate', @contact.updated_at)
xml.tag!('contact:upDate', @contact.updated_at.try(:iso8601))
end
# xml.tag!('contact:trDate', '123') if false
if can? :view_password, @contact, @password
@ -40,21 +50,18 @@ xml.epp_head do
xml.tag!('contact:pw', @contact.auth_info)
end
end
@contact.statuses.each do |status|
xml.tag!('contact:status', s: status.value)
end
# xml << render('/epp/contacts/disclosure_policy')
end
end
if can? :view_full_info, @contact, @password
xml.tag!('extension') do
xml.tag!('eis:extdata', 'xmlns:eis' => 'urn:ee:eis:xml:epp:eis-1.0') do
xml.tag!('eis:ident', @contact.ident,
xml.tag!('eis:extdata', 'xmlns:eis' => 'https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd') do
xml.tag!('eis:ident', @contact.ident,
type: @contact.ident_type, cc: @contact.ident_country_code)
end
end
end
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -5,12 +5,12 @@ xml.epp_head do
end
xml.resData do
xml.tag!('contact:creData', 'xmlns:contact' => 'urn:ietf:params:xml:ns:contact-1.0') do
xml.tag!('contact:creData', 'xmlns:contact' => 'https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/contact-eis-1.0.xsd') do
xml.tag!('contact:id', @contact.code)
xml.tag!('contact:crDate', @contact.created_at)
xml.tag!('contact:crDate', @contact.created_at.try(:iso8601))
end
end
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -5,7 +5,7 @@ xml.epp_head do
end
xml.resData do
xml.tag!('domain:chkData', 'xmlns:domain' => 'urn:ietf:params:xml:ns:domain-1.0') do
xml.tag!('domain:chkData', 'xmlns:domain' => 'https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/domain-eis-1.0.xsd') do
@domains.each do |x|
xml.tag!('domain:cd') do
xml.tag!('domain:name', x[:name], 'avail' => x[:avail])
@ -15,6 +15,6 @@ xml.epp_head do
end
end
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -5,13 +5,13 @@ xml.epp_head do
end
xml.resData do
xml.tag!('domain:creData', 'xmlns:domain' => 'urn:ietf:params:xml:ns:domain-1.0') do
xml.tag!('domain:creData', 'xmlns:domain' => 'https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/domain-eis-1.0.xsd') do
xml.tag!('domain:name', @domain.name)
xml.tag!('domain:crDate', @domain.created_at)
xml.tag!('domain:exDate', @domain.valid_to)
xml.tag!('domain:crDate', @domain.created_at.try(:iso8601))
xml.tag!('domain:exDate', @domain.valid_to.try(:iso8601))
end
end
end
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -5,11 +5,11 @@ xml.epp_head do
end
xml.resData do
xml.tag!('domain:infData', 'xmlns:domain' => 'urn:ietf:params:xml:ns:domain-1.0') do
xml.tag!('domain:infData', 'xmlns:domain' => 'https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/domain-eis-1.0.xsd') do
xml.tag!('domain:name', @domain.name)
@domain.domain_statuses.each do |ds|
xml.tag!('domain:status', ds.description, 's' => ds.value) unless ds.description.blank?
xml.tag!('domain:status', 's' => ds.value) if ds.description.blank?
xml.tag!('domain:roid', @domain.roid)
@domain.statuses.each do |s|
xml.tag!('domain:status', 's' => s)
end
xml.tag!('domain:registrant', @domain.registrant_code)
@ -38,17 +38,17 @@ xml.epp_head do
xml.tag!('domain:clID', @domain.registrar_name)
xml.tag!('domain:crID', @domain.creator.try(:registrar))
xml.tag!('domain:crID', @domain.creator.try(:registrar)) if @domain.creator
xml.tag!('domain:crDate', @domain.created_at)
xml.tag!('domain:crDate', @domain.created_at.try(:iso8601))
xml.tag!('domain:exDate', @domain.valid_to)
xml.tag!('domain:upDate', @domain.updated_at.try(:iso8601)) if @domain.updated_at != @domain.created_at
xml.tag!('domain:exDate', @domain.valid_to.try(:iso8601))
# TODO Make domain stampable
#xml.tag!('domain:upID', @domain.updated_by)
xml.tag!('domain:upDate', @domain.updated_at) if @domain.updated_at != @domain.created_at
# TODO Make domain transferrable
#xml.tag!('domain:trDate', @domain.transferred_at) if @domain.transferred_at
@ -59,26 +59,26 @@ xml.epp_head do
end
end
end
end
xml.extension do
xml.tag!('secDNS:infData', 'xmlns:secDNS' => 'urn:ietf:params:xml:ns:secDNS-1.1') do
@domain.dnskeys.sort.each do |key|
xml.tag!('secDNS:dsData') do
xml.tag!('secDNS:keyTag', key.ds_key_tag)
xml.tag!('secDNS:alg', key.ds_alg)
xml.tag!('secDNS:digestType', key.ds_digest_type)
xml.tag!('secDNS:digest', key.ds_digest)
xml.tag!('secDNS:keyData') do
xml.tag!('secDNS:flags', key.flags)
xml.tag!('secDNS:protocol', key.protocol)
xml.tag!('secDNS:alg', key.alg)
xml.tag!('secDNS:pubKey', key.public_key)
xml.extension do
xml.tag!('secDNS:infData', 'xmlns:secDNS' => 'urn:ietf:params:xml:ns:secDNS-1.1') do
@domain.dnskeys.sort.each do |key|
xml.tag!('secDNS:dsData') do
xml.tag!('secDNS:keyTag', key.ds_key_tag)
xml.tag!('secDNS:alg', key.ds_alg)
xml.tag!('secDNS:digestType', key.ds_digest_type)
xml.tag!('secDNS:digest', key.ds_digest)
xml.tag!('secDNS:keyData') do
xml.tag!('secDNS:flags', key.flags)
xml.tag!('secDNS:protocol', key.protocol)
xml.tag!('secDNS:alg', key.alg)
xml.tag!('secDNS:pubKey', key.public_key)
end
end
end
end
end
end if @domain.dnskeys.any?
end if @domain.dnskeys.any?
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -1,9 +1,9 @@
builder.tag!('domain:trnData', 'xmlns:domain' => 'urn:ietf:params:xml:ns:domain-1.0') do
builder.tag!('domain:trnData', 'xmlns:domain' => 'https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/domain-eis-1.0.xsd') do
builder.tag!('domain:name', dt.domain_name)
builder.tag!('domain:trStatus', dt.status)
builder.tag!('domain:reID', dt.transfer_to.code)
builder.tag!('domain:reDate', dt.transfer_requested_at)
builder.tag!('domain:reDate', dt.transfer_requested_at.try(:iso8601))
builder.tag!('domain:acID', dt.transfer_from.code)
builder.tag!('domain:acDate', dt.transferred_at || dt.wait_until)
builder.tag!('domain:exDate', dt.domain_valid_to)
builder.tag!('domain:acDate', dt.transferred_at.try(:iso8601) || dt.wait_until.try(:iso8601))
builder.tag!('domain:exDate', dt.domain_valid_to.try(:iso8601))
end

View file

@ -5,12 +5,12 @@ xml.epp_head do
end
xml.resData do
xml.tag!('domain:renData', 'xmlns:domain' => 'urn:ietf:params:xml:ns:domain-1.0') do
xml.tag!('domain:renData', 'xmlns:domain' => 'https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/domain-eis-1.0.xsd') do
xml.tag!('domain:name', @domain[:name])
xml.tag!('domain:exDate', @domain.valid_to)
xml.tag!('domain:exDate', @domain.valid_to.try(:iso8601))
end
end
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -3,7 +3,7 @@ xml.epp_head do
xml.result('code' => '1000') do
xml.msg 'Command completed successfully'
end
end
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -3,7 +3,6 @@ xml.epp_head do
xml.result('code' => '1001') do
xml.msg 'Command completed successfully; action pending'
end
render('epp/shared/trID', builder: xml)
end
xml << render('/epp/shared/trID')
end

View file

@ -7,7 +7,7 @@ xml.epp_head do
xml.resData do
xml << render('epp/domains/partials/transfer', builder: xml, dt: @domain_transfer)
end
end
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -20,7 +20,6 @@ xml.epp_head do
end
end
render('epp/shared/trID', builder: xml)
end
xml << render('/epp/shared/trID')
end

View file

@ -0,0 +1,8 @@
xml.epp_head do
xml.response do
xml.result('code' => '2306') do
xml.msg('Parameter value policy error. Allowed only Latin characters.', 'lang' => 'en')
end
render('epp/shared/trID', builder: xml)
end
end

View file

@ -6,6 +6,6 @@ xml.epp_head do
xml.tag!('msgQ', 'count' => current_user.queued_messages.count, 'id' => @message.id)
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -2,7 +2,7 @@ xml.instruct!(:xml, standalone: 'no')
xml.epp(
'xmlns' => 'urn:ietf:params:xml:ns:epp-1.0',
'xmlns:secDNS' => 'urn:ietf:params:xml:ns:secDNS-1.1',
'xmlns:domain' => 'urn:ietf:params:xml:ns:domain-1.0',
'xmlns:domain' => 'https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/domain-eis-1.0.xsd',
'xmlns:keyrelay' => 'urn:ietf:params:xml:ns:keyrelay-1.0'
) do
xml.response do
@ -11,7 +11,7 @@ xml.epp(
end
xml.tag!('msgQ', 'count' => current_user.queued_messages.count, 'id' => @message.id) do
xml.qDate @message.created_at
xml.qDate @message.created_at.try(:iso8601)
xml.msg @message.body
end
@ -19,7 +19,7 @@ xml.epp(
xml.tag!('keyrelay:response') do
xml.tag!('keyrelay:panData') do
xml.tag!('keyrelay:name', @object.domain_name)
xml.tag!('keyrelay:paDate', @object.pa_date)
xml.tag!('keyrelay:paDate', @object.pa_date.try(:iso8601))
xml.tag!('keyrelay:keyData') do
xml.tag!('secDNS:flags', @object.key_data_flags)
@ -44,6 +44,6 @@ xml.epp(
end
end
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -4,6 +4,6 @@ xml.epp_head do
xml.msg 'Command completed successfully; no messages'
end
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -5,7 +5,7 @@ xml.epp_head do
end
xml.tag!('msgQ', 'count' => current_user.queued_messages.count, 'id' => @message.id) do
xml.qDate @message.created_at
xml.qDate @message.created_at.try(:iso8601)
xml.msg @message.body
end
@ -15,6 +15,6 @@ xml.epp_head do
end
end if @object
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -5,13 +5,13 @@ xml.epp_head do
xml.svcMenu do
xml.version '1.0'
xml.lang 'en'
xml.objURI 'urn:ietf:params:xml:ns:domain-1.0'
xml.objURI 'urn:ietf:params:xml:ns:contact-1.0'
xml.objURI 'https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/domain-eis-1.0.xsd'
xml.objURI 'https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/contact-eis-1.0.xsd'
xml.objURI 'urn:ietf:params:xml:ns:host-1.0'
xml.objURI 'urn:ietf:params:xml:ns:keyrelay-1.0'
xml.svcExtension do
xml.extURI 'urn:ietf:params:xml:ns:secDNS-1.1'
xml.extURI 'urn:ee:eis:xml:epp:eis-1.0'
xml.extURI 'https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd'
end
end

View file

@ -3,7 +3,7 @@ xml.epp_head do
xml.result('code' => '2501') do
xml.msg(@msg || 'Authentication error; server closing connection')
end
end
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -4,6 +4,6 @@ xml.epp_head do
xml.msg 'Command completed successfully'
end
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -3,7 +3,7 @@ xml.epp_head do
xml.result('code' => '1500') do
xml.msg 'Command completed successfully; ending session'
end
end
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -1,4 +1,5 @@
xml.trID do
xml.clTRID params[:clTRID]
xml.svTRID @svTRID
# builder ||= xml
builder.trID do
builder.clTRID params[:clTRID] if params[:clTRID].present?
builder.svTRID @svTRID
end

View file

@ -3,7 +3,7 @@ xml.epp_head do
xml.result('code' => '1000') do
xml.msg 'Command completed successfully'
end
end
xml << render('/epp/shared/trID')
render('epp/shared/trID', builder: xml)
end
end

View file

@ -51,16 +51,21 @@
%li= link_to t(:admin_users), admin_admin_users_path
%li.divider
%li.dropdown-header= t(:billing)
- if can? :view, Pricelist
%li= link_to t(:pricelists), admin_pricelists_path
%li= link_to t(:bank_statements), admin_bank_statements_path
%li= link_to t(:invoices), admin_invoices_path
%li.divider
%li.dropdown-header= t(:system)
%li= link_to t(:settings), admin_settings_path
%li= link_to t(:zonefile), admin_zonefile_settings_path
%li.dropdown-header= t(:system)
%li= link_to t(:settings), admin_settings_path
%li= link_to t(:zonefile), admin_zonefile_settings_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(:repp_logs), admin_repp_logs_path
-# %li= link_to t(:background_jobs), admin_delayed_jobs_path
%li= link_to t(:que), '/admin/que'
- if signed_in?
%ul.nav.navbar-nav.navbar-right

View file

@ -1,4 +1,44 @@
- if @domain.present?
- if params[:confirmed].present?
.row
.col-md-12
%h1= t(:domain_delete_confirmed_title)
.row
.col-md-12
%p= t(:domain_delete_confirmed_body)
- elsif params[:rejected].present?
.row
.col-md-12
%h1= t(:domain_delete_rejected_title)
.row
.col-md-12
%p= t(:domain_delete_rejected_body)
- else
%h1= t(:not_valid_domain_verification_title).html_safe
%p= t(:not_valid_domain_verification_body).html_safe
- if @domain.present?
.row
.col-md-12
%h1= t(:domain_delete_title)
.row
.col-md-12
%p= t(:domain_delete_body)
%hr
.row
.col-md-12.text-center.confirmation
.column-keys
%p= t(:domain_name) + ':'
%p= t(:registrant) + ':'
.column-values
%p= @domain.name
%p= "#{@domain.registrant_name} (#{@domain.registrant.ident})"
.row
.col-md-12.text-center
.confirmation
= form_for registrant_domain_delete_confirm_path(@domain.id), method: :patch do |f|
= hidden_field_tag :token, params[:token]
= f.button t(:confirm_domain_delete), name: 'confirmed', class: 'btn btn-primary'
= f.button t(:reject_domain_delete), name: 'rejected', class: 'btn btn-warning'
%hr
- else
%h1= t(:not_valid_domain_verification_title).html_safe
%p= t(:not_valid_domain_verification_body).html_safe

View file

@ -25,13 +25,13 @@
.row
.col-md-12.text-center.confirmation
.column-keys
%p= t(:domain_name) + ':'
%p= t(:domain_name) + ':'
%p= t(:current_registrant) + ':'
%p= t(:new_pending_registrant) + ':'
.column-values
%p= @domain.name
%p= @domain.registrant_name
%p= @domain.pending_registrant_name
%p= "#{@domain.registrant_name} (#{@domain.registrant.ident})"
%p= "#{@domain.pending_registrant.try(:name)} (#{@domain.pending_registrant.try(:ident)})"
.row
.col-md-12.text-center

View file

@ -7,20 +7,20 @@
= f.label :ident_country_code, t(:country) + '*'
.col-md-7
= f.select(:ident_country_code, SortedCountry.all_options(f.object.ident_country_code), {},
class: 'js-ident-country-code', required: true)
class: 'js-ident-country-code', required: true, disabled: @contact.persisted?)
.form-group
.col-md-3.control-label
= f.label :ident_type, t(:type) + '*'
.col-md-7
= f.select(:ident_type, Depp::Contact::SELECTION_TYPES, { selected: f.object.ident_type },
class: 'js-ident-type', required: true)
class: 'js-ident-type', required: true, disabled: @contact.persisted?)
.form-group
.col-md-3.control-label
= f.label :ident, t(:ident) + '*'
.col-md-7
= f.text_field :ident, class: 'form-control', required: true
= f.text_field :ident, class: 'form-control', required: true, disabled: @contact.persisted?
- tip_visibility = f.object.ident_type == 'birthday' ? '' : 'display: none'
.js-ident-tip{ style: tip_visibility }
= t(:birthday_format)

View file

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

View file

@ -1,10 +1,11 @@
- content_for :actions do
= link_to(t(:edit), edit_registrar_domains_path(domain_name: params[:domain_name]),
class: 'btn btn-default')
= link_to(t(:renew), renew_registrar_domains_path(domain_name: params[:domain_name]),
class: 'btn btn-default')
= link_to(t(:delete), delete_registrar_domains_path(domain_name: params[:domain_name]),
class: 'btn btn-default')
- if @data.css('pw').text.present?
= link_to(t(:edit), edit_registrar_domains_path(domain_name: params[:domain_name]),
class: 'btn btn-default')
= link_to(t(:renew), renew_registrar_domains_path(domain_name: params[:domain_name]),
class: 'btn btn-default')
= link_to(t(:delete), delete_registrar_domains_path(domain_name: params[:domain_name]),
class: 'btn btn-default')
= render 'shared/title', name: truncate(@data.css('name').text)
.row

View file

@ -17,11 +17,11 @@
class: 'form-control', autocomplete: 'off', required: true
.form-group
.col-md-3.control-label
= label_tag 'legal_document', t(:legal_document), class: 'required'
= label_tag 'legal_document', t(:legal_document)
.col-md-7
= file_field_tag 'legal_document', required: true
= file_field_tag 'legal_document'
.form-group
.col-md-10.text-right
%button.btn.btn-warning{ name: 'query' }= t(:query)
%button.btn.btn-warning{ name: 'approve' }= t(:approve)
%button.btn.btn-warning{ name: 'reject' }= t(:reject)
%button.btn.btn-warning{ name: 'query' }= t(:transfer)
/%button.btn.btn-warning{ name: 'approve' }= t(:approve)
/%button.btn.btn-warning{ name: 'reject' }= t(:reject)

View file

@ -3,7 +3,7 @@
<command>
<check>
<contact:check
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
xmlns:contact="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/contact-eis-1.0.xsd">
<contact:id>sh8013</contact:id>
</contact:check>
</check>

View file

@ -3,7 +3,7 @@
<command>
<check>
<contact:check
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
xmlns:contact="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/contact-eis-1.0.xsd">
<contact:id>sh8013</contact:id>
<contact:id>sh13</contact:id>
<contact:id>vsdfvq</contact:id>

View file

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

View file

@ -3,7 +3,7 @@
<command>
<delete>
<contact:delete
xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
xmlns:contact="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/contact-eis-1.0.xsd">
<contact:id>sh8013</contact:id>
<contact:authInfo>
<contact:pw>wrong-one</contact:pw>
@ -11,7 +11,7 @@
</contact:delete>
</delete>
<extension>
<eis:extdata xmlns:eis="urn:ee:eis:xml:epp:eis-1.0">
<eis:extdata xmlns:eis="https://raw.githubusercontent.com/internetee/registry/alpha/doc/schemas/eis-1.0.xsd">
<eis:legalDocument type="pdf">
JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==
</eis:legalDocument>

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