Skip to content

Commit 249c08f

Browse files
committed
usability improvements ith how base options are registered
This adds named parameters for all of the current array-index based options. It also allows specifying the description as the 2nd parameter, allowing the 'required' parameter to be implicitly false (the most common value). A simple parameter like: OptAddress.new('ReverseListenerBindAddress', [false, 'The specific IP address to bind to on the local system']), Can now be rewritten as: OptAddress.new('ReverseListenerBindAddress', 'The specific IP address to bind to on the local system'), More complex options are also now easier to read: OptString.new( 'HttpUserAgent', 'The user-agent that the payload should use', default: Rex::UserAgent.shortest, aliases: ['MeterpreterUserAgent'] ), This also makes dealing with enums easier because default is implicit unless specified. This: OptEnum.new('PayloadProxyType', [true, 'The proxy type, HTTP or SOCKS', 'HTTP', ['HTTP', 'SOCKS']]), Becomes: OptEnum.new('HttpProxyType', 'The proxy type, HTTP or SOCKS', required: true, enums: ['HTTP', 'SOCKS']) This maintains full backward compatibility with existing code as well.
1 parent 80b381c commit 249c08f

File tree

1 file changed

+28
-15
lines changed

1 file changed

+28
-15
lines changed

lib/msf/core/opt_base.rb

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,31 @@ class OptBase
2222
# attrs[3] = possible enum values
2323
# attrs[4] = Regex to validate the option
2424
#
25-
def initialize(in_name, attrs = [], aliases: [])
25+
# Attrs can also be specified explicitly via named parameters, or attrs can
26+
# also be a string as standin for the required description field.
27+
#
28+
def initialize(in_name, attrs = [],
29+
required: false, desc: nil, default: nil, enums: [], regex: nil, aliases: [])
2630
self.name = in_name
2731
self.advanced = false
2832
self.evasion = false
29-
self.required = attrs[0] || false
30-
self.desc = attrs[1]
31-
self.default = attrs[2]
32-
self.enums = [ *(attrs[3]) ].map { |x| x.to_s }
33-
regex_temp = attrs[4] || nil
33+
self.aliases = aliases
34+
35+
if attrs.is_a?(String) || attrs.length == 0
36+
self.required = required
37+
self.desc = attrs.is_a?(String) ? attrs : desc
38+
self.enums = [ *(enums) ].map { |x| x.to_s }
39+
self.default = default || enums[0]
40+
regex_temp = regex
41+
else
42+
self.required = attrs[0] || required
43+
self.desc = attrs[1] || desc
44+
self.default = attrs[2] || default
45+
self.enums = attrs[3] || enums
46+
self.enums = [ *(self.enums) ].map { |x| x.to_s }
47+
regex_temp = attrs[4] || regex
48+
end
49+
3450
if regex_temp
3551
# convert to string
3652
regex_temp = regex_temp.to_s if regex_temp.is_a? Regexp
@@ -45,35 +61,34 @@ def initialize(in_name, attrs = [], aliases: [])
4561
raise("Invalid Regex #{regex_temp}: #{e}")
4662
end
4763
end
48-
self.aliases = aliases
4964
end
5065

5166
#
5267
# Returns true if this is a required option.
5368
#
5469
def required?
55-
return required
70+
required
5671
end
5772

5873
#
5974
# Returns true if this is an advanced option.
6075
#
6176
def advanced?
62-
return advanced
77+
advanced
6378
end
6479

6580
#
6681
# Returns true if this is an evasion option.
6782
#
6883
def evasion?
69-
return evasion
84+
evasion
7085
end
7186

7287
#
7388
# Returns true if the supplied type is equivalent to this option's type.
7489
#
7590
def type?(in_type)
76-
return (type == in_type)
91+
type == in_type
7792
end
7893

7994
#
@@ -94,15 +109,15 @@ def valid?(value, check_empty: true)
94109
if regex
95110
return !!value.match(regex)
96111
end
97-
return true
112+
true
98113
end
99114

100115
#
101116
# Returns true if the value supplied is nil and it's required to be
102117
# a valid value
103118
#
104119
def empty_required_value?(value)
105-
return (required? and value.nil?)
120+
required? && value.nil?
106121
end
107122

108123
#
@@ -169,6 +184,4 @@ def display_value(value)
169184

170185
attr_writer :required, :desc, :default # :nodoc:
171186
end
172-
173187
end
174-

0 commit comments

Comments
 (0)