ip_anonymizer 0.1.0 → 0.2.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: dca65ff3aed9d29044a1e20925670a110aff00a527071991a5bfa9ba5cb9b269
4
- data.tar.gz: ed6c97bd345eae2ac1ecabe9e1cb8db434d79a5df4dc99cdd2e561de91a42db7
3
+ metadata.gz: f454e201a3d9c2f4289e2b0c6e367bffbed093f74dbcc6feeb1325ca39aa7a84
4
+ data.tar.gz: 312f1dcaf7e753febe323c9aed56b5847d1c1bfba84a2231fa79b73e34d8ec5a
5
5
  SHA512:
6
- metadata.gz: 565e3cbbe4d119a859de314d7b658f810ba53e513bb1b92f54652ba2baa936b0dcba8ac83acc761b32b98a04ca62b3b52b192d7ba0a597027a18741c46207fa8
7
- data.tar.gz: 9321631e81f1510de578f2b9298f5c1998270e0ee6c938c559ca2309cc8a61d9f55e997187dee36cc61c18c6a167dda9b2754332138e2e471da06ea8ad95b60e
6
+ metadata.gz: 8e5ad0bba1c72b3753e4b9218af6139df2cc0833cb3334e7b508740771ae6d3e3201773674ee2442d242807bf943cd46d93e75ce85271fb8a13fb7e499245ea0
7
+ data.tar.gz: e800b290819f4854464d21bd73451a2a5c39ea5598155267323c34a59552f3efb1139eb4881b2a2e952f08b4435c07e2113ababf85061da9e399d9d89365fa38
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
- ## 0.1.0
1
+ ## 0.2.0 (2022-10-09)
2
+
3
+ - Dropped support for Ruby < 2.7
4
+
5
+ ## 0.1.1 (2018-05-11)
6
+
7
+ - Better performance when IP not needed
8
+
9
+ ## 0.1.0 (2018-05-05)
2
10
 
3
11
  - First release
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2018 Andrew
3
+ Copyright (c) 2018-2022 Andrew Kane
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,15 +1,19 @@
1
1
  # IP Anonymizer
2
2
 
3
- :earth_americas: IP address anonymizer for Ruby
3
+ :earth_americas: IP address anonymizer for Ruby and Rails
4
4
 
