pii_safe_schema 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e10cda981f36b6e67b9964dfbe011856436d48242844ed569dff0d6406607512
4
- data.tar.gz: dfc71c971b632a0cf124a2bf42a494cd1306e6b4a7178b4d3de085f45a6931cf
3
+ metadata.gz: 5a3fe6f6dc02bc520f523874f6111cb00dc9201687f0b7f668dc39e587080bda
4
+ data.tar.gz: c2f2bf99f36d65c806e9b74af88ab55a8c77291e5bd61883a36bd2b2bf2d6b1b
5
5
  SHA512:
6
- metadata.gz: 0e1c90b37fa8c3a70522bacb74b172855135878af97a355403e79325d8ed32a849f173015fcec844e5f3213715bacc5ba4ce18380550f667b92f9126940f821f
7
- data.tar.gz: c8044fb8a4d0065ed97625c93e04a7e82dad3ab338d6a878e0fb5839ea26b7d1b7b9f8fa5fddca8413010ddd46306bb4235314f242575ce698c3d8c9e66cbac9
6
+ metadata.gz: 539795ee77529477a46a52df234f0474f5d774f2ded25537520f20d023af8539c5643f3c859e3df56e3181591cea9b854b23030be1d5f4c9344dec6b3b7d7f29
7
+ data.tar.gz: 8ed9a5f69eeeca205128085268198732888632563922be5402129779074f314df3bf18ad54b17a859372fb90c2689a2b140352bd02f9fa9275950b75667deb67
@@ -3,7 +3,7 @@ version: 2
3
3
  defaults: &defaults
4
4
  working_directory: /home/circleci/wealthsimple
5
5
  docker:
6
- - image: circleci/ruby:2.6.0
6
+ - image: circleci/ruby:2.6.5
7
7
  - image: circleci/postgres:9.5.9-alpine
8
8
  environment:
9
9
  POSTGRES_USER: circleci
@@ -1 +1 @@
1
- 2.6.0
1
+ 2.6.5
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## 1.3.0 - 2019-11-04
8
+ ### Added
9
+ - Can pass explicitly annotate PII columns from the command line as arguments when using `rake pii_safe_schema:generate_migrations`.
10
+
7
11
  ## 1.2.0 - 2019-4-20
8
12
  ### Added
9
13
  - Can pass Datadog Client object as a configuration option.
data/README.md CHANGED
@@ -46,7 +46,7 @@ PiiSafeSchema.configure do |config|
46
46
  some_table: :*, # ignore the whole table
47
47
  some_other_table: [:column_1, :column_2] # just those columns
48
48
  }
49
-
49
+
50
50
  # Pass whatever instance you want here, but it must implement the method
51
51
  # #event(title, message, opts = {})
52
52
  # which is what datadog-statsd does:
@@ -60,12 +60,21 @@ end
60
60
 
61
61
  ## Generating Comment Migrations
62
62
 
63
- ```ruby
63
+ ```bash
64
64
  rake pii_safe_schema:generate_migrations
