better_newrelic_sql_obfuscator 1.0.0 → 1.0.1

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.
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use ruby-1.8.7@better_newrelic_obfuscator --create --install
data/Gemfile CHANGED
@@ -6,9 +6,10 @@ source "http://rubygems.org"
6
6
  # Add dependencies to develop your gem here.
7
7
  # Include everything needed to run rake, tests, features, etc.
8
8
  group :development do
9
- gem "minitest", ">= 0"
10
- gem "yard", "~> 0.6.0"
11
- gem "bundler", "~> 1.0.0"
12
- gem "jeweler", "~> 1.6.4"
13
- gem "rcov", ">= 0"
9
+ gem 'rake'
10
+ gem "minitest"
11
+ gem "yard"
12
+ gem "bundler"
13
+ gem "jeweler"
14
+ gem "rcov"
14
15
  end
data/Gemfile.lock CHANGED
@@ -9,14 +9,15 @@ GEM
9
9
  minitest (2.10.0)
10
10
  rake (0.9.2.2)
11
11
  rcov (0.9.11)
12
- yard (0.6.8)
12
+ yard (0.7.4)
13
13
 
14
14
  PLATFORMS
15
15
  ruby
16
16
 
17
17
  DEPENDENCIES
18
- bundler (~> 1.0.0)
19
- jeweler (~> 1.6.4)
18
+ bundler
19
+ jeweler
20
20
  minitest
21
+ rake
21
22
  rcov
22
- yard (~> 0.6.0)
23
+ yard
data/Rakefile CHANGED
@@ -28,7 +28,7 @@ Jeweler::RubygemsDotOrgTasks.new
28
28
  require 'rake/testtask'
29
29
  Rake::TestTask.new(:test) do |test|
30
30
  test.libs << 'lib' << 'test'
31
- test.pattern = 'test/**/test_*.rb'
31
+ test.pattern = 'test/**/*_test.rb'
32
32
  test.verbose = true
33
33
  end
34
34
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0
1
+ 1.0.1
@@ -4,20 +4,21 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{better_newrelic_sql_obfuscator}
8
- s.version = "1.0.0"
7
+ s.name = "better_newrelic_sql_obfuscator"
8
+ s.version = "1.0.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Renewable Funding, LLC"]
12
- s.date = %q{2012-01-11}
13
- s.description = %q{see Summary}
14
- s.email = %q{devteam@renewfund.com}
12
+ s.date = "2012-01-12"
13
+ s.description = "see Summary"
14
+ s.email = "devteam@renewfund.com"
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE.txt",
17
17
  "README.rdoc"
18
18
  ]
19
19
  s.files = [
20
20
  ".document",
21
+ ".rvmrc",
21
22
  "Gemfile",
22
23
  "Gemfile.lock",
23
24
  "LICENSE.txt",
@@ -26,36 +27,39 @@ Gem::Specification.new do |s|
26
27
  "VERSION",
27
28
  "better_newrelic_sql_obfuscator.gemspec",
28
29
  "lib/better_newrelic_sql_obfuscator.rb",
30
+ "test/better_newrelic_sql_obfuscator_unit_test.rb",
29
31
  "test/helper.rb"
30
32
  ]
