diff --git a/app/models/contact.rb b/app/models/contact.rb index 2ee45e716..33cc3ff0f 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -1,3 +1,5 @@ +require 'deserializers/xml/legal_document' + class Contact < ApplicationRecord include Versions # version/contact_version.rb include EppErrors @@ -351,7 +353,7 @@ class Contact < ApplicationRecord return false end - legal_document_data = Epp::Domain.parse_legal_document_from_frame(frame) + legal_document_data = ::Deserializers::Xml::LegalDocument.new(frame).call if legal_document_data diff --git a/app/models/epp/contact.rb b/app/models/epp/contact.rb index fa488d9e1..10a74426a 100644 --- a/app/models/epp/contact.rb +++ b/app/models/epp/contact.rb @@ -1,3 +1,5 @@ +require 'deserializers/xml/legal_document' + class Epp::Contact < Contact include EppErrors @@ -140,7 +142,7 @@ class Epp::Contact < Contact at[:statuses] = statuses - statuses_attrs(frame.css('rem'), 'rem') + statuses_attrs(frame.css('add'), 'add') end - if doc = attach_legal_document(Epp::Domain.parse_legal_document_from_frame(frame)) + if doc = attach_legal_document(::Deserializers::Xml::LegalDocument.new(frame).call) frame.css("legalDocument").first.content = doc.path if doc&.persisted? self.legal_document_id = doc.id end @@ -237,7 +239,7 @@ class Epp::Contact < Contact end def add_legal_file_to_new frame - legal_document_data = Epp::Domain.parse_legal_document_from_frame(frame) + legal_document_data = ::Deserializers::Xml::LegalDocument.new(frame).call return unless legal_document_data doc = LegalDocument.create( diff --git a/app/models/epp/domain.rb b/app/models/epp/domain.rb index 6eab37079..8c3ffec48 100644 --- a/app/models/epp/domain.rb +++ b/app/models/epp/domain.rb @@ -1,3 +1,5 @@ +require 'deserializers/xml/legal_document' + class Epp::Domain < Domain include EppErrors @@ -180,7 +182,7 @@ class Epp::Domain < Domain # 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) + legal_document_data = ::Deserializers::Xml::LegalDocument.new(frame).call return unless legal_document_data doc = LegalDocument.create( @@ -457,7 +459,7 @@ class Epp::Domain < Domain at.deep_merge!(attrs_from(frame.css('chg'), current_user, 'chg')) at.deep_merge!(attrs_from(frame.css('rem'), current_user, 'rem')) - if doc = attach_legal_document(Epp::Domain.parse_legal_document_from_frame(frame)) + if doc = attach_legal_document(::Deserializers::Xml::LegalDocument.new(frame).call) frame.css("legalDocument").first.content = doc.path if doc&.persisted? self.legal_document_id = doc.id end @@ -554,7 +556,7 @@ class Epp::Domain < Domain return end - if doc = attach_legal_document(Epp::Domain.parse_legal_document_from_frame(frame)) + if doc = attach_legal_document(::Deserializers::Xml::LegalDocument.new(frame).call) frame.css("legalDocument").first.content = doc.path if doc&.persisted? end @@ -665,7 +667,7 @@ class Epp::Domain < Domain self.registrar = current_user.registrar end - attach_legal_document(self.class.parse_legal_document_from_frame(frame)) + attach_legal_document(::Deserializers::Xml::LegalDocument.new(frame).call) save!(validate: false) return dt @@ -690,7 +692,7 @@ class Epp::Domain < Domain regenerate_transfer_code self.registrar = pt.new_registrar - attach_legal_document(self.class.parse_legal_document_from_frame(frame)) + attach_legal_document(::Deserializers::Xml::LegalDocument.new(frame).call) save!(validate: false) end @@ -710,7 +712,7 @@ class Epp::Domain < Domain status: DomainTransfer::CLIENT_REJECTED ) - attach_legal_document(self.class.parse_legal_document_from_frame(frame)) + attach_legal_document(::Deserializers::Xml::LegalDocument.new(frame).call) save!(validate: false) end @@ -759,18 +761,6 @@ class Epp::Domain < Domain p[:unit] end - def parse_legal_document_from_frame(parsed_frame) - ld = parsed_frame.css('legalDocument').first - return nil unless ld - return nil if ld.text.starts_with?(ENV['legal_documents_dir']) # escape reloading - return nil if ld.text.starts_with?('/home/') # escape reloading - - { - body: ld.text, - type: ld['type'] - } - end - def check_availability(domain_names) domain_names = [domain_names] if domain_names.is_a?(String) diff --git a/lib/deserializers/xml/legal_document.rb b/lib/deserializers/xml/legal_document.rb new file mode 100644 index 000000000..53d162bd1 --- /dev/null +++ b/lib/deserializers/xml/legal_document.rb @@ -0,0 +1,22 @@ +module Deserializers + module Xml + # Given a nokogiri frame, extract information about legal document from it. + class LegalDocument + attr_reader :frame + + def initialize(frame) + @frame = frame + end + + def call + ld = frame.css('legalDocument').first + return unless ld + + { + body: ld.text, + type: ld['type'] + } + end + end + end +end diff --git a/test/lib/deserializers/xml/legal_document_test.rb b/test/lib/deserializers/xml/legal_document_test.rb new file mode 100644 index 000000000..ac173ba4b --- /dev/null +++ b/test/lib/deserializers/xml/legal_document_test.rb @@ -0,0 +1,62 @@ +require 'test_helper' +require 'deserializers/xml/legal_document' + +class DeserializersXmlLegalDocumentTest < ActiveSupport::TestCase + def test_returns_nil_when_required_fields_not_present + xml_string = <<-XML + + + + + + john-001 + + + new name + + +123.4 + new-email@inbox.test + + + + + + XML + + nokogiri_frame = Nokogiri::XML(xml_string).remove_namespaces! + instance = ::Deserializers::Xml::LegalDocument.new(nokogiri_frame) + + assert_nil instance.call + end + + def test_returns_hash_when_document_exists + xml_string = <<-XML + + + + + + FIRST0:SH2027223711 + + wrong password + + + + + + 37605030299 + dGVzdCBmYWlsCg== + + + ABC-12345 + + + XML + + nokogiri_frame = Nokogiri::XML(xml_string).remove_namespaces! + instance = ::Deserializers::Xml::LegalDocument.new(nokogiri_frame) + expected_result = { body: "dGVzdCBmYWlsCg==", type: "pdf" } + + assert_equal expected_result, instance.call + end +end