class Pedant::CheckScriptCategory

Public Class Methods

requires() click to toggle source
Calls superclass method Pedant::Check::requires
# File lib/pedant/checks/script_category.rb, line 29
def self.requires
  super + [:main, :trees]
end

Public Instance Methods

run() click to toggle source
# File lib/pedant/checks/script_category.rb, line 33
def run
  # This check only applies to plugins.
  return skip unless @kb[:main].extname == '.nasl'

  sc_nodes = []
  tree = @kb[:trees][@kb[:main]]

  tree.all(:Call).each do |node|
    next unless node.name.ident.name == 'script_category'
    next unless node.name.indexes == []
    sc_nodes << node
  end

  if sc_nodes.length == 0
    report(:error, "Plugin does not specify a script_category.")
    return fail
  elsif sc_nodes.length > 1
    report(:error, "Plugin specifies multiple script categories:")
    sc_nodes.each { |call| report(:error, call.context()) }
    return fail
  end

  sc_node = sc_nodes.first

  if sc_node.args.empty?
    report(:error, "script_category() was called with no arguments:\n#{sc_node.context()}")
    return fail
  end

  if sc_node.args.length > 1
    report(:error, "script_category() was called with too many arguments:\n#{sc_node.context()}")
    return fail
  end
    
  # Pull out argument
  arg = sc_node.args.first.expr
   
  unless sc_node.args.first.expr.is_a? Nasl::Lvalue
    report(
      :error,
      "script_category() was called with the wrong type of argument.\n" +
      "A variable (not a string literal) starting with ACT_ must be provided:\n" +
      arg.context(sc_node)
    )
    return fail
  end

  # Ensure that the script category is valid.
  unless [
    "ACT_INIT",
    "ACT_SCANNER",
    "ACT_SETTINGS",
    "ACT_GATHER_INFO",
    "ACT_ATTACK",
    "ACT_MIXED",
    "ACT_MIXED_ATTACK",
    "ACT_DESTRUCTIVE_ATTACK",
    "ACT_COMPLIANCE_CHECK",
    "ACT_PATCH_SETUP",
    "ACT_PATCH_APPLY",
    "ACT_PATCH_POST_APPLY",
    "ACT_THIRD_PARTY_INFO",
    "ACT_DENIAL",
    "ACT_KILL_HOST",
    "ACT_FLOOD",
    "ACT_END"
  ].include? arg.ident.name
    report(
      :error,
      "Plugin belongs to unknown category #{arg.ident.name}:\n" +
      arg.context(sc_node)
    )
    return fail
  end

  report(:info, "Plugin belongs to script category #{arg.ident.name}:\n#{arg.context(sc_node)}")
  pass
end