Class: Msf::OptBase

Inherits:
Object
  • Object
show all
Defined in:
lib/msf/core/opt_base.rb

Overview

The base class for all options.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(in_name, attrs = [], required: false, desc: nil, default: nil, conditions: [], enums: [], regex: nil, aliases: [], max_length: nil) ⇒ OptBase

Initializes a named option with the supplied attribute array. The array is composed of three values.

attrs = required (boolean type) attrs = description (string) attrs = default value attrs = possible enum values attrs = Regex to validate the option

Attrs can also be specified explicitly via named parameters, or attrs can also be a string as standin for the required description field.


28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/msf/core/opt_base.rb', line 28

def initialize(in_name, attrs = [],
               required: false, desc: nil, default: nil, conditions: [], enums: [], regex: nil, aliases: [], max_length: nil)
  self.name     = in_name
  self.advanced = false
  self.evasion  = false
  self.aliases  = aliases
  self.max_length = max_length
  self.conditions = conditions

  if attrs.is_a?(String) || attrs.length == 0
    self.required = required
    self.desc     = attrs.is_a?(String) ? attrs : desc
    self.enums    = [ *(enums) ].map { |x| x.to_s }
    if default.nil? && enums.length > 0
      self.default = enums[0]
    else
      self.default = default
    end
    regex_temp = regex
  else
    if attrs[0].nil?
      self.required = required
    else
      self.required = attrs[0]
    end
    self.desc     = attrs[1] || desc
    self.default  = attrs[2] || default
    self.enums    = attrs[3] || enums
    self.enums    = [ *(self.enums) ].map { |x| x.to_s }
    regex_temp    = attrs[4] || regex
  end

  unless max_length.nil?
    self.desc += " Max parameter length: #{max_length} characters"
  end

  if regex_temp
    # convert to string
    regex_temp = regex_temp.to_s if regex_temp.is_a? Regexp
    # remove start and end character, they will be added later
    regex_temp = regex_temp.sub(/^\^/, '').sub(/\$$/, '')
    # Add start and end marker to match the whole regex
    regex_temp = "^#{regex_temp}$"
    begin
      Regexp.compile(regex_temp)
      self.regex = regex_temp
    rescue RegexpError, TypeError => e
      raise("Invalid Regex #{regex_temp}: #{e}")
    end
  end
end

Instance Attribute Details

#advancedObject

Whether or not this is an advanced option.


184
185
186
# File 'lib/msf/core/opt_base.rb', line 184

def advanced
  @advanced
end

#aliasesObject

Aliases for this option for backward compatibility


208
209
210
# File 'lib/msf/core/opt_base.rb', line 208

def aliases
  @aliases
end

#conditionsObject

The list of potential conditions


196
197
198
# File 'lib/msf/core/opt_base.rb', line 196

def conditions
  @conditions
end

#defaultObject

The default value of the option.


176
177
178
# File 'lib/msf/core/opt_base.rb', line 176

def default
  @default
end

#descObject

The description of the option.


172
173
174
# File 'lib/msf/core/opt_base.rb', line 172

def desc
  @desc
end

#enumsObject

The list of potential valid values


200
201
202
# File 'lib/msf/core/opt_base.rb', line 200

def enums
  @enums
end

#evasionObject

Whether or not this is an evasion option.


188
189
190
# File 'lib/msf/core/opt_base.rb', line 188

def evasion
  @evasion
end

#max_lengthObject

The max length of the input value


212
213
214
# File 'lib/msf/core/opt_base.rb', line 212

def max_length
  @max_length
end

#nameObject

The name of the option.


164
165
166
# File 'lib/msf/core/opt_base.rb', line 164

def name
  @name
end

#ownerObject

The module or entity that owns this option.


192
193
194
# File 'lib/msf/core/opt_base.rb', line 192

def owner
  @owner
end

#regexObject

A optional regex to validate the option value


204
205
206
# File 'lib/msf/core/opt_base.rb', line 204

def regex
  @regex
end

#requiredObject

Whether or not the option is required.


168
169
170
# File 'lib/msf/core/opt_base.rb', line 168

def required
  @required
end

Instance Method Details

#advanced?Boolean

Returns true if this is an advanced option.

Returns:

  • (Boolean)

90
91
92
# File 'lib/msf/core/opt_base.rb', line 90

def advanced?
  advanced
end

#display_value(value) ⇒ Object

Returns a string representing a user-friendly display of the chosen value


148
149
150
# File 'lib/msf/core/opt_base.rb', line 148

def display_value(value)
  value.to_s
end

#empty_required_value?(value) ⇒ Boolean

Returns true if the value supplied is nil and it's required to be a valid value

Returns:

  • (Boolean)

133
134
135
# File 'lib/msf/core/opt_base.rb', line 133

def empty_required_value?(value)
  required? && value.nil?
end

#evasion?Boolean

Returns true if this is an evasion option.

Returns:

  • (Boolean)

97
98
99
# File 'lib/msf/core/opt_base.rb', line 97

def evasion?
  evasion
end

#invalid_value_length?(value) ⇒ Boolean

Returns true if the value supplied is longer then the max allowed length

Returns:

  • (Boolean)

155
156
157
158
159
# File 'lib/msf/core/opt_base.rb', line 155

def invalid_value_length?(value)
  if !value.nil? && !max_length.nil?
    value.length > max_length
  end
end

#normalize(value) ⇒ Object

Normalizes the supplied value to conform with the type that the option is conveying.


141
142
143
# File 'lib/msf/core/opt_base.rb', line 141

def normalize(value)
  value
end

#required?Boolean

Returns true if this is a required option.

Returns:

  • (Boolean)

83
84
85
# File 'lib/msf/core/opt_base.rb', line 83

def required?
  required
end

#type?(in_type) ⇒ Boolean

Returns true if the supplied type is equivalent to this option's type.

Returns:

  • (Boolean)

104
105
106
# File 'lib/msf/core/opt_base.rb', line 104

def type?(in_type)
  type == in_type
end

#valid?(value, check_empty: true) ⇒ Boolean

If it's required and the value is nil or empty, then it's not valid.

Returns:

  • (Boolean)

118
119
120
121
122
123
124
125
126
127
# File 'lib/msf/core/opt_base.rb', line 118

def valid?(value, check_empty: true)
  if check_empty && required?
    # required variable not set
    return false if (value.nil? || value.to_s.empty?)
  end
  if regex
    return !!value.match(regex)
  end
  true
end

#validate_on_assignment?Boolean

Returns true if this option can be validated on assignment

Returns:

  • (Boolean)

111
112
113
# File 'lib/msf/core/opt_base.rb', line 111

def validate_on_assignment?
  true
end