class Pedant::CheckScriptId

Public Class Methods

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

Public Instance Methods

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

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

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

  if si_nodes.length == 0
    report(:error, "Plugin does not call script_id() in the description.")
    return fail
  elsif si_nodes.length > 1
    report(:error, "Plugin specifies multiple script IDs:")
    si_nodes.each { |call| report(:error, call.context()) }
    return fail
  end

  si_node = si_nodes.first

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

  if si_node.args.length > 1
    report(:error, "script_id() was called with too many arguments:\n#{si_node.context()}")
    return fail
  end
    
  # Pull out argument
  type = si_node.args.first.type
  arg = si_node.args.first.expr

  if type != :anonymous
    report(
      :error,
      "script_id() was called using a named parameter.  It requires using one positional parameter.\n" +
      arg.context(si_node)
    )
    return fail
  end
   
  unless arg.is_a? Nasl::Integer
    report(
      :error,
      "script_id() was called with the wrong type of argument.\n" +
      "An integer literal between 10001 and 999999 inclusive is required:\n" +
      arg.context(si_node)
    )
    return fail
  end

  # Ensure that the script id is valid.
  if arg.value < 10001 or arg.value > 999999
    report(
      :error,
      "script_id() was called with an invalid argument.\n" +
      "An integer literal between 10001 and 999999 inclusive is required:\n" +
      arg.context(si_node)
    )
    return fail
  end

  # Ensure that the script id is valid.
  if arg.value >= 900001 and arg.value <= 999999
    report(
      :warn,
      "Uses a script id reserved for custom plugins / plugins in development.\n" +
      arg.context(si_node)
    )
    return warn
  end

  report(:info, "Plugin has script id #{arg.value}:\n#{arg.context(si_node)}")
  pass
end