pii_scrubber 0.1.0

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.
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "securerandom"
4
+ require_relative "vault/session"
5
+
6
+ module PiiScrubber
7
+ class Vault
8
+ attr_reader :config
9
+
10
+ def initialize(config = PiiScrubber.configuration)
11
+ @config = config
12
+ end
13
+
14
+ def self.anonymize(data, **options)
15
+ new.anonymize(data, **options)
16
+ end
17
+
18
+ def anonymize(data, **override_options)
19
+ mappings = {}
20
+ anonymized_data = anonymize_node(data, mappings: mappings, options: override_options)
21
+ Session.new(text: anonymized_data, mappings: mappings)
22
+ end
23
+
24
+ private
25
+
26
+ def anonymize_node(data, mappings:, options:)
27
+ case data
28
+ when String
29
+ anonymize_string(data, mappings: mappings, options: options)
30
+ when Hash
31
+ data.each_with_object({}) do |(key, value), acc|
32
+ acc[key] = anonymize_node(value, mappings: mappings, options: options)
33
+ end
34
+ when Array
35
+ data.map { |item| anonymize_node(item, mappings: mappings, options: options) }
36
+ else
37
+ data
38
+ end
39
+ end
40
+
41
+ def anonymize_string(str, mappings:, options:)
42
+ return str if str.nil? || str.empty?
43
+
44
+ result = str.dup
45
+ scrubber = Scrubber.new(config)
46
+ detectors = scrubber.send(:build_detectors)
47
+
48
+ detectors.each do |detector|
49
+ detector.patterns.each do |pattern|
50
+ result.gsub!(pattern) do |match|
51
+ if detector.valid?(match)
52
+ placeholder = generate_placeholder(detector.name)
53
+ mappings[placeholder] = match
54
+ placeholder
55
+ else
56
+ match
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ result
63
+ end
64
+
65
+ def generate_placeholder(detector_name)
66
+ short_id = SecureRandom.hex(4)
67
+ "[PII_VAULT_#{detector_name.to_s.upcase}_#{short_id}]"
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PiiScrubber
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "pii_scrubber/version"
4
+ require_relative "pii_scrubber/configuration"
5
+ require_relative "pii_scrubber/detectors/base"
6
+ require_relative "pii_scrubber/detectors/email"
7
+ require_relative "pii_scrubber/detectors/phone"
8
+ require_relative "pii_scrubber/detectors/credit_card"
9
+ require_relative "pii_scrubber/detectors/ssn"
10
+ require_relative "pii_scrubber/detectors/api_key"
11
+ require_relative "pii_scrubber/detectors/ip_address"
12
+ require_relative "pii_scrubber/detectors/iban"
13
+ require_relative "pii_scrubber/detectors/uk_nino"
14
+ require_relative "pii_scrubber/detectors/canadian_sin"
15
+ require_relative "pii_scrubber/detectors/indian_pan"
16
+ require_relative "pii_scrubber/detectors/indian_aadhaar"
17
+ require_relative "pii_scrubber/detectors/database_url"
18
+ require_relative "pii_scrubber/scrubber"
19
+ require_relative "pii_scrubber/integrations/logger_formatter"
20
+ require_relative "pii_scrubber/integrations/faraday_middleware"
21
+ require_relative "pii_scrubber/integrations/rack_middleware"
22
+ require_relative "pii_scrubber/vault"
23
+
24
+ module PiiScrubber
25
+ class << self
26
+ def configuration
27
+ @configuration ||= Configuration.new
28
+ end
29
+
30
+ def configure
31
+ yield(configuration)
32
+ end
33
+
34
+ def reset_configuration!
35
+ @configuration = Configuration.new
36
+ end
37
+
38
+ def scrub(data, **options)
39
+ Scrubber.new(configuration).scrub(data, **options)
40
+ end
41
+
42
+ def anonymize(data, **options)
43
+ Vault.new(configuration).anonymize(data, **options)
44
+ end
45
+
46
+ def restore(data, session:)
47
+ session.restore(data)
48
+ end
49
+ end
50
+ end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pii_scrubber
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Pruthviraj Rathod
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: logger
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '1.4'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '1.4'
26
+ - !ruby/object:Gem::Dependency
27
+ name: bundler
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '2.0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '2.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rake
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '13.0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '13.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rspec
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.12'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.12'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rubocop
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '1.50'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '1.50'
82
+ description: Detects and sanitizes Personally Identifiable Information (emails, phone
83
+ numbers, credit cards, SSNs, IP addresses, IBANs, UK NINOs, Canadian SINs, Indian
84
+ PAN & Aadhaar) and API secrets / Database connection strings in strings, hashes,
85
+ logs, Faraday HTTP requests, and Rack. Features a bidirectional Vault for LLM prompt
86
+ anonymization and response restoration.
87
+ executables:
88
+ - pii_scrubber
89
+ extensions: []
90
+ extra_rdoc_files: []
91
+ files:
92
+ - LICENSE.txt
93
+ - README.md
94
+ - Rakefile
95
+ - exe/pii_scrubber
96
+ - lib/pii_scrubber.rb
97
+ - lib/pii_scrubber/configuration.rb
98
+ - lib/pii_scrubber/detectors/api_key.rb
99
+ - lib/pii_scrubber/detectors/base.rb
100
+ - lib/pii_scrubber/detectors/canadian_sin.rb
101
+ - lib/pii_scrubber/detectors/credit_card.rb
102
+ - lib/pii_scrubber/detectors/database_url.rb
103
+ - lib/pii_scrubber/detectors/email.rb
104
+ - lib/pii_scrubber/detectors/iban.rb
105
+ - lib/pii_scrubber/detectors/indian_aadhaar.rb
106
+ - lib/pii_scrubber/detectors/indian_pan.rb
107
+ - lib/pii_scrubber/detectors/ip_address.rb
108
+ - lib/pii_scrubber/detectors/phone.rb
109
+ - lib/pii_scrubber/detectors/ssn.rb
110
+ - lib/pii_scrubber/detectors/uk_nino.rb
111
+ - lib/pii_scrubber/integrations/faraday_middleware.rb
112
+ - lib/pii_scrubber/integrations/logger_formatter.rb
113
+ - lib/pii_scrubber/integrations/rack_middleware.rb
114
+ - lib/pii_scrubber/scrubber.rb
115
+ - lib/pii_scrubber/vault.rb
116
+ - lib/pii_scrubber/vault/session.rb
117
+ - lib/pii_scrubber/version.rb
118
+ homepage: https://github.com/pruthvirajrathod/pii_scrubber
119
+ licenses:
120
+ - MIT
121
+ metadata:
122
+ homepage_uri: https://github.com/pruthvirajrathod/pii_scrubber
123
+ source_code_uri: https://github.com/pruthvirajrathod/pii_scrubber
124
+ rdoc_options: []
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 3.0.0
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ requirements: []
138
+ rubygems_version: 4.0.18
139
+ specification_version: 4
140
+ summary: Fast, flexible international PII & secret redaction and reversible LLM anonymization
141
+ for Ruby and Rails.
142
+ test_files: []