Merge branch 'master' into registry-791

This commit is contained in:
Artur Beljajev 2018-06-09 08:01:10 +03:00
commit 36b137eb84
129 changed files with 2226 additions and 3275 deletions

View file

@ -1,12 +1,12 @@
version: "2"
prepare:
fetch:
- "https://raw.githubusercontent.com/internetee/style-guide/master/ruby/.rubocop.yml"
plugins: plugins:
brakeman: brakeman:
enabled: true enabled: true
bundler-audit: bundler-audit:
enabled: true enabled: true
csslint:
enabled: true
coffeelint:
enabled: true
duplication: duplication:
enabled: true enabled: true
config: config:
@ -17,22 +17,12 @@ plugins:
enabled: true enabled: true
fixme: fixme:
enabled: true enabled: true
config:
strings:
- FIXME
- TODO
- HACK
rubocop: rubocop:
enabled: true enabled: true
channel: rubocop-0-51
reek:
enabled: true
checks:
IrresponsibleModule:
enabled: false
exclude_patterns: exclude_patterns:
- "config/" - "bin/"
- "db/" - "config/"
- "vendor/" - "db/"
- "spec/" - "vendor/"
- "test/" - "test/"
- "spec/"

View file

@ -1,2 +0,0 @@
--exclude-exts=.min.css
--ignore=adjoining-classes,box-model,ids,order-alphabetical,unqualified-attributes

View file

