=begin
                  Arachni
  Copyright (c) 2010-2012 Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>

  This is free software; you can copy and distribute and modify
  this program under the term of the GPL v2.0 License
  (See LICENSE file for details)

=end

module Arachni
module Plugins

#
# Generates a simple list of safe/unsafe URLs.
#
# @author: Tasos "Zapotek" Laskos
#                                      <tasos.laskos@gmail.com>
#                                      <zapotek@segfault.gr>
# @version: 0.1.1
#
class HealthMap < Arachni::Plugin::Base

    include Arachni::Module::Utilities

    def prepare
        wait_while_framework_running
        @audit_store = @framework.audit_store( true )
    end

    def run
        sitemap  = @audit_store.sitemap.map{ |url| normalize( url ) }.uniq
        sitemap |= issue_urls = @audit_store.issues.map { |issue| issue.url }.uniq

        return if sitemap.size == 0

        issue = 0
        map = []
        sitemap.each {
            |url|

            next if !url

            if issue_urls.include?( url )
                map << { :unsafe => url }
                issue += 1
            else
                map << { :safe  => url }
            end
        }

        register_results( {
            :map    => map,
            :total  => map.size,
            :safe   => map.size - issue,
            :unsafe => issue,
            :issue_percentage => ( ( Float( issue ) / map.size ) * 100 ).round
        } )

    end

    def normalize( url )
        query = URI( normalize_url( url ) ).query
        return url if !query

        url.gsub( '?' + query, '' )
    end

    def self.distributable?
        true
    end

    def self.merge( results )
        merged = {
            :map    => [],
            :total  => 0,
            :safe   => 0,
            :unsafe => 0,
            :issue_percentage => 0
        }

        results.each {
            |healthmap|
            merged[:map]    |= healthmap[:map]
            merged[:total]  += healthmap[:total]
            merged[:safe]   += healthmap[:safe]
            merged[:unsafe] += healthmap[:unsafe]
        }
        merged[:issue_percentage] = ( ( Float( merged[:unsafe] ) / merged[:total] ) * 100 ).round
        return merged
    end


    def self.info
        {
            :name           => 'Health map',
            :description    => %q{Generates a simple list of safe/unsafe URLs.},
            :author         => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>',
            :version        => '0.1.1',
        }
    end

end

end
end