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