31
- s.homepage = %q{http://github.com/projectdx/better_newrelic_sql_obfuscator}
33
+ s.homepage = "http://github.com/projectdx/better_newrelic_sql_obfuscator"
32
34
  s.licenses = ["MIT"]
33
35
  s.require_paths = ["lib"]
34
- s.rubygems_version = %q{1.3.7}
35
- s.summary = %q{Obfuscate SQL in NewRelic in a way that doesn't suck}
36
+ s.rubygems_version = "1.8.10"
37
+ s.summary = "Obfuscate SQL in NewRelic in a way that doesn't suck"
36
38
 
37
39
  if s.respond_to? :specification_version then
38
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
39
40
  s.specification_version = 3
40
41
 
41
42
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
43
+ s.add_development_dependency(%q<rake>, [">= 0"])
42
44
  s.add_development_dependency(%q<minitest>, [">= 0"])
43
- s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
44
- s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
45
- s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
45
+ s.add_development_dependency(%q<yard>, [">= 0"])
46
+ s.add_development_dependency(%q<bundler>, [">= 0"])
47
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
46
48
  s.add_development_dependency(%q<rcov>, [">= 0"])
47
49
  else
50
+ s.add_dependency(%q<rake>, [">= 0"])
48
51
  s.add_dependency(%q<minitest>, [">= 0"])
49
- s.add_dependency(%q<yard>, ["~> 0.6.0"])
50
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
51
- s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
52
+ s.add_dependency(%q<yard>, [">= 0"])
53
+ s.add_dependency(%q<bundler>, [">= 0"])
54
+ s.add_dependency(%q<jeweler>, [">= 0"])
52
55
  s.add_dependency(%q<rcov>, [">= 0"])
53
56
  end
54
57
  else
58
+ s.add_dependency(%q<rake>, [">= 0"])
55
59
  s.add_dependency(%q<minitest>, [">= 0"])
56
- s.add_dependency(%q<yard>, ["~> 0.6.0"])
57
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
58
- s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
60
+ s.add_dependency(%q<yard>, [">= 0"])
61
+ s.add_dependency(%q<bundler>, [">= 0"])
62
+ s.add_dependency(%q<jeweler>, [">= 0"])
59
63
  s.add_dependency(%q<rcov>, [">= 0"])
60
64
  end
61
65
  end
@@ -54,7 +54,7 @@ module BetterNewrelicSqlObfuscator
54
54
  obfuscated_sql = [field_expression, comparison, obfuscate_value(sensitive_data)].compact.join
55
55
 
56
56
  # Don't obfuscate if we have a field expression that's on the whitelist or is on a 'nickname' field
57
- if field_expression.present?
57
+ unless field_expression.to_s.empty?
58
58
  table_name, field_name = field_expression.to_s.gsub('"', '').split('.')
59
59
  case
60
60
  when whitelisted?('%s.%s' % [table_name, field_name])
@@ -0,0 +1,84 @@
1
+ require File.expand_path( File.dirname( __FILE__ ) + '/helper' )
2
+ require 'minitest/autorun'
3
+
4
+ class BetterNewrelicSqlObfuscatorUnitTest < MiniTest::Unit::TestCase
5
+
6
+ describe ".obfuscate_value" do
7
+ it "should salt and md5" do
8
+ expected = "'%s'" % Digest::MD5.hexdigest('3:foo')
9
+ assert_equal expected, BetterNewrelicSqlObfuscator.obfuscate_value('foo')
10
+ end
11
+ end
12
+
13
+ describe '.obfuscate (generic)' do
14
+
15
+ def assert_obfuscated_eq(sql, expected, message = nil)
16
+ actual = BetterNewrelicSqlObfuscator.obfuscate(sql)
17
+ assert_equal expected, actual, message
18
+ end
19
+
20
+ def assert_not_obfuscated(sql, message = nil)
21
+ assert_obfuscated_eq(sql, sql, message)
22
+ end
23
+
24
+ def ob_value(value)
25
+ BetterNewrelicSqlObfuscator.obfuscate_value(value)
26
+ end
27
+
28
+ it "should replace quoted strings floating out there by themselves" do
29
+ assert_obfuscated_eq %Q{select * from some_table where f_table_name = 'sensitive data'},
30
+ %Q{select * from some_table where f_table_name = #{ob_value("sensitive data")}}
31
+ end
32
+
33
+ it "should be copacetic with double-apostrophe quoting" do
34
+ assert_obfuscated_eq %Q{select * from some_table where f_table_name = '' and b_table_name = 'sensitive'' data'},
35
+ %Q{select * from some_table where f_table_name = #{ob_value('')} and b_table_name = #{ob_value("sensitive'' data")}}
36
+ end
37
+
38
+ it "should be copacetic with E'foo' string quoting" do
39
+ assert_obfuscated_eq %Q{select * from some_table where f_table_name = E'sensitive\\' data'},
40
+ %Q{select * from some_table where f_table_name = E#{ob_value("sensitive\\' data")}}
41
+ end
42
+
43
+ it "should replace quoted strings when compared against a double-quoted table-dot-field expression" do
44
+ assert_obfuscated_eq %Q{select * from some_table where "some_table"."some_field" = 'sensitive data'},
45
+ %Q{select * from some_table where "some_table"."some_field" = #{ob_value('sensitive data')}}
46
+ end
47
+
48
+ it "should replace quoted strings when compared against a double-quoted table-dot-field expression using whatever comparison operator" do
49
+ assert_obfuscated_eq %Q{select * from some_table where "some_table"."some_field" somehow_matches 'sensitive data'},
50
+ %Q{select * from some_table where "some_table"."some_field" somehow_matches #{ob_value('sensitive data')}}
51
+ end
52
+
53
+ it "should not replace quoted strings if they're used against a field that's on the whitelist" do
54
+ begin
55
+ BetterNewrelicSqlObfuscator.whitelist 'some_table.whitelisted_field'
56
+ assert_not_obfuscated %Q{select * from some_table where "some_table"."whitelisted_field"='perfectly harmless value'}
57
+ ensure
58
+ BetterNewrelicSqlObfuscator::WhitelistHash.delete('some_table.whitelisted_field') # don't clobber config/initializers
59
+ end
60
+ end
61
+
62
+ it "should not eat subsequent expressions" do
63
+ begin
64
+ BetterNewrelicSqlObfuscator.whitelist 'some_table.whitelisted_field'
65
+ assert_obfuscated_eq \
66
+ %Q{select * from some_table where "some_table"."whitelisted_field"='perfectly harmless value' and "secret"."address"=E'i am the \\'lizard king'},
67
+ %Q{select * from some_table where "some_table"."whitelisted_field"='perfectly harmless value' and "secret"."address"=E#{ob_value('i am the \\\'lizard king')}}
68
+ ensure
69
+ BetterNewrelicSqlObfuscator::WhitelistHash.delete('some_table.whitelisted_field') # don't clobber config/initializers
70
+ end
71
+ end
72
+
73
+ it "should not replace quoted strings if an arbitrary block expression returns true on them" do
74
+ ob_proc = Proc.new { |table, field| [table, field] == %w[wibble wobble] }
75
+ begin
76
+ BetterNewrelicSqlObfuscator.dont_obfuscate_table_and_field(&ob_proc)
77
+ assert_not_obfuscated %Q{select * from some_table where "wibble"."wobble"='a_nickname'}
78
+ ensure
79
+ BetterNewrelicSqlObfuscator::DontObfuscateProcs.delete(ob_proc) # don't clobber config/initializers
80
+ end
81
+ end
82
+ end
83
+
84
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: better_newrelic_sql_obfuscator
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
5
- prerelease: false
4
+ hash: 21
5
+ prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 0
10
- version: 1.0.0
9
+ - 1
10
+ version: 1.0.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Renewable Funding, LLC
@@ -15,12 +15,24 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-01-11 00:00:00 -08:00
19
- default_executable:
18
+ date: 2012-01-12 00:00:00 Z
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
21
+ requirement: &id001 !ruby/object:Gem::Requirement
22
+ none: false
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ hash: 3
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ version_requirements: *id001
31
+ name: rake
22
32
  prerelease: false
23
- version_requirements: &id001 !ruby/object:Gem::Requirement
33
+ type: :development
34
+ - !ruby/object:Gem::Dependency
35
+ requirement: &id002 !ruby/object:Gem::Requirement
24
36
  none: false
25
37
  requirements:
26
38
  - - ">="
@@ -29,60 +41,54 @@ dependencies:
29
41
  segments:
30
42
  - 0
31
43
  version: "0"
44
+ version_requirements: *id002
32
45
  name: minitest
33
- requirement: *id001
46
+ prerelease: false
34
47
  type: :development
35
48
  - !ruby/object:Gem::Dependency
36
- prerelease: false
37
- version_requirements: &id002 !ruby/object:Gem::Requirement
49
+ requirement: &id003 !ruby/object:Gem::Requirement
38
50
  none: false
39
51
  requirements:
40
- - - ~>
52
+ - - ">="
41
53
  - !ruby/object:Gem::Version
42
- hash: 7
54
+ hash: 3
43
55
  segments:
44
56
  - 0
45
- - 6
46
- - 0
47
- version: 0.6.0
57
+ version: "0"
58
+ version_requirements: *id003
48
59
  name: yard
49
- requirement: *id002
60
+ prerelease: false
50
61
  type: :development
51
62
  - !ruby/object:Gem::Dependency
52
- prerelease: false
53
- version_requirements: &id003 !ruby/object:Gem::Requirement
63
+ requirement: &id004 !ruby/object:Gem::Requirement
54
64
  none: false
55
65
  requirements:
56
- - - ~>
66
+ - - ">="
57
67
  - !ruby/object:Gem::Version
58
- hash: 23
68
+ hash: 3
59
69
  segments:
60
- - 1
61
- - 0
62
70
  - 0
63
- version: 1.0.0
71
+ version: "0"
72
+ version_requirements: *id004
64
73
  name: bundler
65
- requirement: *id003
74
+ prerelease: false
66
75
  type: :development
67
76
  - !ruby/object:Gem::Dependency
68
- prerelease: false
69
- version_requirements: &id004 !ruby/object:Gem::Requirement
77
+ requirement: &id005 !ruby/object:Gem::Requirement
70
78
  none: false
71
79
  requirements:
72
- - - ~>
80
+ - - ">="
73
81
  - !ruby/object:Gem::Version
74
- hash: 7
82
+ hash: 3
75
83
  segments:
76
- - 1
77
- - 6
78
- - 4
79
- version: 1.6.4
84
+ - 0
85
+ version: "0"
86
+ version_requirements: *id005
80
87
  name: jeweler
81
- requirement: *id004
88
+ prerelease: false
82
89
  type: :development
83
90
  - !ruby/object:Gem::Dependency
84
- prerelease: false
85
- version_requirements: &id005 !ruby/object:Gem::Requirement
91
+ requirement: &id006 !ruby/object:Gem::Requirement
86
92
  none: false
87
93
  requirements:
88
94
  - - ">="
@@ -91,8 +97,9 @@ dependencies:
91
97
  segments:
92
98
  - 0
93
99
  version: "0"
100
+ version_requirements: *id006
94
101
  name: rcov
95
- requirement: *id005
102
+ prerelease: false
96
103
  type: :development
97
104
  description: see Summary
98
105
  email: devteam@renewfund.com
@@ -105,6 +112,7 @@ extra_rdoc_files:
105
112
  - README.rdoc
106
113
  files:
107
114
  - .document
115
+ - .rvmrc
108
116
  - Gemfile
109
117
  - Gemfile.lock
110
118
  - LICENSE.txt
@@ -113,8 +121,8 @@ files:
113
121
  - VERSION
114
122
  - better_newrelic_sql_obfuscator.gemspec
115
123
  - lib/better_newrelic_sql_obfuscator.rb
124
+ - test/better_newrelic_sql_obfuscator_unit_test.rb
116
125
  - test/helper.rb
117
- has_rdoc: true
118
126
  homepage: http://github.com/projectdx/better_newrelic_sql_obfuscator
119
127
  licenses:
120
128
  - MIT
@@ -144,7 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
144
152
  requirements: []
145
153
 
146
154
  rubyforge_project:
147
- rubygems_version: 1.3.7
155
+ rubygems_version: 1.8.10
148
156
  signing_key:
149
157
  specification_version: 3
150
158
  summary: Obfuscate SQL in NewRelic in a way that doesn't suck