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..d14bf1e1b 100644
--- a/app/models/epp/contact.rb
+++ b/app/models/epp/contact.rb
@@ -1,3 +1,6 @@
+require 'deserializers/xml/legal_document'
+require 'deserializers/xml/ident'
+
class Epp::Contact < Contact
include EppErrors
@@ -38,8 +41,8 @@ class Epp::Contact < Contact
at[:auth_info] = f.css('authInfo pw').text if f.css('authInfo pw').present?
-
- at.merge!(ident_attrs(f.css('ident').first)) if new_record
+ ident_attrs = ::Deserializers::Xml::Ident.new(f).call
+ at.merge!(ident_attrs) if new_record
at
end
@@ -54,36 +57,6 @@ class Epp::Contact < Contact
)
end
- def ident_attrs(ident_frame)
- return {} unless ident_attr_valid?(ident_frame)
-
- {
- ident: ident_frame.text,
- ident_type: ident_frame.attr('type'),
- ident_country_code: ident_frame.attr('cc')
- }
- end
-
- def ident_attr_valid?(ident_frame)
- return false if ident_frame.blank?
- return false if ident_frame.try('text').blank?
- return false if ident_frame.attr('type').blank?
- return false if ident_frame.attr('cc').blank?
-
- true
- end
-
- def legal_document_attrs(legal_frame)
- return [] if legal_frame.blank?
- return [] if legal_frame.try('text').blank?
- return [] if legal_frame.attr('type').blank?
-
- [{
- body: legal_frame.text,
- document_type: legal_frame.attr('type')
- }]
- end
-
def check_availability(codes)
codes = [codes] if codes.is_a?(String)
@@ -140,7 +113,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 +210,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/ident.rb b/lib/deserializers/xml/ident.rb
new file mode 100644
index 000000000..0dc65cbb6
--- /dev/null
+++ b/lib/deserializers/xml/ident.rb
@@ -0,0 +1,34 @@
+module Deserializers
+ module Xml
+ class Ident
+ attr_reader :frame
+
+ def initialize(frame)
+ @frame = frame.css('ident').first
+ end
+
+ def call
+ if valid?
+ {
+ ident: frame.text,
+ ident_type: frame.attr('type'),
+ ident_country_code: frame.attr('cc'),
+ }
+ else
+ {}
+ end
+ end
+
+ private
+
+ def valid?
+ return false if frame.blank?
+ return false if frame.try('text').blank?
+ return false if frame.attr('type').blank?
+ return false if frame.attr('cc').blank?
+
+ true
+ end
+ end
+ end
+end
diff --git a/lib/deserializers/xml/legal_document.rb b/lib/deserializers/xml/legal_document.rb
new file mode 100644
index 000000000..b75267f2d
--- /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/ident_test.rb b/test/lib/deserializers/xml/ident_test.rb
new file mode 100644
index 000000000..beff7aef5
--- /dev/null
+++ b/test/lib/deserializers/xml/ident_test.rb
@@ -0,0 +1,95 @@
+require 'test_helper'
+require 'deserializers/xml/ident'
+
+class DeserializersXmlIdentTest < ActiveSupport::TestCase
+ def test_returns_empty_hash_when_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::Ident.new(nokogiri_frame)
+ assert_equal instance.call, {}
+ end
+
+ def test_returns_empty_hash_when_not_valid
+ xml_string = <<-XML
+
+
+
+
+
+ FIRST0:SH2027223711
+
+ wrong password
+
+
+
+
+
+ 37605030299
+ dGVzdCBmYWlsCg==
+
+
+ ABC-12345
+
+
+ XML
+
+ nokogiri_frame = Nokogiri::XML(xml_string).remove_namespaces!
+ instance = ::Deserializers::Xml::Ident.new(nokogiri_frame)
+ assert_equal instance.call, {}
+ end
+
+ def test_returns_complete_hash_when_valid
+ xml_string = <<-XML
+
+
+
+
+
+ FIRST0:SH2027223711
+
+ wrong password
+
+
+
+
+
+ 37605030299
+ dGVzdCBmYWlsCg==
+
+
+ ABC-12345
+
+
+ XML
+
+ nokogiri_frame = Nokogiri::XML(xml_string).remove_namespaces!
+ instance = ::Deserializers::Xml::Ident.new(nokogiri_frame)
+
+ expected_result = {
+ ident: '37605030299',
+ ident_type: 'priv',
+ ident_country_code: 'EE'
+ }
+
+ assert_equal instance.call, expected_result
+ 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