recog 2.1.24 → 2.1.25

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1311937d249f7d775e823684af469e6fdb63d219
4
- data.tar.gz: a521aa3b679c5107feabd73b17db70ff22618c75
3
+ metadata.gz: dca9789b2018dcb894fa9e5dff3f664b5e75fc12
4
+ data.tar.gz: a599644447ce120f8ff22ef7994adf567469a009
5
5
  SHA512:
6
- metadata.gz: d6fb453205539af744e318a6dd74dc42a9ff7730bbc0ee04b2d1ccae4e5c13f9b1c3935730a75e7d27ec726d6a7eb4e1e645668fc8e1e1c95f402e8184cf7635
7
- data.tar.gz: 80bbb58d47f7758f9aaf80ed0191a9e100476fc036f586c1ab9cd5ed85e538d17458a73ef2cf4a4d07e3e3dca81d5df1dd831180da2e00d7dcd4b1500ffd26d4
6
+ metadata.gz: 8cfff6a20c9dff48aba6c66bcfce5f06e84b167ca18f5fcdd334201e3ae85513d1a47ba3d5029fa007ffece1e10f9cb8f0eaa1202812c05954edfc0539bd7f1c
7
+ data.tar.gz: 5d3509715e5929f2dbd3c7f5c3d172afcafa370f6f006744517053bc037bfc91624b2f10373f94a980a7ec8a872102583dad79eafa4d9fd90b11cf50372fbb36
@@ -3,6 +3,8 @@ module Recog
3
3
  # A fingerprint that can be {#match matched} against a particular kind of
4
4
  # fingerprintable data, e.g. an HTTP `Server` header
5
5
  class Fingerprint
6
+ require 'set'
7
+
6
8
  require 'recog/fingerprint/regexp_factory'
7
9
  require 'recog/fingerprint/test'
8
10
 
@@ -73,11 +75,17 @@ class Fingerprint
73
75
  return if match_data.nil?
74
76
 
75
77
  result = { 'matched' => @name }
78
+ replacements = {}
76
79
  @params.each_pair do |k,v|
77
80
  pos = v[0]
78
81
  if pos == 0
79
82
  # A match offset of 0 means this param has a hardcoded value
80
83
  result[k] = v[1]
84
+ # if this value uses interpolation, note it for handling later
85
+ v[1].scan(/\{([^\s{}]+)\}/).flatten.each do |replacement|
86
+ replacements[k] ||= Set[]
87
+ replacements[k] << replacement
88
+ end
81
89
  else
82
90
  # A match offset other than 0 means the value should come from
83
91
  # the corresponding match result index
@@ -95,17 +103,11 @@ class Fingerprint
95
103
 
96
104
  result['fingerprint_db'] = @match_key if @match_key
97
105
 
98
- result.each_pair do |k,v|
99
- # skip any nil result values, which is allowed but woud jam up the match below
100
- next if v.nil?
101
- # if this key's value uses interpolation of the form "foo{some.thing}",
102
- # if some.thing was "bar" then this keys value would be set to "foobar".
103
- if /\{(?<replace>[^\s{}]+)\}/ =~ v
104
- if result[replace]
105
- if /\{(?<bad_replace>[^\s{}]+)\}/ =~ result[replace]
106
- raise "Invalid recursive use of #{bad_replace} in #{replace}"
107
- end
108
- result[k] = v.gsub(/\{#{replace}\}/, result[replace])
106
+ # for everything identified as using interpolation, do so
107
+ replacements.each_pair do |replacement_k, replacement_vs|
108
+ replacement_vs.each do |replacement|
109
+ if result[replacement]
110
+ result[replacement_k] = result[replacement_k].gsub(/\{#{replacement}\}/, result[replacement])
109
111
  else
110
112
  # if the value uses an interpolated value that does not exist, in general this could be
111
113
  # very bad, but over time we have allowed the use of regexes with
@@ -116,10 +118,10 @@ class Fingerprint
116
118
  # standard of '-' for the version, otherwise raise and exception as
117
119
  # this code currently does not handle interpolation of undefined
118
120
  # values in other cases.
119
- if k =~ /\.cpe23$/ and replace =~ /\.version$/
120
- result[k] = v.gsub(/\{#{replace}\}/, '-')
121
+ if replacement_k =~ /\.cpe23$/ and replacement =~ /\.version$/
122
+ result[replacement_k] = result[replacement_k].gsub(/\{#{replacement}\}/, '-')
121
123
  else
122
- raise "Invalid use of nil interpolated value #{replace} in non-cpe23 fingerprint param #{k}"
124
+ raise "Invalid use of nil interpolated non-version value #{replacement} in non-cpe23 fingerprint param #{replacement_k}"
123
125
  end
124
126
  end
125
127
  end
data/lib/recog/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Recog
2
- VERSION = '2.1.24'
2
+ VERSION = '2.1.25'
3
3
  end
@@ -60,6 +60,14 @@ describe Recog::DB do
60
60
  param_names << param_name
61
61
  end
62
62
  end
63
+
64
+ it "uses interpolation correctly" do
65
+ if pos == 0 && /\{(?<interpolated>[^\s{}]+)\}/ =~ value
66
+ unless fp.params.key?(interpolated)
67
+ fail "'#{fp.name}' uses interpolated value '#{interpolated}' that does not exist"
68
+ end
69
+ end
70
+ end
63
71
  end
64
72
  end
65
73
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: recog
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.24
4
+ version: 2.1.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rapid7 Research
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-01 00:00:00.000000000 Z
11
+ date: 2018-10-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -244,7 +244,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
244
244
  version: '0'
245
245
  requirements: []
246
246
  rubyforge_project:
247
- rubygems_version: 2.6.11
247
+ rubygems_version: 2.5.2
248
248
  signing_key:
249
249
  specification_version: 4
250
250
  summary: Network service fingerprint database, classes, and utilities