cloudflare-rails 0.5.0 → 1.2.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: 947c819ded7dcefcfabf3ce7d6b81dd24d55e39dfbe710b4135b796b44a37f04
4
- data.tar.gz: f893a0c8a4d9bcc50f4008414a48cbf8d3180bb99d000a9b47dd800ba63c28b8
3
+ metadata.gz: cd4b756d17197d18b6ed4daba9b3a98f4105410d95785f835013701fe372e813
4
+ data.tar.gz: 8be58cbbc6d6b7b32aa4280d3acc4c6c2fe8b7e77f06bc62dada0d080ca021a3
5
5
  SHA512:
6
- metadata.gz: 74931a1f34f4501b5935d749d7965a3b3d95f1448d9869143674f14898cb4cc4616354ae350d1f81a0476682a6b6195a80115e9977bb39bf66d57ca06b0ec3bc
7
- data.tar.gz: 7d8bd03f0cf4d724159261fab46fe0054f1b57ea0036071abc62e0de8c1e0ce04a44101d4b8e3730a512329795ecad6195996dd1d2e75a48bd8aff3b56763679
6
+ metadata.gz: 603165c9c4e53bcd4bbe0f608659cef70a6c2f20d6c96807d78007e7128613d13171a3126516f38c8caa181b759908321db4d2788325698392ca872a1799b4d3
7
+ data.tar.gz: 7e72201d4968db350b38d5f237b5a3e5931f1ec5fd921917b227e7b78dd3ed4f2fd0f641b09c5a3240d33892e980e322a4e73b4949612dc10690f7e5b1821e38
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
 
@@ -17,7 +17,7 @@ jobs:
17
17
  # Download and cache dependencies
18
18
  - restore_cache:
19
19
  keys:
20
- - v1-dependencies-{{ checksum "cloudflare-rails.gemspec" }}
20
+ - v1-dependencies-{{ checksum "cloudflare-rails.gemspec" }}-{{ checksum "Appraisals" }}
21
21
  # fallback to using the latest cache if no exact match is found
22
22
  - v1-dependencies-
23
23
 
@@ -26,16 +26,21 @@ jobs:
26
26
  command: |
27
27
  bundle install --jobs=4 --retry=3 --path vendor/bundle
28
28
 
29
+ - run:
30
+ name: install appraisal versions
31
+ command: |
32
+ bundle exec appraisal install
33
+
29
34
  - save_cache:
30
35
  paths:
31
36
  - ./vendor/bundle
32
- key: v1-dependencies-{{ checksum "Gemfile.lock" }}
37
+ key: v1-dependencies-{{ checksum "cloudflare-rails.gemspec" }}-{{ checksum "Appraisals" }}
33
38
 
34
39
  # run tests!
35
40
  - run:
36
41
  name: run tests
37
42
  command: |
38
- bundle exec rake
43
+ bundle exec appraisal rake
39
44
  # collect reports
40
45
  - store_test_results:
41
46
  path: tmp/rspec
@@ -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/.gitignore CHANGED
@@ -10,4 +10,6 @@
10
10
  /log/
11
11
  .ruby-gemset
12
12
  .ruby-version
13
- .DS_Store
13
+ .DS_Store
14
+
15
+ *.gemfile.lock
data/.rspec CHANGED
@@ -1,4 +1,4 @@
1
1
  --format d
2
2
  --color
3
3
  --format RspecJunitFormatter
