cloudflare-rails 0.6.0 → 2.0.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: 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.