diff --git a/CHANGELOG.md b/CHANGELOG.md index 68391b057..1d0aaac56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,55 @@ +14.07.2016 +* Registry: + * whois records generation fix in contact.rb model (#117612931) + * english translation fix for pending_update_notification_for_new_registrant automated registrant message + +16.06.2016 +* EPP + * BUG: XML syntax error for poll and logout if optional clTRID is missing (#121580929) + * support for glue records with ipv6 addresses only (#120095555) + +15.06.2016 +* Portal for registrants + * Notice on login screen on limited access to Estonian electronic IDs (#120182999) +* Admin interface: + * epp log view has now reference to the object name for better usability (#118912395) + * BUG: dnssec data missing from domain history view (#115762063) + * BUG: internal error in doamin history view in case some contact has been deleted (#118300251) +* Registry: + * all values sent over epp are now trimmed of beginning and trailing spaces (#117690107) + * typo and form fixes for automated e-mail messages sent to domain contacts +* EPP: + * BUG: error 2005 on adding IDN nameservers (#114677695) + * BUG: nameserver lable maximum 63 char length validation handled inproperly (#114677695) - support currently limited to Estonian IDN characters. + * BUG: validation passes out of range ident_type values - now limited to org, priv and birthday (#111601356) + * BUG: internal error on hello (#120828283) + * BUG: internal error broken incoming frame (#121580929) +* Deploy: + * BUG: incorrect version in commit message on deploy - config/deploy-example.rb (#120259603) + +20.05.2016 +* Portal for registrars + * domain details view new displays contact name in addition to ID (#117226457) + * added an option to set veryfied = "yes" parameter to GUI for registrant change and domain delete opertions (#116209751) +* Admin interface + * BUG: fixed number of sorting issues on different views (#117350717) + * BUG: internal error on filtered list sorting (#115043065) + * BUG: account activities csv export messes up registrars (#117702653) + * usability fixes to history view (#115762063) +* Registry + * epp-xml gem reference updated to v 1.0.5 (#116209751) + * epp-xml gem is now taken from local repo https://github.com/internetee/epp-xml/blob/master, the version in RubyGems is not updated any more (#116209751) + * BUG: domains set to force delete were deleted a day ahead of time (#117131083) + * BUG: QUE - undefined method `code' for nil:NilClass - if contact is removed before Que gets to it (#117612061) + * BUG: Que - uninitialized constant RegenerateWhoisRecordJob (#117986917) +* EPP + * BUG: poll message on domain delete does not validate against .ee xml schemas (#118827261) + * BUG: internal error on domain delete (#118159567) +* RestWHOIS + * BUG: statuses not in array for not registered reserved and blocked domains (#118911315) + +... + 21.09.2015 * eis-1.0.xsd schema file updated without a new version, please publish a new updated schema file to public. diff --git a/Gemfile b/Gemfile index d616cb534..06b82dce2 100644 --- a/Gemfile +++ b/Gemfile @@ -31,7 +31,7 @@ gem 'rails-settings-cached', '0.4.1' # for settings # html-xml gem 'haml-rails', '0.9.0' # haml for views -gem 'nokogiri', '1.6.7.2' # For XML parsing +gem 'nokogiri', '1.6.8' # For XML parsing # style gem 'sass-rails', '5.0.3' # sass style @@ -88,7 +88,7 @@ gem 'digidoc_client', '0.2.1' # epp gem 'epp', '1.4.2', github: 'internetee/epp' -gem 'epp-xml', '1.0.4' # EIS EPP XMLs +gem 'epp-xml', '1.0.5', github: 'internetee/epp-xml' # EIS EPP XMLs gem 'uuidtools', '2.1.5' # For unique IDs (used by the epp gem) # que diff --git a/Gemfile.lock b/Gemfile.lock index dbc1e8e3c..d779fe3ff 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -16,6 +16,14 @@ GIT data_migrate (1.3.0) rails (>= 4.1.0) +GIT + remote: https://github.com/internetee/epp-xml.git + revision: 475f650951f2cf5015e00d48f408a2194ecc1662 + specs: + epp-xml (1.0.5) + activesupport (~> 4.1) + builder (~> 3.2) + GIT remote: https://github.com/internetee/epp.git revision: 505c3f2739eb1da918e54111aecfb138a822739d @@ -191,9 +199,6 @@ GEM docile (1.1.5) domain_name (0.5.25) unf (>= 0.0.5, < 1.0.0) - epp-xml (1.0.4) - activesupport (~> 4.1) - builder (~> 3.2) equalizer (0.0.11) erubis (2.7.0) execjs (2.6.0) @@ -311,7 +316,7 @@ GEM mina (0.3.1) open4 (~> 1.3.4) rake - mini_portile2 (2.0.0) + mini_portile2 (2.1.0) minitest (5.8.4) monetize (1.1.0) money (~> 6.5.0) @@ -327,8 +332,9 @@ GEM nenv (0.2.0) netrc (0.11.0) newrelic_rpm (3.12.0.288) - nokogiri (1.6.7.2) - mini_portile2 (~> 2.0.0.rc2) + nokogiri (1.6.8) + mini_portile2 (~> 2.1.0) + pkg-config (~> 1.1.7) nori (2.6.0) notiffany (0.0.7) nenv (~> 0.1) @@ -343,6 +349,7 @@ GEM phantomjs (1.9.8.0) phantomjs-binaries (1.9.2.4) sys-uname (= 0.9.0) + pkg-config (1.1.7) poltergeist (1.6.0) capybara (~> 2.1) cliver (~> 0.3.1) @@ -589,7 +596,7 @@ DEPENDENCIES devise (= 3.5.4) digidoc_client (= 0.2.1) epp (= 1.4.2)! - epp-xml (= 1.0.4) + epp-xml (= 1.0.5)! fabrication (= 2.13.2) faker (= 1.4.3) figaro (= 1.1.1) @@ -614,7 +621,7 @@ DEPENDENCIES mina (= 0.3.1) money-rails (= 1.4.1) newrelic_rpm (= 3.12.0.288) - nokogiri (= 1.6.7.2) + nokogiri (= 1.6.8) nprogress-rails (= 0.1.6.7) paper_trail! pdfkit (= 0.6.2) diff --git a/app/api/repp/api.rb b/app/api/repp/api.rb index 7a9ecd1e8..27d0322b0 100644 --- a/app/api/repp/api.rb +++ b/app/api/repp/api.rb @@ -49,7 +49,8 @@ module Repp response_code: status, api_user_name: current_user.try(:username), api_user_registrar: current_user.try(:registrar).try(:to_s), - ip: request.ip + ip: request.ip, + uuid: request.try(:uuid) }) end diff --git a/app/assets/javascripts/admin/application.coffee b/app/assets/javascripts/admin/application.coffee index bdc1a74bb..1b3335d63 100644 --- a/app/assets/javascripts/admin/application.coffee +++ b/app/assets/javascripts/admin/application.coffee @@ -2,6 +2,9 @@ $(document).on 'page:change', -> $('.selectize').selectize({ allowEmptyOption: true }) + $('.selectize_create').selectize({ + allowEmptyOption: true, create: true + }) $('.js-datepicker').datepicker({ showAnim: "", diff --git a/app/assets/javascripts/registrar/application.coffee b/app/assets/javascripts/registrar/application.coffee index 943f14a23..a1a2084fe 100644 --- a/app/assets/javascripts/registrar/application.coffee +++ b/app/assets/javascripts/registrar/application.coffee @@ -29,13 +29,13 @@ $(document).on 'page:change', -> $('.js-contact-form').trigger('restoreDefault') $('[data-legal-document]').each (i, fileInput)-> - minSize = 8 * 1024 # 8kB + minSize = 3 * 1024 # 3kB maxSize = 8 * 1024 * 1024; # 8 MB $(fileInput).closest('form').submit (e) -> if (files = fileInput.files).length fileSize = files[0].size if fileSize < minSize - alert 'Document size should be more than 8kB' + alert 'Document size should be more than 3kB' return false else if fileSize > maxSize alert 'Document size should be less than 8MB' diff --git a/app/controllers/admin/account_activities_controller.rb b/app/controllers/admin/account_activities_controller.rb index 1e1bf9196..4a4fe2307 100644 --- a/app/controllers/admin/account_activities_controller.rb +++ b/app/controllers/admin/account_activities_controller.rb @@ -1,8 +1,8 @@ class Admin::AccountActivitiesController < AdminController load_and_authorize_resource + before_action :set_default_dates, only: [:index] def index # rubocop: disable Metrics/AbcSize - params[:q] ||= {} ca_cache = params[:q][:created_at_lteq] begin @@ -41,4 +41,20 @@ class Admin::AccountActivitiesController < AdminController params[:q][:created_at_lteq] = ca_cache end + + def set_default_dates + params[:q] ||= {} + + if params[:q][:created_at_gteq].nil? && params[:q][:created_at_lteq].nil? && params[:created_after].present? + + default_date = params[:created_after] + + if !['today', 'tomorrow', 'yesterday'].include?(default_date) + default_date = 'today' + end + + params[:q][:created_at_gteq] = Date.send(default_date).strftime("%Y-%m-%d") + end + + end end diff --git a/app/controllers/admin/contacts_controller.rb b/app/controllers/admin/contacts_controller.rb index 3a05bb759..5156578db 100644 --- a/app/controllers/admin/contacts_controller.rb +++ b/app/controllers/admin/contacts_controller.rb @@ -10,22 +10,22 @@ class Admin::ContactsController < AdminController search_params[:registrant_domains_id_not_null] = 1 end - @q = Contact.includes(:registrar).search(search_params) + @q = Contact.includes(:registrar).joins(:registrar).select('contacts.*, registrars.name').search(search_params) @contacts = @q.result(distinct: :true).page(params[:page]) if params[:statuses_contains] - contacts = Contact.includes(:registrar).where( + contacts = Contact.includes(:registrar).joins(:registrar).select('contacts.*, registrars.name').where( "contacts.statuses @> ?::varchar[]", "{#{params[:statuses_contains].join(',')}}" ) else - contacts = Contact.includes(:registrar) + contacts = Contact.includes(:registrar).joins(:registrar).select('contacts.*, registrars.name') end contacts = contacts.where("ident_country_code is null or ident_country_code=''") if params[:only_no_country_code].eql?('1') normalize_search_parameters do - @q = contacts.search(search_params) - @contacts = @q.result(distinct: :true).page(params[:page]) + @q = contacts.includes(:registrar).joins(:registrar).select('contacts.*, registrars.name').search(search_params) + @contacts = @q.result.uniq.page(params[:page]) end @contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 diff --git a/app/controllers/admin/domains_controller.rb b/app/controllers/admin/domains_controller.rb index 36bdefbff..f7914353e 100644 --- a/app/controllers/admin/domains_controller.rb +++ b/app/controllers/admin/domains_controller.rb @@ -9,7 +9,7 @@ class Admin::DomainsController < AdminController params[:q] ||= {} if params[:statuses_contains] domains = Domain.includes(:registrar, :registrant).where( - "statuses @> ?::varchar[]", "{#{params[:statuses_contains].join(',')}}" + "domains.statuses @> ?::varchar[]", "{#{params[:statuses_contains].join(',')}}" ) else domains = Domain.includes(:registrar, :registrant) diff --git a/app/controllers/admin/epp_logs_controller.rb b/app/controllers/admin/epp_logs_controller.rb index deb9ee8e7..46740a8d9 100644 --- a/app/controllers/admin/epp_logs_controller.rb +++ b/app/controllers/admin/epp_logs_controller.rb @@ -1,13 +1,33 @@ class Admin::EppLogsController < AdminController load_and_authorize_resource class: ApiLog::EppLog + before_action :set_default_dates, only: [:index] def index @q = ApiLog::EppLog.search(params[:q]) @q.sorts = 'id desc' if @q.sorts.empty? - @epp_logs = @q.result.page(params[:page]) + + @epp_logs = @q.result + @epp_logs = @epp_logs.where("extract(epoch from created_at) >= extract(epoch from ?::timestamp)", Time.parse(params[:q][:created_at_gteq])) if params[:q][:created_at_gteq].present? + @epp_logs = @epp_logs.where("extract(epoch from created_at) <= extract(epoch from ?::timestamp)", Time.parse(params[:q][:created_at_lteq])) if params[:q][:created_at_lteq].present? + @epp_logs = @epp_logs.page(params[:page]) end def show @epp_log = ApiLog::EppLog.find(params[:id]) end + + def set_default_dates + params[:q] ||= {} + + if params[:q][:created_at_gteq].nil? && params[:q][:created_at_lteq].nil? && params[:created_after].present? + default_date = params[:created_after] + + if !['today', 'tomorrow', 'yesterday'].include?(default_date) + default_date = 'today' + end + + params[:q][:created_at_gteq] = Date.send(default_date).strftime("%Y-%m-%d") + end + + end end diff --git a/app/controllers/admin/registrars_controller.rb b/app/controllers/admin/registrars_controller.rb index cf8c89505..be4b7d092 100644 --- a/app/controllers/admin/registrars_controller.rb +++ b/app/controllers/admin/registrars_controller.rb @@ -57,7 +57,7 @@ class Admin::RegistrarsController < AdminController def registrar_params params.require(:registrar).permit( :name, :reg_no, :vat_no, :street, :city, :state, :zip, :billing_address, - :country_code, :email, :phone, :billing_email, :code + :country_code, :email, :phone, :billing_email, :code, :test_registrar ) end end diff --git a/app/controllers/admin/repp_logs_controller.rb b/app/controllers/admin/repp_logs_controller.rb index e9e35aac0..ff306b0fc 100644 --- a/app/controllers/admin/repp_logs_controller.rb +++ b/app/controllers/admin/repp_logs_controller.rb @@ -1,13 +1,34 @@ class Admin::ReppLogsController < AdminController load_and_authorize_resource class: ApiLog::ReppLog + before_action :set_default_dates, only: [:index] def index @q = ApiLog::ReppLog.search(params[:q]) @q.sorts = 'id desc' if @q.sorts.empty? - @repp_logs = @q.result.page(params[:page]) + + @repp_logs = @q.result + @repp_logs = @repp_logs.where("extract(epoch from created_at) >= extract(epoch from ?::timestamp)", Time.parse(params[:q][:created_at_gteq])) if params[:q][:created_at_gteq].present? + @repp_logs = @repp_logs.where("extract(epoch from created_at) <= extract(epoch from ?::timestamp)", Time.parse(params[:q][:created_at_lteq])) if params[:q][:created_at_lteq].present? + @repp_logs = @repp_logs.page(params[:page]) end def show @repp_log = ApiLog::ReppLog.find(params[:id]) end + + def set_default_dates + params[:q] ||= {} + + if params[:q][:created_at_gteq].nil? && params[:q][:created_at_lteq].nil? && params[:created_after].present? + + default_date = params[:created_after] + + if !['today', 'tomorrow', 'yesterday'].include?(default_date) + default_date = 'today' + end + + params[:q][:created_at_gteq] = Date.send(default_date).strftime("%Y-%m-%d") + end + + end end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index ac26e61a3..fac9d29f4 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -55,6 +55,10 @@ class ApplicationController < ActionController::Base end end + def info_for_paper_trail + { uuid: request.uuid } + end + def user_for_paper_trail user_log_str(current_user) end diff --git a/app/controllers/epp/contacts_controller.rb b/app/controllers/epp/contacts_controller.rb index 5b0a39bbf..117aaabc0 100644 --- a/app/controllers/epp/contacts_controller.rb +++ b/app/controllers/epp/contacts_controller.rb @@ -19,6 +19,8 @@ class Epp::ContactsController < EppController authorize! :create, Epp::Contact @contact = Epp::Contact.new(params[:parsed_frame], current_user.registrar) + @contact.add_legal_file_to_new(params[:parsed_frame]) + if @contact.save render_epp_response '/epp/contacts/create' else @@ -29,7 +31,7 @@ class Epp::ContactsController < EppController def update authorize! :update, @contact, @password - if @contact.update_attributes(params[:parsed_frame]) + if @contact.update_attributes(params[:parsed_frame], current_user) render_epp_response 'epp/contacts/update' else handle_errors(@contact) @@ -39,7 +41,7 @@ class Epp::ContactsController < EppController def delete authorize! :delete, @contact, @password - if @contact.destroy_and_clean + if @contact.destroy_and_clean(params[:parsed_frame]) render_epp_response '/epp/contacts/delete' else handle_errors(@contact) diff --git a/app/controllers/epp/domains_controller.rb b/app/controllers/epp/domains_controller.rb index 91ddeb93d..fb3441580 100644 --- a/app/controllers/epp/domains_controller.rb +++ b/app/controllers/epp/domains_controller.rb @@ -30,6 +30,8 @@ class Epp::DomainsController < EppController handle_errors and return unless balance_ok?('create') # loads pricelist in this method ActiveRecord::Base.transaction do + @domain.add_legal_file_to_new(params[:parsed_frame]) + if @domain.save # TODO: Maybe use validate: false here because we have already validated the domain? current_user.registrar.debit!({ sum: @domain_pricelist.price.amount, diff --git a/app/controllers/epp/keyrelays_controller.rb b/app/controllers/epp/keyrelays_controller.rb index d6515758f..81ff3dd32 100644 --- a/app/controllers/epp/keyrelays_controller.rb +++ b/app/controllers/epp/keyrelays_controller.rb @@ -56,4 +56,8 @@ class Epp::KeyrelaysController < EppController # domain end + + def resource + @domain + end end diff --git a/app/controllers/epp/polls_controller.rb b/app/controllers/epp/polls_controller.rb index 531509a6c..fb032975f 100644 --- a/app/controllers/epp/polls_controller.rb +++ b/app/controllers/epp/polls_controller.rb @@ -54,4 +54,8 @@ class Epp::PollsController < EppController def validate_poll requires_attribute 'poll', 'op', values: %(ack req), allow_blank: true end + + def resource + @message + end end diff --git a/app/controllers/epp/sessions_controller.rb b/app/controllers/epp/sessions_controller.rb index c217d38aa..58a314410 100644 --- a/app/controllers/epp/sessions_controller.rb +++ b/app/controllers/epp/sessions_controller.rb @@ -137,4 +137,9 @@ class Epp::SessionsController < EppController pw = params[:parsed_frame].css('pw').first.text { username: user, password: pw } end + + private + def resource + @api_user + end end diff --git a/app/controllers/epp_controller.rb b/app/controllers/epp_controller.rb index 49be47848..e7d3f0ac1 100644 --- a/app/controllers/epp_controller.rb +++ b/app/controllers/epp_controller.rb @@ -6,8 +6,15 @@ class EppController < ApplicationController before_action :generate_svtrid before_action :latin_only - before_action :validate_against_schema + before_action :validate_request + before_action :update_epp_session + + around_action :catch_epp_errors + + helper_method :current_user + helper_method :resource + def validate_against_schema return if ['hello', 'error', 'keyrelay'].include?(params[:action]) schema.validate(params[:nokogiri_frame]).each do |error| @@ -20,10 +27,7 @@ class EppController < ApplicationController handle_errors and return if epp_errors.any? end - before_action :validate_request - before_action :update_epp_session - around_action :catch_epp_errors def catch_epp_errors err = catch(:epp_error) do yield @@ -34,7 +38,6 @@ class EppController < ApplicationController handle_errors end - helper_method :current_user rescue_from StandardError do |e| @errors ||= [] @@ -361,17 +364,18 @@ class EppController < ApplicationController if request_command == 'login' && frame.present? frame.gsub!(/pw>.+<\//, 'pw>[FILTERED]]+)>([^<])+<\/eis:legalDocument>/, "[FILTERED]") + trimmed_request = frame.gsub(/]+)>([^<])+<\/eis:legalDocument>/, "[FILTERED]") if frame.present? ApiLog::EppLog.create({ request: trimmed_request, request_command: request_command, request_successful: epp_errors.empty?, - request_object: params[:epp_object_type], + request_object: resource ? "#{params[:epp_object_type]}: #{resource.class} - #{resource.id} - #{resource.name}" : params[:epp_object_type], response: @response, api_user_name: @api_user.try(:username) || current_user.try(:username) || 'api-public', api_user_registrar: @api_user.try(:registrar).try(:to_s) || current_user.try(:registrar).try(:to_s), - ip: request.ip + ip: request.ip, + uuid: request.uuid }) end # rubocop: enable Metrics/CyclomaticComplexity @@ -382,4 +386,9 @@ class EppController < ApplicationController return if current_user.blank? counter_update(current_user.registrar_code, ENV['iptables_server_ip']) end + + def resource + name = self.class.to_s.sub("Epp::","").sub("Controller","").underscore.singularize + instance_variable_get("@#{name}") + end end diff --git a/app/controllers/registrant/domain_delete_confirms_controller.rb b/app/controllers/registrant/domain_delete_confirms_controller.rb index f6f05d628..209456808 100644 --- a/app/controllers/registrant/domain_delete_confirms_controller.rb +++ b/app/controllers/registrant/domain_delete_confirms_controller.rb @@ -22,18 +22,18 @@ class Registrant::DomainDeleteConfirmsController < RegistrantController verification_token: params[:token]) if params[:rejected] if @registrant_verification.domain_registrant_delete_reject! - flash[:notice] = t(:registrant_domain_verification_rejected) + flash[:notice] = t(:registrant_domain_delete_rejected) redirect_to registrant_domain_delete_confirm_path(@domain.id, rejected: true) else - flash[:alert] = t(:registrant_domain_verification_rejected_failed) + flash[:alert] = t(:registrant_domain_delete_rejected_failed) return render 'show' end elsif params[:confirmed] if @registrant_verification.domain_registrant_delete_confirm! - flash[:notice] = t(:registrant_domain_verification_confirmed) + flash[:notice] = t(:registrant_domain_delete_confirmed) redirect_to registrant_domain_delete_confirm_path(@domain.id, confirmed: true) else - flash[:alert] = t(:registrant_domain_verification_confirmed_failed) + flash[:alert] = t(:registrant_domain_delete_confirmed_failed) return render 'show' end end diff --git a/app/jobs/domain_delete_confirm_job.rb b/app/jobs/domain_delete_confirm_job.rb index cce230234..e147e3aa8 100644 --- a/app/jobs/domain_delete_confirm_job.rb +++ b/app/jobs/domain_delete_confirm_job.rb @@ -3,17 +3,30 @@ class DomainDeleteConfirmJob < Que::Job # it's recommended to keep transaction against job table as short as possible. ActiveRecord::Base.transaction do domain = Epp::Domain.find(domain_id) + case action when RegistrantVerification::CONFIRMED domain.poll_message!(:poll_pending_delete_confirmed_by_registrant) domain.apply_pending_delete! + raise_errors!(domain) + when RegistrantVerification::REJECTED - DomainMailer.pending_delete_rejected_notification(domain_id, true).deliver domain.statuses.delete(DomainStatus::PENDING_DELETE_CONFIRMATION) domain.poll_message!(:poll_pending_delete_rejected_by_registrant) + domain.cancel_pending_delete + domain.save(validate: false) + raise_errors!(domain) + + DomainMailer.pending_delete_rejected_notification(domain_id, true).deliver end + destroy # it's best to destroy the job in the same transaction end end + + + def raise_errors!(domain) + throw "domain #{domain.name} failed with errors #{domain.errors.full_messages}" if domain.errors.any? + end end diff --git a/app/jobs/domain_delete_job.rb b/app/jobs/domain_delete_job.rb new file mode 100644 index 000000000..7d86e9885 --- /dev/null +++ b/app/jobs/domain_delete_job.rb @@ -0,0 +1,17 @@ +class DomainDeleteJob < Que::Job + + def run(domain_id) + domain = Domain.find(domain_id) + + ::PaperTrail.whodunnit = "job - #{self.class.name}" + WhoisRecord.where(domain_id: domain.id).destroy_all + + domain.destroy + bye_bye = domain.versions.last + domain.registrar.messages.create!( + body: "#{I18n.t(:domain_deleted)}: #{domain.name}", + attached_obj_id: bye_bye.id, + attached_obj_type: bye_bye.class.to_s + ) + end +end diff --git a/app/jobs/domain_set_delete_candidate_job.rb b/app/jobs/domain_set_delete_candidate_job.rb new file mode 100644 index 000000000..f1e489694 --- /dev/null +++ b/app/jobs/domain_set_delete_candidate_job.rb @@ -0,0 +1,10 @@ +class DomainSetDeleteCandidateJob < Que::Job + + def run(domain_id) + domain = Domain.find(domain_id) + domain.statuses << DomainStatus::DELETE_CANDIDATE + ::PaperTrail.whodunnit = "job - #{self.class.name}" + domain.save(validate: false) + DomainDeleteJob.enqueue(domain.id, run_at: rand(((24*60) - (DateTime.now.hour * 60 + DateTime.now.minute))).minutes.from_now) + end +end diff --git a/app/jobs/domain_update_confirm_job.rb b/app/jobs/domain_update_confirm_job.rb index 098b9853e..67007d334 100644 --- a/app/jobs/domain_update_confirm_job.rb +++ b/app/jobs/domain_update_confirm_job.rb @@ -7,8 +7,13 @@ class DomainUpdateConfirmJob < Que::Job case action when RegistrantVerification::CONFIRMED domain.poll_message!(:poll_pending_update_confirmed_by_registrant) + raise_errors!(domain) + domain.apply_pending_update! + raise_errors!(domain) + domain.clean_pendings! + raise_errors!(domain) when RegistrantVerification::REJECTED domain.send_mail :pending_update_rejected_notification_for_new_registrant domain.poll_message!(:poll_pending_update_rejected_by_registrant) @@ -17,4 +22,8 @@ class DomainUpdateConfirmJob < Que::Job destroy # it's best to destroy the job in the same transaction end end + + def raise_errors!(domain) + throw "domain #{domain.name} failed with errors #{domain.errors.full_messages}" if domain.errors.any? + end end diff --git a/app/mailers/contact_mailer.rb b/app/mailers/contact_mailer.rb index 08beae05d..bbfecfca6 100644 --- a/app/mailers/contact_mailer.rb +++ b/app/mailers/contact_mailer.rb @@ -4,6 +4,11 @@ class ContactMailer < ApplicationMailer def email_updated(old_email, email, contact_id, should_deliver) @contact = Contact.find_by(id: contact_id) @old_email = old_email + unless @contact + Rails.logger.info "Cannot send email in #{self.class.name}##{__method__} with contact_id #{contact_id}. It cannot be found" + return + end + return unless email || @contact return if delivery_off?(@contact, should_deliver) diff --git a/app/mailers/domain_mailer.rb b/app/mailers/domain_mailer.rb index 28e232a8c..afdfe89fc 100644 --- a/app/mailers/domain_mailer.rb +++ b/app/mailers/domain_mailer.rb @@ -9,12 +9,34 @@ class DomainMailer < ApplicationMailer compose_from(params) end - def registrant_updated_notification_for_new_registrant(params) - compose_from(params) + + def registrant_updated_notification_for_new_registrant(domain_id, old_registrant_id, new_registrant_id, should_deliver) + @domain = Domain.find_by(id: domain_id) + return unless @domain + return if delivery_off?(@domain, should_deliver) + + @old_registrant = Registrant.find(old_registrant_id) + @new_registrant = Registrant.find(new_registrant_id) + + return if whitelist_blocked?(@new_registrant.email) + mail(to: format(@new_registrant.email), + subject: "#{I18n.t(:registrant_updated_notification_for_new_registrant_subject, + name: @domain.name)} [#{@domain.name}]") end - def registrant_updated_notification_for_old_registrant(params) - compose_from(params) + + def registrant_updated_notification_for_old_registrant(domain_id, old_registrant_id, new_registrant_id, should_deliver) + @domain = Domain.find_by(id: domain_id) + return unless @domain + return if delivery_off?(@domain, should_deliver) + + @old_registrant = Registrant.find(old_registrant_id) + @new_registrant = Registrant.find(new_registrant_id) + + return if whitelist_blocked?(@old_registrant.email) + mail(to: format(@old_registrant.email), + subject: "#{I18n.t(:registrant_updated_notification_for_old_registrant_subject, + name: @domain.name)} [#{@domain.name}]") end def pending_update_rejected_notification_for_new_registrant(params) diff --git a/app/models/account_activity.rb b/app/models/account_activity.rb index 3a0e7dc30..c6523be33 100644 --- a/app/models/account_activity.rb +++ b/app/models/account_activity.rb @@ -6,7 +6,6 @@ class AccountActivity < ActiveRecord::Base belongs_to :bank_transaction belongs_to :invoice - attr_accessor :registrar CREATE = 'create' RENEW = 'renew' @@ -24,14 +23,15 @@ class AccountActivity < ActiveRecord::Base end def to_csv - attributes = %w(registrar description activity_type created_at sum) + attributes = %w(description activity_type created_at sum) CSV.generate(headers: true) do |csv| csv << %w(registrar description activity_type receipt_date sum) all.each do |x| # rubocop:disable Rails/FindEach - x.registrar = Registrar.find(x.account_id).try(:code) - csv << attributes.map { |attr| x.send(attr) } + attrs = [x.account.registrar.try(:code)] + attrs += attributes.map { |attr| x.send(attr) } + csv << attrs end end end diff --git a/app/models/api_user.rb b/app/models/api_user.rb index 260441620..5d6e3afb7 100644 --- a/app/models/api_user.rb +++ b/app/models/api_user.rb @@ -62,6 +62,10 @@ class ApiUser < User username end + def name + username + end + def queued_messages registrar.messages.queued end diff --git a/app/models/bank_transaction.rb b/app/models/bank_transaction.rb index 1a34965bf..daf6abc29 100644 --- a/app/models/bank_transaction.rb +++ b/app/models/bank_transaction.rb @@ -2,7 +2,6 @@ class BankTransaction < ActiveRecord::Base include Versions belongs_to :bank_statement has_one :account_activity - has_many :directo_records, as: :item, class_name: 'Directo'# Deprecated scope :unbinded, lambda { where('id NOT IN (SELECT bank_transaction_id FROM account_activities where bank_transaction_id IS NOT NULL)') diff --git a/app/models/blocked_domain.rb b/app/models/blocked_domain.rb index 2e337dce4..3708dd6e6 100644 --- a/app/models/blocked_domain.rb +++ b/app/models/blocked_domain.rb @@ -40,7 +40,7 @@ class BlockedDomain < ActiveRecord::Base def generate_json h = HashWithIndifferentAccess.new h[:name] = self.name - h[:status] = 'Blocked' + h[:status] = ['Blocked'] h end diff --git a/app/models/contact.rb b/app/models/contact.rb index 0ddf9ef67..ccacd4142 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -12,6 +12,10 @@ class Contact < ActiveRecord::Base # TODO: remove later has_many :depricated_statuses, class_name: 'DepricatedContactStatus', dependent: :destroy + has_paper_trail class_name: "ContactVersion", meta: { children: :children_log } + + attr_accessor :legal_document_id + accepts_nested_attributes_for :legal_documents validates :name, :phone, :email, :ident, :ident_type, @@ -29,9 +33,12 @@ class Contact < ActiveRecord::Base uniqueness: { message: :epp_id_taken }, format: { with: /\A[\w\-\:\.\_]*\z/i, message: :invalid }, length: { maximum: 100, message: :too_long_contact_code } + + validate :val_ident_type validate :val_ident_valid_format? validate :uniq_statuses? validate :validate_html + validate :val_country_code after_initialize do self.statuses = [] if statuses.nil? @@ -39,8 +46,9 @@ class Contact < ActiveRecord::Base self.ident_updated_at = Time.zone.now if new_record? && ident_updated_at.blank? end - before_validation :set_ident_country_code + before_validation :to_upcase_country_code before_validation :prefix_code + before_validation :strip_email before_create :generate_auth_info before_update :manage_emails @@ -76,7 +84,7 @@ class Contact < ActiveRecord::Base ORG = 'org' PRIV = 'priv' - BIRTHDAY = 'birthday' + BIRTHDAY = 'birthday'.freeze PASSPORT = 'passport' IDENT_TYPES = [ @@ -235,6 +243,10 @@ class Contact < ActiveRecord::Base name || '[no name]' end + def val_ident_type + errors.add(:ident_type, :epp_ident_type_invalid, code: code) if !%w(org priv birthday).include?(ident_type) + end + def val_ident_valid_format? case ident_country_code when 'EE'.freeze @@ -247,6 +259,8 @@ class Contact < ActiveRecord::Base if ident.size != 8 || !(ident =~/\A[0-9]{8}\z/) errors.add(:ident, err_msg) end + when BIRTHDAY + errors.add(:ident, err_msg) if id.blank? # only for create action right now. Later for all of them end end end @@ -279,6 +293,10 @@ class Contact < ActiveRecord::Base !org? end + def birthday? + ident_type == BIRTHDAY + end + def generate_auth_info return if @generate_auth_info_disabled return if auth_info.present? @@ -330,22 +348,36 @@ class Contact < ActiveRecord::Base # TODO: refactor, it should not allow to destroy with normal destroy, # no need separate method # should use only in transaction - def destroy_and_clean + def destroy_and_clean frame if domains_present? errors.add(:domains, :exist) return false end + + legal_document_data = Epp::Domain.parse_legal_document_from_frame(frame) + + if legal_document_data + + doc = LegalDocument.create( + documentable_type: Contact, + document_type: legal_document_data[:type], + body: legal_document_data[:body] + ) + self.legal_documents = [doc] + self.legal_document_id = doc.id + self.save + end destroy end - def set_ident_country_code - return true unless ident_country_code_changed? && ident_country_code.present? - code = Country.new(ident_country_code) - if code - self.ident_country_code = code.alpha2 - else - errors.add(:ident, :invalid_country_code) - end + def to_upcase_country_code + self.ident_country_code = ident_country_code.upcase if ident_country_code + self.country_code = country_code.upcase if country_code + end + + def val_country_code + errors.add(:ident, :invalid_country_code) unless Country.new(ident_country_code) + errors.add(:ident, :invalid_country_code) unless Country.new(country_code) end def related_domain_descriptions @@ -392,6 +424,10 @@ class Contact < ActiveRecord::Base "#{code} #{name}" end + def strip_email + self.email = email.to_s.strip + end + # what we can do load firstly by registrant # if total is smaller than needed, the load more @@ -525,9 +561,18 @@ class Contact < ActiveRecord::Base ]).present? end - def update_related_whois_records - names = related_domain_descriptions.keys - UpdateWhoisRecordJob.enqueue(names, :domain) if names.present? - end + def update_related_whois_records + # not doing anything if no real changes + return if changes.slice(*(self.class.column_names - ["updated_at", "created_at", "statuses", "status_notes"])).empty? + + names = related_domain_descriptions.keys + UpdateWhoisRecordJob.enqueue(names, :domain) if names.present? + end + + def children_log + log = HashWithIndifferentAccess.new + log[:legal_documents]= [legal_document_id] + log + end end diff --git a/app/models/counter.rb b/app/models/counter.rb new file mode 100644 index 000000000..7d1c2b926 --- /dev/null +++ b/app/models/counter.rb @@ -0,0 +1,24 @@ +class Counter + def initialize value = 0 + @value = value + end + attr_accessor :value + def method_missing *args, &blk + @value.send(*args, &blk) + end + def to_s + @value.to_s + end + + def now + @value + end + + # pre-increment ".+" when x not present + def next(x = 1) + @value += x + end + def prev(x = 1) + @value -= x + end +end \ No newline at end of file diff --git a/app/models/depp/domain.rb b/app/models/depp/domain.rb index 7b4630008..f181d0000 100644 --- a/app/models/depp/domain.rb +++ b/app/models/depp/domain.rb @@ -66,8 +66,9 @@ module Depp def delete(domain_params) xml = epp_xml.delete({ - name: { value: domain_params[:name] } - }, Depp::Domain.construct_custom_params_hash(domain_params)) + name: { value: domain_params[:name] }}, + Depp::Domain.construct_custom_params_hash(domain_params), + (domain_params[:verified].present? && 'yes')) current_user.request(xml) end @@ -214,7 +215,8 @@ module Depp rem_arr << { _anonymus: rem_anon } if rem_anon.any? if domain_params[:registrant] != old_domain_params[:registrant] - chg = [{ registrant: { value: domain_params[:registrant] } }] + chg = [{ registrant: { value: domain_params[:registrant] } }] if !domain_params[:verified].present? + chg = [{ registrant: { value: domain_params[:registrant], attrs: { verified: 'yes' } } }] if domain_params[:verified] end add_arr = nil if add_arr.none? diff --git a/app/models/directo.rb b/app/models/directo.rb index 66fada5d1..05d9da5aa 100644 --- a/app/models/directo.rb +++ b/app/models/directo.rb @@ -1,4 +1,5 @@ class Directo < ActiveRecord::Base + DOMAIN_TO_PRODUCT = {"ee" => "01EE", "com.ee" => "02COM", "pri.ee" => "03PRI", "fie.ee"=>"04FIE", "med.ee" => "05MED"}.freeze belongs_to :item, polymorphic: true def self.send_receipts @@ -52,9 +53,127 @@ class Directo < ActiveRecord::Base def self.dump_result_to_db mappers, xml Nokogiri::XML(xml).css("Result").each do |res| obj = mappers[res.attributes["docid"].value.to_i] - obj.directo_records.create!(response: res.as_json.to_h) + obj.directo_records.create!(response: res.as_json.to_h, invoice_number: obj.number) obj.update_columns(in_directo: true) Rails.logger.info("[DIRECTO] Invoice #{res.attributes["docid"].value} was pushed and return is #{res.as_json.to_h.inspect}") end end + + + def self.send_monthly_invoices(debug: false) + @debug = debug + I18n.locale = :et + month = Time.now - 1.month + invoices_until = month.end_of_month + date_format = "%Y-%m-%d" + invoice_counter= Counter.new + + min_directo = Setting.directo_monthly_number_min.presence.try(:to_i) + max_directo = Setting.directo_monthly_number_max.presence.try(:to_i) + last_directo = [Setting.directo_monthly_number_last.presence.try(:to_i), min_directo].compact.max || 0 + if max_directo && max_directo <= last_directo + raise "Directo counter is out of period (max allowed number is smaller than last counter number)" + end + + directo_next = last_directo + Registrar.where.not(test_registrar: true).find_each do |registrar| + unless registrar.cash_account + Rails.logger.info("[DIRECTO] Monthly invoice for registrar #{registrar.id} has been skipped as it doesn't has cash_account") + next + end + counter = Counter.new(1) + items = {} + registrar_activities = AccountActivity.where(account_id: registrar.account_ids).where("created_at BETWEEN ? AND ?",month.beginning_of_month, month.end_of_month) + + # adding domains items + registrar_activities.where(activity_type: [AccountActivity::CREATE, AccountActivity::RENEW]).each do |activity| + pricelist = load_activity_pricelist(activity) + unless pricelist + Rails.logger.error("[DIRECTO] Skipping activity #{activity.id} as pricelist not found") + next + end + + pricelist.years_amount.times do |i| + year = i+1 + hash = { + "ProductID" => DOMAIN_TO_PRODUCT[pricelist.category], + "Unit" => "tk", + "ProductName" => ".#{pricelist.category} registreerimine: #{pricelist.years_amount} aasta", + "UnitPriceWoVAT" => pricelist.price_decimal/pricelist.years_amount + } + hash["StartDate"] = (activity.created_at + (year-1).year).end_of_month.strftime(date_format) if year > 1 + hash["EndDate"] = (activity.created_at + (year-1).year + 1).end_of_month.strftime(date_format) if year > 1 + + if items.has_key?(hash) + items[hash]["Quantity"] += 1 + else + items[hash] = {"RN"=>counter.next, "RR" => counter.now - i, "Quantity"=> 1} + end + end + end + + #adding prepaiments + if items.any? + total = 0 + items.each{ |key, val| total += val["Quantity"] * key["UnitPriceWoVAT"] } + hash = {"ProductID" => Setting.directo_receipt_product_name, "Unit" => "tk", "ProductName" => "Domeenide ettemaks", "UnitPriceWoVAT"=>total} + items[hash] = {"RN"=>counter.next, "RR" => counter.now, "Quantity"=> -1} + end + + # generating XML + if items.any? + directo_next += 1 + invoice_counter.next + + builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml| + xml.invoices{ + xml.invoice("Number" =>directo_next, + "InvoiceDate" =>invoices_until.strftime(date_format), + "PaymentTerm" =>Setting.directo_receipt_payment_term, + "CustomerCode"=>registrar.directo_handle, + "Language" =>"", + "Currency" =>registrar_activities.first.currency, + "SalesAgent" =>Setting.directo_sales_agent){ + xml.line("RN" => 1, "RR"=>1, "ProductName"=> "Domeenide registreerimine - #{I18n.l(invoices_until, format: "%B %Y").titleize}") + items.each do |line, val| + xml.line(val.merge(line)) + end + } + } + end + + data = builder.to_xml.gsub("\n",'') + response = RestClient::Request.execute(url: ENV['directo_invoice_url'], method: :post, payload: {put: "1", what: "invoice", xmldata: data}, verify_ssl: false).to_s + if @debug + STDOUT << "#{Time.zone.now.utc} - Directo xml had to be sent #{data}\n" + else + Setting.directo_monthly_number_last = directo_next + Nokogiri::XML(response).css("Result").each do |res| + Directo.create!(request: data, response: res.as_json.to_h, invoice_number: directo_next) + Rails.logger.info("[DIRECTO] Invoice #{res.attributes["docid"].value} was pushed and return is #{res.as_json.to_h.inspect}") + end + end + else + Rails.logger.info("[DIRECTO] Registrar #{registrar.id} has nothing to be sent to Directo") + end + + end + STDOUT << "#{Time.zone.now.utc} - Directo invoices sending finished. #{invoice_counter.now} are sent\n" + end + + + def self.load_activity_pricelist activity + @pricelists ||= {} + return @pricelists[activity.log_pricelist_id] if @pricelists.has_key?(activity.log_pricelist_id) + + pricelist = Pricelist.find_by(id: activity.log_pricelist_id) || PricelistVersion.find_by(item_id: activity.log_pricelist_id).try(:reify) + unless pricelist + @pricelists[activity.log_pricelist_id] = nil + Rails.logger.info("[DIRECTO] AccountActivity #{activity.id} cannot be sent as pricelist wasn't found #{activity.log_pricelist_id}") + return + end + + @pricelists[activity.log_pricelist_id] = pricelist.version_at(activity.created_at) || pricelist + end end + diff --git a/app/models/domain.rb b/app/models/domain.rb index 86b6d4a60..3751da5b6 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -7,6 +7,8 @@ class Domain < ActiveRecord::Base attr_accessor :roles + attr_accessor :legal_document_id + # TODO: whois requests ip whitelist for full info for own domains and partial info for other domains # TODO: most inputs should be trimmed before validatation, probably some global logic? @@ -345,7 +347,8 @@ class Domain < ActiveRecord::Base end - # state change shouln't be + # state changes may be done low-level - no validation + # in this metod we still save PaperTrail log. def clean_pendings_lowlevel statuses.delete(DomainStatus::PENDING_DELETE_CONFIRMATION) statuses.delete(DomainStatus::PENDING_UPDATE) @@ -354,13 +357,23 @@ class Domain < ActiveRecord::Base status_notes[DomainStatus::PENDING_UPDATE] = '' status_notes[DomainStatus::PENDING_DELETE] = '' - update_columns( + hash = { registrant_verification_token: nil, registrant_verification_asked_at: nil, pending_json: {}, status_notes: status_notes, - statuses: statuses.presence || [DomainStatus::OK] - ) + statuses: statuses.presence || [DomainStatus::OK], + # need this column in order to update PaperTrail version properly + updated_at: Time.now.utc + } + + # PaperTrail + self.attributes = hash + record_update + clear_version_instance! + reset_transaction_id + + update_columns(hash) end def pending_update! @@ -384,6 +397,7 @@ class Domain < ActiveRecord::Base self.registrant_verification_token = token self.registrant_verification_asked_at = asked_at set_pending_update + touch_always_version pending_json['new_registrant_id'] = new_registrant_id pending_json['new_registrant_email'] = new_registrant_email pending_json['new_registrant_name'] = new_registrant_name @@ -449,19 +463,14 @@ class Domain < ActiveRecord::Base period_i ||= period unit ||= period_unit + # TODO: test if name.scan(/\.(.+)\z/).first.first is faster zone = name.split('.').drop(1).join('.') p = period_i / 365 if unit == 'd' p = period_i / 12 if unit == 'm' p = period_i if unit == 'y' - if p > 1 - p = "#{p}years" - else - p = "#{p}year" - end - - Pricelist.pricelist_for(zone, operation, p) + Pricelist.pricelist_for(zone, operation, "#{p}year".pluralize(p)) end ### VALIDATIONS ### @@ -469,7 +478,8 @@ class Domain < ActiveRecord::Base def validate_nameserver_ips nameservers.to_a.reject(&:marked_for_destruction?).each do |ns| next unless ns.hostname.end_with?(".#{name}") - next if ns.ipv4.present? + next if ns.ipv4.present? || ns.ipv6.present? + errors.add(:nameservers, :invalid) if errors[:nameservers].blank? ns.errors.add(:ipv4, :blank) end @@ -566,7 +576,7 @@ class Domain < ActiveRecord::Base statuses << DomainStatus::SERVER_MANUAL_INZONE end - self.force_delete_at = Time.zone.now + Setting.redemption_grace_period.days unless force_delete_at + self.force_delete_at = (Time.zone.now + (Setting.redemption_grace_period.days + 1.day)).utc.beginning_of_day unless force_delete_at transaction do save!(validate: false) registrar.messages.create!( @@ -595,7 +605,7 @@ class Domain < ActiveRecord::Base def set_graceful_expired self.outzone_at = valid_to + Setting.expire_warning_period.days - self.delete_at = outzone_at + Setting.redemption_grace_period.days + self.delete_at = (outzone_at + (Setting.redemption_grace_period.days + 1.day)).utc.beginning_of_day self.statuses |= [DomainStatus::EXPIRED] end @@ -603,7 +613,7 @@ class Domain < ActiveRecord::Base # TODO: currently valid_to attribute update logic is open # self.valid_to = valid_from + self.class.convert_period_to_time(period, period_unit) self.outzone_at = Time.zone.now + Setting.expire_warning_period.days - self.delete_at = Time.zone.now + Setting.redemption_grace_period.days + self.delete_at = (Time.zone.now + (Setting.redemption_grace_period.days + 1.day)).utc.beginning_of_day statuses << DomainStatus::EXPIRED end @@ -725,16 +735,14 @@ class Domain < ActiveRecord::Base # rubocop: enable Metrics/CyclomaticComplexity # rubocop: enable Metrics/PerceivedComplexity - - # small optimization that we'are using to_a if it was done already - # otherwise just getting ids def children_log log = HashWithIndifferentAccess.new log[:admin_contacts] = admin_contact_ids log[:tech_contacts] = tech_contact_ids log[:nameservers] = nameserver_ids - log[:domain_statuses]= domain_status_ids log[:dnskeys] = dnskey_ids + log[:domain_statuses]= domain_status_ids + log[:legal_documents]= [legal_document_id] log[:registrant] = [registrant_id] log end diff --git a/app/models/domain_cron.rb b/app/models/domain_cron.rb index 9a12e1f93..6f04b92d5 100644 --- a/app/models/domain_cron.rb +++ b/app/models/domain_cron.rb @@ -65,46 +65,55 @@ class DomainCron marked end - def self.start_delete_period - begin - STDOUT << "#{Time.zone.now.utc} - Setting delete_candidate to domains\n" unless Rails.env.test? + #doing nothing, deprecated - d = Domain.where('delete_at <= ?', Time.zone.now) - marked = 0 - real = 0 - d.each do |domain| - next unless domain.delete_candidateable? - real += 1 - domain.statuses << DomainStatus::DELETE_CANDIDATE - STDOUT << "#{Time.zone.now.utc} DomainCron.start_delete_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test? - domain.save(validate: false) and marked += 1 - end - ensure # the operator should see what was accomplished - STDOUT << "#{Time.zone.now.utc} - Finished setting delete_candidate - #{marked} out of #{real} successfully set\n" unless Rails.env.test? - end - marked + def self.start_delete_period + # begin + # STDOUT << "#{Time.zone.now.utc} - Setting delete_candidate to domains\n" unless Rails.env.test? + # + # d = Domain.where('delete_at <= ?', Time.zone.now) + # marked = 0 + # real = 0 + # d.each do |domain| + # next unless domain.delete_candidateable? + # real += 1 + # domain.statuses << DomainStatus::DELETE_CANDIDATE + # STDOUT << "#{Time.zone.now.utc} DomainCron.start_delete_period: ##{domain.id} (#{domain.name})\n" unless Rails.env.test? + # ::PaperTrail.whodunnit = "cron - #{__method__}" + # domain.save(validate: false) and marked += 1 + # end + # ensure # the operator should see what was accomplished + # STDOUT << "#{Time.zone.now.utc} - Finished setting delete_candidate - #{marked} out of #{real} successfully set\n" unless Rails.env.test? + # end + # marked end def self.destroy_delete_candidates STDOUT << "#{Time.zone.now.utc} - Destroying domains\n" unless Rails.env.test? c = 0 - Domain.where("statuses @> '{deleteCandidate}'::varchar[]").each do |x| - WhoisRecord.where(domain_id: x.id).destroy_all - destroy_with_message x - STDOUT << "#{Time.zone.now.utc} Domain.destroy_delete_candidates: by deleteCandidate ##{x.id} (#{x.name})\n" unless Rails.env.test? - c += 1 + Domain.where('delete_at <= ?', Time.zone.now).each do |x| + next unless x.delete_candidateable? + + x.statuses << DomainStatus::DELETE_CANDIDATE + + # If domain successfully saved, add it to delete schedule + if x.save(validate: false) + ::PaperTrail.whodunnit = "cron - #{__method__}" + DomainDeleteJob.enqueue(x.id, run_at: rand(((24*60) - (DateTime.now.hour * 60 + DateTime.now.minute))).minutes.from_now) + STDOUT << "#{Time.zone.now.utc} Domain.destroy_delete_candidates: job added by deleteCandidate status ##{x.id} (#{x.name})\n" unless Rails.env.test? + c += 1 + end end Domain.where('force_delete_at <= ?', Time.zone.now).each do |x| - WhoisRecord.where(domain_id: x.id).destroy_all - destroy_with_message x - STDOUT << "#{Time.zone.now.utc} DomainCron.destroy_delete_candidates: by force delete time ##{x.id} (#{x.name})\n" unless Rails.env.test? + DomainDeleteJob.enqueue(x.id, run_at: rand(((24*60) - (DateTime.now.hour * 60 + DateTime.now.minute))).minutes.from_now) + STDOUT << "#{Time.zone.now.utc} DomainCron.destroy_delete_candidates: job added by force delete time ##{x.id} (#{x.name})\n" unless Rails.env.test? c += 1 end - STDOUT << "#{Time.zone.now.utc} - Successfully destroyed #{c} domains\n" unless Rails.env.test? + STDOUT << "#{Time.zone.now.utc} - Job destroy added for #{c} domains\n" unless Rails.env.test? end # rubocop: enable Metrics/AbcSize diff --git a/app/models/domain_mail_model.rb b/app/models/domain_mail_model.rb index 46309ad52..d443d8783 100644 --- a/app/models/domain_mail_model.rb +++ b/app/models/domain_mail_model.rb @@ -20,28 +20,7 @@ class DomainMailModel domain_info compose end - - def registrant_updated_notification_for_new_registrant - registrant - subject(:registrant_updated_notification_for_new_registrant_subject) - domain_info - compose - end - def registrant_updated_notification_for_old_registrant - registrant_pending - registrant_old - subject(:registrant_updated_notification_for_old_registrant_subject) - new_registrant = Registrant.find @domain.pending_json['new_registrant_id'] - @params[:registrant_name] = new_registrant.name - @params[:registrant_ident] = new_registrant.ident - @params[:registrant_priv] = new_registrant.priv? - @params[:registrant_email] = new_registrant.email - @params[:registrant_street] = new_registrant.street - @params[:registrant_city] = new_registrant.city - @params[:registrant_country] = new_registrant.country.name - compose - end def pending_update_rejected_notification_for_new_registrant registrant_pending diff --git a/app/models/epp/contact.rb b/app/models/epp/contact.rb index fef4c3eda..bddee18ab 100644 --- a/app/models/epp/contact.rb +++ b/app/models/epp/contact.rb @@ -37,10 +37,7 @@ class Epp::Contact < Contact at[:country_code] = f.css('postalInfo addr cc').text if f.css('postalInfo addr cc').present? at[:auth_info] = f.css('authInfo pw').text if f.css('authInfo pw').present? - legal_frame = f.css('legalDocument').first - if legal_frame.present? - at[:legal_documents_attributes] = legal_document_attrs(legal_frame) - end + at.merge!(ident_attrs(f.css('ident').first)) if new_record at end @@ -104,6 +101,7 @@ class Epp::Contact < Contact res end + end delegate :ident_attr_valid?, to: :class @@ -134,6 +132,9 @@ class Epp::Contact < Contact '2302' => [ # Object exists [:code, :epp_id_taken] ], + '2304' => [ # Object status prohibits operation + [:ident_type, :epp_ident_type_invalid, { value: { obj: 'code', val: code}, interpolation: {code: code}}] + ], '2305' => [ # Association exists [:domains, :exist] ], @@ -143,7 +144,7 @@ class Epp::Contact < Contact end # rubocop:disable Metrics/AbcSize - def update_attributes(frame) + def update_attributes(frame, current_user) return super if frame.blank? at = {}.with_indifferent_access at.deep_merge!(self.class.attrs_from(frame.css('chg'), new_record: false)) @@ -152,8 +153,14 @@ class Epp::Contact < Contact at[:statuses] = statuses - statuses_attrs(frame.css('rem'), 'rem') + statuses_attrs(frame.css('add'), 'add') end - legal_frame = frame.css('legalDocument').first - at[:legal_documents_attributes] = self.class.legal_document_attrs(legal_frame) + # legal_frame = frame.css('legalDocument').first + # at[:legal_documents_attributes] = self.class.legal_document_attrs(legal_frame) + + if doc = attach_legal_document(Epp::Domain.parse_legal_document_from_frame(frame)) + frame.css("legalDocument").first.content = doc.path if doc && doc.persisted? + self.legal_document_id = doc.id + end + self.deliver_emails = true # turn on email delivery for epp @@ -169,6 +176,8 @@ class Epp::Contact < Contact elsif ident_type == "birthday" && !ident[/\A\d{4}-\d{2}-\d{2}\z/] && (Date.parse(ident) rescue false) at.merge!(ident: ident_frame.text) at.merge!(ident_country_code: ident_frame.attr('cc')) if ident_frame.attr('cc').present? + elsif ident_type == "birthday" && ident_country_code.blank? + at.merge!(ident_country_code: ident_frame.attr('cc')) elsif ident_type.blank? && ident_country_code.blank? at.merge!(ident_type: ident_frame.attr('type')) at.merge!(ident_country_code: ident_frame.attr('cc')) if ident_frame.attr('cc').present? @@ -180,6 +189,9 @@ class Epp::Contact < Contact end end + self.upid = current_user.registrar.id if current_user.registrar + self.up_date = Time.zone.now + super(at) end # rubocop:enable Metrics/AbcSize @@ -217,4 +229,29 @@ class Epp::Contact < Contact status_list end + + def attach_legal_document(legal_document_data) + return unless legal_document_data + + legal_documents.create( + document_type: legal_document_data[:type], + body: legal_document_data[:body] + ) + end + + def add_legal_file_to_new frame + legal_document_data = Epp::Domain.parse_legal_document_from_frame(frame) + return unless legal_document_data + + doc = LegalDocument.create( + documentable_type: Contact, + document_type: legal_document_data[:type], + body: legal_document_data[:body] + ) + self.legal_documents = [doc] + + frame.css("legalDocument").first.content = doc.path if doc && doc.persisted? + self.legal_document_id = doc.id + end + end diff --git a/app/models/epp/domain.rb b/app/models/epp/domain.rb index d1da30a2f..c5e298cff 100644 --- a/app/models/epp/domain.rb +++ b/app/models/epp/domain.rb @@ -133,7 +133,8 @@ class Epp::Domain < Domain [:base, :ds_data_not_allowed], [:base, :key_data_not_allowed], [:period, :not_a_number], - [:period, :not_an_integer] + [:period, :not_an_integer], + [:registrant, :cannot_be_missing] ], '2308' => [ [:base, :domain_name_blocked, { value: { obj: 'name', val: name_dirty } }] @@ -155,7 +156,8 @@ class Epp::Domain < Domain def attrs_from(frame, current_user, action = nil) at = {}.with_indifferent_access - code = frame.css('registrant').first.try(:text) + registrant_frame = frame.css('registrant').first + code = registrant_frame.try(:text) if code.present? if action == 'chg' && registrant_change_prohibited? add_epp_error('2304', nil, DomainStatus::SERVER_REGISTRANT_CHANGE_PROHIBITED, I18n.t(:object_status_prohibits_operation)) @@ -166,7 +168,10 @@ class Epp::Domain < Domain else add_epp_error('2303', 'registrant', code, [:registrant, :not_found]) end - end + else + add_epp_error('2306', nil, nil, [:registrant, :cannot_be_missing]) + end if registrant_frame + at[:name] = frame.css('name').text if new_record? at[:registrar_id] = current_user.registrar.try(:id) @@ -195,9 +200,27 @@ class Epp::Domain < Domain end at[:dnskeys_attributes] = dnskeys_attrs(dnskey_frame, action) - at[:legal_documents_attributes] = legal_document_from(frame) + at end + + + # Adding legal doc to domain and + # if something goes wrong - raise Rollback error + def add_legal_file_to_new frame + legal_document_data = Epp::Domain.parse_legal_document_from_frame(frame) + return unless legal_document_data + + doc = LegalDocument.create( + documentable_type: Domain, + document_type: legal_document_data[:type], + body: legal_document_data[:body] + ) + self.legal_documents = [doc] + + frame.css("legalDocument").first.content = doc.path if doc && doc.persisted? + self.legal_document_id = doc.id + end # rubocop: enable Metrics/PerceivedComplexity # rubocop: enable Metrics/CyclomaticComplexity # rubocop: enable Metrics/MethodLength @@ -457,15 +480,6 @@ class Epp::Domain < Domain status_list end - def legal_document_from(frame) - ld = frame.css('legalDocument').first - return [] unless ld - - [{ - body: ld.text, - document_type: ld['type'] - }] - end # rubocop: disable Metrics/AbcSize # rubocop: disable Metrics/CyclomaticComplexity @@ -477,6 +491,7 @@ class Epp::Domain < Domain if doc = attach_legal_document(Epp::Domain.parse_legal_document_from_frame(frame)) frame.css("legalDocument").first.content = doc.path if doc && doc.persisted? + self.legal_document_id = doc.id end at_add = attrs_from(frame.css('add'), current_user, 'add') @@ -489,6 +504,11 @@ class Epp::Domain < Domain # at[:statuses] += at_add[:domain_statuses_attributes] + if errors.empty? && verify + self.upid = current_user.registrar.id if current_user.registrar + self.up_date = Time.zone.now + end + if registrant_id && registrant.code == frame.css('registrant') throw :epp_error, { @@ -515,19 +535,23 @@ class Epp::Domain < Domain preclean_pendings user = ApiUser.find(pending_json['current_user_id']) frame = Nokogiri::XML(pending_json['frame']) + old_registrant_id = registrant_id self.deliver_emails = true # turn on email delivery self.statuses.delete(DomainStatus::PENDING_UPDATE) + self.upid = user.registrar.id if user.registrar + self.up_date = Time.zone.now ::PaperTrail.whodunnit = user.id_role_username # updator str should be the request originator not the approval user - send_mail :registrant_updated_notification_for_old_registrant return unless update(frame, user, false) clean_pendings! - send_mail :registrant_updated_notification_for_new_registrant - WhoisRecord.find_by(domain_id: id).save # need to reload model - save! # for notification if everything fails + + WhoisRecord.find_by(domain_id: id).save # need to reload model + DomainMailer.registrant_updated_notification_for_old_registrant(id, old_registrant_id, registrant_id, true).deliver + DomainMailer.registrant_updated_notification_for_new_registrant(id, old_registrant_id, registrant_id, true).deliver + true end @@ -576,7 +600,7 @@ class Epp::Domain < Domain msg: I18n.t(:object_status_prohibits_operation) } unless pending_deletable? - self.delete_at = Time.zone.now + Setting.redemption_grace_period.days + self.delete_at = (Time.zone.now + (Setting.redemption_grace_period.days + 1.day)).utc.beginning_of_day set_pending_delete set_server_hold if server_holdable? save(validate: false) diff --git a/app/models/legal_document.rb b/app/models/legal_document.rb index e807ae2f7..b4bf3c96b 100644 --- a/app/models/legal_document.rb +++ b/app/models/legal_document.rb @@ -1,4 +1,7 @@ class LegalDocument < ActiveRecord::Base + include EppErrors + MIN_BODY_SIZE = (1.37 * 3.kilobytes).ceil + if ENV['legal_document_types'].present? TYPES = ENV['legal_document_types'].split(',').map(&:strip) else @@ -10,11 +13,22 @@ class LegalDocument < ActiveRecord::Base belongs_to :documentable, polymorphic: true - validates :body, length: { minimum: (1.37 * 8.kilobytes).ceil }, if: ->(file){ file.path.blank? && !Rails.env.staging?} + validate :val_body_length, if: ->(file){ file.path.blank? && !Rails.env.staging?} before_create :add_creator before_save :save_to_filesystem + def epp_code_map + { + '2306' => [ + [:body, :length] + ] + } + end + + def val_body_length + errors.add(:body, :length) if body.nil? || body.size < MIN_BODY_SIZE + end def save_to_filesystem diff --git a/app/models/message.rb b/app/models/message.rb index 174edc8ef..10d823e63 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -12,4 +12,8 @@ class Message < ActiveRecord::Base self.queued = false save end + + def name + "-" + end end diff --git a/app/models/nameserver.rb b/app/models/nameserver.rb index ccedf0880..86cd7e002 100644 --- a/app/models/nameserver.rb +++ b/app/models/nameserver.rb @@ -8,7 +8,7 @@ class Nameserver < ActiveRecord::Base # scope :owned_by_registrar, -> (registrar) { joins(:domain).where('domains.registrar_id = ?', registrar.id) } # rubocop: disable Metrics/LineLength - validates :hostname, format: { with: /\A(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])\z/ } + validates :hostname, format: { with: /\A(([a-zA-Z0-9]|[a-zA-ZäöüõšžÄÖÜÕŠŽ0-9][a-zA-ZäöüõšžÄÖÜÕŠŽ0-9\-]*[a-zA-ZäöüõšžÄÖÜÕŠŽ0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])\z/ } # validates :ipv4, format: { with: /\A(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\z/, allow_blank: true } # validates :ipv6, format: { with: /(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/, allow_blank: true } validate :val_ipv4 @@ -16,7 +16,9 @@ class Nameserver < ActiveRecord::Base # rubocop: enable Metrics/LineLength before_validation :normalize_attributes - + before_validation :check_puny_symbols + before_validation :check_label_length + delegate :name, to: :domain, prefix: true def epp_code_map @@ -26,10 +28,11 @@ class Nameserver < ActiveRecord::Base ], '2005' => [ [:hostname, :invalid, { value: { obj: 'hostAttr', val: hostname } }], + [:hostname, :puny_to_long, { value: { obj: 'hostAttr', val: hostname } }], [:ipv4, :invalid, { value: { obj: 'hostAddr', val: ipv4 } }], [:ipv6, :invalid, { value: { obj: 'hostAddr', val: ipv6 } }] ], - '2306' => [ + '2003' => [ [:ipv4, :blank] ] } @@ -41,10 +44,26 @@ class Nameserver < ActiveRecord::Base self.ipv6 = Array(ipv6).reject(&:blank?).map(&:strip).map(&:upcase) end + def check_label_length + hostname_puny.split('.').each do |label| + errors.add(:hostname, :puny_to_long) if label.length > 63 + end + end + + def check_puny_symbols + regexp = /(\A|\.)..--/ + errors.add(:hostname, :invalid) if hostname =~ regexp + end + def to_s hostname end + def hostname=(hostname) + self[:hostname] = SimpleIDN.to_unicode(hostname) + self[:hostname_puny] = SimpleIDN.to_ascii(hostname) + end + def val_ipv4 regexp = /\A(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\z/ ipv4.to_a.each do |ip| diff --git a/app/models/pricelist.rb b/app/models/pricelist.rb index 17420dfa1..d38e4290d 100644 --- a/app/models/pricelist.rb +++ b/app/models/pricelist.rb @@ -8,6 +8,8 @@ class Pricelist < ActiveRecord::Base ) } + scope :valid_at, ->(time){ where("valid_from IS NULL OR valid_from <= ?", time).where("valid_to IS NULL OR valid_to >= ?", time) } + monetize :price_cents validates :price_cents, :price_currency, :price, @@ -27,6 +29,14 @@ class Pricelist < ActiveRecord::Base "#{operation_category} #{category}" end + def years_amount + duration.to_i + end + + def price_decimal + price_cents / BigDecimal.new('100') + end + class << self def pricelist_for(zone, operation, period) lists = valid.where(category: zone, operation_category: operation, duration: period) diff --git a/app/models/registrant_user.rb b/app/models/registrant_user.rb index 413ff1202..12cae0d82 100644 --- a/app/models/registrant_user.rb +++ b/app/models/registrant_user.rb @@ -30,10 +30,20 @@ class RegistrantUser < User return false if issuer_organization != ACCEPTED_ISSUER idc_data.force_encoding('UTF-8') - identity_code = idc_data.scan(/serialNumber=(\d+)/).flatten.first - country = idc_data.scan(/^\/C=(.{2})/).flatten.first - first_name = idc_data.scan(%r{/GN=(.+)/serialNumber}).flatten.first - last_name = idc_data.scan(%r{/SN=(.+)/GN}).flatten.first + + # handling here new and old mode + if idc_data.starts_with?("/") + identity_code = idc_data.scan(/serialNumber=(\d+)/).flatten.first + country = idc_data.scan(/^\/C=(.{2})/).flatten.first + first_name = idc_data.scan(%r{/GN=(.+)/serialNumber}).flatten.first + last_name = idc_data.scan(%r{/SN=(.+)/GN}).flatten.first + else + parse_str = "," + idc_data + identity_code = parse_str.scan(/,serialNumber=(\d+)/).flatten.first + country = parse_str.scan(/,C=(.{2})/).flatten.first + first_name = parse_str.scan(/,GN=([^,]+)/).flatten.first + last_name = parse_str.scan(/,SN=([^,]+)/).flatten.first + end u = where(registrant_ident: "#{country}-#{identity_code}").first_or_create u.username = "#{first_name} #{last_name}" diff --git a/app/models/reserved_domain.rb b/app/models/reserved_domain.rb index 9f36fcebc..e80b96c24 100644 --- a/app/models/reserved_domain.rb +++ b/app/models/reserved_domain.rb @@ -65,7 +65,7 @@ class ReservedDomain < ActiveRecord::Base def generate_json h = HashWithIndifferentAccess.new h[:name] = self.name - h[:status] = 'Reserved' + h[:status] = ['Reserved'] h end diff --git a/app/views/admin/account_activities/index.haml b/app/views/admin/account_activities/index.haml index e29f12f75..0a60e0809 100644 --- a/app/views/admin/account_activities/index.haml +++ b/app/views/admin/account_activities/index.haml @@ -56,7 +56,7 @@ %thead %tr %th{class: 'col-xs-2'} - = sort_link(@q, 'registrar') + = sort_link(@q, 'account_registrar_code', t(:registrar)) %th{class: 'col-xs-3'} = sort_link(@q, 'description') %th{class: 'col-xs-2'} diff --git a/app/views/admin/domains/partials/_version.haml b/app/views/admin/domains/partials/_version.haml index 580a5589a..38c4474e8 100644 --- a/app/views/admin/domains/partials/_version.haml +++ b/app/views/admin/domains/partials/_version.haml @@ -1,4 +1,4 @@ -- statuses_link ||= false +-#- statuses_link ||= false - version ||= false - domain ||= false - pending_user ||= false @@ -21,7 +21,12 @@ - dnskeys = domain.dnskeys - tech_contacts = domain.tech_contacts - admin_contacts = domain.admin_contacts - - registrant = [domain.registrant] + - registrant = domain.registrant + - unless registrant + - ver = ContactVersion.where(item_id: domain.registrant_id).where(event: :destroy).last + - registrant = ver.reify + - registrant.version_loader = ver + - registrant = [registrant] - creator = pending_user.try(:username) - event = 'pending' - whodunnit = false @@ -29,7 +34,7 @@ %td %p.nowrap = l(domain.updated_at, format: :shorts) - - if statuses_link + -#- if statuses_link %br= link_to t(:edit_statuses), edit_admin_domain_path(params[:domain_id]) %p.text-right diff --git a/app/views/admin/domains/versions.haml b/app/views/admin/domains/versions.haml index cfef69872..6dbf706f6 100644 --- a/app/views/admin/domains/versions.haml +++ b/app/views/admin/domains/versions.haml @@ -19,7 +19,7 @@ %th{class: 'col-xs-2'}= t(:registrar) %tbody - - if @pending_domain.present? + -#- if @pending_domain.present? %tr.small = render 'admin/domains/partials/version', domain: @pending_domain, pending_user: @pending_user, statuses_link: true diff --git a/app/views/admin/epp_logs/index.haml b/app/views/admin/epp_logs/index.haml index fa2e64267..3bb8536d3 100644 --- a/app/views/admin/epp_logs/index.haml +++ b/app/views/admin/epp_logs/index.haml @@ -11,8 +11,10 @@ = f.select :request_command_eq, [[t(:choose),''], 'hello', 'login', 'logout', 'info', 'create', 'update', 'delete', 'check', 'renew', 'transfer', 'poll', 'keyrelay'], {}, class: 'form-control selectize', placeholder: t(:choose) .col-md-3 .form-group + - opts = [[t(:choose),''], 'contact', 'domain', 'poll', 'keyrelay'] + - opts += [params[:q][:request_object_cont]] if params[:q].present? && params[:q][:request_object_cont].present? = f.label :request_object - = f.select :request_object_eq, [[t(:choose),''], 'contact', 'domain', 'poll', 'keyrelay'], {}, class: 'form-control selectize', placeholder: t(:choose) + = f.select :request_object_cont, opts, {}, class: 'form-control selectize_create', placeholder: t(:choose) .col-md-3 .form-group = f.label :request_successful @@ -29,11 +31,11 @@ .col-md-3 .form-group = f.label t(:created_after) - = f.search_field :created_at_gteq, class: 'form-control', placeholder: t(:created_after), autocomplete: 'off' + = f.search_field :created_at_gteq, value: params[:q][:created_at_gteq], class: 'form-control datepicker', placeholder: t(:created_after), autocomplete: 'off' .col-md-3 .form-group = f.label t(:created_before) - = f.search_field :created_at_lteq, class: 'form-control', placeholder: t(:created_before), autocomplete: 'off' + = f.search_field :created_at_lteq, value: params[:q][:created_at_lteq], class: 'form-control datepicker', placeholder: t(:created_before), autocomplete: 'off' .col-md-3{style: 'padding-top: 25px;'} %button.btn.btn-primary   diff --git a/app/views/admin/registrars/_form.haml b/app/views/admin/registrars/_form.haml index f00bf6a14..48cfc8066 100644 --- a/app/views/admin/registrars/_form.haml +++ b/app/views/admin/registrars/_form.haml @@ -82,6 +82,11 @@ = f.label :code .col-md-7 = f.text_field(:code, class: 'form-control', disabled: !f.object.new_record?) + .form-group + .col-md-4.control-label + = f.label :test_registrar + .col-md-7 + = f.check_box :test_registrar, class: 'form-control' %hr .row diff --git a/app/views/admin/registrars/index.haml b/app/views/admin/registrars/index.haml index 8ba45d205..4e1c78294 100644 --- a/app/views/admin/registrars/index.haml +++ b/app/views/admin/registrars/index.haml @@ -14,12 +14,15 @@ = sort_link(@q, 'reg_no', t(:reg_no)) %th{class: 'col-xs-4'} = t(:credit_balance) + %th{class: 'col-xs-4'} + = t(:test_registrar) %tbody - @registrars.each do |x| %tr %td= link_to(x, [:admin, x]) %td= x.reg_no %td= "#{x.balance}" + %td= "#{x.test_registrar}" .row .col-md-12 = paginate @registrars diff --git a/app/views/admin/registrars/show.haml b/app/views/admin/registrars/show.haml index 35938c0c6..c1c8ebf6c 100644 --- a/app/views/admin/registrars/show.haml +++ b/app/views/admin/registrars/show.haml @@ -2,6 +2,10 @@ = link_to(t(:edit), edit_admin_registrar_path(@registrar), class: 'btn btn-primary') = link_to(t(:delete), admin_registrar_path(@registrar), method: :delete, data: { confirm: t(:are_you_sure) }, class: 'btn btn-danger') +- content_for :page_name do + = @registrar.name + - if @registrar.test_registrar? + %span{style: "color: #c9302c;"} (test) = render 'shared/title', name: @registrar.name - if @registrar.errors.any? diff --git a/app/views/admin/repp_logs/index.haml b/app/views/admin/repp_logs/index.haml index 0d33c4a6b..49c74405b 100644 --- a/app/views/admin/repp_logs/index.haml +++ b/app/views/admin/repp_logs/index.haml @@ -29,11 +29,11 @@ .col-md-3 .form-group = f.label t(:created_after) - = f.search_field :created_at_gteq, class: 'form-control', placeholder: t(:created_after), autocomplete: 'off' + = f.search_field :created_at_gteq, value: params[:q][:created_at_gteq], class: 'form-control datepicker', placeholder: t(:created_after), autocomplete: 'off' .col-md-3 .form-group = f.label t(:created_before) - = f.search_field :created_at_lteq, class: 'form-control', placeholder: t(:created_before), autocomplete: 'off' + = f.search_field :created_at_lteq, value: params[:q][:created_at_lteq], class: 'form-control datepicker', placeholder: t(:created_before), autocomplete: 'off' .col-md-3{style: 'padding-top: 25px;'} %button.btn.btn-primary   diff --git a/app/views/admin/settings/index.haml b/app/views/admin/settings/index.haml index 863d197d0..6c7e3d74c 100644 --- a/app/views/admin/settings/index.haml +++ b/app/views/admin/settings/index.haml @@ -69,6 +69,9 @@ %tbody = render 'setting_row', var: :invoice_number_min = render 'setting_row', var: :invoice_number_max + = render 'setting_row', var: :directo_monthly_number_min + = render 'setting_row', var: :directo_monthly_number_max + = render 'setting_row', var: :directo_monthly_number_last = render 'setting_row', var: :days_to_keep_invoices_active = render 'setting_row', var: :days_to_keep_overdue_invoices_active = render 'setting_row', var: :minimum_deposit diff --git a/app/views/epp/poll/poll_req.xml.builder b/app/views/epp/poll/poll_req.xml.builder index 605ca496e..d5da707a6 100644 --- a/app/views/epp/poll/poll_req.xml.builder +++ b/app/views/epp/poll/poll_req.xml.builder @@ -9,15 +9,11 @@ xml.epp_head do xml.msg @message.body end - xml.resData do - case @message.attached_obj_type - when 'DomainTransfer' - xml << render('epp/domains/partials/transfer', builder: xml, dt: @object) - when 'DomainVersion' - xml << render('epp/domains/partials/delete_complete', builder: xml, bye_bye: @object) - end - end if @object - + if @message.attached_obj_type == 'DomainTransfer' + xml.resData do + xml << render('epp/domains/partials/transfer', builder: xml, dt: @object) + end if @object + end render('epp/shared/trID', builder: xml) end end diff --git a/app/views/layouts/admin/application.haml b/app/views/layouts/admin/application.haml index 6baef9abf..9937937e6 100644 --- a/app/views/layouts/admin/application.haml +++ b/app/views/layouts/admin/application.haml @@ -55,7 +55,7 @@ %li= link_to t(:pricelists), admin_pricelists_path %li= link_to t(:bank_statements), admin_bank_statements_path %li= link_to t(:invoices), admin_invoices_path - %li= link_to t(:account_activities), admin_account_activities_path + %li= link_to t(:account_activities), admin_account_activities_path(created_after: 'today') %li.divider %li.dropdown-header= t(:archive) %li= link_to t(:domains_history), admin_domain_versions_path @@ -68,8 +68,8 @@ %li= link_to t(:reserved_domains), admin_reserved_domains_path %li= link_to t(:mail_templates), admin_mail_templates_path -# %li= link_to t(:domains_history), admin_domain_versions_path - %li= link_to t(:epp_logs), admin_epp_logs_path - %li= link_to t(:repp_logs), admin_repp_logs_path + %li= link_to t(:epp_logs), admin_epp_logs_path(created_after: 'today') + %li= link_to t(:repp_logs), admin_repp_logs_path(created_after: 'today') %li= link_to t(:que), '/admin/que' - if signed_in? diff --git a/app/views/mailers/contact_mailer/email_updated.html.erb b/app/views/mailers/contact_mailer/email_updated.html.erb index cd5a75682..6c88f5009 100644 --- a/app/views/mailers/contact_mailer/email_updated.html.erb +++ b/app/views/mailers/contact_mailer/email_updated.html.erb @@ -1,10 +1,10 @@ Tere <%= @contact.name %>

-Kontakti <%= @contact.name %> eposti aadress on muudetud
+Kontakti <%= @contact.name %> e-posti aadress on muudetud
endine aadress: <%= @old_email %>
uus aadress: <%= @contact.email %>

-Eposti aadressile saadetakse domeenidega seotud infot seal hulgas kinnitustaotluseid omaniku vahetuse ja domeeni kustutamise korral. Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduga oma registripidaja poole. Teie registripidaja on <%= @contact.registrar.name %> +E-posti aadressile saadetakse domeeni toimingutega seotud infot, sealhulgas kinnitustaotlused omanikuvahetuse ja domeeni kustutamise korral. Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja <%= @contact.registrar.name %> poole.

<% if @contact.related_domain_descriptions.present? %> Muudatusega seotud domeenid:
@@ -16,14 +16,14 @@ Muudatusega seotud domeenid:
Kontaktandmed:
Nimi: <%= @contact.name %>
Isikukood: <%= @contact.ident %>
-Epost: <%= @contact.email %>
+E-post: <%= @contact.email %>
Tel: <%= @contact.phone %>
Tänav: <%= @contact.street %>
Linn: <%= @contact.city %>
Riik: <%= @contact.country %>

Lugupidamisega
-Eesti Interneti SA +Eesti Interneti Sihtasutus




@@ -52,4 +52,4 @@ City: <%= @contact.city %>
Country: <%= @contact.country %>

Best Regards,
-Eesti Interneti SA +Estonian Internet Foundation diff --git a/app/views/mailers/contact_mailer/email_updated.text.erb b/app/views/mailers/contact_mailer/email_updated.text.erb index a899c04c2..56cb319bc 100644 --- a/app/views/mailers/contact_mailer/email_updated.text.erb +++ b/app/views/mailers/contact_mailer/email_updated.text.erb @@ -1,10 +1,10 @@ Tere <%= @contact.name %> -Kontakti <%= @contact.name %> eposti aadress on muudetud +Kontakti <%= @contact.name %> e-posti aadress on muudetud endine aadress: <%= @old_email %> uus aadress: <%= @contact.email %> -Eposti aadressile saadetakse domeenidega seotud infot seal hulgas kinnitustaotluseid omaniku vahetuse ja domeeni kustutamise korral. Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduga oma registripidaja poole. Teie registripidaja on <%= @contact.registrar.name %> +E-posti aadressile saadetakse domeeni toimingutega seotud infot, sealhulgas kinnitustaotlused omanikuvahetuse ja domeeni kustutamise korral. Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja <%= @contact.registrar.name %> poole. <% if @contact.related_domain_descriptions.present? %> Muudatusega seotud domeenid: @@ -16,14 +16,14 @@ Muudatusega seotud domeenid: Kontaktandmed: Nimi: <%= @contact.name %> Isikukood: <%= @contact.ident %> -Epost: <%= @contact.email %> +E-post: <%= @contact.email %> Tel: <%= @contact.phone %> Tänav: <%= @contact.street %> Linn: <%= @contact.city %> Riik: <%= @contact.country %> Lugupidamisega -Eesti Interneti SA +Eesti Interneti Sihtasutus ---------------------------------------------------------------------------------- @@ -52,4 +52,4 @@ City: <%= @contact.city %> Country: <%= @contact.country %> Best Regards, -Eesti Interneti SA +Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/delete_confirmation.html.erb b/app/views/mailers/domain_mailer/delete_confirmation.html.erb index acc915787..5a7cada60 100644 --- a/app/views/mailers/domain_mailer/delete_confirmation.html.erb +++ b/app/views/mailers/domain_mailer/delete_confirmation.html.erb @@ -1,15 +1,15 @@ -Tere, +Tere

Domeeni <%= @domain.name %> kustutamise taotlus on registreerija poolt kinnitatud. Domeen <%= @domain.name %> on peatatud ja kustub registrist.

Lugupidamisega
-Eesti Interneti SA +Eesti Interneti Sihtasutus




Hi,

-Domain <%= @domain.name %> deletion confirmed and will be deleted. +Domain <%= @domain.name %> deletion is confirmed by the registrant. Domain <%= @domain.name %> is suspended and will be deleted.

Best Regards,
Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/delete_confirmation.text.erb b/app/views/mailers/domain_mailer/delete_confirmation.text.erb index a587b7f78..5d924eca7 100644 --- a/app/views/mailers/domain_mailer/delete_confirmation.text.erb +++ b/app/views/mailers/domain_mailer/delete_confirmation.text.erb @@ -1,15 +1,15 @@ -Tere, +Tere Domeeni <%= @domain.name %> kustutamise taotlus on registreerija poolt kinnitatud. Domeen <%= @domain.name %> on peatatud ja kustub registrist. Lugupidamisega -Eesti Interneti SA +Eesti Interneti Sihtasutus -------------------------------------- Hi, -Domain <%= @domain.name %> deletion confirmed and will be deleted. +Domain <%= @domain.name %> deletion is confirmed by the registrant. Domain <%= @domain.name %> is suspended and will be deleted. Best Regards, Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/expiration_reminder.html.erb b/app/views/mailers/domain_mailer/expiration_reminder.html.erb index e29ca826e..9404838ae 100644 --- a/app/views/mailers/domain_mailer/expiration_reminder.html.erb +++ b/app/views/mailers/domain_mailer/expiration_reminder.html.erb @@ -14,13 +14,8 @@ Registripidaja: <%= @domain.registrar.name %>
Nimeserverid: <%= @domain.nameservers.join(', ') %>
Ülevaate kõikidest endaga seotud domeenidest saate registreerija portaalist. <%= ENV['registrant_url'] %>.


-Parimate soovidega -

-Eesti Interneti Sihtasutus
-Paldiski mnt 80, 10617 Tallinn
-Registrikood: 90010019
-E-post: info@internet.ee
-Tel: +372 727 1000
+Lugupidamisega
+Eesti Interneti Sihtasutus




@@ -29,7 +24,7 @@ Dear user of .ee domain,

The domain name <%= @domain.name %> has expired and will not be available on the Internet from <%= l(@domain.outzone_at, format: :date) %>. From <%= l(@domain.delete_at, format: :date) %>, the <%= @domain.name %> domain will be available for registration on a first come first served basis.

-To renew the domain registration, please contact your registrar <%= @domain.registrar.name %>. You can find the registrar's contacts at http://www.internet.ee/en/registripidajad/. +To renew the domain registration, please contact your registrar <%= @domain.registrar.name %>. You can find the registrar's contacts at http://internet.ee/registrars.

The following data for the <%= @domain.name %> domain have been entered into the registry:

@@ -40,13 +35,8 @@ Registrar: <%= @domain.registrar.name %>
Name servers: <%= @domain.nameservers.join(', ') %>
You can find an overview of all your domains at the registrant's portal. <%= ENV['registrant_url'] %>.


-Sincerely -

-Estonian Internet Foundation
-Paldiski mnt 80, 10617 Tallinn
-Business Registry no: 90010019
-E-mail: info@internet.ee
-Phone: +372 727 1000
+Best Regards,
+Estonian Internet Foundation




@@ -55,7 +45,7 @@ Phone: +372 727 1000

Доменное имя <%= @domain.name %> устарело и с <%= l(@domain.outzone_at, format: :date) %> недоступно в Интернете. С <%= l(@domain.delete_at, format: :date) %> домен <%= @domain.name %> доступен для регистрации всем желающим по принципу "first come, first served".

-Для продления регистрации домена просим обратиться к своему регистратору <%= @domain.registrar.name %>. Контактные данные регистраторов можно найти по адресу http://www.internet.ee/ru/p/. +Для продления регистрации домена просим обратиться к своему регистратору <%= @domain.registrar.name %>. Контактные данные регистраторов можно найти по адресу http://internet.ee/registratory.

Относительно домена <%= @domain.name %> в реестр внесены следующие данные:

@@ -66,10 +56,5 @@ Phone: +372 727 1000
Серверы доменных имен: <%= @domain.nameservers.join(', ') %>
Обзор всех связанных с Вами доменов можете получить на портале регистранта. <%= ENV['registrant_url'] %>.


-С наилучшими пожеланиями -

-Целевое учреждение Eesti Internet
-Paldiski mnt 80, 10617 Tallinn
-Регистрационный код: 90010019
-Э-почта: info@internet.ee
-Тел.: +372 727 1000
\ No newline at end of file +С наилучшими пожеланиями
+Целевое учреждение Eesti Internet diff --git a/app/views/mailers/domain_mailer/expiration_reminder.text.erb b/app/views/mailers/domain_mailer/expiration_reminder.text.erb index d16682ea5..5148df211 100644 --- a/app/views/mailers/domain_mailer/expiration_reminder.text.erb +++ b/app/views/mailers/domain_mailer/expiration_reminder.text.erb @@ -15,12 +15,7 @@ Nimeserverid: <%= @domain.nameservers.join(', ') %> Ülevaate kõikidest endaga seotud domeenidest saate registreerija portaalist. <%= ENV['registrant_url'] %>. Parimate soovidega - Eesti Interneti Sihtasutus -Paldiski mnt 80, 10617 Tallinn -Registrikood: 90010019 -E-post: info@internet.ee -Tel: +372 727 1000 -------------------------------------- @@ -29,7 +24,7 @@ Dear user of .ee domain, The domain name <%= @domain.name %> has expired and will not be available on the Internet from <%= l(@domain.outzone_at, format: :date) %>. From <%= l(@domain.delete_at, format: :date) %>, the <%= @domain.name %> domain will be available for registration on a first come first served basis. -To renew the domain registration, please contact your registrar <%= @domain.registrar.name %>. You can find the registrar's contacts at http://www.internet.ee/en/registripidajad/. +To renew the domain registration, please contact your registrar <%= @domain.registrar.name %>. You can find the registrar's contacts at http://internet.ee/registrars. The following data for the <%= @domain.name %> domain have been entered into the registry: @@ -40,13 +35,8 @@ Registrar: <%= @domain.registrar.name %> Name servers: <%= @domain.nameservers.join(', ') %> You can find an overview of all your domains at the registrant's portal. <%= ENV['registrant_url'] %>. -Sincerely - +Best Regards, Estonian Internet Foundation -Paldiski mnt 80, 10617 Tallinn -Business Registry no: 90010019 -E-mail: info@internet.ee -Phone: +372 727 1000 -------------------------------------- @@ -55,7 +45,7 @@ Phone: +372 727 1000 Доменное имя <%= @domain.name %> устарело и с <%= l(@domain.outzone_at, format: :date) %> недоступно в Интернете. С <%= l(@domain.delete_at, format: :date) %> домен <%= @domain.name %> доступен для регистрации всем желающим по принципу "first come, first served". -Для продления регистрации домена просим обратиться к своему регистратору <%= @domain.registrar.name %>. Контактные данные регистраторов можно найти по адресу http://www.internet.ee/ru/p/. +Для продления регистрации домена просим обратиться к своему регистратору <%= @domain.registrar.name %>. Контактные данные регистраторов можно найти по адресу http://internet.ee/registratory. Относительно домена <%= @domain.name %> в реестр внесены следующие данные: @@ -67,9 +57,4 @@ Phone: +372 727 1000 Обзор всех связанных с Вами доменов можете получить на портале регистранта. <%= ENV['registrant_url'] %>. С наилучшими пожеланиями - Целевое учреждение Eesti Internet -Paldiski mnt 80, 10617 Tallinn -Регистрационный код: 90010019 -Э-почта: info@internet.ee -Тел.: +372 727 1000 \ No newline at end of file diff --git a/app/views/mailers/domain_mailer/force_delete.html.erb b/app/views/mailers/domain_mailer/force_delete.html.erb index 6f4f4cb27..64fa3d2e2 100644 --- a/app/views/mailers/domain_mailer/force_delete.html.erb +++ b/app/views/mailers/domain_mailer/force_delete.html.erb @@ -9,33 +9,33 @@ Lugupeetud domeeni <%= @domain.name %> kontaktisik -

Eesti Interneti SA (EIS) domeeniregistrisse on domeeni <%= @domain.name %> kohta kantud järgmised andmed:

+

.ee domeeniregistrisse on domeeni <%= @domain.name %> kohta kantud järgmised andmed:

Registreerija nimi: <%= @domain.registrant %>
Registrikood: <%= @domain.registrant.try(:ident) %>

-

EIS-le on saanud teatavaks, et juriidiline isik registrikoodiga <%= @domain.registrant.try(:ident) %> on äriregistrist kustutatud.

+

Eesti Interneti Sihtasutusele (EIS) on saanud teatavaks, et juriidiline isik registrikoodiga <%= @domain.registrant.try(:ident) %> on äriregistrist kustutatud.

Kuivõrd äriregistrist kustutatud juriidiline isik ei saa olla domeeni registreerijaks, siis algatas EIS <%= l(Time.zone.now, format: :date) %> vastavalt Domeenireeglite (http://www.internet.ee/domeenid/) punktile 6.4 domeeni <%= @domain.name %> suhtes 30 päeva pikkuse kustutusmenetluse. Kustutamise käigus jääb domeen internetis kättesaadavaks.

-

Domeenireeglite punktist 6.4 tulenevalt on domeeni suhtes õigust omaval registreerijal võimalus esitada domeeni <%= @domain.name %> registripidajale <%= @domain.registrar %> domeeni üleandmise taotlus Domeenireeglite p 5.3.6.2 kohaselt. Taotlusele tuleb lisada domeeni omandamist tõendavad dokumendid, mis asendavad Domeenireeglite punktis 5.3.6.3 sätestatud üleandva registreerija nõusolekut. Vastav dokumentatsioon tuleks esitada Registripidajale esimesel võimalusel.

+

Domeenireeglite punktist 6.4 tulenevalt on domeeni suhtes õigust omaval registreerijal võimalus esitada domeeni <%= @domain.name %> registripidajale <%= @domain.registrar %> domeeni üleandmise taotlus Domeenireeglite p 5.3.6.2 kohaselt. Taotlusele tuleb lisada domeeni omandamist tõendavad dokumendid, mis asendavad Domeenireeglite punktis 5.3.6.3 sätestatud üleandva registreerija nõusolekut. Vastav dokumentatsioon tuleb esitada Registripidajale esimesel võimalusel.

Kui üleandmine ei ole 30 päeva jooksul toimunud, kustub domeen <%= @domain.name %> 24 tunni jooksul <%= l(@domain.force_delete_at, format: :date) %> möödumisest juhuslikult valitud ajahetkel. Soovi korral on võimalik domeen pärast selle kustumist registrist “kes ees, see mees” põhimõttel uuesti registreerida.

-

Lisaküsimuste korral võtke palun ühendust oma registripidajaga <%= @domain.registrar %>, kelle kontaktandmed leiate lingilt http://www.internet.ee/registripidajad



+

Lisaküsimuste korral võtke palun ühendust oma registripidajaga <%= @domain.registrar %>. Registripidajate kontaktid leiate aadressilt http://www.internet.ee/registripidajad



Dear contact of <%= @domain.name %> domain -

The following details for domain name <%= @domain.name %> have been entered into the Estonian Internet Foundation's (EIF) domain registry:

+

The following details for domain name <%= @domain.name %> have been entered into the .ee domain registry:

Registrant's name: <%= @domain.registrant %>
Registry code: <%= @domain.registrant.try(:ident) %>

-

EIF has learned that the legal person with registry code <%= @domain.registrant.try(:ident) %> has been deleted from the Business Registry.

+

Estonian Internet Foundation (EIS) has learned that the legal person with registry code <%= @domain.registrant.try(:ident) %> has been deleted from the Business Registry.

-

As a terminated legal person cannot be the registrant of a domain, the EIF started the deletion process of <%= @domain.name %> domain on <%= l(Time.zone.now, format: :date) %> according to the Domain Regulation (http://www.internet.ee/domains/), using the 30-day delete procedure. The domain will remain available on the Internet during the delete procedure.

+

As a terminated legal person cannot be the registrant of a domain, the EIS started the deletion process of <%= @domain.name %> domain on <%= l(Time.zone.now, format: :date) %> according to the Domain Regulation (http://www.internet.ee/domains/), using the 30-day delete procedure. The domain will remain available on the Internet during the delete procedure.

According to paragraph 6.4 of the Domain Regulation, the registrant holding a right to the domain name <%= @domain.name %> can submit a domain name transfer application to the registrar <%= @domain.registrar %> in accordance with paragraph 5.3.6.2 of the Domain Regulation. The application must be submitted together with documents certifying the acquisition of the domain that will replace the consent of the surrendering registrant as laid down in paragraph 5.3.6.3 of the Domain Regulation. The relevant documents should be submitted to the registrar as soon as possible.

@@ -65,9 +65,9 @@ Registry code: <%= @domain.registrant.try(:ident) %>

diff --git a/app/views/mailers/domain_mailer/force_delete.text.erb b/app/views/mailers/domain_mailer/force_delete.text.erb index d6369c8cb..f82cad6d2 100644 --- a/app/views/mailers/domain_mailer/force_delete.text.erb +++ b/app/views/mailers/domain_mailer/force_delete.text.erb @@ -1,32 +1,32 @@ Lugupeetud domeeni <%= @domain.name %> kontaktisik -Eesti Interneti SA (EIS) domeeniregistrisse on domeeni <%= @domain.name %> kohta kantud järgmised andmed: +.ee domeeniregistrisse on domeeni <%= @domain.name %> kohta kantud järgmised andmed: Registreerija nimi: <%= @domain.registrant %> Registrikood: <%= @domain.registrant.try(:ident) %> -EIS-le on saanud teatavaks, et juriidiline isik registrikoodiga <%= @domain.registrant.try(:ident) %> on äriregistrist kustutatud. +Eesti Interneti Sihtasutusele (EIS) on saanud teatavaks, et juriidiline isik registrikoodiga <%= @domain.registrant.try(:ident) %> on äriregistrist kustutatud. Kuivõrd äriregistrist kustutatud juriidiline isik ei saa olla domeeni registreerijaks, siis algatas EIS <%= l(Time.zone.now, format: :date) %> vastavalt Domeenireeglite (http://www.internet.ee/domeenid/) punktile 6.4 domeeni <%= @domain.name %> suhtes 30 päeva pikkuse kustutusmenetluse. Kustutamise käigus jääb domeen internetis kättesaadavaks. -Domeenireeglite punktist 6.4 tulenevalt on domeeni suhtes õigust omaval registreerijal võimalus esitada domeeni <%= @domain.name %> registripidajale <%= @domain.registrar %> domeeni üleandmise taotlus Domeenireeglite p 5.3.6.2 kohaselt. Taotlusele tuleb lisada domeeni omandamist tõendavad dokumendid, mis asendavad Domeenireeglite punktis 5.3.6.3 sätestatud üleandva registreerija nõusolekut. Vastav dokumentatsioon tuleks esitada Registripidajale esimesel võimalusel. +Domeenireeglite punktist 6.4 tulenevalt on domeeni suhtes õigust omaval registreerijal võimalus esitada domeeni <%= @domain.name %> registripidajale <%= @domain.registrar %> domeeni üleandmise taotlus Domeenireeglite p 5.3.6.2 kohaselt. Taotlusele tuleb lisada domeeni omandamist tõendavad dokumendid, mis asendavad Domeenireeglite punktis 5.3.6.3 sätestatud üleandva registreerija nõusolekut. Vastav dokumentatsioon tuleb esitada Registripidajale esimesel võimalusel. Kui üleandmine ei ole 30 päeva jooksul toimunud, kustub domeen <%= @domain.name %> 24 tunni jooksul <%= l(@domain.force_delete_at, format: :date) %> möödumisest juhuslikult valitud ajahetkel. Soovi korral on võimalik domeen pärast selle kustumist registrist "kes ees, see mees" põhimõttel uuesti registreerida. -Lisaküsimuste korral võtke palun ühendust oma registripidajaga <%= @domain.registrar %>, kelle kontaktandmed leiate lingilt http://www.internet.ee/registripidajad/ +Lisaküsimuste korral võtke palun ühendust oma registripidajaga <%= @domain.registrar %>. Registripidajate kontaktid leiate aadressilt http://www.internet.ee/registripidajad/ Dear contact of <%= @domain.name %> domain -The following details for domain name <%= @domain.name %> have been entered into the Estonian Internet Foundation's (EIF) domain registry: +The following details for domain name <%= @domain.name %> have been entered into the .ee domain registry: Registrant's name: <%= @domain.registrant %> Registry code: <%= @domain.registrant.try(:ident) %> -EIF has learned that the legal person with registry code <%= @domain.registrant.try(:ident) %> has been deleted from the Business Registry. +Estonian Internet Foundation (EIS) has learned that the legal person with registry code <%= @domain.registrant.try(:ident) %> has been deleted from the Business Registry. -As a terminated legal person cannot be the registrant of a domain, the EIF started the deletion process of <%= @domain.name %> domain on <%= l(Time.zone.now, format: :date) %> according to the Domain Regulation (http://www.internet.ee/domains/), using the 30-day delete procedure. The domain will remain available on the Internet during the delete procedure. +As a terminated legal person cannot be the registrant of a domain, the EIS started the deletion process of <%= @domain.name %> domain on <%= l(Time.zone.now, format: :date) %> according to the Domain Regulation (http://www.internet.ee/domains/), using the 30-day delete procedure. The domain will remain available on the Internet during the delete procedure. According to paragraph 6.4 of the Domain Regulation, the registrant holding a right to the domain name <%= @domain.name %> can submit a domain name transfer application to the registrar <%= @domain.registrar %> in accordance with paragraph 5.3.6.2 of the Domain Regulation. The application must be submitted together with documents certifying the acquisition of the domain that will replace the consent of the surrendering registrant as laid down in paragraph 5.3.6.3 of the Domain Regulation. The relevant documents should be submitted to the registrar as soon as possible. @@ -56,8 +56,8 @@ EIS стало известно, что юридическое лицо с ре Lugupidamisega, -Yours Sincerely, +Best Regards, С уважением, --- -Eesti Interneti SA +Eesti Interneti Sihtasutus Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/pending_delete_expired_notification.html.erb b/app/views/mailers/domain_mailer/pending_delete_expired_notification.html.erb index c5ed71c39..ae3dea358 100644 --- a/app/views/mailers/domain_mailer/pending_delete_expired_notification.html.erb +++ b/app/views/mailers/domain_mailer/pending_delete_expired_notification.html.erb @@ -1,15 +1,15 @@ -Tere, +Tere

Domeeni <%= @domain.name %> kustutamise taotlust ei kinnitatud tähtaegselt registreerija <%= @domain.registrant_name %> poolt. Domeeni <%= @domain.name %> kustutamine on sellest tulenevalt tühistatud.

Lugupidamisega
-Eesti Interneti SA +Eesti Interneti Sihtasutus




Hi,

-Domain <%= @domain.name %> deletion cancelled. +Domain <%= @domain.name %> deletion was not approved in time by the registrant <%= @domain.registrant_name %>. Thus the deletion of domain <%= @domain.name %> is cancelled.

Best Regards,
Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/pending_delete_expired_notification.text.erb b/app/views/mailers/domain_mailer/pending_delete_expired_notification.text.erb index 5ff510820..efd6eb449 100644 --- a/app/views/mailers/domain_mailer/pending_delete_expired_notification.text.erb +++ b/app/views/mailers/domain_mailer/pending_delete_expired_notification.text.erb @@ -1,15 +1,15 @@ -Tere, +Tere Domeeni <%= @domain.name %> kustutamise taotlust ei kinnitatud tähtaegselt registreerija <%= @domain.registrant_name %> poolt. Domeeni <%= @domain.name %> kustutamine on sellest tulenevalt tühistatud. Lugupidamisega -Eesti Interneti SA +Eesti Interneti Sihtasutus -------------------------------------- Hi, -Domain <%= @domain.name %> deletion cancelled. +Domain <%= @domain.name %> deletion was not approved in time by the registrant <%= @domain.registrant_name %>. Thus the deletion of domain <%= @domain.name %> is cancelled. Best Regards, Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/pending_delete_rejected_notification.html.erb b/app/views/mailers/domain_mailer/pending_delete_rejected_notification.html.erb index e89a02327..9f381b2c5 100644 --- a/app/views/mailers/domain_mailer/pending_delete_rejected_notification.html.erb +++ b/app/views/mailers/domain_mailer/pending_delete_rejected_notification.html.erb @@ -1,15 +1,15 @@ -Tere, +Tere

-Domeeni <%= @domain.name %> kustutamise taotlus on registreerija <%= @domain.registrar_name %> poolt tagasi lükatud. +Domeeni <%= @domain.name %> kustutamise taotlus on registreerija <%= @domain.registrant_name %> poolt tagasi lükatud.

Lugupidamisega
-Eesti Interneti SA +Eesti Interneti Sihtasutus




Hi,

-Domain <%= @domain.name %> deletion rejected. +Domain <%= @domain.name %> deletion was rejected by the registrant <%= @domain.registrant_name %>.

Best Regards,
Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/pending_delete_rejected_notification.text.erb b/app/views/mailers/domain_mailer/pending_delete_rejected_notification.text.erb index d3600a3c7..8d49983a1 100644 --- a/app/views/mailers/domain_mailer/pending_delete_rejected_notification.text.erb +++ b/app/views/mailers/domain_mailer/pending_delete_rejected_notification.text.erb @@ -1,15 +1,15 @@ -Tere, +Tere -Domeeni <%= @domain.name %> kustutamise taotlus on registreerija <%= @domain.registrar_name %> poolt tagasi lükatud. +Domeeni <%= @domain.name %> kustutamise taotlus on registreerija <%= @domain.registrant_name %> poolt tagasi lükatud. Lugupidamisega -Eesti Interneti SA +Eesti Interneti Sihtasutus -------------------------------------- Hi, -Domain <%= @domain.name %> deletion rejected. +Domain <%= @domain.name %> deletion was rejected by the registrant <%= @domain.registrant_name %>. Best Regards, Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/pending_deleted.html.erb b/app/views/mailers/domain_mailer/pending_deleted.html.erb index 972318ee4..6d0a47f57 100644 --- a/app/views/mailers/domain_mailer/pending_deleted.html.erb +++ b/app/views/mailers/domain_mailer/pending_deleted.html.erb @@ -1,25 +1,25 @@ -Tere, +Tere

-Registrisse laekus taotlus domeeni <%= @domain.name %> kustutamiseks. Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja poole. Teie registripidaja on <%= @domain.registrar_name %> +Registrisse laekus taotlus domeeni <%= @domain.name %> kustutamiseks. Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja <%= @domain.registrar_name %> poole.

-Muudatuse kinnitamiseks külastage palun allolevat võrgulehekülge, kontrollige uuesti üle muudatuse andmed ning vajutage nuppu kinnitan: +Muudatuse kinnitamiseks külastage palun allolevat lehekülge, kontrollige uuesti üle muudatuse andmed ning vajutage nuppu kinnitan.

Taotlus on aktiivne <%= Setting.expire_pending_confirmation %> tundi ja lükatakse automaatselt tagasi kui te seda enne ise ei kinnita või tagasi lükka.
<%= link_to @verification_url, @verification_url %>

Lugupidamisega
-Eesti Interneti SA +Eesti Interneti Sihtasutus




Hi,

-Application for deletion of your domain <%= @domain.name %> has been filed. Please make sure that the application is correct. Incase of problems please turn to your registrar. Your registrar is <%= @domain.registrar_name %> +Application for deletion of your domain <%= @domain.name %> has been filed. Please make sure that the application is correct. Incase of problems please contact your registrar <%= @domain.registrar_name %>.

To confirm the update please visit this website, once again review the data and press approve:
<%= link_to @verification_url, @verification_url %>

-The application will remain in pending status for <%= Setting.expire_pending_confirmation %> hrs and will be automaticcally rejected if it is not approved nor rejected before. +The application will remain in pending status for <%= Setting.expire_pending_confirmation %> hrs and will be automatically rejected if it is not approved nor rejected before.

Best Regards,
Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/pending_deleted.text.erb b/app/views/mailers/domain_mailer/pending_deleted.text.erb index 80e01945a..cc49cbbb0 100644 --- a/app/views/mailers/domain_mailer/pending_deleted.text.erb +++ b/app/views/mailers/domain_mailer/pending_deleted.text.erb @@ -1,25 +1,25 @@ -Tere, +Tere -Registrisse laekus taotlus domeeni <%= @domain.name %> kustutamiseks. Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja poole. Teie registripidaja on <%= @domain.registrar_name %> +Registrisse laekus taotlus domeeni <%= @domain.name %> kustutamiseks. Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja <%= @domain.registrar_name %> poole. -Muudatuse kinnitamiseks külastage palun allolevat võrgulehekülge, kontrollige uuesti üle muudatuse andmed ning vajutage nuppu kinnitan: +Muudatuse kinnitamiseks külastage palun allolevat lehekülge, kontrollige uuesti üle muudatuse andmed ning vajutage nuppu kinnitan. Taotlus on aktiivne <%= Setting.expire_pending_confirmation %> tundi ja lükatakse automaatselt tagasi kui te seda enne ise ei kinnita või tagasi lükka. <%= link_to @verification_url, @verification_url %> Lugupidamisega -Eesti Interneti SA +Eesti Interneti Sihtasutus -------------------------------------- Hi, -Application for deletion of your domain <%= @domain.name %> has been filed. Please make sure that the application is correct. Incase of problems please turn to your registrar. Your registrar is <%= @domain.registrar_name %> +Application for deletion of your domain <%= @domain.name %> has been filed. Please make sure that the application is correct. Incase of problems please contact your registrar <%= @domain.registrar_name %>. To confirm the update please visit this website, once again review the data and press approve: <%= link_to @verification_url, @verification_url %> -The application will remain in pending status for <%= Setting.expire_pending_confirmation %> hrs and will be automaticcally rejected if it is not approved nor rejected before. +The application will remain in pending status for <%= Setting.expire_pending_confirmation %> hrs and will be automatically rejected if it is not approved nor rejected before. Best Regards, Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/pending_update_expired_notification_for_new_registrant.html.erb b/app/views/mailers/domain_mailer/pending_update_expired_notification_for_new_registrant.html.erb index cfa539736..800ff33e1 100644 --- a/app/views/mailers/domain_mailer/pending_update_expired_notification_for_new_registrant.html.erb +++ b/app/views/mailers/domain_mailer/pending_update_expired_notification_for_new_registrant.html.erb @@ -1,19 +1,19 @@ -Tere, +Tere

Domeeni <%= @params[:name] %> registreerija <%= @params[:registrant_name] %> ei kinnitanud tähtaegselt registreerija vahetuse taotlust. Domeeni <%= @params[:name] %> registreerija vahetus on sellest tulenevalt tühistatud.

-Küsimuste korral palun võtke ühendust registripidajaga <%= @params[:registrar_name] %>, kelle kontaktid leiate http://internet.ee/registripidajad/akrediteeritud-registripidajad +Küsimuste korral palun võtke ühendust oma registripidajaga <%= @params[:registrar_name] %>. Registripidajate kontaktid leiate aadressilt www.internet.ee/registripidajad.

Lugupidamisega
-Eesti Interneti SA +Eesti Interneti Sihtasutus




Hi,

-Domain registrant change has been expired for the domain <%= @params[:name] %>. +Domain registrant change request has been expired for the domain <%= @params[:name] %>.

-Please contact to your registrar <%= @params[:registrar_name] %> if you have any questions. +Please contact to your registrar <%= @params[:registrar_name] %> if you have any questions. You can find the registrar's contacts at http://internet.ee/registrars.

Best Regards,
Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/pending_update_expired_notification_for_new_registrant.text.erb b/app/views/mailers/domain_mailer/pending_update_expired_notification_for_new_registrant.text.erb index 626583562..88ddefe9d 100644 --- a/app/views/mailers/domain_mailer/pending_update_expired_notification_for_new_registrant.text.erb +++ b/app/views/mailers/domain_mailer/pending_update_expired_notification_for_new_registrant.text.erb @@ -1,19 +1,19 @@ -Tere, +Tere Domeeni <%= @params[:name] %> registreerija <%= @params[:registrant_name] %> ei kinnitanud tähtaegselt registreerija vahetuse taotlust. Domeeni <%= @params[:name] %> registreerija vahetus on sellest tulenevalt tühistatud. -Küsimuste korral palun võtke ühendust registripidajaga <%= @params[:registrar_name] %>, kelle kontaktid leiate http://internet.ee/registripidajad/akrediteeritud-registripidajad +Küsimuste korral palun võtke ühendust oma registripidajaga <%= @params[:registrar_name] %>. Registripidajate kontaktid leiate aadressilt www.internet.ee/registripidajad. Lugupidamisega -Eesti Interneti SA +Eesti Interneti Sihtasutus -------------------------------------- Hi, -Domain registrant change has been expired for the domain <%= @params[:name] %>. +Domain registrant change request has been expired for the domain <%= @params[:name] %>. -Please contact to your registrar <%= @params[:registrar_name] %> if you have any questions. +Please contact to your registrar <%= @params[:registrar_name] %> if you have any questions. You can find the registrar's contacts at http://internet.ee/registrars. Best Regards, Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/pending_update_notification_for_new_registrant.html.erb b/app/views/mailers/domain_mailer/pending_update_notification_for_new_registrant.html.erb index 07de23117..a58aaef12 100644 --- a/app/views/mailers/domain_mailer/pending_update_notification_for_new_registrant.html.erb +++ b/app/views/mailers/domain_mailer/pending_update_notification_for_new_registrant.html.erb @@ -1,8 +1,8 @@ -Tere, +Tere

Registripidaja <%= @params[:registrar_name] %> vahendusel on algatatud <%= @params[:name] %> domeeni omanikuvahetuse protseduur.

-Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja poole. Teie registripidaja on <%= @params[:registrar_name] %> +Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja <%= @params[:registrar_name] %> poole.

Uue registreerija andmed:
Nimi: <%= @params[:registrant_name] %>
@@ -15,14 +15,14 @@ Tänav: <%= @params[:registrant_street] %>
Linn: <%= @params[:registrant_city] %>
Riik: <%= @params[:registrant_country] %>

-Juhime Teie tähelepanu asjaolule, et omanikuvahetuse protseduur viiaks lõpule vaid juhul, kui domeeni hetkel kehtiv registreerija <%= @params[:old_registrant_name] %> omanikuvahetuse tähtaegselt kinnitab. +Juhime Teie tähelepanu asjaolule, et omanikuvahetuse protseduur viiakse lõpule vaid juhul, kui domeeni hetkel kehtiv registreerija <%= @params[:old_registrant_name] %> omanikuvahetuse tähtaegselt kinnitab.

-Juhul kui <%= @params[:old_registrant_name] %> lükkab omanikuvahtuse taotluse tagasi või ei anna kinnitust enne <%= Setting.expire_pending_confirmation %> tundi, omanikuvahetuse protseduur tühistatakse. +Juhul kui <%= @params[:old_registrant_name] %> lükkab omanikuvahetuse taotluse tagasi või ei anna kinnitust enne <%= Setting.expire_pending_confirmation %> tundi, omanikuvahetuse protseduur tühistatakse.

-Küsimuste korral palun võtke ühendust registripidajaga <%= @params[:registrar_name] %>, kelle kontaktid leiate http://internet.ee/registripidajad/akrediteeritud-registripidajad +Küsimuste korral palun võtke ühendust registripidajaga <%= @params[:registrar_name] %>. Registripidajate kontaktid leiate aadressilt www.internet.ee/registripidajad.

Lugupidamisega
-Eesti Interneti SA +Eesti Interneti Sihtasutus




@@ -30,6 +30,8 @@ Hi,

Registrant change process for the domain <%= @params[:name] %> has been started.

+Please verify the details of the following change request. In case of problems contact your registrar <%= @params[:registrar_name] %> +

New registrant:
Name: <%= @params[:registrant_name] %>
<% if @params[:registrant_priv] %> @@ -41,7 +43,11 @@ Street: <%= @params[:registrant_street] %>
City: <%= @params[:registrant_city] %>
Country: <%= @params[:registrant_country] %>

-Please contact to your registrar <%= @params[:registrar_name] %> if you have any questions. +The registrant change procedure will be completed only after the current registrant <%= @params[:old_registrant_name] %> has approved it. +

+Change request will be cancelled in case <%= @params[:old_registrant_name] %> rejects or does not approve it in <%= Setting.expire_pending_confirmation %> hours. +

+Please contact registrar <%= @params[:registrar_name] %> in case of questions. You can find the registrar's contacts at http://internet.ee/registrars.

Best Regards,
Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/pending_update_notification_for_new_registrant.text.erb b/app/views/mailers/domain_mailer/pending_update_notification_for_new_registrant.text.erb index 24005a58a..9c1a6aebe 100644 --- a/app/views/mailers/domain_mailer/pending_update_notification_for_new_registrant.text.erb +++ b/app/views/mailers/domain_mailer/pending_update_notification_for_new_registrant.text.erb @@ -1,8 +1,8 @@ -Tere, +Tere Registripidaja <%= @params[:registrar_name] %> vahendusel on algatatud <%= @params[:name] %> domeeni omanikuvahetuse protseduur. -Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja poole. Teie registripidaja on <%= @params[:registrar_name] %> +Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja <%= @params[:registrar_name] %> poole. Uue registreerija andmed: Nimi: <%= @params[:registrant_name] %> @@ -15,14 +15,14 @@ Tänav: <%= @params[:registrant_street] %> Linn: <%= @params[:registrant_city] %> Riik: <%= @params[:registrant_country] %> -Juhime Teie tähelepanu asjaolule, et omanikuvahetuse protseduur viiaks lõpule vaid juhul, kui domeeni hetkel kehtiv registreerija <%= @params[:old_registrant_name] %> omanikuvahetuse tähtaegselt kinnitab. +Juhime Teie tähelepanu asjaolule, et omanikuvahetuse protseduur viiakse lõpule vaid juhul, kui domeeni hetkel kehtiv registreerija <%= @params[:old_registrant_name] %> omanikuvahetuse tähtaegselt kinnitab. -Juhul kui <%= @params[:old_registrant_name] %> lükkab omanikuvahtuse taotluse tagasi või ei anna kinnitust enne <%= Setting.expire_pending_confirmation %> tundi, omanikuvahetuse protseduur tühistatakse. +Juhul kui <%= @params[:old_registrant_name] %> lükkab omanikuvahetuse taotluse tagasi või ei anna kinnitust enne <%= Setting.expire_pending_confirmation %> tundi, omanikuvahetuse protseduur tühistatakse. -Küsimuste korral palun võtke ühendust registripidajaga <%= @params[:registrar_name] %>, kelle kontaktid leiate http://internet.ee/registripidajad/akrediteeritud-registripidajad +Küsimuste korral palun võtke ühendust registripidajaga <%= @params[:registrar_name] %>. Registripidajate kontaktid leiate aadressilt www.internet.ee/registripidajad. Lugupidamisega -Eesti Interneti SA +Eesti Interneti Sihtasutus -------------------------------------- @@ -30,6 +30,8 @@ Hi, Registrant change process for the domain <%= @params[:name] %> has been started. +Please verify the details of the following change request. In case of problems contact your registrar <%= @params[:registrar_name] %> + New registrant: Name: <%= @params[:registrant_name] %> <% if @params[:registrant_priv] %> @@ -41,7 +43,11 @@ Street: <%= @params[:registrant_street] %> City: <%= @params[:registrant_city] %> Country: <%= @params[:registrant_country] %> -Please contact to your registrar <%= @params[:registrar_name] %> if you have any questions. +The registrant change procedure will be completed only after the current registrant <%= @params[:old_registrant_name] %> has approved it. + +Change request will be cancelled in case <%= @params[:old_registrant_name] %> rejects or does not approve it in <%= Setting.expire_pending_confirmation %> hours. + +Please contact registrar <%= @params[:registrar_name] %> in case of questions. You can find the registrar's contacts at http://internet.ee/registrars. Best Regards, Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/pending_update_rejected_notification_for_new_registrant.html.erb b/app/views/mailers/domain_mailer/pending_update_rejected_notification_for_new_registrant.html.erb index 1f9acf666..0dca95ee9 100644 --- a/app/views/mailers/domain_mailer/pending_update_rejected_notification_for_new_registrant.html.erb +++ b/app/views/mailers/domain_mailer/pending_update_rejected_notification_for_new_registrant.html.erb @@ -1,19 +1,19 @@ -Tere, +Tere

Domeeni <%= @params[:name] %> registreerija <%= @params[:old_registrant_name] %> on domeeni registreerija vahetamise taotluse tagasi lükanud.

-Küsimuste korral palun võtke ühendust registripidajaga <%= @params[:registrar_name] %>, kelle kontaktid leiate http://internet.ee/registripidajad/akrediteeritud-registripidajad +Küsimuste korral võtke palun ühendust oma registripidajaga <%= @params[:registrar_name] %>. Registripidajate kontaktid leiate aadressilt www.internet.ee/registripidajad.

-Lugupidamisega,
-Eesti Interneti SA +Lugupidamisega
+Eesti Interneti Sihtasutus




Hi,

-Registrant change was declined for the domain <%= @params[:name] %>. +Registrant change for the domain <%= @params[:name] %> was rejected by the registrant <%= @params[:old_registrant_name] %>.

-Please contact to your registrar <%= @params[:registrar_name] %> if you have any questions. +Please contact your registrar <%= @params[:registrar_name] %> if you have any questions. You can find the registrar's contacts at http://internet.ee/registrars.

Best Regards,
Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/pending_update_rejected_notification_for_new_registrant.text.erb b/app/views/mailers/domain_mailer/pending_update_rejected_notification_for_new_registrant.text.erb index 38a83e1b3..bf9ecc80a 100644 --- a/app/views/mailers/domain_mailer/pending_update_rejected_notification_for_new_registrant.text.erb +++ b/app/views/mailers/domain_mailer/pending_update_rejected_notification_for_new_registrant.text.erb @@ -1,19 +1,20 @@ -Tere, +Tere Domeeni <%= @params[:name] %> registreerija <%= @params[:old_registrant_name] %> on domeeni registreerija vahetamise taotluse tagasi lükanud. -Küsimuste korral palun võtke ühendust registripidajaga <%= @params[:registrar_name] %>, kelle kontaktid leiate http://internet.ee/registripidajad/akrediteeritud-registripidajad +Küsimuste korral võtke palun ühendust oma registripidajaga <%= @params[:registrar_name] %>. Registripidajate kontaktid leiate aadressilt www.internet.ee/registripidajad. Lugupidamisega -Eesti Interneti SA +Eesti Interneti Sihtasutus -------------------------------------- Hi, -Registrant change was declined for the domain <%= @params[:name] %>. +Registrant change for the domain <%= @params[:name] %> was rejected by the registrant <%= @params[:old_registrant_name] %> +. -Please contact to your registrar <%= @params[:registrar_name] %> if you have any questions. +Please contact your registrar <%= @params[:registrar_name] %> if you have any questions. You can find the registrar's contacts at http://internet.ee/registrars. Best Regards, Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/pending_update_request_for_old_registrant.html.erb b/app/views/mailers/domain_mailer/pending_update_request_for_old_registrant.html.erb index dc26a9c1c..9015a8945 100644 --- a/app/views/mailers/domain_mailer/pending_update_request_for_old_registrant.html.erb +++ b/app/views/mailers/domain_mailer/pending_update_request_for_old_registrant.html.erb @@ -1,6 +1,6 @@ -Tere, +Tere

-Registrisse laekus taotlus domeeni <%= @params[:name] %> registreerija vahetuseks. Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja poole. Teie registripidaja on <%= @params[:registrar_name] %> +Registrisse laekus taotlus domeeni <%= @params[:name] %> registreerija vahetuseks. Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja <%= @params[:registrar_name] %> poole.

Uue registreerija andmed:
Nimi: <%= @params[:registrant_name] %>
@@ -13,14 +13,14 @@ Tänav: <%= @params[:registrant_street] %>
Linn: <%= @params[:registrant_city] %>
Riik: <%= @params[:registrant_country] %>

-Taotlus on aktiivne <%= Setting.expire_pending_confirmation %> tundi ja lükatakse automaatselt tagasi kui te seda enne ise ei kinnita või tagasi lükka. +Taotlus on aktiivne <%= Setting.expire_pending_confirmation %> tundi ja lükatakse automaatselt tagasi kui te seda enne ei kinnita või tagasi lükka.

-Muudatuse kinnitamiseks külastage palun allolevat võrgulehekülge, kontrollige uuesti üle muudatuse andmed ning vajutage nuppu kinnitan:
+Muudatuse kinnitamiseks külastage palun allolevat lehekülge, kontrollige uuesti üle muudatuse andmed ning vajutage nuppu kinnitan:
<%= link_to @params[:verification_url], @params[:verification_url] %>

Lugupidamisega
-Eesti Interneti SA +Eesti Interneti Sihtasutus




diff --git a/app/views/mailers/domain_mailer/pending_update_request_for_old_registrant.text.erb b/app/views/mailers/domain_mailer/pending_update_request_for_old_registrant.text.erb index 142004bb6..d2ee28479 100644 --- a/app/views/mailers/domain_mailer/pending_update_request_for_old_registrant.text.erb +++ b/app/views/mailers/domain_mailer/pending_update_request_for_old_registrant.text.erb @@ -1,6 +1,6 @@ -Tere, +Tere -Registrisse laekus taotlus domeeni <%= @params[:name] %> registreerija vahetuseks. Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja poole. Teie registripidaja on <%= @params[:registrar_name] %> +Registrisse laekus taotlus domeeni <%= @params[:name] %> registreerija vahetuseks. Palun veenduge, et muudatus on korrektne ning probleemide korral pöörduge oma registripidaja <%= @params[:registrar_name] %> poole. Uue registreerija andmed: Nimi: <%= @params[:registrant_name] %> @@ -13,12 +13,12 @@ Tänav: <%= @params[:registrant_street] %> Linn: <%= @params[:registrant_city] %> Riik: <%= @params[:registrant_country] %> -Taotlus on aktiivne <%= Setting.expire_pending_confirmation %> tundi ja lükatakse automaatselt tagasi kui te seda enne ise ei kinnita või tagasi lükka. -Muudatuse kinnitamiseks külastage palun allolevat võrgulehekülge, kontrollige uuesti üle muudatuse andmed ning vajutage nuppu kinnitan: +Taotlus on aktiivne <%= Setting.expire_pending_confirmation %> tundi ja lükatakse automaatselt tagasi kui te seda enne ei kinnita või tagasi lükka. +Muudatuse kinnitamiseks külastage palun allolevat lehekülge, kontrollige uuesti üle muudatuse andmed ning vajutage nuppu kinnitan: <%= @params[:verification_url] %> Lugupidamisega -Eesti Interneti SA +Eesti Interneti Sihtasutus -------------------------------------- diff --git a/app/views/mailers/domain_mailer/registrant_updated_notification_for_new_registrant.html.erb b/app/views/mailers/domain_mailer/registrant_updated_notification_for_new_registrant.html.erb index c7d464f43..dc493969c 100644 --- a/app/views/mailers/domain_mailer/registrant_updated_notification_for_new_registrant.html.erb +++ b/app/views/mailers/domain_mailer/registrant_updated_notification_for_new_registrant.html.erb @@ -1,39 +1,39 @@ -Tere, +Tere

-Domeeni <%= @params[:name] %> registreerija vahetuse taotlus on kinnitatud ning andmed registris uuendatud. +Domeeni <%= @domain.name %> registreerija vahetuse taotlus on kinnitatud ning andmed registris uuendatud.

Uue registreerija andmed:
-Nimi: <%= @params[:registrant_name] %>
-<% if @params[:registrant_priv] %> -Isikukood: <%= @params[:registrant_ident] %>
+Nimi: <%= @new_registrant.name %>
+<% if @new_registrant.priv? %> + Isikukood: <%= @new_registrant.ident %>
<% else %> -Äriregistrikood: <%= @params[:registrant_ident] %>
+ Äriregistrikood: <%= @new_registrant.ident %>
<% end %> -Epost: <%= @params[:registrant_email] %>
-Tänav: <%= @params[:registrant_street] %>
-Linn: <%= @params[:registrant_city] %>
-Riik: <%= @params[:registrant_country] %> +Epost: <%= @new_registrant.email %>
+Tänav: <%= @new_registrant.street %>
+Linn: <%= @new_registrant.city %>
+Riik: <%= @new_registrant.country.name %>

Lugupidamisega
-Eesti Interneti SA +Eesti Interneti Sihtasutus




Hi,

-Process for changing registrant of the domain <%= @params[:name] %> has been approved and the data in the registry is updated. +Process for changing registrant of the domain <%= @domain.name %> has been approved and the data in the registry is updated.

New registrant:
-Name: <%= @params[:registrant_name] %>
-<% if @params[:registrant_priv] %> -Personal code: <%= @params[:registrant_ident] %>
+Name: <%= @new_registrant.name %>
+<% if @new_registrant.priv? %> + Personal code: <%= @new_registrant.ident %>
<% else %> -Business Registry code: <%= @params[:registrant_ident] %>
+ Business Registry code: <%= @new_registrant.ident %>
<% end %> -E-mail: <%= @params[:registrant_email] %>
-Street: <%= @params[:registrant_street] %>
-City: <%= @params[:registrant_city] %>
-Country: <%= @params[:registrant_country] %> +E-mail: <%= @new_registrant.email %>
+Street: <%= @new_registrant.street %>
+City: <%= @new_registrant.city %>
+Country: <%= @new_registrant.country.name %>

Best Regards,
Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/registrant_updated_notification_for_new_registrant.text.erb b/app/views/mailers/domain_mailer/registrant_updated_notification_for_new_registrant.text.erb index 115655897..0fd6a609e 100644 --- a/app/views/mailers/domain_mailer/registrant_updated_notification_for_new_registrant.text.erb +++ b/app/views/mailers/domain_mailer/registrant_updated_notification_for_new_registrant.text.erb @@ -1,39 +1,41 @@ -Tere, +Tere -Domeeni <%= @params[:name] %> registreerija vahetuse taotlus on kinnitatud ning andmed registris uuendatud. +Domeeni <%= @domain.name %> registreerija vahetuse taotlus on kinnitatud ning andmed registris uuendatud. Uue registreerija andmed: -Nimi: <%= @params[:registrant_name] %> -<% if @params[:registrant_priv] %> -Isikukood: <%= @params[:registrant_ident] %> +Nimi: <%= @new_registrant.name %> + +<% if @new_registrant.priv? %> + Isikukood: <%= @new_registrant.ident %> <% else %> -Äriregistrikood: <%= @params[:registrant_ident] %> + Äriregistrikood: <%= @new_registrant.ident %> <% end %> -Epost: <%= @params[:registrant_email] %> -Tänav: <%= @params[:registrant_street] %> -Linn: <%= @params[:registrant_city] %> -Riik: <%= @params[:registrant_country] %> +Epost: <%= @new_registrant.email %> +Tänav: <%= @new_registrant.street %> +Linn: <%= @new_registrant.city %> +Riik: <%= @new_registrant.country.name %> Lugupidamisega -Eesti Interneti SA +Eesti Interneti Sihtasutus -------------------------------------- Hi, -Process for changing registrant of the domain <%= @params[:name] %> has been approved and the data in the registry is updated. +Process for changing registrant of the domain <%= @domain.name %> has been approved and the data in the registry is updated. New registrant: -Name: <%= @params[:registrant_name] %> -<% if @params[:registrant_priv] %> -Personal code: <%= @params[:registrant_ident] %> +Name: <%= @new_registrant.name %> + +<% if @new_registrant.priv? %> + Personal code: <%= @new_registrant.ident %> <% else %> -Business Registry code: <%= @params[:registrant_ident] %> + Business Registry code: <%= @new_registrant.ident %> <% end %> -E-mail: <%= @params[:registrant_email] %> -Street: <%= @params[:registrant_street] %> -City: <%= @params[:registrant_city] %> -Country: <%= @params[:registrant_country] %> +E-mail: <%= @new_registrant.email %> +Street: <%= @new_registrant.street %> +City: <%= @new_registrant.city %> +Country: <%= @new_registrant.country.name %> Best Regards, Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/registrant_updated_notification_for_old_registrant.html.erb b/app/views/mailers/domain_mailer/registrant_updated_notification_for_old_registrant.html.erb index b41e1f1eb..428994e36 100644 --- a/app/views/mailers/domain_mailer/registrant_updated_notification_for_old_registrant.html.erb +++ b/app/views/mailers/domain_mailer/registrant_updated_notification_for_old_registrant.html.erb @@ -1,39 +1,39 @@ -Tere, +Tere

-Domeeni <%= @params[:name] %> registreerija vahetuse taotlus on kinnitatud ning andmed registris uuendatud. +Domeeni <%= @domain.name %> registreerija vahetuse taotlus on kinnitatud ning andmed registris uuendatud.

Uue registreerija andmed:
-Nimi: <%= @params[:new_registrant_name] %>
-<% if @params[:registrant_priv] %> -Isikukood: <%= @params[:registrant_ident] %>
+Nimi: <%= @new_registrant.name %>
+<% if @new_registrant.priv? %> +Isikukood: <%= @new_registrant.ident %>
<% else %> -Äriregistrikood: <%= @params[:registrant_ident] %>
+Äriregistrikood: <%= @new_registrant.ident %>
<% end %> -Epost: <%= @params[:registrant_email] %>
-Tänav: <%= @params[:registrant_street] %>
-Linn: <%= @params[:registrant_city] %>
-Riik: <%= @params[:registrant_country] %> +Epost: <%= @new_registrant.email %>
+Tänav: <%= @new_registrant.street %>
+Linn: <%= @new_registrant.city %>
+Riik: <%= @new_registrant.country.name %>

Lugupidamisega
-Eesti Interneti SA +Eesti Interneti Sihtasutus




Hi,

-Process for changing registrant of the domain <%= @params[:name] %> has been approved and the data in the registry is updated. +Process for changing registrant of the domain <%= @domain.name %> has been approved and the data in the registry is updated.

New registrant:
-Name: <%= @params[:new_registrant_name] %>
-<% if @params[:registrant_priv] %> -Personal code: <%= @params[:registrant_ident] %>
+Name: <%= @new_registrant.name %>
+<% if @new_registrant.priv? %> +Personal code: <%= @new_registrant.ident %>
<% else %> -Business Registry code: <%= @params[:registrant_ident] %>
+Business Registry code: <%= @new_registrant.ident %>
<% end %> -E-mail: <%= @params[:registrant_email] %>
-Street: <%= @params[:registrant_street] %>
-City: <%= @params[:registrant_city] %>
-Country: <%= @params[:registrant_country] %> +E-mail: <%= @new_registrant.email %>
+Street: <%= @new_registrant.street %>
+City: <%= @new_registrant.city %>
+Country: <%= @new_registrant.country.name %>

Best Regards,
Estonian Internet Foundation diff --git a/app/views/mailers/domain_mailer/registrant_updated_notification_for_old_registrant.text.erb b/app/views/mailers/domain_mailer/registrant_updated_notification_for_old_registrant.text.erb index c2efa5af9..a99eca6ba 100644 --- a/app/views/mailers/domain_mailer/registrant_updated_notification_for_old_registrant.text.erb +++ b/app/views/mailers/domain_mailer/registrant_updated_notification_for_old_registrant.text.erb @@ -1,41 +1,41 @@ -Tere, +Tere -Domeeni <%= @params[:name] %> registreerija vahetuse taotlus on kinnitatud ning andmed registris uuendatud. +Domeeni <%= @domain.name %> registreerija vahetuse taotlus on kinnitatud ning andmed registris uuendatud. Uue registreerija andmed: -Nimi: <%= @params[:new_registrant_name] %> +Nimi: <%= @new_registrant.name %> -<% if @params[:registrant_priv] %> -Isikukood: <%= @params[:registrant_ident] %> +<% if @new_registrant.priv? %> +Isikukood: <%= @new_registrant.ident %> <% else %> -Äriregistrikood: <%= @params[:registrant_ident] %> +Äriregistrikood: <%= @new_registrant.ident %> <% end %> -Epost: <%= @params[:registrant_email] %> -Tänav: <%= @params[:registrant_street] %> -Linn: <%= @params[:registrant_city] %> -Riik: <%= @params[:registrant_country] %> +Epost: <%= @new_registrant.email %> +Tänav: <%= @new_registrant.street %> +Linn: <%= @new_registrant.city %> +Riik: <%= @new_registrant.country.name %> Lugupidamisega -Eesti Interneti SA +Eesti Interneti Sihtasutus -------------------------------------- Hi, -Process for changing registrant of the domain <%= @params[:name] %> has been approved and the data in the registry is updated. +Process for changing registrant of the domain <%= @domain.name %> has been approved and the data in the registry is updated. New registrant: -Name: <%= @params[:new_registrant_name] %> +Name: <%= @new_registrant.name %> -<% if @params[:registrant_priv] %> -Personal code: <%= @params[:registrant_ident] %> +<% if @new_registrant.priv? %> +Personal code: <%= @new_registrant.ident %> <% else %> -Business Registry code: <%= @params[:registrant_ident] %> +Business Registry code: <%= @new_registrant.ident %> <% end %> -E-mail: <%= @params[:registrant_email] %> -Street: <%= @params[:registrant_street] %> -City: <%= @params[:registrant_city] %> -Country: <%= @params[:registrant_country] %> +E-mail: <%= @new_registrant.email %> +Street: <%= @new_registrant.street %> +City: <%= @new_registrant.city %> +Country: <%= @new_registrant.country.name %> Best Regards, Estonian Internet Foundation diff --git a/app/views/registrant/sessions/login.haml b/app/views/registrant/sessions/login.haml index 06e26c26d..c24b19aca 100644 --- a/app/views/registrant/sessions/login.haml +++ b/app/views/registrant/sessions/login.haml @@ -2,6 +2,9 @@ .form-signin.col-md-6.center-block.text-center %h2.form-signin-heading.text-center= t(:log_in) %hr + .row + =t "only_estonian_residets_can_signin" + %br = link_to '/registrant/login/mid' do = image_tag 'mid.gif' = link_to '/registrant/id', method: :post do diff --git a/app/views/registrar/domains/delete.haml b/app/views/registrar/domains/delete.haml index 13953a6e3..ab1bdfa31 100644 --- a/app/views/registrar/domains/delete.haml +++ b/app/views/registrar/domains/delete.haml @@ -6,6 +6,12 @@ .panel-heading.clearfix = t(:legal_document) .panel-body + .form-group + .col-md-4.control-label + = label_tag 'domain[verified]', t(:verified) + .col-md-6 + = check_box_tag 'domain[verified]', '1', params[:verified].eql?('1'), onclick: "return (confirm('#{t(:verified_confirm)}') ? true : false);" + .form-group .col-md-4.control-label = label_tag 'domain[legal_document]', t(:legal_document), class: 'required' diff --git a/app/views/registrar/domains/form_partials/_general.haml b/app/views/registrar/domains/form_partials/_general.haml index e4c124803..91ae7462f 100644 --- a/app/views/registrar/domains/form_partials/_general.haml +++ b/app/views/registrar/domains/form_partials/_general.haml @@ -24,6 +24,13 @@ = text_field_tag 'domain[registrant_helper]', contacts.find_by(code: @domain_params[:registrant]).try(:search_name), class: 'form-control', data: {autocomplete: search_contacts_registrar_domains_path}, required: true + - if params[:domain_name] + .form-group + .col-md-3.control-label + = label_tag :verified, t(:verified) + .col-md-7 + = check_box_tag 'domain[verified]', '1', @domain_params[:verified].eql?('1'), onclick: "return (confirm('#{t(:verified_confirm)}') ? true : false);" + - unless params[:domain_name] .form-group .col-md-3.control-label diff --git a/app/views/registrar/domains/partials/_contacts.haml b/app/views/registrar/domains/partials/_contacts.haml index 536f256b7..b94f99ee2 100644 --- a/app/views/registrar/domains/partials/_contacts.haml +++ b/app/views/registrar/domains/partials/_contacts.haml @@ -6,10 +6,12 @@ %thead %tr %th{class: 'col-xs-4'}= t(:type) - %th{class: 'col-xs-8'}= t(:id) + %th{class: 'col-xs-4'}= t(:name) + %th{class: 'col-xs-4'}= t(:id) %tbody - @data.css('contact').each do |x| + - registrant = Contact.find_by_code(x.text) %tr %td= x['type'] - %td= x.text - + %td= registrant.name + %td= x.text \ No newline at end of file diff --git a/app/views/registrar/domains/partials/_general.haml b/app/views/registrar/domains/partials/_general.haml index 4eb5285e7..5381d0865 100644 --- a/app/views/registrar/domains/partials/_general.haml +++ b/app/views/registrar/domains/partials/_general.haml @@ -10,8 +10,9 @@ %dt= t(:registrar) %dd= @data.css('clID').text + - registrant = Contact.find_by_code(@data.css('registrant').text) %dt= t(:registrant) - %dd= @data.css('registrant').text + %dd= "#{registrant.name} (#{@data.css('registrant').text})" %dt= t(:registered) %dd= @data.css('crDate').text diff --git a/app/views/shared/_title.haml b/app/views/shared/_title.haml index 3832a7664..c6ab477fa 100644 --- a/app/views/shared/_title.haml +++ b/app/views/shared/_title.haml @@ -4,7 +4,7 @@ .row .col-sm-6 %h1.text-center-xs - = truncate(name, length: 35) + = content_for?(:page_name) ? yield(:page_name) : truncate(name, length: 35) .col-sm-6 %h1.text-right.text-center-xs = yield :actions diff --git a/config/deploy-example.rb b/config/deploy-example.rb index 33bf49247..536775727 100644 --- a/config/deploy-example.rb +++ b/config/deploy-example.rb @@ -235,7 +235,7 @@ end desc 'Loads current commit hash' task load_commit_hash: :environment do queue! %( - echo "CURRENT_COMMIT_HASH = '$(git --git-dir #{deploy_to}/scm rev-parse --short HEAD)'" > \ + echo "CURRENT_COMMIT_HASH = '$(git --git-dir #{deploy_to}/scm rev-parse --short #{branch})'" > \ #{deploy_to}/shared/config/initializers/current_commit_hash.rb ) end diff --git a/config/initializers/initial_settings.rb b/config/initializers/initial_settings.rb index eb333943f..b6a60c5e8 100644 --- a/config/initializers/initial_settings.rb +++ b/config/initializers/initial_settings.rb @@ -32,6 +32,9 @@ if con.present? && con.table_exists?('settings') Setting.save_default(:invoice_number_min, 131050) Setting.save_default(:invoice_number_max, 149999) + Setting.save_default(:directo_monthly_number_min, 309901) + Setting.save_default(:directo_monthly_number_max, 309999) + Setting.save_default(:directo_monthly_number_last, 309901) Setting.save_default(:days_to_keep_invoices_active, 30) Setting.save_default(:days_to_keep_overdue_invoices_active, 30) Setting.save_default(:minimum_deposit, 0.0) diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml index e419f7794..9524e860c 100644 --- a/config/locales/devise.en.yml +++ b/config/locales/devise.en.yml @@ -14,7 +14,7 @@ en: last_attempt: "You have one more attempt before your account is locked." not_found_in_database: "Invalid email address or password." timeout: "Your session expired. Please sign in again to continue." - unauthenticated: "You need to sign in or sign up before continuing." + unauthenticated: "You need to sign in." unconfirmed: "You have to confirm your email address before continuing." mailer: confirmation_instructions: diff --git a/config/locales/en.yml b/config/locales/en.yml index c4bc211c1..885e79424 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -52,6 +52,9 @@ en: invalid_EE_identity_format_update: "Ident not in valid Estonian identity format. Please create new contact" invalid_birthday_format: "Ident not in valid birthady format, should be YYYY-MM-DD" invalid_country_code: "Ident country code is not valid, should be in ISO_3166-1 alpha 2 format" + ident_type: + ident_type_invalid: 'Ident type is invalid' + epp_ident_type_invalid: 'Object status prohibits operation: ident_type of contact %{code} is invalid' domains: exist: 'Object association prohibits operation' statuses: @@ -77,6 +80,7 @@ en: registrant: blank: 'Registrant is missing' not_found: 'Registrant not found' + cannot_be_missing: 'Parameter value policy error: registrant cannot be missing' domain_contacts: invalid: 'Contacts are invalid' not_found: 'Contact was not found' @@ -130,8 +134,9 @@ en: hostname: invalid: 'Hostname is invalid' taken: 'Nameserver already exists on this domain' + puny_to_long: 'Hostname puny label is too long (maximum is 63 characters)' ipv4: - blank: 'IPv4 is missing' + blank: 'IP is missing' invalid: 'IPv4 is invalid' ipv6: invalid: 'IPv6 is invalid' @@ -206,6 +211,10 @@ en: blank: 'Algorithm is missing' auth_info_pw: blank: 'Password is missing' + legal_document: + attributes: + body: + length: 'Parameter value policy error: legalDocument size should be more than 3kB' attributes: @@ -355,6 +364,7 @@ en: contact: 'Contact' credit_balance: 'Credit balance' starting_balance: 'Starting balance' + destroyed: 'Destroyed' domain_transfer_requested: 'Domain transfer requested!' domain_transfer_approved: 'Domain transfer approved!' @@ -728,13 +738,13 @@ en: no_invoices_were_binded: 'No invoices were binded' domain_general_help: The Administrative Contact - is an Estonian citizen or a citizen of another country in the European Union, European Economic Area or the Swiss Confederation with a registered place of residence in Estonia and an Estonian personal identification code who has the right to represent the registering entity in accordance with the current legislation of the Republic of Estonia (member of the management board) or on the basis of the written authorisation issued by a member of the management board. The Administrative Contact has the right to sign and submit in the name of the registering entity any applications connected with the domain name and also to receive and forward any information concerning the domain name(s). The Administrative Contact is responsible for the correctness and authenticity of the data and documents submitted about itself and the registering entity. + is a natural person who is a legal representative of the Registrant or whom the Registrant has authorised in writing (authorised representative). The Administrative Contact does not have the right to delegate the authorisation. The Administrative Contact has the right to sign and submit Domain Name-related applications on behalf of the Registrant and to receive and forward any information pertaining to the Domain Name(s). The Administrative Contact is responsible for the correctness and genuiness of the data and documents submitted by him/her about the Registrant and about himself/herself. Registrant is obliged to guarantee that the person appointed as the Administrative Contact agrees to fulfil the duties of and Administrative Contact. There may be more than one person in this role (the registry system allows of up to 10 Administrative Contacts) domain_admin_contact_help: The Technical Contact - is a person who has the right to modify only such domain name server data that is connected with it. If the domain registering entity is using a website hosting service, it is recommended to register as the Technical Contact a representative of the corresponding provider company. If the domain registering entity manages its own servers, it can register itself as the Technical Contact. + is a natural or legal person who, in the name of the Registrant, adds, changes or removes entries of the authoritative Name Servers for that particular domain and its DNSSEC records. The Technical Contact does not have the right to represent the Registrant in other registration services. The Registrant is obliged to guarantee that the person appointed as the Technical Contact agrees to fulfil the duties of and Technical Contact. There may be more than one person in this role (the registry system allows of up to 10 Technical Contacts) domain_tech_contact_help: The domain name server - is a computer that saves and forwards via a general-access data communications network such data that is connected with the domain name and corresponding IP addresses. Your IT helpdesk or Internet service provider will have the necessary information about the domain name servers. + refers to the computer that saves and forwards notices related to the Domain Names and their corresponding IP addresses in the Internet. account_activity: 'Account activity' account_activities: 'Account activities' receipt_date: 'Receipt date' @@ -821,16 +831,20 @@ en: domain_registrant_change_confirmed_body: 'You have successfully submitted domain registrant change confirmation. You will receive email confirmation.' registrant_domain_verification_confirmed: 'Domain registrant change has successfully received.' registrant_domain_verification_confirmed_failed: 'Something went wrong.' - domain_registrant_change_rejected_title: 'Domain registrant change has been rejected' - domain_registrant_change_rejected_body: 'You have rejected domain registrant change.' + domain_registrant_change_rejected_title: 'Domain registrant change rejection has been received' + domain_registrant_change_rejected_body: 'You have rejected domain registrant change. You will receive confirmation by email.' registrant_domain_verification_rejected: 'Domain registrant change has been rejected successfully.' registrant_domain_verification_rejected_failed: 'Something went wrong.' - domain_delete_title: 'Please confirm or reject domain deletation' + domain_delete_title: 'Please confirm or reject domain deletion' domain_delete_body: 'There is a request to delete a domain. Before doing it we need your confirmation.' + registrant_domain_delete_confirmed: 'Setting the domain up for deletion...' + registrant_domain_delete_confirmed_failed: 'Something went wrong.' domain_delete_confirmed_title: 'Domain deletion has been received successfully' domain_delete_confirmed_body: 'You have successfully submitted delete confirmation. You will receive registry final confirmation to email.' - domain_delete_rejected_title: 'Domain deletion has been rejected successfully' - domain_delete_rejected_body: 'You have rejected domain deletion.' + registrant_domain_delete_rejected: 'Rejecting the domain deletion...' + registrant_domain_delete_rejected_failed: 'Something went wrong.' + domain_delete_rejected_title: 'Domain deletion rejection has been received successfully' + domain_delete_rejected_body: 'You have rejected pending domain deletion. You will receive confirmation by email.' no_permission: 'No permission' access_denied: 'Access denied' common_name: 'Common name' @@ -941,4 +955,8 @@ en: add_blocked_domain: 'Add domain to blocked list' edit_pw: 'Edit Pw' optional: 'Optional' + test_registrar: "Test registrar" + verified_confirm: 'Verified status is for cases when current registrant is the one applying for the update. Legal document signed by the registrant is required. Are you sure this update is properly verified with the registrant?' + verified: 'Verified' + only_estonian_residets_can_signin: "Access currently available only to Estonian citizens and e-residents with Estonian ID-card or Mobile-ID." cant_match_version: 'Impossible match version with request' diff --git a/config/routes.rb b/config/routes.rb index a041e41b7..39d6b3937 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -7,7 +7,7 @@ Rails.application.routes.draw do post 'command/:action', controller: 'domains', constraints: EppConstraint.new(:domain) post 'command/:action', controller: 'contacts', constraints: EppConstraint.new(:contact) - post 'command/poll', to: 'polls#poll', constraints: EppConstraint.new(:poll) + post 'command/poll', to: 'polls#poll', constraints: EppConstraint.new(:poll) post 'command/keyrelay', to: 'keyrelays#keyrelay', constraints: EppConstraint.new(:keyrelay) post 'command/:command', to: 'errors#not_found', constraints: EppConstraint.new(:not_found) # fallback route diff --git a/db/migrate/20160225113801_add_up_id_value_to_domain.rb b/db/migrate/20160225113801_add_up_id_value_to_domain.rb new file mode 100644 index 000000000..9879c8555 --- /dev/null +++ b/db/migrate/20160225113801_add_up_id_value_to_domain.rb @@ -0,0 +1,5 @@ +class AddUpIdValueToDomain < ActiveRecord::Migration + def change + add_column :domains, :upid, :integer + end +end diff --git a/db/migrate/20160225113812_add_up_id_value_to_contact.rb b/db/migrate/20160225113812_add_up_id_value_to_contact.rb new file mode 100644 index 000000000..b78478e75 --- /dev/null +++ b/db/migrate/20160225113812_add_up_id_value_to_contact.rb @@ -0,0 +1,5 @@ +class AddUpIdValueToContact < ActiveRecord::Migration + def change + add_column :contacts, :upid, :integer + end +end diff --git a/db/migrate/20160226132045_add_up_date_value_to_domain.rb b/db/migrate/20160226132045_add_up_date_value_to_domain.rb new file mode 100644 index 000000000..5fdc3d196 --- /dev/null +++ b/db/migrate/20160226132045_add_up_date_value_to_domain.rb @@ -0,0 +1,5 @@ +class AddUpDateValueToDomain < ActiveRecord::Migration + def change + add_column :domains, :up_date, :timestamp + end +end diff --git a/db/migrate/20160226132056_add_up_date_value_to_contact.rb b/db/migrate/20160226132056_add_up_date_value_to_contact.rb new file mode 100644 index 000000000..f7ba92313 --- /dev/null +++ b/db/migrate/20160226132056_add_up_date_value_to_contact.rb @@ -0,0 +1,5 @@ +class AddUpDateValueToContact < ActiveRecord::Migration + def change + add_column :contacts, :up_date, :timestamp + end +end diff --git a/db/migrate/20160304125933_add_invoice_number_to_directo.rb b/db/migrate/20160304125933_add_invoice_number_to_directo.rb new file mode 100644 index 000000000..e639e8910 --- /dev/null +++ b/db/migrate/20160304125933_add_invoice_number_to_directo.rb @@ -0,0 +1,6 @@ +class AddInvoiceNumberToDirecto < ActiveRecord::Migration + def change + add_column :directos, :invoice_number, :string + execute "UPDATE directos d SET invoice_number=i.number FROM invoices i WHERE d.item_type='Invoice' AND d.item_id=i.id" + end +end diff --git a/db/migrate/20160311085957_add_test_registrar_to_registrar.rb b/db/migrate/20160311085957_add_test_registrar_to_registrar.rb new file mode 100644 index 000000000..b8b05cbd7 --- /dev/null +++ b/db/migrate/20160311085957_add_test_registrar_to_registrar.rb @@ -0,0 +1,5 @@ +class AddTestRegistrarToRegistrar < ActiveRecord::Migration + def change + add_column :registrars, :test_registrar, :boolean, default: false + end +end diff --git a/db/migrate/20160405131315_add_request_to_directo.rb b/db/migrate/20160405131315_add_request_to_directo.rb new file mode 100644 index 000000000..2efb95f7d --- /dev/null +++ b/db/migrate/20160405131315_add_request_to_directo.rb @@ -0,0 +1,5 @@ +class AddRequestToDirecto < ActiveRecord::Migration + def change + add_column :directos, :request, :text + end +end diff --git a/db/migrate/20160411140719_add_matching_column.rb b/db/migrate/20160411140719_add_matching_column.rb new file mode 100644 index 000000000..bbc15d352 --- /dev/null +++ b/db/migrate/20160411140719_add_matching_column.rb @@ -0,0 +1,15 @@ +class AddMatchingColumn < ActiveRecord::Migration + + def change + tables = [:log_account_activities, :log_accounts, :log_addresses, :log_api_users, :log_bank_statements, + :log_bank_transactions, :log_blocked_domains, :log_certificates, :log_contact_statuses, :log_contacts, + :log_countries, :log_dnskeys, :log_domain_contacts, :log_domain_statuses, :log_domain_transfers, + :log_domains, :log_invoice_items, :log_invoices, :log_keyrelays, :log_messages, :log_nameservers, + :log_pricelists, :log_registrars, :log_reserved_domains, :log_settings, :log_users, :log_white_ips, + :log_zonefile_settings] + + tables.each do |table| + add_column table, :uuid, :string + end + end +end diff --git a/db/migrate/20160414110443_add_time_indexing_to_epp_log.rb b/db/migrate/20160414110443_add_time_indexing_to_epp_log.rb new file mode 100644 index 000000000..30e4d155e --- /dev/null +++ b/db/migrate/20160414110443_add_time_indexing_to_epp_log.rb @@ -0,0 +1,6 @@ +class AddTimeIndexingToEppLog < ActiveRecord::Migration + def change + ApiLog::EppLog.connection.execute( "CREATE INDEX CONCURRENTLY epp_logs_created_at ON epp_logs USING btree (extract(epoch from created_at));") + ApiLog::ReppLog.connection.execute("CREATE INDEX CONCURRENTLY repp_logs_created_at ON repp_logs USING btree (extract(epoch from created_at));") + end +end diff --git a/db/migrate/20160421074023_add_log_matching_column.rb b/db/migrate/20160421074023_add_log_matching_column.rb new file mode 100644 index 000000000..6ea1931a9 --- /dev/null +++ b/db/migrate/20160421074023_add_log_matching_column.rb @@ -0,0 +1,9 @@ +class AddLogMatchingColumn < ActiveRecord::Migration + + def change + + ApiLog::EppLog.connection.execute("ALTER TABLE epp_logs ADD COLUMN uuid varchar;") + ApiLog::ReppLog.connection.execute("ALTER TABLE repp_logs ADD COLUMN uuid varchar;") + + end +end diff --git a/db/migrate/20160429114732_add_puny_hostname_to_nameserver.rb b/db/migrate/20160429114732_add_puny_hostname_to_nameserver.rb new file mode 100644 index 000000000..368d9f144 --- /dev/null +++ b/db/migrate/20160429114732_add_puny_hostname_to_nameserver.rb @@ -0,0 +1,9 @@ +class AddPunyHostnameToNameserver < ActiveRecord::Migration + + def change + + add_column :nameservers, :hostname_puny, :string + execute "UPDATE nameservers n SET hostname_puny = n.hostname" + + end +end diff --git a/db/schema-read-only.rb b/db/schema-read-only.rb index 78722223a..2d410461c 100644 --- a/db/schema-read-only.rb +++ b/db/schema-read-only.rb @@ -11,11 +11,12 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20160108135436) do +ActiveRecord::Schema.define(version: 20160304125933) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" enable_extension "hstore" + enable_extension "btree_gist" create_table "account_activities", force: :cascade do |t| t.integer "account_id" @@ -108,6 +109,7 @@ ActiveRecord::Schema.define(version: 20160108135436) do t.datetime "updated_at" t.string "creator_str" t.string "updator_str" + t.boolean "in_directo", default: false end create_table "banklink_transactions", force: :cascade do |t| @@ -144,6 +146,17 @@ ActiveRecord::Schema.define(version: 20160108135436) do add_index "blocked_domains", ["name"], name: "index_blocked_domains_on_name", using: :btree + create_table "business_registry_caches", force: :cascade do |t| + t.string "ident" + t.string "ident_country_code" + t.datetime "retrieved_on" + t.string "associated_businesses", array: true + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + add_index "business_registry_caches", ["ident"], name: "index_business_registry_caches_on_ident", using: :btree + create_table "cached_nameservers", id: false, force: :cascade do |t| t.string "hostname", limit: 255 t.string "ipv4", limit: 255 @@ -241,6 +254,17 @@ ActiveRecord::Schema.define(version: 20160108135436) do t.datetime "created_at" end + create_table "directos", force: :cascade do |t| + t.integer "item_id" + t.string "item_type" + t.json "response" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "invoice_number" + end + + add_index "directos", ["item_type", "item_id"], name: "index_directos_on_item_type_and_item_id", using: :btree + create_table "dnskeys", force: :cascade do |t| t.integer "domain_id" t.integer "flags" @@ -345,6 +369,7 @@ ActiveRecord::Schema.define(version: 20160108135436) do add_index "domains", ["registrant_verification_asked_at"], name: "index_domains_on_registrant_verification_asked_at", using: :btree add_index "domains", ["registrant_verification_token"], name: "index_domains_on_registrant_verification_token", using: :btree add_index "domains", ["registrar_id"], name: "index_domains_on_registrar_id", using: :btree + add_index "domains", ["statuses"], name: "index_domains_on_statuses", using: :gin create_table "epp_sessions", force: :cascade do |t| t.string "session_id" @@ -372,20 +397,20 @@ ActiveRecord::Schema.define(version: 20160108135436) do add_index "invoice_items", ["invoice_id"], name: "index_invoice_items_on_invoice_id", using: :btree create_table "invoices", force: :cascade do |t| - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "invoice_type", null: false - t.datetime "due_date", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "invoice_type", null: false + t.datetime "due_date", null: false t.string "payment_term" - t.string "currency", null: false + t.string "currency", null: false t.string "description" t.string "reference_no" - t.decimal "vat_prc", precision: 10, scale: 2, null: false + t.decimal "vat_prc", precision: 10, scale: 2, null: false t.datetime "paid_at" t.integer "seller_id" - t.string "seller_name", null: false + t.string "seller_name", null: false t.string "seller_reg_no" - t.string "seller_iban", null: false + t.string "seller_iban", null: false t.string "seller_bank" t.string "seller_swift" t.string "seller_vat_no" @@ -399,7 +424,7 @@ ActiveRecord::Schema.define(version: 20160108135436) do t.string "seller_email" t.string "seller_contact_name" t.integer "buyer_id" - t.string "buyer_name", null: false + t.string "buyer_name", null: false t.string "buyer_reg_no" t.string "buyer_country_code" t.string "buyer_state" @@ -414,6 +439,7 @@ ActiveRecord::Schema.define(version: 20160108135436) do t.integer "number" t.datetime "cancelled_at" t.decimal "sum_cache", precision: 10, scale: 2 + t.boolean "in_directo", default: false end add_index "invoices", ["buyer_id"], name: "index_invoices_on_buyer_id", using: :btree @@ -592,7 +618,7 @@ ActiveRecord::Schema.define(version: 20160108135436) do t.integer "item_id", null: false t.string "event", null: false t.string "whodunnit" - t.json "object" + t.jsonb "object" t.json "object_changes" t.datetime "created_at" t.string "session" @@ -623,7 +649,7 @@ ActiveRecord::Schema.define(version: 20160108135436) do t.integer "item_id", null: false t.string "event", null: false t.string "whodunnit" - t.json "object" + t.jsonb "object" t.json "object_changes" t.datetime "created_at" t.string "session" @@ -683,7 +709,7 @@ ActiveRecord::Schema.define(version: 20160108135436) do t.integer "item_id", null: false t.string "event", null: false t.string "whodunnit" - t.json "object" + t.jsonb "object" t.json "object_changes" t.datetime "created_at" t.text "nameserver_ids", default: [], array: true @@ -761,7 +787,7 @@ ActiveRecord::Schema.define(version: 20160108135436) do t.integer "item_id", null: false t.string "event", null: false t.string "whodunnit" - t.json "object" + t.jsonb "object" t.json "object_changes" t.datetime "created_at" t.string "session" @@ -897,10 +923,10 @@ ActiveRecord::Schema.define(version: 20160108135436) do create_table "nameservers", force: :cascade do |t| t.string "hostname" - t.string "ipv4", default: [], array: true + t.string "ipv4", array: true t.datetime "created_at" t.datetime "updated_at" - t.string "ipv6", default: [], array: true + t.string "ipv6", array: true t.integer "domain_id" t.string "creator_str" t.string "updator_str" @@ -992,6 +1018,7 @@ ActiveRecord::Schema.define(version: 20160108135436) do end add_index "registrars", ["code"], name: "index_registrars_on_code", using: :btree + add_index "registrars", ["legacy_id"], name: "index_registrars_on_legacy_id", using: :btree create_table "reserved_domains", force: :cascade do |t| t.datetime "created_at" diff --git a/db/structure.sql b/db/structure.sql index cf413eff1..78228b693 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -23,6 +23,20 @@ CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; +-- +-- Name: btree_gist; Type: EXTENSION; Schema: -; Owner: - +-- + +CREATE EXTENSION IF NOT EXISTS btree_gist WITH SCHEMA public; + + +-- +-- Name: EXTENSION btree_gist; Type: COMMENT; Schema: -; Owner: - +-- + +COMMENT ON EXTENSION btree_gist IS 'support for indexing common datatypes in GiST'; + + -- -- Name: hstore; Type: EXTENSION; Schema: -; Owner: - -- @@ -39,140 +53,6 @@ COMMENT ON EXTENSION hstore IS 'data type for storing sets of (key, value) pairs SET search_path = public, pg_catalog; --- --- Name: change_ident_country(); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION change_ident_country() RETURNS boolean - LANGUAGE plpgsql - AS $_$ -DECLARE - changed BOOLEAN; - multiplier INT []; - multiplier2 INT []; - multiplier3 INT []; - multiplier4 INT []; - r RECORD; - control TEXT; - total INT; - i INT; - mod INT; - counter INT; -BEGIN - - multiplier := ARRAY [1, 2, 3, 4, 5, 6, 7, 8, 9, 1]; - - multiplier2 := ARRAY [3, 4, 5, 6, 7, 8, 9, 1, 2, 3]; - - multiplier3 := ARRAY [1, 2, 3, 4, 5, 6, 7]; - - multiplier4 := ARRAY [3, 4, 5, 6, 7, 8, 9]; - - FOR r IN SELECT id, ident FROM contacts WHERE ident_type = 'priv' /*AND ident_country_code IS NULL*/ - LOOP - IF (length(r.ident) = 11 AND (r.ident ~ '^[0-9]+$') AND (substring(r.ident, 1, 1) = '3' OR substring(r.ident, 1, 1) = '4' OR substring(r.ident, 1, 1) = '5' OR substring(r.ident, 1, 1) = '6')) - THEN - total := 0; - counter := 1; - FOREACH i IN ARRAY multiplier - LOOP - total := (total + (i * to_number(substring(r.ident, counter, 1), '9'))); - counter := (counter + 1); - END LOOP; - mod := (total % 11); - counter := 1; - - IF (mod >= 10) - THEN - total = 0; - FOREACH i IN ARRAY multiplier2 - LOOP - total := (total + (i * to_number(substring(r.ident, counter, 1), '9'))); - counter := (counter + 1); - END LOOP; - mod := (total % 11); - END IF; - - IF (mod < 10 AND substring(r.ident, 11, 1) = to_char(mod, 'FM999MI')) - THEN - UPDATE contacts SET ident_country_code = 'EE' WHERE id = r.id; - END IF; - total = 0; - END IF; - END LOOP; - - FOR r IN SELECT id, ident FROM contacts WHERE ident_type = 'org' - LOOP - IF (length(r.ident) = 8 AND (r.ident ~ '^[0-9]+$') AND (substring(r.ident, 1, 1) = '1' OR substring(r.ident, 1, 1) = '8' OR substring(r.ident, 1, 1) = '9')) - THEN - total := 0; - counter := 1; - FOREACH i IN ARRAY multiplier3 - LOOP - total := (total + (i * to_number(substring(r.ident, counter, 1), '9'))); - counter := (counter + 1); - END LOOP; - mod := total % 11; - total = 0; - counter := 1; - - IF (mod >= 10) - THEN - total = 0; - FOREACH i IN ARRAY multiplier4 - LOOP - total := (total + (i * to_number(substring(r.ident, counter, 1), '9'))); - counter := (counter + 1); - END LOOP; - mod := (total % 11); - END IF; - - IF (mod < 10 AND (substring(r.ident, 8, 1) = to_char(mod, 'FM999MI'))) - THEN - UPDATE contacts SET ident_country_code = 'EE' WHERE id = r.id; - END IF; - END IF; - END LOOP; - - - - RETURN changed; -END; -$_$; - - --- --- Name: change_ident_country(integer, text); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION change_ident_country(id integer, type text) RETURNS boolean - LANGUAGE plpgsql - AS $_$ -DECLARE - changed BOOLEAN; - multiplier int[]; - multiplier2 int[]; - code int; -BEGIN - - multiplier := ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 1]; - - multiplier2 := ARRAY[3, 4, 5, 6, 7, 8, 9, 1, 2, 3]; - - code := (SELECT code FROM contacts WHERE id = 208 AND ident_country_code = 'EE'); - - - - UPDATE contacts - SET ident = '' - WHERE id = $1 and ident_type = $2 AND ident_country_code = 'EE' - AND ident = ''; - - RETURN changed; -END; -$_$; - - -- -- Name: fill_ident_country(); Type: FUNCTION; Schema: public; Owner: - -- @@ -222,12 +102,10 @@ CREATE FUNCTION fill_ident_country() RETURNS boolean END LOOP; mod := (total % 11); END IF; - IF (mod = 10) THEN mod := 0; END IF; - IF (substring(r.ident, 11, 1) = to_char(mod, 'FM999MI')) THEN UPDATE contacts SET ident_country_code = 'EE' WHERE id = r.id; @@ -291,7 +169,7 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text ret text; BEGIN -- define filters - include_filter = '%' || i_origin; + include_filter = '%.' || i_origin; -- for %.%.% IF i_origin ~ '\.' THEN @@ -318,6 +196,10 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text ret = concat(tmp_var, chr(10), chr(10)); + -- origin ns records + SELECT ns_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; + ret := concat(ret, '; Zone NS Records', chr(10), tmp_var, chr(10)); + -- ns records SELECT array_to_string( array( @@ -325,26 +207,17 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text FROM domains d JOIN nameservers ns ON ns.domain_id = d.id WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter + AND NOT ('{serverHold,clientHold}' && d.statuses) ORDER BY d.name ), chr(10) ) INTO tmp_var; - ret := concat(ret, '; Zone NS Records', chr(10), tmp_var, chr(10), chr(10)); + ret := concat(ret, tmp_var, chr(10), chr(10)); - -- a glue records for origin nameservers - SELECT array_to_string( - array( - SELECT concat(ns.hostname, '. IN A ', ns.ipv4) - FROM nameservers ns - JOIN domains d ON d.id = ns.domain_id - WHERE d.name = i_origin - AND ns.hostname LIKE '%.' || d.name - AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '' - ), chr(10) - ) INTO tmp_var; - - ret := concat(ret, '; Zone A Records', chr(10), tmp_var); + -- origin a glue records + SELECT a_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; + ret := concat(ret, '; Zone A Records', chr(10), tmp_var, chr(10)); -- a glue records for other nameservers SELECT array_to_string( @@ -355,44 +228,16 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter AND ns.hostname LIKE '%.' || d.name AND d.name <> i_origin - AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '' - AND NOT EXISTS ( -- filter out glue records that already appeared in origin glue recrods - SELECT 1 FROM nameservers nsi - JOIN domains di ON nsi.domain_id = di.id - WHERE di.name = i_origin - AND nsi.hostname = ns.hostname - ) + AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '{}' + AND NOT ('{serverHold,clientHold}' && d.statuses) ), chr(10) ) INTO tmp_var; - -- TODO This is a possible subtitition to the previous query, stress testing is needed to see which is faster + ret := concat(ret, tmp_var, chr(10), chr(10)); - -- SELECT ns.* - -- FROM nameservers ns - -- JOIN domains d ON d.id = ns.domain_id - -- WHERE d.name LIKE '%ee' AND d.name NOT LIKE '%pri.ee' - -- AND ns.hostname LIKE '%.' || d.name - -- AND d.name <> 'ee' - -- AND ns.ipv4 IS NOT NULL AND ns.ipv4 <> '' - -- AND ns.hostname NOT IN ( - -- SELECT ns.hostname FROM domains d JOIN nameservers ns ON d.id = ns.domain_id WHERE d.name = 'ee' - -- ) - - ret := concat(ret, chr(10), tmp_var, chr(10), chr(10)); - - -- aaaa glue records for origin nameservers - SELECT array_to_string( - array( - SELECT concat(ns.hostname, '. IN AAAA ', ns.ipv6) - FROM nameservers ns - JOIN domains d ON d.id = ns.domain_id - WHERE d.name = i_origin - AND ns.hostname LIKE '%.' || d.name - AND ns.ipv6 IS NOT NULL AND ns.ipv6 <> '' - ), chr(10) - ) INTO tmp_var; - - ret := concat(ret, '; Zone AAAA Records', chr(10), tmp_var); + -- origin aaaa glue records + SELECT a4_records FROM zonefile_settings zf WHERE i_origin = zf.origin INTO tmp_var; + ret := concat(ret, '; Zone AAAA Records', chr(10), tmp_var, chr(10)); -- aaaa glue records for other nameservers SELECT array_to_string( @@ -403,17 +248,12 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter AND ns.hostname LIKE '%.' || d.name AND d.name <> i_origin - AND ns.ipv6 IS NOT NULL AND ns.ipv6 <> '' - AND NOT EXISTS ( -- filter out glue records that already appeared in origin glue recrods - SELECT 1 FROM nameservers nsi - JOIN domains di ON nsi.domain_id = di.id - WHERE di.name = i_origin - AND nsi.hostname = ns.hostname - ) + AND ns.ipv6 IS NOT NULL AND ns.ipv6 <> '{}' + AND NOT ('{serverHold,clientHold}' && d.statuses) ), chr(10) ) INTO tmp_var; - ret := concat(ret, chr(10), tmp_var, chr(10), chr(10)); + ret := concat(ret, tmp_var, chr(10), chr(10)); -- ds records SELECT array_to_string( @@ -424,7 +264,8 @@ CREATE FUNCTION generate_zonefile(i_origin character varying) RETURNS text ) FROM domains d JOIN dnskeys dk ON dk.domain_id = d.id - WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter + WHERE d.name LIKE include_filter AND d.name NOT LIKE exclude_filter AND dk.flags = 257 + AND NOT ('{serverHold,clientHold}' && d.statuses) ), chr(10) ) INTO tmp_var; @@ -652,7 +493,8 @@ CREATE TABLE bank_transactions ( created_at timestamp without time zone, updated_at timestamp without time zone, creator_str character varying, - updator_str character varying + updator_str character varying, + in_directo boolean DEFAULT false ); @@ -757,6 +599,40 @@ CREATE SEQUENCE blocked_domains_id_seq ALTER SEQUENCE blocked_domains_id_seq OWNED BY blocked_domains.id; +-- +-- Name: business_registry_caches; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- + +CREATE TABLE business_registry_caches ( + id integer NOT NULL, + ident character varying, + ident_country_code character varying, + retrieved_on timestamp without time zone, + associated_businesses character varying[], + created_at timestamp without time zone NOT NULL, + updated_at timestamp without time zone NOT NULL +); + + +-- +-- Name: business_registry_caches_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE business_registry_caches_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: business_registry_caches_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - +-- + +ALTER SEQUENCE business_registry_caches_id_seq OWNED BY business_registry_caches.id; + + -- -- Name: cached_nameservers; Type: TABLE; Schema: public; Owner: -; Tablespace: -- @@ -1000,6 +876,40 @@ CREATE SEQUENCE depricated_versions_id_seq ALTER SEQUENCE depricated_versions_id_seq OWNED BY depricated_versions.id; +-- +-- Name: directos; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- + +CREATE TABLE directos ( + id integer NOT NULL, + item_id integer, + item_type character varying, + response json, + created_at timestamp without time zone NOT NULL, + updated_at timestamp without time zone NOT NULL, + invoice_number character varying +); + + +-- +-- Name: directos_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE directos_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: directos_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - +-- + +ALTER SEQUENCE directos_id_seq OWNED BY directos.id; + + -- -- Name: dnskeys; Type: TABLE; Schema: public; Owner: -; Tablespace: -- @@ -1328,7 +1238,8 @@ CREATE TABLE invoices ( updator_str character varying, number integer, cancelled_at timestamp without time zone, - sum_cache numeric(10,2) + sum_cache numeric(10,2), + in_directo boolean DEFAULT false ); @@ -1771,7 +1682,7 @@ CREATE TABLE log_contacts ( item_id integer NOT NULL, event character varying NOT NULL, whodunnit character varying, - object json, + object jsonb, object_changes json, created_at timestamp without time zone, session character varying, @@ -1846,7 +1757,7 @@ CREATE TABLE log_dnskeys ( item_id integer NOT NULL, event character varying NOT NULL, whodunnit character varying, - object json, + object jsonb, object_changes json, created_at timestamp without time zone, session character varying, @@ -1994,7 +1905,7 @@ CREATE TABLE log_domains ( item_id integer NOT NULL, event character varying NOT NULL, whodunnit character varying, - object json, + object jsonb, object_changes json, created_at timestamp without time zone, nameserver_ids text[] DEFAULT '{}'::text[], @@ -2182,7 +2093,7 @@ CREATE TABLE log_nameservers ( item_id integer NOT NULL, event character varying NOT NULL, whodunnit character varying, - object json, + object jsonb, object_changes json, created_at timestamp without time zone, session character varying, @@ -2548,10 +2459,10 @@ ALTER SEQUENCE messages_id_seq OWNED BY messages.id; CREATE TABLE nameservers ( id integer NOT NULL, hostname character varying, - ipv4 character varying[] DEFAULT '{}'::character varying[], + ipv4 character varying[], created_at timestamp without time zone, updated_at timestamp without time zone, - ipv6 character varying[] DEFAULT '{}'::character varying[], + ipv6 character varying[], domain_id integer, creator_str character varying, updator_str character varying, @@ -3118,6 +3029,13 @@ ALTER TABLE ONLY banklink_transactions ALTER COLUMN id SET DEFAULT nextval('bank ALTER TABLE ONLY blocked_domains ALTER COLUMN id SET DEFAULT nextval('blocked_domains_id_seq'::regclass); +-- +-- Name: id; Type: DEFAULT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY business_registry_caches ALTER COLUMN id SET DEFAULT nextval('business_registry_caches_id_seq'::regclass); + + -- -- Name: id; Type: DEFAULT; Schema: public; Owner: - -- @@ -3160,6 +3078,13 @@ ALTER TABLE ONLY delegation_signers ALTER COLUMN id SET DEFAULT nextval('delegat ALTER TABLE ONLY depricated_versions ALTER COLUMN id SET DEFAULT nextval('depricated_versions_id_seq'::regclass); +-- +-- Name: id; Type: DEFAULT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY directos ALTER COLUMN id SET DEFAULT nextval('directos_id_seq'::regclass); + + -- -- Name: id; Type: DEFAULT; Schema: public; Owner: - -- @@ -3595,6 +3520,14 @@ ALTER TABLE ONLY blocked_domains ADD CONSTRAINT blocked_domains_pkey PRIMARY KEY (id); +-- +-- Name: business_registry_caches_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- + +ALTER TABLE ONLY business_registry_caches + ADD CONSTRAINT business_registry_caches_pkey PRIMARY KEY (id); + + -- -- Name: certificates_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -3643,6 +3576,14 @@ ALTER TABLE ONLY depricated_versions ADD CONSTRAINT depricated_versions_pkey PRIMARY KEY (id); +-- +-- Name: directos_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- + +ALTER TABLE ONLY directos + ADD CONSTRAINT directos_pkey PRIMARY KEY (id); + + -- -- Name: dnskeys_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -4109,6 +4050,13 @@ CREATE INDEX index_api_users_on_registrar_id ON api_users USING btree (registrar CREATE INDEX index_blocked_domains_on_name ON blocked_domains USING btree (name); +-- +-- Name: index_business_registry_caches_on_ident; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- + +CREATE INDEX index_business_registry_caches_on_ident ON business_registry_caches USING btree (ident); + + -- -- Name: index_cached_nameservers_on_hostname_and_ipv4_and_ipv6; Type: INDEX; Schema: public; Owner: -; Tablespace: -- @@ -4158,6 +4106,13 @@ CREATE INDEX index_contacts_on_registrar_id_and_ident_type ON contacts USING btr CREATE INDEX index_delegation_signers_on_domain_id ON delegation_signers USING btree (domain_id); +-- +-- Name: index_directos_on_item_type_and_item_id; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- + +CREATE INDEX index_directos_on_item_type_and_item_id ON directos USING btree (item_type, item_id); + + -- -- Name: index_dnskeys_on_delegation_signer_id; Type: INDEX; Schema: public; Owner: -; Tablespace: -- @@ -4256,6 +4211,13 @@ CREATE INDEX index_domains_on_registrant_verification_token ON domains USING btr CREATE INDEX index_domains_on_registrar_id ON domains USING btree (registrar_id); +-- +-- Name: index_domains_on_statuses; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- + +CREATE INDEX index_domains_on_statuses ON domains USING gin (statuses); + + -- -- Name: index_epp_sessions_on_session_id; Type: INDEX; Schema: public; Owner: -; Tablespace: -- @@ -4732,6 +4694,13 @@ CREATE INDEX index_registrant_verifications_on_domain_id ON registrant_verificat CREATE INDEX index_registrars_on_code ON registrars USING btree (code); +-- +-- Name: index_registrars_on_legacy_id; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- + +CREATE INDEX index_registrars_on_legacy_id ON registrars USING btree (legacy_id); + + -- -- Name: index_reserved_domains_on_name; Type: INDEX; Schema: public; Owner: -; Tablespace: -- @@ -4774,6 +4743,41 @@ CREATE INDEX index_whois_records_on_domain_id ON whois_records USING btree (doma CREATE INDEX index_whois_records_on_registrar_id ON whois_records USING btree (registrar_id); +-- +-- Name: log_contacts_object_legacy_id; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- + +CREATE INDEX log_contacts_object_legacy_id ON log_contacts USING btree ((((object ->> 'legacy_id'::text))::integer)); + + +-- +-- Name: log_contacts_object_legacy_id1; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- + +CREATE INDEX log_contacts_object_legacy_id1 ON log_contacts USING btree ((((object ->> 'legacy_id'::text))::integer)); + + +-- +-- Name: log_dnskeys_object_legacy_id; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- + +CREATE INDEX log_dnskeys_object_legacy_id ON log_contacts USING btree ((((object ->> 'legacy_domain_id'::text))::integer)); + + +-- +-- Name: log_domains_object_legacy_id; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- + +CREATE INDEX log_domains_object_legacy_id ON log_contacts USING btree ((((object ->> 'legacy_id'::text))::integer)); + + +-- +-- Name: log_nameservers_object_legacy_id; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- + +CREATE INDEX log_nameservers_object_legacy_id ON log_contacts USING btree ((((object ->> 'legacy_domain_id'::text))::integer)); + + -- -- Name: unique_data_migrations; Type: INDEX; Schema: public; Owner: -; Tablespace: -- @@ -5196,7 +5200,19 @@ INSERT INTO schema_migrations (version) VALUES ('20151130175654'); INSERT INTO schema_migrations (version) VALUES ('20151202123506'); -INSERT INTO schema_migrations (version) VALUES ('20160106092052'); +INSERT INTO schema_migrations (version) VALUES ('20151209122816'); + +INSERT INTO schema_migrations (version) VALUES ('20160106101725'); INSERT INTO schema_migrations (version) VALUES ('20160108135436'); +INSERT INTO schema_migrations (version) VALUES ('20160113143447'); + +INSERT INTO schema_migrations (version) VALUES ('20160118092453'); + +INSERT INTO schema_migrations (version) VALUES ('20160118092454'); + +INSERT INTO schema_migrations (version) VALUES ('20160218102355'); + +INSERT INTO schema_migrations (version) VALUES ('20160304125933'); + diff --git a/doc/epp/domain.md b/doc/epp/domain.md index 524deee1e..178ab629b 100644 --- a/doc/epp/domain.md +++ b/doc/epp/domain.md @@ -32,7 +32,7 @@ Domain name mapping protocol short version: 1-n 1 Allowed values: 0, 256, 257 1 Allowed values: 3 - 1 Allowed values: 3, 5, 6, 7, 8, 252, 253, 254, 255 + 1 Allowed values: 3, 5, 6, 7, 8, 10, 13, 14 1 Public key 1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd" 1 Base64 encoded document. @@ -81,7 +81,7 @@ Domain name mapping protocol short version: 1-n 1 Allowed values: 0, 256, 257 1 Allowed values: 3 - 1 Allowed values: 3, 5, 6, 7, 8, 252, 253, 254, 255 + 1 Allowed values: 3, 5, 6, 7, 8, 10, 13, 14 1 Public key 0-1 Attribute: xmlns:eis="https://epp.tld.ee/schema/eis-1.0.xsd" 0-1 Base64 encoded document. Required if registrant is changing. diff --git a/doc/epp/keyrelay.md b/doc/epp/keyrelay.md index f61765b2c..804fed6db 100644 --- a/doc/epp/keyrelay.md +++ b/doc/epp/keyrelay.md @@ -11,7 +11,7 @@ NB! Keyrelay not implemented. 1 1 Allowed values: 0, 256, 257 1 Allowed values: 3 - 1 Allowed values: 3, 5, 6, 7, 8, 252, 253, 254, 255 + 1 Allowed values: 3, 5, 6, 7, 8, 10, 13, 14 1 Public key 1 1 Domain password. Attribute: roid="String" diff --git a/lib/epp_constraint.rb b/lib/epp_constraint.rb index 06cf3d45a..4463a7a04 100644 --- a/lib/epp_constraint.rb +++ b/lib/epp_constraint.rb @@ -11,8 +11,9 @@ class EppConstraint # creates parsed_frame, detects epp request object def matches?(request) # TODO: Maybe move this to controller to keep params clean - request.params[:nokogiri_frame] ||= Nokogiri::XML(request.params[:raw_frame]) - request.params[:parsed_frame] ||= request.params[:nokogiri_frame].dup.remove_namespaces! + request.params[:raw_frame] = request.params[:raw_frame].gsub!(/(?<=>)(.*?)(?=<)/) { |s| s.strip} if request.params[:raw_frame] + request.params[:nokogiri_frame] ||= Nokogiri::XML(request.params[:raw_frame] || request.params[:frame]) + request.params[:parsed_frame] ||= request.params[:nokogiri_frame].dup.remove_namespaces! unless [:keyrelay, :poll, :session, :not_found].include?(@type) element = "//#{@type}:#{request.params[:action]}" diff --git a/lib/tasks/convert.rake b/lib/tasks/convert.rake index ba0e547dc..47e0ec7c2 100644 --- a/lib/tasks/convert.rake +++ b/lib/tasks/convert.rake @@ -32,5 +32,86 @@ namespace :convert do d.save! end end + + + desc 'Contact Address Country Code Upcase' + task country_code_upcase: :environment do + count = 0 + Contact.find_each do |c| + if c.country_code.present? && c.country_code != c.country_code.upcase + c.country_code = c.country_code.upcase + c.update_columns(country_code: c.country_code.upcase) + + count +=1 + puts "#{count} contacts has been changed" if count % 1000 == 0 + end + end + puts "Contacts change has been finished. Starting ContactVersions" + + count = 0 + ContactVersion.find_each do |c| + if (if_object = (c.object && c.object["country_code"].present? && c.object["country_code"] != c.object["country_code"].upcase)) || + (if_changes = (c.object_changes && c.object_changes["country_code"].present? && c.object_changes["country_code"] != c.object_changes["country_code"].map{|e|e.try(:upcase)})) + + if if_object + h = c.object + h["country_code"] = h["country_code"].try(:upcase) + c.object = h + end + + if if_changes + h = c.object_changes + h["country_code"] = h["country_code"].map{|e|e.try(:upcase)} + c.object_changes = h + end + c.update_columns(object: c.object, object_changes: c.object_changes) + + count +=1 + puts "#{count} contact histories has been changed" if count % 1000 == 0 + end + end + end + + desc 'Convert nameservers hostname and hostname_puny' + task nameserves_hostname: :environment do + + start = Time.zone.now.to_f + count = 0 + puts '-----> Converting hostnames...' + + Nameserver.find_each(:batch_size => 1000) do |ns| + ns.hostname = SimpleIDN.to_unicode(ns.hostname) + ns.hostname_puny = SimpleIDN.to_ascii(ns.hostname_puny) + ns.save validate: false + count += 1 + puts "-----> Converted #{count} nameservers" if count % 1000 == 0 + end + puts "-----> Converted #{count} nameservers #{(Time.zone.now.to_f - start).round(2)} seconds" + + end + + desc 'Convert nameservers history hostname' + task nameserves_history_hostname: :environment do + + start = Time.zone.now.to_f + count = 0 + puts '-----> Converting hostnames history...' + + NameserverVersion.find_each do |ns| + if obj = ns.object + obj["hostname"] = SimpleIDN.to_unicode(obj["hostname"]) + ns.object = obj + end + + if (obj_c = ns.object_changes).present? + obj_c["name"].map!{|e| e ? SimpleIDN.to_unicode(e) : e } if obj_c["hostname"] + ns.object_changes = obj_c + end + count += 1 + ns.save! + end + puts "-----> Converted #{count} history rows #{(Time.zone.now.to_f - start).round(2)} seconds" + end + end diff --git a/lib/tasks/documents.rake b/lib/tasks/documents.rake new file mode 100644 index 000000000..5ae8fb4df --- /dev/null +++ b/lib/tasks/documents.rake @@ -0,0 +1,45 @@ +namespace :documents do + + desc 'Generate all' + task all: :environment do + Rake::Task['documents:log'].invoke + end + + desc 'Generate legaldoc versions' + task log: :environment do + start = Time.zone.now.to_f + puts '-----> Adding documets id for PaperTrail log...' + count = 0 + + LegalDocument.find_each do |x| + + next if x.documentable_id.blank? + + document_type = case x.documentable_type + when 'Domain' then DomainVersion + when 'Contact'then ContactVersion + end + + dc = document_type.where(item_id: x.documentable_id) + + dc.each do |y| + + if x.created_at < (y.created_at + (2*60)) && + x.created_at > (y.created_at - (2*60)) + + y.children[:legal_documents] = [x.id] + y.save + count =+1 + + else + + y.children[:legal_documents] = [] + y.save + + end + end + end + puts "-----> Log changed for #{count} rows in #{(Time.zone.now.to_f - start).round(2)} seconds" + end +end + diff --git a/spec/mailers/domain_mailer_spec.rb b/spec/mailers/domain_mailer_spec.rb index 3f645f7e0..9963fdd38 100644 --- a/spec/mailers/domain_mailer_spec.rb +++ b/spec/mailers/domain_mailer_spec.rb @@ -153,7 +153,7 @@ describe DomainMailer do @registrant = Fabricate(:registrant, email: 'test@example.com') @domain = Fabricate(:domain, registrant: @registrant) @domain.deliver_emails = true - @mail = DomainMailer.registrant_updated_notification_for_new_registrant(@domain.id, deliver_emails) + @mail = DomainMailer.registrant_updated_notification_for_new_registrant(@domain.id, @registrant.id, @registrant.id, deliver_emails) end it 'should render email subject' do @@ -178,7 +178,7 @@ describe DomainMailer do @registrant = Fabricate(:registrant, email: 'test@example.com') @domain = Fabricate(:domain, registrant: @registrant) @domain.deliver_emails = true - @mail = DomainMailer.registrant_updated_notification_for_old_registrant(@domain.id, deliver_emails) + @mail = DomainMailer.registrant_updated_notification_for_old_registrant(@domain.id, @registrant.id, @registrant.id, deliver_emails) end it 'should render email subject' do

Lugupidamisega,
- Yours Sincerely,
+ Best Regards,
С уважением,

-

Eesti Interneti SA
+

Eesti Interneti Sihtasutus
Estonian Internet Foundation