class Bundler::Audit::CLI

def check

def check
  update if options[:update]
  scanner    = Scanner.new
  vulnerable = false
  scanner.scan(:ignore => options.ignore) do |result|
    vulnerable = true
    case result
    when Scanner::InsecureSource
      print_warning "Insecure Source URI found: #{result.source}"
    when Scanner::UnpatchedGem
      print_advisory result.gem, result.advisory
    end
  end
  if vulnerable
    say "Vulnerabilities found!", :red
    exit 1
  else
    say("No vulnerabilities found", :green) unless options.quiet?
  end
end

def print_advisory(gem, advisory)

def print_advisory(gem, advisory)
  say "Name: ", :red
  say gem.name
  say "Version: ", :red
  say gem.version
  say "Advisory: ", :red
  if advisory.cve
    say "CVE-#{advisory.cve}"
  elsif advisory.osvdb
    say advisory.osvdb
  end
  say "Criticality: ", :red
  case advisory.criticality
  when :low    then say "Low"
  when :medium then say "Medium", :yellow
  when :high   then say "High", [:red, :bold]
  else              say "Unknown"
  end
  say "URL: ", :red
  say advisory.url
  if options.verbose?
    say "Description:", :red
    say
    print_wrapped advisory.description, :indent => 2
    say
  else
    say "Title: ", :red
    say advisory.title
  end
  unless advisory.patched_versions.empty?
    say "Solution: upgrade to ", :red
    say advisory.patched_versions.join(', ')
  else
    say "Solution: ", :red
    say "remove or disable this gem until a patch is available!", [:red, :bold]
  end
  say
end

def print_warning(message)

def print_warning(message)
  say message, :yellow
end

def say(message="", color=nil)

def say(message="", color=nil)
  color = nil unless $stdout.tty?
  super(message.to_s, color)
end

def update

def update
  say("Updating ruby-advisory-db ...") unless options.quiet?
  case Database.update!(quiet: options.quiet?)
  when true
    say("Updated ruby-advisory-db", :green) unless options.quiet?
  when false
    say "Failed updating ruby-advisory-db!", :red
    exit 1
  when nil
    say "Skipping update", :yellow
  end
  unless options.quiet?
    puts("ruby-advisory-db: #{Database.new.size} advisories")
  end
end

def version

def version
  database = Database.new
  puts "#{File.basename($0)} #{VERSION} (advisories: #{database.size})"
end