cloudflare-rails 0.6.0 → 2.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 36383a493815fd8b730a9df1ad3c15971d093c05a01ed49b367f8e1cbec8ebfb
4
- data.tar.gz: 6d63be05883d0c1e03d8327662f974b93fb96895de1cf90443ead603641a29a4
3
+ metadata.gz: 19b8e746b7848a5f7939ac311619b2dc627ff07f2cdb6007ddbd71497be5d730
4
+ data.tar.gz: 991cb0373e17a7c80e8559122073037d3a67f6f81463db9370d9fe4bf3864c63
5
5
  SHA512:
6
- metadata.gz: ca4f1e277840208cb02a27f1e79053761e636d7d7ca31f7aebe75d9714cca8aac22233cc30bbe20c0d29b1fc8ed44413cf71ea7f3e77684fb7ecfdeebfeb26e1
7
- data.tar.gz: 28b93626c352d0dab043dd8cd90dc8ecc2f227cb3a98686ffa167c5c3741ec44e840038a108602763197dd7c003b857ae01d8b923da4f7e6c619b442e02511fe
6
+ metadata.gz: 7cfa2d90ec57a59bbaaad61332a90e987c6b7f076a9367139e90cd7d6f568f728dbb6774b37577b93ac5f7ee27cfc4991b3d55c77bf947be89afb3ee1f849db9
7
+ data.tar.gz: 8dde5529c4dc355ecefa04a1b75ed82efee4e27678d75e5f0de6c7106a2b8b2ba3c0d69eeb27d8bb254a94630bbacc31bd6d84973bb9a678f3598d03814ba542
data/.circleci/config.yml CHANGED
@@ -7,7 +7,7 @@ jobs:
7
7
  build:
8
8
  docker:
9
9
  # specify the version you desire here
10
- - image: circleci/ruby:2.6.3
10
+ - image: circleci/ruby:2.7.0
11
11
 
12
12
  working_directory: ~/repo
13
13
 
@@ -0,0 +1,8 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ time: "13:00"
8
+ open-pull-requests-limit: 10
data/.rspec CHANGED
@@ -1,4 +1,4 @@
1
1
  --format d
2
2
  --color
3
3
  --format RspecJunitFormatter
4
- --out tmp/rspec/rspec-<%= File.basename ENV['BUNDLE_GEMFILE'] %><%= ENV["RACK_ATTACK"] ? '-rack-attack' : '' %>.xml
4
+ --out tmp/rspec/rspec-<%= File.basename ENV['BUNDLE_GEMFILE'] %><%= ENV["RACK_ATTACK"] ? "-rack-attack-#{ENV["RACK_ATTACK"]}" : '' %>.xml
data/Appraisals CHANGED
@@ -1,15 +1,19 @@
1
1
  appraise "rails-5.0" do
2
- gem "rails", "5.0"
2
+ gem "rails", "~> 5.0.0"
3
3
  end
4
4
 
5
5
  appraise "rails-5.1" do
6
- gem "rails", "5.1"
6
+ gem "rails", "~> 5.1.0"
7
7
  end
8
8
 
9
9
  appraise "rails-5.2" do
10
- gem "rails", "5.2"
10
+ gem "rails", "~> 5.2.0"
11
11
  end
12
12
 
13
13
  appraise "rails-6.0" do
14
- gem "rails", "6.0.0.rc2"
14
+ gem "rails", "~> 6.0.0"
15
+ end
16
+
17
+ appraise "rails-6.1" do
18
+ gem "rails", "~> 6.1.0"
15
19
  end
