dap 1.0.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Dockerfile.testing +14 -6
- data/Gemfile +2 -1
- data/Gemfile.lock +7 -5
- data/lib/dap/filter.rb +1 -0
- data/lib/dap/filter/geoip.rb +44 -16
- data/lib/dap/filter/geoip2.rb +286 -0
- data/lib/dap/utils/misc.rb +22 -0
- data/lib/dap/version.rb +1 -1
- data/spec/dap/utils/misc_spec.rb +12 -0
- data/test/filters.bats +67 -3
- data/test/test_data/geoip/GeoIPASNum.dat +0 -0
- data/test/test_data/geoip/GeoIPCity.dat +0 -0
- data/test/test_data/geoip/GeoIPOrg.dat +0 -0
- data/test/test_data/geoip2/GeoIP2-City-Test.mmdb +0 -0
- data/test/test_data/geoip2/GeoIP2-ISP-Test.mmdb +0 -0
- data/test/test_data/geoip2/GeoLite2-ASN-Test.mmdb +0 -0
- metadata +18 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: '0467108dd6edf2120b8de36390c3a338aadbfaf8'
         | 
| 4 | 
            +
              data.tar.gz: 0a3a5c8f96087bd1c09af9534867e5b7f619d2b0
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 622ed2ba3f267ab350d7323f8fb70e44a196d4800fe85fd6e7d2e64add8abdee448d83cd6c2d1577f873c55cdb6dd32d256c09f2e40154b1e14fff66506e08e1
         | 
| 7 | 
            +
              data.tar.gz: bf214ba2c71977e1f0d26d7dc35193ccf28fc9d0239fb900be3c539ddc6ee742046ddc92c556d7986a704a2c73613611aef1fe7da9cc399f95b2fe98364acdad
         | 
    
        data/Dockerfile.testing
    CHANGED
    
    | @@ -14,13 +14,21 @@ RUN /bin/bash -l -c "rvm use 2.4.5 && gem update --system && gem install bundler | |
| 14 14 | 
             
            ADD Gemfile* $TEST_DIR/
         | 
| 15 15 | 
             
            RUN /bin/bash -l -c "cd $TEST_DIR && rvm use 2.4.5 && bundle install"
         | 
| 16 16 |  | 
| 17 | 
            -
            # install maxmind data
         | 
| 17 | 
            +
            # install maxmind legacy data
         | 
