cloudflare-rails 0.4.0 → 1.1.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: 4af88462102fa96a7026865456538d3273dbed25b27571be2a1ff35d85a571d0
4
- data.tar.gz: d0822418ace7ea370d89465cfae344ee03915bde1cd1fa6509474608f2262c30
3
+ metadata.gz: 6060b63792255ed6aebab33986d27092b1866052db8fcf496942692f1c51508d
4
+ data.tar.gz: 40d72f9bfefac5cf2f64c681d8833efb807ce20b314cd0433e9e07c03917b7ae
5
5
  SHA512:
6
- metadata.gz: cb376a89e2afe44c37d7dcacfa983ed7654d9be50aab5a110527003d3433a75935ed0988cea31a4b90dd6c9bbef99ee6ff080de548fe40ad511c422e1972684e
7
- data.tar.gz: 16fed68fb3b86e05da7317208544bb26b51271848e93b159db064ec220264f2e8efae9de0e1fd6ad9063ed572364155e73f26860586738abb66c243a5d55dfbc
6
+ metadata.gz: 3a0ac66d56d0a62957c73b564e9bc5586bb9328e146598e2b342de74bcd75e1a24541ae4b22fbd17f502a5a9a40c57a0e07bcd3b348950843d17b9cee0cc8d59
7
+ data.tar.gz: f175720c6f4f109a3ea1bc34c1e62bf1661a60df5e83c132e3677b078c6064359ca0c5afd98c26b8962e38c5692c876094146e1de586e8461ba1dc7c25854a11
@@ -7,12 +7,7 @@ jobs:
7
7
  build:
8
8
  docker:
9
9
  # specify the version you desire here
10
- - image: circleci/ruby:2.5.1
11
-
12
- # Specify service dependencies here if necessary
13
- # CircleCI maintains a library of pre-built images
14
- # documented at https://circleci.com/docs/2.0/circleci-images/
15
- # - image: circleci/postgres:9.4
10
+ - image: circleci/ruby:2.7.0
16
11
 
17
12
  working_directory: ~/repo
18
13
 
@@ -22,7 +17,7 @@ jobs:
22
17
  # Download and cache dependencies
23
18
  - restore_cache:
24
19
  keys:
25
- - v1-dependencies-{{ checksum "cloudflare-rails.gemspec" }}
20
+ - v1-dependencies-{{ checksum "cloudflare-rails.gemspec" }}-{{ checksum "Appraisals" }}
26
21
  # fallback to using the latest cache if no exact match is found
27
22
  - v1-dependencies-
28
23
 
@@ -31,27 +26,24 @@ jobs:
31
26
  command: |
32
27
  bundle install --jobs=4 --retry=3 --path vendor/bundle
33
28
 
29
+ - run:
30
+ name: install appraisal versions
31
+ command: |
32
+ bundle exec appraisal install
33
+
34
34
  - save_cache:
35
35
  paths:
36
36
  - ./vendor/bundle
37
- key: v1-dependencies-{{ checksum "Gemfile.lock" }}
37
+ key: v1-dependencies-{{ checksum "cloudflare-rails.gemspec" }}-{{ checksum "Appraisals" }}
38
38
 
39
39
  # run tests!
40
40
  - run:
41
41
  name: run tests
42
42
  command: |
43
- mkdir /tmp/test-results
44
- TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)"
45
-
46
- bundle exec rspec --format progress \
47
- --format RspecJunitFormatter \
48
- --out /tmp/test-results/rspec.xml \
49
- --format progress \
50
- $TEST_FILES
51
-
43
+ bundle exec appraisal rake
52
44
  # collect reports
53
45
  - store_test_results:
54
- path: /tmp/test-results
46
+ path: tmp/rspec
55
47
  - store_artifacts:
56
- path: /tmp/test-results
48
+ path: tmp/rspec
57
49
  destination: test-results
@@ -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,3 +10,6 @@
10
10
  /log/
11
11
  .ruby-gemset
