diff --git a/Gemfile b/Gemfile index 9721cafc5..c3724a18a 100644 --- a/Gemfile +++ b/Gemfile @@ -94,7 +94,7 @@ group :development, :test do gem 'epp', '~> 1.4.0' # EPP XMLs - gem 'epp-xml', '~> 0.7.0' + gem 'epp-xml', '~> 0.8.1' # Replacement for fixtures gem 'fabrication', '~> 2.11.3' diff --git a/Gemfile.lock b/Gemfile.lock index acc513d72..356435bbc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -99,7 +99,7 @@ GEM epp (1.4.0) hpricot libxml-ruby - epp-xml (0.7.0) + epp-xml (0.8.1) activesupport (~> 4.1) builder (~> 3.2) equalizer (0.0.9) @@ -167,7 +167,7 @@ GEM method_source (0.8.2) mime-types (1.25.1) mini_portile (0.6.0) - minitest (5.4.2) + minitest (5.4.3) multi_json (1.10.1) net-scp (1.2.1) net-ssh (>= 2.6.5) @@ -373,7 +373,7 @@ DEPENDENCIES delayed_job_active_record (~> 4.0.2) devise (~> 3.3.0) epp (~> 1.4.0) - epp-xml (~> 0.7.0) + epp-xml (~> 0.8.1) fabrication (~> 2.11.3) faker (~> 1.3.0) guard (~> 2.6.1) diff --git a/app/controllers/epp/commands_controller.rb b/app/controllers/epp/commands_controller.rb index ccaad7f32..279a86d62 100644 --- a/app/controllers/epp/commands_controller.rb +++ b/app/controllers/epp/commands_controller.rb @@ -3,6 +3,7 @@ class Epp::CommandsController < ApplicationController include Epp::DomainsHelper include Epp::ContactsHelper include Epp::PollHelper + include Epp::KeyrelayHelper include Shared::UserStamper helper WhodunnitHelper diff --git a/app/helpers/epp/keyrelay_helper.rb b/app/helpers/epp/keyrelay_helper.rb new file mode 100644 index 000000000..f1b12ae5c --- /dev/null +++ b/app/helpers/epp/keyrelay_helper.rb @@ -0,0 +1,30 @@ +module Epp::KeyrelayHelper + def keyrelay + domain = Domain.find_by(name: parsed_frame.css('name').text) + + abs_datetime = parsed_frame.css('absolute').text + abs_datetime = abs_datetime.to_date if abs_datetime + + kr = domain.keyrelays.create( + domain: domain, + pa_date: Time.now, + key_data_flags: parsed_frame.css('flags').text, + key_data_protocol: parsed_frame.css('protocol').text, + key_data_alg: parsed_frame.css('alg').text, + key_data_public_key: parsed_frame.css('pubKey').text, + auth_info_pw: parsed_frame.css('pw').text, + expiry_relative: parsed_frame.css('relative').text, + expiry_absolute: abs_datetime, + requester: current_epp_user.registrar, + accepter: domain.registrar + ) + + domain.registrar.messages.create( + body: 'Key Relay action completed successfully.', + attached_obj_type: kr.class.to_s, + attached_obj_id: kr.id + ) + + render '/epp/shared/success' + end +end diff --git a/app/models/domain.rb b/app/models/domain.rb index 621ba123b..22ecdc4c7 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -29,6 +29,9 @@ class Domain < ActiveRecord::Base has_many :domain_transfers, dependent: :delete_all has_many :dnskeys, dependent: :delete_all + + has_many :keyrelays + accepts_nested_attributes_for :dnskeys, allow_destroy: true, reject_if: proc { |attrs| attrs[:public_key].blank? } diff --git a/app/models/keyrelay.rb b/app/models/keyrelay.rb new file mode 100644 index 000000000..e613ddafa --- /dev/null +++ b/app/models/keyrelay.rb @@ -0,0 +1,6 @@ +class Keyrelay < ActiveRecord::Base + belongs_to :domain + + belongs_to :requester, class_name: 'Registrar' + belongs_to :accepter, class_name: 'Registrar' +end diff --git a/app/views/epp/shared/success.xml.builder b/app/views/epp/shared/success.xml.builder new file mode 100644 index 000000000..a8bfe162f --- /dev/null +++ b/app/views/epp/shared/success.xml.builder @@ -0,0 +1,9 @@ +xml.epp_head do + xml.response do + xml.result('code' => '1000') do + xml.msg 'Command completed successfully' + end + end + + xml << render('/epp/shared/trID') +end diff --git a/db/migrate/20141114130737_create_keyrelay.rb b/db/migrate/20141114130737_create_keyrelay.rb new file mode 100644 index 000000000..bd6fe6887 --- /dev/null +++ b/db/migrate/20141114130737_create_keyrelay.rb @@ -0,0 +1,19 @@ +class CreateKeyrelay < ActiveRecord::Migration + def change + create_table :keyrelays do |t| + t.integer :domain_id + t.datetime :pa_date + t.string :key_data_flags + t.string :key_data_protocol + t.string :key_data_alg + t.text :key_data_public_key + t.string :auth_info_pw + t.string :expiry_relative + t.datetime :expiry_absolute + t.integer :requester_id + t.integer :accepter_id + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 63fbc9a07..295d7b948 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20141111105931) do +ActiveRecord::Schema.define(version: 20141114130737) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -215,6 +215,22 @@ ActiveRecord::Schema.define(version: 20141111105931) do t.datetime "updated_at" end + create_table "keyrelays", force: true do |t| + t.integer "domain_id" + t.datetime "pa_date" + t.string "key_data_flags" + t.string "key_data_protocol" + t.string "key_data_alg" + t.text "key_data_public_key" + t.string "auth_info_pw" + t.string "expiry_relative" + t.datetime "expiry_absolute" + t.integer "requester_id" + t.integer "accepter_id" + t.datetime "created_at" + t.datetime "updated_at" + end + create_table "messages", force: true do |t| t.integer "registrar_id" t.string "body" diff --git a/spec/epp/keyrelay_spec.rb b/spec/epp/keyrelay_spec.rb new file mode 100644 index 000000000..50696b120 --- /dev/null +++ b/spec/epp/keyrelay_spec.rb @@ -0,0 +1,44 @@ +require 'rails_helper' + +describe 'EPP Keyrelay', epp: true do + let(:server_zone) { Epp::Server.new({ server: 'localhost', tag: 'zone', password: 'ghyt9e4fu', port: 701 }) } + let(:server_elkdata) { Epp::Server.new({ server: 'localhost', tag: 'elkdata', password: 'ghyt9e4fu', port: 701 }) } + let(:elkdata) { Fabricate(:registrar, { name: 'Elkdata', reg_no: '123' }) } + let(:zone) { Fabricate(:registrar) } + let(:domain) { Fabricate(:domain, name: 'example.ee', registrar: zone, dnskeys: [Fabricate.build(:dnskey)]) } + + before(:each) { create_settings } + + context 'with valid user' do + before(:each) do + Fabricate(:epp_user, username: 'zone', registrar: zone) + Fabricate(:epp_user, username: 'elkdata', registrar: elkdata) + end + + it 'makes a keyrelay request' do + xml = EppXml::Keyrelay.keyrelay({ + name: { value: 'example.ee' }, + keyData: { + flags: { value: '256' }, + protocol: { value: '3' }, + alg: { value: '8' }, + pubKey: { value: 'cmlraXN0aGViZXN0' } + }, + authInfo: { + pw: { value: domain.auth_info } + }, + expiry: { + relative: { value: 'P1M13D' } + } + }) + + response = epp_request(xml, :xml, :elkdata) + + expect(response[:msg]).to eq('Command completed successfully') + expect(response[:result_code]).to eq('1000') + + expect(zone.messages.queued.count).to eq(1) + end + + end +end