rack-neverlocal 0.0.1

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.
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .rvmrc
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --format documentation
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in rack_never_local.gemspec
4
+ gemspec
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1 @@
1
+ require "rack/neverlocal"
@@ -0,0 +1,15 @@
1
+ require 'rack/neverlocal/version'
2
+ require 'rack/neverlocal/remove_local_host'
3
+
4
+ module Rack
5
+ class NeverLocal
6
+ def initialize(app)
7
+ @app = app
8
+ end
9
+
10
+ def call(env)
11
+ @app.call RemoveLocalHost.from(env)
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ module Rack
2
+ class NeverLocal
3
+ module RemoveLocalHost
4
+ module_function
5
+
6
+ def from(env)
7
+ detect_localhost(env) and (transform_from('HTTP_X_REAL_IP',env) or transform_from('HTTP_X_CLUSTER_CLIENT_IP',env))
8
+ env
9
+ end
10
+
11
+ def transform_from(key,env)
12
+ env[key] and env['REMOTE_ADDR'] = env[key]
13
+ end
14
+
15
+ def detect_localhost(env)
16
+ ['::1','127.0.0.1'].include? env['REMOTE_ADDR']
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,5 @@
1
+ module Rack
2
+ class NeverLocal
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "rack/neverlocal/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "rack-neverlocal"
7
+ s.version = Rack::NeverLocal::VERSION
8
+ s.authors = ["Jon Rowe"]
9
+ s.email = ["hello@jonrowe.co.uk"]
10
+ s.homepage = "https://github.com/jonrowe/rack-neverlocal"
11
+ s.summary = %q{What's this? A local request? Never!}
12
+ s.description = %q{Basically this gems aim is to strip 127.0.0.1 from REMOTE_ADDR to make Rails think it's a remote request... always...}
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {spec}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.require_paths = ["lib"]
18
+
19
+ s.add_development_dependency "rspec"
20
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ class FakeApp
4
+ def call(env)
5
+ @env = env
6
+ end
7
+ attr_reader :env
8
+ end
9
+
10
+
11
+ describe "server sends client in" do
12
+ let(:app) { FakeApp.new }
13
+ let(:middleware) { Rack::NeverLocal.new(app) }
14
+
15
+ context "HTTP_X_REAL_IP" do
16
+ let(:env) do
17
+ {
18
+ 'HTTP_X_REAL_IP' => "212.123.212.123",
19
+ 'REMOTE_ADDR' => "127.0.0.1"
20
+ }
21
+ end
22
+
23
+ subject { middleware.call(env) }
24
+
25
+ it "sends the app the correct REMOTE_ADDR" do
26
+ subject
27
+ app.env['REMOTE_ADDR'].should == "212.123.212.123"
28
+ end
29
+ end
30
+
31
+ context "HTTP_X_CLUSTER_CLIENT_IP" do
32
+ let(:env) do
33
+ {
34
+ 'HTTP_X_CLUSTER_CLIENT_IP' => "212.123.212.123",
35
+ 'REMOTE_ADDR' => "127.0.0.1"
36
+ }
37
+ end
38
+
39
+ subject { middleware.call(env) }
40
+
41
+ it "sends the app the correct REMOTE_ADDR" do
42
+ subject
43
+ app.env['REMOTE_ADDR'].should == "212.123.212.123"
44
+ end
45
+ end
46
+
47
+ context "both" do
48
+ let(:env) do
49
+ {
50
+ 'HTTP_X_REAL_IP' => "212.123.212.123",
51
+ 'HTTP_X_CLUSTER_CLIENT_IP' => "212.123.111.111",
52
+ 'REMOTE_ADDR' => "127.0.0.1"
53
+ }
54
+ end
55
+
56
+ subject { middleware.call(env) }
57
+
58
+ it "sends the app the correct REMOTE_ADDR" do
59
+ subject
60
+ app.env['REMOTE_ADDR'].should == "212.123.212.123"
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ module Rack
4
+ class NeverLocal
5
+ describe RemoveLocalHost do
6
+ describe '.from' do
7
+
8
+ subject { RemoveLocalHost.from env }
9
+
10
+ context "not a local ip" do
11
+ let(:env) { { 'REMOTE_ADDR' => '192.168.1.1' } }
12
+ it { should == env }
13
+ end
14
+
15
+ context "127.0.0.1" do
16
+ let(:env) { { 'REMOTE_ADDR' => '127.0.0.1', 'HTTP_X_REAL_IP' => '192.168.1.1' } }
17
+ its(['REMOTE_ADDR']) { should_not == '127.0.0.1' }
18
+ end
19
+
20
+ end
21
+
22
+ describe 'transform_from(key,env)' do
23
+ subject { RemoveLocalHost.transform_from 'KEY', env }
24
+
25
+ context "key present" do
26
+ let(:env) { { 'KEY' => 'VALUE' } }
27
+
28
+ it "replaces remote addr with value" do
29
+ subject
30
+ env['REMOTE_ADDR'].should == 'VALUE'
31
+ end
32
+ end
33
+ context "key missing" do
34
+ let(:env) { { 'NOT_KEY' => 'VALUE' } }
35
+ specify { should be_nil }
36
+ end
37
+ end
38
+
39
+ describe 'detect_localhost(env)' do
40
+ subject { RemoveLocalHost.detect_localhost(env) }
41
+
42
+ context "not a local ip" do
43
+ let(:env) { { 'REMOTE_ADDR' => '192.168.1.1' } }
44
+ it { should be_false }
45
+ end
46
+
47
+ context "127.0.0.1" do
48
+ let(:env) { { 'REMOTE_ADDR' => '127.0.0.1' } }
49
+ it { should be_true }
50
+ end
51
+
52
+ context "127.0.0.1" do
53
+ let(:env) { { 'REMOTE_ADDR' => '::1' } }
54
+ it { should be_true }
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ module Rack
4
+ describe NeverLocal do
5
+ describe "is rack middleware" do
6
+ let(:app) { mock "app", :call => response }
7
+
8
+ let(:response) { mock "response" }
9
+
10
+ let(:env) { { 'REMOTE_ADDR' => 'LOCAL' } }
11
+ let(:transformed_env) { { 'REMOTE_ADDR' => 'notlocal' } }
12
+
13
+ before { NeverLocal::RemoveLocalHost.stub(:from).with(env).and_return(transformed_env) }
14
+
15
+ it "takes an app" do
16
+ NeverLocal.new app
17
+ end
18
+
19
+ subject { NeverLocal.new(app).call(env) }
20
+
21
+ it "transforms the environment to strip out local addresses" do
22
+ NeverLocal::RemoveLocalHost.should_receive(:from).with(env).and_return(transformed_env)
23
+ subject
24
+ end
25
+
26
+ it "chains call onto app" do
27
+ app.should_receive(:call).with(transformed_env)
28
+ subject
29
+ end
30
+
31
+ it("outputs response") { should == response }
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,3 @@
1
+ $:.push File.expand_path("../../lib", __FILE__)
2
+
3
+ require 'rack/neverlocal'
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-neverlocal
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Jon Rowe
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-10-22 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rspec
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :development
33
+ version_requirements: *id001
34
+ description: Basically this gems aim is to strip 127.0.0.1 from REMOTE_ADDR to make Rails think it's a remote request... always...
35
+ email:
36
+ - hello@jonrowe.co.uk
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files: []
42
+
43
+ files:
44
+ - .gitignore
45
+ - .rspec
46
+ - Gemfile
47
+ - Rakefile
48
+ - lib/rack-neverlocal.rb
49
+ - lib/rack/neverlocal.rb
50
+ - lib/rack/neverlocal/remove_local_host.rb
51
+ - lib/rack/neverlocal/version.rb
52
+ - rack-neverlocal.gemspec
53
+ - scenarios/env_sets_http_x_real_ip_spec.rb
54
+ - spec/rack/neverlocal/remove_local_host_spec.rb
55
+ - spec/rack/neverlocal_spec.rb
56
+ - spec/spec_helper.rb
57
+ homepage: https://github.com/jonrowe/rack-neverlocal
58
+ licenses: []
59
+
60
+ post_install_message:
61
+ rdoc_options: []
62
+
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ hash: 3
71
+ segments:
72
+ - 0
73
+ version: "0"
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ hash: 3
80
+ segments:
81
+ - 0
82
+ version: "0"
83
+ requirements: []
84
+
85
+ rubyforge_project:
86
+ rubygems_version: 1.8.6
87
+ signing_key:
88
+ specification_version: 3
89
+ summary: What's this? A local request? Never!
90
+ test_files: []
91
+