cloudflare-rails 0.5.0 → 1.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: 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.