omelettes 0.2.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
1
  source :rubygems
2
2
 
3
3
  gemspec
4
+
5
+ gem 'rake'
data/Rakefile CHANGED
@@ -1,3 +1,4 @@
1
+ require 'bundler/gem_tasks'
1
2
  require 'rubygems'
2
3
  require 'rake'
3
4
  require 'rspec/core/rake_task'
@@ -22,7 +22,7 @@ module Omelettes
22
22
  case name
23
23
  when :hardened
24
24
  return value
25
- when :name, :first_name, :last_name
25
+ when :first_name, :last_name
26
26
  return Faker::Name.send(name)
27
27
  when :city, :state, :country, :street_address, :street_name, :zip_code
28
28
  return Faker::Address.send(name)
@@ -32,8 +32,10 @@ module Omelettes
32
32
  return Faker::Internet.send(name)
33
33
  when :paragraph, :paragraphs, :sentence, :sentences, :words
34
34
  return Faker::Lorem.send(name)
35
- when :phone
35
+ when :phone, :contact_phone, :fax
36
36
  return Faker::PhoneNumber.phone_number
37
+ when :url, :website
38
+ return Faker::Internet.domain_name
37
39
  else
38
40
  return Omelettes::Obfuscate.obfuscate(value)
39
41
  end
@@ -23,15 +23,19 @@ module Omelettes
23
23
  alias :harden :ignore
24
24
  end
25
25
 
26
- def obfuscate(column_name)
27
- column = self.class.column_config(column_name)
28
- original_value = self.send(column_name)
29
- if column
30
- value = column.process(original_value)
31
- else
32
- value = Column.default(column_name, original_value)
26
+ def obfuscate(column_names)
27
+ attributes = {}
28
+ column_names.each do |column_name|
29
+ column = self.class.column_config(column_name)
30
+ original_value = self.send(column_name)
31
+ if column
32
+ value = column.process(original_value)
33
+ else
34
+ value = Column.default(column_name, original_value)
35
+ end
36
+ attributes[column_name] = value
33
37
  end
34
- self.update_attribute(column_name, value) if original_value != value
38
+ self.class.where(:id => self.id).update_all(attributes)
35
39
  end
36
40
 
37
41
  def self.included(base)
@@ -5,20 +5,40 @@ module Omelettes
5
5
  total_tables = 0
6
6
  total_attributes = 0
7
7
  Words.load(word_list || "/usr/share/dict/words")
8
+ processed = []
8
9
  tables.each do |table|
9
10
  next if ignore_table?(table)
10
- print "\nProcessing #{model(table).name}" unless silent
11
+ processed << table
12
+ pbar = ProgressBar.new(model(table).name, model(table).count) unless silent
11
13
  model(table).find_each do |object|
12
- model(table).columns.each do |column|
13
- next if ignore_column?(column.name) || column.type != :string
14
- object.obfuscate(column.name)
14
+ begin
15
+ object.obfuscate(columns_for_table(table))
15
16
  total_attributes += 1
17
+ rescue => e
18
+ puts e.message
19
+ next
20
+ ensure
21
+ pbar.inc unless silent
16
22
  end
17
- print "." unless silent
18
23
  end
24
+ pbar.finish unless silent
19
25
  total_tables += 1
20
26
  end
21
- print "\n" unless silent
27
+ if @callback
28
+ @callback.call
29
+ end
30
+ unless silent
31
+ puts " Obfuscation Report (the following tables and columns were processed)"
32
+ puts ("----------" * 8)
33
+ processed.each do |table|
34
+ label = model(table).name
35
+ columns_for_table(table).join(',').scan(/.{0,60}/).each do |columns|
36
+ puts "%20.20s | %-60.60s" % [label, columns] unless columns.blank?
37
+ label = ""
38
+ end
39
+ end
40
+ end
41
+
22
42
  [total_tables, total_attributes]
23
43
  end
24
44
 
@@ -36,6 +56,8 @@ module Omelettes
36
56
  ignore_tables.each do |ignore|
37
57
  return true if table.match(ignore).to_s == table
38
58
  end
59
+ return true unless columns_for_table(table).any?
60
+ return true if model(table).count == 0
39
61
  false
40
62
  end
41
63
 
@@ -46,13 +68,20 @@ module Omelettes
46
68
  false
47
69
  end
48
70
 
71
+ def columns_for_table(table)
72
+ @columns_for_table ||= {}
73
+ @columns_for_table[table] ||= model(table).columns.select {|column| !ignore_column?(column.name) && (column.type == :string || column.type == :text)}.map(&:name)
74
+ end
75
+
76
+ def post_cook(&callback)
77
+ @callback = callback
78
+ end
79
+
49
80
  def obfuscate(string)
50
81
  return nil if string.nil?
51
- result = []
52
- string.split(/(\s+)|([[:punct:]])/).each do |word|
53
- result << (word.match(/[a-zA-Z]+/).nil? ? word : Words.replace(word))
54
- end
55
- result.join("")
82
+ string.split(/(\s+)|([[:punct:]])/).map do |word|
83
+ word.match(/[a-zA-Z]+/).nil? ? word : Words.replace(word)
84
+ end.join("")
56
85
  end
57
86
 
58
87
  attr_accessor :ignore_tables
@@ -7,16 +7,16 @@ module Omelettes
7
7
  end
8
8
 