65
65
  ```
66
66
 
67
- This will generate one migration file for each table that should be commented.
68
- it will create a comment field for each column that it warns you about when you start a rails server or console.
67
+ This will generate one migration file for each table that should be commented. It will create a comment field for each column that it warns you about when you start a rails server or console.
68
+
69
+ ### Explicit annotations
70
+
71
+ If the generator fails to identify a PII column, you can specify explicitly what columns in what tables are PII. This is particularly useful if you're installed pii_safe_schema into an existing project.
72
+
73
+ ```bash
74
+ rake pii_safe_schema:generate_migrations [table:column:annotation_type] ...
75
+ ```
76
+
77
+ Run `rake pii_safe_schema:generate_migrations help` for details
69
78
 
70
79
  ## Credits
71
80
 
@@ -1,3 +1,4 @@
1
+ require 'pii_safe_schema/invalid_column_error'
1
2
  require 'pii_safe_schema/configuration'
2
3
  require 'pii_safe_schema/annotations'
3
4
  require 'pii_safe_schema/notify'
@@ -36,7 +37,56 @@ module PiiSafeSchema
36
37
  Rails.logger.info('PiiSafeSchema: No DB'.red)
37
38
  end
38
39
 
39
- def self.generate_migrations
40
- PiiSafeSchema::MigrationGenerator.generate_migrations(PiiSafeSchema::PiiColumn.all)
40
+ def self.generate_migrations(additional_pii_columns = [])
41
+ PiiSafeSchema::MigrationGenerator.generate_migrations(
42
+ PiiSafeSchema::PiiColumn.all + additional_pii_columns,
43
+ )
44
+ end
45
+
46
+ def self.parse_additional_columns(arguments)
47
+ arguments.map do |str|
48
+ matches = /([a-z_]+):([a-z_]+):([a-z_]+)/i.match(str)
49
+ return print_help! if matches.blank?
50
+
51
+ suggestion = Annotations.comment(matches[3])
52
+ return print_help! if suggestion.blank?
53
+
54
+ PiiColumn.from_column_name(table: matches[1], column: matches[2], suggestion: suggestion)
55
+ end
56
+ end
57
+
58
+ def self.print_help!(do_exit: true) # rubocop:disable Metrics/MethodLength
59
+ puts <<~HELPMSG # rubocop:disable Rails/Output
60
+ Usage:
61
+ rake pii_safe_schema:generate_migrations [table:column:annotation_type] ...
62
+
63
+ Arguments:
64
+ [table:column:annotation_type] # A column to manually annotate. Can be repeated.
65
+ # annotation_type can be "email", "phone", "ip_address",
66
+ # "geolocation", "address", "postal_code", "name",
67
+ # "sensitive_data", or "encrypted_data"
68
+
69
+ Description:
70
+ Generates a migration to add PII annotation comments to appropriate columns on a table.
71
+ Uses a series of regular expressions to find sensitive fields.
72
+
73
+ Optionally supply arguments to annotate columns explicitly
74
+
75
+ Example:
76
+ rake pii_safe_schema:generate_migrations signatures:signatory_name:name signatures:landline:phone
77
+
78
+ Will generate a migration with the following, assuming automatic regex had no matches:
79
+
80
+ class ChangeCommentsInSignatures < ActiveRecord::Migration[5.2]
81
+ def change
82
+ safety_assured do
83
+ change_column :signatures, :signatory_name, :string, comment: '{"pii":{"obfuscate":"name_obfuscator"}}'
84
+ change_column :signatures, :landline, :string, comment: '{"pii":{"obfuscate":"phone_obfuscator"}}'
85
+ end
86
+ end
87
+ end
88
+ HELPMSG
89
+
90
+ exit(1) if do_exit # rubocop:disable Rails/Exit
41
91
  end
42
92
  end
@@ -70,14 +70,18 @@ module PiiSafeSchema
70
70
  nil
71
71
  end
72
72
 
73
+ def self.comment(annotation_type)
74
+ COLUMNS.dig(annotation_type.to_sym, :comment)
75
+ end
76
+
73
77
  def apply_recommendation?(column, pii_info)
74
78
  !encrypted?(column) &&
75
- pii_info[:regexp].match(column.name) &&
79
+ pii_info[:regexp].match?(column.name) &&
76
80
  column.comment != pii_info[:comment].to_json
77
81
  end
78
82
 
79
83
  def encrypted?(column)
80
- COLUMNS[:encrypted_data][:regexp].match(column.name)
84
+ COLUMNS[:encrypted_data][:regexp].match?(column.name)
81
85
  end
82
86
 
83
87
  def apply_encrypted_recommendation?(column)
@@ -0,0 +1,4 @@
1
+ module PiiSafeSchema
2
+ class InvalidColumnError < StandardError
3
+ end
4
+ end
@@ -3,10 +3,6 @@ module PiiSafeSchema
3
3
  extend PiiSafeSchema::Annotations
4
4
  attr_reader :table, :column, :suggestion
5
5
 
6
- def self.all
7
- find_and_create
8
- end
9
-
10
6
  def initialize(table:, column:, suggestion:)
11
7
  @table = table.to_sym
12
8
  @column = column
@@ -14,6 +10,18 @@ module PiiSafeSchema
14
10
  end
15
11
 
16
12
  class << self
13
+ def all
14
+ find_and_create
15
+ end
16
+
17
+ def from_column_name(table:, column:, suggestion:)
18
+ unless connection.columns(table.to_s).find { |c| c.name == column.to_s }
19
+ raise InvalidColumnError, "column \"#{column}\" does not exist for table \"#{table}\""
20
+ end
21
+
22
+ new(table: table, column: column, suggestion: suggestion)
23
+ end
24
+
17
25
  private
18
26
 
19
27
  def find_and_create
@@ -1,3 +1,3 @@
1
1
  module PiiSafeSchema
2
- VERSION = '1.2.0'.freeze
2
+ VERSION = '1.3.0'.freeze
3
3
  end
@@ -1,5 +1,25 @@
1
1
  namespace :pii_safe_schema do
2
2
  task generate_migrations: :environment do
3
- PiiSafeSchema.generate_migrations
3
+ PiiSafeSchema.print_help! if ARGV[2] == 'help'
4
+
5
+ if ARGV.length == 1
6
+ PiiSafeSchema.generate_migrations
7
+ else
8
+ additional_columns = PiiSafeSchema.parse_additional_columns(ARGV[1..])
9
+ PiiSafeSchema.generate_migrations(additional_columns)
10
+ end
11
+
12
+ rescue ActiveRecord::StatementInvalid, PiiSafeSchema::InvalidColumnError => e
13
+ raise e if e.class == ActiveRecord::StatementInvalid && e.cause.class != PG::UndefinedTable
14
+
15
+ puts <<~HEREDOC
16
+ Unable to generate PII annotation migration. Either the underlying table or column does not exist:
17
+
18
+ #{e.message}
19
+
20
+ Please create the table & columns first, running their migrations, before attempting to use the pii_safe_schema generator.
21
+ HEREDOC
22
+ ensure
23
+ exit(0) # forces rake to stop after this and not assume args are tasks
4
24
  end
5
25
  end
@@ -19,9 +19,9 @@ Gem::Specification.new do |s|
19
19
  s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  s.require_paths = ['lib']
21
21
 
22
- s.add_dependency 'activesupport', '>= 5'
22
+ s.add_dependency 'activesupport', '>= 5', '< 7'
23
23
  s.add_dependency 'colorize'
24
- s.add_dependency 'rails', '>= 5'
24
+ s.add_dependency 'rails', '>= 5', '< 7'
25
25
 
26
26
  s.add_development_dependency 'bundler', '>= 1.16'
27
27
  s.add_development_dependency 'bundler-audit'
@@ -30,13 +30,14 @@ Gem::Specification.new do |s|
30
30
  s.add_development_dependency 'git'
31
31
  s.add_development_dependency 'guard-rspec'
32
32
  s.add_development_dependency 'pry'
33
+ s.add_development_dependency 'rails', '>= 5.2.3', '< 7'
33
34
  s.add_development_dependency 'rake', '>= 10.0'
34
35
  s.add_development_dependency 'rspec', '< 4', '>= 3.0'
35
36
  s.add_development_dependency 'rspec-collection_matchers'
36
37
  s.add_development_dependency 'rspec-its'
37
38
  s.add_development_dependency 'rubocop'
38
39
  s.add_development_dependency 'simplecov'
39
- s.add_development_dependency 'sqlite3-ruby'
40
+ s.add_development_dependency 'sqlite3'
40
41
  s.add_development_dependency 'ws-style'
41
42
 
42
43
  # Required by activerecord-safer_migrations
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pii_safe_schema
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexi Garrow
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-04-20 00:00:00.000000000 Z
11
+ date: 2019-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -17,6 +17,9 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '5'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '7'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,6 +27,9 @@ dependencies:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: '5'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '7'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: colorize
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -45,6 +51,9 @@ dependencies:
45
51
  - - ">="
46
52
  - !ruby/object:Gem::Version
47
53
  version: '5'
54
+ - - "<"
55
+ - !ruby/object:Gem::Version
56
+ version: '7'
48
57
  type: :runtime
49
58
  prerelease: false
50
59
  version_requirements: !ruby/object:Gem::Requirement
@@ -52,6 +61,9 @@ dependencies:
52
61
  - - ">="
53
62
  - !ruby/object:Gem::Version
54
63
  version: '5'
64
+ - - "<"
65
+ - !ruby/object:Gem::Version
66
+ version: '7'
55
67
  - !ruby/object:Gem::Dependency
56
68
  name: bundler
57
69
  requirement: !ruby/object:Gem::Requirement
@@ -150,6 +162,26 @@ dependencies:
150
162
  - - ">="
151
163
  - !ruby/object:Gem::Version
152
164
  version: '0'
165
+ - !ruby/object:Gem::Dependency
166
+ name: rails
167
+ requirement: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: 5.2.3
172
+ - - "<"
173
+ - !ruby/object:Gem::Version
174
+ version: '7'
175
+ type: :development
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: 5.2.3
182
+ - - "<"
183
+ - !ruby/object:Gem::Version
184
+ version: '7'
153
185
  - !ruby/object:Gem::Dependency
154
186
  name: rake
155
187
  requirement: !ruby/object:Gem::Requirement
@@ -241,7 +273,7 @@ dependencies:
241
273
  - !ruby/object:Gem::Version
242
274
  version: '0'
243
275
  - !ruby/object:Gem::Dependency
244
- name: sqlite3-ruby
276
+ name: sqlite3
245
277
  requirement: !ruby/object:Gem::Requirement
246
278
  requirements:
247
279
  - - ">="
@@ -320,6 +352,7 @@ files:
320
352
  - lib/pii_safe_schema.rb
321
353
  - lib/pii_safe_schema/annotations.rb
322
354
  - lib/pii_safe_schema/configuration.rb
355
+ - lib/pii_safe_schema/invalid_column_error.rb
323
356
  - lib/pii_safe_schema/migration_generator.rb
324
357
  - lib/pii_safe_schema/notifiers/data_dog.rb
325
358
  - lib/pii_safe_schema/notifiers/std_out.rb
@@ -347,7 +380,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
347
380
  - !ruby/object:Gem::Version
348
381
  version: '0'
349
382
  requirements: []
350
- rubygems_version: 3.0.1
383
+ rubygems_version: 3.0.3
351
384
  signing_key:
352
385
  specification_version: 4
353
386
  summary: Schema migration tool for checking and adding comments on PII columns.