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.



27
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
# File 'lib/msf/core/opt_base.rb', line 27

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.



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

def advanced
  @advanced
end

#aliasesObject

Aliases for this option for backward compatibility



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

def aliases
  @aliases
end

#conditionsObject

The list of potential conditions



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

def conditions
  @conditions
end

#defaultObject

The default value of the option.



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

def default
  @default
end

#descObject

The description of the option.



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

def desc
  @desc
end

#enumsObject

The list of potential valid values



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

def enums
  @enums
end

#evasionObject

Whether or not this is an evasion option.



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

def evasion
  @evasion
end

#max_lengthObject

The max length of the input value



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

def max_length
  @max_length
end

#nameObject

The name of the option.



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

def name
  @name
end

#ownerObject

The module or entity that owns this option.



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

def owner
  @owner
end

#regexObject

A optional regex to validate the option value



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

def regex
  @regex
end

#requiredObject

Whether or not the option is required.



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

def required
  @required
end

Instance Method Details

#advanced?Boolean

Returns true if this is an advanced option.

Returns:

  • (Boolean)


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

def advanced?
  advanced
end

#display_value(value) ⇒ Object

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



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

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)


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

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

#evasion?Boolean

Returns true if this is an evasion option.

Returns:

  • (Boolean)


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

def evasion?
  evasion
end

#invalid_value_length?(value) ⇒ Boolean

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

Returns:

  • (Boolean)


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

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.



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

def normalize(value)
  value
end

#required?Boolean

Returns true if this is a required option.

Returns:

  • (Boolean)


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

def required?
  required
end

#type?(in_type) ⇒ Boolean

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

Returns:

  • (Boolean)


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

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)


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

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 && !value.nil?
    return !!value.match(regex)
  end
  true
end

#validate_on_assignment?Boolean

Returns true if this option can be validated on assignment

Returns:

  • (Boolean)


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

def validate_on_assignment?
  true
end