data/CHANGELOG.md ADDED
@@ -0,0 +1,15 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+ ## [2.0.0] - 2021-02-17
9
+ ### Breaking Changes
10
+ - Removed broad dependency on `rails`, replaced with explicit dependencies for `railties`, `activesupport`, and `actionpack` ( [issue](https://github.com/modosc/cloudflare-rails/issues/34) and [pr](https://github.com/modosc/cloudflare-rails/pull/35))
11
+
12
+ ## [1.0.0] - 2020-09-29
13
+ ### Added
14
+
15
+ - Fix various [loading order issues](https://github.com/modosc/cloudflare-rails/pull/25).
data/README.md CHANGED
@@ -3,9 +3,7 @@ This gem correctly configures Rails for [CloudFlare](https://www.cloudflare.com)
3
3
 
4
4
  ## Rails Compatibility
5
5
 
6
- For Rails 5, use >= `0.2.x`
7
-
8
- For Rails 4.2, use `0.1.x`
6
+ This gem requires `railties`, `activesupport`, and `actionpack` >= 5. The last version that supports Rails 4.2 is `0.1.x`.
9
7
 
10
8
  ## Installation
11
9
 
@@ -25,22 +23,22 @@ And then execute:
25
23
 
26
24
  ## Problem
27
25
 
28
- Using Cloudflare means it's hard to identify the IP address of incoming requests since all requests are proxied through Cloudflare's infrastructure. Cloudflare provides a [CF-Connecting-IP](https://support.cloudflare.com/hc/en-us/articles/200170986-How-does-Cloudflare-handle-HTTP-Request-headers-) header which can be used to identify the originating IP address of a request. However, this header alone doesn't verify a request is legitimate. If an attacker has found the actual IP address of your server they could spoof this header and masquerade as legitimate traffic.
26
+ Using Cloudflare means it's hard to identify the IP address of incoming requests since all requests are proxied through Cloudflare's infrastructure. Cloudflare provides a [CF-Connecting-IP](https://support.cloudflare.com/hc/en-us/articles/200170986-How-does-Cloudflare-handle-HTTP-Request-headers-) header which can be used to identify the originating IP address of a request. However, this header alone doesn't verify a request is legitimate. If an attacker has found the actual IP address of your server they could spoof this header and masquerade as legitimate traffic.
29
27
 
30
- `cloudflare-rails` mitigates this attack by checking that the originating ip address of any incoming connecting is from one of Cloudflare's ip address ranges. If so, the incoming `X-Forwarded-For` header is trusted and used as the ip address provided to `rack` and `rails` (via `request.ip` and `request.remote_ip`). If the incoming connection does not originate from a Cloudflare server then the `X-Forwarded-For` header is ignored and the actual remote ip address is used.
28
+ `cloudflare-rails` mitigates this attack by checking that the originating ip address of any incoming connection is from one of Cloudflare's ip address ranges. If so, the incoming `X-Forwarded-For` header is trusted and used as the ip address provided to `rack` and `rails` (via `request.ip` and `request.remote_ip`). If the incoming connection does not originate from a Cloudflare server then the `X-Forwarded-For` header is ignored and the actual remote ip address is used.
31
29
 
32
30
  ## Usage
33
- This code will fetch CloudFlare's current [IPv4](https://www.cloudflare.com/ips-v4) and [IPv6](https://www.cloudflare.com/ips-v6) lists, store them in `Rails.cache`, and add them to `config.cloudflare.ips`. The `X-Forwarded-For` header will then be trusted only from those ip addresses.
31
+ This code will fetch CloudFlare's current [IPv4](https://www.cloudflare.com/ips-v4) and [IPv6](https://www.cloudflare.com/ips-v6) lists, store them in `Rails.cache`, and add them to `config.cloudflare.ips`. The `X-Forwarded-For` header will then be trusted only from those ip addresses.
34
32
 
35
33
  You can configure the HTTP `timeout` and `expires_in` cache parameters inside of your rails config:
36
- ```
34
+ ```ruby
37
35
  config.cloudflare.expires_in = 12.hours # default value
38
36
  config.cloudflare.timeout = 5.seconds # default value
39
37
  ```
40
38
 
41
39
  ## Alternatives
42
40
 
43
- [actionpack-cloudflare](https://github.com/customink/actionpack-cloudflare) simpler approach using the `CF-Connecting-IP` header.
41
+ [actionpack-cloudflare](https://github.com/customink/actionpack-cloudflare) simpler approach using the `CF-Connecting-IP` header.
44
42
 
45
43
  ## Development
46
44
 
data/Rakefile CHANGED
@@ -9,10 +9,16 @@ task :without_rack_attack do
9
9
  Rake::Task["spec"].invoke
10
10
  end
11
11
 
12
- task :with_rack_attack do
13
- ENV['RACK_ATTACK'] = '1'
12
+ task :with_rack_attack_first do
13
+ ENV['RACK_ATTACK'] = 'first'
14
14
  Rake::Task["spec"].reenable
15
15
  Rake::Task["spec"].invoke
16
16
  end
17
17
 
18
- task :default => [:without_rack_attack, :with_rack_attack]
18
+ task :with_rack_attack_last do
19
+ ENV['RACK_ATTACK'] = 'last'
20
+ Rake::Task["spec"].reenable
21
+ Rake::Task["spec"].invoke
22
+ end
23
+
24
+ task :default => [:without_rack_attack, :with_rack_attack_first, :with_rack_attack_last]
@@ -20,19 +20,21 @@ Gem::Specification.new do |spec|
20
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
21
  spec.require_paths = ["lib"]
22
22
 
23
- spec.add_development_dependency "bundler", "~> 1.10"
24
- spec.add_development_dependency "rake", "~> 12.3.1"
23
+ spec.add_development_dependency "bundler", "~> 2.1.2"
24
+ spec.add_development_dependency "rake", "~> 13.0.1"
25
25
  spec.add_development_dependency "rspec_junit_formatter", "~> 0.4.1"
26
- spec.add_development_dependency "rspec-rails", "~> 3.8.2"
27
- spec.add_development_dependency "rspec", "~> 3.8.0"
28
- spec.add_development_dependency "rubocop-airbnb", "~> 2.0.0"
29
- spec.add_development_dependency "webmock", "~> 3.6.0"
30
- spec.add_development_dependency "rack-attack", "~> 6.1.0"
26
+ spec.add_development_dependency "rspec-rails", "~> 4.0.0"
27
+ spec.add_development_dependency "rspec", "~> 3.10.0"
28
+ spec.add_development_dependency "rubocop-airbnb", "~> 3.0.2"
29
+ spec.add_development_dependency "webmock", "~> 3.11.0"
30
+ spec.add_development_dependency "rack-attack", "~> 6.5.0"
31
31
  spec.add_development_dependency "pry-byebug"
32
32
  spec.add_development_dependency "appraisal"
33
33
 
34
34
  spec.add_dependency "httparty"
35
- spec.add_dependency "rails", ">= 5.0", "< 6.1.0"
35
+ spec.add_dependency "railties", ">= 5.0", "< 6.2.0"
36
+ spec.add_dependency "activesupport", ">= 5.0", "< 6.2.0"
37
+ spec.add_dependency "actionpack", ">= 5.0", "< 6.2.0"
36
38
 
37
39
  # we need Module#prepend
38
40
  spec.required_ruby_version = '>= 2.0'
@@ -2,6 +2,6 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rails", "5.0"
5
+ gem "rails", "~> 5.0.0"
6
6
 
7
7
  gemspec path: "../"
@@ -2,6 +2,6 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rails", "5.1"
5
+ gem "rails", "~> 5.1.0"
6
6
 
7
7
  gemspec path: "../"
@@ -2,6 +2,6 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rails", "5.2"
5
+ gem "rails", "~> 5.2.0"
6
6
 
7
7
  gemspec path: "../"
@@ -2,6 +2,6 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rails", "6.0.0.rc2"
5
+ gem "rails", "~> 6.0.0"
6
6
 
7
7
  gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 6.1.0"
6
+
7
+ gemspec path: "../"
@@ -1,3 +1,4 @@
1
+ require "active_support/core_ext/integer/time"
1
2
  require "httparty"
2
3
 
3
4
  module Cloudflare
@@ -11,15 +12,6 @@ module Cloudflare
11
12
  end
12
13
  end
13
14
 
14
- Rack::Request::Helpers.prepend CheckTrustedProxies
15
-
16
- # rack-attack Rack::Request before the above is run, so if rack-attack is loaded we need to
17
- # prepend our module there as well, see:
18
- # https://github.com/kickstarter/rack-attack/blob/4fc4d79c9d2697ec21263109af23f11ea93a23ce/lib/rack/attack/request.rb
19
- if defined? Rack::Attack::Request
20
- Rack::Attack::Request.prepend CheckTrustedProxies
21
- end
22
-
23
15
  # patch ActionDispatch::RemoteIP to use our cloudflare ips - this way
24
16
  # request.remote_ip is correct inside of rails
25
17
  module RemoteIpProxies
@@ -28,8 +20,6 @@ module Cloudflare
28
20
  end
29
21
  end
30
22
 
31
- ActionDispatch::RemoteIp.prepend RemoteIpProxies
32
-
33
23
  class Importer
34
24
  include HTTParty
35
25
  base_uri 'https://www.cloudflare.com'
@@ -89,10 +79,22 @@ module Cloudflare
89
79
  rescue Importer::ResponseError => e
90
80
  ::Rails.logger.error "Cloudflare::Rails: Couldn't import #{type} blocks from CloudFlare: #{e.response}"
91
81
  rescue StandardError => e
92
- ::Rails.logger.error "Cloudflare::Rails: Got exception: #{e} for type:#{type}"
82
+ ::Rails.logger.error "Cloudflare::Rails: Got exception: #{e} for type: #{type}"
93
83
  end
94
84
  end
95
85
  end
86
+ initializer "my_railtie.configure_rails_initialization" do
87
+ Rack::Request::Helpers.prepend CheckTrustedProxies
88
+
89
+ ObjectSpace.each_object(Class).
90
+ select do |c|
91
+ c.included_modules.include?(Rack::Request::Helpers) &&
92
+ !c.included_modules.include?(CheckTrustedProxies)
93
+ end.
94
+ map { |c| c .prepend CheckTrustedProxies }
95
+
96
+ ActionDispatch::RemoteIp.prepend RemoteIpProxies
97
+ end
96
98
  end
97
99
  end
98
100
  end
@@ -1,5 +1,5 @@
1
1
  module Cloudflare
2
2
  module Rails
3
- VERSION = "0.6.0".freeze
3
+ VERSION = "2.0.0".freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudflare-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - jonathan schatz
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-08-11 00:00:00.000000000 Z
11
+ date: 2021-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.10'
19
+ version: 2.1.2
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.10'
26
+ version: 2.1.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 12.3.1
33
+ version: 13.0.1
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 12.3.1
40
+ version: 13.0.1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec_junit_formatter
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -58,70 +58,70 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 3.8.2
61
+ version: 4.0.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 3.8.2
68
+ version: 4.0.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 3.8.0
75
+ version: 3.10.0
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 3.8.0
82
+ version: 3.10.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rubocop-airbnb
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 2.0.0
89
+ version: 3.0.2
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 2.0.0
96
+ version: 3.0.2
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: webmock
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 3.6.0
103
+ version: 3.11.0
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 3.6.0
110
+ version: 3.11.0
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rack-attack
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 6.1.0
117
+ version: 6.5.0
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 6.1.0
124
+ version: 6.5.0
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: pry-byebug
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -165,7 +165,7 @@ dependencies:
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
167
  - !ruby/object:Gem::Dependency
168
- name: rails
168
+ name: railties
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
171
  - - ">="
@@ -173,7 +173,7 @@ dependencies:
173
173
  version: '5.0'
174
174
  - - "<"
175
175
  - !ruby/object:Gem::Version
176
- version: 6.1.0
176
+ version: 6.2.0
177
177
  type: :runtime
178
178
  prerelease: false
179
179
  version_requirements: !ruby/object:Gem::Requirement
@@ -183,7 +183,47 @@ dependencies:
183
183
  version: '5.0'
184
184
  - - "<"
185
185
  - !ruby/object:Gem::Version
186
- version: 6.1.0
186
+ version: 6.2.0
187
+ - !ruby/object:Gem::Dependency
188
+ name: activesupport
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '5.0'
194
+ - - "<"
195
+ - !ruby/object:Gem::Version
196
+ version: 6.2.0
197
+ type: :runtime
198
+ prerelease: false
199
+ version_requirements: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ version: '5.0'
204
+ - - "<"
205
+ - !ruby/object:Gem::Version
206
+ version: 6.2.0
207
+ - !ruby/object:Gem::Dependency
208
+ name: actionpack
209
+ requirement: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - ">="
212
+ - !ruby/object:Gem::Version
213
+ version: '5.0'
214
+ - - "<"
215
+ - !ruby/object:Gem::Version
216
+ version: 6.2.0
217
+ type: :runtime
218
+ prerelease: false
219
+ version_requirements: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - ">="
222
+ - !ruby/object:Gem::Version
223
+ version: '5.0'
224
+ - - "<"
225
+ - !ruby/object:Gem::Version
226
+ version: 6.2.0
187
227
  description: ''
188
228
  email:
189
229
  - modosc@users.noreply.github.com
@@ -192,6 +232,7 @@ extensions: []
192
232
  extra_rdoc_files: []
193
233
  files:
194
234
  - ".circleci/config.yml"
235
+ - ".github/dependabot.yml"
195
236
  - ".gitignore"
196
237
  - ".rspec"
197
238
  - ".rubocop.yml"
@@ -199,6 +240,7 @@ files:
199
240
  - ".rubocop_todo.yml"
200
241
  - ".travis.yml"
201
242
  - Appraisals
243
+ - CHANGELOG.md
202
244
  - Gemfile
203
245
  - LICENSE
204
246
  - README.md
@@ -211,6 +253,7 @@ files:
211
253
  - gemfiles/rails_5.1.gemfile
212
254
  - gemfiles/rails_5.2.gemfile
213
255
  - gemfiles/rails_6.0.gemfile
256
+ - gemfiles/rails_6.1.gemfile
214
257
  - lib/cloudflare/rails.rb
215
258
  - lib/cloudflare/rails/railtie.rb
216
259
  - lib/cloudflare/rails/version.rb
@@ -218,7 +261,7 @@ homepage: https://github.com/modosc/cloudflare-rails
218
261
  licenses:
219
262
  - MIT
220
263
  metadata: {}
221
- post_install_message:
264
+ post_install_message:
222
265
  rdoc_options: []
223
266
  require_paths:
224
267
  - lib
@@ -233,8 +276,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
233
276
  - !ruby/object:Gem::Version
234
277
  version: '0'
235
278
  requirements: []
236
- rubygems_version: 3.0.4
237
- signing_key:
279
+ rubygems_version: 3.1.2
280
+ signing_key:
238
281
  specification_version: 4
239
282
  summary: This gem configures Rails for CloudFlare so that request.ip and request.remote_ip
240
283
  and work correctly.