database_anonymizer 0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 70d1aa4ae504021382a9c6745510718ef87bf21e
4
+ data.tar.gz: 331fb255934633a0ecab771d463302f59bb85ed0
5
+ SHA512:
6
+ metadata.gz: 7f1a06f5ac4f602eac5603f014c6ec3c6eda063a7ac1296a08f567eeb18b8614763050c5290238449a12e36a4b068ac4258bfb31f11e43c30b7a08e32a767c61
7
+ data.tar.gz: 3fb405c32fe52613f485bcf1f949e7a6857b879284a12a3c452013254c8f8b1443cf40e5f4db3ba2ce5310f5d1cad83ccc030bf54419f2f6e8fe6894eb5a051b
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2015 Shingo Kawamura
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,77 @@
1
+ # DatabaseAnonymizer
2
+ A database anonymizer for Rails 4+
3
+
4
+ ## Installation
5
+
6
+ Put this line in your Gemfile:
7
+
8
+ ```ruby
9
+ gem 'database_anonymizer'
10
+ ```
11
+
12
+ Then bundle:
13
+
14
+ ```sh
15
+ $ bundle
16
+ ```
17
+
18
+ Create `config/database_anonymizer/whitelist.yml` by:
19
+
20
+ ```sh
21
+ $ bin/rails generate database_anonymizer:install
22
+ ```
23
+
24
+ Then, only string or text type column table structures are created.
25
+
26
+ ## Usage
27
+
28
+ See below sample `config/database_anonymizer/whitelist.yml` file.
29
+
30
+ ```yml
31
+ 'User':
32
+ # name:
33
+ email:
34
+ anonymized_by: User.anonymize_email
35
+ # address:
36
+ # tel:
37
+ remarks:
38
+ anonymized_by: nil
39
+ # comment:
40
+ ```
41
+
42
+ ### Asteriskize
43
+ if a column is commented out,
44
+ the column will be replaced by asterisks.
45
+
46
+ Default asterisks size is 8.
47
+
48
+ If `validate_length_of` is present, the number of asterisks size may not be 8.
49
+ For details, see the method `asterisk_length` at `lib/database_anonymizer/metamorphosis.rb`.
50
+
51
+ ### Anonymize
52
+ If a column needs a specific anonymizer,
53
+ remove `#`, and add `anonymized_by: Model.anonymize_method`.
54
+ You have to define your own anonymize method.
55
+
56
+ ### Do Nothing
57
+ If a column don't need to be asteriskized or anonymized,
58
+ remove `#`, and add `anonymized_by: nil`.
59
+
60
+ ### Run rake task
61
+
62
+ Finally, run below rake task:
63
+
64
+ ```sh
65
+ $ RAILS_ENV=TARGET_ENV bin/rake database_anonymizer:execute
66
+ ```
67
+
68
+ ## Specification
69
+ If `RAILS_ENV` is production,`bin/rake database_anonymizer:execute` fails.
70
+
71
+ ## Contributing
72
+
73
+ 1. Fork it ( https://github.com/blp1526/database_anonymizer/fork )
74
+ 1. Create your feature branch (`git checkout -b my-new-feature`)
75
+ 1. Commit your changes (`git commit -am 'Add some feature'`)
76
+ 1. Push to the branch (`git push origin my-new-feature`)
77
+ 1. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,5 @@
1
+ module DatabaseAnonymizer
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace DatabaseAnonymizer
4
+ end
5
+ end
@@ -0,0 +1,113 @@
1
+ module DatabaseAnonymizer
2
+ class Metamorphosis
3
+ DEFAULT_ASTERISK_LENGTH = 8
4
+
5
+ attr_reader :model
6
+
7
+ def self.prepare_for_rake
8
+ Rails.application.eager_load!
9
+ ActiveRecord::Base.clear_cache!
10
+ end
11
+
12
+ def self.whitelist_path
13
+ File.join(Rails.root, 'config', 'database_anonymizer', 'whitelist.yml')
14
+ end
15
+
16
+ def self.whitelist
17
+ YAML.load_file(whitelist_path).respond_to?(:deep_symbolize_keys) ? YAML.load_file(whitelist_path).deep_symbolize_keys : {}
18
+ end
19
+
20
+ def self.table_existing_active_record_inheritors
21
+ ActiveRecord::Base.descendants.reject do |d|
22
+ !d.superclass.eql?(ActiveRecord::Base) || d.eql?(ActiveRecord::SchemaMigration) || !d.table_exists?
23
+ end
24
+ end
25
+
26
+ def self.targets
27
+ table_existing_active_record_inheritors.map { |model| new(model) }
28
+ end
29
+
30
+ def self.execute
31
+ asteriskize
32
+ anonymize
33
+ end
34
+
35
+ def self.asteriskize
36
+ case ActiveRecord::Base.configurations[Rails.env]['adapter']
37
+ when 'mysql2'
38
+ targets.each(&:mysql_asteriskize)
39
+ else
40
+ targets.each(&:general_asteriskize)
41
+ end
42
+ end
43
+
44
+ def self.anonymize
45
+ fail DangerousRailsEnvError if Rails.env == 'production'
46
+ whitelist.keys.each do |model_name|
47
+ whitelist[model_name].each do |column, details|
48
+ anonymize_log(model_name, column) { eval(details[:anonymized_by]) }
49
+ end
50
+ end
51
+ end
52
+
53
+ def self.anonymize_log(model_name, column)
54
+ ActiveRecord::Migration.say_with_time "anonymize for #{model_name}##{column} start..." do
55
+ yield
56
+ puts "-- anonymize for #{model_name}##{column} completed!"
57
+ end
58
+ end
59
+
60
+ def initialize(model)
61
+ @model = model
62
+ end
63
+
64
+ def string_or_text_column_names
65
+ model.columns.select { |column| [:string, :text].include?(column.type) }.map { |c| c.name.to_sym }
66
+ end
67
+
68
+ def unwhitelist_column_names
69
+ string_or_text_column_names.select { |column_name| self.class.whitelist[model.to_s.to_sym].try!(:[], column_name).nil? }
70
+ end
71
+
72
+ def length_validator(column_name)
73
+ model.validators_on(column_name).find { |validator| validator.class.eql?(ActiveModel::Validations::LengthValidator) }
74
+ end
75
+
76
+ def asterisk_length(column_length_validator)
77
+ length = DEFAULT_ASTERISK_LENGTH
78
+ return length unless column_length_validator
79
+ length = column_length_validator.options[:minimum] if column_length_validator.options[:minimum]
80
+ if column_length_validator.options[:maximum] && length > column_length_validator.options[:maximum]
81
+ length = column_length_validator.options[:maximum]
82
+ end
83
+ length
84
+ end
85
+
86
+ def mysql_update_query(column_name)
87
+ # NOTE: If a column name is same as MySQL reserved words, backquote is needed.
88
+ "UPDATE #{model.table_name} SET `#{column_name}`='#{'*' * asterisk_length(length_validator(column_name))}' WHERE `#{column_name}` LIKE '%_%'"
89
+ end
90
+
91
+ def mysql_asteriskize
92
+ fail DangerousRailsEnvError if Rails.env == 'production'
93
+ unwhitelist_column_names.each do |column_name|
94
+ ActiveRecord::Base.connection.execute(mysql_update_query(column_name))
95
+ end
96
+ end
97
+
98
+ def general_asteriskize
99
+ fail DangerousRailsEnvError if Rails.env == 'production'
100
+ model.unscoped.find_each { |instance| instance.update!(asteriskize_params(instance)) }
101
+ end
102
+
103
+ private
104
+
105
+ def asteriskize_params(instance)
106
+ unwhitelist_column_names.each_with_object({}) do |column_name, obj|
107
+ obj[column_name] = ('*' * asterisk_length(length_validator(column_name))) if instance.__send__(column_name)
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ class DangerousRailsEnvError < StandardError; end
@@ -0,0 +1,3 @@
1
+ module DatabaseAnonymizer
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,5 @@
1
+ require 'database_anonymizer/engine'
2
+ require 'database_anonymizer/metamorphosis'
3
+
4
+ module DatabaseAnonymizer
5
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ install database_anonymizer file
3
+
4
+ Example:
5
+ rails generate database_anonymizer:install
6
+
7
+ This will create:
8
+ config/database_anonymizer/whitelist.yml
@@ -0,0 +1,9 @@
1
+ require 'database_anonymizer/metamorphosis'
2
+
3
+ class DatabaseAnonymizer::InstallGenerator < Rails::Generators::Base
4
+ source_root File.expand_path('../templates', __FILE__)
5
+
6
+ def copy_initializer_file
7
+ template 'whitelist.yml.erb', File.join('config', 'database_anonymizer', 'whitelist.yml')
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ <% DatabaseAnonymizer::Metamorphosis.prepare_for_rake -%>
2
+ <% DatabaseAnonymizer::Metamorphosis.targets.each do |target| -%>
3
+ <%= "# '#{target.model.name}':" %>
4
+ <% target.string_or_text_column_names.each do |column_name| -%>
5
+ <%= "# #{column_name}:" %>
6
+ <%- end %>
7
+ <% end -%>
@@ -0,0 +1,13 @@
1
+ require 'database_anonymizer/metamorphosis'
2
+
3
+ namespace :database_anonymizer do
4
+ desc 'anonymize records'
5
+ task execute: :environment do
6
+ ActiveRecord::Migration.say_with_time 'database_anonymizer:execute start...' do
7
+ DatabaseAnonymizer::Metamorphosis.prepare_for_rake
8
+ DatabaseAnonymizer::Metamorphosis.execute
9
+ puts 'database_anonymizer:execute finished!'
10
+ puts 'total time'
11
+ end
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: database_anonymizer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Shingo Kawamura
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-10-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.0
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 4.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: mysql2
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "<"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.4'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "<"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.4'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry-rails
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec-rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: factory_girl_rails
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: A database anonymizer for Rails 4+
84
+ email:
85
+ - blp1526@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - MIT-LICENSE
91
+ - README.md
92
+ - Rakefile
93
+ - lib/database_anonymizer.rb
94
+ - lib/database_anonymizer/engine.rb
95
+ - lib/database_anonymizer/metamorphosis.rb
96
+ - lib/database_anonymizer/version.rb
97
+ - lib/generators/database_anonymizer/install/USAGE
98
+ - lib/generators/database_anonymizer/install/install_generator.rb
99
+ - lib/generators/database_anonymizer/install/templates/whitelist.yml.erb
100
+ - lib/tasks/database_anonymizer_tasks.rake
101
+ homepage: https://github.com/blp1526/database_anonymizer
102
+ licenses:
103
+ - MIT
104
+ metadata: {}
105
+ post_install_message:
106
+ rdoc_options: []
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ requirements: []
120
+ rubyforge_project:
121
+ rubygems_version: 2.2.2
122
+ signing_key:
123
+ specification_version: 4
124
+ summary: A database anonymizer for Rails 4+
125
+ test_files: []