5
- Works with IPv4 and IPv6, and includes middleware for Rails
5
+ Works with IPv4 and IPv6
6
+
7
+ Designed to help with [GDPR](https://en.wikipedia.org/wiki/General_Data_Protection_Regulation) compliance
8
+
9
+ [![Build Status](https://github.com/ankane/ip_anonymizer/workflows/build/badge.svg?branch=master)](https://github.com/ankane/ip_anonymizer/actions)
6
10
 
7
11
  ## Getting Started
8
12
 
9
13
  Add these lines to your application’s Gemfile:
10
14
 
11
15
  ```ruby
12
- gem 'ip_anonymizer'
16
+ gem "ip_anonymizer"
13
17
  ```
14
18
 
15
19
  There are two strategies for anonymizing IPs.
@@ -18,8 +22,8 @@ There are two strategies for anonymizing IPs.
18
22
 
19
23
  This is the approach [Google Analytics uses for IP anonymization](https://support.google.com/analytics/answer/2763052):
20
24
 
21
- - For IPv4, the last octet is set to 0
22
- - For IPv6, the last 80 bits are set to zeros
25
+ - For IPv4, set the last octet to 0
26
+ - For IPv6, set the last 80 bits to zeros
23
27
 
24
28
  ```ruby
25
29
  IpAnonymizer.mask_ip("8.8.4.4")
@@ -29,7 +33,7 @@ IpAnonymizer.mask_ip("2001:4860:4860:0:0:0:0:8844")
29
33
  # => "2001:4860:4860::"
30
34
  ```
31
35
 
32
- An advantange of this approach is geocoding will still work, only with slightly less accuracy.
36
+ An advantange of this approach is geocoding will still work, only with slightly less accuracy. A potential disadvantage is different IPs will have the same mask (`8.8.4.4` and `8.8.4.5` both become `8.8.4.0`).
33
37
 
34
38
  ### Hashing
35
39
 
@@ -43,7 +47,13 @@ IpAnonymizer.hash_ip("2001:4860:4860:0:0:0:0:8844", key: "secret")
43
47
  # => "f6e4:a4fe:32dc:2f39:3e47:84cc:e85e:865c"
44
48
  ```
45
49
 
46
- Be sure to keep the key secret, or else a rainbow table can be constructed.
50
+ An advantage of this approach is different IPs will have different hashes (with the exception of collisions).
51
+
52
+ Make sure the key is kept secret and at least 30 random characters. Otherwise, a rainbow table can be constructed. You can generate a good key with:
53
+
54
+ ```ruby
55
+ SecureRandom.hex(32)
56
+ ```
47
57
 
48
58
  ## Rails
49
59
 
@@ -61,6 +71,10 @@ For hashing, use:
61
71
  config.middleware.insert_after ActionDispatch::RemoteIp, IpAnonymizer::HashIp, key: "secret"
62
72
  ```
63
73
 
74
+ ## Related Projects
75
+
76
+ - [Logstop](https://github.com/ankane/logstop) - Keep personally identifiable information (PII) out of your logs
77
+
64
78
  ## History
65
79
 
66
80
  View the [changelog](https://github.com/ankane/ip_anonymizer/blob/master/CHANGELOG.md)
@@ -74,11 +88,11 @@ Everyone is encouraged to help improve this project. Here are a few ways you can
74
88
  - Write, clarify, or fix documentation
75
89
  - Suggest or add new features
76
90
 
77
- To get started with development and testing:
91
+ To get started with development:
78
92
 
79
93
  ```sh
80
94
  git clone https://github.com/ankane/ip_anonymizer.git
81
95
  cd ip_anonymizer
82
96
  bundle install
83
- rake test
97
+ bundle exec rake test
84
98
  ```
@@ -7,9 +7,20 @@ module IpAnonymizer
7
7
 
8
8
  def call(env)
9
9
  req = ActionDispatch::Request.new(env)
10
- # TODO lazy load, like ActionDispatch::RemoteIp
11
- req.remote_ip = IpAnonymizer.hash_ip(req.remote_ip, key: @key)
10
+ # get header directly to preserve ActionDispatch::RemoteIp lazy loading
11
+ req.remote_ip = GetIp.new(req.get_header("action_dispatch.remote_ip".freeze), @key)
12
12
  @app.call(req.env)
13
13
  end
14
+
15
+ class GetIp
16
+ def initialize(remote_ip, key)
17
+ @remote_ip = remote_ip
18
+ @key = key
19
+ end
20
+
21
+ def to_s
22
+ @ip ||= IpAnonymizer.hash_ip(@remote_ip, key: @key)
23
+ end
24
+ end
14
25
  end
15
26
  end
@@ -6,9 +6,19 @@ module IpAnonymizer
6
6
 
7
7
  def call(env)
8
8
  req = ActionDispatch::Request.new(env)
9
- # TODO lazy load, like ActionDispatch::RemoteIp
10
- req.remote_ip = IpAnonymizer.mask_ip(req.remote_ip)
9
+ # get header directly to preserve ActionDispatch::RemoteIp lazy loading
10
+ req.remote_ip = GetIp.new(req.get_header("action_dispatch.remote_ip".freeze))
11
11
  @app.call(req.env)
12
12
  end
13
+
14
+ class GetIp
15
+ def initialize(remote_ip)
16
+ @remote_ip = remote_ip
17
+ end
18
+
19
+ def to_s
20
+ @ip ||= IpAnonymizer.mask_ip(@remote_ip)
21
+ end
22
+ end
13
23
  end
14
24
  end
@@ -1,3 +1,3 @@
1
1
  module IpAnonymizer
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/ip_anonymizer.rb CHANGED
@@ -1,13 +1,15 @@
1
+ # stdlib
1
2
  require "ipaddr"
2
3
  require "openssl"
3
4
 
5
+ # modules
4
6
  require "ip_anonymizer/hash_ip"
5
7
  require "ip_anonymizer/mask_ip"
6
8
  require "ip_anonymizer/version"
7
9
 
8
10
  module IpAnonymizer
9
11
  def self.mask_ip(ip)
10
- addr = IPAddr.new(ip)
12
+ addr = IPAddr.new(ip.to_s)
11
13
  if addr.ipv4?
12
14
  # set last octet to 0
13
15
  addr.mask(24).to_s
@@ -18,7 +20,7 @@ module IpAnonymizer
18
20
  end
19
21
 
20
22
  def self.hash_ip(ip, key:, iterations: 1)
21
- addr = IPAddr.new(ip)
23
+ addr = IPAddr.new(ip.to_s)
22
24
  key_len = addr.ipv4? ? 4 : 16
23
25
  family = addr.ipv4? ? Socket::AF_INET : Socket::AF_INET6
24
26
 
metadata CHANGED
@@ -1,87 +1,24 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ip_anonymizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
- autorequire:
9
- bindir: exe
8
+ autorequire:
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-06 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: benchmark-ips
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: minitest
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: rake
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
- description:
70
- email:
71
- - andrew@chartkick.com
11
+ date: 2022-10-10 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email: andrew@ankane.org
72
15
  executables: []
73
16
  extensions: []
74
17
  extra_rdoc_files: []
75
18
  files:
76
- - ".gitignore"
77
- - ".travis.yml"
78
19
  - CHANGELOG.md
79
- - Gemfile
80
- - Gemfile.lock
81
20
  - LICENSE.txt
82
21
  - README.md
83
- - Rakefile
84
- - ip_anonymizer.gemspec
85
22
  - lib/ip_anonymizer.rb
86
23
  - lib/ip_anonymizer/hash_ip.rb
87
24
  - lib/ip_anonymizer/mask_ip.rb
@@ -90,7 +27,7 @@ homepage: https://github.com/ankane/ip_anonymizer
90
27
  licenses:
91
28
  - MIT
92
29
  metadata: {}
93
- post_install_message:
30
+ post_install_message:
94
31
  rdoc_options: []
95
32
  require_paths:
96
33
  - lib
@@ -98,16 +35,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
98
35
  requirements:
99
36
  - - ">="
100
37
  - !ruby/object:Gem::Version
101
- version: 2.2.0
38
+ version: '2.7'
102
39
  required_rubygems_version: !ruby/object:Gem::Requirement
103
40
  requirements:
104
41
  - - ">="
105
42
  - !ruby/object:Gem::Version
106
43
  version: '0'
107
44
  requirements: []
108
- rubyforge_project:
109
- rubygems_version: 2.7.6
110
- signing_key:
45
+ rubygems_version: 3.3.7
46
+ signing_key:
111
47
  specification_version: 4
112
- summary: IP address anonymizer for Ruby
48
+ summary: IP address anonymizer for Ruby and Rails
113
49
  test_files: []
data/.gitignore DELETED
@@ -1,8 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /_yardoc/
4
- /coverage/
5
- /doc/
6
- /pkg/
7
- /spec/reports/
8
- /tmp/
data/.travis.yml DELETED
@@ -1,11 +0,0 @@
1
- language: ruby
2
- rvm: 2.5.1
3
- gemfile:
4
- - Gemfile
5
- sudo: false
6
- before_install: gem install bundler
7
- script: bundle exec rake test
8
- notifications:
9
- email:
10
- on_success: never
11
- on_failure: change
data/Gemfile DELETED
@@ -1,6 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
-
5
- # Specify your gem's dependencies in ip_anonymizer.gemspec
6
- gemspec
data/Gemfile.lock DELETED
@@ -1,24 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- ip_anonymizer (0.1.0)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- benchmark-ips (2.7.2)
10
- minitest (5.11.3)
11
- rake (12.3.1)
12
-
13
- PLATFORMS
14
- ruby
15
-
16
- DEPENDENCIES
17
- benchmark-ips
18
- bundler
19
- ip_anonymizer!
20
- minitest
21
- rake
22
-
23
- BUNDLED WITH
24
- 1.16.1
data/Rakefile DELETED
@@ -1,19 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
3
- require "benchmark/ips"
4
-
5
- Rake::TestTask.new(:test) do |t|
6
- t.libs << "test"
7
- t.libs << "lib"
8
- t.test_files = FileList["test/**/*_test.rb"]
9
- end
10
-
11
- task default: :test
12
-
13
- task :benchmark do
14
- require "ip_anonymizer"
15
- Benchmark.ips do |x|
16
- x.report("mask_ip") { IpAnonymizer.mask_ip("8.8.4.4") }
17
- x.report("hash_ip") { IpAnonymizer.hash_ip("8.8.4.4", key: "secret") }
18
- end
19
- end
@@ -1,29 +0,0 @@
1
-
2
- lib = File.expand_path("../lib", __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "ip_anonymizer/version"
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "ip_anonymizer"
8
- spec.version = IpAnonymizer::VERSION
9
- spec.authors = ["Andrew Kane"]
10
- spec.email = ["andrew@chartkick.com"]
11
-
12
- spec.summary = "IP address anonymizer for Ruby"
13
- spec.homepage = "https://github.com/ankane/ip_anonymizer"
14
- spec.license = "MIT"
15
-
16
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
- f.match(%r{^(test|spec|features)/})
18
- end
19
- spec.bindir = "exe"
20
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
- spec.require_paths = ["lib"]
22
-
23
- spec.required_ruby_version = ">= 2.2.0"
24
-
25
- spec.add_development_dependency "benchmark-ips"
26
- spec.add_development_dependency "bundler"
27
- spec.add_development_dependency "minitest"
28
- spec.add_development_dependency "rake"
29
- end