Add basic keyrelay command, tests

This commit is contained in:
Martin Lensment 2014-11-14 16:11:09 +02:00
parent 1f5efa78ac
commit ec721b69c0
10 changed files with 133 additions and 5 deletions

View file

@ -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'

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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? }

6
app/models/keyrelay.rb Normal file
View file

@ -0,0 +1,6 @@
class Keyrelay < ActiveRecord::Base
belongs_to :domain
belongs_to :requester, class_name: 'Registrar'
belongs_to :accepter, class_name: 'Registrar'
end

View file

@ -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

View file

@ -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

View file

@ -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"

44
spec/epp/keyrelay_spec.rb Normal file
View file

@ -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