@ -1 +0,0 @@
**/*{.,-}min.js

View file

@ -1,7 +0,0 @@
env:
browser: true
es6: true
jquery: true
extends: google
rules:
require-jsdoc: off

24
.gitignore vendored
View file

@ -1,25 +1,13 @@
*.rbc
capybara-*.html
.rspec
/log /log
/tmp /tmp
/db/*.sqlite3
/public/system /public/system
/public/assets
/coverage/ /coverage/
/spec/tmp
**.orig
config/initializers/secret_token.rb
config/deploy.rb
config/database.yml
config/application.yml
config/environments/development.rb
misc
/export
/import
/ca
/.bundle /.bundle
/vendor/bundle /vendor/bundle
/config/database.yml
/config/application.yml
/config/environments/development.rb
/config/deploy.rb
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this: # Do not commit one. Instead, download the latest from https://github.com/internetee/style-guide.
.rvmrc .rubocop.yml

1136
.reek

File diff suppressed because it is too large Load diff

View file

@ -1,4 +0,0 @@
inherit_from: .rubocop_todo.yml
Style/Alias:
EnforcedStyle: prefer_alias_method

File diff suppressed because it is too large Load diff

View file

@ -1 +1 @@
2.2.7 2.3.7

View file

@ -1,3 +1,31 @@
25.05.2018
* GDPR: updated whois templates with configurable disclaimer [#795](https://github.com/internetee/registry/issues/795)
* GDPR: email forwarding solution to contact private domain registrants without revealing their email addresses [#824](https://github.com/internetee/registry/issues/824)
* EPP: added support for additional digitally signed doc formats like asice, sce, asics, scs, edoc, adoc [#840](https://github.com/internetee/registry/issues/840)
* Registrar: removed handling of newlines from contact form street field [#836](https://github.com/internetee/registry/issues/836)
* Ruby upgrade to version 2.3.7 [#546](https://github.com/internetee/registry/issues/546)
* Devise upgrade to version 4.4.3 [#847](https://github.com/internetee/registry/pull/847)
* Added extra logging to debug Directo integration [#848](https://github.com/internetee/registry/pull/848)
30.04.2018
* Upgrade Ruby on Rails to version 4.2.10 [#826](https://github.com/internetee/registry/issues/826)
* BUG: Admin - fixed internal error in domain_versions and contact_versions views caused by removed db column [#830](https://github.com/internetee/registry/issues/830)
23.04.2018
* WHOIS: domains with deleteCandidate status do not return registration details as domains waiting to be deleted [#789](https://github.com/internetee/registry/issues/789)
* Security: Nokigiri gem update to version 1.8.2 [#823](https://github.com/internetee/registry/pull/823)
* Bug: fixed missing translation error in admin mail templates page [#818](https://github.com/internetee/registry/pull/818)
* Admin: VAT percentage info to registrar profile for setting tax rate for foreign non vat liable registrars [#623](https://github.com/internetee/registry/issues/623)
* Admin: deleteCandidate status is now stressed in domain details view [#792](https://github.com/internetee/registry/issues/792)
* Removed invoice_type from invoice db data as unused [#772](https://github.com/internetee/registry/issues/772)
* Removed valid_from from domain db data as duplicated and unused [#787](https://github.com/internetee/registry/issues/787)
* Set Not null constraint to valid_ti domain db data [#800](https://github.com/internetee/registry/issues/800)
* Removed unused methods [#797](https://github.com/internetee/registry/issues/797)
* Removed unused cron tasks [#782](https://github.com/internetee/registry/issues/782)
* Removed some monkey-patching for flash message logging [#231](https://github.com/internetee/registry/issues/231)
* Added Docker container support for dev and test environments [#821](https://github.com/internetee/registry/issues/821)
* Fix for Travis CI random test failures [#809](https://github.com/internetee/registry/pull/809)
03.04.2018 03.04.2018
* BUG: Fixed bug with sometimes failing bank-link payments [#642](https://github.com/internetee/registry/issues/642) * BUG: Fixed bug with sometimes failing bank-link payments [#642](https://github.com/internetee/registry/issues/642)
* EPP: Domain and associated objects are now validated on domain renew [#678](https://github.com/internetee/registry/issues/678) * EPP: Domain and associated objects are now validated on domain renew [#678](https://github.com/internetee/registry/issues/678)

View file

@ -1,4 +1,4 @@
FROM ruby:2.2 FROM ruby:2.3
MAINTAINER maciej.szlosarczyk@internet.ee MAINTAINER maciej.szlosarczyk@internet.ee
RUN apt-get update > /dev/null && apt-get install -y > /dev/null \ RUN apt-get update > /dev/null && apt-get install -y > /dev/null \

View file

@ -11,7 +11,7 @@ source 'https://rubygems.org'
gem 'SyslogLogger', '2.0', require: 'syslog/logger' gem 'SyslogLogger', '2.0', require: 'syslog/logger'
gem 'iso8601', '0.8.6' # for dates and times gem 'iso8601', '0.8.6' # for dates and times
gem 'rails', '4.2.7.1' # when update, all initializers eis_custom files needs check/update gem 'rails', '4.2.10' # when update, all initializers eis_custom files needs check/update
gem 'rest-client' gem 'rest-client'
# load env # load env
@ -52,7 +52,7 @@ gem 'liquid', '3.0.6' # for email templates
# rights # rights
gem 'cancancan', '1.11.0' # autharization gem 'cancancan', '1.11.0' # autharization
gem 'devise', '3.5.4' # authenitcation gem 'devise', '4.4.3' # authenitcation
# rest api # rest api
gem 'grape', '0.12.0' gem 'grape', '0.12.0'

View file

@ -60,43 +60,42 @@ GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
SyslogLogger (2.0) SyslogLogger (2.0)
actionmailer (4.2.7.1) actionmailer (4.2.10)
actionpack (= 4.2.7.1) actionpack (= 4.2.10)
actionview (= 4.2.7.1) actionview (= 4.2.10)
activejob (= 4.2.7.1) activejob (= 4.2.10)
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.7.1) actionpack (4.2.10)
actionview (= 4.2.7.1) actionview (= 4.2.10)
activesupport (= 4.2.7.1) activesupport (= 4.2.10)
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.7.1) actionview (4.2.10)
activesupport (= 4.2.7.1) activesupport (= 4.2.10)
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.3)
active_model-errors_details (1.3.1) active_model-errors_details (1.3.1)
activemodel (>= 3.2.13, < 5.0.0) activemodel (>= 3.2.13, < 5.0.0)
activesupport activesupport
activejob (4.2.7.1) activejob (4.2.10)
activesupport (= 4.2.7.1) activesupport (= 4.2.10)
globalid (>= 0.3.0) globalid (>= 0.3.0)
activemodel (4.2.7.1) activemodel (4.2.10)
activesupport (= 4.2.7.1) activesupport (= 4.2.10)
builder (~> 3.1) builder (~> 3.1)
activerecord (4.2.7.1) activerecord (4.2.10)
activemodel (= 4.2.7.1) activemodel (= 4.2.10)
activesupport (= 4.2.7.1) activesupport (= 4.2.10)
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.7.1) activesupport (4.2.10)
i18n (~> 0.7) i18n (~> 0.7)
json (~> 1.7, >= 1.7.7)
minitest (~> 5.1) minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4) thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1) tzinfo (~> 1.1)
@ -160,7 +159,7 @@ GEM
unicode_utils (~> 1.4) unicode_utils (~> 1.4)
crack (0.4.3) crack (0.4.3)
safe_yaml (~> 1.0.0) safe_yaml (~> 1.0.0)
crass (1.0.3) crass (1.0.4)
daemons (1.2.4) daemons (1.2.4)
daemons-rails (1.2.1) daemons-rails (1.2.1)
daemons daemons
@ -168,12 +167,11 @@ GEM
database_cleaner (1.6.1) database_cleaner (1.6.1)
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.4) devise (4.4.3)
bcrypt (~> 3.0) bcrypt (~> 3.0)
orm_adapter (~> 0.1) orm_adapter (~> 0.1)
railties (>= 3.2.6, < 5) railties (>= 4.1.0, < 6.0)
responders responders
thread_safe (~> 0.1)
warden (~> 1.2.3) warden (~> 1.2.3)
diff-lcs (1.3) diff-lcs (1.3)
docile (1.1.5) docile (1.1.5)
@ -189,8 +187,8 @@ GEM
railties (>= 3.0.0) railties (>= 3.0.0)
figaro (1.1.1) figaro (1.1.1)
thor (~> 0.14) thor (~> 0.14)
globalid (0.3.7) globalid (0.4.1)
activesupport (>= 4.1.0) activesupport (>= 4.2.0)
grape (0.12.0) grape (0.12.0)
activesupport activesupport
builder builder
@ -228,7 +226,7 @@ GEM
httpi (2.4.2) httpi (2.4.2)
rack rack
socksify socksify
i18n (0.8.4) i18n (0.8.6)
i18n_data (0.7.0) i18n_data (0.7.0)
ice_nine (0.11.2) ice_nine (0.11.2)
isikukood (0.1.2) isikukood (0.1.2)
@ -251,8 +249,8 @@ GEM
loofah (2.2.2) loofah (2.2.2)
crass (~> 1.0.2) crass (~> 1.0.2)
nokogiri (>= 1.5.9) nokogiri (>= 1.5.9)
mail (2.6.6) mail (2.7.0)
mime-types (>= 1.16, < 4) mini_mime (>= 0.1.1)
method_source (0.8.2) method_source (0.8.2)
mime-types (3.1) mime-types (3.1)
mime-types-data (~> 3.2015) mime-types-data (~> 3.2015)
@ -260,8 +258,9 @@ GEM
mina (0.3.1) mina (0.3.1)
open4 (~> 1.3.4) open4 (~> 1.3.4)
rake rake
mini_mime (1.0.0)
mini_portile2 (2.3.0) mini_portile2 (2.3.0)
minitest (5.10.3) minitest (5.11.3)
monetize (1.6.0) monetize (1.6.0)
money (~> 6.8) money (~> 6.8)
money (6.8.3) money (6.8.3)
@ -313,35 +312,35 @@ 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.7.1) rails (4.2.10)
actionmailer (= 4.2.7.1) actionmailer (= 4.2.10)
actionpack (= 4.2.7.1) actionpack (= 4.2.10)
actionview (= 4.2.7.1) actionview (= 4.2.10)
activejob (= 4.2.7.1) activejob (= 4.2.10)
activemodel (= 4.2.7.1) activemodel (= 4.2.10)
activerecord (= 4.2.7.1) activerecord (= 4.2.10)
activesupport (= 4.2.7.1) activesupport (= 4.2.10)
bundler (>= 1.3.0, < 2.0) bundler (>= 1.3.0, < 2.0)
railties (= 4.2.7.1) railties (= 4.2.10)
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)
rails-dom-testing (1.0.8) rails-dom-testing (1.0.9)
activesupport (>= 4.2.0.beta, < 5.0) activesupport (>= 4.2.0, < 5.0)
nokogiri (~> 1.6) nokogiri (~> 1.6)
rails-deprecated_sanitizer (>= 1.0.1) rails-deprecated_sanitizer (>= 1.0.1)
rails-html-sanitizer (1.0.3) rails-html-sanitizer (1.0.4)
loofah (~> 2.0) loofah (~> 2.2, >= 2.2.2)
rails-settings-cached (0.4.1) rails-settings-cached (0.4.1)
rails (>= 4.0.0) rails (>= 4.0.0)
railties (4.2.7.1) railties (4.2.10)
actionpack (= 4.2.7.1) actionpack (= 4.2.10)
activesupport (= 4.2.7.1) activesupport (= 4.2.10)
rake (>= 0.8.7) rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0) thor (>= 0.18.1, < 2.0)
rainbow (2.2.2) rainbow (2.2.2)
rake rake
rake (12.0.0) rake (12.3.1)
ransack (1.5.1) ransack (1.5.1)
actionpack (>= 3.0) actionpack (>= 3.0)
activerecord (>= 3.0) activerecord (>= 3.0)
@ -350,8 +349,9 @@ GEM
polyamorous (~> 1.1) polyamorous (~> 1.1)
rdoc (4.3.0) rdoc (4.3.0)
request_store (1.1.0) request_store (1.1.0)
responders (2.3.0) responders (2.4.0)
railties (>= 4.2.0, < 5.1) actionpack (>= 4.2.0, < 5.3)
railties (>= 4.2.0, < 5.3)
rest-client (2.0.1) rest-client (2.0.1)
http-cookie (>= 1.0.2, < 2.0) http-cookie (>= 1.0.2, < 2.0)
mime-types (>= 1.16, < 4.0) mime-types (>= 1.16, < 4.0)
@ -430,14 +430,14 @@ GEM
sprockets (3.7.1) sprockets (3.7.1)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
rack (> 1, < 3) rack (> 1, < 3)
sprockets-rails (3.2.0) sprockets-rails (3.2.1)
actionpack (>= 4.0) actionpack (>= 4.0)
activesupport (>= 4.0) activesupport (>= 4.0)
sprockets (>= 3.0.0) sprockets (>= 3.0.0)
thor (0.19.4) thor (0.20.0)
thread_safe (0.3.6) thread_safe (0.3.6)
tilt (1.4.1) tilt (1.4.1)
tzinfo (1.2.3) tzinfo (1.2.5)
thread_safe (~> 0.1) thread_safe (~> 0.1)
unf (0.1.4) unf (0.1.4)
unf_ext unf_ext
@ -491,7 +491,7 @@ DEPENDENCIES
daemons-rails (= 1.2.1) daemons-rails (= 1.2.1)
data_migrate! data_migrate!
database_cleaner database_cleaner
devise (= 3.5.4) devise (= 4.4.3)
digidoc_client! digidoc_client!
epp (= 1.5.0)! epp (= 1.5.0)!
epp-xml (= 1.1.0)! epp-xml (= 1.1.0)!
@ -522,7 +522,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.7.1) rails (= 4.2.10)
rails-settings-cached (= 0.4.1) rails-settings-cached (= 0.4.1)
ransack (= 1.5.1) ransack (= 1.5.1)
rest-client rest-client
@ -542,4 +542,4 @@ DEPENDENCIES
whenever (= 0.9.4) whenever (= 0.9.4)
BUNDLED WITH BUNDLED WITH
1.14.6 1.16.1

View file

@ -59,5 +59,6 @@ module Repp
mount Repp::AccountV1 mount Repp::AccountV1
mount Repp::DomainTransfersV1 mount Repp::DomainTransfersV1
mount Repp::NameserversV1 mount Repp::NameserversV1
mount Repp::DomainContactsV1
end end
end end

View file

@ -0,0 +1,47 @@
module Repp
class DomainContactsV1 < Grape::API
version 'v1', using: :path
resource :domains do
resource :contacts do
patch '/' do
current_contact = current_user.registrar.contacts
.find_by(code: params[:current_contact_id])
new_contact = current_user.registrar.contacts.find_by(code: params[:new_contact_id])
unless current_contact
error!({ error: { type: 'invalid_request_error',
param: 'current_contact_id',
message: "No such contact: #{params[:current_contact_id]}"} },
:bad_request)
end
unless new_contact
error!({ error: { type: 'invalid_request_error',
param: 'new_contact_id',
message: "No such contact: #{params[:new_contact_id]}" } },
:bad_request)
end
if new_contact.invalid?
error!({ error: { type: 'invalid_request_error',
param: 'new_contact_id',
message: 'New contact must be valid' } },
:bad_request)
end
if current_contact == new_contact
error!({ error: { type: 'invalid_request_error',
message: 'New contact ID must be different from current' \
' contact ID' } },
:bad_request)
end
affected_domains, skipped_domains = TechDomainContact
.replace(current_contact, new_contact)
@response = { affected_domains: affected_domains, skipped_domains: skipped_domains }
end
end
end
end
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View file

@ -0,0 +1,9 @@
(function() {
function initPopover() {
$(function () {
$('[data-toggle="popover"]').popover();
})
}
initPopover();
})();

View file

@ -7,6 +7,8 @@
#= require select2 #= require select2
#= require datepicker #= require datepicker
#= require spell_check #= require spell_check
#= require popover
#= require text_field_trimmer
#= require shared/general #= require shared/general
#= require registrar/autocomplete #= require registrar/autocomplete
#= require registrar/application #= require registrar/application

View file

@ -0,0 +1,15 @@
(function () {
function trimTextFields() {
let selector = 'input[type=text], input[type=search], input[type=email], textarea';
let textFields = document.querySelectorAll(selector);
let listener = function () {
this.value = this.value.trim();
};
for (let field of textFields) {
field.addEventListener('change', listener);
}
}
trimTextFields();
})();

View file

@ -3,13 +3,11 @@ module Admin
load_and_authorize_resource load_and_authorize_resource
def index def index
params[:q] ||= {} params[:q] ||= {}
domains = BlockedDomain.all.order(:name) domains = BlockedDomain.all.order(:name)
@q = domains.search(params[:q]) @q = domains.search(params[:q])
@domains = @q.result.page(params[:page]) @domains = @q.result.page(params[:page])
@domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i.positive?
end end
def new def new

View file

@ -1,5 +1,7 @@
module Admin module Admin
class ContactVersionsController < BaseController class ContactVersionsController < BaseController
include ObjectVersionsHelper
load_and_authorize_resource load_and_authorize_resource
def index def index
@ -24,7 +26,7 @@ module Admin
versions = ContactVersion.includes(:item).where(whereS).order(created_at: :desc, id: :desc) versions = ContactVersion.includes(:item).where(whereS).order(created_at: :desc, id: :desc)
@q = versions.search(params[:q]) @q = versions.search(params[:q])
@versions = @q.result.page(params[:page]) @versions = @q.result.page(params[:page])
@versions = @versions.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 @versions = @versions.per(params[:results_per_page]) if params[:results_per_page].to_i.positive?
end end

View file

@ -22,7 +22,7 @@ module Admin
@contacts = @q.result.uniq.page(params[:page]) @contacts = @q.result.uniq.page(params[:page])
end end
@contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 @contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i.positive?
end end
def search def search

View file

@ -1,5 +1,7 @@
module Admin module Admin
class DomainVersionsController < BaseController class DomainVersionsController < BaseController
include ObjectVersionsHelper
load_and_authorize_resource load_and_authorize_resource
def index def index
@ -41,7 +43,7 @@ module Admin
versions = DomainVersion.includes(:item).where(whereS).order(created_at: :desc, id: :desc) versions = DomainVersion.includes(:item).where(whereS).order(created_at: :desc, id: :desc)
@q = versions.search(params[:q]) @q = versions.search(params[:q])
@versions = @q.result.page(params[:page]) @versions = @q.result.page(params[:page])
@versions = @versions.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 @versions = @versions.per(params[:results_per_page]) if params[:results_per_page].to_i.positive?
render "admin/domain_versions/archive" render "admin/domain_versions/archive"
end end

View file

@ -32,7 +32,7 @@ module Admin
end end
end end
@domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i.positive?
end end
# rubocop: enable Metrics/PerceivedComplexity # rubocop: enable Metrics/PerceivedComplexity

View file

@ -13,7 +13,7 @@ module Admin
@deposit = Deposit.new(deposit_params.merge(registrar: r)) @deposit = Deposit.new(deposit_params.merge(registrar: r))
@invoice = @deposit.issue_prepayment_invoice @invoice = @deposit.issue_prepayment_invoice
if @invoice && @invoice.persisted? if @invoice&.persisted?
flash[:notice] = t(:record_created) flash[:notice] = t(:record_created)
redirect_to [:admin, @invoice] redirect_to [:admin, @invoice]
else else

View file

@ -4,13 +4,11 @@ module Admin
before_action :set_domain, only: [:edit, :update] before_action :set_domain, only: [:edit, :update]
def index def index
params[:q] ||= {} params[:q] ||= {}
domains = ReservedDomain.all.order(:name) domains = ReservedDomain.all.order(:name)
@q = domains.search(params[:q]) @q = domains.search(params[:q])
@domains = @q.result.page(params[:page]) @domains = @q.result.page(params[:page])
@domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i.positive?
end end
def new def new

View file

@ -168,7 +168,7 @@ class EppController < ApplicationController
# validate legal document's type here because it may be in most of the requests # validate legal document's type here because it may be in most of the requests
@prefix = nil @prefix = nil
if element_count('extdata > legalDocument') > 0 if element_count('extdata > legalDocument').positive?
requires_attribute('extdata > legalDocument', 'type', values: LegalDocument::TYPES, policy: true) requires_attribute('extdata > legalDocument', 'type', values: LegalDocument::TYPES, policy: true)
end end
@ -279,7 +279,7 @@ class EppController < ApplicationController
def optional(selector, *validations) def optional(selector, *validations)
full_selector = [@prefix, selector].compact.join(' ') full_selector = [@prefix, selector].compact.join(' ')
el = params[:parsed_frame].css(full_selector).first el = params[:parsed_frame].css(full_selector).first
return unless el && el.text.present? return unless el&.text.present?
value = el.text value = el.text
validations.each do |x| validations.each do |x|

View file

@ -6,7 +6,7 @@ class Registrant::DomainsController < RegistrantController
@q = domains.search(params[:q]) @q = domains.search(params[:q])
@domains = @q.result.page(params[:page]) @domains = @q.result.page(params[:page])
end end
@domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i.positive?
end end
def show def show

View file

@ -1,3 +1,5 @@
# As non-GDPR compliant, this controller is deprecated. Needs to be replaced with one that relies
# on the REST WHOIS API.
class Registrant::WhoisController < RegistrantController class Registrant::WhoisController < RegistrantController
def index def index
authorize! :view, :registrant_whois authorize! :view, :registrant_whois

View file

@ -0,0 +1,20 @@
class Registrar
class BulkChangeController < DeppController
helper_method :available_contacts
def new
authorize! :manage, :repp
render file: 'registrar/bulk_change/new', locals: { active_tab: default_tab }
end
private
def available_contacts
current_user.registrar.contacts.order(:name).pluck(:name, :code)
end
def default_tab
:technical_contact
end
end
end

View file

@ -33,7 +33,7 @@ class Registrar
@contacts = @q.result(distinct: :true).page(params[:page]) @contacts = @q.result(distinct: :true).page(params[:page])
end end
@contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 @contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i.positive?
end end
def download_list def download_list

View file

@ -10,7 +10,7 @@ class Registrar
@deposit = Deposit.new(deposit_params.merge(registrar: current_user.registrar)) @deposit = Deposit.new(deposit_params.merge(registrar: current_user.registrar))
@invoice = @deposit.issue_prepayment_invoice @invoice = @deposit.issue_prepayment_invoice
if @invoice && @invoice.persisted? if @invoice&.persisted?
flash[:notice] = t(:please_pay_the_following_invoice) flash[:notice] = t(:please_pay_the_following_invoice)
redirect_to [:registrar, @invoice] redirect_to [:registrar, @invoice]
else else

View file

@ -1,5 +1,5 @@
class Registrar class Registrar
class DomainTransfersController < DeppController class DomainTransfersController < BulkChangeController
before_action do before_action do
authorize! :transfer, Depp::Domain authorize! :transfer, Depp::Domain
end end
@ -58,7 +58,7 @@ class Registrar
redirect_to registrar_domains_url redirect_to registrar_domains_url
else else
@api_errors = parsed_response[:errors] @api_errors = parsed_response[:errors]
render :new render file: 'registrar/bulk_change/new', locals: { active_tab: :bulk_transfer }
end end
else else
params[:request] = true # EPP domain:transfer "op" attribute params[:request] = true # EPP domain:transfer "op" attribute

View file

@ -40,7 +40,7 @@ class Registrar
end end
end end
@domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i.positive?
respond_to do |format| respond_to do |format|
format.html format.html

View file

@ -1,9 +1,5 @@
class Registrar class Registrar
class RegistrarNameserversController < DeppController class NameserversController < BulkChangeController
def edit
authorize! :manage, :repp
end
def update def update
authorize! :manage, :repp authorize! :manage, :repp
@ -52,7 +48,7 @@ class Registrar
redirect_to registrar_domains_url redirect_to registrar_domains_url
else else
@api_errors = parsed_response[:errors] @api_errors = parsed_response[:errors]
render :edit render file: 'registrar/bulk_change/new', locals: { active_tab: :nameserver }
end end
end end
end end

View file

@ -1,30 +1,34 @@
class Registrar class Registrar
class PaymentsController < BaseController class PaymentsController < BaseController
protect_from_forgery except: :back protect_from_forgery except: [:back, :callback]
skip_authorization_check # actually anyone can pay, no problems at all skip_authorization_check # actually anyone can pay, no problems at all
skip_before_action :authenticate_user!, :check_ip_restriction, only: [:back] skip_before_action :authenticate_user!, :check_ip_restriction, only: [:back, :callback]
before_action :check_bank before_action :check_supported_payment_method
# to handle existing model we should
# get invoice_id and then get number
# build BankTransaction without connection with right reference number
# do not connect transaction and invoice
def pay def pay
invoice = Invoice.find(params[:invoice_id]) invoice = Invoice.find(params[:invoice_id])
@bank_link = BankLink::Request.new(params[:bank], invoice, self) bank = params[:bank]
@bank_link.make_transaction opts = {
return_url: registrar_return_payment_with_url(
bank, invoice_id: invoice
),
response_url: registrar_response_payment_with_url(
bank, invoice_id: invoice
)
}
@payment = ::PaymentOrders.create_with_type(bank, invoice, opts)
@payment.create_transaction
end end
# connect invoice and transaction
# both back and IPN
def back def back
@bank_link = BankLink::Response.new(params[:bank], params) invoice = Invoice.find(params[:invoice_id])
if @bank_link.valid? && @bank_link.ok? opts = { response: params }
@bank_link.complete_payment @payment = ::PaymentOrders.create_with_type(params[:bank], invoice, opts)
if @payment.valid_response_from_intermediary? && @payment.settled_payment?
@payment.complete_transaction
if @bank_link.invoice.binded? if invoice.binded?
flash[:notice] = t(:pending_applied) flash[:notice] = t(:pending_applied)
else else
flash[:alert] = t(:something_wrong) flash[:alert] = t(:something_wrong)
@ -32,17 +36,31 @@ class Registrar
else else
flash[:alert] = t(:something_wrong) flash[:alert] = t(:something_wrong)
end end
redirect_to registrar_invoice_path(@bank_link.invoice) redirect_to registrar_invoice_path(invoice)
end
def callback
invoice = Invoice.find(params[:invoice_id])
opts = { response: params }
@payment = ::PaymentOrders.create_with_type(params[:bank], invoice, opts)
if @payment.valid_response_from_intermediary? && @payment.settled_payment?
@payment.complete_transaction
end
render status: 200, json: { status: 'ok' }
end end
private private
def banks def check_supported_payment_method
ENV['payments_banks'].split(",").map(&:strip) return if supported_payment_method?
raise StandardError.new("Not supported payment method")
end end
def check_bank
raise StandardError.new("Not Implemented bank") unless banks.include?(params[:bank]) def supported_payment_method?
PaymentOrders::PAYMENT_METHODS.include?(params[:bank])
end end
end end
end end

View file

@ -0,0 +1,59 @@
class Registrar
class TechContactsController < BulkChangeController
def update
authorize! :manage, :repp
uri = URI.parse("#{ENV['repp_url']}domains/contacts")
request = Net::HTTP::Patch.new(uri)
request.set_form_data(current_contact_id: params[:current_contact_id],
new_contact_id: params[:new_contact_id])
request.basic_auth(current_user.username, current_user.password)
if Rails.env.test?
response = Net::HTTP.start(uri.hostname, uri.port,
use_ssl: (uri.scheme == 'https'),
verify_mode: OpenSSL::SSL::VERIFY_NONE) do |http|
http.request(request)
end
elsif Rails.env.development?
client_cert = File.read(ENV['cert_path'])
client_key = File.read(ENV['key_path'])
response = Net::HTTP.start(uri.hostname, uri.port,
use_ssl: (uri.scheme == 'https'),
verify_mode: OpenSSL::SSL::VERIFY_NONE,
cert: OpenSSL::X509::Certificate.new(client_cert),
key: OpenSSL::PKey::RSA.new(client_key)) do |http|
http.request(request)
end
else
client_cert = File.read(ENV['cert_path'])
client_key = File.read(ENV['key_path'])
response = Net::HTTP.start(uri.hostname, uri.port,
use_ssl: (uri.scheme == 'https'),
cert: OpenSSL::X509::Certificate.new(client_cert),
key: OpenSSL::PKey::RSA.new(client_key)) do |http|
http.request(request)
end
end
parsed_response = JSON.parse(response.body, symbolize_names: true)
if response.code == '200'
notices = [t('.replaced')]
notices << "#{t('.affected_domains')}: #{parsed_response[:affected_domains].join(', ')}"
if parsed_response[:skipped_domains]
notices << "#{t('.skipped_domains')}: #{parsed_response[:skipped_domains].join(', ')}"
end
flash[:notice] = notices
redirect_to registrar_domains_url
else
@error = parsed_response[:error]
render file: 'registrar/bulk_change/new', locals: { active_tab: :technical_contact }
end
end
end
end

View file

@ -0,0 +1,15 @@
module ObjectVersionsHelper
def attach_existing_fields(version, new_object)
version.object_changes.to_h.each do |key, value|
method_name = "#{key}=".to_sym
if new_object.respond_to?(method_name)
new_object.public_send(method_name, value.last)
end
end
end
def only_present_fields(version, model)
field_names = model.column_names
version.object.to_h.select { |key, _value| field_names.include?(key) }
end
end

View file

@ -51,4 +51,4 @@ class UpdateWhoisRecordJob < Que::Job
def delete_blocked(name) def delete_blocked(name)
delete_reserved(name) delete_reserved(name)
end end
end end

View file

@ -13,9 +13,9 @@ class Ability
case @user.class.to_s case @user.class.to_s
when 'AdminUser' when 'AdminUser'
@user.roles.each { |role| send(role) } if @user.roles @user.roles&.each { |role| send(role) }
when 'ApiUser' when 'ApiUser'
@user.roles.each { |role| send(role) } if @user.roles @user.roles&.each { |role| send(role) }
when 'RegistrantUser' when 'RegistrantUser'
static_registrant static_registrant
end end

View file

@ -1,158 +0,0 @@
class BankLink
module Base
def prepend_size(value)
value = (value || "").to_s.strip
string = ""
string << sprintf("%03i", value.size)
string << value
end
end
class Request
include Base
include ActionView::Helpers::NumberHelper
# need controller here in order to handle random ports and domains
# I don't want to do it but has to
attr_accessor :type, :invoice, :controller
def initialize(type, invoice, controller)
@type, @invoice, @controller = type, invoice, controller
end
def url
ENV["payments_#{type}_url"]
end
def fields
@fields ||= (hash = {}
hash["VK_SERVICE"] = "1012"
hash["VK_VERSION"] = "008"
hash["VK_SND_ID"] = ENV["payments_#{type}_seller_account"]
hash["VK_STAMP"] = invoice.number
hash["VK_AMOUNT"] = number_with_precision(invoice.total, :precision => 2, :separator => ".")
hash["VK_CURR"] = invoice.currency
hash["VK_REF"] = ""
hash["VK_MSG"] = invoice.order
hash["VK_RETURN"] = controller.registrar_return_payment_with_url(type)
hash["VK_CANCEL"] = controller.registrar_return_payment_with_url(type)
hash["VK_DATETIME"] = Time.now.strftime("%Y-%m-%dT%H:%M:%S%z")
hash["VK_MAC"] = calc_mac(hash)
hash["VK_ENCODING"] = "UTF-8"
hash["VK_LANG"] = "ENG"
hash)
end
def calc_mac(fields)
pars = %w(VK_SERVICE VK_VERSION VK_SND_ID VK_STAMP VK_AMOUNT VK_CURR VK_REF
VK_MSG VK_RETURN VK_CANCEL VK_DATETIME).freeze
data = pars.map{|e| prepend_size(fields[e]) }.join
sign(data)
end
def make_transaction
transaction = BankTransaction.where(description: fields["VK_MSG"]).first_or_initialize(
reference_no: invoice.reference_no,
currency: invoice.currency,
iban: invoice.seller_iban
)
transaction.save!
end
private
def sign(data)
private_key = OpenSSL::PKey::RSA.new(File.read(ENV["payments_#{type}_seller_private"]))
signed_data = private_key.sign(OpenSSL::Digest::SHA1.new, data)
signed_data = Base64.encode64(signed_data).gsub(/\n|\r/, '')
signed_data
end
end
class Response
include Base
include ActionView::Helpers::NumberHelper
attr_accessor :type, :params, :invoice
def initialize(type, params)
@type, @params = type, params
@invoice = Invoice.find_by(number: params["VK_STAMP"]) if params["VK_STAMP"].present?
end
def valid?
!!validate
end
def ok?
params["VK_SERVICE"] == "1111"
end
def complete_payment
if valid?
transaction = BankTransaction.find_by(description: params["VK_MSG"])
transaction.sum = BigDecimal.new(params["VK_AMOUNT"].to_s)
transaction.bank_reference = params['VK_T_NO']
transaction.buyer_bank_code = params["VK_SND_ID"]
transaction.buyer_iban = params["VK_SND_ACC"]
transaction.buyer_name = params["VK_SND_NAME"]
transaction.paid_at = Time.parse(params["VK_T_DATETIME"])
transaction.save!
transaction.autobind_invoice
end
end
def validate
case params["VK_SERVICE"]
when "1111"
validate_success && validate_amount && validate_currency
when "1911"
validate_cancel
else
false
end
end
def validate_success
pars = %w(VK_SERVICE VK_VERSION VK_SND_ID VK_REC_ID VK_STAMP VK_T_NO VK_AMOUNT VK_CURR
VK_REC_ACC VK_REC_NAME VK_SND_ACC VK_SND_NAME VK_REF VK_MSG VK_T_DATETIME).freeze
@validate_success ||= (
data = pars.map{|e| prepend_size(params[e]) }.join
verify_mac(data, params["VK_MAC"])
)
end
def validate_cancel
pars = %w(VK_SERVICE VK_VERSION VK_SND_ID VK_REC_ID VK_STAMP VK_REF VK_MSG).freeze
@validate_cancel ||= (
data = pars.map{|e| prepend_size(params[e]) }.join
verify_mac(data, params["VK_MAC"])
)
end
def validate_amount
source = number_with_precision(BigDecimal.new(params["VK_AMOUNT"].to_s), precision: 2, separator: ".")
target = number_with_precision(invoice.total, precision: 2, separator: ".")
source == target
end
def validate_currency
invoice.currency == params["VK_CURR"]
end
def verify_mac(data, mac)
bank_public_key = OpenSSL::X509::Certificate.new(File.read(ENV["payments_#{type}_bank_certificate"])).public_key
bank_public_key.verify(OpenSSL::Digest::SHA1.new, Base64.decode64(mac), data)
end
end
end

View file

@ -45,8 +45,10 @@ class Directo < ActiveRecord::Base
end end
data = builder.to_xml.gsub("\n",'') 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 Rails.logger.info("[Directo] XML request: #{data}")
dump_result_to_db(mappers, response) response = RestClient::Request.execute(url: ENV['directo_invoice_url'], method: :post, payload: {put: "1", what: "invoice", xmldata: data}, verify_ssl: false)
Rails.logger.info("[Directo] Directo responded with code: #{response.code}, body: #{response.body}")
dump_result_to_db(mappers, response.to_s)
end end
STDOUT << "#{Time.zone.now.utc} - Directo receipts sending finished. #{counter} of #{total} are sent\n" STDOUT << "#{Time.zone.now.utc} - Directo receipts sending finished. #{counter} of #{total} are sent\n"
@ -165,11 +167,15 @@ class Directo < ActiveRecord::Base
end end
data = builder.to_xml.gsub("\n",'') data = builder.to_xml.gsub("\n",'')
Rails.logger.info("[Directo] XML request: #{data}")
if debug if debug
STDOUT << "#{Time.zone.now.utc} - Directo xml had to be sent #{data}\n" STDOUT << "#{Time.zone.now.utc} - Directo xml had to be sent #{data}\n"
else else
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)
Rails.logger.info("[Directo] Directo responded with code: #{response.code}, body: #{response.body}")
response = response.to_s
Setting.directo_monthly_number_last = directo_next Setting.directo_monthly_number_last = directo_next
Nokogiri::XML(response).css("Result").each do |res| Nokogiri::XML(response).css("Result").each do |res|
Directo.create!(request: data, response: res.as_json.to_h, invoice_number: directo_next) Directo.create!(request: data, response: res.as_json.to_h, invoice_number: directo_next)
@ -190,4 +196,3 @@ class Directo < ActiveRecord::Base
@pricelists[account_activity.price_id] = account_activity.price @pricelists[account_activity.price_id] = account_activity.price
end end
end end

View file

@ -147,7 +147,7 @@ class Epp::Contact < Contact
end end
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&.persisted?
self.legal_document_id = doc.id self.legal_document_id = doc.id
end end
@ -238,7 +238,7 @@ class Epp::Contact < Contact
) )
self.legal_documents = [doc] self.legal_documents = [doc]
frame.css("legalDocument").first.content = doc.path if doc && doc.persisted? frame.css("legalDocument").first.content = doc.path if doc&.persisted?
self.legal_document_id = doc.id self.legal_document_id = doc.id
end end

View file

@ -197,7 +197,7 @@ class Epp::Domain < Domain
) )
self.legal_documents = [doc] self.legal_documents = [doc]
frame.css("legalDocument").first.content = doc.path if doc && doc.persisted? frame.css("legalDocument").first.content = doc.path if doc&.persisted?
self.legal_document_id = doc.id self.legal_document_id = doc.id
end end
# rubocop: enable Metrics/PerceivedComplexity # rubocop: enable Metrics/PerceivedComplexity
@ -472,7 +472,7 @@ class Epp::Domain < Domain
at.deep_merge!(attrs_from(frame.css('rem'), current_user, 'rem')) at.deep_merge!(attrs_from(frame.css('rem'), current_user, 'rem'))
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&.persisted?
self.legal_document_id = doc.id self.legal_document_id = doc.id
end end
@ -547,7 +547,7 @@ class Epp::Domain < Domain
check_discarded check_discarded
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&.persisted?
end end
if Setting.request_confirmation_on_domain_deletion_enabled && if Setting.request_confirmation_on_domain_deletion_enabled &&

View file

@ -6,7 +6,8 @@ class LegalDocument < ActiveRecord::Base
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
TYPES = %w(pdf bdoc ddoc zip rar gz tar 7z odt doc docx).freeze TYPES = %w(pdf asice asics sce scs adoc edoc bdoc ddoc zip rar gz tar 7z odt
doc docx).freeze
end end
attr_accessor :body attr_accessor :body

View file

@ -0,0 +1,15 @@
module PaymentOrders
PAYMENT_INTERMEDIARIES = ENV['payments_intermediaries'].to_s.strip.split(', ').freeze
PAYMENT_BANKLINK_BANKS = ENV['payments_banks'].to_s.strip.split(', ').freeze
PAYMENT_METHODS = [PAYMENT_INTERMEDIARIES, PAYMENT_BANKLINK_BANKS].flatten.freeze
def self.create_with_type(type, invoice, opts = {})
raise ArgumentError unless PAYMENT_METHODS.include?(type)
if PAYMENT_BANKLINK_BANKS.include?(type)
BankLink.new(type, invoice, opts)
elsif type == 'every_pay'
EveryPay.new(type, invoice, opts)
end
end
end

View file

@ -0,0 +1,146 @@
module PaymentOrders
class BankLink < Base
BANK_LINK_VERSION = '008'
NEW_TRANSACTION_SERVICE_NUMBER = '1012'
SUCCESSFUL_PAYMENT_SERVICE_NUMBER = '1111'
CANCELLED_PAYMENT_SERVICE_NUMBER = '1911'
NEW_MESSAGE_KEYS = %w(VK_SERVICE VK_VERSION VK_SND_ID VK_STAMP VK_AMOUNT
VK_CURR VK_REF VK_MSG VK_RETURN VK_CANCEL
VK_DATETIME).freeze
SUCCESS_MESSAGE_KEYS = %w(VK_SERVICE VK_VERSION VK_SND_ID VK_REC_ID VK_STAMP
VK_T_NO VK_AMOUNT VK_CURR VK_REC_ACC VK_REC_NAME
VK_SND_ACC VK_SND_NAME VK_REF VK_MSG
VK_T_DATETIME).freeze
CANCEL_MESSAGE_KEYS = %w(VK_SERVICE VK_VERSION VK_SND_ID VK_REC_ID VK_STAMP
VK_REF VK_MSG).freeze
def form_fields
hash = {}
hash["VK_SERVICE"] = NEW_TRANSACTION_SERVICE_NUMBER
hash["VK_VERSION"] = BANK_LINK_VERSION
hash["VK_SND_ID"] = seller_account
hash["VK_STAMP"] = invoice.number
hash["VK_AMOUNT"] = number_with_precision(invoice.total, precision: 2, separator: ".")
hash["VK_CURR"] = invoice.currency
hash["VK_REF"] = ""
hash["VK_MSG"] = invoice.order
hash["VK_RETURN"] = return_url
hash["VK_CANCEL"] = return_url
hash["VK_DATETIME"] = Time.zone.now.strftime("%Y-%m-%dT%H:%M:%S%z")
hash["VK_MAC"] = calc_mac(hash)
hash["VK_ENCODING"] = "UTF-8"
hash["VK_LANG"] = "ENG"
hash
end
def valid_response_from_intermediary?
return false unless response
case response["VK_SERVICE"]
when SUCCESSFUL_PAYMENT_SERVICE_NUMBER
valid_successful_transaction?
when CANCELLED_PAYMENT_SERVICE_NUMBER
valid_cancel_notice?
else
false
end
end
def complete_transaction
return unless valid_successful_transaction?
transaction = BankTransaction.find_by(
description: invoice.order,
currency: invoice.currency,
iban: invoice.seller_iban
)
transaction.sum = response['VK_AMOUNT']
transaction.bank_reference = response['VK_T_NO']
transaction.buyer_bank_code = response["VK_SND_ID"]
transaction.buyer_iban = response["VK_SND_ACC"]
transaction.buyer_name = response["VK_SND_NAME"]
transaction.paid_at = Time.parse(response["VK_T_DATETIME"])
transaction.save!
transaction.autobind_invoice
end
def settled_payment?
response["VK_SERVICE"] == SUCCESSFUL_PAYMENT_SERVICE_NUMBER
end
private
def valid_successful_transaction?
valid_success_notice? && valid_amount? && valid_currency?
end
def valid_cancel_notice?
valid_mac?(response, CANCEL_MESSAGE_KEYS)
end
def valid_success_notice?
valid_mac?(response, SUCCESS_MESSAGE_KEYS)
end
def valid_amount?
source = number_with_precision(
BigDecimal.new(response["VK_AMOUNT"]), precision: 2, separator: "."
)
target = number_with_precision(
invoice.total, precision: 2, separator: "."
)
source == target
end
def valid_currency?
invoice.currency == response["VK_CURR"]
end
def sign(data)
private_key = OpenSSL::PKey::RSA.new(File.read(seller_certificate))
signed_data = private_key.sign(OpenSSL::Digest::SHA1.new, data)
signed_data = Base64.encode64(signed_data).gsub(/\n|\r/, '')
signed_data
end
def calc_mac(fields)
pars = NEW_MESSAGE_KEYS
data = pars.map { |element| prepend_size(fields[element]) }.join
sign(data)
end
def valid_mac?(hash, keys)
data = keys.map { |element| prepend_size(hash[element]) }.join
verify_mac(data, hash["VK_MAC"])
end
def verify_mac(data, mac)
bank_public_key = OpenSSL::X509::Certificate.new(File.read(bank_certificate)).public_key
bank_public_key.verify(OpenSSL::Digest::SHA1.new, Base64.decode64(mac), data)
end
def prepend_size(value)
value = (value || "").to_s.strip
string = ""
string << format("%03i", value.size)
string << value
end
def seller_account
ENV["payments_#{type}_seller_account"]
end
def seller_certificate
ENV["payments_#{type}_seller_private"]
end
def bank_certificate
ENV["payments_#{type}_bank_certificate"]
end
end
end

View file

@ -0,0 +1,33 @@
module PaymentOrders
class Base
include ActionView::Helpers::NumberHelper
attr_reader :type,
:invoice,
:return_url,
:response_url,
:response
def initialize(type, invoice, opts = {})
@type = type
@invoice = invoice
@return_url = opts[:return_url]
@response_url = opts[:response_url]
@response = opts[:response]
end
def create_transaction
transaction = BankTransaction.where(description: invoice.order).first_or_initialize(
reference_no: invoice.reference_no,
currency: invoice.currency,
iban: invoice.seller_iban
)
transaction.save!
end
def form_url
ENV["payments_#{type}_url"]
end
end
end

View file

@ -0,0 +1,84 @@
module PaymentOrders
class EveryPay < Base
USER = ENV['payments_every_pay_api_user'].freeze
KEY = ENV['payments_every_pay_api_key'].freeze
ACCOUNT_ID = ENV['payments_every_pay_seller_account'].freeze
SUCCESSFUL_PAYMENT = %w(settled authorized).freeze
def form_fields
base_json = base_params
base_json[:nonce] = SecureRandom.hex(15)
hmac_fields = (base_json.keys + ['hmac_fields']).sort.uniq!
base_json[:hmac_fields] = hmac_fields.join(',')
hmac_string = hmac_fields.map { |key, _v| "#{key}=#{base_json[key]}" }.join('&')
hmac = OpenSSL::HMAC.hexdigest('sha1', KEY, hmac_string)
base_json[:hmac] = hmac
base_json
end
def valid_response_from_intermediary?
return false unless response
valid_hmac? && valid_amount? && valid_account?
end
def settled_payment?
SUCCESSFUL_PAYMENT.include?(response[:payment_state])
end
def complete_transaction
return unless valid_response_from_intermediary? && settled_payment?
transaction = BankTransaction.find_by(
description: invoice.order,
currency: invoice.currency,
iban: invoice.seller_iban
)
transaction.sum = response[:amount]
transaction.paid_at = Date.strptime(response[:timestamp], '%s')
transaction.buyer_name = response[:cc_holder_name]
transaction.save!
transaction.autobind_invoice
end
private
def base_params
{
api_username: USER,
account_id: ACCOUNT_ID,
timestamp: Time.now.to_i.to_s,
callback_url: response_url,
customer_url: return_url,
amount: number_with_precision(invoice.total, precision: 2),
order_reference: SecureRandom.hex(15),
transaction_type: 'charge',
hmac_fields: ''
}.with_indifferent_access
end
def valid_hmac?
hmac_fields = response[:hmac_fields].split(',')
hmac_hash = {}
hmac_fields.map do |field|
symbol = field.to_sym
hmac_hash[symbol] = response[symbol]
end
hmac_string = hmac_hash.map { |key, _v| "#{key}=#{hmac_hash[key]}" }.join('&')
expected_hmac = OpenSSL::HMAC.hexdigest('sha1', KEY, hmac_string)
expected_hmac == response[:hmac]
end
def valid_amount?
invoice.total == BigDecimal.new(response[:amount])
end
def valid_account?
response[:account_id] == ACCOUNT_ID
end
end
end

View file

@ -1,2 +1,23 @@
class TechDomainContact < DomainContact class TechDomainContact < DomainContact
# Audit log is needed, therefore no raw SQL
def self.replace(current_contact, new_contact)
affected_domains = []
skipped_domains = []
tech_contacts = where(contact: current_contact)
transaction do
tech_contacts.each do |tech_contact|
if tech_contact.domain.discarded?
skipped_domains << tech_contact.domain.name
next
end
tech_contact.contact = new_contact
tech_contact.save!
affected_domains << tech_contact.domain.name
end
end
return affected_domains.sort, skipped_domains.sort
end
end end

View file

@ -36,6 +36,7 @@ class WhoisRecord < ActiveRecord::Base
registrant = domain.registrant registrant = domain.registrant
@disclosed = [] @disclosed = []
h[:disclaimer] = disclaimer_text if disclaimer_text.present?
h[:name] = domain.name h[:name] = domain.name
h[:status] = domain.statuses.map { |x| status_map[x] || x } h[:status] = domain.statuses.map { |x| status_map[x] || x }
h[:registered] = domain.registered_at.try(:to_s, :iso8601) h[:registered] = domain.registered_at.try(:to_s, :iso8601)
@ -120,4 +121,10 @@ class WhoisRecord < ActiveRecord::Base
def destroy_whois_record def destroy_whois_record
Whois::Record.where(name: name).delete_all Whois::Record.where(name: name).delete_all
end end
private
def disclaimer_text
Setting.registry_whois_disclaimer
end
end end

View file

@ -37,7 +37,7 @@ class DomainNameValidator < ActiveModel::EachValidator
def validate_blocked(value) def validate_blocked(value)
return true unless value return true unless value
return false if BlockedDomain.where(name: value).count > 0 return false if BlockedDomain.where(name: value).count.positive?
DNS::Zone.where(origin: value).count.zero? DNS::Zone.where(origin: value).count.zero?
end end
end end

View file

@ -57,8 +57,9 @@
%tbody %tbody
- @versions.each do |version| - @versions.each do |version|
- if version - if version
- contact = Contact.new(version.object.to_h) - attributes = only_present_fields(version, Contact)
- version.object_changes.to_h.each { |k,v| contact.public_send("#{k}=", v.last) } - contact = Contact.new(attributes)
- attach_existing_fields(version, contact)
%tr %tr
%td= link_to(contact.name, admin_contact_version_path(version.id)) %td= link_to(contact.name, admin_contact_version_path(version.id))

View file

@ -1,5 +1,6 @@
- contact = Contact.new(@version.object.to_h) - attributes = only_present_fields(@version, Contact)
- @version.object_changes.to_h.each { |k,v| contact.public_send("#{k}=", v.last ) } - contact = Contact.new(attributes)
- attach_existing_fields(@version, contact)
= render 'shared/title', name: contact.name = render 'shared/title', name: contact.name
.row .row
@ -41,11 +42,11 @@
%br %br
%dt= t(:created) %dt= t(:created_at)
%dd{class: changing_css_class(@version,"created_at")} %dd{class: changing_css_class(@version,"created_at")}
= l(contact.created_at, format: :short) = l(contact.created_at, format: :short)
%dt= t(:updated) %dt= t(:updated_at)
%dd{class: changing_css_class(@version,"updated_at")} %dd{class: changing_css_class(@version,"updated_at")}
= l(contact.updated_at, format: :short) = l(contact.updated_at, format: :short)
@ -61,7 +62,7 @@
- if contact.street.present? - if contact.street.present?
%dt= t(:street) %dt= t(:street)
%dd{class: changing_css_class(@version,"street")}= contact.street.to_s.gsub("\n", '<br>').html_safe %dd{class: changing_css_class(@version,"street")}= contact.street
- if contact.city.present? - if contact.city.present?
%dt= t(:city) %dt= t(:city)

View file

@ -55,8 +55,9 @@
%tbody %tbody
- @versions.each do |version| - @versions.each do |version|
- if version - if version
- domain = Domain.new(version.object.to_h) - attributes = only_present_fields(version, Domain)
- version.object_changes.to_h.each{|k,v| domain.public_send("#{k}=", v.last) } - domain = Domain.new(attributes)
- attach_existing_fields(version, domain)
%tr %tr
%td= link_to(domain.name, admin_domain_version_path(version.id)) %td= link_to(domain.name, admin_domain_version_path(version.id))

View file

@ -1,5 +1,6 @@
- domain = Domain.new(@version.object.to_h) - present_fields = only_present_fields(@version, Domain)
- @version.object_changes.to_h.each{|k,v| domain.public_send("#{k}=", v.last) } - domain = Domain.new(present_fields)
- attach_existing_fields(@version, domain)
- if @version - if @version
- children = HashWithIndifferentAccess.new(@version.children) - children = HashWithIndifferentAccess.new(@version.children)

View file

@ -99,6 +99,7 @@
= render 'setting_row', var: :registry_state = render 'setting_row', var: :registry_state
= render 'setting_row', var: :registry_zip = render 'setting_row', var: :registry_zip
= render 'setting_row', var: :registry_country_code = render 'setting_row', var: :registry_country_code
= render 'setting_row', var: :registry_whois_disclaimer
.row .row
.col-md-12.text-right .col-md-12.text-right

View file

@ -1,7 +1,11 @@
<% if flash[:notice] %> <% if flash[:notice] %>
<div class="alert alert-success alert-dismissible"> <div class="alert alert-success alert-dismissible">
<button class="close" data-dismiss="alert" type=button><span>&times;</span></button> <button class="close" data-dismiss="alert" type=button><span>&times;</span></button>
<p><%= flash[:notice] %></p> <% if flash[:notice].respond_to?(:join) %>
<p><%= flash[:notice].join('<br>').html_safe %></p>
<% else %>
<p><%= flash[:notice] %></p>
<% end %>
</div> </div>
<% end %> <% end %>

View file

@ -22,7 +22,7 @@ xml.epp_head do
xml.tag!('domain:contact', ac.code, 'type' => 'admin') xml.tag!('domain:contact', ac.code, 'type' => 'admin')
end end
if @nameservers && @nameservers.any? if @nameservers&.any?
xml.tag!('domain:ns') do xml.tag!('domain:ns') do
@nameservers.each do |x| @nameservers.each do |x|
xml.tag!('domain:hostAttr') do xml.tag!('domain:hostAttr') do

View file

@ -1,3 +1,6 @@
<%- if json['disclaimer'].present? -%>
<%= json['disclaimer'].scan(/\S.{0,72}\S(?=\s|$)|\S+/).join("\n") %>
<%- end -%>
Estonia .ee Top Level Domain WHOIS server Estonia .ee Top Level Domain WHOIS server
Domain: Domain:
@ -23,18 +26,18 @@ changed: <%= json['registrant_changed'].to_s.tr('T',' ').sub('+', ' +') %>
<%- if json['admin_contacts'].present? -%> <%- if json['admin_contacts'].present? -%>
Administrative contact: Administrative contact:
<%- for contact in json['admin_contacts'] -%> <%- for contact in json['admin_contacts'] -%>
name: <%= contact['name'] %> name: Not Disclosed
email: Not Disclosed - Visit www.internet.ee for webbased WHOIS email: Not Disclosed - Visit www.internet.ee for webbased WHOIS
changed: <%= contact['changed'].to_s.tr('T',' ').sub('+', ' +') %> changed: Not Disclosed
<%- end -%> <%- end -%>
<%- end -%> <%- end -%>
<% if json['tech_contacts'].present? %> <% if json['tech_contacts'].present? %>
Technical contact: Technical contact:
<%- for contact in json['tech_contacts'] -%> <%- for contact in json['tech_contacts'] -%>
name: <%= contact['name'] %> name: Not Disclosed
email: Not Disclosed - Visit www.internet.ee for webbased WHOIS email: Not Disclosed - Visit www.internet.ee for webbased WHOIS
changed: <%= contact['changed'].to_s.tr('T',' ').sub('+', ' +') %> changed: Not Disclosed
<%- end -%> <%- end -%>
<%- end -%> <%- end -%>

View file

@ -1,54 +0,0 @@
!!! 5
%html{lang: I18n.locale.to_s}
%head
%meta{charset: "utf-8"}/
%meta{content: "width=device-width, initial-scale=1", name: "viewport"}/
- if content_for? :head_title
= yield :head_title
- else
%title= t(:registrant_head_title)
= csrf_meta_tags
= stylesheet_link_tag 'registrant-manifest', media: 'all'
= favicon_link_tag 'favicon.ico'
%body
/ Fixed navbar
%nav.navbar.navbar-default.navbar-fixed-top
.container
.navbar-header
%button.navbar-toggle.collapsed{"aria-controls" => "navbar", "aria-expanded" => "false", "data-target" => "#navbar", "data-toggle" => "collapse", :type => "button"}
%span.sr-only Toggle navigation
%span.icon-bar
%span.icon-bar
%span.icon-bar
= link_to registrant_root_path, class: 'navbar-brand' do
= t(:registrant_head_title)
- if unstable_env.present?
.text-center
%small{style: 'color: #0074B3;'}= unstable_env
- if current_user
.navbar-collapse.collapse
%ul.nav.navbar-nav.public-nav
- if can? :view, Depp::Domain
- active_class = %w(registrant/domains registrant/check registrant/renew registrant/tranfer registrant/keyrelays).include?(params[:controller]) ? 'active' :nil
%li{class: active_class}= link_to t(:domains), registrant_domains_path
- active_class = %w(registrant/whois).include?(params[:controller]) ? 'active' :nil
%li{class: active_class}= link_to t(:whois), registrant_whois_path
%ul.nav.navbar-nav.navbar-right
- if user_signed_in?
%li= link_to t(:log_out, user: current_user), '/registrant/logout'
.container
= render 'shared/flash'
= yield
%footer.footer
.container
.row
.col-md-6
= image_tag 'eis-logo-et.png'
.col-md-6.text-right
Version
= CURRENT_COMMIT_HASH
= javascript_include_tag 'registrant-manifest', async: true

View file

@ -0,0 +1,84 @@
<!DOCTYPE html>
<html lang="<%= I18n.locale.to_s %>">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<% if content_for? :head_title %>
<%= yield :head_title %>
<% else %>
<title>
<%= t(:registrant_head_title) %>
</title>
<% end %>
<%= csrf_meta_tags %>
<%= stylesheet_link_tag 'registrant-manifest', media: 'all' %>
<%= favicon_link_tag 'favicon.ico' %>
</head>
<body>
<!-- Fixed navbar
-->
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button aria-expanded="false" class="navbar-toggle collapsed" data-target="#navbar" data-toggle="collapse" type="button">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<%= link_to registrant_root_path, class: 'navbar-brand' do %>
<%= t(:registrant_head_title) %>
<% if unstable_env.present? %>
<div class="text-center">
<small style="color: #0074B3;">
<%= unstable_env %>
</small>
</div>
<% end %>
<% end %>
</div>
<% if current_user %>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav public-nav">
<% if can? :view, Depp::Domain %>
<% active_class = %w(registrant/domains registrant/check registrant/renew registrant/tranfer registrant/keyrelays).include?(params[:controller]) ? 'active' :nil %>
<li class="<%= active_class %>">
<%= link_to t(:domains), registrant_domains_path %>
</li>
<% end %>
<% active_class = %w(registrant/whois).include?(params[:controller]) ? 'active' :nil %>
<li class="<%= active_class %>">
<%= link_to 'Internet.ee', 'https://internet.ee' %>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
<% if user_signed_in? %>
<li>
<%= link_to t(:log_out, user: current_user), '/registrant/logout' %>
</li>
<% end %>
</ul>
</div>
<% end %>
</div>
</nav>
<div class="container">
<%= render 'shared/flash' %>
<%= yield %>
</div>
<footer class="footer">
<div class="container">
<div class="row">
<div class="col-md-6">
<%= image_tag 'eis-logo-et.png' %>
</div>
<div class="col-md-6 text-right">
Version
<%= CURRENT_COMMIT_HASH %>
</div>
</div>
</div>
</footer>
<%= javascript_include_tag 'registrant-manifest', async: true %>
</body>
</html>

View file

@ -18,7 +18,7 @@
<nav class="navbar navbar-default navbar-fixed-top"> <nav class="navbar navbar-default navbar-fixed-top">
<div class="container"> <div class="container">
<div class="navbar-header"> <div class="navbar-header">
<button aria-controls="navbar" aria-expanded="false" class="navbar-toggle collapsed" data-target="#navbar" data-toggle="collapse" type="button"> <button aria-expanded="false" class="navbar-toggle collapsed" data-target="#navbar" data-toggle="collapse" type="button">
<span class="sr-only">Toggle navigation</span> <span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
@ -39,7 +39,7 @@
</div> </div>
</nav> </nav>
<div class="container"> <div class="container">
<%= render 'shared/flash' %> <%= render 'flash_messages' %>
<% if depp_controller? %> <% if depp_controller? %>
<%= render 'registrar/shared/epp_results' %> <%= render 'registrar/shared/epp_results' %>
<% end %> <% end %>

View file

@ -1,45 +0,0 @@
!!! 5
%html{lang: I18n.locale.to_s}
%head
%meta{charset: "utf-8"}/
%meta{content: "IE=edge", "http-equiv" => "X-UA-Compatible"}/
%meta{content: "width=device-width, initial-scale=1", name: "viewport"}/
- if content_for? :head_title
= yield :head_title
- else
%title= t(:registrar_head_title)
= csrf_meta_tags
= stylesheet_link_tag 'registrar-manifest', media: 'all'
= javascript_include_tag 'registrar-manifest'
= favicon_link_tag 'favicon.ico'
%body
%nav.navbar.navbar-default.navbar-fixed-top
.container
.navbar-header
%button.navbar-toggle.collapsed{"aria-controls" => "navbar", "aria-expanded" => "false", "data-target" => "#navbar", "data-toggle" => "collapse", :type => "button"}
%span.sr-only Toggle navigation
%span.icon-bar
%span.icon-bar
%span.icon-bar
= link_to registrar_root_path, class: 'navbar-brand', id: 'registrar-home-btn' do
= t(:registrar_head_title)
- if unstable_env.present?
.text-center
%small{style: 'color: #0074B3;'}= unstable_env
- if current_user
= render 'navbar'
.container
= render 'shared/flash'
- if depp_controller?
= render 'registrar/shared/epp_results'
= yield
%footer.footer
.container
.row
.col-md-6
= image_tag 'eis-logo-et.png'
.col-md-6.text-right
Version
= CURRENT_COMMIT_HASH

View file

@ -0,0 +1,54 @@
<!DOCTYPE html>
<html lang="<%= locale %>">
<head>
<meta charset="utf-8">
<% if content_for? :head_title %>
<%= yield :head_title %>
<% else %>
<title>
<%= t(:registrar_head_title) %>
</title>
<% end %>
<%= csrf_meta_tags %>
<%= stylesheet_link_tag 'registrar-manifest', media: 'all' %>
<%= javascript_include_tag 'registrar-manifest' %>
</head>
<body>
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<%= link_to registrar_root_path, class: 'navbar-brand',
id: 'registrar-home-btn' do %>
<%= t(:registrar_head_title) %>
<% if unstable_env.present? %>
<div class="text-center">
<small style="color: #0074B3;">
<%= unstable_env %>
</small>
</div>
<% end %>
<% end %>
</div>
</div>
</nav>
<div class="container">
<%= render 'flash_messages' %>
<%= yield %>
</div>
<footer class="footer">
<div class="container">
<div class="row">
<div class="col-md-6">
<%= image_tag 'eis-logo-et.png' %>
</div>
<div class="col-md-6 text-right">
Version
<%= CURRENT_COMMIT_HASH %>
</div>
</div>
</div>
</footer>
</body>
</html>

View file

@ -8,7 +8,7 @@
%dd= @contact.org_name %dd= @contact.org_name
%dt= t(:street) %dt= t(:street)
%dd= @contact.street.to_s.gsub("\n", '<br>').html_safe %dd= @contact.street
%dt= t(:city) %dt= t(:city)
%dd= @contact.city %dd= @contact.city

View file

@ -0,0 +1,34 @@
<%= form_tag registrar_domain_transfers_path, multipart: true, class: 'form-horizontal' do %>
<%= render 'registrar/domain_transfers/form/api_errors' %>
<div class="form-group">
<div class="col-md-2 control-label">
<%= label_tag :batch_file %>
</div>
<div class="col-md-4">
<%= file_field_tag :batch_file, required: true %>
<span class="help-block"><%= t '.file_field_hint' %></span>
</div>
</div>
<div class="form-group">
<div class="col-md-4 col-md-offset-2 text-right">
<button class="btn btn-warning">
<%= t '.submit_btn' %>
</button>
</div>
</div>
<div class="form-group">
<div class="col-md-6">
<a class="btn btn-default btn-xs" role="button" data-toggle="collapse"
href="#bulk_change_bulk_transfer_help"><%= t '.help_btn' %>
</a>
<div class="collapse" id="bulk_change_bulk_transfer_help">
<div class="well">
<%= t '.help' %>
</div>
</div>
</div>
</div>
<% end %>

View file

@ -1,12 +1,13 @@
<%= form_tag registrar_update_registrar_nameserver_path, method: :put, class: 'form-horizontal' do %> <%= form_tag registrar_nameservers_path, method: :patch, class: 'form-horizontal' do %>
<%= render 'registrar/domain_transfers/form/api_errors' %>
<div class="form-group"> <div class="form-group">
<div class="col-md-2 control-label"> <div class="col-md-2 control-label">
<%= label_tag :old_hostname %> <%= label_tag :old_hostname %>
</div> </div>
<div class="col-md-5"> <div class="col-md-4">
<%= text_field_tag :old_hostname, params[:old_hostname], autofocus: true, <%= text_field_tag :old_hostname, params[:old_hostname], required: true,
required: true,
class: 'form-control' %> class: 'form-control' %>
</div> </div>
</div> </div>
@ -16,7 +17,7 @@
<%= label_tag :new_hostname %> <%= label_tag :new_hostname %>
</div> </div>
<div class="col-md-5"> <div class="col-md-4">
<%= text_field_tag :new_hostname, params[:new_hostname], required: true, <%= text_field_tag :new_hostname, params[:new_hostname], required: true,
class: 'form-control' %> class: 'form-control' %>
</div> </div>
@ -27,7 +28,7 @@
<%= label_tag :ipv4 %> <%= label_tag :ipv4 %>
</div> </div>
<div class="col-md-3"> <div class="col-md-4">
<%= text_area_tag :ipv4, params[:ipv4], class: 'form-control' %> <%= text_area_tag :ipv4, params[:ipv4], class: 'form-control' %>
</div> </div>
</div> </div>
@ -37,17 +38,30 @@
<%= label_tag :ipv6 %> <%= label_tag :ipv6 %>
</div> </div>
<div class="col-md-3"> <div class="col-md-4">
<%= text_area_tag :ipv6, params[:ipv6], class: 'form-control' %> <%= text_area_tag :ipv6, params[:ipv6], class: 'form-control' %>
<span class="help-block"><%= t '.ip_hint' %></span> <span class="help-block"><%= t '.ip_hint' %></span>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="col-md-5 col-md-offset-2 text-right"> <div class="col-md-4 col-md-offset-2 text-right">
<button class="btn btn-warning"> <button class="btn btn-warning">
<%= t '.replace_btn' %> <%= t '.replace_btn' %>
</button> </button>
</div> </div>
</div> </div>
<div class="form-group">
<div class="col-md-6">
<a class="btn btn-default btn-xs" role="button" data-toggle="collapse"
href="#bulk_change_nameserver_help"><%= t '.help_btn' %>
</a>
<div class="collapse" id="bulk_change_nameserver_help">
<div class="well">
<%= t '.help' %>
</div>
</div>
</div>
</div>
<% end %> <% end %>

View file

@ -0,0 +1,60 @@
<%= form_tag registrar_tech_contacts_path, method: :patch, class: 'form-horizontal' do %>
<% if @error %>
<div class="alert alert-danger">
<%= @error[:message] %>
</div>
<% end %>
<div class="form-group">
<div class="col-md-2 control-label">
<%= label_tag :current_contact_id, t('.current_contact_id') %>
</div>
<div class="col-md-4">
<%= text_field_tag :current_contact_id, params[:current_contact_id],
list: :contacts,
required: true,
autofocus: true,
class: 'form-control' %>
</div>
</div>
<div class="form-group">
<div class="col-md-2 control-label">
<%= label_tag :new_contact_id, t('.new_contact_id') %>
</div>
<div class="col-md-4">
<%= text_field_tag :new_contact_id, params[:new_contact_id],
list: :contacts,
required: true,
class: 'form-control' %>
</div>
</div>
<div class="form-group">
<div class="col-md-4 col-md-offset-2 text-right">
<button class="btn btn-warning">
<%= t '.submit_btn' %>
</button>
</div>
</div>
<div class="form-group">
<div class="col-md-6">
<a class="btn btn-default btn-xs" role="button" data-toggle="collapse"
href="#bulk_change_tech_contact_help"><%= t '.help_btn' %></a>
<div class="collapse" id="bulk_change_tech_contact_help">
<div class="well">
<%= t '.help' %>
</div>
</div>
</div>
</div>
<% end %>
<datalist id="contacts">
<% available_contacts.each do |data| %>
<option value="<%= data.second %>"><%= data.first %></option>
<% end %>
</datalist>

View file

@ -0,0 +1,37 @@
<ol class="breadcrumb">
<li><%= link_to t('registrar.domains.index.header'), registrar_domains_path %></li>
</ol>
<div class="page-header">
<h1><%= t '.header' %></h1>
</div>
<ul class="nav nav-tabs">
<li class="<%= 'active' if active_tab == :technical_contact %>">
<a href="#technical_contact" data-toggle="tab"><%= t '.technical_contact' %></a>
</li>
<li class="<%= 'active' if active_tab == :nameserver %>">
<a href="#nameserver" data-toggle="tab"><%= t '.nameserver' %></a>
</li>
<li class="<%= 'active' if active_tab == :bulk_transfer %>">
<a href="#bulk_transfer" data-toggle="tab"><%= t '.bulk_transfer' %></a>
</li>
</ul>
<div class="tab-content">
<div class="tab-pane<%= ' active' if active_tab == :technical_contact %>"
id="technical_contact">
<%= render 'tech_contact_form', available_contacts: available_contacts %>
</div>
<div class="tab-pane<%= ' active' if active_tab == :nameserver %>" id="nameserver">
<%= render 'nameserver_form' %>
</div>
<div class="tab-pane<%= ' active' if active_tab == :bulk_transfer %>" id="bulk_transfer">
<%= render 'bulk_transfer_form' %>
</div>
</div>

View file

@ -1,4 +1,6 @@
<%= form_tag registrar_domain_transfers_path, multipart: true, class: 'form-horizontal' do %> <%= form_tag registrar_domain_transfers_path, multipart: true, class: 'form-horizontal' do %>
<%= render 'registrar/domain_transfers/form/api_errors' %>
<div class="form-group"> <div class="form-group">
<div class="col-md-3 control-label"> <div class="col-md-3 control-label">
<%= label_tag :domain_name, nil, class: 'required' %> <%= label_tag :domain_name, nil, class: 'required' %>
@ -30,7 +32,7 @@
<div class="form-group"> <div class="form-group">
<div class="col-md-10 text-right"> <div class="col-md-10 text-right">
<button class="btn btn-warning"> <button class="btn btn-warning">
<%= t '.transfer_btn' %> <%= t '.submit_btn' %>
</button> </button>
</div> </div>
</div> </div>

View file

@ -1,19 +0,0 @@
<%= form_tag registrar_domain_transfers_path, multipart: true, class: 'form-horizontal' do %>
<div class="form-group">
<div class="col-md-3 control-label">
<%= label_tag :batch_file %>
</div>
<div class="col-md-7">
<%= file_field_tag :batch_file, required: true %>
<span class="help-block"><%= t '.batch_file_help' %></span>
</div>
</div>
<div class="form-group">
<div class="col-md-10 text-right">
<button class="btn btn-warning">
<%= t '.transfer_btn' %>
</button>
</div>
</div>
<% end %>

View file

@ -6,24 +6,6 @@
<div class="row"> <div class="row">
<div class="col-md-8"> <div class="col-md-8">
<ul class="nav nav-tabs"> <%= render 'form' %>
<li class="active">
<a href="#single" data-toggle="tab"><%= t '.single' %></a>
</li>
<li>
<a href="#batch" data-toggle="tab"><%= t '.batch' %></a>
</li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="single">
<%= render 'registrar/domain_transfers/form/single' %>
</div>
<div class="tab-pane" id="batch">
<%= render 'registrar/domain_transfers/form/batch' %>
</div>
</div>
</div> </div>
</div> </div>

View file

@ -1,13 +1,13 @@
<div class="page-header"> <div class="page-header">
<div class="row"> <div class="row">
<div class="col-sm-7"> <div class="col-sm-5">
<h1><%= t '.header' %></h1> <h1><%= t '.header' %></h1>
</div> </div>
<div class="col-sm-5 text-right"> <div class="col-sm-7 text-right">
<%= link_to t('.new_btn'), new_registrar_domain_path, class: 'btn btn-primary' %> <%= link_to t('.new_btn'), new_registrar_domain_path, class: 'btn btn-primary' %>
<%= link_to t('.transfer_btn'), new_registrar_domain_transfer_path, class: 'btn btn-default' %> <%= link_to t('.transfer_btn'), new_registrar_domain_transfer_path, class: 'btn btn-default' %>
<%= link_to t('.replace_nameserver_btn'), registrar_edit_registrar_nameserver_path, <%= link_to t('.bulk_change_btn'), new_registrar_bulk_change_path,
class: 'btn btn-default' %> class: 'btn btn-default' %>
</div> </div>
</div> </div>
@ -24,22 +24,22 @@
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-hover table-bordered table-condensed"> <table class="table table-hover table-bordered table-condensed">
<thead> <thead>
<tr> <tr>
<th class="col-xs-2"> <th class="col-xs-2">
<%= sort_link(@q, 'name') %> <%= sort_link(@q, 'name') %>
</th> </th>
<th class="col-xs-2"> <th class="col-xs-2">
<%= sort_link @q, 'registrant_name', Registrant.model_name.human %> <%= sort_link @q, 'registrant_name', Registrant.model_name.human %>
</th> </th>
<th class="col-xs-2"> <th class="col-xs-2">
<%= sort_link @q, 'valid_to', Domain.human_attribute_name(:expire_time) %> <%= sort_link @q, 'valid_to', Domain.human_attribute_name(:expire_time) %>
</th> </th>
<th class="col-xs-2"></th> <th class="col-xs-2"></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<%= render @domains %> <%= render @domains %>
</tbody> </tbody>
</table> </table>
</div> </div>

View file

@ -1,6 +1,7 @@
%h4= t(:pay_by_bank_link) %h4= t('registrar.invoices.pay_invoice')
%hr %hr
- ENV['payments_banks'].split(",").each do |meth|
- locals[:payment_channels].each do |meth|
- meth = meth.strip - meth = meth.strip
= link_to registrar_payment_with_path(meth, invoice_id: params[:id]) do = link_to registrar_payment_with_path(meth, invoice_id: params[:id]) do
= image_tag("#{meth}.png") = image_tag("#{meth}.png")

View file

@ -17,4 +17,4 @@
- if !@invoice.cancelled? && !@invoice.binded? - if !@invoice.cancelled? && !@invoice.binded?
.row.semifooter .row.semifooter
.col-md-12.text-right= render 'registrar/invoices/partials/banklinks' .col-md-6-offset-6.text-right= render 'registrar/invoices/partials/banklinks', locals: { payment_channels: PaymentOrders::PAYMENT_METHODS }

View file

@ -1,11 +1,14 @@
.h3
= t('registrar.invoices.redirected_to_intermediary')
.payment-form .payment-form
= form_tag @bank_link.url, method: :post do = form_tag @payment.form_url, method: :post do
- @bank_link.fields.each do |k, v| - @payment.form_fields.each do |k, v|
= hidden_field_tag k, v = hidden_field_tag k, v
= submit_tag "Mine maksma" = submit_tag t('registrar.invoices.go_to_intermediary')
:javascript
:coffeescript function load_listener() {
load_listener = -> $('.payment-form form').submit();
$('.payment-form form').submit() }
window.addEventListener 'load', load_listener window.addEventListener('load', load_listener)

View file

@ -1,11 +0,0 @@
<ol class="breadcrumb">
<li><%= link_to t('registrar.domains.index.header'), registrar_domains_path %></li>
</ol>
<div class="page-header">
<h1><%= t '.header' %></h1>
</div>
<%= render 'registrar/domain_transfers/form/api_errors' %>
<%= render 'form' %>

View file

@ -1,129 +0,0 @@
{
"arrow_spacing": {
"level": "ignore"
},
"braces_spacing": {
"level": "ignore",
"spaces": 0,
"empty_object_spaces": 0
},
"camel_case_classes": {
"level": "error"
},
"coffeescript_error": {
"level": "error"
},
"colon_assignment_spacing": {
"level": "ignore",
"spacing": {
"left": 0,
"right": 0
}
},
"cyclomatic_complexity": {
"value": 10,
"level": "ignore"
},
"duplicate_key": {
"level": "error"
},
"empty_constructor_needs_parens": {
"level": "ignore"
},
"ensure_comprehensions": {
"level": "warn"
},
"eol_last": {
"level": "ignore"
},
"indentation": {
"value": 2,
"level": "error"
},
"line_endings": {
"level": "ignore",
"value": "unix"
},
"max_line_length": {
"value": 80,
"level": "error",
"limitComments": true
},
"missing_fat_arrows": {
"level": "ignore",
"is_strict": false
},
"newlines_after_classes": {
"value": 3,
"level": "ignore"
},
"no_backticks": {
"level": "error"
},
"no_debugger": {
"level": "warn",
"console": false
},
"no_empty_functions": {
"level": "ignore"
},
"no_empty_param_list": {
"level": "ignore"
},
"no_implicit_braces": {
"level": "ignore",
"strict": true
},
"no_implicit_parens": {
"strict": true,
"level": "ignore"
},
"no_interpolation_in_single_quotes": {
"level": "ignore"
},
"no_plusplus": {
"level": "ignore"
},
"no_stand_alone_at": {
"level": "ignore"
},
"no_tabs": {
"level": "error"
},
"no_this": {
"level": "ignore"
},
"no_throwing_strings": {
"level": "error"
},
"no_trailing_semicolons": {
"level": "error"
},
"no_trailing_whitespace": {
"level": "error",
"allowed_in_comments": false,
"allowed_in_empty_lines": true
},
"no_unnecessary_double_quotes": {
"level": "ignore"
},
"no_unnecessary_fat_arrows": {
"level": "warn"
},
"non_empty_constructor_needs_parens": {
"level": "ignore"
},
"prefer_english_operator": {
"level": "ignore",
"doubleNotLevel": "ignore"
},
"space_operators": {
"level": "ignore"
},
"spacing_after_comma": {
"level": "ignore"
},
"transform_messes_up_line_numbers": {
"level": "warn"
}
}

View file

@ -67,8 +67,8 @@ contact_org_enabled: 'false'
# iptables_server_ip: '127.0.0.1' # iptables_server_ip: '127.0.0.1'
# Custom legal document types. Changing this requires updating EPP extension schema for allowed legalDocEnumType values. # Custom legal document types. Changing this requires updating EPP extension schema for allowed legalDocEnumType values.
# System default for legal document types is: pdf,bdoc,ddoc,zip,rar,gz,tar,7z,odt,doc,docx # System default for legal document types is: pdf,asice,sce,asics,scs,adoc,edoc,bdoc,ddoc,zip,rar,gz,tar,7z,odt,doc,docx
# legal_document_types: "pdf,bdoc,ddoc,zip,rar,gz,tar,7z,odt,doc,docx" # legal_document_types: "pdf,asice,sce,asics,scs,adoc,edoc,bdoc,ddoc,zip,rar,gz,tar,7z,odt,doc,docx"
# #
@ -106,10 +106,13 @@ sk_digi_doc_service_name: 'Testimine'
secret_key_base: 'please-change-it-you-can-generate-it-with-rake-secret' secret_key_base: 'please-change-it-you-can-generate-it-with-rake-secret'
devise_secret: 'please-change-it-you-can-generate-it-with-rake-secret' devise_secret: 'please-change-it-you-can-generate-it-with-rake-secret'
# You should list only payment methods that
# conform with the Estonian BankLink standard
payments_banks: > payments_banks: >
seb, seb,
swed, swed,
lhv lhv
payments_seb_url: 'https://www.seb.ee/cgi-bin/dv.sh/ipank.r' payments_seb_url: 'https://www.seb.ee/cgi-bin/dv.sh/ipank.r'
payments_seb_bank_certificate: 'eyp_pub.pem' payments_seb_bank_certificate: 'eyp_pub.pem'
payments_seb_seller_private: 'kaupmees_priv.pem' payments_seb_seller_private: 'kaupmees_priv.pem'
@ -123,6 +126,26 @@ payments_lhv_bank_certificate: 'eyp_pub.pem'
payments_lhv_seller_private: 'kaupmees_priv.pem' payments_lhv_seller_private: 'kaupmees_priv.pem'
payments_lhv_seller_account: 'testvpos' payments_lhv_seller_account: 'testvpos'
# You should list other payment intermediaries here. Each one of them needs their own class in /app/models/payments/
payments_intermediaries: >
every_pay
# Other intermediaries should follow this naming convention:
# payments_intermediary_url - URL to intiate payments
# payments_intermediary_seller_account - your username in the bank system
# payments_intermediary_api_user - API username, in case it's different than the seller account
# payments_intermediary_api_key - API key given to you by intermediary
payments_every_pay_url: 'https://igw-demo.every-pay.com/transactions/'
payments_every_pay_seller_account: 'EUR3D1'
payments_every_pay_api_user: 'api_user'
payments_every_pay_api_key: 'api_key'
user_session_timeout: '3600' # 1 hour user_session_timeout: '3600' # 1 hour
secure_session_cookies: 'false' # true|false secure_session_cookies: 'false' # true|false
same_site_session_cookies: 'false' # false|strict|lax same_site_session_cookies: 'false' # false|strict|lax
# Since the keys for staging are absent from the repo, we need to supply them separate for testing.
test:
payments_seb_bank_certificate: 'test/fixtures/files/seb_bank_cert.pem'
payments_seb_seller_private: 'test/fixtures/files/seb_seller_key.pem'

View file

@ -72,4 +72,5 @@ if con.present? && con.table_exists?('settings')
Setting.save_default(:registry_bank_code, '689') Setting.save_default(:registry_bank_code, '689')
Setting.save_default(:registry_swift, 'LHVBEE22') Setting.save_default(:registry_swift, 'LHVBEE22')
Setting.save_default(:registry_invoice_contact, 'Martti Õigus') Setting.save_default(:registry_invoice_contact, 'Martti Õigus')
Setting.save_default(:registry_whois_disclaimer, 'Search results may not be used for commercial, advertising, recompilation, repackaging, redistribution, reuse, obscuring or other similar activities.')
end end

View file

@ -541,7 +541,6 @@ en:
your_current_account_balance_is: 'Your current account balance is %{balance} %{currency}' your_current_account_balance_is: 'Your current account balance is %{balance} %{currency}'
billing: 'Billing' billing: 'Billing'
your_account: 'Your account' your_account: 'Your account'
pay_by_bank_link: 'Pay by bank link'
issue_date: 'Issue date' issue_date: 'Issue date'
due_date: 'Due date' due_date: 'Due date'
payment_term: 'Payment term' payment_term: 'Payment term'

View file

@ -0,0 +1,31 @@
en:
registrar:
bulk_change:
new:
header: Bulk change
technical_contact: Technical contact
nameserver: Nameserver
bulk_transfer: Bulk transfer
tech_contact_form:
current_contact_id: Current contact ID
new_contact_id: New contact ID
submit_btn: Replace technical contacts
help_btn: Toggle help
help: >-
Replace technical contact specified in "current contact ID" with the one in "new
contact ID" on any domain registered under this registrar
nameserver_form:
ip_hint: One IP per line
replace_btn: Replace nameserver
help_btn: Toggle help
help: >-
Replace nameserver specified in the "old hostname" with the one in "new hostname" with
optional IPv4 and IPv6 addresses on any domain registered under this registrar
bulk_transfer_form:
file_field_hint: CSV file with domain list provided by another registrar
submit_btn: Transfer
help_btn: Toggle help
help: Transfer domains in the csv file with correct transfer code to this registrar

View file

@ -3,17 +3,10 @@ en:
domain_transfers: domain_transfers:
new: new:
header: Domain transfer header: Domain transfer
single: One by one
batch: Batch
create: create:
header: Domain transfer header: Domain transfer
transferred: "%{count} domains have been successfully transferred" transferred: "%{count} domains have been successfully transferred"
form: form:
single: submit_btn: Transfer
transfer_btn: Transfer
batch:
batch_file_help: CSV file with domain list provided by another registrar
transfer_btn: Transfer batch

View file

@ -5,7 +5,7 @@ en:
header: Domains header: Domains
new_btn: New domain new_btn: New domain
transfer_btn: Transfer transfer_btn: Transfer
replace_nameserver_btn: Replace nameserver bulk_change_btn: Bulk change
csv: csv:
domain_name: Domain domain_name: Domain
transfer_code: Transfer code transfer_code: Transfer code

View file

@ -1,5 +1,11 @@
en: en:
registrar: registrar:
invoices: invoices:
pay_invoice: 'Pay invoice'
redirected_to_intermediary: 'Click the button below to redirect to payment intermediary'
to_card_payment: Open card payment
go_to_intermediary: 'Go to intermediary'
pay_by_credit_card: Pay by credit card
payment_complete: Credit Card payment Complete
index: index:
reset_btn: Reset reset_btn: Reset

View file

@ -0,0 +1,5 @@
en:
registrar:
nameservers:
update:
replaced: Nameserver have been successfully replaced

View file

@ -1,13 +0,0 @@
en:
registrar:
registrar_nameservers:
edit:
header: Replace nameserver
replace_btn: Replace
form:
ip_hint: One IP per line
replace_btn: Replace nameserver
update:
replaced: Nameserver have been successfully replaced

View file

@ -0,0 +1,7 @@
en:
registrar:
tech_contacts:
update:
replaced: Technical contacts have been successfully replaced.
affected_domains: Affected domains
skipped_domains: Skipped domains

View file

@ -62,9 +62,9 @@ Rails.application.routes.draw do
end end
end end
resources :domain_transfers, only: %i[new create] resources :domain_transfers, only: %i[new create]
get 'registrar/nameservers', to: 'registrar_nameservers#edit', as: :edit_registrar_nameserver resource :bulk_change, controller: :bulk_change, only: :new
put 'registrar/nameservers', to: 'registrar_nameservers#update', as: :update_registrar_nameserver resource :tech_contacts, only: :update
resource :nameservers, only: :update
resources :contacts, constraints: {:id => /[^\/]+(?=#{ ActionController::Renderers::RENDERERS.map{|e| "\\.#{e}\\z"}.join("|") })|[^\/]+/} do resources :contacts, constraints: {:id => /[^\/]+(?=#{ ActionController::Renderers::RENDERERS.map{|e| "\\.#{e}\\z"}.join("|") })|[^\/]+/} do
member do member do
get 'delete' get 'delete'
@ -91,10 +91,11 @@ Rails.application.routes.draw do
end end
end end
get 'pay/return/:bank' => 'payments#back', as: 'return_payment_with'
get 'pay/return/:bank' => 'payments#back', as: 'return_payment_with' post 'pay/return/:bank' => 'payments#back'
post 'pay/return/:bank' => 'payments#back' put 'pay/return/:bank' => 'payments#back'
get 'pay/go/:bank' => 'payments#pay', as: 'payment_with' post 'pay/callback/:bank' => 'payments#callback', as: 'response_payment_with'
get 'pay/go/:bank' => 'payments#pay', as: 'payment_with'
end end
namespace :registrant do namespace :registrant do
@ -144,7 +145,6 @@ Rails.application.routes.draw do
end end
resources :contacts resources :contacts
resources :whois
end end

View file

@ -8,7 +8,7 @@ More info at http://en.wikipedia.org/wiki/Extensible_Provisioning_Protocol
Contact Mapping protocol short version: Contact Mapping protocol short version:
All values are limited to Unicode Latin characters if stricter limits are not specified. This includes unicode blocks All values are limited to Unicode Latin characters if stricter limits are not specified. This includes unicode blocks
Basic Latin, Latin-1 Supplement, Latin Extended-A, Latin Extended-B, Latin Extended C, Latin Extended D, Basic Latin, Latin-1 Supplement, Latin Extended-A, Latin Extended-B, Latin Extended C, Latin Extended D,
Latin Extended Additional, Diacritics. Latin Extended Additional, Diacritics.
More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode
@ -16,9 +16,9 @@ More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode
Field name Min-max Field description Field name Min-max Field description
----------------------- ------- ----------------- ----------------------- ------- -----------------
<create> 1 <create> 1
<contact:create> 1 Attribute: xmlns:contact="https://epp.tld.ee/schema/contact-ee-1.1.xsd" <contact:create> 1 Attribute: xmlns:contact="https://epp.tld.ee/schema/contact-ee-1.1.xsd"
<contact:id> 0-1 Contact id, optional, <contact:id> 0-1 Contact id, optional,
string: ASCII letters, numbers, ':', '-' characters, no spaces, string: ASCII letters, numbers, ':', '-' characters, no spaces,
max 100 characters, max 100 characters,
generated automatically if missing. generated automatically if missing.
@ -34,7 +34,7 @@ More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode
<contact:voice> 1 Phone number in format \+ddd.d+ <contact:voice> 1 Phone number in format \+ddd.d+
<contact:fax> 0 Fax is not supported and must be blank or missing <contact:fax> 0 Fax is not supported and must be blank or missing
<contact:email> 1 E-mail <contact:email> 1 E-mail
<extension> 1 <extension> 1
<eis:extdata> 1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd" <eis:extdata> 1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd"
<eis:ident> 1 Identifier <eis:ident> 1 Identifier
Attribute: "type" Attribute: "type"
@ -43,8 +43,8 @@ More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode
"birthday" # Birthday date in format in YYYY-MM-DD "birthday" # Birthday date in format in YYYY-MM-DD
Attribute: "cc" Attribute: "cc"
"EE" # Country code in ISO_3166-1 aplha 2 "EE" # Country code in ISO_3166-1 aplha 2
<eis:legalDocument> 0-1 Base64 encoded document <eis:legalDocument> 0-1 Base64 encoded document
Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" Attribute: type="pdf/asice/sce/adoc/asics/scs/edoc/adoc/bdoc/ddoc/zip/rar/gz/tar/7z"
<clTRID> 0-1 Client transaction id <clTRID> 0-1 Client transaction id
[EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-contact-with-valid-user-create-command-successfully-creates-a-contact) [EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-contact-with-valid-user-create-command-successfully-creates-a-contact)
@ -53,7 +53,7 @@ More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode
Field name Min-max Field description Field name Min-max Field description
----------------------- ------- ----------------- ----------------------- ------- -----------------
<update> 1 <update> 1
<contact:update> 1 Attribute: xmlns:contact="https://epp.tld.ee/schema/contact-ee-1.1.xsd" <contact:update> 1 Attribute: xmlns:contact="https://epp.tld.ee/schema/contact-ee-1.1.xsd"
<contact:id> 1 Contact id, required <contact:id> 1 Contact id, required
<contact:chg> 1 Change container <contact:chg> 1 Change container
@ -71,7 +71,7 @@ More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode
<contact:email> 0-1 E-mail <contact:email> 0-1 E-mail
<contact:authInfo> 0-1 Required if registrar is not the owner of the contact. <contact:authInfo> 0-1 Required if registrar is not the owner of the contact.
<contact:pw> 1 Contact password. Attribute: roid="String" <contact:pw> 1 Contact password. Attribute: roid="String"
<extension> 0-1 <extension> 0-1
<eis:extdata> 0-1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd" <eis:extdata> 0-1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd"
<eis:ident> 0-1 Identifier <eis:ident> 0-1 Identifier
Attribute: "type" Attribute: "type"
@ -80,8 +80,8 @@ More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode
"birthday" # Birthday date in format in YYYY-MM-DD "birthday" # Birthday date in format in YYYY-MM-DD
Attribute: "cc" Attribute: "cc"
"EE" # Country code in ISO_3166-1 aplha 2 "EE" # Country code in ISO_3166-1 aplha 2
<eis:legalDocument> 0-1 Base64 encoded document. <eis:legalDocument> 0-1 Base64 encoded document.
Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" Attribute: type="pdf/asice/sce/adoc/asics/scs/edoc/adoc/bdoc/ddoc/zip/rar/gz/tar/7z"
<clTRID> 0-1 Client transaction id <clTRID> 0-1 Client transaction id
@ -91,15 +91,15 @@ More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode
Field name Min-max Field description Field name Min-max Field description
----------------------- ------- ----------------- ----------------------- ------- -----------------
<delete> 1 <delete> 1
<contact:delete> 1 Attribute: xmlns:contact="https://epp.tld.ee/schema/contact-ee-1.1.xsd" <contact:delete> 1 Attribute: xmlns:contact="https://epp.tld.ee/schema/contact-ee-1.1.xsd"
<contact:id> 1 Contact id <contact:id> 1 Contact id
<contact:authInfo> 0-1 Required if registrar is not the owner of the contact. <contact:authInfo> 0-1 Required if registrar is not the owner of the contact.
<contact:pw> 1 Contact password. Attribute: roid="String" <contact:pw> 1 Contact password. Attribute: roid="String"
<extension> 0-1 <extension> 0-1
<eis:extdata> 0-1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd" <eis:extdata> 0-1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd"
<eis:legalDocument> 0-1 Base64 encoded document. <eis:legalDocument> 0-1 Base64 encoded document.
Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" Attribute: type="pdf/asice/sce/adoc/asics/scs/edoc/adoc/bdoc/ddoc/zip/rar/gz/tar/7z"
<clTRID> 0-1 Client transaction id <clTRID> 0-1 Client transaction id
[EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-contact-with-valid-user-delete-command-deletes-contact) [EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-contact-with-valid-user-delete-command-deletes-contact)
@ -109,9 +109,9 @@ More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode
Field name Min-max Field description Field name Min-max Field description
----------------------- ------- ----------------- ----------------------- ------- -----------------
<check> 1 <check> 1
<contact:check> 1 Attribute: xmlns:contact="https://epp.tld.ee/schema/contact-ee-1.1.xsd" <contact:check> 1 Attribute: xmlns:contact="https://epp.tld.ee/schema/contact-ee-1.1.xsd"
<contact:id> 1-n Contact id <contact:id> 1-n Contact id
<clTRID> 0-1 Client transaction id <clTRID> 0-1 Client transaction id
[EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-contact-with-valid-user-check-command-returns-info-about-contact-availability) [EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-contact-with-valid-user-check-command-returns-info-about-contact-availability)
@ -121,9 +121,9 @@ More info: https://en.wikipedia.org/wiki/Latin_script_in_Unicode
Field name Min-max Field description Field name Min-max Field description
----------------------- ------- ----------------- ----------------------- ------- -----------------
<info> 1 <info> 1
<contact:info> 1 Attribute: xmlns:contact="https://epp.tld.ee/schema/contact-ee-1.1.xsd" <contact:info> 1 Attribute: xmlns:contact="https://epp.tld.ee/schema/contact-ee-1.1.xsd"
<contact:id> 1-n Contact id <contact:id> 1-n Contact id
<contact:authInfo> 0-1 Required if registrar is not the owner of the contact. <contact:authInfo> 0-1 Required if registrar is not the owner of the contact.
<contact:pw> 1 Contact password. Attribute: roid="String" <contact:pw> 1 Contact password. Attribute: roid="String"
<clTRID> 0-1 Client transaction id <clTRID> 0-1 Client transaction id

View file

@ -12,15 +12,15 @@ Domain name mapping protocol short version:
Field name Min-max Field description Field name Min-max Field description
------------------------- ------- ----------------- ------------------------- ------- -----------------
<create> 1 <create> 1
<domain:create> 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd" <domain:create> 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd"
<domain:name> 1 Domain name. Can contain unicode characters. <domain:name> 1 Domain name. Can contain unicode characters.
<domain:period> 0-1 Registration period for domain. <domain:period> 0-1 Registration period for domain.
Must add up to 3m, 6m, 9m, 1y, 2y, 3y, 4y, 5y, 6y, 7y, 8y, 9y, 10y. Must add up to 3m, 6m, 9m, 1y, 2y, 3y, 4y, 5y, 6y, 7y, 8y, 9y, 10y.
Attribute: unit="y/m/d" Attribute: unit="y/m/d"
Default is 1 year. Default is 1 year.
<domain:ns> 0-1 <domain:ns> 0-1
<domain:hostAttr> 2-11 <domain:hostAttr> 2-11
<domain:hostName> 1 Hostname of the nameserver <domain:hostName> 1 Hostname of the nameserver
<domain:hostAddr> 0-2 Required if nameserver hostname is under the same domain. <domain:hostAddr> 0-2 Required if nameserver hostname is under the same domain.
Attribute ip="v4 / v6" Attribute ip="v4 / v6"
@ -30,16 +30,16 @@ Domain name mapping protocol short version:
<domain:authInfo> 0-1 <domain:authInfo> 0-1
<domain:pw> 1 Transfer code. Attribute: roid="String" <domain:pw> 1 Transfer code. Attribute: roid="String"
</domain:authInfo> </domain:authInfo>
<extension> 1 <extension> 1
<secDNS:create> 0-1 Attribute: xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1" <secDNS:create> 0-1 Attribute: xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1"
<secDNS:keyData> 1-n <secDNS:keyData> 1-n
<secDNS:flags> 1 Allowed values: 0, 256, 257 <secDNS:flags> 1 Allowed values: 0, 256, 257
<secDNS:protocol> 1 Allowed values: 3 <secDNS:protocol> 1 Allowed values: 3
<secDNS:alg> 1 Allowed values: 3, 5, 6, 7, 8, 10, 13, 14 <secDNS:alg> 1 Allowed values: 3, 5, 6, 7, 8, 10, 13, 14
<secDNS:pubKey> 1 Public key <secDNS:pubKey> 1 Public key
<eis:extdata> 1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd" <eis:extdata> 1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd"
<eis:legalDocument> 1 Base64 encoded document. <eis:legalDocument> 1 Base64 encoded document.
Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" Attribute: type="pdf/asice/sce/adoc/asics/scs/edoc/adoc/bdoc/ddoc/zip/rar/gz/tar/7z"
<eis:reserved> 0-1 <eis:reserved> 0-1
<eis:pw> 0-1 Required if registering a reserved domain <eis:pw> 0-1 Required if registering a reserved domain
<clTRID> 0-1 Client transaction id <clTRID> 0-1 Client transaction id
@ -50,27 +50,27 @@ Domain name mapping protocol short version:
Field name Min-max Field description Field name Min-max Field description
------------------------ -------- ----------------- ------------------------ -------- -----------------
<update> 1 <update> 1
<domain:update> 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd" <domain:update> 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd"
<domain:name> 1 Domain name. Can contain unicode characters. <domain:name> 1 Domain name. Can contain unicode characters.
<domain:add> 0-1 Objects to add <domain:add> 0-1 Objects to add
<domain:contact> 0-n Contact reference. Attribute: type="admin / tech" <domain:contact> 0-n Contact reference. Attribute: type="admin / tech"
<domain:status> 0-n Status description. <domain:status> 0-n Status description.
Attribute: s="clientDeleteProhibited / clientHold / Attribute: s="clientDeleteProhibited / clientHold /
clientRenewProhibited / clientTransferProhibited / clientRenewProhibited / clientTransferProhibited /
clientUpdateProhibited" clientUpdateProhibited"
<domain:ns> 0-1 <domain:ns> 0-1
<domain:hostAttr> 1 <domain:hostAttr> 1
<domain:hostName> 1 Hostname of the nameserver <domain:hostName> 1 Hostname of the nameserver
<domain:hostAddr> 0-2 Required if nameserver hostname is under the same domain. <domain:hostAddr> 0-2 Required if nameserver hostname is under the same domain.
Attribute ip="v4 / v6" Attribute ip="v4 / v6"
<domain:rem> 0-1 Objects to remove <domain:rem> 0-1 Objects to remove
<domain:contact> 0-n Contact reference. Attribute: type="admin / tech" <domain:contact> 0-n Contact reference. Attribute: type="admin / tech"
<domain:status> 0-n Attribute: s="clientDeleteProhibited / clientHold / <domain:status> 0-n Attribute: s="clientDeleteProhibited / clientHold /
clientRenewProhibited / clientTransferProhibited / clientRenewProhibited / clientTransferProhibited /
clientUpdateProhibited" clientUpdateProhibited"
<domain:ns> 0-1 <domain:ns> 0-1
<domain:hostAttr> 1 <domain:hostAttr> 1
<domain:hostName> 1 Hostname of the nameserver <domain:hostName> 1 Hostname of the nameserver
<domain:chg> 0-1 Attributes to change <domain:chg> 0-1 Attributes to change
<domain:registrant> 0-1 Contact reference to the registrant <domain:registrant> 0-1 Contact reference to the registrant
@ -80,18 +80,18 @@ Domain name mapping protocol short version:
</domain:authInfo> </domain:authInfo>
<extension> 0-1 Required if registrant is changing <extension> 0-1 Required if registrant is changing
<secDNS:update> 0-1 Attribute: xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1" <secDNS:update> 0-1 Attribute: xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1"
<secDNS:rem> 0-1 <secDNS:rem> 0-1
<secDNS:keyData> 1-n <secDNS:keyData> 1-n
<secDNS:pubKey> 1 Public key <secDNS:pubKey> 1 Public key
<secDNS:add> 0-1 <secDNS:add> 0-1
<secDNS:keyData> 1-n <secDNS:keyData> 1-n
<secDNS:flags> 1 Allowed values: 0, 256, 257 <secDNS:flags> 1 Allowed values: 0, 256, 257
<secDNS:protocol> 1 Allowed values: 3 <secDNS:protocol> 1 Allowed values: 3
<secDNS:alg> 1 Allowed values: 3, 5, 6, 7, 8, 10, 13, 14 <secDNS:alg> 1 Allowed values: 3, 5, 6, 7, 8, 10, 13, 14
<secDNS:pubKey> 1 Public key <secDNS:pubKey> 1 Public key
<eis:extdata> 0-1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd" <eis:extdata> 0-1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd"
<eis:legalDocument> 0-1 Base64 encoded document. Required if registrant is changing. <eis:legalDocument> 0-1 Base64 encoded document. Required if registrant is changing.
Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" Attribute: type="pdf/asice/sce/adoc/asics/scs/edoc/adoc/bdoc/ddoc/zip/rar/gz/tar/7z"
<clTRID> 0-1 Client transaction id <clTRID> 0-1 Client transaction id
[EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-domain-with-valid-domain-updates-domain-and-adds-objects) [EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-domain-with-valid-domain-updates-domain-and-adds-objects)
@ -100,14 +100,14 @@ Domain name mapping protocol short version:
Field name Min-max Field description Field name Min-max Field description
----------------------- ------- ----------------- ----------------------- ------- -----------------
<delete> 1 <delete> 1
<domain:delete> 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd" <domain:delete> 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd"
Optional attribute: verified="yes/no" Optional attribute: verified="yes/no"
<domain:name> 1 Domain name. Can contain unicode characters. <domain:name> 1 Domain name. Can contain unicode characters.
<extension> 1 <extension> 1
<eis:extdata> 1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd" <eis:extdata> 1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd"
<eis:legalDocument> 1 Base64 encoded document. <eis:legalDocument> 1 Base64 encoded document.
Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" Attribute: type="pdf/asice/sce/adoc/asics/scs/edoc/adoc/bdoc/ddoc/zip/rar/gz/tar/7z"
<clTRID> 0-1 Client transaction id <clTRID> 0-1 Client transaction id
[EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-domain-with-valid-domain-deletes-domain) [EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-domain-with-valid-domain-deletes-domain)
@ -116,9 +116,9 @@ Domain name mapping protocol short version:
Field name Min-max Field description Field name Min-max Field description
----------------------- ------- ----------------- ----------------------- ------- -----------------
<info> 1 <info> 1
<domain:info> 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd" <domain:info> 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd"
<domain:name> 1 Domain name. Can contain unicode characters. <domain:name> 1 Domain name. Can contain unicode characters.
Attribute: hosts="all / del / sub / none" Attribute: hosts="all / del / sub / none"
<domain:authInfo> 0-1 Required if registrar is not the owner of the domain. <domain:authInfo> 0-1 Required if registrar is not the owner of the domain.
<domain:pw> 1 Domain transfer code. Attribute: roid="String" <domain:pw> 1 Domain transfer code. Attribute: roid="String"
@ -130,18 +130,18 @@ Domain name mapping protocol short version:
Field name Min-max Field description Field name Min-max Field description
----------------------- ------- ----------------- ----------------------- ------- -----------------
<renew> 1 <renew> 1
<domain:renew> 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd" <domain:renew> 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd"
<domain:name> 1 Domain name. Can contain unicode characters. <domain:name> 1 Domain name. Can contain unicode characters.
<domain:curExpDate> 1 Current expiry date (ISO8601 format) <domain:curExpDate> 1 Current expiry date (ISO8601 format)
<domain:period> 0-1 Registration period for domain. <domain:period> 0-1 Registration period for domain.
Must add up to 3m, 6m, 9m, 1y, 2y, 3y, 4y, 5y, 6y, 7y, 8y, 9y, 10y. Must add up to 3m, 6m, 9m, 1y, 2y, 3y, 4y, 5y, 6y, 7y, 8y, 9y, 10y.
Attribute: unit="y/m/d" Attribute: unit="y/m/d"
Default value is 1 year. Default value is 1 year.
<extension> 0-1 <extension> 0-1
<eis:extdata> 0-1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd" <eis:extdata> 0-1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd"
<eis:legalDocument> 0-1 Base64 encoded document. <eis:legalDocument> 0-1 Base64 encoded document.
Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" Attribute: type="pdf/asice/sce/adoc/asics/scs/edoc/adoc/bdoc/ddoc/zip/rar/gz/tar/7z"
<clTRID> 0-1 Client transaction id <clTRID> 0-1 Client transaction id
[EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-domain-with-valid-domain-renews-a-domain) [EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-domain-with-valid-domain-renews-a-domain)
@ -152,13 +152,13 @@ Domain name mapping protocol short version:
----------------------- ------- ----------------- ----------------------- ------- -----------------
<transfer> 1 Attribute: op="request/query/approve/reject/cancel" <transfer> 1 Attribute: op="request/query/approve/reject/cancel"
<domain:transfer> 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd" <domain:transfer> 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd"
<domain:name> 1 Domain name. Can contain unicode characters. <domain:name> 1 Domain name. Can contain unicode characters.
<domain:authInfo> 1 <domain:authInfo> 1
<domain:pw> 1 Domain transfer code. Attribute: roid="String" <domain:pw> 1 Domain transfer code. Attribute: roid="String"
<extension> 0-1 <extension> 0-1
<eis:extdata> 0-1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd" <eis:extdata> 0-1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd"
<eis:legalDocument> 0-1 Base64 encoded document. <eis:legalDocument> 0-1 Base64 encoded document.
Attribute: type="pdf/bdoc/ddoc/zip/rar/gz/tar/7z" Attribute: type="pdf/asice/sce/adoc/asics/scs/edoc/adoc/bdoc/ddoc/zip/rar/gz/tar/7z"
<clTRID> 0-1 Client transaction id <clTRID> 0-1 Client transaction id
[EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-domain-with-valid-domain-transfers-a-domain) [EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-domain-with-valid-domain-transfers-a-domain)
@ -167,9 +167,9 @@ Domain name mapping protocol short version:
Field name Min-max Field description Field name Min-max Field description
----------------------- ------- ----------------- ----------------------- ------- -----------------
<check> 1 <check> 1
<domain:check> 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd" <domain:check> 1 Attribute: xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd"
<domain:name> 1 Domain name. Can contain unicode characters. <domain:name> 1 Domain name. Can contain unicode characters.
<clTRID> 0-1 Client transaction id <clTRID> 0-1 Client transaction id
[EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-domain-with-valid-domain-checks-a-domain) [EXAMPLE REQUEST AND RESPONSE](/doc/epp-examples.md#epp-domain-with-valid-domain-checks-a-domain)

View file

@ -0,0 +1,19 @@
# Domain contacts
## PATCH https://repp.internet.ee/v1/domains/contacts
Replaces all domain contacts of the current registrar.
### Example request
```
$ curl https://repp.internet.ee/v1/domains/contacts \
-X PATCH \
-u username:password \
-d current_contact_id=foo \
-d new_contact_id=bar
```
### Example response
```
{
"affected_domains": ["example.com", "example.org"]
}
```

View file

@ -63,7 +63,13 @@
<simpleType name="legalDocEnumType"> <simpleType name="legalDocEnumType">
<restriction base="token"> <restriction base="token">
<enumeration value="pdf"/> <enumeration value="pdf"/>
<enumeration value="asice"/>
<enumeration value="asics"/>
<enumeration value="sce"/>
<enumeration value="scs"/>
<enumeration value="adoc"/>
<enumeration value="bdoc"/> <enumeration value="bdoc"/>
<enumeration value="edoc"/>
<enumeration value="ddoc"/> <enumeration value="ddoc"/>
<enumeration value="zip"/> <enumeration value="zip"/>
<enumeration value="rar"/> <enumeration value="rar"/>

View file

@ -8,7 +8,7 @@ FactoryBot.define do
state 'test' state 'test'
zip 'test' zip 'test'
email 'test@test.com' email 'test@test.com'
country_code 'EE' country_code 'US'
accounting_customer_code 'test' accounting_customer_code 'test'
factory :registrar_with_unlimited_balance do factory :registrar_with_unlimited_balance do

View file

@ -1,12 +0,0 @@
require 'rails_helper'
RSpec.feature 'Contact list', settings: false do
background do
sign_in_to_admin_area
end
it 'is visible' do
visit admin_contacts_path
expect(page).to have_css('.contacts')
end
end

View file

@ -1,67 +0,0 @@
require 'rails_helper'
RSpec.describe WhoisRecord do
describe '::generate_json', db: false do
let(:registrant) { build_stubbed(:registrant) }
let(:domain) { build_stubbed(:domain, registrant: registrant) }
let(:whois_record) { described_class.new }
subject(:generated_json) { whois_record.generate_json }
before do
allow(whois_record).to receive(:domain).and_return(domain)
end
it 'generates registrant kind' do
expect(registrant).to receive(:kind).and_return('test kind')
expect(generated_json[:registrant_kind]).to eq('test kind')
end
describe 'reg no' do
subject(:reg_no) { generated_json[:registrant_reg_no] }
before do
allow(registrant).to receive(:reg_no).and_return('test reg no')
end
context 'when registrant is legal entity' do
let(:registrant) { build_stubbed(:registrant_legal_entity) }
it 'is present' do
expect(reg_no).to eq('test reg no')
end
end
context 'when registrant is private entity' do
let(:registrant) { build_stubbed(:registrant_private_entity) }
it 'is absent' do
expect(reg_no).to be_nil
end
end
end
describe 'country code' do
subject(:country_code) { generated_json[:registrant_ident_country_code] }
before do
allow(registrant).to receive(:ident_country_code).and_return('test country code')
end
context 'when registrant is legal entity' do
let(:registrant) { build_stubbed(:registrant_legal_entity) }
it 'is present' do
expect(country_code).to eq('test country code')
end
end
context 'when registrant is private entity' do
let(:registrant) { build_stubbed(:registrant_private_entity) }
it 'is absent' do
expect(country_code).to be_nil
end
end
end
end
end

View file

@ -20,6 +20,7 @@ require 'support/paper_trail'
require 'support/settings' require 'support/settings'
ActiveRecord::Migration.maintain_test_schema! ActiveRecord::Migration.maintain_test_schema!
Setting.registry_country_code = 'US'
RSpec.configure do |config| RSpec.configure do |config|
config.include ActionView::TestCase::Behavior, type: :presenter config.include ActionView::TestCase::Behavior, type: :presenter

View file

@ -1,3 +1,8 @@
one: one:
sum: 1 sum: 1
currency: EUR currency: EUR
for_payments_test:
description: "Order nr. 1"
currency: "EUR"
iban: "1234"

View file

@ -76,7 +76,7 @@ not_in_use:
invalid: invalid:
name: any name: any
code: any code: invalid
email: invalid@invalid.test email: invalid@invalid.test
auth_info: any auth_info: any
registrar: bestnames registrar: bestnames

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