12
12
  .ruby-version
13
+ .DS_Store
14
+
15
+ *.gemfile.lock
data/.rspec CHANGED
@@ -1,2 +1,4 @@
1
- --format p
1
+ --format d
2
2
  --color
3
+ --format RspecJunitFormatter
4
+ --out tmp/rspec/rspec-<%= File.basename ENV['BUNDLE_GEMFILE'] %><%= ENV["RACK_ATTACK"] ? "-rack-attack-#{ENV["RACK_ATTACK"]}" : '' %>.xml
@@ -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
@@ -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
 
@@ -23,19 +21,24 @@ And then execute:
23
21
 
24
22
  $ bundle
25
23
 
26
- ## Usage
24
+ ## Problem
27
25
 
28
- 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`.
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.
27
+
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.
29
+
30
+ ## Usage
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.
29
32
 
30
33
  You can configure the HTTP `timeout` and `expires_in` cache parameters inside of your rails config:
31
- ```
34
+ ```ruby
32
35
  config.cloudflare.expires_in = 12.hours # default value
33
36
  config.cloudflare.timeout = 5.seconds # default value
34
37
  ```
35
38
 
36
39
  ## Alternatives
37
40
 
38
- [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.
39
42
 
40
43
  ## Development
41
44
 
data/Rakefile CHANGED
@@ -3,4 +3,22 @@ require "rspec/core/rake_task"
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task :default => :spec
6
+ task :without_rack_attack do
7
+ ENV.delete 'RACK_ATTACK'
8
+ Rake::Task["spec"].reenable
9
+ Rake::Task["spec"].invoke
10
+ end
11
+
12
+ task :with_rack_attack_first do
13
+ ENV['RACK_ATTACK'] = 'first'
14
+ Rake::Task["spec"].reenable
15
+ Rake::Task["spec"].invoke
16
+ end
17
+
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,17 +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.7.2"
27
- spec.add_development_dependency "rspec", "~> 3.7.0"
28
- spec.add_development_dependency "rubocop-airbnb", "~> 1.0.0"
29
- spec.add_development_dependency "webmock", "~> 3.4.2"
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.10.0"
30
+ spec.add_development_dependency "rack-attack", "~> 6.3.0"
31
+ spec.add_development_dependency "pry-byebug"
32
+ spec.add_development_dependency "appraisal"
30
33
 
31
34
  spec.add_dependency "httparty"
32
- spec.add_dependency "rails", "~> 5.0"
33
-
35
+ spec.add_dependency "rails", ">= 5.0", "< 6.2.0"
34
36
 
35
37
  # we need Module#prepend
36
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: "../"
@@ -11,8 +11,6 @@ module Cloudflare
11
11
  end
12
12
  end
13
13
 
14
- Rack::Request::Helpers.prepend CheckTrustedProxies
15
-
16
14
  # patch ActionDispatch::RemoteIP to use our cloudflare ips - this way
17
15
  # request.remote_ip is correct inside of rails
18
16
  module RemoteIpProxies
@@ -21,8 +19,6 @@ module Cloudflare
21
19
  end
22
20
  end
23
21
 
24
- ActionDispatch::RemoteIp.prepend RemoteIpProxies
25
-
26
22
  class Importer
27
23
  include HTTParty
28
24
  base_uri 'https://www.cloudflare.com'
@@ -81,11 +77,23 @@ module Cloudflare
81
77
  ::Rails.application.config.cloudflare.ips += Importer.fetch_with_cache(type)
82
78
  rescue Importer::ResponseError => e
83
79
  ::Rails.logger.error "Cloudflare::Rails: Couldn't import #{type} blocks from CloudFlare: #{e.response}"
84
- rescue => e
85
- ::Rails.logger.error "Cloudflare::Rails: Got exception: #{e} for type:#{type}"
80
+ rescue StandardError => e
81
+ ::Rails.logger.error "Cloudflare::Rails: Got exception: #{e} for type: #{type}"
86
82
  end
87
83
  end
88
84
  end
85
+ initializer "my_railtie.configure_rails_initialization" do
86
+ Rack::Request::Helpers.prepend CheckTrustedProxies
87
+
88
+ ObjectSpace.each_object(Class).
89
+ select do |c|
90
+ c.included_modules.include?(Rack::Request::Helpers) &&
91
+ !c.included_modules.include?(CheckTrustedProxies)
92
+ end.
93
+ map { |c| c .prepend CheckTrustedProxies }
94
+
95
+ ActionDispatch::RemoteIp.prepend RemoteIpProxies
96
+ end
89
97
  end
90
98
  end
91
99
  end
@@ -1,5 +1,5 @@
1
1
  module Cloudflare
2
2
  module Rails
3
- VERSION = "0.4.0".freeze
3
+ VERSION = "1.1.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.4.0
4
+ version: 1.1.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: 2018-06-05 00:00:00.000000000 Z
11
+ date: 2020-12-09 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,56 +58,98 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 3.7.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.7.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.7.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.7.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: 1.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: 1.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.4.2
103
+ version: 3.10.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.4.2
110
+ version: 3.10.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: rack-attack
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 6.3.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 6.3.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: pry-byebug
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
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'
111
153
  - !ruby/object:Gem::Dependency
112
154
  name: httparty
113
155
  requirement: !ruby/object:Gem::Requirement
@@ -126,16 +168,22 @@ dependencies:
126
168
  name: rails
127
169
  requirement: !ruby/object:Gem::Requirement
128
170
  requirements:
129
- - - "~>"
171
+ - - ">="
130
172
  - !ruby/object:Gem::Version
131
173
  version: '5.0'
174
+ - - "<"
175
+ - !ruby/object:Gem::Version
176
+ version: 6.2.0
132
177
  type: :runtime
133
178
  prerelease: false
134
179
  version_requirements: !ruby/object:Gem::Requirement
135
180
  requirements:
136
- - - "~>"
181
+ - - ">="
137
182
  - !ruby/object:Gem::Version
138
183
  version: '5.0'
184
+ - - "<"
185
+ - !ruby/object:Gem::Version
186
+ version: 6.2.0
139
187
  description: ''
140
188
  email:
141
189
  - modosc@users.noreply.github.com
@@ -144,12 +192,15 @@ extensions: []
144
192
  extra_rdoc_files: []
145
193
  files:
146
194
  - ".circleci/config.yml"
195
+ - ".github/dependabot.yml"
147
196
  - ".gitignore"
148
197
  - ".rspec"
149
198
  - ".rubocop.yml"
150
199
  - ".rubocop_airbnb.yml"
151
200
  - ".rubocop_todo.yml"
152
201
  - ".travis.yml"
202
+ - Appraisals
203
+ - CHANGELOG.md
153
204
  - Gemfile
154
205
  - LICENSE
155
206
  - README.md
@@ -157,6 +208,12 @@ files:
157
208
  - bin/console
158
209
  - bin/setup
159
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
160
217
  - lib/cloudflare/rails.rb
161
218
  - lib/cloudflare/rails/railtie.rb
162
219
  - lib/cloudflare/rails/version.rb
@@ -164,7 +221,7 @@ homepage: https://github.com/modosc/cloudflare-rails
164
221
  licenses:
165
222
  - MIT
166
223
  metadata: {}
167
- post_install_message:
224
+ post_install_message:
168
225
  rdoc_options: []
169
226
  require_paths:
170
227
  - lib
@@ -179,9 +236,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
179
236
  - !ruby/object:Gem::Version
180
237
  version: '0'
181
238
  requirements: []
182
- rubyforge_project:
183
- rubygems_version: 2.7.6
184
- signing_key:
239
+ rubygems_version: 3.1.2
240
+ signing_key:
185
241
  specification_version: 4
186
242
  summary: This gem configures Rails for CloudFlare so that request.ip and request.remote_ip
187
243
  and work correctly.