Class: Msf::Util::DotNetDeserialization::Formatters::SoapFormatter::SoapBuilder
- Inherits:
-
Object
- Object
- Msf::Util::DotNetDeserialization::Formatters::SoapFormatter::SoapBuilder
- Defined in:
- lib/msf/util/dot_net_deserialization/formatters/soap_formatter.rb
Instance Attribute Summary collapse
-
#root ⇒ Object
readonly
Returns the value of attribute root.
Instance Method Summary collapse
- #build_class_with_members_and_types(body, record_value, library_name: Assemblies::VERSIONS['4.0.0.0']['mscorlib']) ⇒ Object protected
-
#initialize(stream) ⇒ SoapBuilder
constructor
A new instance of SoapBuilder.
- #member_value_nodes(record_value) ⇒ Object protected
- #node(name, attributes: {}, content: nil, parent: nil) ⇒ Object protected
Constructor Details
#initialize(stream) ⇒ SoapBuilder
Returns a new instance of SoapBuilder.
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/msf/util/dot_net_deserialization/formatters/soap_formatter.rb', line 8 def initialize(stream) @document = Nokogiri::XML::Document.new @root = envelop = node('SOAP-ENV:Envelope', attributes: { 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema', 'xmlns:SOAP-ENC' => 'http://schemas.xmlsoap.org/soap/encoding/', 'xmlns:SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/', 'xmlns:clr' => 'http://schemas.microsoft.com/soap/encoding/clr/1.0', 'SOAP-ENV:encodingStyle' => 'http://schemas.xmlsoap.org/soap/encoding/' }) body = node('SOAP-ENV:Body', parent: envelop) stream.records.each do |record| record_value = record.record_value case record.record_type when Enums::RecordTypeEnum[:SystemClassWithMembersAndTypes] build_class_with_members_and_types(body, record_value) when Enums::RecordTypeEnum[:ClassWithMembersAndTypes] library = stream.get_object(record_value.library_id) build_class_with_members_and_types(body, record_value, library_name: library.library_name) end end end |
Instance Attribute Details
#root ⇒ Object (readonly)
Returns the value of attribute root.
33 34 35 |
# File 'lib/msf/util/dot_net_deserialization/formatters/soap_formatter.rb', line 33 def root @root end |
Instance Method Details
#build_class_with_members_and_types(body, record_value, library_name: Assemblies::VERSIONS['4.0.0.0']['mscorlib']) ⇒ Object (protected)
37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/msf/util/dot_net_deserialization/formatters/soap_formatter.rb', line 37 def build_class_with_members_and_types(body, record_value, library_name: Assemblies::VERSIONS['4.0.0.0']['mscorlib']) library_name = library_name.to_s if library_name.is_a? Assemblies::StrongName ns = "a#{body.children.length + 1}" class_node = node("#{ns}:#{record_value.class_info.name.split('.')[-1]}", parent: body, attributes: { 'id' => "ref-#{record_value.class_info.obj_id}", "xmlns:#{ns}" => "http://schemas.microsoft.com/clr/nsassem/#{record_value.class_info.name.split('.')[0...-1].join('.')}/#{library_name}" }) member_value_nodes(record_value).each do |value_node| class_node.add_child value_node end class_node end |
#member_value_nodes(record_value) ⇒ Object (protected)
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/msf/util/dot_net_deserialization/formatters/soap_formatter.rb', line 51 def member_value_nodes(record_value) value_nodes = [] record_value.class_info.member_names.each_with_index do |name, index| binary_type = record_value.member_type_info.binary_type_enums[index].value case binary_type when Enums::BinaryTypeEnum[:String] string_record_value = record_value.member_values[index].record_value value_nodes << node(name, content: string_record_value.string, attributes: { 'id' => "ref-#{string_record_value.obj_id}", 'xsi:type' => 'xsd:string', 'xmlns' => '' }) else raise ::NotImplementedError, "Member value type #{Enums::BinaryTypeEnum.key(binary_type)} is not implemented" end end value_nodes end |
#node(name, attributes: {}, content: nil, parent: nil) ⇒ Object (protected)
71 72 73 74 75 76 77 78 79 80 |
# File 'lib/msf/util/dot_net_deserialization/formatters/soap_formatter.rb', line 71 def node(name, attributes: {}, content: nil, parent: nil) node = Nokogiri::XML::Node.new(name, @document) attributes.each_pair do |key, value| node[key] = value end node.content = content unless content.nil? parent.add_child node unless parent.nil? node end |