Skip to content

Commit aa856a8

Browse files
committed
Add coerce param to Base64Serializer
1 parent e48d4ee commit aa856a8

File tree

6 files changed

+40
-16
lines changed

6 files changed

+40
-16
lines changed

app/models/mdm/event.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@ class Mdm::Event < ApplicationRecord
7373
#
7474
# @return [Hash]
7575
if ActiveRecord::VERSION::MAJOR >= 7 && ActiveRecord::VERSION::MINOR >= 1
76-
serialize :info, coder: MetasploitDataModels::Base64Serializer.new
76+
serialize :info, coder: MetasploitDataModels::Base64Serializer.new(coerce: true)
7777
else
78-
serialize :info, MetasploitDataModels::Base64Serializer.new
78+
serialize :info, MetasploitDataModels::Base64Serializer.new(coerce: true)
7979
end
8080

8181
#

app/models/mdm/listener.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,9 @@ class Mdm::Listener < ApplicationRecord
7070
#
7171
# @return [Hash]
7272
if ActiveRecord::VERSION::MAJOR >= 7 && ActiveRecord::VERSION::MINOR >= 1
73-
serialize :options, coder: MetasploitDataModels::Base64Serializer.new
73+
serialize :options, coder: MetasploitDataModels::Base64Serializer.new(coerce: true)
7474
else
75-
serialize :options, MetasploitDataModels::Base64Serializer.new
75+
serialize :options, MetasploitDataModels::Base64Serializer.new(coerce: true)
7676
end
7777

7878
#

app/models/mdm/session.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,9 @@ class Mdm::Session < ApplicationRecord
173173
#
174174

175175
if ActiveRecord::VERSION::MAJOR >= 7 && ActiveRecord::VERSION::MINOR >= 1
176-
serialize :datastore, coder: ::MetasploitDataModels::Base64Serializer.new
176+
serialize :datastore, coder: ::MetasploitDataModels::Base64Serializer.new(coerce: true)
177177
else
178-
serialize :datastore, ::MetasploitDataModels::Base64Serializer.new
178+
serialize :datastore, ::MetasploitDataModels::Base64Serializer.new(coerce: true)
179179
end
180180

181181
# Returns whether the session can be upgraded to a meterpreter session from a shell session on Windows.

app/models/mdm/task.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,27 +131,27 @@ class Mdm::Task < ApplicationRecord
131131
#
132132
# @return [Hash]
133133
if ActiveRecord::VERSION::MAJOR >= 7 && ActiveRecord::VERSION::MINOR >= 1
134-
serialize :options, coder: MetasploitDataModels::Base64Serializer.new
134+
serialize :options, coder: MetasploitDataModels::Base64Serializer.new(coerce: true)
135135
else
136-
serialize :options, MetasploitDataModels::Base64Serializer.new
136+
serialize :options, MetasploitDataModels::Base64Serializer.new(coerce: true)
137137
end
138138

139139
# Result of task running.
140140
#
141141
# @return [Hash]
142142
if ActiveRecord::VERSION::MAJOR >= 7 && ActiveRecord::VERSION::MINOR >= 1
143-
serialize :result, coder: MetasploitDataModels::Base64Serializer.new
143+
serialize :result, coder: MetasploitDataModels::Base64Serializer.new(coerce: true)
144144
else
145-
serialize :result, MetasploitDataModels::Base64Serializer.new
145+
serialize :result, MetasploitDataModels::Base64Serializer.new(coerce: true)
146146
end
147147

148148
# Settings used to configure this task outside of the {#options module options}.
149149
#
150150
# @return [Hash]
151151
if ActiveRecord::VERSION::MAJOR >= 7 && ActiveRecord::VERSION::MINOR >= 1
152-
serialize :settings, coder: MetasploitDataModels::Base64Serializer.new
152+
serialize :settings, coder: MetasploitDataModels::Base64Serializer.new(coerce: true)
153153
else
154-
serialize :settings, MetasploitDataModels::Base64Serializer.new
154+
serialize :settings, MetasploitDataModels::Base64Serializer.new(coerce: true)
155155
end
156156

157157
#

app/models/mdm/web_vuln.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,9 +142,9 @@ class Mdm::WebVuln < ApplicationRecord
142142
#
143143
# @return [Array<Array(String, String)>] Array of parameter key value pairs
144144
if ActiveRecord::VERSION::MAJOR >= 7 && ActiveRecord::VERSION::MINOR >= 1
145-
serialize :params, coder: MetasploitDataModels::Base64Serializer.new(:default => DEFAULT_PARAMS)
145+
serialize :params, coder: MetasploitDataModels::Base64Serializer.new(default: DEFAULT_PARAMS)
146146
else
147-
serialize :params, MetasploitDataModels::Base64Serializer.new(:default => DEFAULT_PARAMS)
147+
serialize :params, MetasploitDataModels::Base64Serializer.new(default: DEFAULT_PARAMS)
148148
end
149149

150150
#

lib/metasploit_data_models/base64_serializer.rb

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ class MetasploitDataModels::Base64Serializer
1515

1616
# The default for {#default}
1717
DEFAULT = {}
18+
19+
# The default for {#coerce}
20+
COERCE_DEFAULT = false
21+
1822
# Deserializers for {#load}
1923
# 1. Base64 decoding and then unmarshalling the value.
2024
# 2. Parsing the value as YAML.
@@ -47,14 +51,33 @@ def default
4751
end
4852

4953
attr_writer :default
54+
attr_writer :coerce
55+
56+
# Recursively coerce the object that has been passed in, keeping primitive types as their original type,
57+
# while changing objects that cannot be serialized into a string representation of the object data.
58+
def coerce_object(value)
59+
case value
60+
when Hash
61+
value.transform_values { |v| coerce_object(v) }
62+
when Array
63+
value.map { |v| coerce_object(v) }
64+
when File, IO
65+
value.inspect
66+
when String, Integer, Float, TrueClass, FalseClass, NilClass, Symbol
67+
value
68+
else
69+
value.to_s
70+
end
71+
end
5072

5173
# Serializes the value by marshalling the value and then base64 encodes the marshaled value.
5274
#
5375
# @param value [Object] value to serialize
5476
# @return [String]
5577
def dump(value)
5678
# Always store data back in the Marshal format
57-
marshalled = Marshal.dump(value)
79+
to_serialize = @coerce ? coerce_object(value) : value
80+
marshalled = Marshal.dump(to_serialize)
5881
base64_encoded = [ marshalled ].pack('m')
5982

6083
base64_encoded
@@ -63,9 +86,10 @@ def dump(value)
6386
# @param attributes [Hash] attributes
6487
# @option attributes [Object] :default ({}) Value to use for {#default}.
6588
def initialize(attributes={})
66-
attributes.assert_valid_keys(:default)
89+
attributes.assert_valid_keys(:default, :coerce)
6790

6891
@default = attributes.fetch(:default, DEFAULT)
92+
@coerce = attributes.fetch(:coerce, COERCE_DEFAULT)
6993
end
7094

7195
# Deserializes the value by either

0 commit comments

Comments
 (0)