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