ninoseki/SimpleWhatWeb

View on GitHub
lib/whatweb/plugins/contao.rb

Summary

Maintainability
C
7 hrs
Test Coverage
# frozen_string_literal: true

##
# This file is part of WhatWeb and may be subject to
# redistribution and commercial restrictions. Please see the WhatWeb
# web site for more information on licensing and terms of use.
# http://www.morningstarsecurity.com/research/whatweb
##

# Version 0.1
# Based on the contao plugin

WhatWeb::Plugin.define "Contao" do
  @author = "Eric Sesterhenn"
  @version = "0.1"
  @description = "Contao is an OpenSource CMS written in PHP"
  @website = "www.contao.org"

  @matches = [
    { text: 'This website is powered by Contao Open Source CMS :: Licensed under GNU/LGPL' },
    { text: '<!-- indexer::continue -->' }
  ]

  def aggressive(target)
    m = []

    url = URI.join(target.uri.to_s, "/contao/").to_s
    new_target = WhatWeb::Target.new(url)

    if /<title>[^<]+Contao[^<]+CMS ([^<]+)<\/title>/.match?(new_target.body)
      version = body.scan(/<title>[^<]+Contao[^<]+CMS ([^<]+)<\/title>/)[0][0]
      m << { name: "login page version", version: version }
    end

    # the paths are relative to the url path if they don't start with /
    # this path, with this md5 = this version
    files = [

      { md5: '0469d85ecb18e9a1ede2b0b2d5aa79a9', version: '2.9.0 (2010-07-02)', path: 'CHANGELOG.md' },
      { md5: '24fb115dd0722792961d04b62353954c', version: '2.9.1 (2010-08-09)', path: 'CHANGELOG.md' },
      { md5: '0da80d24450b841298c7ce3cac558e67', version: '2.9.2 (2010-12-02)', path: 'CHANGELOG.md' },
      { md5: 'ef3fde9f072a6aa11b58fa8c84740a4a', version: '2.9.3 (2011-01-06)', path: 'CHANGELOG.md' },
      { md5: 'c793826598074586e98728855620ffd0', version: '2.9.4 (2011-03-08)', path: 'CHANGELOG.md' },
      { md5: '782bb70f82ee7e1a137f20c5e5cce77c', version: '2.9.5 (2011-05-18)', path: 'CHANGELOG.md' },
      { md5: '5aa9e3efbfa5bb1ccb0cc514651d9cdc', version: '2.10.0 (2011-08-11)', path: 'CHANGELOG.md' },
      { md5: 'ad37d582d58f6c247e0913b1f5800476', version: '2.10.1 (2011-08-31)', path: 'CHANGELOG.md' },
      { md5: 'f39cba7429e6ef6d05c42215357dc17a', version: '2.10.2 (2011-10-10)', path: 'CHANGELOG.md' },
      { md5: '008b6f59ae7a0f3cebdfa835ae009b87', version: '2.10.3 (2011-11-07)', path: 'CHANGELOG.md' },
      { md5: 'c95232b9f7744f9cd29fd8da23083b9a', version: '2.10.4 (2011-12-30)', path: 'CHANGELOG.md' },
      { md5: '7e3d69c4f2ecd792435c4afc6770a5ae', version: '2.11.0 (2012-02-15)', path: 'CHANGELOG.md' },
      { md5: '91a4f4c10be6c6dab55b2c51a5e8e381', version: '2.11.2 (XXXX-XX-XX)', path: 'CHANGELOG.md' },
      { md5: '10465b6d6f8dbda6caeeb25e740ff525', version: '2.11.2 (2012-03-14)', path: 'CHANGELOG.md' },
      { md5: '62e2b98bc73e3f895428e2b18d378e83', version: '2.11.3 (2012-05-04)', path: 'CHANGELOG.md' },
      { md5: '8c13ae28a7c70c603521debbb9517133', version: '2.11.4 (2012-06-12)', path: 'CHANGELOG.md' },
      { md5: 'b0689b2c20f3dc8af30030c681ea3a62', version: '2.11.5 (2012-07-25)', path: 'CHANGELOG.md' },
      { md5: '2683898890efc3cea7af0d8d996ade58', version: '2.11.6 (2012-09-26)', path: 'CHANGELOG.md' },
      { md5: '5000fac5d77fe0aacb1871cb12551675', version: '2.11.7 (2012-11-29)', path: 'CHANGELOG.md' },
      { md5: 'd705ac48bd6328771f2956e234d60c87', version: '2.11.8 (2013-01-07)', path: 'CHANGELOG.md' },
      { md5: '190c9e3309125ee3d6ccad71578fd45c', version: '2.11.9 (2013-02-05)', path: 'CHANGELOG.md' },
      { md5: '53a1a84a687662329f5e870563253229', version: '3.0.0/3.0.1', path: 'README.md' },
      { md5: 'c46c1e2bbc8c1a33682de0c0a9f64b87', version: '3.0.2 or later', path: 'README.md' },

    ]

    # Fetch and hash files
    to_download = files.map { |x| x[:path] }.sort.uniq
    downloads = {}
    to_download.each do |d|
      url = URI.join(target.uri.to_s, d).to_s
      new_target = WhatWeb::Target.new(url)
      downloads[d] = { md5sum: new_target.md5sum }
    end

    # Compare file hashes to known hashes
    version = nil
    files.each do |thisfile|
      unless downloads[thisfile[:path]].nil?
        version = thisfile[:version] if downloads[thisfile[:path]][:md5sum] == thisfile[:md5]
      end
    end

    # Set version if present
    m << { name: "md5 sums of files", version: version } if version

    m
  end
end