Class: W4bFile::CLI

Inherits:
Object
  • Object
show all
Defined in:
lib/w4b-file/cli.rb,
lib/w4b_file/cli.rb

Class Method Summary collapse

Class Method Details

.check_all_files(url) ⇒ Object



72
73
74
75
76
# File 'lib/w4b_file/cli.rb', line 72

def self.check_all_files(url)
  resources = scan_website(url)
  display_files(resources, "All", url) if !resources.empty?
  resources
end

.check_files(type, url) ⇒ Object



71
72
73
74
75
# File 'lib/w4b-file/cli.rb', line 71

def self.check_files(type, scanner, url)
  resources = scanner.scan_website
  files = resources.grep(/\.(#{type})$/i)
  files
end

.display_files(files, type, base_url) ⇒ Object



77
78
79
80
81
82
83
84
85
86
# File 'lib/w4b-file/cli.rb', line 77

def self.display_files(files, type, base_url)
  return if files.empty?

  puts "[+] #{type} files :"
  files.each do |file|
    display_url = URI.join(base_url, file).to_s
    puts "    Link : #{display_url}"
  end
  puts
end

.run_checks(check_type, website_url) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/w4b-file/cli.rb', line 48

def self.run_checks(check_type, scanner, website_url)
  case check_type
  when "videos"
    files_found = check_files("mp4|avi", scanner, website_url)
    display_files(files_found, "Video", website_url) if !files_found.empty?
  when "images"
    files_found = check_files("jpg|jpeg|png", scanner, website_url)
    display_files(files_found, "Image", website_url) if !files_found.empty?
  when "zip"
    files_found = check_files("zip", scanner, website_url)
    display_files(files_found, "ZIP", website_url) if !files_found.empty?
  when "pdf"
    files_found = check_files("pdf", scanner, website_url)
    display_files(files_found, "PDF", website_url) if !files_found.empty?
  when "document"
    files_found = check_files("doc|docx|txt", scanner, website_url)
    display_files(files_found, "Document", website_url) if !files_found.empty?
  else
    puts "Invalid check type. Available options: videos, images, zip, pdf, document, --check hidden"
    exit 1
  end
end

.scan_hidden_files(url) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/w4b_file/cli.rb', line 45

def self.scan_hidden_files(url)
  uri = URI.parse(url)
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = (uri.scheme == 'https')
  http.verify_mode = OpenSSL::SSL::VERIFY_PEER

  request = Net::HTTP::Get.new(uri)
  request['User-Agent'] = 'Googlebot'
  response = http.request(request)

  hidden_files = []
  if response.is_a?(Net::HTTPSuccess)
    response.body.scan(/href="([^"#]*)"/).flatten.compact.each do |file|
      hidden_files << file if file.start_with?(".") || file.include?("/.")
    end
  end

  hidden_files
end

.scan_website(url) ⇒ Object



25
26
27
28
29
30
31
32
# File 'lib/w4b_file/cli.rb', line 25

def self.scan_website(url)
  uri = URI.parse(url)
  response = Net::HTTP.get_response(uri)

  return [] unless response.is_a?(Net::HTTPSuccess)

  response.body.scan(/href="([^"#]*)"|\ssrc="([^"#]*)"/).flatten.compact
end

.start(argv) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/w4b-file/cli.rb', line 6

def self.start
  options = {}
  OptionParser.new do |opts|
    opts.banner = "Usage: w4b-file <website_url> [--check <file_type>]"

    opts.on("--check TYPE", "Specify the type of files to check") do |type|
      options[:check_type] = type
    end

    opts.on("--check all", "Check and display all files on the website") do
      options[:check_all] = true
    end

    opts.on("--check hidden", "Scan for hidden files on the website") do
      options[:check_hidden] = true
    end
  end.parse!

  website_url = ARGV[0]
  check_type = options[:check_type]

  if website_url.nil?
    puts "Usage: w4b-file <website_url> [--check <file_type>]"
    exit 1
  end

  scanner = Scanner.new(website_url)

  if options[:check_hidden]
    hidden_files = scanner.scan_hidden_files
    display_files(hidden_files, "Hidden", website_url) unless hidden_files.empty?
  elsif options[:check_all]
    resources = scanner.scan_website
    display_files(resources, "All", website_url) unless resources.empty?
  elsif check_type
    run_checks(check_type, scanner, website_url)
  else
    puts "Invalid option. Please specify a valid option."
    exit 1
  end
end

.validate_and_sanitize_url(url) ⇒ Object



18
19
20
21
22
23
# File 'lib/w4b_file/cli.rb', line 18

def self.validate_and_sanitize_url(url)
  uri = URI.parse(url)
  return nil unless uri.scheme == 'http' || uri.scheme == 'https'

  uri.to_s
end