| 18 18 | 
             
            RUN mkdir /var/lib/geoip
         | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 19 | 
            +
            COPY test/test_data/geoip/*.dat /var/lib/geoip/
         | 
| 20 | 
            +
            # Note that these test files were copied from
         | 
| 21 | 
            +
            # https://github.com/maxmind/geoip-api-php/raw/master/tests/data/GeoIPCity.dat
         | 
| 22 | 
            +
            # https://github.com/maxmind/geoip-api-php/raw/master/tests/data/GeoIPASNum.dat
         | 
| 23 | 
            +
            # https://github.com/maxmind/geoip-api-php/raw/master/tests/data/GeoIPOrg.dat
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            # install maxmind geoip2 data
         | 
| 26 | 
            +
            RUN mkdir /var/lib/geoip2
         | 
| 27 | 
            +
            COPY test/test_data/geoip2/*.mmdb /var/lib/geoip2/
         | 
| 28 | 
            +
            # Note that these test files were copied from
         | 
| 29 | 
            +
            # https://github.com/maxmind/MaxMind-DB/raw/f6ed981c23b0eb33d7c07568e2177236252afda6/test-data/GeoLite2-ASN-Test.mmdb
         | 
| 30 | 
            +
            # https://github.com/maxmind/MaxMind-DB/raw/f6ed981c23b0eb33d7c07568e2177236252afda6/test-data/GeoIP2-City-Test.mmdb
         | 
| 31 | 
            +
            # https://github.com/maxmind/MaxMind-DB/blob/f6ed981c23b0eb33d7c07568e2177236252afda6/test-data/GeoIP2-ISP-Test.mmdb
         | 
| 24 32 |  | 
| 25 33 | 
             
            # install bats
         | 
| 26 34 | 
             
            RUN git clone https://github.com/sstephenson/bats.git && cd bats && ./install.sh /usr
         | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -21,14 +21,15 @@ GEM | |
| 21 21 | 
             
                gherkin (2.12.2)
         | 
| 22 22 | 
             
                  multi_json (~> 1.3)
         | 
| 23 23 | 
             
                htmlentities (4.3.4)
         | 
| 24 | 
            -
                 | 
| 24 | 
            +
                maxmind-db (1.0.0)
         | 
| 25 | 
            +
                mini_portile2 (2.4.0)
         | 
| 25 26 | 
             
                multi_json (1.11.2)
         | 
| 26 27 | 
             
                multi_test (0.1.2)
         | 
| 27 28 | 
             
                net-dns (0.9.0)
         | 
| 28 | 
            -
                nokogiri (1. | 
| 29 | 
            -
                  mini_portile2 (~> 2. | 
| 29 | 
            +
                nokogiri (1.10.3)
         | 
| 30 | 
            +
                  mini_portile2 (~> 2.4.0)
         | 
| 30 31 | 
             
                oj (3.7.9)
         | 
| 31 | 
            -
                recog (2. | 
| 32 | 
            +
                recog (2.3.0)
         | 
| 32 33 | 
             
                  nokogiri
         | 
| 33 34 | 
             
                rspec (3.1.0)
         | 
| 34 35 | 
             
                  rspec-core (~> 3.1.0)
         | 
| @@ -52,9 +53,10 @@ DEPENDENCIES | |
| 52 53 | 
             
              cucumber (~> 1.3.16)
         | 
| 53 54 | 
             
              geoip-c
         | 
| 54 55 | 
             
              htmlentities
         | 
| 56 | 
            +
              maxmind-db (~> 1.0.0)
         | 
| 55 57 | 
             
              net-dns
         | 
| 56 58 | 
             
              oj
         | 
| 57 | 
            -
              recog (>= 2. | 
| 59 | 
            +
              recog (>= 2.3.0)
         | 
| 58 60 | 
             
              rspec (~> 3.1.0)
         | 
| 59 61 |  | 
| 60 62 | 
             
            BUNDLED WITH
         | 
    
        data/lib/dap/filter.rb
    CHANGED
    
    
    
        data/lib/dap/filter/geoip.rb
    CHANGED
    
    | @@ -16,26 +16,54 @@ module GeoIPLibrary | |
| 16 16 | 
             
              @@geo_orgs = nil
         | 
| 17 17 | 
             
              @@geo_asn = nil
         | 
| 18 18 |  | 
| 19 | 
            -
               | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 19 | 
            +
              GEOIP_CITY_DATABASE_PATH = ENV["GEOIP_CITY_DATABASE_PATH"]
         | 
| 20 | 
            +
              GEOIP_ASN_DATABASE_PATH = ENV["GEOIP_ASN_DATABASE_PATH"]
         | 
| 21 | 
            +
              GEOIP_ORG_DATABASE_PATH = ENV["GEOIP_ORG_DATABASE_PATH"]
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              if GEOIP_CITY_DATABASE_PATH
         | 
| 24 | 
            +
                if ::File.exist?(GEOIP_CITY_DATABASE_PATH)
         | 
| 25 | 
            +
                  @@geo_city = GeoIP::City.new(GEOIP_CITY_DATABASE_PATH)
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
              else
         | 
| 28 | 
            +
                GEOIP_DIRS.each do |d|
         | 
| 29 | 
            +
                  GEOIP_CITY.each do |f|
         | 
| 30 | 
            +
                    path = File.join(d, f)
         | 
| 31 | 
            +
                    if ::File.exist?(path)
         | 
| 32 | 
            +
                      @@geo_city = GeoIP::City.new(path)
         | 
| 33 | 
            +
                      break
         | 
| 34 | 
            +
                    end
         | 
| 25 35 | 
             
                  end
         | 
| 26 36 | 
             
                end
         | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              if GEOIP_ORG_DATABASE_PATH
         | 
| 40 | 
            +
                if ::File.exist?(GEOIP_ORG_DATABASE_PATH)
         | 
| 41 | 
            +
                  @@geo_orgs = GeoIP::Organization.new(GEOIP_ORG_DATABASE_PATH)
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
              else
         | 
| 44 | 
            +
                GEOIP_DIRS.each do |d|
         | 
| 45 | 
            +
                  GEOIP_ORGS.each do |f|
         | 
| 46 | 
            +
                    path = File.join(d, f)
         | 
| 47 | 
            +
                    if ::File.exist?( path )
         | 
| 48 | 
            +
                      @@geo_orgs = GeoIP::Organization.new(path)
         | 
| 49 | 
            +
                      break
         | 
| 50 | 
            +
                    end
         | 
| 32 51 | 
             
                  end
         | 
| 33 52 | 
             
                end
         | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 53 | 
            +
              end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
              if GEOIP_ASN_DATABASE_PATH
         | 
| 56 | 
            +
                if ::File.exist?(GEOIP_ASN_DATABASE_PATH)
         | 
| 57 | 
            +
                  @@geo_asn = GeoIP::Organization.new(GEOIP_ASN_DATABASE_PATH)
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
              else
         | 
| 60 | 
            +
                GEOIP_DIRS.each do |d|
         | 
| 61 | 
            +
                  GEOIP_ASN.each do |f|
         | 
| 62 | 
            +
                    path = File.join(d, f)
         | 
| 63 | 
            +
                    if ::File.exist?(path)
         | 
| 64 | 
            +
                      @@geo_asn = GeoIP::Organization.new(path)
         | 
| 65 | 
            +
                      break
         | 
| 66 | 
            +
                    end
         | 
| 39 67 | 
             
                  end
         | 
| 40 68 | 
             
                end
         | 
| 41 69 | 
             
              end
         | 
| @@ -0,0 +1,286 @@ | |
| 1 | 
            +
            require 'maxmind/db'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Dap
         | 
| 4 | 
            +
            module Filter
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            require 'dap/utils/misc'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            module GeoIP2Library
         | 
| 9 | 
            +
              GEOIP2_DIRS = [
         | 
| 10 | 
            +
                File.expand_path( File.join( File.dirname(__FILE__), "..", "..", "..", "data")),
         | 
| 11 | 
            +
                "/var/lib/geoip",
         | 
| 12 | 
            +
                "/var/lib/geoip2"
         | 
| 13 | 
            +
              ]
         | 
| 14 | 
            +
              GEOIP2_CITY = %W{ GeoLite2-City.mmdb }
         | 
| 15 | 
            +
              GEOIP2_ASN = %W{ GeoLite2-ASN.mmdb }
         | 
| 16 | 
            +
              GEOIP2_ISP = %W{ GeoIP2-ISP.mmdb }
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              def self.find_db(db_file_names, db_dirs, env_path)
         | 
| 19 | 
            +
                if env_path
         | 
| 20 | 
            +
                  if ::File.exist?(env_path)
         | 
| 21 | 
            +
                    return MaxMind::DB.new(env_path, mode: MaxMind::DB::MODE_MEMORY)
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
                else
         | 
| 24 | 
            +
                  db_dirs.each do |d|
         | 
| 25 | 
            +
                    db_file_names.each do |f|
         | 
| 26 | 
            +
                      path = File.join(d, f)
         | 
| 27 | 
            +
                      if ::File.exist?(path)
         | 
| 28 | 
            +
                        return MaxMind::DB.new(path, mode: MaxMind::DB::MODE_MEMORY)
         | 
| 29 | 
            +
                      end
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
                nil
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              @@geo_asn = find_db(GEOIP2_ASN, GEOIP2_DIRS, ENV["GEOIP2_ASN_DATABASE_PATH"])
         | 
| 37 | 
            +
              @@geo_city = find_db(GEOIP2_CITY, GEOIP2_DIRS, ENV["GEOIP2_CITY_DATABASE_PATH"])
         | 
| 38 | 
            +
              @@geo_isp = find_db(GEOIP2_ISP, GEOIP2_DIRS, ENV["GEOIP2_ISP_DATABASE_PATH"])
         | 
| 39 | 
            +
            end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
             | 
| 42 | 
            +
            #
         | 
| 43 | 
            +
            # Add GeoIP2 tags using the MaxMind GeoIP2::City
         | 
| 44 | 
            +
            #
         | 
| 45 | 
            +
            class FilterGeoIP2City
         | 
| 46 | 
            +
              include BaseDecoder
         | 
| 47 | 
            +
              include GeoIP2Library
         | 
| 48 | 
            +
             | 
| 49 | 
            +
              GEOIP2_LANGUAGE = ENV["GEOIP2_LANGUAGE"] || "en"
         | 
| 50 | 
            +
              LOCALE_SPECIFIC_NAMES = %w(city.names continent.names country.names registered_country.names represented_country.names)
         | 
| 51 | 
            +
              DESIRED_GEOIP2_KEYS = %w(
         | 
| 52 | 
            +
                city.geoname_id
         | 
| 53 | 
            +
                continent.code continent.geoname_id
         | 
| 54 | 
            +
                country.geoname_id country.iso_code country.is_in_european_union
         | 
| 55 | 
            +
                location.accuracy_radius location.latitude location.longitude location.metro_code location.time_zone
         | 
| 56 | 
            +
                postal.code
         | 
| 57 | 
            +
                registered_country.geoname_id registered_country.iso_code registered_country.is_in_european_union
         | 
| 58 | 
            +
                represented_country.geoname_id represented_country.iso_code represented_country.is_in_european_union represented_country.type
         | 
| 59 | 
            +
                traits.is_anonymous_proxy traits.is_satellite_provider
         | 
| 60 | 
            +
              )
         | 
| 61 | 
            +
             | 
| 62 | 
            +
              attr_reader :locale_specific_names
         | 
| 63 | 
            +
              def initialize(args={})
         | 
| 64 | 
            +
                @locale_specific_names = LOCALE_SPECIFIC_NAMES.map { |lsn| "#{lsn}.#{GEOIP2_LANGUAGE}" }
         | 
| 65 | 
            +
                super
         | 
| 66 | 
            +
              end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
              def decode(ip)
         | 
| 69 | 
            +
                unless @@geo_city
         | 
| 70 | 
            +
                  raise "No MaxMind GeoIP2::City data found"
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
                return unless (geo_hash = @@geo_city.get(ip))
         | 
| 73 | 
            +
                ret = defaults
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                if geo_hash.include?("subdivisions")
         | 
| 76 | 
            +
                  # handle countries that are divided into various subdivisions.  generally 1, sometimes 2
         | 
| 77 | 
            +
                  subdivisions = geo_hash["subdivisions"]
         | 
| 78 | 
            +
                  geo_hash.delete("subdivisions")
         | 
| 79 | 
            +
                  ret["geoip2.city.subdivisions.length"] = subdivisions.size.to_s
         | 
| 80 | 
            +
                  subdivisions.each_index do |i|
         | 
| 81 | 
            +
                    subdivision = subdivisions[i]
         | 
| 82 | 
            +
                    subdivision.each_pair do |k,v|
         | 
| 83 | 
            +
                      if %w(geoname_id iso_code).include?(k)
         | 
| 84 | 
            +
                        ret["geoip2.city.subdivisions.#{i}.#{k}"] = v.to_s
         | 
| 85 | 
            +
                      elsif k == "names"
         | 
| 86 | 
            +
                        if v.include?(GEOIP2_LANGUAGE)
         | 
| 87 | 
            +
                          ret["geoip2.city.subdivisions.#{i}.name"] = subdivision["names"][GEOIP2_LANGUAGE]
         | 
| 88 | 
            +
                        end
         | 
| 89 | 
            +
                      end
         | 
| 90 | 
            +
                    end
         | 
| 91 | 
            +
                  end
         | 
| 92 | 
            +
                end
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                Dap::Utils::Misc.flatten_hash(geo_hash).each_pair do |k,v|
         | 
| 95 | 
            +
                  if DESIRED_GEOIP2_KEYS.include?(k)
         | 
| 96 | 
            +
                    # these keys we can just copy directly over
         | 
| 97 | 
            +
                    ret["geoip2.city.#{k}"] = v
         | 
| 98 | 
            +
                  elsif @locale_specific_names.include?(k)
         | 
| 99 | 
            +
                    # these keys we need to pick the locale-specific name and set the key accordingly
         | 
| 100 | 
            +
                    lsn_renamed = k.gsub(/\.names.#{GEOIP2_LANGUAGE}/, ".name")
         | 
| 101 | 
            +
                    ret["geoip2.city.#{lsn_renamed}"] = v
         | 
| 102 | 
            +
                  end
         | 
| 103 | 
            +
                end
         | 
| 104 | 
            +
                ret
         | 
| 105 | 
            +
              end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
              def defaults()
         | 
| 108 | 
            +
                ret = {}
         | 
| 109 | 
            +
                default_int_suffixes = %w(geoname_id metro_code)
         | 
| 110 | 
            +
                default_bool_suffixes = %w(is_in_european_union is_anonymous_proxy is_satellite_provider)
         | 
| 111 | 
            +
                DESIRED_GEOIP2_KEYS.each do |k|
         | 
| 112 | 
            +
                  suffix = k.split(/\./)[-1]
         | 
| 113 | 
            +
                  if default_int_suffixes.include?(suffix)
         | 
| 114 | 
            +
                    ret["geoip2.city.#{k}"] = "0"
         | 
| 115 | 
            +
                  elsif default_bool_suffixes.include?(suffix)
         | 
| 116 | 
            +
                    ret["geoip2.city.#{k}"] = "false"
         | 
| 117 | 
            +
                  else
         | 
| 118 | 
            +
                    ret["geoip2.city.#{k}"] = ""
         | 
| 119 | 
            +
                  end
         | 
| 120 | 
            +
                end
         | 
| 121 | 
            +
                ret
         | 
| 122 | 
            +
              end
         | 
| 123 | 
            +
            end
         | 
| 124 | 
            +
             | 
| 125 | 
            +
            #
         | 
| 126 | 
            +
            # Add GeoIP2 ASN and Org tags using the MaxMind GeoIP2::ASN database
         | 
| 127 | 
            +
            #
         | 
| 128 | 
            +
            class FilterGeoIP2Asn
         | 
| 129 | 
            +
              include BaseDecoder
         | 
| 130 | 
            +
              include GeoIP2Library
         | 
| 131 | 
            +
             | 
| 132 | 
            +
              def decode(ip)
         | 
| 133 | 
            +
                unless @@geo_asn
         | 
| 134 | 
            +
                  raise "No MaxMind GeoIP2::ASN data found"
         | 
| 135 | 
            +
                end
         | 
| 136 | 
            +
                geo_hash = @@geo_asn.get(ip)
         | 
| 137 | 
            +
                return unless geo_hash
         | 
| 138 | 
            +
             | 
| 139 | 
            +
                ret = {}
         | 
| 140 | 
            +
             | 
| 141 | 
            +
                if geo_hash.include?("autonomous_system_number")
         | 
| 142 | 
            +
                  ret["geoip2.asn.asn"] = "AS#{geo_hash["autonomous_system_number"]}"
         | 
| 143 | 
            +
                else
         | 
| 144 | 
            +
                  ret["geoip2.asn.asn"] = ""
         | 
| 145 | 
            +
                end
         | 
| 146 | 
            +
             | 
| 147 | 
            +
                if geo_hash.include?("autonomous_system_organization")
         | 
| 148 | 
            +
                  ret["geoip2.asn.asn_org"] = "#{geo_hash["autonomous_system_organization"]}"
         | 
| 149 | 
            +
                else
         | 
| 150 | 
            +
                  ret["geoip2.asn.asn_org"] = ""
         | 
| 151 | 
            +
                end
         | 
| 152 | 
            +
             | 
| 153 | 
            +
                ret
         | 
| 154 | 
            +
              end
         | 
| 155 | 
            +
            end
         | 
| 156 | 
            +
             | 
| 157 | 
            +
            #
         | 
| 158 | 
            +
            # Add GeoIP2 ISP tags using the MaxMind GeoIP2::ISP database
         | 
| 159 | 
            +
            #
         | 
| 160 | 
            +
            class FilterGeoIP2Isp
         | 
| 161 | 
            +
              include BaseDecoder
         | 
| 162 | 
            +
              include GeoIP2Library
         | 
| 163 | 
            +
              def decode(ip)
         | 
| 164 | 
            +
                unless @@geo_isp
         | 
| 165 | 
            +
                  raise "No MaxMind GeoIP2::ISP data found"
         | 
| 166 | 
            +
                end
         | 
| 167 | 
            +
                geo_hash = @@geo_isp.get(ip)
         | 
| 168 | 
            +
                return unless geo_hash
         | 
| 169 | 
            +
             | 
| 170 | 
            +
                ret = {}
         | 
| 171 | 
            +
             | 
| 172 | 
            +
                if geo_hash.include?("autonomous_system_number")
         | 
| 173 | 
            +
                  ret["geoip2.isp.asn"] = "AS#{geo_hash["autonomous_system_number"]}"
         | 
| 174 | 
            +
                else
         | 
| 175 | 
            +
                  ret["geoip2.isp.asn"] = ""
         | 
| 176 | 
            +
                end
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                if geo_hash.include?("autonomous_system_organization")
         | 
| 179 | 
            +
                  ret["geoip2.isp.asn_org"] = geo_hash["autonomous_system_organization"]
         | 
| 180 | 
            +
                else
         | 
| 181 | 
            +
                  ret["geoip2.isp.asn_org"] = ""
         | 
| 182 | 
            +
                end
         | 
| 183 | 
            +
             | 
| 184 | 
            +
                if geo_hash.include?("isp")
         | 
| 185 | 
            +
                  ret["geoip2.isp.isp"] = geo_hash["isp"]
         | 
| 186 | 
            +
                else
         | 
| 187 | 
            +
                  ret["geoip2.isp.isp"] = ""
         | 
| 188 | 
            +
                end
         | 
| 189 | 
            +
             | 
| 190 | 
            +
                if geo_hash.include?("organization")
         | 
| 191 | 
            +
                  ret["geoip2.isp.org"] = geo_hash["organization"]
         | 
| 192 | 
            +
                else
         | 
| 193 | 
            +
                  ret["geoip2.isp.org"] = ""
         | 
| 194 | 
            +
                end
         | 
| 195 | 
            +
             | 
| 196 | 
            +
                ret
         | 
| 197 | 
            +
              end
         | 
| 198 | 
            +
            end
         | 
| 199 | 
            +
             | 
| 200 | 
            +
            #
         | 
| 201 | 
            +
            # Convert GeoIP2 data as closely as possible to the legacy GeoIP data as generated by geo_ip, geo_ip_asn and geo_ip_org
         | 
| 202 | 
            +
            #
         | 
| 203 | 
            +
            class FilterGeoIP2LegacyCompat
         | 
| 204 | 
            +
              include Base
         | 
| 205 | 
            +
             | 
| 206 | 
            +
              attr_accessor :base_field
         | 
| 207 | 
            +
             | 
| 208 | 
            +
              def initialize(args)
         | 
| 209 | 
            +
                super
         | 
| 210 | 
            +
                fail "Expected 1 arguments to '#{self.name}' but got #{args.size}" unless args.size == 1
         | 
| 211 | 
            +
                self.base_field = args.first
         | 
| 212 | 
            +
              end
         | 
| 213 | 
            +
             | 
| 214 | 
            +
              def process(doc)
         | 
| 215 | 
            +
                # all of these values we just take directly and rename
         | 
| 216 | 
            +
                remap = {
         | 
| 217 | 
            +
                  # geoip2 name -> geoip name
         | 
| 218 | 
            +
                  "city.country.iso_code": "country_code",
         | 
| 219 | 
            +
                  "city.country.name": "country.name",
         | 
| 220 | 
            +
                  "city.postal.code": "postal_code",
         | 
| 221 | 
            +
                  "city.location.latitude": "latitude",
         | 
| 222 | 
            +
                  "city.location.longitude": "longitude",
         | 
| 223 | 
            +
                  "city.city.name": "city",
         | 
| 224 | 
            +
                  "city.subdivisions.0.iso_code": "region",
         | 
| 225 | 
            +
                  "city.subdivisions.0.name": "region_name",
         | 
| 226 | 
            +
                  "asn.asn": "asn",
         | 
| 227 | 
            +
                  "isp.asn": "asn",
         | 
| 228 | 
            +
                }
         | 
| 229 | 
            +
             | 
| 230 | 
            +
                remap.each_pair do |geoip2,geoip|
         | 
| 231 | 
            +
                  geoip2_key = "#{self.base_field}.geoip2.#{geoip2}"
         | 
| 232 | 
            +
                  if doc.include?(geoip2_key)
         | 
| 233 | 
            +
                    doc["#{self.base_field}.#{geoip}"] = doc[geoip2_key]
         | 
| 234 | 
            +
                  end
         | 
| 235 | 
            +
                end
         | 
| 236 | 
            +
             | 
| 237 | 
            +
                # these values all require special handling
         | 
| 238 | 
            +
             | 
| 239 | 
            +
                # https://dev.maxmind.com/geoip/geoip2/whats-new-in-geoip2/#Custom_Country_Codes
         | 
| 240 | 
            +
                # which basically says if traits.is_anonymous_proxy is true, previously the
         | 
| 241 | 
            +
                # country_code would have had a special value of A1.  Similarly, if
         | 
| 242 | 
            +
                # traits.is_satellite_provider is true, previously the country_code would
         | 
| 243 | 
            +
                # have a special value of A2.
         | 
| 244 | 
            +
                anon_key = "#{self.base_field}.geoip2.city.traits.is_anonymous_proxy"
         | 
| 245 | 
            +
                if doc.include?(anon_key)
         | 
| 246 | 
            +
                  anon_value = doc[anon_key]
         | 
| 247 | 
            +
                  if anon_value == "true"
         | 
| 248 | 
            +
                    doc["#{self.base_field}.country_code"] = "A1"
         | 
| 249 | 
            +
                  end
         | 
| 250 | 
            +
                end
         | 
| 251 | 
            +
             | 
| 252 | 
            +
                satellite_key = "#{self.base_field}.geoip2.city.traits.is_satellite_provider"
         | 
| 253 | 
            +
                if doc.include?(satellite_key)
         | 
| 254 | 
            +
                  satellite_value = doc[satellite_key]
         | 
| 255 | 
            +
                  if satellite_value == "true"
         | 
| 256 | 
            +
                    doc["#{self.base_field}.country_code"] = "A1"
         | 
| 257 | 
            +
                  end
         | 
| 258 | 
            +
                end
         | 
| 259 | 
            +
             | 
| 260 | 
            +
                # only set dma_code if location.metro_code was set and not empty or 0
         | 
| 261 | 
            +
                metro_key = "#{self.base_field}.geoip2.city.location.metro_code}"
         | 
| 262 | 
            +
                if doc.include?(metro_key)
         | 
| 263 | 
            +
                  metro_value = doc[metro_key]
         | 
| 264 | 
            +
                  if !metro_value.empty? && metro_value != "0"
         | 
| 265 | 
            +
                    doc["#{self.base_field}.dma_code"] = metro_value
         | 
| 266 | 
            +
                  end
         | 
| 267 | 
            +
                end
         | 
| 268 | 
            +
             | 
| 269 | 
            +
                # get the org key from 3 possible fields in decreasing order of preference
         | 
| 270 | 
            +
                asn_org_key = "#{self.base_field}.geoip2.asn.asn_org"
         | 
| 271 | 
            +
                isp_asn_org_key = "#{self.base_field}.geoip2.isp.asn_org"
         | 
| 272 | 
            +
                isp_org_key = "#{self.base_field}.geoip2.isp.asn_org"
         | 
| 273 | 
            +
                [ isp_org_key, isp_asn_org_key, asn_org_key ].each do |k|
         | 
| 274 | 
            +
                  v = doc[k]
         | 
| 275 | 
            +
                  if v && !v.empty?
         | 
| 276 | 
            +
                    doc["#{self.base_field}.org"] = v
         | 
| 277 | 
            +
                    break
         | 
| 278 | 
            +
                  end
         | 
| 279 | 
            +
                end
         | 
| 280 | 
            +
             | 
| 281 | 
            +
                [ doc ]
         | 
| 282 | 
            +
              end
         | 
| 283 | 
            +
            end
         | 
| 284 | 
            +
             | 
| 285 | 
            +
            end
         | 
| 286 | 
            +
            end
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            module Dap
         | 
| 2 | 
            +
            module Utils
         | 
| 3 | 
            +
            module Misc
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              def self.flatten_hash(h)
         | 
| 6 | 
            +
                ret = {}
         | 
| 7 | 
            +
                h.each_pair do |k,v|
         | 
| 8 | 
            +
                  next unless k
         | 
| 9 | 
            +
                  if v.is_a?(Hash)
         | 
| 10 | 
            +
                    flatten_hash(v).each_pair do |fk,fv|
         | 
| 11 | 
            +
                      ret["#{k}.#{fk}"] = fv.to_s
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
                  else
         | 
| 14 | 
            +
                    ret[k.to_s] = v.to_s
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
                ret
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            end
         | 
| 21 | 
            +
            end
         | 
| 22 | 
            +
            end
         | 
    
        data/lib/dap/version.rb
    CHANGED
    
    
| @@ -0,0 +1,12 @@ | |
| 1 | 
            +
            describe Dap::Utils::Misc do
         | 
| 2 | 
            +
              describe '.flatten_hash' do
         | 
| 3 | 
            +
                context 'with mixed nested data' do
         | 
| 4 | 
            +
                  let(:test_hash) { {"foo0": "bar0", "foo1": {"bar1": "stuff", "more": 1}, "foo2": {"bar2": "stuff", "more": 1, "morestuff": {"foo1": "thing1"}}} }
         | 
| 5 | 
            +
                  let(:expected_flat) { {'foo0'=>'bar0', 'foo1.bar1'=>'stuff', 'foo1.more'=>'1', 'foo2.bar2'=>'stuff', 'foo2.more'=>'1', 'foo2.morestuff.foo1'=>'thing1'} }
         | 
| 6 | 
            +
                  let(:actual_flat) { Dap::Utils::Misc.flatten_hash(test_hash) }
         | 
| 7 | 
            +
                  it 'flattens properly' do
         | 
| 8 | 
            +
                    expect(actual_flat).to eq(expected_flat)
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
            end
         | 
    
        data/test/filters.bats
    CHANGED
    
    | @@ -109,11 +109,9 @@ load ./test_common | |
| 109 109 | 
             
            }
         | 
| 110 110 |  | 
| 111 111 | 
             
            @test "recog_match" {
         | 
| 112 | 
            -
              # currently differs from godap, need to figure out which is correct
         | 
| 113 | 
            -
              skip
         | 
| 114 112 | 
             
              run bash -c "echo '9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.2' | $DAP_EXECUTABLE lines + recog line=dns.versionbind + json | jq -Sc ."
         | 
| 115 113 | 
             
              assert_success
         | 
| 116 | 
            -
              assert_output '{"line":"9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.2","line.recog.os.cpe23":"cpe:/o:redhat:enterprise_linux:6","line.recog.os.family":"Linux","line.recog.os.product":"Enterprise Linux","line.recog.os.vendor":"Red Hat","line.recog.os.version":"6","line.recog.os.version.version":"9","line.recog.service.cpe23":"cpe:/a:isc:bind:9.8.2rc1","line.recog.service.family":"BIND","line.recog.service.product":"BIND","line.recog.service.vendor":"ISC","line.recog.service.version":"9.8.2rc1"}'
         | 
| 114 | 
            +
              assert_output '{"line":"9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.2","line.recog.fingerprint_db":"dns.versionbind","line.recog.matched":"ISC BIND: Red Hat Enterprise Linux","line.recog.os.cpe23":"cpe:/o:redhat:enterprise_linux:6","line.recog.os.family":"Linux","line.recog.os.product":"Enterprise Linux","line.recog.os.vendor":"Red Hat","line.recog.os.version":"6","line.recog.os.version.version":"9","line.recog.service.cpe23":"cpe:/a:isc:bind:9.8.2rc1","line.recog.service.family":"BIND","line.recog.service.product":"BIND","line.recog.service.protocol":"dns","line.recog.service.vendor":"ISC","line.recog.service.version":"9.8.2rc1"}'
         | 
| 117 115 | 
             
            }
         | 
| 118 116 |  | 
| 119 117 | 
             
            @test "recog_nomatch" {
         | 
| @@ -128,3 +126,69 @@ load ./test_common | |
| 128 126 | 
             
              run bash -c "echo 'test' | $DAP_EXECUTABLE lines + recog + json"
         | 
| 129 127 | 
             
              assert_failure
         | 
| 130 128 | 
             
            }
         | 
| 129 | 
            +
             | 
| 130 | 
            +
            @test "geo_ip yields valid fields" {
         | 
| 131 | 
            +
              run bash -c "echo 66.92.181.240 | GEOIP_CITY_DATABASE_PATH=./test/test_data/geoip/GeoIPCity.dat $DAP_EXECUTABLE lines + geo_ip line + json | jq -Sc ."
         | 
| 132 | 
            +
              assert_success
         | 
| 133 | 
            +
              assert_output '{"line":"66.92.181.240","line.area_code":"510","line.city":"Fremont","line.country_code":"US","line.country_code3":"USA","line.country_name":"United States","line.dma_code":"807","line.latitude":"37.50790023803711","line.longitude":"-121.95999908447266","line.postal_code":"94538","line.region":"CA","line.region_name":"California"}'
         | 
| 134 | 
            +
            }
         | 
| 135 | 
            +
             | 
| 136 | 
            +
            @test "geo_ip_org yields valid fields" {
         | 
| 137 | 
            +
              run bash -c "echo 12.87.118.0 | GEOIP_ORG_DATABASE_PATH=./test/test_data/geoip/GeoIPOrg.dat $DAP_EXECUTABLE lines + geo_ip_org line + json | jq -Sc -r ."
         | 
| 138 | 
            +
              assert_success
         | 
| 139 | 
            +
              assert_output '{"line":"12.87.118.0","line.org":"AT&T Worldnet Services"}'
         | 
| 140 | 
            +
            }
         | 
| 141 | 
            +
             | 
| 142 | 
            +
            @test "geo_ip_asn" {
         | 
| 143 | 
            +
              run bash -c "echo 12.87.118.0 | GEOIP_ASN_DATABASE_PATH=./test/test_data/geoip/GeoIPASNum.dat $DAP_EXECUTABLE lines + geo_ip_asn line + json | jq -Sc -r ."
         | 
| 144 | 
            +
              assert_success
         | 
| 145 | 
            +
              assert_output '{"line":"12.87.118.0","line.asn":"AS7018"}'
         | 
| 146 | 
            +
            }
         | 
| 147 | 
            +
             | 
| 148 | 
            +
            @test "geo_ip2_city" {
         | 
| 149 | 
            +
              # test with default language
         | 
| 150 | 
            +
              run bash -c "echo 81.2.69.142 | GEOIP2_CITY_DATABASE_PATH=test/test_data/geoip2/GeoIP2-City-Test.mmdb $DAP_EXECUTABLE lines + geo_ip2_city line + json | jq -Sc -r ."
         | 
| 151 | 
            +
              assert_success
         | 
| 152 | 
            +
              assert_output '{"line":"81.2.69.142","line.geoip2.city.city.geoname_id":"2643743","line.geoip2.city.city.name":"London","line.geoip2.city.continent.code":"EU","line.geoip2.city.continent.geoname_id":"6255148","line.geoip2.city.continent.name":"Europe","line.geoip2.city.country.geoname_id":"2635167","line.geoip2.city.country.is_in_european_union":"true","line.geoip2.city.country.iso_code":"GB","line.geoip2.city.country.name":"United Kingdom","line.geoip2.city.location.accuracy_radius":"10","line.geoip2.city.location.latitude":"51.5142","line.geoip2.city.location.longitude":"-0.0931","line.geoip2.city.location.metro_code":"0","line.geoip2.city.location.time_zone":"Europe/London","line.geoip2.city.postal.code":"","line.geoip2.city.registered_country.geoname_id":"6252001","line.geoip2.city.registered_country.is_in_european_union":"false","line.geoip2.city.registered_country.iso_code":"US","line.geoip2.city.registered_country.name":"United States","line.geoip2.city.represented_country.geoname_id":"0","line.geoip2.city.represented_country.is_in_european_union":"false","line.geoip2.city.represented_country.iso_code":"","line.geoip2.city.represented_country.type":"","line.geoip2.city.subdivisions.0.geoname_id":"6269131","line.geoip2.city.subdivisions.0.iso_code":"ENG","line.geoip2.city.subdivisions.0.name":"England","line.geoip2.city.subdivisions.length":"1","line.geoip2.city.traits.is_anonymous_proxy":"false","line.geoip2.city.traits.is_satellite_provider":"false"}'
         | 
| 153 | 
            +
             | 
| 154 | 
            +
              # test with non-default language
         | 
| 155 | 
            +
              run bash -c "echo 67.43.156.0 | GEOIP2_CITY_DATABASE_PATH=test/test_data/geoip2/GeoIP2-City-Test.mmdb GEOIP2_LANGUAGE=fr $DAP_EXECUTABLE lines + geo_ip2_city line + json | jq -Sc -r ."
         | 
| 156 | 
            +
              assert_success
         | 
| 157 | 
            +
              assert_output '{"line":"67.43.156.0","line.geoip2.city.city.geoname_id":"0","line.geoip2.city.continent.code":"AS","line.geoip2.city.continent.geoname_id":"6255147","line.geoip2.city.continent.name":"Asie","line.geoip2.city.country.geoname_id":"1252634","line.geoip2.city.country.is_in_european_union":"false","line.geoip2.city.country.iso_code":"BT","line.geoip2.city.country.name":"Bhutan","line.geoip2.city.location.accuracy_radius":"534","line.geoip2.city.location.latitude":"27.5","line.geoip2.city.location.longitude":"90.5","line.geoip2.city.location.metro_code":"0","line.geoip2.city.location.time_zone":"Asia/Thimphu","line.geoip2.city.postal.code":"","line.geoip2.city.registered_country.geoname_id":"798549","line.geoip2.city.registered_country.is_in_european_union":"true","line.geoip2.city.registered_country.iso_code":"RO","line.geoip2.city.registered_country.name":"Roumanie","line.geoip2.city.represented_country.geoname_id":"0","line.geoip2.city.represented_country.is_in_european_union":"false","line.geoip2.city.represented_country.iso_code":"","line.geoip2.city.represented_country.type":"","line.geoip2.city.traits.is_anonymous_proxy":"true","line.geoip2.city.traits.is_satellite_provider":"false"}'
         | 
| 158 | 
            +
             | 
| 159 | 
            +
              # test IPv6
         | 
| 160 | 
            +
              run bash -c "echo 2a02:d9c0:: | GEOIP2_CITY_DATABASE_PATH=test/test_data/geoip2/GeoIP2-City-Test.mmdb $DAP_EXECUTABLE lines + geo_ip2_city line + json | jq -Sc -r ."
         | 
| 161 | 
            +
              assert_success
         | 
| 162 | 
            +
              assert_output '{"line":"2a02:d9c0::","line.geoip2.city.city.geoname_id":"0","line.geoip2.city.continent.code":"AS","line.geoip2.city.continent.geoname_id":"6255147","line.geoip2.city.continent.name":"Asia","line.geoip2.city.country.geoname_id":"298795","line.geoip2.city.country.is_in_european_union":"false","line.geoip2.city.country.iso_code":"TR","line.geoip2.city.country.name":"Turkey","line.geoip2.city.location.accuracy_radius":"100","line.geoip2.city.location.latitude":"39.05901","line.geoip2.city.location.longitude":"34.91155","line.geoip2.city.location.metro_code":"0","line.geoip2.city.location.time_zone":"Europe/Istanbul","line.geoip2.city.postal.code":"","line.geoip2.city.registered_country.geoname_id":"298795","line.geoip2.city.registered_country.is_in_european_union":"false","line.geoip2.city.registered_country.iso_code":"TR","line.geoip2.city.registered_country.name":"Turkey","line.geoip2.city.represented_country.geoname_id":"0","line.geoip2.city.represented_country.is_in_european_union":"false","line.geoip2.city.represented_country.iso_code":"","line.geoip2.city.represented_country.type":"","line.geoip2.city.traits.is_anonymous_proxy":"false","line.geoip2.city.traits.is_satellite_provider":"false"}'
         | 
| 163 | 
            +
            }
         | 
| 164 | 
            +
             | 
| 165 | 
            +
            @test "geo_ip2_asn" {
         | 
| 166 | 
            +
              run bash -c "echo 12.81.92.0 | GEOIP2_ASN_DATABASE_PATH=test/test_data/geoip2/GeoLite2-ASN-Test.mmdb $DAP_EXECUTABLE lines + geo_ip2_asn line + json | jq -Sc -r ."
         | 
| 167 | 
            +
              assert_success
         | 
| 168 | 
            +
              assert_output '{"line":"12.81.92.0","line.geoip2.asn.asn":"AS7018","line.geoip2.asn.asn_org":"AT&T Services"}'
         | 
| 169 | 
            +
             | 
| 170 | 
            +
              # test IPv6
         | 
| 171 | 
            +
              run bash -c "echo 2600:7000:: | GEOIP2_ASN_DATABASE_PATH=test/test_data/geoip2/GeoLite2-ASN-Test.mmdb $DAP_EXECUTABLE lines + geo_ip2_asn line + json | jq -Sc -r ."
         | 
| 172 | 
            +
              assert_success
         | 
| 173 | 
            +
              assert_output '{"line":"2600:7000::","line.geoip2.asn.asn":"AS6939","line.geoip2.asn.asn_org":"Hurricane Electric, Inc."}'
         | 
| 174 | 
            +
            }
         | 
| 175 | 
            +
             | 
| 176 | 
            +
            @test "geo_ip2_isp" {
         | 
| 177 | 
            +
              run bash -c "echo -e '12.81.92.0\n2600:7000::' | GEOIP2_ISP_DATABASE_PATH=test/test_data/geoip2/GeoIP2-ISP-Test.mmdb $DAP_EXECUTABLE lines + geo_ip2_isp line + json | jq -Sc -r ."
         | 
| 178 | 
            +
              assert_line --index 0 '{"line":"12.81.92.0","line.geoip2.isp.asn":"AS7018","line.geoip2.isp.asn_org":"","line.geoip2.isp.isp":"AT&T Services","line.geoip2.isp.org":"AT&T Services"}'
         | 
| 179 | 
            +
              # test IPv6
         | 
| 180 | 
            +
              assert_line --index 1 '{"line":"2600:7000::","line.geoip2.isp.asn":"AS6939","line.geoip2.isp.asn_org":"Hurricane Electric, Inc.","line.geoip2.isp.isp":"","line.geoip2.isp.org":""}'
         | 
| 181 | 
            +
            }
         | 
| 182 | 
            +
             | 
| 183 | 
            +
            @test "geo_ip2_legacy_compat" {
         | 
| 184 | 
            +
              run bash -c "echo -e '81.2.69.142\n12.81.92.0\n2a02:d9c0::\n2a01:1000::' | GEOIP2_ASN_DATABASE_PATH=test/test_data/geoip2/GeoLite2-ASN-Test.mmdb GEOIP2_CITY_DATABASE_PATH=test/test_data/geoip2/GeoIP2-City-Test.mmdb GEOIP2_ISP_DATABASE_PATH=test/test_data/geoip2/GeoIP2-ISP-Test.mmdb $DAP_EXECUTABLE lines + geo_ip2_city line + geo_ip2_asn line + geo_ip2_isp line + geo_ip2_legacy_compat line + match_remove line.geoip2 + json | jq -Sc -r ."
         | 
| 185 | 
            +
              assert_success
         | 
| 186 | 
            +
              # this one only has city data, not ASN/org/ISP
         | 
| 187 | 
            +
              assert_line --index 0 '{"line":"81.2.69.142","line.city":"London","line.country.name":"United Kingdom","line.country_code":"GB","line.latitude":"51.5142","line.longitude":"-0.0931","line.postal_code":"","line.region":"ENG","line.region_name":"England"}'
         | 
| 188 | 
            +
              # this one has ASN/org data in the test databases but none in the city DB
         | 
| 189 | 
            +
              assert_line --index 1 '{"line":"12.81.92.0","line.asn":"AS7018","line.org":"AT&T Services"}'
         | 
| 190 | 
            +
              # exists only city
         | 
| 191 | 
            +
              assert_line --index 2 '{"line":"2a02:d9c0::","line.country.name":"Turkey","line.country_code":"TR","line.latitude":"39.05901","line.longitude":"34.91155","line.postal_code":""}'
         | 
| 192 | 
            +
              # exists in ISP
         | 
| 193 | 
            +
              assert_line --index 3 '{"line":"2a01:1000::","line.asn":"AS5617","line.org":"Telekomunikacja Polska S.A."}'
         | 
| 194 | 
            +
            }
         | 
| Binary file | 
| Binary file | 
| Binary file | 
| Binary file | 
| Binary file | 
| Binary file | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: dap
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.0 | 
| 4 | 
            +
              version: 1.2.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Rapid7 Research
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2019-04- | 
| 11 | 
            +
            date: 2019-04-30 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rspec
         | 
| @@ -183,6 +183,7 @@ files: | |
| 183 183 | 
             
            - lib/dap/filter.rb
         | 
| 184 184 | 
             
            - lib/dap/filter/base.rb
         | 
| 185 185 | 
             
            - lib/dap/filter/geoip.rb
         | 
| 186 | 
            +
            - lib/dap/filter/geoip2.rb
         | 
| 186 187 | 
             
            - lib/dap/filter/gquic.rb
         | 
| 187 188 | 
             
            - lib/dap/filter/http.rb
         | 
| 188 189 | 
             
            - lib/dap/filter/ldap.rb
         | 
| @@ -205,6 +206,7 @@ files: | |
| 205 206 | 
             
            - lib/dap/proto/mssql.rb
         | 
| 206 207 | 
             
            - lib/dap/proto/natpmp.rb
         | 
| 207 208 | 
             
            - lib/dap/proto/wdbrpc.rb
         | 
| 209 | 
            +
            - lib/dap/utils/misc.rb
         | 
| 208 210 | 
             
            - lib/dap/utils/oui.rb
         | 
| 209 211 | 
             
            - lib/dap/version.rb
         | 
| 210 212 | 
             
            - samples/http_get_reply.ic12.bz2
         | 
| @@ -231,10 +233,17 @@ files: | |
| 231 233 | 
             
            - spec/dap/input/json_spec.rb
         | 
| 232 234 | 
             
            - spec/dap/proto/ipmi_spec.rb
         | 
| 233 235 | 
             
            - spec/dap/proto/ldap_proto_spec.rb
         | 
| 236 | 
            +
            - spec/dap/utils/misc_spec.rb
         | 
| 234 237 | 
             
            - spec/spec_helper.rb
         | 
| 235 238 | 
             
            - test/filters.bats
         | 
| 236 239 | 
             
            - test/inputs.bats
         | 
| 237 240 | 
             
            - test/test_common.bash
         | 
| 241 | 
            +
            - test/test_data/geoip/GeoIPASNum.dat
         | 
| 242 | 
            +
            - test/test_data/geoip/GeoIPCity.dat
         | 
| 243 | 
            +
            - test/test_data/geoip/GeoIPOrg.dat
         | 
| 244 | 
            +
            - test/test_data/geoip2/GeoIP2-City-Test.mmdb
         | 
| 245 | 
            +
            - test/test_data/geoip2/GeoIP2-ISP-Test.mmdb
         | 
| 246 | 
            +
            - test/test_data/geoip2/GeoLite2-ASN-Test.mmdb
         | 
| 238 247 | 
             
            - tools/geo-ip-summary.rb
         | 
| 239 248 | 
             
            - tools/ipmi-vulns.rb
         | 
| 240 249 | 
             
            - tools/json-summarize.rb
         | 
| @@ -273,7 +282,14 @@ test_files: | |
| 273 282 | 
             
            - spec/dap/input/json_spec.rb
         | 
| 274 283 | 
             
            - spec/dap/proto/ipmi_spec.rb
         | 
| 275 284 | 
             
            - spec/dap/proto/ldap_proto_spec.rb
         | 
| 285 | 
            +
            - spec/dap/utils/misc_spec.rb
         | 
| 276 286 | 
             
            - spec/spec_helper.rb
         | 
| 277 287 | 
             
            - test/filters.bats
         | 
| 278 288 | 
             
            - test/inputs.bats
         | 
| 279 289 | 
             
            - test/test_common.bash
         | 
| 290 | 
            +
            - test/test_data/geoip/GeoIPASNum.dat
         | 
| 291 | 
            +
            - test/test_data/geoip/GeoIPCity.dat
         | 
| 292 | 
            +
            - test/test_data/geoip/GeoIPOrg.dat
         | 
| 293 | 
            +
            - test/test_data/geoip2/GeoIP2-City-Test.mmdb
         | 
| 294 | 
            +
            - test/test_data/geoip2/GeoIP2-ISP-Test.mmdb
         | 
| 295 | 
            +
            - test/test_data/geoip2/GeoLite2-ASN-Test.mmdb
         |