9
9
  def add(word)
10
- key = "#{word[0].downcase}#{word.length}"
10
+ key = "#{word[0,1].downcase}#{word.length}"
11
11
  @word_hash[key] ||= []
12
12
  @word_hash[key] << word
13
13
  end
14
14
 
15
15
  def replace(word)
16
- key = "#{word[0].downcase}#{word.length}"
16
+ key = "#{word[0,1].downcase}#{word.length}"
17
17
  valid_words = (@word_hash[key] || [])
18
18
  new_word = valid_words[rand(valid_words.size)]
19
- return new_word.send(word[0].upcase == word[0] ? :capitalize : :downcase) unless new_word.nil?
19
+ return new_word.send(word[0,1].upcase == word[0,1] ? :capitalize : :downcase) unless new_word.nil?
20
20
  word
21
21
  end
22
22
 
data/lib/omelettes.rb CHANGED
@@ -4,6 +4,8 @@ rescue LoadError
4
4
  require 'activerecord' unless defined?(ActiveRecord)
5
5
  end
6
6
 
7
+ require 'progressbar'
8
+
7
9
  require 'omelettes/column'
8
10
  require 'omelettes/model_additions'
9
11
  require 'omelettes/obfuscate'
@@ -1,10 +1,6 @@
1
1
  namespace :db do
2
2
  desc "Obfuscate the database with Omelettes"
3
3
  task :cook => :environment do
4
- print "Are you sure you want to scramble all strings in the database? (y/n): "
5
- input = $stdin.gets.strip
6
- if input == "y"
7
- Omelettes::Obfuscate.cook
8
- end
4
+ Omelettes::Obfuscate.cook
9
5
  end
10
6
  end
metadata CHANGED
@@ -1,59 +1,67 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: omelettes
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
4
5
  prerelease:
5
- version: 0.2.0
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Mark Sim
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-07-27 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2012-02-10 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: rspec
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &70280857854620 !ruby/object:Gem::Requirement
19
17
  none: false
20
- requirements:
18
+ requirements:
21
19
  - - ~>
22
- - !ruby/object:Gem::Version
20
+ - !ruby/object:Gem::Version
23
21
  version: 2.1.0
24
22
  type: :development
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
27
- name: faker
28
23
  prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *70280857854620
25
+ - !ruby/object:Gem::Dependency
26
+ name: faker
27
+ requirement: &70280857854040 !ruby/object:Gem::Requirement
30
28
  none: false
31
- requirements:
29
+ requirements:
32
30
  - - ~>
33
- - !ruby/object:Gem::Version
31
+ - !ruby/object:Gem::Version
34
32
  version: 0.9.5
35
33
  type: :runtime
36
- version_requirements: *id002
37
- - !ruby/object:Gem::Dependency
38
- name: activerecord
39
34
  prerelease: false
40
- requirement: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *70280857854040
36
+ - !ruby/object:Gem::Dependency
37
+ name: activerecord
38
+ requirement: &70280857853440 !ruby/object:Gem::Requirement
41
39
  none: false
42
- requirements:
40
+ requirements:
43
41
  - - ~>
44
- - !ruby/object:Gem::Version
45
- version: "3.0"
42
+ - !ruby/object:Gem::Version
43
+ version: '3.0'
46
44
  type: :runtime
47
- version_requirements: *id003
48
- description: Low-to-no configuration solution for obfuscating sensitive data in your database.
45
+ prerelease: false
46
+ version_requirements: *70280857853440
47
+ - !ruby/object:Gem::Dependency
48
+ name: progressbar
49
+ requirement: &70280857853000 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *70280857853000
58
+ description: Low-to-no configuration solution for obfuscating sensitive data in your
59
+ database.
49
60
  email: mark@quarternotecoda.com
50
61
  executables: []
51
-
52
62
  extensions: []
53
-
54
63
  extra_rdoc_files: []
55
-
56
- files:
64
+ files:
57
65
  - lib/generators/omelettes/config/config_generator.rb
58
66
  - lib/generators/omelettes/config/templates/omelettes.rb
59
67
  - lib/generators/omelettes/config/USAGE
@@ -78,30 +86,29 @@ files:
78
86
  - init.rb
79
87
  homepage: http://github.com/marksim/omelettes
80
88
  licenses: []
81
-
82
89
  post_install_message:
83
90
  rdoc_options: []
84
-
85
- require_paths:
91
+ require_paths:
86
92
  - lib
87
- required_ruby_version: !ruby/object:Gem::Requirement
93
+ required_ruby_version: !ruby/object:Gem::Requirement
88
94
  none: false
89
- requirements:
90
- - - ">="
91
- - !ruby/object:Gem::Version
92
- version: "0"
93
- required_rubygems_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ segments:
100
+ - 0
101
+ hash: -4130218374050120156
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
103
  none: false
95
- requirements:
96
- - - ">="
97
- - !ruby/object:Gem::Version
104
+ requirements:
105
+ - - ! '>='
106
+ - !ruby/object:Gem::Version
98
107
  version: 1.3.4
99
108
  requirements: []
100
-
101
109
  rubyforge_project: omelettes
102
- rubygems_version: 1.8.4
110
+ rubygems_version: 1.8.10
103
111
  signing_key:
104
112
  specification_version: 3
105
113
  summary: Database obfuscation.
106
114
  test_files: []
107
-