diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 000000000..871a1abe5 --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,52 @@ +--- +engines: + brakeman: + enabled: true + bundler-audit: + enabled: true + csslint: + enabled: true + coffeelint: + enabled: true + duplication: + enabled: true + config: + languages: + - ruby + - javascript + - python + - php + eslint: + enabled: true + fixme: + enabled: true + config: + strings: + - FIXME + - TODO + - HACK + rubocop: + enabled: true + reek: + enabled: true +ratings: + paths: + - Gemfile.lock + - "**.erb" + - "**.haml" + - "**.rb" + - "**.rhtml" + - "**.slim" + - "**.css" + - "**.coffee" + - "**.inc" + - "**.js" + - "**.jsx" + - "**.module" + - "**.php" + - "**.py" +exclude_paths: +- config/ +- db/ +- spec/ +- vendor/ diff --git a/.csslintrc b/.csslintrc new file mode 100644 index 000000000..aacba956e --- /dev/null +++ b/.csslintrc @@ -0,0 +1,2 @@ +--exclude-exts=.min.css +--ignore=adjoining-classes,box-model,ids,order-alphabetical,unqualified-attributes diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..96212a359 --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +**/*{.,-}min.js diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 000000000..a6a0ce9c4 --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,277 @@ +--- +parserOptions: + sourceType: module + ecmaFeatures: + jsx: true + +env: + amd: true + browser: true + es6: true + jquery: true + node: true + +# http://eslint.org/docs/rules/ +rules: + # Possible Errors + no-await-in-loop: off + no-cond-assign: error + no-console: off + no-constant-condition: error + no-control-regex: error + no-debugger: error + no-dupe-args: error + no-dupe-keys: error + no-duplicate-case: error + no-empty-character-class: error + no-empty: error + no-ex-assign: error + no-extra-boolean-cast: error + no-extra-parens: off + no-extra-semi: error + no-func-assign: error + no-inner-declarations: + - error + - functions + no-invalid-regexp: error + no-irregular-whitespace: error + no-negated-in-lhs: error + no-obj-calls: error + no-prototype-builtins: off + no-regex-spaces: error + no-sparse-arrays: error + no-template-curly-in-string: off + no-unexpected-multiline: error + no-unreachable: error + no-unsafe-finally: off + no-unsafe-negation: off + use-isnan: error + valid-jsdoc: off + valid-typeof: error + + # Best Practices + accessor-pairs: error + array-callback-return: off + block-scoped-var: off + class-methods-use-this: off + complexity: + - error + - 6 + consistent-return: off + curly: off + default-case: off + dot-location: off + dot-notation: off + eqeqeq: error + guard-for-in: error + no-alert: error + no-caller: error + no-case-declarations: error + no-div-regex: error + no-else-return: off + no-empty-function: off + no-empty-pattern: error + no-eq-null: error + no-eval: error + no-extend-native: error + no-extra-bind: error + no-extra-label: off + no-fallthrough: error + no-floating-decimal: off + no-global-assign: off + no-implicit-coercion: off + no-implied-eval: error + no-invalid-this: off + no-iterator: error + no-labels: + - error + - allowLoop: true + allowSwitch: true + no-lone-blocks: error + no-loop-func: error + no-magic-number: off + no-multi-spaces: off + no-multi-str: off + no-native-reassign: error + no-new-func: error + no-new-wrappers: error + no-new: error + no-octal-escape: error + no-octal: error + no-param-reassign: off + no-proto: error + no-redeclare: error + no-restricted-properties: off + no-return-assign: error + no-return-await: off + no-script-url: error + no-self-assign: off + no-self-compare: error + no-sequences: off + no-throw-literal: off + no-unmodified-loop-condition: off + no-unused-expressions: error + no-unused-labels: off + no-useless-call: error + no-useless-concat: error + no-useless-escape: off + no-useless-return: off + no-void: error + no-warning-comments: off + no-with: error + prefer-promise-reject-errors: off + radix: error + require-await: off + vars-on-top: off + wrap-iife: error + yoda: off + + # Strict + strict: off + + # Variables + init-declarations: off + no-catch-shadow: error + no-delete-var: error + no-label-var: error + no-restricted-globals: off + no-shadow-restricted-names: error + no-shadow: off + no-undef-init: error + no-undef: off + no-undefined: off + no-unused-vars: off + no-use-before-define: off + + # Node.js and CommonJS + callback-return: error + global-require: error + handle-callback-err: error + no-mixed-requires: off + no-new-require: off + no-path-concat: error + no-process-env: off + no-process-exit: error + no-restricted-modules: off + no-sync: off + + # Stylistic Issues + array-bracket-spacing: off + block-spacing: off + brace-style: off + camelcase: off + capitalized-comments: off + comma-dangle: + - error + - never + comma-spacing: off + comma-style: off + computed-property-spacing: off + consistent-this: off + eol-last: off + func-call-spacing: off + func-name-matching: off + func-names: off + func-style: off + id-length: off + id-match: off + indent: off + jsx-quotes: off + key-spacing: off + keyword-spacing: off + line-comment-position: off + linebreak-style: off + lines-around-comment: off + lines-around-directive: off + max-depth: off + max-len: off + max-nested-callbacks: off + max-params: off + max-statements-per-line: off + max-statements: + - error + - 30 + multiline-ternary: off + new-cap: off + new-parens: off + newline-after-var: off + newline-before-return: off + newline-per-chained-call: off + no-array-constructor: off + no-bitwise: off + no-continue: off + no-inline-comments: off + no-lonely-if: off + no-mixed-operators: off + no-mixed-spaces-and-tabs: off + no-multi-assign: off + no-multiple-empty-lines: off + no-negated-condition: off + no-nested-ternary: off + no-new-object: off + no-plusplus: off + no-restricted-syntax: off + no-spaced-func: off + no-tabs: off + no-ternary: off + no-trailing-spaces: off + no-underscore-dangle: off + no-unneeded-ternary: off + object-curly-newline: off + object-curly-spacing: off + object-property-newline: off + one-var-declaration-per-line: off + one-var: off + operator-assignment: off + operator-linebreak: off + padded-blocks: off + quote-props: off + quotes: off + require-jsdoc: off + semi-spacing: off + semi: off + sort-keys: off + sort-vars: off + space-before-blocks: off + space-before-function-paren: off + space-in-parens: off + space-infix-ops: off + space-unary-ops: off + spaced-comment: off + template-tag-spacing: off + unicode-bom: off + wrap-regex: off + + # ECMAScript 6 + arrow-body-style: off + arrow-parens: off + arrow-spacing: off + constructor-super: off + generator-star-spacing: off + no-class-assign: off + no-confusing-arrow: off + no-const-assign: off + no-dupe-class-members: off + no-duplicate-imports: off + no-new-symbol: off + no-restricted-imports: off + no-this-before-super: off + no-useless-computed-key: off + no-useless-constructor: off + no-useless-rename: off + no-var: off + object-shorthand: off + prefer-arrow-callback: off + prefer-const: off + prefer-destructuring: off + prefer-numeric-literals: off + prefer-rest-params: off + prefer-reflect: off + prefer-spread: off + prefer-template: off + require-yield: off + rest-spread-spacing: off + sort-imports: off + symbol-description: off + template-curly-spacing: off + yield-star-spacing: off diff --git a/.reek b/.reek new file mode 100644 index 000000000..d94291666 --- /dev/null +++ b/.reek @@ -0,0 +1,3 @@ +exclude_paths: + - db/migrate/ + - db/data/ diff --git a/.rubocop.yml b/.rubocop.yml index c9689567c..0857a9120 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,10 +1,10 @@ AllCops: - RunRailsCops: true - - Exclude: + Exclude: - 'Guardfile' # stuff generated by AR and rails - 'config/deploy-example.rb' + - 'config/environments/development-example.rb' + - 'config/environments/staging-example.rb' - 'db/schema.rb' - 'db/schema-read-only.rb' - 'db/whois_schema.rb' diff --git a/.ruby-version b/.ruby-version index b1b25a5ff..5bc1cc43d 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.2.2 +2.2.7 diff --git a/.travis.yml b/.travis.yml index 4e6723544..b49edd8e2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,10 +14,14 @@ before_script: - "RAILS_ENV=test bundle exec rake db:migrate" script: - "RAILS_ENV=test bundle exec rspec" +after_success: + - "bundle exec codeclimate-test-reporter" services: - postgresql addons: postgresql: "9.4" + code_climate: + repo_token: 2fd0ab95eab718206f6732fdbd7b650da1e228f8dd491ef2082bb59d8684a054 branches: only: - master diff --git a/CHANGELOG.md b/CHANGELOG.md index b413ccfbe..4d44783e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +05.04.2017 +* Fixed validation error on valid legaldocs in the portal for registrars [#432](https://github.com/internetee/registry/issues/432) +* Updated Ruby, nokogiri and variouse other dependent gems to fix security issues + +14.03.2017 +* Improved phone number validation [#386](https://github.com/internetee/registry/issues/386) +* Dropped ddoc support from legaldocs in the portal for regsitrars [#270](https://github.com/internetee/registry/issues/270) +* Bug: Domain in exp pending list whithout the state present [#328](https://github.com/internetee/registry/issues/328) +* Base64 of legaldocs filtered out from syslogs [#314](https://github.com/internetee/registry/issues/314) + 02.03.2017 * Domain list download (csv) functionality in the portal for registrars (#248) * Readme updates (#273) diff --git a/Gemfile b/Gemfile index 11e5d92a0..4d039cd92 100644 --- a/Gemfile +++ b/Gemfile @@ -8,17 +8,18 @@ end if Bundler::VERSION < '2' source 'https://rubygems.org' # core -gem 'rails', '4.2.5.2' # when update, all initializers eis_custom files needs check/update -gem 'iso8601', '0.8.6' # for dates and times -gem 'hashie-forbidden_attributes', '0.1.1' + gem 'SyslogLogger', '2.0', require: 'syslog/logger' +gem 'hashie-forbidden_attributes', '0.1.1' +gem 'iso8601', '0.8.6' # for dates and times +gem 'rails', '4.2.7.1' # when update, all initializers eis_custom files needs check/update gem 'rest-client' # load env gem 'figaro', '1.1.1' # model related -gem 'pg', '0.18.2' +gem 'pg', '0.19.0' gem 'ransack', '1.5.1' # for searching gem 'validates_email_format_of', '1.6.3' # validates email against RFC 2822 and RFC 3696 @@ -31,57 +32,62 @@ gem 'rails-settings-cached', '0.4.1' # for settings # html-xml gem 'haml-rails', '0.9.0' # haml for views -gem 'nokogiri', '1.6.8' # For XML parsing +gem 'nokogiri', '1.7.1' # For XML parsing # style -gem 'sass-rails', '5.0.3' # sass style gem 'bootstrap-sass', '3.3.5.1' # bootstrap style +gem 'sass-rails', '5.0.6' # sass style # js -gem 'uglifier', '2.7.2' # minifies js + gem 'coffee-rails', '4.1.0' # coffeescript support -gem 'turbolinks', '2.5.3' # faster page load +gem 'uglifier', '2.7.2' # minifies js gem 'jquery-rails', '4.0.4' # jquery +gem 'turbolinks', '2.5.3' # faster page load gem 'selectize-rails', '0.12.1' # include selectize.js for select -gem 'therubyracer', '0.12.2', platforms: :ruby gem 'jquery-validation-rails', '1.13.1' # validate on client side +gem 'therubyracer', '0.12.2', platforms: :ruby # view helpers gem 'kaminari', '0.16.3' # pagination -gem 'nprogress-rails', '0.1.6.7' # visual loader -gem 'html5_validators', '1.2.2' # model requements now automatically on html form gem 'coderay', '1.1.0' # xml console visualize +gem 'html5_validators', '1.2.2' # model requements now automatically on html form +gem 'nprogress-rails', '0.1.6.7' # visual loader gem 'select2-rails', '3.5.9.3' # for autocomplete gem 'bootstrap-datepicker-rails', '1.3.1.1' # datepicker gem 'liquid', '3.0.6' # for email templates # rights -gem 'devise', '3.5.4' # authenitcation gem 'cancancan', '1.11.0' # autharization +gem 'devise', '3.5.4' # authenitcation # rest api gem 'grape', '0.12.0' gem 'jbuilder', '2.2.16' # json api # registry specfic -gem 'simpleidn', '0.0.5' # For punycode gem 'isikukood' # for EE-id validation -gem 'money-rails', '1.4.1' +gem 'simpleidn', '0.0.7' # For punycode +gem 'money-rails' # deploy -gem 'whenever', '0.9.4', require: false gem 'data_migrate', github: 'internetee/data-migrate', ref: '35d22b09ff37a4e9d61ab326ad5d8eb0edf1fc81' +gem 'whenever', '0.9.4', require: false # country listing -gem 'countries', '0.11.4' +gem 'countries', :require => 'countries/global' # cloning activerecord objects gem 'deep_cloneable', '2.1.1' # id + mid login -gem 'digidoc_client', '0.2.1' +# gem 'digidoc_client', '0.3.0' +gem 'digidoc_client', + github: 'tarmotalu/digidoc_client', + branch: 'master' + gem 'epp', '1.5.0', github: 'internetee/epp' gem 'epp-xml', '1.1.0', github: 'internetee/epp-xml' @@ -89,8 +95,8 @@ gem 'uuidtools', '2.1.5' # For unique IDs (used by the epp gem) # que gem 'que', '0.10.0' -gem 'que-web', '0.4.0' gem 'daemons-rails', '1.2.1' +gem 'que-web', '0.4.0' gem 'que_mailer', github: 'prehnRA/que-mailer', branch: 'master' @@ -104,14 +110,17 @@ gem 'pdfkit', '0.6.2' # for datepicker gem 'jquery-ui-rails', '5.0.5' +# codeclimate + + group :development do + gem 'guard', '2.12.9' # run tests automatically gem 'spring', '1.3.6' gem 'spring-commands-rspec', '1.0.4' - gem 'guard', '2.12.9' # run tests automatically - gem 'guard-rspec', '4.5.2' gem 'guard-rails', '0.7.1' # run EPP server automatically - gem 'rubocop', '0.32.1' + gem 'guard-rspec', '4.5.2' gem 'guard-rubocop', '1.2.0' + gem 'rubocop', '0.48.1' # deploy gem 'mina', '0.3.1' # for fast deployment @@ -119,28 +128,25 @@ end group :development, :test do # test stack - gem 'rspec-rails', '3.3.2' gem 'capybara', '2.4.4' - gem 'phantomjs-binaries', '1.9.2.4' - gem 'poltergeist', '1.6.0' # We are using PhantomJS instead - gem 'phantomjs', '1.9.8.0' + gem 'rspec-rails', '3.5.2' gem 'fabrication', '2.13.2' # Replacement for fixtures + gem 'phantomjs-binaries', '1.9.2.4' + gem 'phantomjs', '1.9.8.0' + gem 'poltergeist', '1.6.0' # We are using PhantomJS instead gem 'launchy', '2.4.3' # for opening browser automatically # debug gem 'pry', '0.10.1' # code review - gem 'simplecov', '0.10.0', require: false - gem 'rubycritic', '1.4.0' + gem 'rubycritic', '3.2.0' gem 'bullet', '4.14.7' # for finding database optimizations - gem 'bundler-audit', - github: 'rubysec/bundler-audit', - ref: 'f89ef7fae1090bbad825ea76812d56d72b417055' # for finding future vulnerable gems - gem 'brakeman', '3.0.5', require: false # for security audit' + gem 'bundler-audit' + gem 'brakeman', '3.6.1', require: false # for security audit' # tmp, otherwise conflics with breakman # gem 'html2haml', github: 'haml/html2haml', ref: '6984f50bdbbd6291535027726a5697f28778ee8d' - gem 'html2haml', '2.0.0' + gem 'html2haml', '2.1.0' gem 'sdoc', '0.4.1' # bundle exec rake doc:rails generates the API under doc/api. gem 'railroady', '1.3.0' # to generate database diagrams @@ -155,6 +161,8 @@ end group :test do gem 'database_cleaner' - gem 'factory_girl_rails' + gem 'factory_girl_rails' + gem 'codeclimate-test-reporter', "~> 1.0.0" + gem 'simplecov' gem 'webmock' end diff --git a/Gemfile.lock b/Gemfile.lock index 7b3810caf..c314d836d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -45,101 +45,92 @@ GIT rails (>= 4.0) GIT - remote: https://github.com/rubysec/bundler-audit.git - revision: f89ef7fae1090bbad825ea76812d56d72b417055 - ref: f89ef7fae1090bbad825ea76812d56d72b417055 + remote: https://github.com/tarmotalu/digidoc_client.git + revision: 1645e83a5a548addce383f75703b0275c5310c32 + branch: master specs: - bundler-audit (0.4.0) - bundler (~> 1.2) - thor (~> 0.18) + digidoc_client (0.3.0) + crack (>= 0.1.8) + httpclient (>= 2.3.4) + mime-types (>= 1.16) + nokogiri (>= 1.4.0) + savon (>= 2.4.0) GEM remote: https://rubygems.org/ specs: SyslogLogger (2.0) - abstract_type (0.0.7) - actionmailer (4.2.5.2) - actionpack (= 4.2.5.2) - actionview (= 4.2.5.2) - activejob (= 4.2.5.2) + actionmailer (4.2.7.1) + actionpack (= 4.2.7.1) + actionview (= 4.2.7.1) + activejob (= 4.2.7.1) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 1.0, >= 1.0.5) - actionpack (4.2.5.2) - actionview (= 4.2.5.2) - activesupport (= 4.2.5.2) + actionpack (4.2.7.1) + actionview (= 4.2.7.1) + activesupport (= 4.2.7.1) rack (~> 1.6) rack-test (~> 0.6.2) rails-dom-testing (~> 1.0, >= 1.0.5) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (4.2.5.2) - activesupport (= 4.2.5.2) + actionview (4.2.7.1) + activesupport (= 4.2.7.1) builder (~> 3.1) erubis (~> 2.7.0) rails-dom-testing (~> 1.0, >= 1.0.5) rails-html-sanitizer (~> 1.0, >= 1.0.2) - activejob (4.2.5.2) - activesupport (= 4.2.5.2) + activejob (4.2.7.1) + activesupport (= 4.2.7.1) globalid (>= 0.3.0) - activemodel (4.2.5.2) - activesupport (= 4.2.5.2) + activemodel (4.2.7.1) + activesupport (= 4.2.7.1) builder (~> 3.1) - activerecord (4.2.5.2) - activemodel (= 4.2.5.2) - activesupport (= 4.2.5.2) + activerecord (4.2.7.1) + activemodel (= 4.2.7.1) + activesupport (= 4.2.7.1) arel (~> 6.0) activerecord-import (0.7.0) activerecord (>= 3.0) - activesupport (4.2.5.2) + activesupport (4.2.7.1) i18n (~> 0.7) json (~> 1.7, >= 1.7.7) minitest (~> 5.1) thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) - adamantium (0.2.0) - ice_nine (~> 0.11.0) - memoizable (~> 0.4.0) - addressable (2.3.8) - airbrake (5.6.0) - airbrake-ruby (~> 1.6) - airbrake-ruby (1.6.0) + addressable (2.5.1) + public_suffix (~> 2.0, >= 2.0.2) + airbrake (6.0.0) + airbrake-ruby (~> 2.0) + airbrake-ruby (2.0.0) akami (1.3.1) gyoku (>= 0.4.0) nokogiri - arel (6.0.3) - ast (2.1.0) - astrolabe (1.3.1) - parser (~> 2.2) - autodoc (0.5.1) + arel (6.0.4) + ast (2.3.0) + autodoc (0.6.0) actionpack activesupport (>= 3.0.0) rspec - autoprefixer-rails (6.0.2) + autoprefixer-rails (6.7.7.1) execjs - json axiom-types (0.1.1) descendants_tracker (~> 0.0.4) ice_nine (~> 0.11.0) thread_safe (~> 0.3, >= 0.3.1) - bcrypt (3.1.10) + bcrypt (3.1.11) bootstrap-datepicker-rails (1.3.1.1) railties (>= 3.0) bootstrap-sass (3.3.5.1) autoprefixer-rails (>= 5.0.0.1) sass (>= 3.3.0) - brakeman (3.0.5) - erubis (~> 2.6) - fastercsv (~> 1.5) - haml (>= 3.0, < 5.0) - highline (~> 1.6.20) - multi_json (~> 1.2) - ruby2ruby (~> 2.1.1) - ruby_parser (~> 3.7.0) - sass (~> 3.0) - terminal-table (~> 1.4) - builder (3.2.2) + brakeman (3.6.1) + builder (3.2.3) bullet (4.14.7) activesupport (>= 3.0.0) uniform_notifier (~> 1.9.0) + bundler-audit (0.5.0) + bundler (~> 1.2) + thor (~> 0.18) cancancan (1.11.0) capybara (2.4.4) mime-types (>= 1.16) @@ -149,6 +140,10 @@ GEM xpath (~> 2.0) chronic (0.10.2) cliver (0.3.2) + codeclimate-engine-rb (0.4.0) + virtus (~> 1.0) + codeclimate-test-reporter (1.0.8) + simplecov (<= 0.13) coderay (1.1.0) coercible (1.0.0) descendants_tracker (~> 0.0.1) @@ -158,22 +153,20 @@ GEM coffee-script (2.4.1) coffee-script-source execjs - coffee-script-source (1.9.1.1) - concord (0.1.5) - adamantium (~> 0.2.0) - equalizer (~> 0.0.9) - concurrent-ruby (1.0.1) - countries (0.11.4) - currencies (~> 0.4.2) + coffee-script-source (1.12.2) + concurrent-ruby (1.0.5) + countries (2.0.8) i18n_data (~> 0.7.0) - crack (0.4.2) + money (~> 6.7) + sixarm_ruby_unaccent (~> 1.1) + unicode_utils (~> 1.4) + crack (0.4.3) safe_yaml (~> 1.0.0) - currencies (0.4.2) - daemons (1.2.3) + daemons (1.2.4) daemons-rails (1.2.1) daemons multi_json (~> 1.0) - database_cleaner (1.4.1) + database_cleaner (1.5.3) deep_cloneable (2.1.1) activerecord (>= 3.1.0, < 5.0.0) descendants_tracker (0.0.4) @@ -185,37 +178,33 @@ GEM responders thread_safe (~> 0.1) warden (~> 1.2.3) - diff-lcs (1.2.5) - digidoc_client (0.2.1) - crack (>= 0.1.8) - httpclient (>= 2.3.4) - mime-types (>= 1.16) - nokogiri (>= 1.4.0) - savon (>= 2.4.0) + diff-lcs (1.3) docile (1.1.5) - domain_name (0.5.25) + domain_name (0.5.20170404) unf (>= 0.0.5, < 1.0.0) equalizer (0.0.11) erubis (2.7.0) - execjs (2.6.0) + execjs (2.7.0) fabrication (2.13.2) - factory_girl (4.7.0) + factory_girl (4.8.0) activesupport (>= 3.0.0) - factory_girl_rails (4.7.0) - factory_girl (~> 4.7.0) + factory_girl_rails (4.8.0) + factory_girl (~> 4.8.0) railties (>= 3.0.0) - fastercsv (1.5.5) - ffi (1.9.10) + ffi (1.9.18) figaro (1.1.1) thor (~> 0.14) - flay (2.4.0) + flay (2.8.1) + erubis (~> 2.7.0) + path_expander (~> 1.0) ruby_parser (~> 3.0) sexp_processor (~> 4.0) - flog (4.2.1) + flog (4.6.1) + path_expander (~> 1.0) ruby_parser (~> 3.1, > 3.1.0) - sexp_processor (~> 4.4) + sexp_processor (~> 4.8) formatador (0.2.5) - globalid (0.3.6) + globalid (0.3.7) activesupport (>= 4.1.0) grape (0.12.0) activesupport @@ -257,26 +246,26 @@ GEM haml (>= 4.0.6, < 5.0) html2haml (>= 1.0.1) railties (>= 4.0.1) - hashdiff (0.3.1) - hashie (3.4.2) + hashdiff (0.3.2) + hashie (3.5.5) hashie-forbidden_attributes (0.1.1) hashie (>= 3.0) - highline (1.6.21) hpricot (0.8.6) - html2haml (2.0.0) + html2haml (2.1.0) erubis (~> 2.7.0) - haml (~> 4.0.0) - nokogiri (~> 1.6.0) + haml (~> 4.0) + nokogiri (>= 1.6.0) ruby_parser (~> 3.5) html5_validators (1.2.2) - http-cookie (1.0.2) + http-cookie (1.0.3) domain_name (~> 0.5) - httpclient (2.6.0.1) - httpi (2.4.1) + httpclient (2.8.3) + httpi (2.4.2) rack - i18n (0.7.0) + socksify + i18n (0.8.1) i18n_data (0.7.0) - ice_nine (0.11.1) + ice_nine (0.11.2) isikukood (0.1.2) iso8601 (0.8.6) jbuilder (2.2.16) @@ -291,83 +280,84 @@ GEM jquery-validation-rails (1.13.1) railties (>= 3.2, < 5.0) thor (~> 0.14) - json (1.8.3) + json (1.8.6) kaminari (0.16.3) actionpack (>= 3.0.0) activesupport (>= 3.0.0) - kgio (2.10.0) + kgio (2.11.0) launchy (2.4.3) addressable (~> 2.3) - libv8 (3.16.14.11) - libxml-ruby (2.9.0) + libv8 (3.16.14.19) + libxml-ruby (3.0.0) liquid (3.0.6) - listen (3.0.3) - rb-fsevent (>= 0.9.3) - rb-inotify (>= 0.9) + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) loofah (2.0.3) nokogiri (>= 1.5.9) - lumberjack (1.0.9) - mail (2.6.3) - mime-types (>= 1.16, < 3) - memoizable (0.4.2) - thread_safe (~> 0.3, >= 0.3.1) + lumberjack (1.0.11) + mail (2.6.4) + mime-types (>= 1.16, < 4) method_source (0.8.2) - mime-types (2.99.1) + mime-types (3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2016.0521) mina (0.3.1) open4 (~> 1.3.4) rake mini_portile2 (2.1.0) - minitest (5.8.4) - monetize (1.1.0) - money (~> 6.5.0) - money (6.5.1) - i18n (>= 0.6.4, <= 0.7.0) - money-rails (1.4.1) + minitest (5.10.1) + monetize (1.6.0) + money (~> 6.8) + money (6.8.3) + i18n (>= 0.6.4, < 0.9) + sixarm_ruby_unaccent (>= 1.1.1, < 2) + money-rails (1.8.0) activesupport (>= 3.0) - monetize (~> 1.1.0) - money (~> 6.5.0) + monetize (~> 1.6.0) + money (~> 6.8.1) railties (>= 3.0) - multi_json (1.11.2) - multi_xml (0.5.5) - nenv (0.2.0) + multi_json (1.12.1) + multi_xml (0.6.0) + nenv (0.3.0) netrc (0.11.0) - nokogiri (1.6.8) + nokogiri (1.7.1) mini_portile2 (~> 2.1.0) - pkg-config (~> 1.1.7) nori (2.6.0) - notiffany (0.0.7) + notiffany (0.1.1) nenv (~> 0.1) shellany (~> 0.0) nprogress-rails (0.1.6.7) open4 (1.3.4) orm_adapter (0.5.0) - parser (2.2.2.6) - ast (>= 1.1, < 3.0) + parser (2.4.0.0) + ast (~> 2.2) + path_expander (1.0.1) pdfkit (0.6.2) - pg (0.18.2) + pg (0.19.0) 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) multi_json (~> 1.0) websocket-driver (>= 0.2.0) - polyamorous (1.2.0) + polyamorous (1.3.1) activerecord (>= 3.0) powerpack (0.1.1) - procto (0.0.2) pry (0.10.1) coderay (~> 1.1.0) method_source (~> 0.8.1) slop (~> 3.4) + public_suffix (2.0.5) que (0.10.0) que-web (0.4.0) erubis que (~> 0.8) sinatra - rack (1.6.4) + rack (1.6.5) rack-accept (0.4.5) rack (>= 0.4) rack-mount (0.8.3) @@ -377,104 +367,105 @@ GEM rack-test (0.6.3) rack (>= 1.0) railroady (1.3.0) - rails (4.2.5.2) - actionmailer (= 4.2.5.2) - actionpack (= 4.2.5.2) - actionview (= 4.2.5.2) - activejob (= 4.2.5.2) - activemodel (= 4.2.5.2) - activerecord (= 4.2.5.2) - activesupport (= 4.2.5.2) + rails (4.2.7.1) + actionmailer (= 4.2.7.1) + actionpack (= 4.2.7.1) + actionview (= 4.2.7.1) + activejob (= 4.2.7.1) + activemodel (= 4.2.7.1) + activerecord (= 4.2.7.1) + activesupport (= 4.2.7.1) bundler (>= 1.3.0, < 2.0) - railties (= 4.2.5.2) + railties (= 4.2.7.1) sprockets-rails rails-deprecated_sanitizer (1.0.3) activesupport (>= 4.2.0.alpha) - rails-dom-testing (1.0.7) + rails-dom-testing (1.0.8) activesupport (>= 4.2.0.beta, < 5.0) - nokogiri (~> 1.6.0) + nokogiri (~> 1.6) rails-deprecated_sanitizer (>= 1.0.1) rails-html-sanitizer (1.0.3) loofah (~> 2.0) rails-settings-cached (0.4.1) rails (>= 4.0.0) - railties (4.2.5.2) - actionpack (= 4.2.5.2) - activesupport (= 4.2.5.2) + railties (4.2.7.1) + actionpack (= 4.2.7.1) + activesupport (= 4.2.7.1) rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) - rainbow (2.0.0) - raindrops (0.15.0) - rake (10.5.0) + rainbow (2.2.1) + raindrops (0.18.0) + rake (12.0.0) ransack (1.5.1) actionpack (>= 3.0) activerecord (>= 3.0) activesupport (>= 3.0) i18n polyamorous (~> 1.1) - rb-fsevent (0.9.6) - rb-inotify (0.9.5) + rb-fsevent (0.9.8) + rb-inotify (0.9.8) ffi (>= 0.5.0) - rdoc (4.2.0) - reek (1.6.5) - parser (~> 2.2.0.pre.7) - rainbow (>= 1.99, < 3.0) - unparser (~> 0.2.2) + rdoc (4.3.0) + reek (4.6.1) + codeclimate-engine-rb (~> 0.4.0) + parser (>= 2.3.1.2, < 2.5) + rainbow (~> 2.0) ref (2.0.0) request_store (1.1.0) - responders (2.1.1) + responders (2.3.0) railties (>= 4.2.0, < 5.1) - rest-client (1.8.0) + rest-client (2.0.1) http-cookie (>= 1.0.2, < 2.0) - mime-types (>= 1.16, < 3.0) - netrc (~> 0.7) - rspec (3.3.0) - rspec-core (~> 3.3.0) - rspec-expectations (~> 3.3.0) - rspec-mocks (~> 3.3.0) - rspec-core (3.3.2) - rspec-support (~> 3.3.0) - rspec-expectations (3.3.1) + mime-types (>= 1.16, < 4.0) + netrc (~> 0.8) + rspec (3.5.0) + rspec-core (~> 3.5.0) + rspec-expectations (~> 3.5.0) + rspec-mocks (~> 3.5.0) + rspec-core (3.5.4) + rspec-support (~> 3.5.0) + rspec-expectations (3.5.0) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.3.0) - rspec-mocks (3.3.2) + rspec-support (~> 3.5.0) + rspec-mocks (3.5.0) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.3.0) - rspec-rails (3.3.2) - actionpack (>= 3.0, < 4.3) - activesupport (>= 3.0, < 4.3) - railties (>= 3.0, < 4.3) - rspec-core (~> 3.3.0) - rspec-expectations (~> 3.3.0) - rspec-mocks (~> 3.3.0) - rspec-support (~> 3.3.0) - rspec-support (3.3.0) - rubocop (0.32.1) - astrolabe (~> 1.3) - parser (>= 2.2.2.5, < 3.0) + rspec-support (~> 3.5.0) + rspec-rails (3.5.2) + actionpack (>= 3.0) + activesupport (>= 3.0) + railties (>= 3.0) + rspec-core (~> 3.5.0) + rspec-expectations (~> 3.5.0) + rspec-mocks (~> 3.5.0) + rspec-support (~> 3.5.0) + rspec-support (3.5.0) + rubocop (0.48.1) + parser (>= 2.3.3.1, < 3.0) powerpack (~> 0.1) rainbow (>= 1.99.1, < 3.0) - ruby-progressbar (~> 1.4) - ruby-progressbar (1.7.5) - ruby2ruby (2.1.4) - ruby_parser (~> 3.1) - sexp_processor (~> 4.0) - ruby_parser (3.7.1) + ruby-progressbar (~> 1.7) + unicode-display_width (~> 1.0, >= 1.0.1) + ruby-progressbar (1.8.1) + ruby_dep (1.5.0) + ruby_parser (3.8.4) sexp_processor (~> 4.1) - rubycritic (1.4.0) - flay (= 2.4.0) - flog (= 4.2.1) - parser (>= 2.2.0, < 3.0) - reek (= 1.6.5) + rubycritic (3.2.0) + flay (~> 2.8) + flog (~> 4.4) + launchy (= 2.4.3) + parser (= 2.4.0) + rainbow (~> 2.1) + reek (~> 4.4) + ruby_parser (~> 3.8) virtus (~> 1.0) safe_yaml (1.0.4) - sass (3.4.18) - sass-rails (5.0.3) - railties (>= 4.0.0, < 5.0) + sass (3.4.23) + sass-rails (5.0.6) + railties (>= 4.0.0, < 6) sass (~> 3.1) sprockets (>= 2.8, < 4.0) sprockets-rails (>= 2.0, < 4.0) - tilt (~> 1.1) + tilt (>= 1.1, < 3) savon (2.11.1) akami (~> 1.2) builder (>= 2.1.2) @@ -489,61 +480,55 @@ GEM select2-rails (3.5.9.3) thor (~> 0.14) selectize-rails (0.12.1) - sexp_processor (4.6.0) + sexp_processor (4.8.0) shellany (0.0.1) simplecov (0.10.0) docile (~> 1.1.0) json (~> 1.8) simplecov-html (~> 0.10.0) simplecov-html (0.10.0) - simpleidn (0.0.5) - sinatra (1.4.6) - rack (~> 1.4) + simpleidn (0.0.7) + sinatra (1.4.8) + rack (~> 1.5) rack-protection (~> 1.4) tilt (>= 1.3, < 3) + sixarm_ruby_unaccent (1.1.1) slop (3.6.0) + socksify (1.7.1) spring (1.3.6) spring-commands-rspec (1.0.4) spring (>= 0.9.1) - sprockets (3.5.2) + sprockets (3.7.1) concurrent-ruby (~> 1.0) rack (> 1, < 3) - sprockets-rails (3.0.4) + sprockets-rails (3.2.0) actionpack (>= 4.0) activesupport (>= 4.0) sprockets (>= 3.0.0) sys-uname (0.9.0) ffi (>= 1.0.0) - terminal-table (1.5.2) therubyracer (0.12.2) libv8 (~> 3.16.14.0) ref - thor (0.19.1) - thread_safe (0.3.5) + thor (0.19.4) + thread_safe (0.3.6) tilt (1.4.1) turbolinks (2.5.3) coffee-rails - tzinfo (1.2.2) + tzinfo (1.2.3) thread_safe (~> 0.1) uglifier (2.7.2) execjs (>= 0.3.0) json (>= 1.8.0) unf (0.1.4) unf_ext - unf_ext (0.0.7.1) - unicorn (4.9.0) + unf_ext (0.0.7.2) + unicode-display_width (1.2.0) + unicode_utils (1.4.0) + unicorn (5.3.0) kgio (~> 2.6) - rack raindrops (~> 0.7) uniform_notifier (1.9.0) - unparser (0.2.4) - abstract_type (~> 0.0.7) - adamantium (~> 0.2.0) - concord (~> 0.1.5) - diff-lcs (~> 1.2.5) - equalizer (~> 0.0.9) - parser (~> 2.2.2) - procto (~> 0.0.2) uuidtools (2.1.5) validates_email_format_of (1.6.3) i18n @@ -552,16 +537,16 @@ GEM coercible (~> 1.0) descendants_tracker (~> 0.0, >= 0.0.3) equalizer (~> 0.0, >= 0.0.9) - warden (1.2.6) + warden (1.2.7) rack (>= 1.0) wasabi (3.5.0) httpi (~> 2.0) nokogiri (>= 1.4.2) - webmock (2.1.0) + webmock (2.3.2) addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff - websocket-driver (0.6.2) + websocket-driver (0.6.5) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.2) whenever (0.9.4) @@ -579,20 +564,21 @@ DEPENDENCIES autodoc bootstrap-datepicker-rails (= 1.3.1.1) bootstrap-sass (= 3.3.5.1) - brakeman (= 3.0.5) + brakeman (= 3.6.1) bullet (= 4.14.7) - bundler-audit! + bundler-audit cancancan (= 1.11.0) capybara (= 2.4.4) + codeclimate-test-reporter (~> 1.0.0) coderay (= 1.1.0) coffee-rails (= 4.1.0) - countries (= 0.11.4) + countries daemons-rails (= 1.2.1) data_migrate! database_cleaner deep_cloneable (= 2.1.1) devise (= 3.5.4) - digidoc_client (= 0.2.1) + digidoc_client! epp (= 1.5.0)! epp-xml (= 1.1.0)! fabrication (= 2.13.2) @@ -605,7 +591,7 @@ DEPENDENCIES guard-rubocop (= 1.2.0) haml-rails (= 0.9.0) hashie-forbidden_attributes (= 0.1.1) - html2haml (= 2.0.0) + html2haml (= 2.1.0) html5_validators (= 1.2.2) isikukood iso8601 (= 0.8.6) @@ -617,12 +603,12 @@ DEPENDENCIES launchy (= 2.4.3) liquid (= 3.0.6) mina (= 0.3.1) - money-rails (= 1.4.1) - nokogiri (= 1.6.8) + money-rails + nokogiri (= 1.7.1) nprogress-rails (= 0.1.6.7) paper_trail! pdfkit (= 0.6.2) - pg (= 0.18.2) + pg (= 0.19.0) phantomjs (= 1.9.8.0) phantomjs-binaries (= 1.9.2.4) poltergeist (= 1.6.0) @@ -631,19 +617,19 @@ DEPENDENCIES que-web (= 0.4.0) que_mailer! railroady (= 1.3.0) - rails (= 4.2.5.2) + rails (= 4.2.7.1) rails-settings-cached (= 0.4.1) ransack (= 1.5.1) rest-client - rspec-rails (= 3.3.2) - rubocop (= 0.32.1) - rubycritic (= 1.4.0) - sass-rails (= 5.0.3) + rspec-rails (= 3.5.2) + rubocop (= 0.48.1) + rubycritic (= 3.2.0) + sass-rails (= 5.0.6) sdoc (= 0.4.1) select2-rails (= 3.5.9.3) selectize-rails (= 0.12.1) - simplecov (= 0.10.0) - simpleidn (= 0.0.5) + simplecov + simpleidn (= 0.0.7) spring (= 1.3.6) spring-commands-rspec (= 1.0.4) therubyracer (= 0.12.2) @@ -656,4 +642,4 @@ DEPENDENCIES whenever (= 0.9.4) BUNDLED WITH - 1.13.1 + 1.14.6 diff --git a/README.md b/README.md index 8ee6384a2..9b2833fa2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,10 @@ Domain Registry =============== [](https://travis-ci.org/internetee/registry) +[](https://codeclimate.com/github/internetee/registry) +[](https://codeclimate.com/github/internetee/registry) +[](https://codeclimate.com/github/internetee/registry/coverage) +[](http://docs.internet.ee/en/latest/?badge=latest) Full stack top-level domain (TLD) management. diff --git a/app/assets/javascripts/registrar-manifest.coffee b/app/assets/javascripts/registrar-manifest.coffee index 29b950fb4..86b7b4060 100644 --- a/app/assets/javascripts/registrar-manifest.coffee +++ b/app/assets/javascripts/registrar-manifest.coffee @@ -1,12 +1,9 @@ #= require jquery #= require jquery_ujs -#= require jquery.validate -#= require jquery.validate.additional-methods #= require turbolinks #= require bootstrap-sprockets #= require typeahead.bundle.min #= require jquery.nested_attributes -#= require shared/jquery.validate.bootstrap #= require jquery-ui/datepicker #= require select2 diff --git a/app/assets/javascripts/registrar/application.coffee b/app/assets/javascripts/registrar/application.coffee index a1a2084fe..f1b92f0f1 100644 --- a/app/assets/javascripts/registrar/application.coffee +++ b/app/assets/javascripts/registrar/application.coffee @@ -1,8 +1,4 @@ $(document).on 'page:change', -> - # client side validate all forms - $('form').each -> - $(this).validate() - $('.js-contact-form').on 'restoreDefault', (e) -> form = $(e.target) form.find('.js-ident-tip').hide() diff --git a/app/assets/javascripts/shared/jquery.validate.bootstrap.coffee b/app/assets/javascripts/shared/jquery.validate.bootstrap.coffee index 698eb9706..41b63748c 100644 --- a/app/assets/javascripts/shared/jquery.validate.bootstrap.coffee +++ b/app/assets/javascripts/shared/jquery.validate.bootstrap.coffee @@ -17,7 +17,3 @@ $.validator.setDefaults else error.insertAfter element return - -jQuery.validator.addMethod 'lax_email', ((value, element) -> - @optional(element) or (value.match(new RegExp("@", "g")) || []).length == 1 -), 'Please enter a valid email address.' diff --git a/app/views/admin/admin_users/_form.haml b/app/views/admin/admin_users/_form.haml index 0904ea99f..512cddde8 100644 --- a/app/views/admin/admin_users/_form.haml +++ b/app/views/admin/admin_users/_form.haml @@ -38,7 +38,7 @@ .col-md-4.control-label = f.label :email .col-md-8 - = f.text_field(:email, class: 'form-control', lax_email: true) + = f.email_field :email, class: 'form-control' .form-group .col-md-4.control-label = f.label :country_code, t(:country) diff --git a/app/views/admin/mail_templates/_form.haml b/app/views/admin/mail_templates/_form.haml index 6e9d828c5..739cce665 100644 --- a/app/views/admin/mail_templates/_form.haml +++ b/app/views/admin/mail_templates/_form.haml @@ -24,17 +24,17 @@ .col-md-4.control-label = f.label :from .col-md-7 - = f.text_field(:from, class: 'form-control', lax_email: true) + = f.email_field :from, class: 'form-control' .form-group .col-md-4.control-label = f.label :cc .col-md-7 - = f.text_field(:cc, class: 'form-control', lax_email: true) + = f.email_field :cc, class: 'form-control' .form-group .col-md-4.control-label = f.label :bcc .col-md-7 - = f.text_field(:bcc, class: 'form-control', lax_email: true) + = f.email_field :bcc, class: 'form-control' .form-group .col-md-12 = f.label :body, t(:html_body) diff --git a/app/views/admin/registrars/_form.haml b/app/views/admin/registrars/_form.haml index d62a375f8..abf440921 100644 --- a/app/views/admin/registrars/_form.haml +++ b/app/views/admin/registrars/_form.haml @@ -36,12 +36,12 @@ .col-md-4.control-label = f.label :email .col-md-7 - = f.text_field(:email, class: 'form-control', lax_email: true) + = f.email_field :email, class: 'form-control' .form-group .col-md-4.control-label = f.label :billing_email .col-md-7 - = f.text_field(:billing_email, class: 'form-control', lax_email: true) + = f.email_field :billing_email, class: 'form-control' .row .col-md-8 diff --git a/app/views/mailers/domain_delete_mailer/forced/death.html.erb b/app/views/mailers/domain_delete_mailer/forced/death.html.erb index 698a4067d..0213e07d9 100644 --- a/app/views/mailers/domain_delete_mailer/forced/death.html.erb +++ b/app/views/mailers/domain_delete_mailer/forced/death.html.erb @@ -1,4 +1,4 @@ -
Lugupeetud domeeni <%= @domain.name %> registreerija/halduskontakt
+Lugupeetud domeeni <%= @domain.name %> registreerija/halduskontakt
Eesti Interneti Sihtasutusele (EIS) on saanud teatavaks, et füüsiline isik isikukoodiga <%= @registrant.id_code %> on surnud ja sellest on möödunud vähemalt 6 kuud.
@@ -11,10 +11,11 @@Lisaküsimuste korral võtke palun ühendust oma registripidajaga:
<%= render 'mailers/shared/registrar/registrar.et.html', registrar: @registrar %> -Lugupidamisega -Eesti Interneti Sihtasutus +Lugupidamisega
+Eesti Interneti Sihtasutus
+
Dear registrant/administrative contact of .ee domain,
+Dear registrant/administrative contact of .ee domain,
Estonian Internet Foundation (EIF) has learned that the natural person <%= @registrant.name %> with identification code <%= @registrant.id_code %> has been deceased more than 6 months.
@@ -27,10 +28,11 @@ Eesti Interneti SihtasutusShould you have additional questions, please contact your registrar:
<%= render 'mailers/shared/registrar/registrar.en.html', registrar: @registrar %> -Best Regards, -Estonian Internet Foundation +Best Regards,
+Estonian Internet Foundation
+
Уважаемый регистрант/административный контакт домена .ee
+Уважаемый регистрант/административный контакт домена .ee
Целевому учреждению Eesti Internet (EIS) стало известно, что физическое лицо с личным кодом <%= @registrant.id_code %> умерло, и с момента смерти прошло не менее 6 месяцев.
@@ -43,5 +45,6 @@ Estonian Internet FoundationВ случае возникновения дополнительных вопросов свяжитесь, пожалуйста, со своим регистратором:
<%= render 'mailers/shared/registrar/registrar.ru.html', registrar: @registrar %> -С уважением, -Eesti Interneti Sihtasutus +С уважением,
+Eesti Interneti Sihtasutus
+
Lugupeetud domeeni <%= @domain.name %> registreerija/halduskontakt
+Lugupeetud domeeni <%= @domain.name %> registreerija/halduskontakt
Eesti Interneti Sihtasutusele (EIS) on saanud teatavaks, et juriidiline isik registrikoodiga <%= @registrant.reg_no %> on äriregistrist kustutatud.
@@ -11,10 +11,11 @@Lisaküsimuste korral võtke palun ühendust oma registripidajaga:
<%= render 'mailers/shared/registrar/registrar.et.html', registrar: @registrar %> -Lugupidamisega -Eesti Interneti Sihtasutus +Lugupidamisega
+Eesti Interneti Sihtasutus
+
Dear registrant/administrative contact of .ee domain,
+Dear registrant/administrative contact of .ee domain,
Estonian Internet Foundation (EIS) has learned that the legal person with registry code <%= @registrant.reg_no %> has been deleted from the Business Registry.
@@ -27,10 +28,11 @@ Eesti Interneti SihtasutusShould you have additional questions, please contact your registrar:
<%= render 'mailers/shared/registrar/registrar.en.html', registrar: @registrar %> -Best Regards, -Estonian Internet Foundation +Best Regards,
+Estonian Internet Foundation
+
Уважаемый регистрант/административный контакт домена .ee
+Уважаемый регистрант/административный контакт домена .ee
Целевому учреждению Eesti Internet (EIS) стало известно, что юридическое лицо с регистрационным кодом <%= @registrant.reg_no %> удалено из коммерческого реестра.
@@ -43,5 +45,6 @@ Estonian Internet FoundationВ случае возникновения дополнительных вопросов свяжитесь, пожалуйста, со своим регистратором:
<%= render 'mailers/shared/registrar/registrar.ru.html', registrar: @registrar %> -С уважением, -Eesti Interneti Sihtasutus +С уважением,
+Eesti Interneti Sihtasutus
+