4
- --out tmp/rspec/rspec<%= 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 ADDED
@@ -0,0 +1,19 @@
1
+ appraise "rails-5.0" do
2
+ gem "rails", "~> 5.0.0"
3
+ end
4
+
5
+ appraise "rails-5.1" do
6
+ gem "rails", "~> 5.1.0"
7
+ end
8
+
9
+ appraise "rails-5.2" do
10
+ gem "rails", "~> 5.2.0"
11
+ end
12
+
13
+ appraise "rails-6.0" do
14
+ gem "rails", "~> 6.0.0"
15
+ end
16
+
17
+ appraise "rails-6.1" do
18
+ gem "rails", "~> 6.1.0"
19
+ end
data/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
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
+
9
+ ## [1.0.0] - 2020-09-29
10
+ ### Added
11
+
12
+ - 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 Rails >= 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
28
  `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.
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,18 +20,19 @@ 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.4.0"
31
31
  spec.add_development_dependency "pry-byebug"
32
+ spec.add_development_dependency "appraisal"
32
33
 
33
34
  spec.add_dependency "httparty"
34
- spec.add_dependency "rails", "~> 5.0"
35
+ spec.add_dependency "rails", ">= 5.0", "< 6.2.0"
35
36
 
36
37
  # we need Module#prepend
37
38
  spec.required_ruby_version = '>= 2.0'
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_RETRY: "1"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 5.0.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 5.1.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 5.2.0"
6
+
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.0.0"
6
+
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.5.0".freeze
3
+ VERSION = "1.2.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.5.0
4
+ version: 1.2.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-03 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.4.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.4.0
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: pry-byebug
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: appraisal
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: httparty
141
155
  requirement: !ruby/object:Gem::Requirement
@@ -154,16 +168,22 @@ dependencies:
154
168
  name: rails
155
169
  requirement: !ruby/object:Gem::Requirement
156
170
  requirements:
157
- - - "~>"
171
+ - - ">="
158
172
  - !ruby/object:Gem::Version
159
173
  version: '5.0'
174
+ - - "<"
175
+ - !ruby/object:Gem::Version
176
+ version: 6.2.0
160
177
  type: :runtime
161
178
  prerelease: false
162
179
  version_requirements: !ruby/object:Gem::Requirement
163
180
  requirements:
164
- - - "~>"
181
+ - - ">="
165
182
  - !ruby/object:Gem::Version
166
183
  version: '5.0'
184
+ - - "<"
185
+ - !ruby/object:Gem::Version
186
+ version: 6.2.0
167
187
  description: ''
168
188
  email:
169
189
  - modosc@users.noreply.github.com
@@ -172,12 +192,15 @@ extensions: []
172
192
  extra_rdoc_files: []
173
193
  files:
174
194
  - ".circleci/config.yml"
195
+ - ".github/dependabot.yml"
175
196
  - ".gitignore"
176
197
  - ".rspec"
177
198
  - ".rubocop.yml"
178
199
  - ".rubocop_airbnb.yml"
179
200
  - ".rubocop_todo.yml"
180
201
  - ".travis.yml"
202
+ - Appraisals
203
+ - CHANGELOG.md
181
204
  - Gemfile
182
205
  - LICENSE
183
206
  - README.md
@@ -185,6 +208,12 @@ files:
185
208
  - bin/console
186
209
  - bin/setup
187
210
  - cloudflare-rails.gemspec
211
+ - gemfiles/.bundle/config
212
+ - gemfiles/rails_5.0.gemfile
213
+ - gemfiles/rails_5.1.gemfile
214
+ - gemfiles/rails_5.2.gemfile
215
+ - gemfiles/rails_6.0.gemfile
216
+ - gemfiles/rails_6.1.gemfile
188
217
  - lib/cloudflare/rails.rb
189
218
  - lib/cloudflare/rails/railtie.rb
190
219
  - lib/cloudflare/rails/version.rb
@@ -192,7 +221,7 @@ homepage: https://github.com/modosc/cloudflare-rails
192
221
  licenses:
193
222
  - MIT
194
223
  metadata: {}
195
- post_install_message:
224
+ post_install_message:
196
225
  rdoc_options: []
197
226
  require_paths:
198
227
  - lib
@@ -207,8 +236,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
207
236
  - !ruby/object:Gem::Version
208
237
  version: '0'
209
238
  requirements: []
210
- rubygems_version: 3.0.4
211
- signing_key:
239
+ rubygems_version: 3.1.2
240
+ signing_key:
212
241
  specification_version: 4
213
242
  summary: This gem configures Rails for CloudFlare so that request.ip and request.remote_ip
214
243
  and work correctly.